From 3e307d3457e4fc41acb52d0258fedd8d8b2e7efa Mon Sep 17 00:00:00 2001 From: Chen Wen Date: Wed, 3 Jun 2020 20:42:37 +0800 Subject: [PATCH 1/4] xtensa/esp32: Add header files needed by wifi components --- .../esp32/driver/esp32/include/touch_sensor.h | 331 + .../include/esp32/driver/esp32/touch_sensor.c | 471 + .../include/esp32/driver/include/driver/adc.h | 367 + .../include/driver/adc2_wifi_internal.h | 52 + .../include/esp32/driver/include/driver/can.h | 347 + .../include/esp32/driver/include/driver/dac.h | 114 + .../esp32/driver/include/driver/gpio.h | 435 + .../include/esp32/driver/include/driver/i2c.h | 520 ++ .../include/esp32/driver/include/driver/i2s.h | 328 + .../esp32/driver/include/driver/ledc.h | 423 + .../esp32/driver/include/driver/mcpwm.h | 668 ++ .../esp32/driver/include/driver/pcnt.h | 385 + .../esp32/driver/include/driver/periph_ctrl.h | 67 + .../include/esp32/driver/include/driver/rmt.h | 783 ++ .../esp32/driver/include/driver/rtc_cntl.h | 56 + .../esp32/driver/include/driver/rtc_io.h | 301 + .../esp32/driver/include/driver/sdio_slave.h | 280 + .../esp32/driver/include/driver/sdmmc_defs.h | 484 + .../esp32/driver/include/driver/sdmmc_host.h | 247 + .../esp32/driver/include/driver/sdmmc_types.h | 179 + .../esp32/driver/include/driver/sdspi_host.h | 186 + .../esp32/driver/include/driver/sigmadelta.h | 86 + .../esp32/driver/include/driver/spi_common.h | 143 + .../include/driver/spi_common_internal.h | 267 + .../esp32/driver/include/driver/spi_master.h | 397 + .../esp32/driver/include/driver/spi_slave.h | 191 + .../esp32/driver/include/driver/timer.h | 452 + .../esp32/driver/include/driver/touch_pad.h | 17 + .../include/driver/touch_sensor_common.h | 162 + .../esp32/driver/include/driver/uart.h | 851 ++ .../esp32/driver/include/driver/uart_select.h | 49 + .../esp32/esp32_chip/include/esp32/brownout.h | 21 + .../esp32_chip/include/esp32/cache_err_int.h | 33 + .../esp32/esp32_chip/include/esp32/clk.h | 95 + .../esp32_chip/include/esp32/dport_access.h | 52 + .../esp32/esp32_chip/include/esp32/himem.h | 152 + .../esp32/esp32_chip/include/esp32/pm.h | 42 + .../esp32/esp32_chip/include/esp32/spiram.h | 116 + .../esp32/esp32_chip/include/esp_clk.h | 2 + .../esp32/esp32_chip/include/esp_himem.h | 2 + .../esp32/esp32_chip/include/esp_intr.h | 17 + .../esp32/esp32_chip/include/esp_intr_alloc.h | 300 + .../esp32/esp32_chip/include/esp_sleep.h | 363 + .../esp32/esp32_chip/include/esp_spiram.h | 2 + .../esp32/esp32_chip/include/esp_ssc.h | 119 + .../esp32/esp32_chip/include/rom/aes.h | 2 + .../esp32/esp32_chip/include/rom/bigint.h | 2 + .../esp32/esp32_chip/include/rom/cache.h | 2 + .../esp32/esp32_chip/include/rom/crc.h | 2 + .../esp32/esp32_chip/include/rom/efuse.h | 2 + .../esp32/esp32_chip/include/rom/ets_sys.h | 2 + .../esp32/esp32_chip/include/rom/gpio.h | 2 + .../esp32/esp32_chip/include/rom/libc_stubs.h | 2 + .../esp32/esp32_chip/include/rom/lldesc.h | 2 + .../esp32/esp32_chip/include/rom/md5_hash.h | 2 + .../esp32/esp32_chip/include/rom/miniz.h | 2 + .../esp32/esp32_chip/include/rom/queue.h | 2 + .../esp32/esp32_chip/include/rom/rtc.h | 2 + .../esp32_chip/include/rom/secure_boot.h | 2 + .../esp32/esp32_chip/include/rom/sha.h | 2 + .../esp32/esp32_chip/include/rom/spi_flash.h | 2 + .../esp32/esp32_chip/include/rom/tbconsole.h | 2 + .../esp32/esp32_chip/include/rom/tjpgd.h | 2 + .../esp32/esp32_chip/include/rom/uart.h | 2 + .../include/esp32/esp_common/esp_assert.h | 37 + .../include/esp32/esp_common/esp_bit_defs.h | 63 + .../include/esp32/esp_common/esp_compiler.h | 33 + .../xtensa/include/esp32/esp_common/esp_crc.h | 113 + .../xtensa/include/esp32/esp_common/esp_err.h | 149 + .../esp_common/esp_expression_with_stack.h | 74 + .../include/esp32/esp_common/esp_fault.h | 93 + .../esp32/esp_common/esp_freertos_hooks.h | 131 + .../esp32/esp_common/esp_idf_version.h | 58 + .../include/esp32/esp_common/esp_int_wdt.h | 67 + .../include/esp32/esp_common/esp_interface.h | 37 + .../xtensa/include/esp32/esp_common/esp_ipc.h | 93 + arch/xtensa/include/esp32/esp_common/esp_pm.h | 182 + .../esp_common/esp_private/crosscore_int.h | 54 + .../esp32/esp_common/esp_private/dbg_stubs.h | 50 + .../esp_common/esp_private/esp_timer_impl.h | 101 + .../esp32/esp_common/esp_private/gdbstub.h | 22 + .../esp32/esp_common/esp_private/pm_impl.h | 121 + .../esp32/esp_common/esp_private/pm_trace.h | 45 + .../esp_common/esp_private/system_internal.h | 58 + .../include/esp32/esp_common/esp_system.h | 275 + .../include/esp32/esp_common/esp_task.h | 58 + .../include/esp32/esp_common/esp_task_wdt.h | 147 + .../include/esp32/esp_common/esp_timer.h | 233 + .../include/esp32/esp_common/esp_types.h | 25 + arch/xtensa/include/esp32/esp_eth/Kconfig | 148 + .../include/esp32/esp_eth/include/esp_eth.h | 257 + .../esp32/esp_eth/include/esp_eth_com.h | 224 + .../esp32/esp_eth/include/esp_eth_mac.h | 325 + .../esp_eth/include/esp_eth_netif_glue.h | 66 + .../esp32/esp_eth/include/esp_eth_phy.h | 257 + .../esp_eth/include/eth_phy_regs_struct.h | 163 + .../esp32/esp_event/include/esp_event.h | 382 + .../esp32/esp_event/include/esp_event_base.h | 43 + .../esp_event/include/esp_event_legacy.h | 248 + .../esp32/esp_event/include/esp_event_loop.h | 3 + .../private_include/esp_event_internal.h | 112 + .../private_include/esp_event_private.h | 54 + .../esp32/esp_netif/include/esp_netif.h | 771 ++ .../esp_netif/include/esp_netif_defaults.h | 116 + .../esp_netif/include/esp_netif_ip_addr.h | 107 + .../esp_netif/include/esp_netif_net_stack.h | 92 + .../esp32/esp_netif/include/esp_netif_ppp.h | 110 + .../esp_netif/include/esp_netif_sta_list.h | 71 + .../esp32/esp_netif/include/esp_netif_types.h | 214 + .../include/esp32/esp_rom/CMakeLists.txt | 62 + .../xtensa/include/esp32/esp_rom/component.mk | 32 + arch/xtensa/include/esp32/esp_rom/esp_rom.c | 0 .../esp32/esp_rom/include/esp32/rom/aes.h | 57 + .../esp32/esp_rom/include/esp32/rom/bigint.h | 62 + .../esp32/esp_rom/include/esp32/rom/cache.h | 186 + .../esp32/esp_rom/include/esp32/rom/crc.h | 160 + .../esp32/esp_rom/include/esp32/rom/efuse.h | 117 + .../esp32/esp_rom/include/esp32/rom/ets_sys.h | 655 ++ .../esp32/esp_rom/include/esp32/rom/gpio.h | 308 + .../esp_rom/include/esp32/rom/libc_stubs.h | 89 + .../esp32/esp_rom/include/esp32/rom/lldesc.h | 176 + .../esp_rom/include/esp32/rom/md5_hash.h | 38 + .../esp32/esp_rom/include/esp32/rom/miniz.h | 792 ++ .../esp32/esp_rom/include/esp32/rom/rtc.h | 221 + .../esp_rom/include/esp32/rom/secure_boot.h | 114 + .../esp32/esp_rom/include/esp32/rom/sha.h | 64 + .../esp_rom/include/esp32/rom/spi_flash.h | 558 ++ .../esp_rom/include/esp32/rom/tbconsole.h | 27 + .../esp32/esp_rom/include/esp32/rom/tjpgd.h | 99 + .../esp32/esp_rom/include/esp32/rom/uart.h | 420 + .../include/esp32/esp_wifi/esp_coexist.h | 93 + .../esp32/esp_wifi/esp_coexist_adapter.h | 59 + .../esp32/esp_wifi/esp_coexist_internal.h | 177 + arch/xtensa/include/esp32/esp_wifi/esp_mesh.h | 1460 +++ .../esp32/esp_wifi/esp_mesh_internal.h | 269 + arch/xtensa/include/esp32/esp_wifi/esp_now.h | 317 + .../include/esp32/esp_wifi/esp_phy_init.h | 250 + .../esp_wifi/esp_private/esp_wifi_private.h | 25 + .../esp_private/esp_wifi_types_private.h | 25 + .../include/esp32/esp_wifi/esp_private/wifi.h | 421 + .../esp_wifi/esp_private/wifi_os_adapter.h | 143 + .../esp32/esp_wifi/esp_private/wifi_types.h | 54 + .../include/esp32/esp_wifi/esp_smartconfig.h | 146 + arch/xtensa/include/esp32/esp_wifi/esp_wifi.h | 1053 +++ .../esp32/esp_wifi/esp_wifi_crypto_types.h | 404 + .../include/esp32/esp_wifi/esp_wifi_default.h | 106 + .../include/esp32/esp_wifi/esp_wifi_netif.h | 91 + .../include/esp32/esp_wifi/esp_wifi_types.h | 601 ++ arch/xtensa/include/esp32/esp_wifi/phy.h | 77 + .../include/esp32/esp_wifi/smartconfig_ack.h | 44 + arch/xtensa/include/esp32/freertos/FreeRTOS.h | 1067 +++ .../include/esp32/freertos/FreeRTOSConfig.h | 328 + .../include/esp32/freertos/StackMacros.h | 184 + arch/xtensa/include/esp32/freertos/croutine.h | 762 ++ .../esp32/freertos/deprecated_definitions.h | 321 + .../include/esp32/freertos/event_groups.h | 726 ++ arch/xtensa/include/esp32/freertos/list.h | 466 + .../include/esp32/freertos/mpu_wrappers.h | 157 + arch/xtensa/include/esp32/freertos/portable.h | 245 + .../include/esp32/freertos/portbenchmark.h | 46 + .../xtensa/include/esp32/freertos/portmacro.h | 491 + .../xtensa/include/esp32/freertos/porttrace.h | 42 + arch/xtensa/include/esp32/freertos/projdefs.h | 110 + arch/xtensa/include/esp32/freertos/queue.h | 1648 ++++ arch/xtensa/include/esp32/freertos/semphr.h | 1118 +++ arch/xtensa/include/esp32/freertos/task.h | 2317 +++++ arch/xtensa/include/esp32/freertos/timers.h | 1258 +++ .../include/esp32/freertos/xtensa_api.h | 128 + .../include/esp32/freertos/xtensa_config.h | 146 + .../include/esp32/freertos/xtensa_context.h | 387 + .../include/esp32/freertos/xtensa_rtos.h | 232 + .../include/esp32/freertos/xtensa_timer.h | 159 + .../esp32/heap/include/esp_heap_caps.h | 387 + .../esp32/heap/include/esp_heap_caps_init.h | 92 + .../esp32/heap/include/esp_heap_task_info.h | 98 + .../esp32/heap/include/esp_heap_trace.h | 154 + .../include/esp32/heap/include/heap_trace.inc | 200 + .../include/esp32/heap/include/multi_heap.h | 190 + .../include/esp32/log/esp_log_private.h | 6 + .../include/esp32/log/include/esp_log.h | 358 + .../esp32/log/include/esp_log_internal.h | 24 + .../esp32/newlib/platform_include/assert.h | 41 + .../esp32/newlib/platform_include/errno.h | 39 + .../newlib/platform_include/esp_newlib.h | 51 + .../esp32/newlib/platform_include/net/if.h | 40 + .../esp32/newlib/platform_include/pthread.h | 35 + .../esp32/newlib/platform_include/sys/poll.h | 48 + .../newlib/platform_include/sys/random.h | 30 + .../newlib/platform_include/sys/select.h | 37 + .../newlib/platform_include/sys/termios.h | 296 + .../esp32/newlib/platform_include/sys/time.h | 17 + .../esp32/newlib/platform_include/sys/uio.h | 21 + .../esp32/newlib/platform_include/sys/un.h | 24 + .../newlib/platform_include/sys/unistd.h | 31 + .../esp32/newlib/platform_include/sys/utime.h | 35 + .../esp32/newlib/platform_include/time.h | 35 + .../include/esp32/nvs_flash/include/nvs.h | 568 ++ .../esp32/nvs_flash/include/nvs_flash.h | 193 + .../esp32/nvs_flash/include/nvs_handle.hpp | 262 + .../esp32/soc/esp32/include/hal/adc_ll.h | 622 ++ .../esp32/soc/esp32/include/hal/can_ll.h | 703 ++ .../esp32/soc/esp32/include/hal/dac_ll.h | 185 + .../esp32/soc/esp32/include/hal/emac.h | 403 + .../esp32/soc/esp32/include/hal/gpio_ll.h | 411 + .../esp32/soc/esp32/include/hal/i2c_ll.h | 851 ++ .../esp32/soc/esp32/include/hal/i2s_ll.h | 824 ++ .../esp32/soc/esp32/include/hal/ledc_ll.h | 458 + .../esp32/soc/esp32/include/hal/mcpwm_ll.h | 727 ++ .../esp32/soc/esp32/include/hal/pcnt_ll.h | 301 + .../esp32/soc/esp32/include/hal/rmt_ll.h | 297 + .../esp32/soc/esp32/include/hal/rtc_io_ll.h | 348 + .../soc/esp32/include/hal/sigmadelta_ll.h | 73 + .../soc/esp32/include/hal/spi_flash_ll.h | 352 + .../esp32/soc/esp32/include/hal/spi_ll.h | 876 ++ .../esp32/soc/esp32/include/hal/timer_ll.h | 537 ++ .../include/hal/touch_sensor_hal_esp32.h | 120 + .../soc/esp32/include/hal/touch_sensor_ll.h | 490 + .../esp32/soc/esp32/include/hal/uart_ll.h | 805 ++ .../esp32/soc/esp32/include/soc/adc_caps.h | 25 + .../esp32/soc/esp32/include/soc/adc_channel.h | 72 + .../soc/esp32/include/soc/apb_ctrl_reg.h | 294 + .../soc/esp32/include/soc/apb_ctrl_struct.h | 132 + .../esp32/soc/esp32/include/soc/bb_reg.h | 42 + .../esp32/soc/esp32/include/soc/boot_mode.h | 104 + .../esp32/soc/esp32/include/soc/can_caps.h | 37 + .../esp32/soc/esp32/include/soc/can_struct.h | 210 + .../soc/esp32/include/soc/clkout_channel.h | 26 + .../include/esp32/soc/esp32/include/soc/cpu.h | 143 + .../esp32/soc/esp32/include/soc/dac_caps.h | 22 + .../esp32/soc/esp32/include/soc/dac_channel.h | 24 + .../soc/esp32/include/soc/dport_access.h | 202 + .../esp32/soc/esp32/include/soc/dport_reg.h | 4284 +++++++++ .../esp32/soc/esp32/include/soc/efuse_reg.h | 1188 +++ .../soc/esp32/include/soc/emac_dma_struct.h | 162 + .../soc/esp32/include/soc/emac_ext_struct.h | 74 + .../soc/esp32/include/soc/emac_mac_struct.h | 345 + .../esp32/soc/esp32/include/soc/fe_reg.h | 41 + .../soc/esp32/include/soc/frc_timer_reg.h | 52 + .../esp32/soc/esp32/include/soc/gpio_caps.h | 48 + .../esp32/soc/esp32/include/soc/gpio_reg.h | 8238 +++++++++++++++++ .../esp32/soc/esp32/include/soc/gpio_sd_reg.h | 160 + .../soc/esp32/include/soc/gpio_sd_struct.h | 60 + .../soc/esp32/include/soc/gpio_sig_map.h | 422 + .../esp32/soc/esp32/include/soc/gpio_struct.h | 216 + .../esp32/soc/esp32/include/soc/hinf_reg.h | 248 + .../esp32/soc/esp32/include/soc/hinf_struct.h | 136 + .../esp32/soc/esp32/include/soc/host_reg.h | 3144 +++++++ .../esp32/soc/esp32/include/soc/host_struct.h | 893 ++ .../soc/esp32/include/soc/hwcrypto_reg.h | 74 + .../esp32/soc/esp32/include/soc/i2c_caps.h | 36 + .../esp32/soc/esp32/include/soc/i2c_reg.h | 951 ++ .../esp32/soc/esp32/include/soc/i2c_struct.h | 301 + .../esp32/soc/esp32/include/soc/i2s_caps.h | 38 + .../esp32/soc/esp32/include/soc/i2s_reg.h | 1527 +++ .../esp32/soc/esp32/include/soc/i2s_struct.h | 472 + .../esp32/soc/esp32/include/soc/io_mux_reg.h | 355 + .../esp32/soc/esp32/include/soc/ledc_caps.h | 24 + .../esp32/soc/esp32/include/soc/ledc_reg.h | 2463 +++++ .../esp32/soc/esp32/include/soc/ledc_struct.h | 258 + .../esp32/soc/esp32/include/soc/mcpwm_caps.h | 22 + .../esp32/soc/esp32/include/soc/mcpwm_reg.h | 3028 ++++++ .../soc/esp32/include/soc/mcpwm_struct.h | 464 + .../esp32/soc/esp32/include/soc/nrx_reg.h | 55 + .../esp32/soc/esp32/include/soc/pcnt_caps.h | 40 + .../esp32/soc/esp32/include/soc/pcnt_reg.h | 1526 +++ .../esp32/soc/esp32/include/soc/pcnt_struct.h | 184 + .../esp32/soc/esp32/include/soc/periph_defs.h | 64 + .../include/esp32/soc/esp32/include/soc/pid.h | 65 + .../esp32/soc/esp32/include/soc/rmt_caps.h | 43 + .../esp32/soc/esp32/include/soc/rmt_reg.h | 2604 ++++++ .../esp32/soc/esp32/include/soc/rmt_struct.h | 264 + .../include/esp32/soc/esp32/include/soc/rtc.h | 651 ++ .../soc/esp32/include/soc/rtc_cntl_reg.h | 2072 +++++ .../soc/esp32/include/soc/rtc_cntl_struct.h | 566 ++ .../esp32/soc/esp32/include/soc/rtc_i2c_reg.h | 288 + .../esp32/soc/esp32/include/soc/rtc_io_caps.h | 21 + .../soc/esp32/include/soc/rtc_io_channel.h | 75 + .../esp32/soc/esp32/include/soc/rtc_io_reg.h | 1954 ++++ .../soc/esp32/include/soc/rtc_io_struct.h | 293 + .../soc/esp32/include/soc/sdio_slave_pins.h | 34 + .../esp32/soc/esp32/include/soc/sdmmc_pins.h | 38 + .../esp32/soc/esp32/include/soc/sdmmc_reg.h | 97 + .../soc/esp32/include/soc/sdmmc_struct.h | 393 + .../esp32/soc/esp32/include/soc/sens_reg.h | 1068 +++ .../esp32/soc/esp32/include/soc/sens_struct.h | 328 + .../soc/esp32/include/soc/sigmadelta_caps.h | 37 + .../esp32/soc/esp32/include/soc/slc_reg.h | 3244 +++++++ .../esp32/soc/esp32/include/soc/slc_struct.h | 860 ++ .../include/esp32/soc/esp32/include/soc/soc.h | 413 + .../esp32/soc/esp32/include/soc/soc_caps.h | 12 + .../esp32/soc/esp32/include/soc/soc_ulp.h | 46 + .../esp32/soc/esp32/include/soc/spi_caps.h | 63 + .../esp32/soc/esp32/include/soc/spi_reg.h | 1713 ++++ .../esp32/soc/esp32/include/soc/spi_struct.h | 688 ++ .../esp32/soc/esp32/include/soc/syscon_reg.h | 294 + .../soc/esp32/include/soc/syscon_struct.h | 125 + .../soc/esp32/include/soc/timer_group_caps.h | 15 + .../soc/esp32/include/soc/timer_group_reg.h | 668 ++ .../esp32/include/soc/timer_group_struct.h | 207 + .../soc/esp32/include/soc/touch_sensor_caps.h | 29 + .../esp32/include/soc/touch_sensor_channel.h | 49 + .../esp32/soc/esp32/include/soc/uart_caps.h | 33 + .../soc/esp32/include/soc/uart_channel.h | 61 + .../esp32/soc/esp32/include/soc/uart_reg.h | 1180 +++ .../esp32/soc/esp32/include/soc/uart_struct.h | 383 + .../esp32/soc/esp32/include/soc/uhci_reg.h | 1260 +++ .../esp32/soc/esp32/include/soc/uhci_struct.h | 349 + .../esp32/soc/esp32/include/soc/wdev_reg.h | 20 + .../include/esp32/soc/include/hal/adc_hal.h | 207 + .../include/esp32/soc/include/hal/adc_types.h | 37 + .../include/esp32/soc/include/hal/can_hal.h | 305 + .../include/esp32/soc/include/hal/can_types.h | 137 + .../include/esp32/soc/include/hal/dac_hal.h | 76 + .../include/esp32/soc/include/hal/dac_types.h | 40 + .../esp32/soc/include/hal/esp_flash_err.h | 48 + .../include/esp32/soc/include/hal/gpio_hal.h | 342 + .../esp32/soc/include/hal/gpio_types.h | 251 + .../include/esp32/soc/include/hal/hal_defs.h | 30 + .../include/esp32/soc/include/hal/i2c_hal.h | 524 ++ .../include/esp32/soc/include/hal/i2c_types.h | 96 + .../include/esp32/soc/include/hal/i2s_hal.h | 296 + .../include/esp32/soc/include/hal/i2s_types.h | 195 + .../include/esp32/soc/include/hal/ledc_hal.h | 388 + .../esp32/soc/include/hal/ledc_types.h | 153 + .../include/esp32/soc/include/hal/mcpwm_hal.h | 328 + .../esp32/soc/include/hal/mcpwm_types.h | 86 + .../include/esp32/soc/include/hal/pcnt_hal.h | 214 + .../esp32/soc/include/hal/pcnt_types.h | 92 + .../include/esp32/soc/include/hal/readme.md | 25 + .../include/esp32/soc/include/hal/rmt_hal.h | 142 + .../include/esp32/soc/include/hal/rmt_types.h | 108 + .../esp32/soc/include/hal/rtc_io_hal.h | 239 + .../esp32/soc/include/hal/rtc_io_types.h | 25 + .../esp32/soc/include/hal/sdio_slave_hal.h | 529 ++ .../esp32/soc/include/hal/sdio_slave_ll.h | 482 + .../esp32/soc/include/hal/sdio_slave_types.h | 47 + .../esp32/soc/include/hal/sigmadelta_hal.h | 71 + .../esp32/soc/include/hal/sigmadelta_types.h | 45 + .../esp32/soc/include/hal/spi_flash_hal.h | 218 + .../esp32/soc/include/hal/spi_flash_types.h | 153 + .../include/esp32/soc/include/hal/spi_hal.h | 222 + .../esp32/soc/include/hal/spi_slave_hal.h | 152 + .../include/esp32/soc/include/hal/spi_types.h | 42 + .../include/esp32/soc/include/hal/timer_hal.h | 322 + .../esp32/soc/include/hal/timer_types.h | 138 + .../esp32/soc/include/hal/touch_sensor_hal.h | 227 + .../soc/include/hal/touch_sensor_types.h | 264 + .../include/esp32/soc/include/hal/uart_hal.h | 435 + .../esp32/soc/include/hal/uart_types.h | 145 + .../esp32/soc/include/soc/adc_periph.h | 33 + .../esp32/soc/include/soc/can_periph.h | 22 + .../esp32/soc/include/soc/dac_periph.h | 38 + .../esp32/soc/include/soc/efuse_periph.h | 16 + .../esp32/soc/include/soc/emac_periph.h | 17 + .../esp32/soc/include/soc/gpio_periph.h | 34 + .../esp32/soc/include/soc/hwcrypto_periph.h | 17 + .../esp32/soc/include/soc/i2c_periph.h | 30 + .../esp32/soc/include/soc/i2s_periph.h | 48 + .../esp32/soc/include/soc/interrupts.h | 28 + .../esp32/soc/include/soc/ledc_periph.h | 31 + .../include/esp32/soc/include/soc/lldesc.h | 53 + .../esp32/soc/include/soc/mcpwm_periph.h | 17 + .../esp32/soc/include/soc/pcnt_periph.h | 18 + .../esp32/soc/include/soc/rmt_periph.h | 17 + .../esp32/soc/include/soc/rtc_io_periph.h | 109 + .../esp32/soc/include/soc/rtc_periph.h | 27 + .../include/esp32/soc/include/soc/rtc_wdt.h | 198 + .../esp32/soc/include/soc/sdio_slave_periph.h | 45 + .../esp32/soc/include/soc/sdmmc_periph.h | 49 + .../esp32/soc/include/soc/sens_periph.h | 17 + .../esp32/soc/include/soc/sigmadelta_periph.h | 17 + .../esp32/soc/include/soc/soc_memory_layout.h | 259 + .../esp32/soc/include/soc/spi_periph.h | 82 + .../esp32/soc/include/soc/syscon_periph.h | 17 + .../esp32/soc/include/soc/timer_periph.h | 17 + .../soc/include/soc/touch_sensor_periph.h | 25 + .../esp32/soc/include/soc/uart_periph.h | 31 + .../esp32/soc/include/soc/uhci_periph.h | 18 + .../esp32/spi_flash/include/esp_flash.h | 306 + .../spi_flash/include/esp_flash_internal.h | 100 + .../spi_flash/include/esp_flash_spi_init.h | 62 + .../esp32/spi_flash/include/esp_partition.h | 368 + .../esp32/spi_flash/include/esp_spi_flash.h | 460 + .../spi_flash/include/memspi_host_driver.h | 142 + .../spi_flash/include/spi_flash_chip_driver.h | 168 + .../spi_flash/include/spi_flash_chip_gd.h | 32 + .../include/spi_flash_chip_generic.h | 370 + .../spi_flash/include/spi_flash_chip_issi.h | 27 + .../private_include/spi_flash_defs.h | 43 + .../include/esp_supplicant/esp_wpa.h | 79 + .../include/esp_supplicant/esp_wpa2.h | 197 + .../include/esp_supplicant/esp_wps.h | 147 + .../wpa_supplicant/include/utils/wpa_debug.h | 208 + .../wpa_supplicant/include/utils/wpabuf.h | 168 + .../wpa_supplicant/port/include/byteswap.h | 73 + .../wpa_supplicant/port/include/endian.h | 226 + .../esp32/wpa_supplicant/port/include/os.h | 299 + .../port/include/supplicant_opt.h | 24 + .../esp32/include/xtensa/config/core-isa.h | 655 ++ .../esp32/include/xtensa/config/core-matmap.h | 318 + .../xtensa/esp32/include/xtensa/config/core.h | 1416 +++ .../xtensa/esp32/include/xtensa/config/defs.h | 38 + .../esp32/include/xtensa/config/specreg.h | 117 + .../esp32/include/xtensa/config/system.h | 274 + .../esp32/include/xtensa/config/tie-asm.h | 323 + .../xtensa/esp32/include/xtensa/config/tie.h | 182 + .../xtensa/include/esp32/xtensa/include/eri.h | 31 + .../include/esp32/xtensa/include/esp_attr.h | 124 + .../esp32/xtensa/include/esp_debug_helpers.h | 133 + .../include/esp32/xtensa/include/esp_panic.h | 4 + .../xtensa/include/esp_private/panic_reason.h | 11 + .../include/esp32/xtensa/include/trax.h | 61 + .../xtensa/include/xtensa-debug-module.h | 115 + .../esp32/xtensa/include/xtensa/cacheasm.h | 962 ++ .../xtensa/include/xtensa/cacheattrasm.h | 436 + .../esp32/xtensa/include/xtensa/core-macros.h | 506 + .../esp32/xtensa/include/xtensa/coreasm.h | 1059 +++ .../esp32/xtensa/include/xtensa/corebits.h | 195 + .../include/esp32/xtensa/include/xtensa/hal.h | 1508 +++ .../esp32/xtensa/include/xtensa/idmaasm.h | 72 + .../esp32/xtensa/include/xtensa/mpuasm.h | 111 + .../esp32/xtensa/include/xtensa/specreg.h | 144 + .../esp32/xtensa/include/xtensa/traxreg.h | 196 + .../esp32/xtensa/include/xtensa/xdm-regs.h | 536 ++ .../xtensa/include/xtensa/xt_perf_consts.h | 325 + .../include/xtensa/xtensa-libdb-macros.h | 161 + .../xtensa/include/xtensa/xtensa-versions.h | 404 + .../esp32/xtensa/include/xtensa/xtensa-xer.h | 149 + .../include/xtensa/xtruntime-core-state.h | 240 + .../xtensa/include/xtensa/xtruntime-frames.h | 162 + .../esp32/xtensa/include/xtensa/xtruntime.h | 237 + 431 files changed, 131599 insertions(+) create mode 100644 arch/xtensa/include/esp32/driver/esp32/include/touch_sensor.h create mode 100644 arch/xtensa/include/esp32/driver/esp32/touch_sensor.c create mode 100644 arch/xtensa/include/esp32/driver/include/driver/adc.h create mode 100644 arch/xtensa/include/esp32/driver/include/driver/adc2_wifi_internal.h create mode 100644 arch/xtensa/include/esp32/driver/include/driver/can.h create mode 100644 arch/xtensa/include/esp32/driver/include/driver/dac.h create mode 100644 arch/xtensa/include/esp32/driver/include/driver/gpio.h create mode 100644 arch/xtensa/include/esp32/driver/include/driver/i2c.h create mode 100644 arch/xtensa/include/esp32/driver/include/driver/i2s.h create mode 100644 arch/xtensa/include/esp32/driver/include/driver/ledc.h create mode 100644 arch/xtensa/include/esp32/driver/include/driver/mcpwm.h create mode 100644 arch/xtensa/include/esp32/driver/include/driver/pcnt.h create mode 100644 arch/xtensa/include/esp32/driver/include/driver/periph_ctrl.h create mode 100644 arch/xtensa/include/esp32/driver/include/driver/rmt.h create mode 100644 arch/xtensa/include/esp32/driver/include/driver/rtc_cntl.h create mode 100644 arch/xtensa/include/esp32/driver/include/driver/rtc_io.h create mode 100644 arch/xtensa/include/esp32/driver/include/driver/sdio_slave.h create mode 100644 arch/xtensa/include/esp32/driver/include/driver/sdmmc_defs.h create mode 100644 arch/xtensa/include/esp32/driver/include/driver/sdmmc_host.h create mode 100644 arch/xtensa/include/esp32/driver/include/driver/sdmmc_types.h create mode 100644 arch/xtensa/include/esp32/driver/include/driver/sdspi_host.h create mode 100644 arch/xtensa/include/esp32/driver/include/driver/sigmadelta.h create mode 100644 arch/xtensa/include/esp32/driver/include/driver/spi_common.h create mode 100644 arch/xtensa/include/esp32/driver/include/driver/spi_common_internal.h create mode 100644 arch/xtensa/include/esp32/driver/include/driver/spi_master.h create mode 100644 arch/xtensa/include/esp32/driver/include/driver/spi_slave.h create mode 100644 arch/xtensa/include/esp32/driver/include/driver/timer.h create mode 100644 arch/xtensa/include/esp32/driver/include/driver/touch_pad.h create mode 100644 arch/xtensa/include/esp32/driver/include/driver/touch_sensor_common.h create mode 100644 arch/xtensa/include/esp32/driver/include/driver/uart.h create mode 100644 arch/xtensa/include/esp32/driver/include/driver/uart_select.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/esp32/brownout.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/esp32/cache_err_int.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/esp32/clk.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/esp32/dport_access.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/esp32/himem.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/esp32/pm.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/esp32/spiram.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/esp_clk.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/esp_himem.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/esp_intr.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/esp_intr_alloc.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/esp_sleep.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/esp_spiram.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/esp_ssc.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/rom/aes.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/rom/bigint.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/rom/cache.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/rom/crc.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/rom/efuse.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/rom/ets_sys.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/rom/gpio.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/rom/libc_stubs.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/rom/lldesc.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/rom/md5_hash.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/rom/miniz.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/rom/queue.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/rom/rtc.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/rom/secure_boot.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/rom/sha.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/rom/spi_flash.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/rom/tbconsole.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/rom/tjpgd.h create mode 100644 arch/xtensa/include/esp32/esp32_chip/include/rom/uart.h create mode 100644 arch/xtensa/include/esp32/esp_common/esp_assert.h create mode 100644 arch/xtensa/include/esp32/esp_common/esp_bit_defs.h create mode 100644 arch/xtensa/include/esp32/esp_common/esp_compiler.h create mode 100644 arch/xtensa/include/esp32/esp_common/esp_crc.h create mode 100644 arch/xtensa/include/esp32/esp_common/esp_err.h create mode 100644 arch/xtensa/include/esp32/esp_common/esp_expression_with_stack.h create mode 100644 arch/xtensa/include/esp32/esp_common/esp_fault.h create mode 100644 arch/xtensa/include/esp32/esp_common/esp_freertos_hooks.h create mode 100644 arch/xtensa/include/esp32/esp_common/esp_idf_version.h create mode 100644 arch/xtensa/include/esp32/esp_common/esp_int_wdt.h create mode 100644 arch/xtensa/include/esp32/esp_common/esp_interface.h create mode 100644 arch/xtensa/include/esp32/esp_common/esp_ipc.h create mode 100644 arch/xtensa/include/esp32/esp_common/esp_pm.h create mode 100644 arch/xtensa/include/esp32/esp_common/esp_private/crosscore_int.h create mode 100644 arch/xtensa/include/esp32/esp_common/esp_private/dbg_stubs.h create mode 100644 arch/xtensa/include/esp32/esp_common/esp_private/esp_timer_impl.h create mode 100644 arch/xtensa/include/esp32/esp_common/esp_private/gdbstub.h create mode 100644 arch/xtensa/include/esp32/esp_common/esp_private/pm_impl.h create mode 100644 arch/xtensa/include/esp32/esp_common/esp_private/pm_trace.h create mode 100644 arch/xtensa/include/esp32/esp_common/esp_private/system_internal.h create mode 100644 arch/xtensa/include/esp32/esp_common/esp_system.h create mode 100644 arch/xtensa/include/esp32/esp_common/esp_task.h create mode 100644 arch/xtensa/include/esp32/esp_common/esp_task_wdt.h create mode 100644 arch/xtensa/include/esp32/esp_common/esp_timer.h create mode 100644 arch/xtensa/include/esp32/esp_common/esp_types.h create mode 100644 arch/xtensa/include/esp32/esp_eth/Kconfig create mode 100644 arch/xtensa/include/esp32/esp_eth/include/esp_eth.h create mode 100644 arch/xtensa/include/esp32/esp_eth/include/esp_eth_com.h create mode 100644 arch/xtensa/include/esp32/esp_eth/include/esp_eth_mac.h create mode 100644 arch/xtensa/include/esp32/esp_eth/include/esp_eth_netif_glue.h create mode 100644 arch/xtensa/include/esp32/esp_eth/include/esp_eth_phy.h create mode 100644 arch/xtensa/include/esp32/esp_eth/include/eth_phy_regs_struct.h create mode 100644 arch/xtensa/include/esp32/esp_event/include/esp_event.h create mode 100644 arch/xtensa/include/esp32/esp_event/include/esp_event_base.h create mode 100644 arch/xtensa/include/esp32/esp_event/include/esp_event_legacy.h create mode 100644 arch/xtensa/include/esp32/esp_event/include/esp_event_loop.h create mode 100644 arch/xtensa/include/esp32/esp_event/private_include/esp_event_internal.h create mode 100644 arch/xtensa/include/esp32/esp_event/private_include/esp_event_private.h create mode 100644 arch/xtensa/include/esp32/esp_netif/include/esp_netif.h create mode 100644 arch/xtensa/include/esp32/esp_netif/include/esp_netif_defaults.h create mode 100644 arch/xtensa/include/esp32/esp_netif/include/esp_netif_ip_addr.h create mode 100644 arch/xtensa/include/esp32/esp_netif/include/esp_netif_net_stack.h create mode 100644 arch/xtensa/include/esp32/esp_netif/include/esp_netif_ppp.h create mode 100644 arch/xtensa/include/esp32/esp_netif/include/esp_netif_sta_list.h create mode 100644 arch/xtensa/include/esp32/esp_netif/include/esp_netif_types.h create mode 100644 arch/xtensa/include/esp32/esp_rom/CMakeLists.txt create mode 100644 arch/xtensa/include/esp32/esp_rom/component.mk create mode 100644 arch/xtensa/include/esp32/esp_rom/esp_rom.c create mode 100644 arch/xtensa/include/esp32/esp_rom/include/esp32/rom/aes.h create mode 100644 arch/xtensa/include/esp32/esp_rom/include/esp32/rom/bigint.h create mode 100644 arch/xtensa/include/esp32/esp_rom/include/esp32/rom/cache.h create mode 100644 arch/xtensa/include/esp32/esp_rom/include/esp32/rom/crc.h create mode 100644 arch/xtensa/include/esp32/esp_rom/include/esp32/rom/efuse.h create mode 100644 arch/xtensa/include/esp32/esp_rom/include/esp32/rom/ets_sys.h create mode 100644 arch/xtensa/include/esp32/esp_rom/include/esp32/rom/gpio.h create mode 100644 arch/xtensa/include/esp32/esp_rom/include/esp32/rom/libc_stubs.h create mode 100644 arch/xtensa/include/esp32/esp_rom/include/esp32/rom/lldesc.h create mode 100644 arch/xtensa/include/esp32/esp_rom/include/esp32/rom/md5_hash.h create mode 100644 arch/xtensa/include/esp32/esp_rom/include/esp32/rom/miniz.h create mode 100644 arch/xtensa/include/esp32/esp_rom/include/esp32/rom/rtc.h create mode 100644 arch/xtensa/include/esp32/esp_rom/include/esp32/rom/secure_boot.h create mode 100644 arch/xtensa/include/esp32/esp_rom/include/esp32/rom/sha.h create mode 100644 arch/xtensa/include/esp32/esp_rom/include/esp32/rom/spi_flash.h create mode 100644 arch/xtensa/include/esp32/esp_rom/include/esp32/rom/tbconsole.h create mode 100644 arch/xtensa/include/esp32/esp_rom/include/esp32/rom/tjpgd.h create mode 100644 arch/xtensa/include/esp32/esp_rom/include/esp32/rom/uart.h create mode 100644 arch/xtensa/include/esp32/esp_wifi/esp_coexist.h create mode 100644 arch/xtensa/include/esp32/esp_wifi/esp_coexist_adapter.h create mode 100644 arch/xtensa/include/esp32/esp_wifi/esp_coexist_internal.h create mode 100644 arch/xtensa/include/esp32/esp_wifi/esp_mesh.h create mode 100644 arch/xtensa/include/esp32/esp_wifi/esp_mesh_internal.h create mode 100644 arch/xtensa/include/esp32/esp_wifi/esp_now.h create mode 100644 arch/xtensa/include/esp32/esp_wifi/esp_phy_init.h create mode 100644 arch/xtensa/include/esp32/esp_wifi/esp_private/esp_wifi_private.h create mode 100644 arch/xtensa/include/esp32/esp_wifi/esp_private/esp_wifi_types_private.h create mode 100644 arch/xtensa/include/esp32/esp_wifi/esp_private/wifi.h create mode 100644 arch/xtensa/include/esp32/esp_wifi/esp_private/wifi_os_adapter.h create mode 100644 arch/xtensa/include/esp32/esp_wifi/esp_private/wifi_types.h create mode 100644 arch/xtensa/include/esp32/esp_wifi/esp_smartconfig.h create mode 100644 arch/xtensa/include/esp32/esp_wifi/esp_wifi.h create mode 100644 arch/xtensa/include/esp32/esp_wifi/esp_wifi_crypto_types.h create mode 100644 arch/xtensa/include/esp32/esp_wifi/esp_wifi_default.h create mode 100644 arch/xtensa/include/esp32/esp_wifi/esp_wifi_netif.h create mode 100644 arch/xtensa/include/esp32/esp_wifi/esp_wifi_types.h create mode 100644 arch/xtensa/include/esp32/esp_wifi/phy.h create mode 100644 arch/xtensa/include/esp32/esp_wifi/smartconfig_ack.h create mode 100644 arch/xtensa/include/esp32/freertos/FreeRTOS.h create mode 100644 arch/xtensa/include/esp32/freertos/FreeRTOSConfig.h create mode 100644 arch/xtensa/include/esp32/freertos/StackMacros.h create mode 100644 arch/xtensa/include/esp32/freertos/croutine.h create mode 100644 arch/xtensa/include/esp32/freertos/deprecated_definitions.h create mode 100644 arch/xtensa/include/esp32/freertos/event_groups.h create mode 100644 arch/xtensa/include/esp32/freertos/list.h create mode 100644 arch/xtensa/include/esp32/freertos/mpu_wrappers.h create mode 100644 arch/xtensa/include/esp32/freertos/portable.h create mode 100644 arch/xtensa/include/esp32/freertos/portbenchmark.h create mode 100644 arch/xtensa/include/esp32/freertos/portmacro.h create mode 100644 arch/xtensa/include/esp32/freertos/porttrace.h create mode 100644 arch/xtensa/include/esp32/freertos/projdefs.h create mode 100644 arch/xtensa/include/esp32/freertos/queue.h create mode 100644 arch/xtensa/include/esp32/freertos/semphr.h create mode 100644 arch/xtensa/include/esp32/freertos/task.h create mode 100644 arch/xtensa/include/esp32/freertos/timers.h create mode 100644 arch/xtensa/include/esp32/freertos/xtensa_api.h create mode 100644 arch/xtensa/include/esp32/freertos/xtensa_config.h create mode 100644 arch/xtensa/include/esp32/freertos/xtensa_context.h create mode 100644 arch/xtensa/include/esp32/freertos/xtensa_rtos.h create mode 100644 arch/xtensa/include/esp32/freertos/xtensa_timer.h create mode 100644 arch/xtensa/include/esp32/heap/include/esp_heap_caps.h create mode 100644 arch/xtensa/include/esp32/heap/include/esp_heap_caps_init.h create mode 100644 arch/xtensa/include/esp32/heap/include/esp_heap_task_info.h create mode 100644 arch/xtensa/include/esp32/heap/include/esp_heap_trace.h create mode 100644 arch/xtensa/include/esp32/heap/include/heap_trace.inc create mode 100644 arch/xtensa/include/esp32/heap/include/multi_heap.h create mode 100644 arch/xtensa/include/esp32/log/esp_log_private.h create mode 100644 arch/xtensa/include/esp32/log/include/esp_log.h create mode 100644 arch/xtensa/include/esp32/log/include/esp_log_internal.h create mode 100644 arch/xtensa/include/esp32/newlib/platform_include/assert.h create mode 100644 arch/xtensa/include/esp32/newlib/platform_include/errno.h create mode 100644 arch/xtensa/include/esp32/newlib/platform_include/esp_newlib.h create mode 100644 arch/xtensa/include/esp32/newlib/platform_include/net/if.h create mode 100644 arch/xtensa/include/esp32/newlib/platform_include/pthread.h create mode 100644 arch/xtensa/include/esp32/newlib/platform_include/sys/poll.h create mode 100644 arch/xtensa/include/esp32/newlib/platform_include/sys/random.h create mode 100644 arch/xtensa/include/esp32/newlib/platform_include/sys/select.h create mode 100644 arch/xtensa/include/esp32/newlib/platform_include/sys/termios.h create mode 100644 arch/xtensa/include/esp32/newlib/platform_include/sys/time.h create mode 100644 arch/xtensa/include/esp32/newlib/platform_include/sys/uio.h create mode 100644 arch/xtensa/include/esp32/newlib/platform_include/sys/un.h create mode 100644 arch/xtensa/include/esp32/newlib/platform_include/sys/unistd.h create mode 100644 arch/xtensa/include/esp32/newlib/platform_include/sys/utime.h create mode 100644 arch/xtensa/include/esp32/newlib/platform_include/time.h create mode 100644 arch/xtensa/include/esp32/nvs_flash/include/nvs.h create mode 100644 arch/xtensa/include/esp32/nvs_flash/include/nvs_flash.h create mode 100644 arch/xtensa/include/esp32/nvs_flash/include/nvs_handle.hpp create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/hal/adc_ll.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/hal/can_ll.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/hal/dac_ll.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/hal/emac.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/hal/gpio_ll.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/hal/i2c_ll.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/hal/i2s_ll.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/hal/ledc_ll.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/hal/mcpwm_ll.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/hal/pcnt_ll.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/hal/rmt_ll.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/hal/rtc_io_ll.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/hal/sigmadelta_ll.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/hal/spi_flash_ll.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/hal/spi_ll.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/hal/timer_ll.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/hal/touch_sensor_hal_esp32.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/hal/touch_sensor_ll.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/hal/uart_ll.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/adc_caps.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/adc_channel.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/apb_ctrl_reg.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/apb_ctrl_struct.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/bb_reg.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/boot_mode.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/can_caps.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/can_struct.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/clkout_channel.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/cpu.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/dac_caps.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/dac_channel.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/dport_access.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/dport_reg.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/efuse_reg.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/emac_dma_struct.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/emac_ext_struct.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/emac_mac_struct.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/fe_reg.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/frc_timer_reg.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/gpio_caps.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/gpio_reg.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/gpio_sd_reg.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/gpio_sd_struct.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/gpio_sig_map.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/gpio_struct.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/hinf_reg.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/hinf_struct.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/host_reg.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/host_struct.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/hwcrypto_reg.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/i2c_caps.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/i2c_reg.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/i2c_struct.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/i2s_caps.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/i2s_reg.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/i2s_struct.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/io_mux_reg.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/ledc_caps.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/ledc_reg.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/ledc_struct.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/mcpwm_caps.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/mcpwm_reg.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/mcpwm_struct.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/nrx_reg.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/pcnt_caps.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/pcnt_reg.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/pcnt_struct.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/periph_defs.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/pid.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/rmt_caps.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/rmt_reg.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/rmt_struct.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/rtc.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/rtc_cntl_reg.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/rtc_cntl_struct.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/rtc_i2c_reg.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/rtc_io_caps.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/rtc_io_channel.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/rtc_io_reg.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/rtc_io_struct.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/sdio_slave_pins.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/sdmmc_pins.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/sdmmc_reg.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/sdmmc_struct.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/sens_reg.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/sens_struct.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/sigmadelta_caps.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/slc_reg.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/slc_struct.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/soc.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/soc_caps.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/soc_ulp.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/spi_caps.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/spi_reg.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/spi_struct.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/syscon_reg.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/syscon_struct.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/timer_group_caps.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/timer_group_reg.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/timer_group_struct.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/touch_sensor_caps.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/touch_sensor_channel.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/uart_caps.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/uart_channel.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/uart_reg.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/uart_struct.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/uhci_reg.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/uhci_struct.h create mode 100644 arch/xtensa/include/esp32/soc/esp32/include/soc/wdev_reg.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/adc_hal.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/adc_types.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/can_hal.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/can_types.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/dac_hal.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/dac_types.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/esp_flash_err.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/gpio_hal.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/gpio_types.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/hal_defs.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/i2c_hal.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/i2c_types.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/i2s_hal.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/i2s_types.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/ledc_hal.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/ledc_types.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/mcpwm_hal.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/mcpwm_types.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/pcnt_hal.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/pcnt_types.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/readme.md create mode 100644 arch/xtensa/include/esp32/soc/include/hal/rmt_hal.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/rmt_types.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/rtc_io_hal.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/rtc_io_types.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/sdio_slave_hal.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/sdio_slave_ll.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/sdio_slave_types.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/sigmadelta_hal.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/sigmadelta_types.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/spi_flash_hal.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/spi_flash_types.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/spi_hal.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/spi_slave_hal.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/spi_types.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/timer_hal.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/timer_types.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/touch_sensor_hal.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/touch_sensor_types.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/uart_hal.h create mode 100644 arch/xtensa/include/esp32/soc/include/hal/uart_types.h create mode 100644 arch/xtensa/include/esp32/soc/include/soc/adc_periph.h create mode 100644 arch/xtensa/include/esp32/soc/include/soc/can_periph.h create mode 100644 arch/xtensa/include/esp32/soc/include/soc/dac_periph.h create mode 100644 arch/xtensa/include/esp32/soc/include/soc/efuse_periph.h create mode 100644 arch/xtensa/include/esp32/soc/include/soc/emac_periph.h create mode 100644 arch/xtensa/include/esp32/soc/include/soc/gpio_periph.h create mode 100644 arch/xtensa/include/esp32/soc/include/soc/hwcrypto_periph.h create mode 100644 arch/xtensa/include/esp32/soc/include/soc/i2c_periph.h create mode 100644 arch/xtensa/include/esp32/soc/include/soc/i2s_periph.h create mode 100644 arch/xtensa/include/esp32/soc/include/soc/interrupts.h create mode 100644 arch/xtensa/include/esp32/soc/include/soc/ledc_periph.h create mode 100644 arch/xtensa/include/esp32/soc/include/soc/lldesc.h create mode 100644 arch/xtensa/include/esp32/soc/include/soc/mcpwm_periph.h create mode 100644 arch/xtensa/include/esp32/soc/include/soc/pcnt_periph.h create mode 100644 arch/xtensa/include/esp32/soc/include/soc/rmt_periph.h create mode 100644 arch/xtensa/include/esp32/soc/include/soc/rtc_io_periph.h create mode 100644 arch/xtensa/include/esp32/soc/include/soc/rtc_periph.h create mode 100644 arch/xtensa/include/esp32/soc/include/soc/rtc_wdt.h create mode 100644 arch/xtensa/include/esp32/soc/include/soc/sdio_slave_periph.h create mode 100644 arch/xtensa/include/esp32/soc/include/soc/sdmmc_periph.h create mode 100644 arch/xtensa/include/esp32/soc/include/soc/sens_periph.h create mode 100644 arch/xtensa/include/esp32/soc/include/soc/sigmadelta_periph.h create mode 100644 arch/xtensa/include/esp32/soc/include/soc/soc_memory_layout.h create mode 100644 arch/xtensa/include/esp32/soc/include/soc/spi_periph.h create mode 100644 arch/xtensa/include/esp32/soc/include/soc/syscon_periph.h create mode 100644 arch/xtensa/include/esp32/soc/include/soc/timer_periph.h create mode 100644 arch/xtensa/include/esp32/soc/include/soc/touch_sensor_periph.h create mode 100644 arch/xtensa/include/esp32/soc/include/soc/uart_periph.h create mode 100644 arch/xtensa/include/esp32/soc/include/soc/uhci_periph.h create mode 100644 arch/xtensa/include/esp32/spi_flash/include/esp_flash.h create mode 100644 arch/xtensa/include/esp32/spi_flash/include/esp_flash_internal.h create mode 100644 arch/xtensa/include/esp32/spi_flash/include/esp_flash_spi_init.h create mode 100644 arch/xtensa/include/esp32/spi_flash/include/esp_partition.h create mode 100644 arch/xtensa/include/esp32/spi_flash/include/esp_spi_flash.h create mode 100644 arch/xtensa/include/esp32/spi_flash/include/memspi_host_driver.h create mode 100644 arch/xtensa/include/esp32/spi_flash/include/spi_flash_chip_driver.h create mode 100644 arch/xtensa/include/esp32/spi_flash/include/spi_flash_chip_gd.h create mode 100644 arch/xtensa/include/esp32/spi_flash/include/spi_flash_chip_generic.h create mode 100644 arch/xtensa/include/esp32/spi_flash/include/spi_flash_chip_issi.h create mode 100644 arch/xtensa/include/esp32/spi_flash/private_include/spi_flash_defs.h create mode 100644 arch/xtensa/include/esp32/wpa_supplicant/include/esp_supplicant/esp_wpa.h create mode 100644 arch/xtensa/include/esp32/wpa_supplicant/include/esp_supplicant/esp_wpa2.h create mode 100644 arch/xtensa/include/esp32/wpa_supplicant/include/esp_supplicant/esp_wps.h create mode 100644 arch/xtensa/include/esp32/wpa_supplicant/include/utils/wpa_debug.h create mode 100644 arch/xtensa/include/esp32/wpa_supplicant/include/utils/wpabuf.h create mode 100644 arch/xtensa/include/esp32/wpa_supplicant/port/include/byteswap.h create mode 100644 arch/xtensa/include/esp32/wpa_supplicant/port/include/endian.h create mode 100644 arch/xtensa/include/esp32/wpa_supplicant/port/include/os.h create mode 100644 arch/xtensa/include/esp32/wpa_supplicant/port/include/supplicant_opt.h create mode 100644 arch/xtensa/include/esp32/xtensa/esp32/include/xtensa/config/core-isa.h create mode 100644 arch/xtensa/include/esp32/xtensa/esp32/include/xtensa/config/core-matmap.h create mode 100644 arch/xtensa/include/esp32/xtensa/esp32/include/xtensa/config/core.h create mode 100644 arch/xtensa/include/esp32/xtensa/esp32/include/xtensa/config/defs.h create mode 100644 arch/xtensa/include/esp32/xtensa/esp32/include/xtensa/config/specreg.h create mode 100644 arch/xtensa/include/esp32/xtensa/esp32/include/xtensa/config/system.h create mode 100644 arch/xtensa/include/esp32/xtensa/esp32/include/xtensa/config/tie-asm.h create mode 100644 arch/xtensa/include/esp32/xtensa/esp32/include/xtensa/config/tie.h create mode 100644 arch/xtensa/include/esp32/xtensa/include/eri.h create mode 100644 arch/xtensa/include/esp32/xtensa/include/esp_attr.h create mode 100644 arch/xtensa/include/esp32/xtensa/include/esp_debug_helpers.h create mode 100644 arch/xtensa/include/esp32/xtensa/include/esp_panic.h create mode 100644 arch/xtensa/include/esp32/xtensa/include/esp_private/panic_reason.h create mode 100644 arch/xtensa/include/esp32/xtensa/include/trax.h create mode 100644 arch/xtensa/include/esp32/xtensa/include/xtensa-debug-module.h create mode 100644 arch/xtensa/include/esp32/xtensa/include/xtensa/cacheasm.h create mode 100644 arch/xtensa/include/esp32/xtensa/include/xtensa/cacheattrasm.h create mode 100644 arch/xtensa/include/esp32/xtensa/include/xtensa/core-macros.h create mode 100644 arch/xtensa/include/esp32/xtensa/include/xtensa/coreasm.h create mode 100644 arch/xtensa/include/esp32/xtensa/include/xtensa/corebits.h create mode 100644 arch/xtensa/include/esp32/xtensa/include/xtensa/hal.h create mode 100644 arch/xtensa/include/esp32/xtensa/include/xtensa/idmaasm.h create mode 100644 arch/xtensa/include/esp32/xtensa/include/xtensa/mpuasm.h create mode 100644 arch/xtensa/include/esp32/xtensa/include/xtensa/specreg.h create mode 100644 arch/xtensa/include/esp32/xtensa/include/xtensa/traxreg.h create mode 100644 arch/xtensa/include/esp32/xtensa/include/xtensa/xdm-regs.h create mode 100644 arch/xtensa/include/esp32/xtensa/include/xtensa/xt_perf_consts.h create mode 100644 arch/xtensa/include/esp32/xtensa/include/xtensa/xtensa-libdb-macros.h create mode 100644 arch/xtensa/include/esp32/xtensa/include/xtensa/xtensa-versions.h create mode 100644 arch/xtensa/include/esp32/xtensa/include/xtensa/xtensa-xer.h create mode 100644 arch/xtensa/include/esp32/xtensa/include/xtensa/xtruntime-core-state.h create mode 100644 arch/xtensa/include/esp32/xtensa/include/xtensa/xtruntime-frames.h create mode 100644 arch/xtensa/include/esp32/xtensa/include/xtensa/xtruntime.h diff --git a/arch/xtensa/include/esp32/driver/esp32/include/touch_sensor.h b/arch/xtensa/include/esp32/driver/esp32/include/touch_sensor.h new file mode 100644 index 0000000000000..e7ed06ff839cc --- /dev/null +++ b/arch/xtensa/include/esp32/driver/esp32/include/touch_sensor.h @@ -0,0 +1,331 @@ +// 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 + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Configure touch pad interrupt threshold. + * + * @note If FSM mode is set to TOUCH_FSM_MODE_TIMER, this function will be blocked for one measurement cycle and wait for data to be valid. + * + * @param touch_num touch pad index + * @param threshold interrupt threshold, + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG if argument wrong + * - ESP_FAIL if touch pad not initialized + */ +esp_err_t touch_pad_config(touch_pad_t touch_num, uint16_t threshold); + +/** + * @brief get touch sensor counter value. + * Each touch sensor has a counter to count the number of charge/discharge cycles. + * When the pad is not 'touched', we can get a number of the counter. + * When the pad is 'touched', the value in counter will get smaller because of the larger equivalent capacitance. + * + * @note This API requests hardware measurement once. If IIR filter mode is enabled, + * please use 'touch_pad_read_raw_data' interface instead. + * + * @param touch_num touch pad index + * @param touch_value pointer to accept touch sensor value + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Touch pad parameter error + * - ESP_ERR_INVALID_STATE This touch pad hardware connection is error, the value of "touch_value" is 0. + * - ESP_FAIL Touch pad not initialized + */ +esp_err_t touch_pad_read(touch_pad_t touch_num, uint16_t * touch_value); + +/** + * @brief get filtered touch sensor counter value by IIR filter. + * + * @note touch_pad_filter_start has to be called before calling touch_pad_read_filtered. + * This function can be called from ISR + * + * @param touch_num touch pad index + * @param touch_value pointer to accept touch sensor value + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Touch pad parameter error + * - ESP_ERR_INVALID_STATE This touch pad hardware connection is error, the value of "touch_value" is 0. + * - ESP_FAIL Touch pad not initialized + */ +esp_err_t touch_pad_read_filtered(touch_pad_t touch_num, uint16_t *touch_value); + +/** + * @brief get raw data (touch sensor counter value) from IIR filter process. + * Need not request hardware measurements. + * + * @note touch_pad_filter_start has to be called before calling touch_pad_read_raw_data. + * This function can be called from ISR + * + * @param touch_num touch pad index + * @param touch_value pointer to accept touch sensor value + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Touch pad parameter error + * - ESP_ERR_INVALID_STATE This touch pad hardware connection is error, the value of "touch_value" is 0. + * - ESP_FAIL Touch pad not initialized + */ +esp_err_t touch_pad_read_raw_data(touch_pad_t touch_num, uint16_t *touch_value); + +/** + * @brief Callback function that is called after each IIR filter calculation. + * @note This callback is called in timer task in each filtering cycle. + * @note This callback should not be blocked. + * @param raw_value The latest raw data(touch sensor counter value) that + * points to all channels(raw_value[0..TOUCH_PAD_MAX-1]). + * @param filtered_value The latest IIR filtered data(calculated from raw data) that + * points to all channels(filtered_value[0..TOUCH_PAD_MAX-1]). + * + */ +typedef void (* filter_cb_t)(uint16_t *raw_value, uint16_t *filtered_value); + +/** + * @brief Register the callback function that is called after each IIR filter calculation. + * @note The 'read_cb' callback is called in timer task in each filtering cycle. + * @param read_cb Pointer to filtered callback function. + * If the argument passed in is NULL, the callback will stop. + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG set error + */ +esp_err_t touch_pad_set_filter_read_cb(filter_cb_t read_cb); + +/** + * @brief Register touch-pad ISR. + * The handler will be attached to the same CPU core that this function is running on. + * @param fn Pointer to ISR handler + * @param arg Parameter for ISR + * @return + * - ESP_OK Success ; + * - ESP_ERR_INVALID_ARG GPIO error + * - ESP_ERR_NO_MEM No memory + */ +esp_err_t touch_pad_isr_register(intr_handler_t fn, void* arg); + +/** + * @brief Set touch sensor measurement and sleep time. + * Excessive total time will slow down the touch response. + * Too small measurement time will not be sampled enough, resulting in inaccurate measurements. + * + * @note The greater the duty cycle of the measurement time, the more system power is consumed. + * @param sleep_cycle The touch sensor will sleep after each measurement. + * sleep_cycle decide the interval between each measurement. + * t_sleep = sleep_cycle / (RTC_SLOW_CLK frequency). + * The approximate frequency value of RTC_SLOW_CLK can be obtained using rtc_clk_slow_freq_get_hz function. + * @param meas_cycle The duration of the touch sensor measurement. + * t_meas = meas_cycle / 8M, the maximum measure time is 0xffff / 8M = 8.19 ms + * @return + * - ESP_OK on success + */ +esp_err_t touch_pad_set_meas_time(uint16_t sleep_cycle, uint16_t meas_cycle); + +/** + * @brief Get touch sensor measurement and sleep time + * @param sleep_cycle Pointer to accept sleep cycle number + * @param meas_cycle Pointer to accept measurement cycle count. + * @return + * - ESP_OK on success + */ +esp_err_t touch_pad_get_meas_time(uint16_t *sleep_cycle, uint16_t *meas_cycle); + +/** + * @brief Trigger a touch sensor measurement, only support in SW mode of FSM + * @return + * - ESP_OK on success + */ +esp_err_t touch_pad_sw_start(void); + +/** + * @brief Set touch sensor interrupt threshold + * @param touch_num touch pad index + * @param threshold threshold of touchpad count, refer to touch_pad_set_trigger_mode to see how to set trigger mode. + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG if argument is wrong + */ +esp_err_t touch_pad_set_thresh(touch_pad_t touch_num, uint16_t threshold); + +/** + * @brief Get touch sensor interrupt threshold + * @param touch_num touch pad index + * @param threshold pointer to accept threshold + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG if argument is wrong + */ +esp_err_t touch_pad_get_thresh(touch_pad_t touch_num, uint16_t *threshold); + +/** + * @brief Set touch sensor interrupt trigger mode. + * Interrupt can be triggered either when counter result is less than + * threshold or when counter result is more than threshold. + * @param mode touch sensor interrupt trigger mode + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG if argument is wrong + */ +esp_err_t touch_pad_set_trigger_mode(touch_trigger_mode_t mode); + +/** + * @brief Get touch sensor interrupt trigger mode + * @param mode pointer to accept touch sensor interrupt trigger mode + * @return + * - ESP_OK on success + */ +esp_err_t touch_pad_get_trigger_mode(touch_trigger_mode_t *mode); + +/** + * @brief Set touch sensor interrupt trigger source. There are two sets of touch signals. + * Set1 and set2 can be mapped to several touch signals. Either set will be triggered + * if at least one of its touch signal is 'touched'. The interrupt can be configured to be generated + * if set1 is triggered, or only if both sets are triggered. + * @param src touch sensor interrupt trigger source + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG if argument is wrong + */ +esp_err_t touch_pad_set_trigger_source(touch_trigger_src_t src); + +/** + * @brief Get touch sensor interrupt trigger source + * @param src pointer to accept touch sensor interrupt trigger source + * @return + * - ESP_OK on success + */ +esp_err_t touch_pad_get_trigger_source(touch_trigger_src_t *src); + +/** + * @brief Set touch sensor group mask. + * Touch pad module has two sets of signals, 'Touched' signal is triggered only if + * at least one of touch pad in this group is "touched". + * This function will set the register bits according to the given bitmask. + * @param set1_mask bitmask of touch sensor signal group1, it's a 10-bit value + * @param set2_mask bitmask of touch sensor signal group2, it's a 10-bit value + * @param en_mask bitmask of touch sensor work enable, it's a 10-bit value + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG if argument is wrong + */ +esp_err_t touch_pad_set_group_mask(uint16_t set1_mask, uint16_t set2_mask, uint16_t en_mask); + +/** + * @brief Get touch sensor group mask. + * @param set1_mask pointer to accept bitmask of touch sensor signal group1, it's a 10-bit value + * @param set2_mask pointer to accept bitmask of touch sensor signal group2, it's a 10-bit value + * @param en_mask pointer to accept bitmask of touch sensor work enable, it's a 10-bit value + * @return + * - ESP_OK on success + */ +esp_err_t touch_pad_get_group_mask(uint16_t *set1_mask, uint16_t *set2_mask, uint16_t *en_mask); + +/** + * @brief Clear touch sensor group mask. + * Touch pad module has two sets of signals, Interrupt is triggered only if + * at least one of touch pad in this group is "touched". + * This function will clear the register bits according to the given bitmask. + * @param set1_mask bitmask touch sensor signal group1, it's a 10-bit value + * @param set2_mask bitmask touch sensor signal group2, it's a 10-bit value + * @param en_mask bitmask of touch sensor work enable, it's a 10-bit value + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG if argument is wrong + */ +esp_err_t touch_pad_clear_group_mask(uint16_t set1_mask, uint16_t set2_mask, uint16_t en_mask); + +/** + * @brief To enable touch pad interrupt + * @return + * - ESP_OK on success + */ +esp_err_t touch_pad_intr_enable(void); + +/** + * @brief To disable touch pad interrupt + * @return + * - ESP_OK on success + */ +esp_err_t touch_pad_intr_disable(void); + +/** + * @brief set touch pad filter calibration period, in ms. + * Need to call touch_pad_filter_start before all touch filter APIs + * @param new_period_ms filter period, in ms + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_STATE driver state error + * - ESP_ERR_INVALID_ARG parameter error + */ +esp_err_t touch_pad_set_filter_period(uint32_t new_period_ms); + +/** + * @brief get touch pad filter calibration period, in ms + * Need to call touch_pad_filter_start before all touch filter APIs + * @param p_period_ms pointer to accept period + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_STATE driver state error + * - ESP_ERR_INVALID_ARG parameter error + */ +esp_err_t touch_pad_get_filter_period(uint32_t* p_period_ms); + +/** + * @brief start touch pad filter function + * This API will start a filter to process the noise in order to prevent false triggering + * when detecting slight change of capacitance. + * Need to call touch_pad_filter_start before all touch filter APIs + * + * @note This filter uses FreeRTOS timer, which is dispatched from a task with + * priority 1 by default on CPU 0. So if some application task with higher priority + * takes a lot of CPU0 time, then the quality of data obtained from this filter will be affected. + * You can adjust FreeRTOS timer task priority in menuconfig. + * @param filter_period_ms filter calibration period, in ms + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG parameter error + * - ESP_ERR_NO_MEM No memory for driver + * - ESP_ERR_INVALID_STATE driver state error + */ +esp_err_t touch_pad_filter_start(uint32_t filter_period_ms); + +/** + * @brief stop touch pad filter function + * Need to call touch_pad_filter_start before all touch filter APIs + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_STATE driver state error + */ +esp_err_t touch_pad_filter_stop(void); + +/** + * @brief delete touch pad filter driver and release the memory + * Need to call touch_pad_filter_start before all touch filter APIs + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_STATE driver state error + */ +esp_err_t touch_pad_filter_delete(void); + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/arch/xtensa/include/esp32/driver/esp32/touch_sensor.c b/arch/xtensa/include/esp32/driver/esp32/touch_sensor.c new file mode 100644 index 0000000000000..fd66a5f75eaab --- /dev/null +++ b/arch/xtensa/include/esp32/driver/esp32/touch_sensor.c @@ -0,0 +1,471 @@ +// Copyright 2016-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. + +#include +#include +#include +#include "esp_log.h" +#include "sys/lock.h" +#include "soc/rtc.h" +#include "soc/periph_defs.h" +#include "freertos/FreeRTOS.h" +#include "freertos/xtensa_api.h" +#include "freertos/semphr.h" +#include "freertos/timers.h" +#include "esp_intr_alloc.h" +#include "driver/rtc_io.h" +#include "driver/touch_pad.h" +#include "driver/rtc_cntl.h" +#include "driver/gpio.h" +#include + +#include "esp32/rom/ets_sys.h" + +#ifndef NDEBUG +// Enable built-in checks in queue.h in debug builds +#define INVARIANTS +#endif +#include "sys/queue.h" +#include "hal/touch_sensor_types.h" +#include "hal/touch_sensor_hal.h" + +typedef struct { + TimerHandle_t timer; + uint16_t filtered_val[TOUCH_PAD_MAX]; + uint16_t raw_val[TOUCH_PAD_MAX]; + uint32_t filter_period; + uint32_t period; + bool enable; +} touch_pad_filter_t; +static touch_pad_filter_t *s_touch_pad_filter = NULL; +// check if touch pad be inited. +static uint16_t s_touch_pad_init_bit = 0x0000; +static filter_cb_t s_filter_cb = NULL; +static SemaphoreHandle_t rtc_touch_mux = NULL; + +#define TOUCH_PAD_FILTER_FACTOR_DEFAULT (4) // IIR filter coefficient. +#define TOUCH_PAD_SHIFT_DEFAULT (4) // Increase computing accuracy. +#define TOUCH_PAD_SHIFT_ROUND_DEFAULT (8) // ROUND = 2^(n-1); rounding off for fractional. + +static const char *TOUCH_TAG = "TOUCH_SENSOR"; +#define TOUCH_CHECK(a, str, ret_val) ({ \ + if (!(a)) { \ + ESP_LOGE(TOUCH_TAG,"%s:%d (%s):%s", __FILE__, __LINE__, __FUNCTION__, str); \ + return (ret_val); \ + } \ +}) +#define TOUCH_CHANNEL_CHECK(channel) TOUCH_CHECK(channel < SOC_TOUCH_SENSOR_NUM, "Touch channel error", ESP_ERR_INVALID_ARG) +#define TOUCH_PARAM_CHECK_STR(s) ""s" parameter error" + +extern portMUX_TYPE rtc_spinlock; //TODO: Will be placed in the appropriate position after the rtc module is finished. +#define TOUCH_ENTER_CRITICAL() portENTER_CRITICAL(&rtc_spinlock) +#define TOUCH_EXIT_CRITICAL() portEXIT_CRITICAL(&rtc_spinlock) + +/*--------------------------------------------------------------- + Touch Pad +---------------------------------------------------------------*/ +//Some register bits of touch sensor 8 and 9 are mismatched, we need to swap the bits. +#define BITSWAP(data, n, m) (((data >> n) & 0x1) == ((data >> m) & 0x1) ? (data) : ((data) ^ ((0x1 <> i) & 0x1) { + _touch_pad_read(i, &val, mode); + s_touch_pad_filter->raw_val[i] = val; + s_filtered_temp[i] = s_filtered_temp[i] == 0 ? ((uint32_t)val << TOUCH_PAD_SHIFT_DEFAULT) : s_filtered_temp[i]; + s_filtered_temp[i] = _touch_filter_iir((val << TOUCH_PAD_SHIFT_DEFAULT), + s_filtered_temp[i], TOUCH_PAD_FILTER_FACTOR_DEFAULT); + s_touch_pad_filter->filtered_val[i] = (s_filtered_temp[i] + TOUCH_PAD_SHIFT_ROUND_DEFAULT) >> TOUCH_PAD_SHIFT_DEFAULT; + } + } + xTimerReset(s_touch_pad_filter->timer, portMAX_DELAY); + xSemaphoreGive(rtc_touch_mux); + if (s_filter_cb != NULL) { + //return the raw data and filtered data. + s_filter_cb(s_touch_pad_filter->raw_val, s_touch_pad_filter->filtered_val); + } +} + +esp_err_t touch_pad_set_meas_time(uint16_t sleep_cycle, uint16_t meas_cycle) +{ + TOUCH_ENTER_CRITICAL(); + touch_hal_set_meas_time(meas_cycle); + touch_hal_set_sleep_time(sleep_cycle); + TOUCH_EXIT_CRITICAL(); + + return ESP_OK; +} + +esp_err_t touch_pad_get_meas_time(uint16_t *sleep_cycle, uint16_t *meas_cycle) +{ + TOUCH_ENTER_CRITICAL(); + touch_hal_get_meas_time(meas_cycle); + touch_hal_get_sleep_time(sleep_cycle); + TOUCH_EXIT_CRITICAL(); + + return ESP_OK; +} + +esp_err_t touch_pad_set_trigger_mode(touch_trigger_mode_t mode) +{ + TOUCH_CHECK((mode < TOUCH_TRIGGER_MAX), TOUCH_PARAM_CHECK_STR("mode"), ESP_ERR_INVALID_ARG); + TOUCH_ENTER_CRITICAL(); + touch_hal_set_trigger_mode(mode); + TOUCH_EXIT_CRITICAL(); + return ESP_OK; +} + +esp_err_t touch_pad_get_trigger_mode(touch_trigger_mode_t *mode) +{ + touch_hal_get_trigger_mode(mode); + return ESP_OK; +} + +esp_err_t touch_pad_set_trigger_source(touch_trigger_src_t src) +{ + TOUCH_CHECK((src < TOUCH_TRIGGER_SOURCE_MAX), TOUCH_PARAM_CHECK_STR("src"), ESP_ERR_INVALID_ARG); + TOUCH_ENTER_CRITICAL(); + touch_hal_set_trigger_source(src); + TOUCH_EXIT_CRITICAL(); + return ESP_OK; +} + +esp_err_t touch_pad_get_trigger_source(touch_trigger_src_t *src) +{ + touch_hal_get_trigger_source(src); + return ESP_OK; +} + +esp_err_t touch_pad_set_group_mask(uint16_t set1_mask, uint16_t set2_mask, uint16_t en_mask) +{ + TOUCH_CHECK((set1_mask <= SOC_TOUCH_SENSOR_BIT_MASK_MAX), "touch set1 bitmask error", ESP_ERR_INVALID_ARG); + TOUCH_CHECK((set2_mask <= SOC_TOUCH_SENSOR_BIT_MASK_MAX), "touch set2 bitmask error", ESP_ERR_INVALID_ARG); + TOUCH_CHECK((en_mask <= SOC_TOUCH_SENSOR_BIT_MASK_MAX), "touch work_en bitmask error", ESP_ERR_INVALID_ARG); + + TOUCH_ENTER_CRITICAL(); + touch_hal_set_group_mask(set1_mask, set2_mask); + touch_hal_set_channel_mask(en_mask); + TOUCH_EXIT_CRITICAL(); + + return ESP_OK; +} + +esp_err_t touch_pad_get_group_mask(uint16_t *set1_mask, uint16_t *set2_mask, uint16_t *en_mask) +{ + TOUCH_ENTER_CRITICAL(); + touch_hal_get_channel_mask(en_mask); + touch_hal_get_group_mask(set1_mask, set2_mask); + TOUCH_EXIT_CRITICAL(); + + return ESP_OK; +} + +esp_err_t touch_pad_clear_group_mask(uint16_t set1_mask, uint16_t set2_mask, uint16_t en_mask) +{ + TOUCH_CHECK((set1_mask <= SOC_TOUCH_SENSOR_BIT_MASK_MAX), "touch set1 bitmask error", ESP_ERR_INVALID_ARG); + TOUCH_CHECK((set2_mask <= SOC_TOUCH_SENSOR_BIT_MASK_MAX), "touch set2 bitmask error", ESP_ERR_INVALID_ARG); + TOUCH_CHECK((en_mask <= SOC_TOUCH_SENSOR_BIT_MASK_MAX), "touch work_en bitmask error", ESP_ERR_INVALID_ARG); + + TOUCH_ENTER_CRITICAL(); + touch_hal_clear_channel_mask(en_mask); + touch_hal_clear_group_mask(set1_mask, set2_mask); + TOUCH_EXIT_CRITICAL(); + return ESP_OK; +} + +esp_err_t touch_pad_intr_enable(void) +{ + TOUCH_ENTER_CRITICAL(); + touch_hal_enable_interrupt(); + TOUCH_EXIT_CRITICAL(); + return ESP_OK; +} + +esp_err_t touch_pad_intr_disable(void) +{ + TOUCH_ENTER_CRITICAL(); + touch_hal_disable_interrupt(); + TOUCH_EXIT_CRITICAL(); + return ESP_OK; +} + +esp_err_t touch_pad_config(touch_pad_t touch_num, uint16_t threshold) +{ + TOUCH_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_FAIL); + TOUCH_CHANNEL_CHECK(touch_num); + touch_fsm_mode_t mode; + touch_pad_io_init(touch_num); + TOUCH_ENTER_CRITICAL(); + touch_hal_config(touch_num); + touch_hal_set_threshold(touch_num, threshold); + TOUCH_EXIT_CRITICAL(); + touch_pad_get_fsm_mode(&mode); + if (TOUCH_FSM_MODE_SW == mode) { + touch_pad_clear_group_mask((1 << touch_num), (1 << touch_num), (1 << touch_num)); + s_touch_pad_init_bit |= (1 << touch_num); + } else if (TOUCH_FSM_MODE_TIMER == mode) { + uint16_t sleep_time = 0; + uint16_t meas_cycle = 0; + uint32_t wait_time_ms = 0; + uint32_t wait_tick = 0; + uint32_t rtc_clk = rtc_clk_slow_freq_get_hz(); + touch_pad_set_group_mask((1 << touch_num), (1 << touch_num), (1 << touch_num)); + touch_pad_get_meas_time(&sleep_time, &meas_cycle); + //If the FSM mode is 'TOUCH_FSM_MODE_TIMER', The data will be ready after one measurement cycle + //after this function is executed, otherwise, the "touch_value" by "touch_pad_read" is 0. + wait_time_ms = sleep_time / (rtc_clk / 1000) + meas_cycle / (RTC_FAST_CLK_FREQ_APPROX / 1000); + wait_tick = wait_time_ms / portTICK_RATE_MS; + vTaskDelay(wait_tick ? wait_tick : 1); + s_touch_pad_init_bit |= (1 << touch_num); + } else { + return ESP_FAIL; + } + return ESP_OK; +} + +esp_err_t touch_pad_init(void) +{ + if (rtc_touch_mux == NULL) { + rtc_touch_mux = xSemaphoreCreateMutex(); + } + if (rtc_touch_mux == NULL) { + return ESP_FAIL; + } + TOUCH_ENTER_CRITICAL(); + touch_hal_init(); + TOUCH_EXIT_CRITICAL(); + return ESP_OK; +} + +esp_err_t touch_pad_deinit(void) +{ + TOUCH_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_FAIL); + if (s_touch_pad_filter != NULL) { + touch_pad_filter_stop(); + touch_pad_filter_delete(); + } + xSemaphoreTake(rtc_touch_mux, portMAX_DELAY); + s_touch_pad_init_bit = 0x0000; + TOUCH_ENTER_CRITICAL(); + touch_hal_deinit(); + TOUCH_EXIT_CRITICAL(); + xSemaphoreGive(rtc_touch_mux); + vSemaphoreDelete(rtc_touch_mux); + rtc_touch_mux = NULL; + return ESP_OK; +} + +static esp_err_t _touch_pad_read(touch_pad_t touch_num, uint16_t *touch_value, touch_fsm_mode_t mode) +{ + esp_err_t res = ESP_OK; + if (TOUCH_FSM_MODE_SW == mode) { + touch_pad_set_group_mask((1 << touch_num), (1 << touch_num), (1 << touch_num)); + touch_pad_sw_start(); + while (!touch_hal_meas_is_done()) {}; + *touch_value = touch_hal_read_raw_data(touch_num); + touch_pad_clear_group_mask((1 << touch_num), (1 << touch_num), (1 << touch_num)); + } else if (TOUCH_FSM_MODE_TIMER == mode) { + while (!touch_hal_meas_is_done()) {}; + *touch_value = touch_hal_read_raw_data(touch_num); + } else { + res = ESP_FAIL; + } + if (*touch_value == 0) { + res = ESP_ERR_INVALID_STATE; + } + return res; +} + +esp_err_t touch_pad_read(touch_pad_t touch_num, uint16_t *touch_value) +{ + TOUCH_CHANNEL_CHECK(touch_num); + TOUCH_CHECK(touch_value != NULL, "touch_value", ESP_ERR_INVALID_ARG); + TOUCH_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_FAIL); + + esp_err_t res = ESP_OK; + touch_fsm_mode_t mode; + touch_pad_get_fsm_mode(&mode); + xSemaphoreTake(rtc_touch_mux, portMAX_DELAY); + res = _touch_pad_read(touch_num, touch_value, mode); + xSemaphoreGive(rtc_touch_mux); + return res; +} + +IRAM_ATTR esp_err_t touch_pad_read_raw_data(touch_pad_t touch_num, uint16_t *touch_value) +{ + TOUCH_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_FAIL); + TOUCH_CHANNEL_CHECK(touch_num); + TOUCH_CHECK(touch_value != NULL, "touch_value", ESP_ERR_INVALID_ARG); + TOUCH_CHECK(s_touch_pad_filter != NULL, "Touch pad filter not initialized", ESP_FAIL); + *touch_value = s_touch_pad_filter->raw_val[touch_num]; + if (*touch_value == 0) { + return ESP_ERR_INVALID_STATE; + } + return ESP_OK; +} + +IRAM_ATTR esp_err_t touch_pad_read_filtered(touch_pad_t touch_num, uint16_t *touch_value) +{ + TOUCH_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_FAIL); + TOUCH_CHANNEL_CHECK(touch_num); + TOUCH_CHECK(touch_value != NULL, "touch_value", ESP_ERR_INVALID_ARG); + TOUCH_CHECK(s_touch_pad_filter != NULL, "Touch pad filter not initialized", ESP_FAIL); + *touch_value = (s_touch_pad_filter->filtered_val[touch_num]); + if (*touch_value == 0) { + return ESP_ERR_INVALID_STATE; + } + return ESP_OK; +} + +esp_err_t touch_pad_set_filter_period(uint32_t new_period_ms) +{ + TOUCH_CHECK(s_touch_pad_filter != NULL, "Touch pad filter not initialized", ESP_ERR_INVALID_STATE); + TOUCH_CHECK(new_period_ms > 0, "Touch pad filter period error", ESP_ERR_INVALID_ARG); + TOUCH_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_ERR_INVALID_STATE); + + esp_err_t ret = ESP_OK; + xSemaphoreTake(rtc_touch_mux, portMAX_DELAY); + if (s_touch_pad_filter != NULL) { + xTimerChangePeriod(s_touch_pad_filter->timer, new_period_ms / portTICK_PERIOD_MS, portMAX_DELAY); + s_touch_pad_filter->period = new_period_ms; + } else { + ESP_LOGE(TOUCH_TAG, "Touch pad filter deleted"); + ret = ESP_ERR_INVALID_STATE; + } + xSemaphoreGive(rtc_touch_mux); + return ret; +} + +esp_err_t touch_pad_get_filter_period(uint32_t *p_period_ms) +{ + TOUCH_CHECK(s_touch_pad_filter != NULL, "Touch pad filter not initialized", ESP_ERR_INVALID_STATE); + TOUCH_CHECK(p_period_ms != NULL, "Touch pad period pointer error", ESP_ERR_INVALID_ARG); + TOUCH_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_ERR_INVALID_STATE); + + esp_err_t ret = ESP_OK; + xSemaphoreTake(rtc_touch_mux, portMAX_DELAY); + if (s_touch_pad_filter != NULL) { + *p_period_ms = s_touch_pad_filter->period; + } else { + ESP_LOGE(TOUCH_TAG, "Touch pad filter deleted"); + ret = ESP_ERR_INVALID_STATE; + } + xSemaphoreGive(rtc_touch_mux); + return ret; +} + +esp_err_t touch_pad_filter_start(uint32_t filter_period_ms) +{ + TOUCH_CHECK(filter_period_ms >= portTICK_PERIOD_MS, "Touch pad filter period error", ESP_ERR_INVALID_ARG); + TOUCH_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_ERR_INVALID_STATE); + + xSemaphoreTake(rtc_touch_mux, portMAX_DELAY); + if (s_touch_pad_filter == NULL) { + s_touch_pad_filter = (touch_pad_filter_t *) calloc(1, sizeof(touch_pad_filter_t)); + if (s_touch_pad_filter == NULL) { + goto err_no_mem; + } + } + if (s_touch_pad_filter->timer == NULL) { + s_touch_pad_filter->timer = xTimerCreate("filter_tmr", filter_period_ms / portTICK_PERIOD_MS, pdFALSE, + NULL, touch_pad_filter_cb); + if (s_touch_pad_filter->timer == NULL) { + free(s_touch_pad_filter); + s_touch_pad_filter = NULL; + goto err_no_mem; + } + s_touch_pad_filter->period = filter_period_ms; + } + xSemaphoreGive(rtc_touch_mux); + touch_pad_filter_cb(NULL); + return ESP_OK; + +err_no_mem: + xSemaphoreGive(rtc_touch_mux); + return ESP_ERR_NO_MEM; +} + +esp_err_t touch_pad_filter_stop(void) +{ + TOUCH_CHECK(s_touch_pad_filter != NULL, "Touch pad filter not initialized", ESP_ERR_INVALID_STATE); + TOUCH_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_ERR_INVALID_STATE); + esp_err_t ret = ESP_OK; + xSemaphoreTake(rtc_touch_mux, portMAX_DELAY); + if (s_touch_pad_filter != NULL) { + xTimerStop(s_touch_pad_filter->timer, portMAX_DELAY); + } else { + ESP_LOGE(TOUCH_TAG, "Touch pad filter deleted"); + ret = ESP_ERR_INVALID_STATE; + } + xSemaphoreGive(rtc_touch_mux); + return ret; +} + +esp_err_t touch_pad_filter_delete(void) +{ + TOUCH_CHECK(s_touch_pad_filter != NULL, "Touch pad filter not initialized", ESP_ERR_INVALID_STATE); + TOUCH_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_ERR_INVALID_STATE); + xSemaphoreTake(rtc_touch_mux, portMAX_DELAY); + if (s_touch_pad_filter != NULL) { + if (s_touch_pad_filter->timer != NULL) { + xTimerStop(s_touch_pad_filter->timer, portMAX_DELAY); + xTimerDelete(s_touch_pad_filter->timer, portMAX_DELAY); + s_touch_pad_filter->timer = NULL; + } + free(s_touch_pad_filter); + s_touch_pad_filter = NULL; + } + xSemaphoreGive(rtc_touch_mux); + return ESP_OK; +} diff --git a/arch/xtensa/include/esp32/driver/include/driver/adc.h b/arch/xtensa/include/esp32/driver/include/driver/adc.h new file mode 100644 index 0000000000000..17f73e4fa79b1 --- /dev/null +++ b/arch/xtensa/include/esp32/driver/include/driver/adc.h @@ -0,0 +1,367 @@ +// 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. + +#ifndef _DRIVER_ADC_H_ +#define _DRIVER_ADC_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include "esp_err.h" +#include "driver/gpio.h" +#include "soc/adc_periph.h" +#include "hal/adc_types.h" + +//this definitions are only for being back-compatible +#define ADC_ATTEN_0db ADC_ATTEN_DB_0 +#define ADC_ATTEN_2_5db ADC_ATTEN_DB_2_5 +#define ADC_ATTEN_6db ADC_ATTEN_DB_6 +#define ADC_ATTEN_11db ADC_ATTEN_DB_11 +//this definitions are only for being back-compatible +#define ADC_WIDTH_9Bit ADC_WIDTH_BIT_9 +#define ADC_WIDTH_10Bit ADC_WIDTH_BIT_10 +#define ADC_WIDTH_11Bit ADC_WIDTH_BIT_11 +#define ADC_WIDTH_12Bit ADC_WIDTH_BIT_12 + +/**** `adc1_channel_t` will be deprecated functions, combine into `adc_channel_t` ********/ +typedef enum { + ADC1_CHANNEL_0 = 0, /*!< ADC1 channel 0 is GPIO36 (ESP32), GPIO1 (ESP32-S2) */ + ADC1_CHANNEL_1, /*!< ADC1 channel 1 is GPIO37 (ESP32), GPIO2 (ESP32-S2) */ + ADC1_CHANNEL_2, /*!< ADC1 channel 2 is GPIO38 (ESP32), GPIO3 (ESP32-S2) */ + ADC1_CHANNEL_3, /*!< ADC1 channel 3 is GPIO39 (ESP32), GPIO4 (ESP32-S2) */ + ADC1_CHANNEL_4, /*!< ADC1 channel 4 is GPIO32 (ESP32), GPIO5 (ESP32-S2) */ + ADC1_CHANNEL_5, /*!< ADC1 channel 5 is GPIO33 (ESP32), GPIO6 (ESP32-S2) */ + ADC1_CHANNEL_6, /*!< ADC1 channel 6 is GPIO34 (ESP32), GPIO7 (ESP32-S2) */ + ADC1_CHANNEL_7, /*!< ADC1 channel 7 is GPIO35 (ESP32), GPIO8 (ESP32-S2) */ +#if CONFIG_IDF_TARGET_ESP32 + ADC1_CHANNEL_MAX, +#elif CONFIG_IDF_TARGET_ESP32S2BETA + ADC1_CHANNEL_8, /*!< ADC1 channel 6 is GPIO9 (ESP32-S2)*/ + ADC1_CHANNEL_9, /*!< ADC1 channel 7 is GPIO10 (ESP32-S2) */ + ADC1_CHANNEL_MAX, +#endif +} adc1_channel_t; + +/**** `adc2_channel_t` will be deprecated functions, combine into `adc_channel_t` ********/ +typedef enum { + ADC2_CHANNEL_0 = 0, /*!< ADC2 channel 0 is GPIO4 (ESP32), GPIO11 (ESP32-S2) */ + ADC2_CHANNEL_1, /*!< ADC2 channel 1 is GPIO0 (ESP32), GPIO12 (ESP32-S2) */ + ADC2_CHANNEL_2, /*!< ADC2 channel 2 is GPIO2 (ESP32), GPIO13 (ESP32-S2) */ + ADC2_CHANNEL_3, /*!< ADC2 channel 3 is GPIO15 (ESP32), GPIO14 (ESP32-S2) */ + ADC2_CHANNEL_4, /*!< ADC2 channel 4 is GPIO13 (ESP32), GPIO15 (ESP32-S2) */ + ADC2_CHANNEL_5, /*!< ADC2 channel 5 is GPIO12 (ESP32), GPIO16 (ESP32-S2) */ + ADC2_CHANNEL_6, /*!< ADC2 channel 6 is GPIO14 (ESP32), GPIO17 (ESP32-S2) */ + ADC2_CHANNEL_7, /*!< ADC2 channel 7 is GPIO27 (ESP32), GPIO18 (ESP32-S2) */ + ADC2_CHANNEL_8, /*!< ADC2 channel 8 is GPIO25 (ESP32), GPIO19 (ESP32-S2) */ + ADC2_CHANNEL_9, /*!< ADC2 channel 9 is GPIO26 (ESP32), GPIO20 (ESP32-S2) */ + ADC2_CHANNEL_MAX, +} adc2_channel_t; + +typedef enum { + ADC_UNIT_1 = 1, /*!< SAR ADC 1*/ + ADC_UNIT_2 = 2, /*!< SAR ADC 2, not supported yet*/ + ADC_UNIT_BOTH = 3, /*!< SAR ADC 1 and 2, not supported yet */ + ADC_UNIT_ALTER = 7, /*!< SAR ADC 1 and 2 alternative mode, not supported yet */ + ADC_UNIT_MAX, +} adc_unit_t; + +typedef enum { + ADC_ENCODE_12BIT, /*!< ADC to I2S data format, [15:12]-channel [11:0]-12 bits ADC data */ + ADC_ENCODE_11BIT, /*!< ADC to I2S data format, [15]-1 [14:11]-channel [10:0]-11 bits ADC data */ + ADC_ENCODE_MAX, +} adc_i2s_encode_t; + +/** + * @brief Get the GPIO number of a specific ADC1 channel. + * + * @param channel Channel to get the GPIO number + * + * @param gpio_num output buffer to hold the GPIO number + * + * @return + * - ESP_OK if success + * - ESP_ERR_INVALID_ARG if channel not valid + */ +esp_err_t adc1_pad_get_io_num(adc1_channel_t channel, gpio_num_t *gpio_num); + +/** + * @brief Configure ADC1 capture width, meanwhile enable output invert for ADC1. + * The configuration is for all channels of ADC1 + * @param width_bit Bit capture width for ADC1 + * + * @return + * - ESP_OK success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t adc1_config_width(adc_bits_width_t width_bit); + +/** + * @brief Configure ADC capture width. + * @param adc_unit ADC unit index + * @param width_bit Bit capture width for ADC unit. + * @return + * - ESP_OK success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t adc_set_data_width(adc_unit_t adc_unit, adc_bits_width_t width_bit); + +/** + * @brief Set the attenuation of a particular channel on ADC1, and configure its + * associated GPIO pin mux. + * + * @note For any given channel, this function must be called before the first time + * adc1_get_raw() is called for that channel. + * + * @note This function can be called multiple times to configure multiple + * ADC channels simultaneously. adc1_get_raw() can then be called for any configured + * channel. + * + * The default ADC full-scale voltage is 1.1 V. To read higher voltages (up to the pin maximum voltage, + * usually 3.3 V) requires setting >0 dB signal attenuation for that ADC channel. + * + * When VDD_A is 3.3 V: + * + * - 0 dB attenuation (ADC_ATTEN_DB_0) gives full-scale voltage 1.1 V + * - 2.5 dB attenuation (ADC_ATTEN_DB_2_5) gives full-scale voltage 1.5 V + * - 6 dB attenuation (ADC_ATTEN_DB_6) gives full-scale voltage 2.2 V + * - 11 dB attenuation (ADC_ATTEN_DB_11) gives full-scale voltage 3.9 V (see note below) + * + * @note The full-scale voltage is the voltage corresponding to a maximum reading (depending on ADC1 configured + * bit width, this value is: 4095 for 12-bits, 2047 for 11-bits, 1023 for 10-bits, 511 for 9 bits.) + * + * @note At 11 dB attenuation the maximum voltage is limited by VDD_A, not the full scale voltage. + * + * Due to ADC characteristics, most accurate results are obtained within the following approximate voltage ranges: + * + * - 0 dB attenuation (ADC_ATTEN_DB_0) between 100 and 950 mV + * - 2.5 dB attenuation (ADC_ATTEN_DB_2_5) between 100 and 1250 mV + * - 6 dB attenuation (ADC_ATTEN_DB_6) between 150 to 1750 mV + * - 11 dB attenuation (ADC_ATTEN_DB_11) between 150 to 2450 mV + * + * For maximum accuracy, use the ADC calibration APIs and measure voltages within these recommended ranges. + * + * @param channel ADC1 channel to configure + * @param atten Attenuation level + * + * @return + * - ESP_OK success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t adc1_config_channel_atten(adc1_channel_t channel, adc_atten_t atten); + +/** + * @brief Take an ADC1 reading from a single channel. + * @note When the power switch of SARADC1, SARADC2, HALL sensor and AMP sensor is turned on, + * the input of GPIO36 and GPIO39 will be pulled down for about 80ns. + * When enabling power for any of these peripherals, ignore input from GPIO36 and GPIO39. + * Please refer to section 3.11 of 'ECO_and_Workarounds_for_Bugs_in_ESP32' for the description of this issue. + * + * @note Call adc1_config_width() before the first time this + * function is called. + * + * @note For any given channel, adc1_config_channel_atten(channel) + * must be called before the first time this function is called. Configuring + * a new channel does not prevent a previously configured channel from being read. + * + * @param channel ADC1 channel to read + * + * @return + * - -1: Parameter error + * - Other: ADC1 channel reading. + */ +int adc1_get_raw(adc1_channel_t channel); + +/** + * @brief Enable ADC power + */ +void adc_power_on(void); + +/** + * @brief Power off SAR ADC + * This function will force power down for ADC + */ +void adc_power_off(void); + +/** + * @brief Initialize ADC pad + * @param adc_unit ADC unit index + * @param channel ADC channel index + * @return + * - ESP_OK success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t adc_gpio_init(adc_unit_t adc_unit, adc_channel_t channel); + +/** + * @brief Set ADC data invert + * @param adc_unit ADC unit index + * @param inv_en whether enable data invert + * @return + * - ESP_OK success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t adc_set_data_inv(adc_unit_t adc_unit, bool inv_en); + +/** + * @brief Set ADC source clock + * @param clk_div ADC clock divider, ADC clock is divided from APB clock + * @return + * - ESP_OK success + */ +esp_err_t adc_set_clk_div(uint8_t clk_div); + +/** + * @brief Set I2S data source + * @param src I2S DMA data source, I2S DMA can get data from digital signals or from ADC. + * @return + * - ESP_OK success + */ +esp_err_t adc_set_i2s_data_source(adc_i2s_source_t src); + +/** + * @brief Initialize I2S ADC mode + * @param adc_unit ADC unit index + * @param channel ADC channel index + * @return + * - ESP_OK success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t adc_i2s_mode_init(adc_unit_t adc_unit, adc_channel_t channel); + +/** + * @brief Configure ADC1 to be usable by the ULP + * + * This function reconfigures ADC1 to be controlled by the ULP. + * Effect of this function can be reverted using adc1_get_raw function. + * + * Note that adc1_config_channel_atten, adc1_config_width functions need + * to be called to configure ADC1 channels, before ADC1 is used by the ULP. + */ +void adc1_ulp_enable(void); + +/** + * @brief Read Hall Sensor + * + * @note When the power switch of SARADC1, SARADC2, HALL sensor and AMP sensor is turned on, + * the input of GPIO36 and GPIO39 will be pulled down for about 80ns. + * When enabling power for any of these peripherals, ignore input from GPIO36 and GPIO39. + * Please refer to section 3.11 of 'ECO_and_Workarounds_for_Bugs_in_ESP32' for the description of this issue. + * + * @note The Hall Sensor uses channels 0 and 3 of ADC1. Do not configure + * these channels for use as ADC channels. + * + * @note The ADC1 module must be enabled by calling + * adc1_config_width() before calling hall_sensor_read(). ADC1 + * should be configured for 12 bit readings, as the hall sensor + * readings are low values and do not cover the full range of the + * ADC. + * + * @return The hall sensor reading. + */ +int hall_sensor_read(void); + +/** + * @brief Get the GPIO number of a specific ADC2 channel. + * + * @param channel Channel to get the GPIO number + * + * @param gpio_num output buffer to hold the GPIO number + * + * @return + * - ESP_OK if success + * - ESP_ERR_INVALID_ARG if channel not valid + */ +esp_err_t adc2_pad_get_io_num(adc2_channel_t channel, gpio_num_t *gpio_num); + +/** + * @brief Configure the ADC2 channel, including setting attenuation. + * + * @note This function also configures the input GPIO pin mux to + * connect it to the ADC2 channel. It must be called before calling + * ``adc2_get_raw()`` for this channel. + * + * The default ADC full-scale voltage is 1.1 V. To read higher voltages (up to the pin maximum voltage, + * usually 3.3 V) requires setting >0 dB signal attenuation for that ADC channel. + * + * When VDD_A is 3.3 V: + * + * - 0 dB attenuation (ADC_ATTEN_0db) gives full-scale voltage 1.1 V + * - 2.5 dB attenuation (ADC_ATTEN_2_5db) gives full-scale voltage 1.5 V + * - 6 dB attenuation (ADC_ATTEN_6db) gives full-scale voltage 2.2 V + * - 11 dB attenuation (ADC_ATTEN_11db) gives full-scale voltage 3.9 V (see note below) + * + * @note The full-scale voltage is the voltage corresponding to a maximum reading + * (depending on ADC2 configured bit width, this value is: 4095 for 12-bits, 2047 + * for 11-bits, 1023 for 10-bits, 511 for 9 bits.) + * + * @note At 11 dB attenuation the maximum voltage is limited by VDD_A, not the full scale voltage. + * + * @param channel ADC2 channel to configure + * @param atten Attenuation level + * + * @return + * - ESP_OK success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t adc2_config_channel_atten(adc2_channel_t channel, adc_atten_t atten); + +/** + * @brief Take an ADC2 reading on a single channel + * + * @note When the power switch of SARADC1, SARADC2, HALL sensor and AMP sensor is turned on, + * the input of GPIO36 and GPIO39 will be pulled down for about 80ns. + * When enabling power for any of these peripherals, ignore input from GPIO36 and GPIO39. + * Please refer to section 3.11 of 'ECO_and_Workarounds_for_Bugs_in_ESP32' for the description of this issue. + * + * @note For a given channel, ``adc2_config_channel_atten()`` + * must be called before the first time this function is called. If Wi-Fi is started via ``esp_wifi_start()``, this + * function will always fail with ``ESP_ERR_TIMEOUT``. + * + * @param channel ADC2 channel to read + * + * @param width_bit Bit capture width for ADC2 + * + * @param raw_out the variable to hold the output data. + * + * @return + * - ESP_OK if success + * - ESP_ERR_TIMEOUT the WIFI is started, using the ADC2 + */ +esp_err_t adc2_get_raw(adc2_channel_t channel, adc_bits_width_t width_bit, int *raw_out); + +/** + * @brief Output ADC2 reference voltage to GPIO 25 or 26 or 27 + * + * This function utilizes the testing mux exclusive to ADC 2 to route the + * reference voltage one of ADC2's channels. Supported GPIOs are GPIOs + * 25, 26, and 27. This refernce voltage can be manually read from the pin + * and used in the esp_adc_cal component. + * + * @param[in] gpio GPIO number (GPIOs 25, 26 and 27 are supported) + * + * @return + * - ESP_OK: v_ref successfully routed to selected GPIO + * - ESP_ERR_INVALID_ARG: Unsupported GPIO + */ +esp_err_t adc2_vref_to_gpio(gpio_num_t gpio); + +#ifdef __cplusplus +} +#endif + +#endif /*_DRIVER_ADC_H_*/ + diff --git a/arch/xtensa/include/esp32/driver/include/driver/adc2_wifi_internal.h b/arch/xtensa/include/esp32/driver/include/driver/adc2_wifi_internal.h new file mode 100644 index 0000000000000..833d97d96fe93 --- /dev/null +++ b/arch/xtensa/include/esp32/driver/include/driver/adc2_wifi_internal.h @@ -0,0 +1,52 @@ +// 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. + +#ifndef _DRIVER_ADC2_INTERNAL_H_ +#define _DRIVER_ADC2_INTERNAL_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "esp_err.h" + +/** + * @brief For WIFI module to claim the usage of ADC2. + * + * Other tasks will be forbidden to use ADC2 between ``adc2_wifi_acquire`` and ``adc2_wifi_release``. + * The WIFI module may have to wait for a short time for the current conversion (if exist) to finish. + * + * @return + * - ESP_OK success + * - ESP_ERR_TIMEOUT reserved for future use. Currently the function will wait until success. + */ +esp_err_t adc2_wifi_acquire(void); + + +/** + * @brief For WIFI module to let other tasks use the ADC2 when WIFI is not work. + * + * Other tasks will be forbidden to use ADC2 between ``adc2_wifi_acquire`` and ``adc2_wifi_release``. + * Call this function to release the occupation of ADC2 by WIFI. + * + * @return always return ESP_OK. + */ +esp_err_t adc2_wifi_release(void); + +#ifdef __cplusplus +} +#endif + +#endif /*_DRIVER_ADC2_INTERNAL_H_*/ + diff --git a/arch/xtensa/include/esp32/driver/include/driver/can.h b/arch/xtensa/include/esp32/driver/include/driver/can.h new file mode 100644 index 0000000000000..16b88f98ae05f --- /dev/null +++ b/arch/xtensa/include/esp32/driver/include/driver/can.h @@ -0,0 +1,347 @@ +// 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. + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "soc/soc_caps.h" +#ifndef SOC_CAN_SUPPORTED +#error CAN is not supported in this chip target +#endif + +#include "freertos/FreeRTOS.h" +#include "esp_types.h" +#include "esp_intr_alloc.h" +#include "esp_err.h" +#include "gpio.h" +#include "soc/can_caps.h" +#include "hal/can_types.h" + +/* -------------------- Default initializers and flags ---------------------- */ +/** @cond */ //Doxy command to hide preprocessor definitions from docs +/** + * @brief Initializer macro for general configuration structure. + * + * This initializer macros allows the TX GPIO, RX GPIO, and operating mode to be + * configured. The other members of the general configuration structure are + * assigned default values. + */ +#define CAN_GENERAL_CONFIG_DEFAULT(tx_io_num, rx_io_num, op_mode) {.mode = op_mode, .tx_io = tx_io_num, .rx_io = rx_io_num, \ + .clkout_io = CAN_IO_UNUSED, .bus_off_io = CAN_IO_UNUSED, \ + .tx_queue_len = 5, .rx_queue_len = 5, \ + .alerts_enabled = CAN_ALERT_NONE, .clkout_divider = 0, } + +/** + * @brief Alert flags + * + * The following flags represents the various kind of alerts available in + * the CAN driver. These flags can be used when configuring/reconfiguring + * alerts, or when calling can_read_alerts(). + * + * @note The CAN_ALERT_AND_LOG flag is not an actual alert, but will configure + * the CAN driver to log to UART when an enabled alert occurs. + */ +#define CAN_ALERT_TX_IDLE 0x0001 /**< Alert(1): No more messages to transmit */ +#define CAN_ALERT_TX_SUCCESS 0x0002 /**< Alert(2): The previous transmission was successful */ +#define CAN_ALERT_BELOW_ERR_WARN 0x0004 /**< Alert(4): Both error counters have dropped below error warning limit */ +#define CAN_ALERT_ERR_ACTIVE 0x0008 /**< Alert(8): CAN controller has become error active */ +#define CAN_ALERT_RECOVERY_IN_PROGRESS 0x0010 /**< Alert(16): CAN controller is undergoing bus recovery */ +#define CAN_ALERT_BUS_RECOVERED 0x0020 /**< Alert(32): CAN controller has successfully completed bus recovery */ +#define CAN_ALERT_ARB_LOST 0x0040 /**< Alert(64): The previous transmission lost arbitration */ +#define CAN_ALERT_ABOVE_ERR_WARN 0x0080 /**< Alert(128): One of the error counters have exceeded the error warning limit */ +#define CAN_ALERT_BUS_ERROR 0x0100 /**< Alert(256): A (Bit, Stuff, CRC, Form, ACK) error has occurred on the bus */ +#define CAN_ALERT_TX_FAILED 0x0200 /**< Alert(512): The previous transmission has failed (for single shot transmission) */ +#define CAN_ALERT_RX_QUEUE_FULL 0x0400 /**< Alert(1024): The RX queue is full causing a frame to be lost */ +#define CAN_ALERT_ERR_PASS 0x0800 /**< Alert(2048): CAN controller has become error passive */ +#define CAN_ALERT_BUS_OFF 0x1000 /**< Alert(4096): Bus-off condition occurred. CAN controller can no longer influence bus */ +#define CAN_ALERT_ALL 0x1FFF /**< Bit mask to enable all alerts during configuration */ +#define CAN_ALERT_NONE 0x0000 /**< Bit mask to disable all alerts during configuration */ +#define CAN_ALERT_AND_LOG 0x2000 /**< Bit mask to enable alerts to also be logged when they occur */ + +/** @endcond */ + +#define CAN_IO_UNUSED ((gpio_num_t) -1) /**< Marks GPIO as unused in CAN configuration */ + +/* ----------------------- Enum and Struct Definitions ---------------------- */ + +/** + * @brief CAN driver states + */ +typedef enum { + CAN_STATE_STOPPED, /**< Stopped state. The CAN controller will not participate in any CAN bus activities */ + CAN_STATE_RUNNING, /**< Running state. The CAN controller can transmit and receive messages */ + CAN_STATE_BUS_OFF, /**< Bus-off state. The CAN controller cannot participate in bus activities until it has recovered */ + CAN_STATE_RECOVERING, /**< Recovering state. The CAN controller is undergoing bus recovery */ +} can_state_t; + +/** + * @brief Structure for general configuration of the CAN driver + * + * @note Macro initializers are available for this structure + */ +typedef struct { + can_mode_t mode; /**< Mode of CAN controller */ + gpio_num_t tx_io; /**< Transmit GPIO number */ + gpio_num_t rx_io; /**< Receive GPIO number */ + gpio_num_t clkout_io; /**< CLKOUT GPIO number (optional, set to -1 if unused) */ + gpio_num_t bus_off_io; /**< Bus off indicator GPIO number (optional, set to -1 if unused) */ + uint32_t tx_queue_len; /**< Number of messages TX queue can hold (set to 0 to disable TX Queue) */ + uint32_t rx_queue_len; /**< Number of messages RX queue can hold */ + uint32_t alerts_enabled; /**< Bit field of alerts to enable (see documentation) */ + uint32_t clkout_divider; /**< CLKOUT divider. Can be 1 or any even number from 2 to 14 (optional, set to 0 if unused) */ +} can_general_config_t; + +/** + * @brief Structure to store status information of CAN driver + */ +typedef struct { + can_state_t state; /**< Current state of CAN controller (Stopped/Running/Bus-Off/Recovery) */ + uint32_t msgs_to_tx; /**< Number of messages queued for transmission or awaiting transmission completion */ + uint32_t msgs_to_rx; /**< Number of messages in RX queue waiting to be read */ + uint32_t tx_error_counter; /**< Current value of Transmit Error Counter */ + uint32_t rx_error_counter; /**< Current value of Receive Error Counter */ + uint32_t tx_failed_count; /**< Number of messages that failed transmissions */ + uint32_t rx_missed_count; /**< Number of messages that were lost due to a full RX queue */ + uint32_t arb_lost_count; /**< Number of instances arbitration was lost */ + uint32_t bus_error_count; /**< Number of instances a bus error has occurred */ +} can_status_info_t; + +/* ----------------------------- Public API -------------------------------- */ + +/** + * @brief Install CAN driver + * + * This function installs the CAN driver using three configuration structures. + * The required memory is allocated and the CAN driver is placed in the stopped + * state after running this function. + * + * @param[in] g_config General configuration structure + * @param[in] t_config Timing configuration structure + * @param[in] f_config Filter configuration structure + * + * @note Macro initializers are available for the configuration structures (see documentation) + * + * @note To reinstall the CAN driver, call can_driver_uninstall() first + * + * @return + * - ESP_OK: Successfully installed CAN driver + * - ESP_ERR_INVALID_ARG: Arguments are invalid + * - ESP_ERR_NO_MEM: Insufficient memory + * - ESP_ERR_INVALID_STATE: Driver is already installed + */ +esp_err_t can_driver_install(const can_general_config_t *g_config, const can_timing_config_t *t_config, const can_filter_config_t *f_config); + +/** + * @brief Uninstall the CAN driver + * + * This function uninstalls the CAN driver, freeing the memory utilized by the + * driver. This function can only be called when the driver is in the stopped + * state or the bus-off state. + * + * @warning The application must ensure that no tasks are blocked on TX/RX + * queues or alerts when this function is called. + * + * @return + * - ESP_OK: Successfully uninstalled CAN driver + * - ESP_ERR_INVALID_STATE: Driver is not in stopped/bus-off state, or is not installed + */ +esp_err_t can_driver_uninstall(void); + +/** + * @brief Start the CAN driver + * + * This function starts the CAN driver, putting the CAN driver into the running + * state. This allows the CAN driver to participate in CAN bus activities such + * as transmitting/receiving messages. The RX queue is reset in this function, + * clearing any unread messages. This function can only be called when the CAN + * driver is in the stopped state. + * + * @return + * - ESP_OK: CAN driver is now running + * - ESP_ERR_INVALID_STATE: Driver is not in stopped state, or is not installed + */ +esp_err_t can_start(void); + +/** + * @brief Stop the CAN driver + * + * This function stops the CAN driver, preventing any further message from being + * transmitted or received until can_start() is called. Any messages in the TX + * queue are cleared. Any messages in the RX queue should be read by the + * application after this function is called. This function can only be called + * when the CAN driver is in the running state. + * + * @warning A message currently being transmitted/received on the CAN bus will + * be ceased immediately. This may lead to other CAN nodes interpreting + * the unfinished message as an error. + * + * @return + * - ESP_OK: CAN driver is now Stopped + * - ESP_ERR_INVALID_STATE: Driver is not in running state, or is not installed + */ +esp_err_t can_stop(void); + +/** + * @brief Transmit a CAN message + * + * This function queues a CAN message for transmission. Transmission will start + * immediately if no other messages are queued for transmission. If the TX queue + * is full, this function will block until more space becomes available or until + * it timesout. If the TX queue is disabled (TX queue length = 0 in configuration), + * this function will return immediately if another message is undergoing + * transmission. This function can only be called when the CAN driver is in the + * running state and cannot be called under Listen Only Mode. + * + * @param[in] message Message to transmit + * @param[in] ticks_to_wait Number of FreeRTOS ticks to block on the TX queue + * + * @note This function does not guarantee that the transmission is successful. + * The TX_SUCCESS/TX_FAILED alert can be enabled to alert the application + * upon the success/failure of a transmission. + * + * @note The TX_IDLE alert can be used to alert the application when no other + * messages are awaiting transmission. + * + * @return + * - ESP_OK: Transmission successfully queued/initiated + * - ESP_ERR_INVALID_ARG: Arguments are invalid + * - ESP_ERR_TIMEOUT: Timed out waiting for space on TX queue + * - ESP_FAIL: TX queue is disabled and another message is currently transmitting + * - ESP_ERR_INVALID_STATE: CAN driver is not in running state, or is not installed + * - ESP_ERR_NOT_SUPPORTED: Listen Only Mode does not support transmissions + */ +esp_err_t can_transmit(const can_message_t *message, TickType_t ticks_to_wait); + +/** + * @brief Receive a CAN message + * + * This function receives a message from the RX queue. The flags field of the + * message structure will indicate the type of message received. This function + * will block if there are no messages in the RX queue + * + * @param[out] message Received message + * @param[in] ticks_to_wait Number of FreeRTOS ticks to block on RX queue + * + * @warning The flags field of the received message should be checked to determine + * if the received message contains any data bytes. + * + * @return + * - ESP_OK: Message successfully received from RX queue + * - ESP_ERR_TIMEOUT: Timed out waiting for message + * - ESP_ERR_INVALID_ARG: Arguments are invalid + * - ESP_ERR_INVALID_STATE: CAN driver is not installed + */ +esp_err_t can_receive(can_message_t *message, TickType_t ticks_to_wait); + +/** + * @brief Read CAN driver alerts + * + * This function will read the alerts raised by the CAN driver. If no alert has + * been when this function is called, this function will block until an alert + * occurs or until it timeouts. + * + * @param[out] alerts Bit field of raised alerts (see documentation for alert flags) + * @param[in] ticks_to_wait Number of FreeRTOS ticks to block for alert + * + * @note Multiple alerts can be raised simultaneously. The application should + * check for all alerts that have been enabled. + * + * @return + * - ESP_OK: Alerts read + * - ESP_ERR_TIMEOUT: Timed out waiting for alerts + * - ESP_ERR_INVALID_ARG: Arguments are invalid + * - ESP_ERR_INVALID_STATE: CAN driver is not installed + */ +esp_err_t can_read_alerts(uint32_t *alerts, TickType_t ticks_to_wait); + +/** + * @brief Reconfigure which alerts are enabled + * + * This function reconfigures which alerts are enabled. If there are alerts + * which have not been read whilst reconfiguring, this function can read those + * alerts. + * + * @param[in] alerts_enabled Bit field of alerts to enable (see documentation for alert flags) + * @param[out] current_alerts Bit field of currently raised alerts. Set to NULL if unused + * + * @return + * - ESP_OK: Alerts reconfigured + * - ESP_ERR_INVALID_STATE: CAN driver is not installed + */ +esp_err_t can_reconfigure_alerts(uint32_t alerts_enabled, uint32_t *current_alerts); + +/** + * @brief Start the bus recovery process + * + * This function initiates the bus recovery process when the CAN driver is in + * the bus-off state. Once initiated, the CAN driver will enter the recovering + * state and wait for 128 occurrences of the bus-free signal on the CAN bus + * before returning to the stopped state. This function will reset the TX queue, + * clearing any messages pending transmission. + * + * @note The BUS_RECOVERED alert can be enabled to alert the application when + * the bus recovery process completes. + * + * @return + * - ESP_OK: Bus recovery started + * - ESP_ERR_INVALID_STATE: CAN driver is not in the bus-off state, or is not installed + */ +esp_err_t can_initiate_recovery(void); + +/** + * @brief Get current status information of the CAN driver + * + * @param[out] status_info Status information + * + * @return + * - ESP_OK: Status information retrieved + * - ESP_ERR_INVALID_ARG: Arguments are invalid + * - ESP_ERR_INVALID_STATE: CAN driver is not installed + */ +esp_err_t can_get_status_info(can_status_info_t *status_info); + +/** + * @brief Clear the transmit queue + * + * This function will clear the transmit queue of all messages. + * + * @note The transmit queue is automatically cleared when can_stop() or + * can_initiate_recovery() is called. + * + * @return + * - ESP_OK: Transmit queue cleared + * - ESP_ERR_INVALID_STATE: CAN driver is not installed or TX queue is disabled + */ +esp_err_t can_clear_transmit_queue(void); + +/** + * @brief Clear the receive queue + * + * This function will clear the receive queue of all messages. + * + * @note The receive queue is automatically cleared when can_start() is + * called. + * + * @return + * - ESP_OK: Transmit queue cleared + * - ESP_ERR_INVALID_STATE: CAN driver is not installed + */ +esp_err_t can_clear_receive_queue(void); + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/driver/include/driver/dac.h b/arch/xtensa/include/esp32/driver/include/driver/dac.h new file mode 100644 index 0000000000000..17d04f140b6cb --- /dev/null +++ b/arch/xtensa/include/esp32/driver/include/driver/dac.h @@ -0,0 +1,114 @@ +// 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. + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "esp_err.h" +#include "driver/gpio.h" +#include "hal/dac_types.h" + +/** + * @brief Get the gpio number of a specific DAC channel. + * + * @param channel Channel to get the gpio number + * @param gpio_num output buffer to hold the gpio number + * @return + * - ESP_OK if success + */ +esp_err_t dac_pad_get_io_num(dac_channel_t channel, gpio_num_t *gpio_num); + +/** + * @brief Set DAC output voltage. + * DAC output is 8-bit. Maximum (255) corresponds to VDD3P3_RTC. + * + * @note Need to configure DAC pad before calling this function. + * DAC channel 1 is attached to GPIO25, DAC channel 2 is attached to GPIO26 + * @param channel DAC channel + * @param dac_value DAC output value + * + * @return + * - ESP_OK success + */ +esp_err_t dac_output_voltage(dac_channel_t channel, uint8_t dac_value); + +/** + * @brief DAC pad output enable + * + * @param channel DAC channel + * @note DAC channel 1 is attached to GPIO25, DAC channel 2 is attached to GPIO26 + * I2S left channel will be mapped to DAC channel 2 + * I2S right channel will be mapped to DAC channel 1 + */ +esp_err_t dac_output_enable(dac_channel_t channel); + +/** + * @brief DAC pad output disable + * + * @param channel DAC channel + * @note DAC channel 1 is attached to GPIO25, DAC channel 2 is attached to GPIO26 + * @return + * - ESP_OK success + */ +esp_err_t dac_output_disable(dac_channel_t channel); + +/** + * @brief Enable DAC output data from I2S + * + * @return + * - ESP_OK success + */ +esp_err_t dac_i2s_enable(void); + +/** + * @brief Disable DAC output data from I2S + * + * @return + * - ESP_OK success + */ +esp_err_t dac_i2s_disable(void); + +/** + * @brief Enable cosine wave generator output. + * + * @return + * - ESP_OK success + */ +esp_err_t dac_cw_generator_enable(void); + +/** + * @brief Disable cosine wave generator output. + * + * @return + * - ESP_OK success + */ +esp_err_t dac_cw_generator_disable(void); + +/** + * @brief Config the cosine wave generator function in DAC module. + * + * @param cw Configuration. + * @return + * - ESP_OK success + */ +esp_err_t dac_cw_generator_config(dac_cw_config_t *cw); + +#ifdef __cplusplus +} +#endif + diff --git a/arch/xtensa/include/esp32/driver/include/driver/gpio.h b/arch/xtensa/include/esp32/driver/include/driver/gpio.h new file mode 100644 index 0000000000000..7a1db7a7032ef --- /dev/null +++ b/arch/xtensa/include/esp32/driver/include/driver/gpio.h @@ -0,0 +1,435 @@ +// 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. + +#pragma once +#include +#include "esp_err.h" +#include +#include +#include "esp_attr.h" +#include "esp_intr_alloc.h" +#include "soc/gpio_periph.h" +#include "hal/gpio_types.h" + +#if CONFIG_IDF_TARGET_ESP32 +#include "esp32/rom/gpio.h" +#elif CONFIG_IDF_TARGET_ESP32S2BETA +#include "esp32s2beta/rom/gpio.h" +#endif + +#ifdef CONFIG_LEGACY_INCLUDE_COMMON_HEADERS +#include "soc/rtc_io_reg.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef intr_handle_t gpio_isr_handle_t; + +/** + * @brief GPIO common configuration + * + * Configure GPIO's Mode,pull-up,PullDown,IntrType + * + * @param pGPIOConfig Pointer to GPIO configure struct + * + * @return + * - ESP_OK success + * - ESP_ERR_INVALID_ARG Parameter error + * + */ +esp_err_t gpio_config(const gpio_config_t *pGPIOConfig); + +/** + * @brief Reset an gpio to default state (select gpio function, enable pullup and disable input and output). + * + * @param gpio_num GPIO number. + * + * @note This function also configures the IOMUX for this pin to the GPIO + * function, and disconnects any other peripheral output configured via GPIO + * Matrix. + * + * @return Always return ESP_OK. + */ +esp_err_t gpio_reset_pin(gpio_num_t gpio_num); + +/** + * @brief GPIO set interrupt trigger type + * + * @param gpio_num GPIO number. If you want to set the trigger type of e.g. of GPIO16, gpio_num should be GPIO_NUM_16 (16); + * @param intr_type Interrupt type, select from gpio_int_type_t + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + * + */ +esp_err_t gpio_set_intr_type(gpio_num_t gpio_num, gpio_int_type_t intr_type); + +/** + * @brief Enable GPIO module interrupt signal + * + * @note Please do not use the interrupt of GPIO36 and GPIO39 when using ADC. + * Please refer to the comments of `adc1_get_raw`. + * Please refer to section 3.11 of 'ECO_and_Workarounds_for_Bugs_in_ESP32' for the description of this issue. + * + * @param gpio_num GPIO number. If you want to enable an interrupt on e.g. GPIO16, gpio_num should be GPIO_NUM_16 (16); + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + * + */ +esp_err_t gpio_intr_enable(gpio_num_t gpio_num); + +/** + * @brief Disable GPIO module interrupt signal + * + * @param gpio_num GPIO number. If you want to disable the interrupt of e.g. GPIO16, gpio_num should be GPIO_NUM_16 (16); + * + * @return + * - ESP_OK success + * - ESP_ERR_INVALID_ARG Parameter error + * + */ +esp_err_t gpio_intr_disable(gpio_num_t gpio_num); + +/** + * @brief GPIO set output level + * + * @param gpio_num GPIO number. If you want to set the output level of e.g. GPIO16, gpio_num should be GPIO_NUM_16 (16); + * @param level Output level. 0: low ; 1: high + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG GPIO number error + * + */ +esp_err_t gpio_set_level(gpio_num_t gpio_num, uint32_t level); + +/** + * @brief GPIO get input level + * + * @warning If the pad is not configured for input (or input and output) the returned value is always 0. + * + * @param gpio_num GPIO number. If you want to get the logic level of e.g. pin GPIO16, gpio_num should be GPIO_NUM_16 (16); + * + * @return + * - 0 the GPIO input level is 0 + * - 1 the GPIO input level is 1 + * + */ +int gpio_get_level(gpio_num_t gpio_num); + +/** + * @brief GPIO set direction + * + * Configure GPIO direction,such as output_only,input_only,output_and_input + * + * @param gpio_num Configure GPIO pins number, it should be GPIO number. If you want to set direction of e.g. GPIO16, gpio_num should be GPIO_NUM_16 (16); + * @param mode GPIO direction + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG GPIO error + * + */ +esp_err_t gpio_set_direction(gpio_num_t gpio_num, gpio_mode_t mode); + +/** + * @brief Configure GPIO pull-up/pull-down resistors + * + * Only pins that support both input & output have integrated pull-up and pull-down resistors. Input-only GPIOs 34-39 do not. + * + * @param gpio_num GPIO number. If you want to set pull up or down mode for e.g. GPIO16, gpio_num should be GPIO_NUM_16 (16); + * @param pull GPIO pull up/down mode. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG : Parameter error + * + */ +esp_err_t gpio_set_pull_mode(gpio_num_t gpio_num, gpio_pull_mode_t pull); + +/** + * @brief Enable GPIO wake-up function. + * + * @param gpio_num GPIO number. + * + * @param intr_type GPIO wake-up type. Only GPIO_INTR_LOW_LEVEL or GPIO_INTR_HIGH_LEVEL can be used. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t gpio_wakeup_enable(gpio_num_t gpio_num, gpio_int_type_t intr_type); + +/** + * @brief Disable GPIO wake-up function. + * + * @param gpio_num GPIO number + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t gpio_wakeup_disable(gpio_num_t gpio_num); + +/** + * @brief Register GPIO interrupt handler, the handler is an ISR. + * The handler will be attached to the same CPU core that this function is running on. + * + * This ISR function is called whenever any GPIO interrupt occurs. See + * the alternative gpio_install_isr_service() and + * gpio_isr_handler_add() API in order to have the driver support + * per-GPIO ISRs. + * + * @param fn Interrupt handler function. + * @param 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. + * @param arg Parameter for handler function + * @param handle Pointer to return handle. If non-NULL, a handle for the interrupt will be returned here. + * + * \verbatim embed:rst:leading-asterisk + * To disable or remove the ISR, pass the returned handle to the :doc:`interrupt allocation functions `. + * \endverbatim + * + * @return + * - ESP_OK Success ; + * - ESP_ERR_INVALID_ARG GPIO error + * - ESP_ERR_NOT_FOUND No free interrupt found with the specified flags + */ +esp_err_t gpio_isr_register(void (*fn)(void *), void *arg, int intr_alloc_flags, gpio_isr_handle_t *handle); + +/** + * @brief Enable pull-up on GPIO. + * + * @param gpio_num GPIO number + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t gpio_pullup_en(gpio_num_t gpio_num); + +/** + * @brief Disable pull-up on GPIO. + * + * @param gpio_num GPIO number + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t gpio_pullup_dis(gpio_num_t gpio_num); + +/** + * @brief Enable pull-down on GPIO. + * + * @param gpio_num GPIO number + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t gpio_pulldown_en(gpio_num_t gpio_num); + +/** + * @brief Disable pull-down on GPIO. + * + * @param gpio_num GPIO number + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t gpio_pulldown_dis(gpio_num_t gpio_num); + +/** + * @brief Install the driver's GPIO ISR handler service, which allows per-pin GPIO interrupt handlers. + * + * This function is incompatible with gpio_isr_register() - if that function is used, a single global ISR is registered for all GPIO interrupts. If this function is used, the ISR service provides a global GPIO ISR and individual pin handlers are registered via the gpio_isr_handler_add() function. + * + * @param 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. + * + * @return + * - ESP_OK Success + * - ESP_ERR_NO_MEM No memory to install this service + * - ESP_ERR_INVALID_STATE ISR service already installed. + * - ESP_ERR_NOT_FOUND No free interrupt found with the specified flags + * - ESP_ERR_INVALID_ARG GPIO error + */ +esp_err_t gpio_install_isr_service(int intr_alloc_flags); + +/** + * @brief Uninstall the driver's GPIO ISR service, freeing related resources. + */ +void gpio_uninstall_isr_service(void); + +/** + * @brief Add ISR handler for the corresponding GPIO pin. + * + * Call this function after using gpio_install_isr_service() to + * install the driver's GPIO ISR handler service. + * + * The pin ISR handlers no longer need to be declared with IRAM_ATTR, + * unless you pass the ESP_INTR_FLAG_IRAM flag when allocating the + * ISR in gpio_install_isr_service(). + * + * This ISR handler will be called from an ISR. So there is a stack + * size limit (configurable as "ISR stack size" in menuconfig). This + * limit is smaller compared to a global GPIO interrupt handler due + * to the additional level of indirection. + * + * @param gpio_num GPIO number + * @param isr_handler ISR handler function for the corresponding GPIO number. + * @param args parameter for ISR handler. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_STATE Wrong state, the ISR service has not been initialized. + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t gpio_isr_handler_add(gpio_num_t gpio_num, gpio_isr_t isr_handler, void *args); + +/** + * @brief Remove ISR handler for the corresponding GPIO pin. + * + * @param gpio_num GPIO number + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_STATE Wrong state, the ISR service has not been initialized. + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t gpio_isr_handler_remove(gpio_num_t gpio_num); + +/** + * @brief Set GPIO pad drive capability + * + * @param gpio_num GPIO number, only support output GPIOs + * @param strength Drive capability of the pad + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t gpio_set_drive_capability(gpio_num_t gpio_num, gpio_drive_cap_t strength); + +/** + * @brief Get GPIO pad drive capability + * + * @param gpio_num GPIO number, only support output GPIOs + * @param strength Pointer to accept drive capability of the pad + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t gpio_get_drive_capability(gpio_num_t gpio_num, gpio_drive_cap_t *strength); + +/** + * @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. + * + * The state of digital gpio cannot be held during Deep-sleep, and it will resume the hold function + * when the chip wakes up from Deep-sleep. If the digital gpio also needs to be held during Deep-sleep, + * `gpio_deep_sleep_hold_en` should also be called. + * + * Power down or call gpio_hold_dis will disable this function. + * + * @param gpio_num GPIO number, only support output-capable GPIOs + * + * @return + * - ESP_OK Success + * - ESP_ERR_NOT_SUPPORTED Not support pad hold function + */ +esp_err_t gpio_hold_en(gpio_num_t gpio_num); + +/** + * @brief Disable gpio pad hold function. + * + * When the chip is woken up from Deep-sleep, the gpio will be set to the default mode, so, the gpio will output + * the default level if this function is called. If you don't want the level changes, the gpio should be configured to + * a known state before this function is called. + * e.g. + * If you hold gpio18 high during Deep-sleep, after the chip is woken up and `gpio_hold_dis` is called, + * gpio18 will output low level(because gpio18 is input mode by default). If you don't want this behavior, + * you should configure gpio18 as output mode and set it to hight level before calling `gpio_hold_dis`. + * + * @param gpio_num GPIO number, only support output-capable GPIOs + * + * @return + * - ESP_OK Success + * - ESP_ERR_NOT_SUPPORTED Not support pad hold function + */ +esp_err_t gpio_hold_dis(gpio_num_t gpio_num); + +/** + * @brief Enable all digital gpio pad hold function during Deep-sleep. + * + * When the chip is in Deep-sleep mode, all digital gpio will hold the state before sleep, and when the chip is woken up, + * the status of digital gpio will not be held. Note that the pad hold feature only works when the chip is in Deep-sleep mode, + * when not in sleep mode, the digital gpio state can be changed even you have called this function. + * + * Power down or call gpio_hold_dis will disable this function, otherwise, the digital gpio hold feature works as long as the chip enter Deep-sleep. + */ +void gpio_deep_sleep_hold_en(void); + +/** + * @brief Disable all digital gpio pad hold function during Deep-sleep. + * + */ +void gpio_deep_sleep_hold_dis(void); + +/** + * @brief Set pad input to a peripheral signal through the IOMUX. + * @param gpio_num GPIO number of the pad. + * @param signal_idx Peripheral signal id to input. One of the ``*_IN_IDX`` signals in ``soc/gpio_sig_map.h``. + */ +void gpio_iomux_in(uint32_t gpio_num, uint32_t signal_idx); + +/** + * @brief Set peripheral output to an GPIO pad through the IOMUX. + * @param gpio_num gpio_num GPIO number of the pad. + * @param func The function number of the peripheral pin to output pin. + * One of the ``FUNC_X_*`` of specified pin (X) in ``soc/io_mux_reg.h``. + * @param oen_inv True if the output enable needs to be inverted, otherwise False. + */ +void gpio_iomux_out(uint8_t gpio_num, int func, bool oen_inv); + +#if GPIO_SUPPORTS_FORCE_HOLD +/** + * @brief Force hold digital and rtc gpio pad. + * @note GPIO force hold, whether the chip in sleep mode or wakeup mode. + * */ +esp_err_t gpio_force_hold_all(void); + +/** + * @brief Force unhold digital and rtc gpio pad. + * @note GPIO force unhold, whether the chip in sleep mode or wakeup mode. + * */ +esp_err_t gpio_force_unhold_all(void); +#endif + +#ifdef __cplusplus +} +#endif + diff --git a/arch/xtensa/include/esp32/driver/include/driver/i2c.h b/arch/xtensa/include/esp32/driver/include/driver/i2c.h new file mode 100644 index 0000000000000..7e7e5d1cf5f65 --- /dev/null +++ b/arch/xtensa/include/esp32/driver/include/driver/i2c.h @@ -0,0 +1,520 @@ +// 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. + +#ifndef _DRIVER_I2C_H_ +#define _DRIVER_I2C_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "esp_err.h" +#include "esp_intr_alloc.h" +#include "freertos/FreeRTOS.h" +#include "freertos/semphr.h" +#include "freertos/xtensa_api.h" +#include "freertos/task.h" +#include "freertos/queue.h" +#include "freertos/ringbuf.h" +#include "driver/gpio.h" +#include "hal/i2c_types.h" +#include "soc/i2c_caps.h" + +#define I2C_APB_CLK_FREQ APB_CLK_FREQ /*!< I2C source clock is APB clock, 80MHz */ + +#define I2C_NUM_0 (0) /*!< I2C port 0 */ +#define I2C_NUM_1 (1) /*!< I2C port 1 */ +#define I2C_NUM_MAX (SOC_I2C_NUM) /*!< I2C port max */ + +typedef void* i2c_cmd_handle_t; /*!< I2C command handle */ + +/** + * @brief I2C driver install + * + * @param i2c_num I2C port number + * @param mode I2C mode( master or slave ) + * @param slv_rx_buf_len receiving buffer size for slave mode + * @note + * Only slave mode will use this value, driver will ignore this value in master mode. + * @param slv_tx_buf_len sending buffer size for slave mode + * @note + * Only slave mode will use this value, driver will ignore this value in master mode. + * @param 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. + * @note + * In master mode, if the cache is likely to be disabled(such as write flash) and the slave is time-sensitive, + * `ESP_INTR_FLAG_IRAM` is suggested to be used. In this case, please use the memory allocated from internal RAM in i2c read and write function, + * because we can not access the psram(if psram is enabled) in interrupt handle function when cache is disabled. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_FAIL Driver install error + */ +esp_err_t i2c_driver_install(i2c_port_t i2c_num, i2c_mode_t mode, size_t slv_rx_buf_len, size_t slv_tx_buf_len, int intr_alloc_flags); + +/** + * @brief I2C driver delete + * + * @param i2c_num I2C port number + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2c_driver_delete(i2c_port_t i2c_num); + +/** + * @brief I2C parameter initialization + * + * @param i2c_num I2C port number + * @param i2c_conf pointer to I2C parameter settings + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2c_param_config(i2c_port_t i2c_num, const i2c_config_t* i2c_conf); + +/** + * @brief reset I2C tx hardware fifo + * + * @param i2c_num I2C port number + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2c_reset_tx_fifo(i2c_port_t i2c_num); + +/** + * @brief reset I2C rx fifo + * + * @param i2c_num I2C port number + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2c_reset_rx_fifo(i2c_port_t i2c_num); + +/** + * @brief I2C isr handler register + * + * @param i2c_num I2C port number + * @param fn isr handler function + * @param arg parameter for isr handler function + * @param 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. + * @param handle handle return from esp_intr_alloc. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2c_isr_register(i2c_port_t i2c_num, void (*fn)(void*), void * arg, int intr_alloc_flags, intr_handle_t *handle); + +/** + * @brief to delete and free I2C isr. + * + * @param handle handle of isr. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2c_isr_free(intr_handle_t handle); + +/** + * @brief Configure GPIO signal for I2C sck and sda + * + * @param i2c_num I2C port number + * @param sda_io_num GPIO number for I2C sda signal + * @param scl_io_num GPIO number for I2C scl signal + * @param sda_pullup_en Whether to enable the internal pullup for sda pin + * @param scl_pullup_en Whether to enable the internal pullup for scl pin + * @param mode I2C mode + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2c_set_pin(i2c_port_t i2c_num, int sda_io_num, int scl_io_num, + bool sda_pullup_en, bool scl_pullup_en, i2c_mode_t mode); + +/** + * @brief Create and init I2C command link + * @note + * Before we build I2C command link, we need to call i2c_cmd_link_create() to create + * a command link. + * After we finish sending the commands, we need to call i2c_cmd_link_delete() to + * release and return the resources. + * + * @return i2c command link handler + */ +i2c_cmd_handle_t i2c_cmd_link_create(void); + +/** + * @brief Free I2C command link + * @note + * Before we build I2C command link, we need to call i2c_cmd_link_create() to create + * a command link. + * After we finish sending the commands, we need to call i2c_cmd_link_delete() to + * release and return the resources. + * + * @param cmd_handle I2C command handle + */ +void i2c_cmd_link_delete(i2c_cmd_handle_t cmd_handle); + +/** + * @brief Queue command for I2C master to generate a start signal + * @note + * Only call this function in I2C master mode + * Call i2c_master_cmd_begin() to send all queued commands + * + * @param cmd_handle I2C cmd link + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2c_master_start(i2c_cmd_handle_t cmd_handle); + +/** + * @brief Queue command for I2C master to write one byte to I2C bus + * @note + * Only call this function in I2C master mode + * Call i2c_master_cmd_begin() to send all queued commands + * + * @param cmd_handle I2C cmd link + * @param data I2C one byte command to write to bus + * @param ack_en enable ack check for master + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2c_master_write_byte(i2c_cmd_handle_t cmd_handle, uint8_t data, bool ack_en); + +/** + * @brief Queue command for I2C master to write buffer to I2C bus + * @note + * Only call this function in I2C master mode + * Call i2c_master_cmd_begin() to send all queued commands + * + * @param cmd_handle I2C cmd link + * @param data data to send + * @note + * If the psram is enabled and intr_flag is `ESP_INTR_FLAG_IRAM`, please use the memory allocated from internal RAM. + * @param data_len data length + * @param ack_en enable ack check for master + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2c_master_write(i2c_cmd_handle_t cmd_handle, uint8_t* data, size_t data_len, bool ack_en); + +/** + * @brief Queue command for I2C master to read one byte from I2C bus + * @note + * Only call this function in I2C master mode + * Call i2c_master_cmd_begin() to send all queued commands + * + * @param cmd_handle I2C cmd link + * @param data pointer accept the data byte + * @note + * If the psram is enabled and intr_flag is `ESP_INTR_FLAG_IRAM`, please use the memory allocated from internal RAM. + * @param ack ack value for read command + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2c_master_read_byte(i2c_cmd_handle_t cmd_handle, uint8_t* data, i2c_ack_type_t ack); + +/** + * @brief Queue command for I2C master to read data from I2C bus + * @note + * Only call this function in I2C master mode + * Call i2c_master_cmd_begin() to send all queued commands + * + * @param cmd_handle I2C cmd link + * @param data data buffer to accept the data from bus + * @note + * If the psram is enabled and intr_flag is `ESP_INTR_FLAG_IRAM`, please use the memory allocated from internal RAM. + * @param data_len read data length + * @param ack ack value for read command + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2c_master_read(i2c_cmd_handle_t cmd_handle, uint8_t* data, size_t data_len, i2c_ack_type_t ack); + +/** + * @brief Queue command for I2C master to generate a stop signal + * @note + * Only call this function in I2C master mode + * Call i2c_master_cmd_begin() to send all queued commands + * + * @param cmd_handle I2C cmd link + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2c_master_stop(i2c_cmd_handle_t cmd_handle); + +/** + * @brief I2C master send queued commands. + * This function will trigger sending all queued commands. + * The task will be blocked until all the commands have been sent out. + * The I2C APIs are not thread-safe, if you want to use one I2C port in different tasks, + * you need to take care of the multi-thread issue. + * @note + * Only call this function in I2C master mode + * + * @param i2c_num I2C port number + * @param cmd_handle I2C command handler + * @param ticks_to_wait maximum wait ticks. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_FAIL Sending command error, slave doesn't ACK the transfer. + * - ESP_ERR_INVALID_STATE I2C driver not installed or not in master mode. + * - ESP_ERR_TIMEOUT Operation timeout because the bus is busy. + */ +esp_err_t i2c_master_cmd_begin(i2c_port_t i2c_num, i2c_cmd_handle_t cmd_handle, TickType_t ticks_to_wait); + +/** + * @brief I2C slave write data to internal ringbuffer, when tx fifo empty, isr will fill the hardware + * fifo from the internal ringbuffer + * @note + * Only call this function in I2C slave mode + * + * @param i2c_num I2C port number + * @param data data pointer to write into internal buffer + * @param size data size + * @param ticks_to_wait Maximum waiting ticks + * + * @return + * - ESP_FAIL(-1) Parameter error + * - Others(>=0) The number of data bytes that pushed to the I2C slave buffer. + */ +int i2c_slave_write_buffer(i2c_port_t i2c_num, uint8_t* data, int size, TickType_t ticks_to_wait); + +/** + * @brief I2C slave read data from internal buffer. When I2C slave receive data, isr will copy received data + * from hardware rx fifo to internal ringbuffer. Then users can read from internal ringbuffer. + * @note + * Only call this function in I2C slave mode + * + * @param i2c_num I2C port number + * @param data data pointer to accept data from internal buffer + * @param max_size Maximum data size to read + * @param ticks_to_wait Maximum waiting ticks + * + * @return + * - ESP_FAIL(-1) Parameter error + * - Others(>=0) The number of data bytes that read from I2C slave buffer. + */ +int i2c_slave_read_buffer(i2c_port_t i2c_num, uint8_t* data, size_t max_size, TickType_t ticks_to_wait); + +/** + * @brief set I2C master clock period + * + * @param i2c_num I2C port number + * @param high_period clock cycle number during SCL is high level, high_period is a 14 bit value + * @param low_period clock cycle number during SCL is low level, low_period is a 14 bit value + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2c_set_period(i2c_port_t i2c_num, int high_period, int low_period); + +/** + * @brief get I2C master clock period + * + * @param i2c_num I2C port number + * @param high_period pointer to get clock cycle number during SCL is high level, will get a 14 bit value + * @param low_period pointer to get clock cycle number during SCL is low level, will get a 14 bit value + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2c_get_period(i2c_port_t i2c_num, int* high_period, int* low_period); + +/** + * @brief enable hardware filter on I2C bus + * Sometimes the I2C bus is disturbed by high frequency noise(about 20ns), or the rising edge of + * the SCL clock is very slow, these may cause the master state machine broken. enable hardware + * filter can filter out high frequency interference and make the master more stable. + * @note + * Enable filter will slow the SCL clock. + * + * @param i2c_num I2C port number + * @param cyc_num the APB cycles need to be filtered(0<= cyc_num <=7). + * When the period of a pulse is less than cyc_num * APB_cycle, the I2C controller will ignore this pulse. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2c_filter_enable(i2c_port_t i2c_num, uint8_t cyc_num); + +/** + * @brief disable filter on I2C bus + * + * @param i2c_num I2C port number + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2c_filter_disable(i2c_port_t i2c_num); + +/** + * @brief set I2C master start signal timing + * + * @param i2c_num I2C port number + * @param setup_time clock number between the falling-edge of SDA and rising-edge of SCL for start mark, it's a 10-bit value. + * @param hold_time clock num between the falling-edge of SDA and falling-edge of SCL for start mark, it's a 10-bit value. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2c_set_start_timing(i2c_port_t i2c_num, int setup_time, int hold_time); + +/** + * @brief get I2C master start signal timing + * + * @param i2c_num I2C port number + * @param setup_time pointer to get setup time + * @param hold_time pointer to get hold time + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2c_get_start_timing(i2c_port_t i2c_num, int* setup_time, int* hold_time); + +/** + * @brief set I2C master stop signal timing + * + * @param i2c_num I2C port number + * @param setup_time clock num between the rising-edge of SCL and the rising-edge of SDA, it's a 10-bit value. + * @param hold_time clock number after the STOP bit's rising-edge, it's a 14-bit value. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2c_set_stop_timing(i2c_port_t i2c_num, int setup_time, int hold_time); + +/** + * @brief get I2C master stop signal timing + * + * @param i2c_num I2C port number + * @param setup_time pointer to get setup time. + * @param hold_time pointer to get hold time. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2c_get_stop_timing(i2c_port_t i2c_num, int* setup_time, int* hold_time); + +/** + * @brief set I2C data signal timing + * + * @param i2c_num I2C port number + * @param sample_time clock number I2C used to sample data on SDA after the rising-edge of SCL, it's a 10-bit value + * @param hold_time clock number I2C used to hold the data after the falling-edge of SCL, it's a 10-bit value + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2c_set_data_timing(i2c_port_t i2c_num, int sample_time, int hold_time); + +/** + * @brief get I2C data signal timing + * + * @param i2c_num I2C port number + * @param sample_time pointer to get sample time + * @param hold_time pointer to get hold time + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2c_get_data_timing(i2c_port_t i2c_num, int* sample_time, int* hold_time); + +/** + * @brief set I2C timeout value + * @param i2c_num I2C port number + * @param timeout timeout value for I2C bus (unit: APB 80Mhz clock cycle) + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2c_set_timeout(i2c_port_t i2c_num, int timeout); + +/** + * @brief get I2C timeout value + * @param i2c_num I2C port number + * @param timeout pointer to get timeout value + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2c_get_timeout(i2c_port_t i2c_num, int* timeout); + +/** + * @brief set I2C data transfer mode + * + * @param i2c_num I2C port number + * @param tx_trans_mode I2C sending data mode + * @param rx_trans_mode I2C receving data mode + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2c_set_data_mode(i2c_port_t i2c_num, i2c_trans_mode_t tx_trans_mode, i2c_trans_mode_t rx_trans_mode); + +/** + * @brief get I2C data transfer mode + * + * @param i2c_num I2C port number + * @param tx_trans_mode pointer to get I2C sending data mode + * @param rx_trans_mode pointer to get I2C receiving data mode + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2c_get_data_mode(i2c_port_t i2c_num, i2c_trans_mode_t *tx_trans_mode, i2c_trans_mode_t *rx_trans_mode); + +#ifdef __cplusplus +} +#endif + +#endif /*_DRIVER_I2C_H_*/ diff --git a/arch/xtensa/include/esp32/driver/include/driver/i2s.h b/arch/xtensa/include/esp32/driver/include/driver/i2s.h new file mode 100644 index 0000000000000..84a2610661d35 --- /dev/null +++ b/arch/xtensa/include/esp32/driver/include/driver/i2s.h @@ -0,0 +1,328 @@ +// 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. + +#pragma once + +#include "esp_types.h" +#include "esp_err.h" +#include "freertos/FreeRTOS.h" +#include "soc/i2s_periph.h" +#include "soc/rtc_periph.h" +#include "soc/i2s_caps.h" +#include "driver/periph_ctrl.h" +#include "driver/adc.h" // adc1_channel_t typedef +#include "hal/i2s_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef intr_handle_t i2s_isr_handle_t; + +/** + * @brief Set I2S pin number + * + * @note + * 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 pin I2S Pin structure, or NULL to set 2-channel 8-bit internal DAC pin configuration (GPIO25 & GPIO26) + * + * Inside the pin configuration structure, set I2S_PIN_NO_CHANGE for any pin where + * the current configuration should not be changed. + * + * @note if *pin is set as NULL, this function will initialize both of the built-in DAC channels by default. + * if you don't want this to happen and you want to initialize only one of the DAC channels, you can call i2s_set_dac_mode instead. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_FAIL IO error + */ +esp_err_t i2s_set_pin(i2s_port_t i2s_num, const i2s_pin_config_t *pin); + +#if SOC_I2S_SUPPORT_PDM +/** + * @brief Set PDM mode down-sample rate + * In PDM RX mode, there would be 2 rounds of downsample process in hardware. + * 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 dsr 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. + * 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_rx_down_sample(i2s_port_t i2s_num, i2s_pdm_dsr_t dsr); +#endif + +/** + * @brief Set I2S dac mode, I2S built-in DAC is disabled by default + * + * @param dac_mode DAC mode configurations - see i2s_dac_mode_t + * + * @note Built-in DAC functions are only supported on I2S0 for current ESP32 chip. + * If either of the built-in DAC channel are enabled, the other one can not + * be used as RTC DAC function at the same time. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2s_set_dac_mode(i2s_dac_mode_t dac_mode); + +/** + * @brief Install and start I2S driver. + * + * @param i2s_num I2S_NUM_0, I2S_NUM_1 + * + * @param i2s_config I2S configurations - see i2s_config_t struct + * + * @param queue_size I2S event queue size/depth. + * + * @param i2s_queue I2S event queue handle, if set NULL, driver will not use an event queue. + * + * This function must be called before any I2S driver read/write operations. + * + * @return + * - ESP_OK Success + * - 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); + +/** + * @brief Uninstall I2S driver. + * + * @param i2s_num I2S_NUM_0, I2S_NUM_1 + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +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 src Source address to write from + * + * @param size Size of data in bytes + * + * @param[out] bytes_written Number of bytes written, if timeout, the result will be less than the size passed in. + * + * @param ticks_to_wait TX buffer wait timeout in RTOS ticks. If this + * many ticks pass without space becoming available in the DMA + * transmit buffer, then the function will return (note that if the + * data is written to the DMA buffer in pieces, the overall operation + * may still take longer than this timeout.) Pass portMAX_DELAY for no + * timeout. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2s_write(i2s_port_t i2s_num, const void *src, size_t size, size_t *bytes_written, TickType_t ticks_to_wait); + +/** + * @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 src Source address to write from + * + * @param size Size of data in bytes + * + * @param src_bits Source audio bit + * + * @param aim_bits Bit wanted, no more than 32, and must be greater than src_bits + * + * @param[out] bytes_written Number of bytes written, if timeout, the result will be less than the size passed in. + * + * @param ticks_to_wait TX buffer wait timeout in RTOS ticks. If this + * many ticks pass without space becoming available in the DMA + * transmit buffer, then the function will return (note that if the + * data is written to the DMA buffer in pieces, the overall operation + * may still take longer than this timeout.) Pass portMAX_DELAY for no + * timeout. + * + * Format of the data in source buffer is determined by the I2S + * configuration (see i2s_config_t). + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +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); + +/** + * @brief Read data from I2S DMA receive buffer + * + * @param i2s_num I2S_NUM_0, I2S_NUM_1 + * + * @param dest Destination address to read into + * + * @param size Size of data in bytes + * + * @param[out] bytes_read Number of bytes read, if timeout, bytes read will be less than the size passed in. + * + * @param ticks_to_wait RX buffer wait timeout in RTOS ticks. If this many ticks pass without bytes becoming available in the DMA receive buffer, then the function will return (note that if data is read from the DMA buffer in pieces, the overall operation may still take longer than this timeout.) Pass portMAX_DELAY for no timeout. + * + * @note If the built-in ADC mode is enabled, we should call i2s_adc_start and i2s_adc_stop around the whole reading process, + * to prevent the data getting corrupted. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2s_read(i2s_port_t i2s_num, void *dest, size_t size, size_t *bytes_read, TickType_t ticks_to_wait); + +/** + * @brief Set sample rate used for I2S RX and TX. + * + * The bit clock rate is determined by the sample rate and i2s_config_t configuration parameters (number of channels, bits_per_sample). + * + * `bit_clock = rate * (number of channels) * bits_per_sample` + * + * @param i2s_num I2S_NUM_0, I2S_NUM_1 + * + * @param rate I2S sample rate (ex: 8000, 44100...) + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_ERR_NO_MEM Out of memory + */ +esp_err_t i2s_set_sample_rates(i2s_port_t i2s_num, uint32_t rate); + +/** + * @brief Stop I2S driver + * + * There is no need to call i2s_stop() before calling i2s_driver_uninstall(). + * + * Disables I2S TX/RX, until i2s_start() is called. + * + * @param i2s_num I2S_NUM_0, I2S_NUM_1 + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2s_stop(i2s_port_t i2s_num); + +/** + * @brief Start I2S driver + * + * 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 + * +* @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2s_start(i2s_port_t i2s_num); + +/** + * @brief Zero the contents of the TX DMA buffer. + * + * Pushes zero-byte samples into the TX DMA buffer, until it is full. + * + * @param i2s_num I2S_NUM_0, I2S_NUM_1 + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2s_zero_dma_buffer(i2s_port_t i2s_num); + +/** + * @brief Set clock & bit width used for I2S RX and TX. + * + * Similar to i2s_set_sample_rates(), but also sets bit width. + * + * @param i2s_num I2S_NUM_0, I2S_NUM_1 + * + * @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 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_bits_per_sample_t bits, i2s_channel_t ch); + +/** + * @brief get clock set on particular port number. + * + * @param i2s_num I2S_NUM_0, I2S_NUM_1 + * + * @return + * - actual clock set by i2s driver + */ +float i2s_get_clk(i2s_port_t i2s_num); + +/** + * @brief Set built-in ADC mode for I2S DMA, this function will initialize ADC pad, + * and set ADC parameters. + * @param adc_unit SAR ADC unit index + * @param adc_channel ADC channel index + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2s_set_adc_mode(adc_unit_t adc_unit, adc1_channel_t adc_channel); + +/** + * @brief Start to use I2S built-in ADC mode + * @note This function would acquire the lock of ADC to prevent the data getting corrupted + * during the I2S peripheral is being used to do fully continuous ADC sampling. + * + * @param i2s_num i2s port index + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_ERR_INVALID_STATE Driver state error + */ +esp_err_t i2s_adc_enable(i2s_port_t i2s_num); + +/** + * @brief Stop to use I2S built-in ADC mode + * @param i2s_num i2s port index + * @note This function would release the lock of ADC so that other tasks can use ADC. + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_ERR_INVALID_STATE Driver state error + */ +esp_err_t i2s_adc_disable(i2s_port_t i2s_num); + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/driver/include/driver/ledc.h b/arch/xtensa/include/esp32/driver/include/driver/ledc.h new file mode 100644 index 0000000000000..f4ca90bc7e50a --- /dev/null +++ b/arch/xtensa/include/esp32/driver/include/driver/ledc.h @@ -0,0 +1,423 @@ +// 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. + +#pragma once + +#include "esp_err.h" +#include "esp_intr_alloc.h" +#include "soc/soc.h" +#include "hal/ledc_types.h" +#include "driver/gpio.h" +#include "driver/periph_ctrl.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define LEDC_APB_CLK_HZ (APB_CLK_FREQ) +#define LEDC_REF_CLK_HZ (REF_CLK_FREQ) +#define LEDC_ERR_DUTY (0xFFFFFFFF) +#define LEDC_ERR_VAL (-1) + +typedef intr_handle_t ledc_isr_handle_t; + +/** + * @brief LEDC channel configuration + * Configure LEDC channel with the given channel/output gpio_num/interrupt/source timer/frequency(Hz)/LEDC duty resolution + * + * @param ledc_conf Pointer of LEDC channel configure struct + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t ledc_channel_config(const ledc_channel_config_t* ledc_conf); + +/** + * @brief LEDC timer configuration + * Configure LEDC timer with the given source timer/frequency(Hz)/duty_resolution + * + * @param timer_conf Pointer of LEDC timer configure struct + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_FAIL Can not find a proper pre-divider number base on the given frequency and the current duty_resolution. + */ +esp_err_t ledc_timer_config(const ledc_timer_config_t* timer_conf); + +/** + * @brief LEDC update channel parameters + * @note Call this function to activate the LEDC updated parameters. + * After ledc_set_duty, we need to call this function to update the settings. + * @note ledc_set_duty, ledc_set_duty_with_hpoint and ledc_update_duty are not thread-safe, do not call these functions to + * 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 speed_mode, high-speed mode and low-speed mode, + * @param channel LEDC channel (0-7), select from ledc_channel_t + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + * + */ +esp_err_t ledc_update_duty(ledc_mode_t speed_mode, ledc_channel_t channel); + +/** + * @brief Set LEDC output gpio. + * + * @param gpio_num The LEDC output gpio + * @param speed_mode Select the LEDC speed_mode, high-speed mode and low-speed mode + * @param ledc_channel LEDC channel (0-7), select from ledc_channel_t + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t ledc_set_pin(int gpio_num, ledc_mode_t speed_mode, ledc_channel_t ledc_channel); + +/** + * @brief LEDC stop. + * Disable LEDC output, and set idle level + * + * @param speed_mode Select the LEDC speed_mode, high-speed mode and low-speed mode + * @param channel LEDC channel (0-7), select from ledc_channel_t + * @param idle_level Set output idle level after LEDC stops. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t ledc_stop(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t idle_level); + +/** + * @brief LEDC set channel frequency (Hz) + * + * @param speed_mode Select the LEDC speed_mode, high-speed mode and low-speed mode + * @param timer_num LEDC timer index (0-3), select from ledc_timer_t + * @param freq_hz Set the LEDC frequency + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_FAIL Can not find a proper pre-divider number base on the given frequency and the current duty_resolution. + */ +esp_err_t ledc_set_freq(ledc_mode_t speed_mode, ledc_timer_t timer_num, uint32_t freq_hz); + +/** + * @brief LEDC get channel frequency (Hz) + * + * @param speed_mode Select the LEDC speed_mode, high-speed mode and low-speed mode + * @param timer_num LEDC timer index (0-3), select from ledc_timer_t + * + * @return + * - 0 error + * - Others Current LEDC frequency + */ +uint32_t ledc_get_freq(ledc_mode_t speed_mode, ledc_timer_t timer_num); + +/** + * @brief LEDC set duty and hpoint value + * Only after calling ledc_update_duty will the duty update. + * @note ledc_set_duty, ledc_set_duty_with_hpoint and ledc_update_duty are not thread-safe, do not call these functions to + * control one LEDC channel in different tasks at the same time. + * A thread-safe version of API is ledc_set_duty_and_update + * @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 speed_mode, high-speed mode and low-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 hpoint Set the LEDC hpoint value(max: 0xfffff) + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t ledc_set_duty_with_hpoint(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t duty, uint32_t hpoint); + +/** + * @brief LEDC get hpoint value, the counter value when the output is set high level. + * + * @param speed_mode Select the LEDC speed_mode, high-speed mode and low-speed mode + * @param channel LEDC channel (0-7), select from ledc_channel_t + * @return + * - LEDC_ERR_VAL if parameter error + * - Others Current hpoint value of LEDC channel + */ +int ledc_get_hpoint(ledc_mode_t speed_mode, ledc_channel_t channel); + +/** + * @brief LEDC set duty + * This function do not change the hpoint value of this channel. if needed, please call ledc_set_duty_with_hpoint. + * only after calling ledc_update_duty will the duty update. + * @note ledc_set_duty, ledc_set_duty_with_hpoint and ledc_update_duty are not thread-safe, do not call these functions to + * control one LEDC channel in different tasks at the same time. + * A thread-safe version of API is ledc_set_duty_and_update. + * @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 speed_mode, high-speed mode and low-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)] + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t ledc_set_duty(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t duty); + +/** + * @brief LEDC get duty + * + * @param speed_mode Select the LEDC speed_mode, high-speed mode and low-speed mode + * @param channel LEDC channel (0-7), select from ledc_channel_t + * + * @return + * - LEDC_ERR_DUTY if parameter error + * - Others Current LEDC duty + */ +uint32_t ledc_get_duty(ledc_mode_t speed_mode, ledc_channel_t channel); + +/** + * @brief LEDC set gradient + * Set LEDC gradient, After the function calls the ledc_update_duty function, the function can take effect. + * @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 speed_mode, high-speed mode and low-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 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 + * @param duty_scale Set gradient change amplitude + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t ledc_set_fade(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t duty, ledc_duty_direction_t fade_direction, + uint32_t step_num, uint32_t duty_cycle_num, uint32_t duty_scale); + +/** + * @brief Register LEDC interrupt handler, the handler is an ISR. + * The handler will be attached to the same CPU core that this function is running on. + * + * @param fn Interrupt handler function. + * @param arg User-supplied argument passed to the handler function. + * @param 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. + * @param handle Pointer to return handle. If non-NULL, a handle for the interrupt will + * be returned here. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Function pointer error. + */ +esp_err_t ledc_isr_register(void (*fn)(void*), void * arg, int intr_alloc_flags, ledc_isr_handle_t *handle); + +/** + * @brief Configure LEDC settings + * + * @param speed_mode Select the LEDC speed_mode, high-speed mode and low-speed mode + * @param timer_sel Timer index (0-3), there are 4 timers in LEDC module + * @param clock_divider Timer clock divide value, the timer clock is divided from the selected clock source + * @param duty_resolution Resolution of duty setting in number of bits. The range of duty values is [0, (2**duty_resolution)] + * @param clk_src Select LEDC source clock. + * + * @return + * - (-1) Parameter error + * - Other Current LEDC duty + */ +esp_err_t ledc_timer_set(ledc_mode_t speed_mode, ledc_timer_t timer_sel, uint32_t clock_divider, uint32_t duty_resolution, ledc_clk_src_t clk_src); + +/** + * @brief Reset LEDC timer + * + * @param speed_mode Select the LEDC speed_mode, high-speed mode and low-speed mode + * @param timer_sel LEDC timer index (0-3), select from ledc_timer_t + * + * @return + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_OK Success + */ +esp_err_t ledc_timer_rst(ledc_mode_t speed_mode, ledc_timer_t timer_sel); + +/** + * @brief Pause LEDC timer counter + * + * @param speed_mode Select the LEDC speed_mode, high-speed mode and low-speed mode + * @param timer_sel LEDC timer index (0-3), select from ledc_timer_t + * + * @return + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_OK Success + * + */ +esp_err_t ledc_timer_pause(ledc_mode_t speed_mode, ledc_timer_t timer_sel); + +/** + * @brief Resume LEDC timer + * + * @param speed_mode Select the LEDC speed_mode, high-speed mode and low-speed mode + * @param timer_sel LEDC timer index (0-3), select from ledc_timer_t + * + * @return + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_OK Success + */ +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 speed_mode, high-speed mode and low-speed mode + * @param channel LEDC channel index (0-7), select from ledc_channel_t + * @param timer_sel LEDC timer index (0-3), select from ledc_timer_t + * + * @return + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_OK Success + */ +esp_err_t ledc_bind_channel_timer(ledc_mode_t speed_mode, ledc_channel_t channel, ledc_timer_t timer_sel); + +/** + * @brief Set LEDC fade function. + * @note Call ledc_fade_func_install() once before calling this function. + * Call ledc_fade_start() after this to start fading. + * @note ledc_set_fade_with_step, ledc_set_fade_with_time and ledc_fade_start are not thread-safe, do not call these functions to + * control one LEDC channel in different tasks at the same time. + * A thread-safe version of API is ledc_set_fade_step_and_start + * @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 speed_mode, high-speed mode and low-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 scale Controls the increase or decrease step scale. + * @param cycle_num increase or decrease the duty every cycle_num cycles + * + * @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_set_fade_with_step(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t target_duty, uint32_t scale, uint32_t cycle_num); + +/** + * @brief Set LEDC fade function, with a limited time. + * @note Call ledc_fade_func_install() once before calling this function. + * Call ledc_fade_start() after this to start fading. + * @note ledc_set_fade_with_step, ledc_set_fade_with_time and ledc_fade_start are not thread-safe, do not call these functions to + * control one LEDC channel in different tasks at the same time. + * A thread-safe version of API is ledc_set_fade_step_and_start + * @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 speed_mode, high-speed mode and low-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 max_fade_time_ms The maximum time of the fading ( ms ). + * + * @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_set_fade_with_time(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t target_duty, int max_fade_time_ms); + +/** + * @brief Install LEDC fade function. This function will occupy interrupt of LEDC module. + * @param 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. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_STATE Fade function already installed. + */ +esp_err_t ledc_fade_func_install(int intr_alloc_flags); + +/** + * @brief Uninstall LEDC fade function. + * + */ +void ledc_fade_func_uninstall(void); + +/** + * @brief Start LEDC fading. + * @note Call ledc_fade_func_install() once before calling this function. + * Call this API right after ledc_set_fade_with_time or ledc_set_fade_with_step before to start fading. + * @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 speed_mode, high-speed mode and low-speed mode + * @param channel LEDC channel number + * @param fade_mode Whether to block until fading done. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_STATE Fade function not installed. + * - ESP_ERR_INVALID_ARG Parameter error. + */ +esp_err_t ledc_fade_start(ledc_mode_t speed_mode, ledc_channel_t channel, ledc_fade_mode_t fade_mode); + +/** + * @brief A thread-safe API to set duty for LEDC channel and return when duty updated. + * @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 speed_mode, high-speed mode and low-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 hpoint Set the LEDC hpoint value(max: 0xfffff) + * + */ +esp_err_t ledc_set_duty_and_update(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t duty, uint32_t hpoint); + +/** + * @brief A thread-safe API to set and start LEDC fade function, with a limited time. + * @note Call ledc_fade_func_install() once, before calling this function. + * @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 speed_mode, high-speed mode and low-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 max_fade_time_ms The maximum time of the fading ( ms ). + * @param fade_mode choose blocking or non-blocking mode + * @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_set_fade_time_and_start(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t target_duty, uint32_t max_fade_time_ms, ledc_fade_mode_t fade_mode); + +/** + * @brief A thread-safe API to set and start LEDC fade function. + * @note Call ledc_fade_func_install() once before calling this function. + * @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 speed_mode, high-speed mode and low-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 scale Controls the increase or decrease step scale. + * @param cycle_num increase or decrease the duty every cycle_num cycles + * @param fade_mode choose blocking or non-blocking mode + * @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_set_fade_step_and_start(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t target_duty, uint32_t scale, uint32_t cycle_num, ledc_fade_mode_t fade_mode); +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/driver/include/driver/mcpwm.h b/arch/xtensa/include/esp32/driver/include/driver/mcpwm.h new file mode 100644 index 0000000000000..7f5b71feaa413 --- /dev/null +++ b/arch/xtensa/include/esp32/driver/include/driver/mcpwm.h @@ -0,0 +1,668 @@ +// 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. + +#ifndef _DRIVER_MCPWM_H_ +#define _DRIVER_MCPWM_H_ + +#include "soc/soc_caps.h" +#ifndef SOC_MCPWM_SUPPORTED +#error MCPWM is not supported in this chip target +#endif + +#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" +#include "soc/mcpwm_caps.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/** + * @brief IO signals for the MCPWM + * + * - 6 MCPWM output pins that generate PWM signals + * - 3 MCPWM fault input pins to detect faults like overcurrent, overvoltage, etc. + * - 3 MCPWM sync input pins to synchronize MCPWM outputs signals + * - 3 MCPWM capture input pins to gather feedback from controlled motors, using e.g. hall sensors + */ +typedef enum { + MCPWM0A = 0, /*!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/arch/xtensa/include/esp32/driver/include/driver/periph_ctrl.h b/arch/xtensa/include/esp32/driver/include/driver/periph_ctrl.h new file mode 100644 index 0000000000000..1333d406cfe93 --- /dev/null +++ b/arch/xtensa/include/esp32/driver/include/driver/periph_ctrl.h @@ -0,0 +1,67 @@ +// 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. + +#ifndef _DRIVER_PERIPH_CTRL_H_ +#define _DRIVER_PERIPH_CTRL_H_ + +#include "../../../soc/esp32/include/soc/periph_defs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief enable peripheral module + * + * @param[in] periph : Peripheral module name + * + * Clock for the module will be ungated, and reset de-asserted. + * + * @return NULL + * + */ +void periph_module_enable(periph_module_t periph); + +/** + * @brief disable peripheral module + * + * @param[in] periph : Peripheral module name + * + * Clock for the module will be gated, reset asserted. + * + * @return NULL + * + */ +void periph_module_disable(periph_module_t periph); + +/** + * @brief reset peripheral module + * + * @param[in] periph : Peripheral module name + * + * Reset will asserted then de-assrted for the peripheral. + * + * Calling this function does not enable or disable the clock for the module. + * + * @return NULL + * + */ +void periph_module_reset(periph_module_t periph); + + +#ifdef __cplusplus +} +#endif + +#endif /* _DRIVER_PERIPH_CTRL_H_ */ diff --git a/arch/xtensa/include/esp32/driver/include/driver/rmt.h b/arch/xtensa/include/esp32/driver/include/driver/rmt.h new file mode 100644 index 0000000000000..39775a980cc7a --- /dev/null +++ b/arch/xtensa/include/esp32/driver/include/driver/rmt.h @@ -0,0 +1,783 @@ +// 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. + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include "esp_err.h" +#include "driver/gpio.h" +#include "freertos/FreeRTOS.h" +#include "freertos/ringbuf.h" +#include "soc/rmt_caps.h" +#include "soc/rmt_struct.h" +#include "hal/rmt_types.h" + +/** + * @brief Define memory space of each RMT channel (in words = 4 bytes) + * + */ +#define RMT_MEM_ITEM_NUM RMT_CHANNEL_MEM_WORDS + +/** +* @brief Data struct of RMT TX configure parameters +*/ +typedef struct { + uint32_t carrier_freq_hz; /*!< RMT carrier frequency */ + rmt_carrier_level_t carrier_level; /*!< Level of the RMT output, when the carrier is applied */ + rmt_idle_level_t idle_level; /*!< RMT idle level */ + uint8_t carrier_duty_percent; /*!< RMT carrier duty (%) */ + bool carrier_en; /*!< RMT carrier enable */ + bool loop_en; /*!< Enable sending RMT items in a loop */ + bool idle_output_en; /*!< RMT idle level output enable */ +} rmt_tx_config_t; + +/** +* @brief Data struct of RMT RX configure parameters +*/ +typedef struct { + uint16_t idle_threshold; /*!< RMT RX idle threshold */ + uint8_t filter_ticks_thresh; /*!< RMT filter tick number */ + bool filter_en; /*!< RMT receiver filter enable */ +} rmt_rx_config_t; + +/** +* @brief Data struct of RMT configure parameters +*/ +typedef struct { + rmt_mode_t rmt_mode; /*!< RMT mode: transmitter or receiver */ + rmt_channel_t channel; /*!< RMT channel */ + gpio_num_t gpio_num; /*!< RMT GPIO number */ + uint8_t clk_div; /*!< RMT channel counter divider */ + uint8_t mem_block_num; /*!< RMT memory block number */ + union { + rmt_tx_config_t tx_config; /*!< RMT TX parameter */ + rmt_rx_config_t rx_config; /*!< RMT RX parameter */ + }; +} rmt_config_t; + +/** + * @brief Default configuration for Tx channel + * + */ +#define RMT_DEFAULT_CONFIG_TX(gpio, channel_id) \ + { \ + .rmt_mode = RMT_MODE_TX, \ + .channel = channel_id, \ + .gpio_num = gpio, \ + .clk_div = 80, \ + .mem_block_num = 1, \ + .tx_config = { \ + .carrier_freq_hz = 38000, \ + .carrier_level = RMT_CARRIER_LEVEL_HIGH, \ + .idle_level = RMT_IDLE_LEVEL_LOW, \ + .carrier_duty_percent = 33, \ + .carrier_en = false, \ + .loop_en = false, \ + .idle_output_en = true, \ + } \ + } + +/** + * @brief Default configuration for RX channel + * + */ +#define RMT_DEFAULT_CONFIG_RX(gpio, channel_id) \ + { \ + .rmt_mode = RMT_MODE_RX, \ + .channel = channel_id, \ + .gpio_num = gpio, \ + .clk_div = 80, \ + .mem_block_num = 1, \ + .rx_config = { \ + .idle_threshold = 12000, \ + .filter_ticks_thresh = 100, \ + .filter_en = true, \ + } \ + } + +/** +* @brief RMT interrupt handle +* +*/ +typedef intr_handle_t rmt_isr_handle_t; + +/** +* @brief Type of RMT Tx End callback function +* +*/ +typedef void (*rmt_tx_end_fn_t)(rmt_channel_t channel, void *arg); + +/** +* @brief Structure encapsulating a RMT TX end callback +*/ +typedef struct { + rmt_tx_end_fn_t function; /*!< Function which is called on RMT TX end */ + void *arg; /*!< Optional argument passed to function */ +} rmt_tx_end_callback_t; + +/** +* @brief User callback function to convert uint8_t type data to rmt format(rmt_item32_t). +* +* This function may be called from an ISR, so, the code should be short and efficient. +* +* @param src Pointer to the buffer storing the raw data that needs to be converted to rmt format. +* @param[out] dest Pointer to the buffer storing the rmt format data. +* @param src_size The raw data size. +* @param wanted_num The number of rmt format data that wanted to get. +* @param[out] translated_size The size of the raw data that has been converted to rmt format, +* it should return 0 if no data is converted in user callback. +* @param[out] item_num The number of the rmt format data that actually converted to, +* it can be less than wanted_num if there is not enough raw data, but cannot exceed wanted_num. +* it should return 0 if no data was converted. +* +* @note +* In fact, item_num should be a multiple of translated_size, e.g. : +* When we convert each byte of uint8_t type data to rmt format data, +* the relation between item_num and translated_size should be `item_num = translated_size*8`. +*/ +typedef void (*sample_to_rmt_t)(const void *src, rmt_item32_t *dest, size_t src_size, size_t wanted_num, size_t *translated_size, size_t *item_num); + +/** +* @brief Set RMT clock divider, channel clock is divided from source clock. +* +* @param channel RMT channel +* @param div_cnt RMT counter clock divider +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_set_clk_div(rmt_channel_t channel, uint8_t div_cnt); + +/** +* @brief Get RMT clock divider, channel clock is divided from source clock. +* +* @param channel RMT channel +* @param div_cnt pointer to accept RMT counter divider +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_get_clk_div(rmt_channel_t channel, uint8_t *div_cnt); + +/** +* @brief Set RMT RX idle threshold value +* +* In receive mode, when no edge is detected on the input signal +* for longer than idle_thres channel clock cycles, +* the receive process is finished. +* +* @param channel RMT channel +* @param thresh RMT RX idle threshold +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_set_rx_idle_thresh(rmt_channel_t channel, uint16_t thresh); + +/** +* @brief Get RMT idle threshold value. +* +* In receive mode, when no edge is detected on the input signal +* for longer than idle_thres channel clock cycles, +* the receive process is finished. +* +* @param channel RMT channel +* @param thresh pointer to accept RMT RX idle threshold value +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_get_rx_idle_thresh(rmt_channel_t channel, uint16_t *thresh); + +/** +* @brief Set RMT memory block number for RMT channel +* +* This function is used to configure the amount of memory blocks allocated to channel n +* The 8 channels share a 512x32-bit RAM block which can be read and written +* by the processor cores over the APB bus, as well as read by the transmitters +* and written by the receivers. +* +* The RAM address range for channel n is start_addr_CHn to end_addr_CHn, which are defined by: +* Memory block start address is RMT_CHANNEL_MEM(n) (in soc/rmt_reg.h), +* that is, start_addr_chn = RMT base address + 0x800 + 64 ∗ 4 ∗ n, and +* end_addr_chn = RMT base address + 0x800 + 64 ∗ 4 ∗ n + 64 ∗ 4 ∗ RMT_MEM_SIZE_CHn mod 512 ∗ 4 +* +* @note +* If memory block number of one channel is set to a value greater than 1, this channel will occupy the memory +* block of the next channel. +* Channel 0 can use at most 8 blocks of memory, accordingly channel 7 can only use one memory block. +* +* @param channel RMT channel +* @param rmt_mem_num RMT RX memory block number, one block has 64 * 32 bits. +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_set_mem_block_num(rmt_channel_t channel, uint8_t rmt_mem_num); + +/** +* @brief Get RMT memory block number +* +* @param channel RMT channel +* @param rmt_mem_num Pointer to accept RMT RX memory block number +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_get_mem_block_num(rmt_channel_t channel, uint8_t *rmt_mem_num); + +/** +* @brief Configure RMT carrier for TX signal. +* +* Set different values for carrier_high and carrier_low to set different frequency of carrier. +* The unit of carrier_high/low is the source clock tick, not the divided channel counter clock. +* +* @param channel RMT channel +* @param carrier_en Whether to enable output carrier. +* @param high_level High level duration of carrier +* @param low_level Low level duration of carrier. +* @param carrier_level Configure the way carrier wave is modulated for channel. +* - 1'b1:transmit on low output level +* - 1'b0:transmit on high output level +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_set_tx_carrier(rmt_channel_t channel, bool carrier_en, uint16_t high_level, uint16_t low_level, rmt_carrier_level_t carrier_level); + +/** +* @brief Set RMT memory in low power mode. +* +* Reduce power consumed by memory. 1:memory is in low power state. +* +* @param channel RMT channel +* @param pd_en RMT memory low power enable. +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_set_mem_pd(rmt_channel_t channel, bool pd_en); + +/** +* @brief Get RMT memory low power mode. +* +* @param channel RMT channel +* @param pd_en Pointer to accept RMT memory low power mode. +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_get_mem_pd(rmt_channel_t channel, bool *pd_en); + +/** +* @brief Set RMT start sending data from memory. +* +* @param channel RMT channel +* @param tx_idx_rst Set true to reset memory index for TX. +* Otherwise, transmitter will continue sending from the last index in memory. +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_tx_start(rmt_channel_t channel, bool tx_idx_rst); + +/** +* @brief Set RMT stop sending. +* +* @param channel RMT channel +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_tx_stop(rmt_channel_t channel); + +/** +* @brief Set RMT start receiving data. +* +* @param channel RMT channel +* @param rx_idx_rst Set true to reset memory index for receiver. +* Otherwise, receiver will continue receiving data to the last index in memory. +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_rx_start(rmt_channel_t channel, bool rx_idx_rst); + +/** +* @brief Set RMT stop receiving data. +* +* @param channel RMT channel +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_rx_stop(rmt_channel_t channel); + +/** +* @brief Reset RMT TX/RX memory index. +* +* @param channel RMT channel +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_memory_rw_rst(rmt_channel_t channel); + +/** +* @brief Set RMT memory owner. +* +* @param channel RMT channel +* @param owner To set when the transmitter or receiver can process the memory of channel. +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_set_memory_owner(rmt_channel_t channel, rmt_mem_owner_t owner); + +/** +* @brief Get RMT memory owner. +* +* @param channel RMT channel +* @param owner Pointer to get memory owner. +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_get_memory_owner(rmt_channel_t channel, rmt_mem_owner_t *owner); + +/** +* @brief Set RMT tx loop mode. +* +* @param channel RMT channel +* @param loop_en Enable RMT transmitter loop sending mode. +* If set true, transmitter will continue sending from the first data +* to the last data in channel over and over again in a loop. +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_set_tx_loop_mode(rmt_channel_t channel, bool loop_en); + +/** +* @brief Get RMT tx loop mode. +* +* @param channel RMT channel +* @param loop_en Pointer to accept RMT transmitter loop sending mode. +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_get_tx_loop_mode(rmt_channel_t channel, bool *loop_en); + +/** +* @brief Set RMT RX filter. +* +* In receive mode, channel will ignore input pulse when the pulse width is smaller than threshold. +* Counted in source clock, not divided counter clock. +* +* @param channel RMT channel +* @param rx_filter_en To enable RMT receiver filter. +* @param thresh Threshold of pulse width for receiver. +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_set_rx_filter(rmt_channel_t channel, bool rx_filter_en, uint8_t thresh); + +/** +* @brief Set RMT source clock +* +* RMT module has two clock sources: +* 1. APB clock which is 80Mhz +* 2. REF tick clock, which would be 1Mhz (not supported in this version). +* +* @param channel RMT channel +* @param base_clk To choose source clock for RMT module. +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_set_source_clk(rmt_channel_t channel, rmt_source_clk_t base_clk); + +/** +* @brief Get RMT source clock +* +* RMT module has two clock sources: +* 1. APB clock which is 80Mhz +* 2. REF tick clock, which would be 1Mhz (not supported in this version). +* +* @param channel RMT channel +* @param src_clk Pointer to accept source clock for RMT module. +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_get_source_clk(rmt_channel_t channel, rmt_source_clk_t *src_clk); + +/** +* @brief Set RMT idle output level for transmitter +* +* @param channel RMT channel +* @param idle_out_en To enable idle level output. +* @param level To set the output signal's level for channel in idle state. +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_set_idle_level(rmt_channel_t channel, bool idle_out_en, rmt_idle_level_t level); + +/** +* @brief Get RMT idle output level for transmitter +* +* @param channel RMT channel +* @param idle_out_en Pointer to accept value of enable idle. +* @param level Pointer to accept value of output signal's level in idle state for specified channel. +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_get_idle_level(rmt_channel_t channel, bool *idle_out_en, rmt_idle_level_t *level); + +/** +* @brief Get RMT status +* +* @param channel RMT channel +* @param status Pointer to accept channel status. +* Please refer to RMT_CHnSTATUS_REG(n=0~7) in `rmt_reg.h` for more details of each field. +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_get_status(rmt_channel_t channel, uint32_t *status); + +/** +* @brief Set mask value to RMT interrupt enable register. +* +* @param mask Bit mask to set to the register +* +*/ +void rmt_set_intr_enable_mask(uint32_t mask); + +/** +* @brief Clear mask value to RMT interrupt enable register. +* +* @param mask Bit mask to clear the register +* +*/ +void rmt_clr_intr_enable_mask(uint32_t mask); + +/** +* @brief Set RMT RX interrupt enable +* +* @param channel RMT channel +* @param en enable or disable RX interrupt. +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_set_rx_intr_en(rmt_channel_t channel, bool en); + +/** +* @brief Set RMT RX error interrupt enable +* +* @param channel RMT channel +* @param en enable or disable RX err interrupt. +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_set_err_intr_en(rmt_channel_t channel, bool en); + +/** +* @brief Set RMT TX interrupt enable +* +* @param channel RMT channel +* @param en enable or disable TX interrupt. +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_set_tx_intr_en(rmt_channel_t channel, bool en); + +/** +* @brief Set RMT TX threshold event interrupt enable +* +* An interrupt will be triggered when the number of transmitted items reaches the threshold value +* +* @param channel RMT channel +* @param en enable or disable TX event interrupt. +* @param evt_thresh RMT event interrupt threshold value +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_set_tx_thr_intr_en(rmt_channel_t channel, bool en, uint16_t evt_thresh); + +/** +* @brief Set RMT pin +* +* @param channel RMT channel +* @param mode TX or RX mode for RMT +* @param gpio_num GPIO number to transmit or receive the signal. +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_set_pin(rmt_channel_t channel, rmt_mode_t mode, gpio_num_t gpio_num); + +/** +* @brief Configure RMT parameters +* +* @param rmt_param RMT parameter struct +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_config(const rmt_config_t *rmt_param); + +/** +* @brief Register RMT interrupt handler, the handler is an ISR. +* +* The handler will be attached to the same CPU core that this function is running on. +* +* @note If you already called rmt_driver_install to use system RMT driver, +* please do not register ISR handler again. +* +* @param fn Interrupt handler function. +* @param arg Parameter for the handler function +* @param 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. +* @param handle If non-zero, a handle to later clean up the ISR gets stored here. +* +* @return +* - ESP_OK Success +* - ESP_ERR_INVALID_ARG Function pointer error. +* - ESP_FAIL System driver installed, can not register ISR handler for RMT +*/ +esp_err_t rmt_isr_register(void (*fn)(void *), void *arg, int intr_alloc_flags, rmt_isr_handle_t *handle); + +/** +* @brief Deregister previously registered RMT interrupt handler +* +* @param handle Handle obtained from rmt_isr_register +* +* @return +* - ESP_OK Success +* - ESP_ERR_INVALID_ARG Handle invalid +*/ +esp_err_t rmt_isr_deregister(rmt_isr_handle_t handle); + +/** +* @brief Fill memory data of channel with given RMT items. +* +* @param channel RMT channel +* @param item Pointer of items. +* @param item_num RMT sending items number. +* @param mem_offset Index offset of memory. +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_fill_tx_items(rmt_channel_t channel, const rmt_item32_t *item, uint16_t item_num, uint16_t mem_offset); + +/** +* @brief Initialize RMT driver +* +* @param channel RMT channel +* @param rx_buf_size Size of RMT RX ringbuffer. Can be 0 if the RX ringbuffer is not used. +* @param intr_alloc_flags Flags for the RMT driver interrupt handler. Pass 0 for default flags. See esp_intr_alloc.h for details. +* If ESP_INTR_FLAG_IRAM is used, please do not use the memory allocated from psram when calling rmt_write_items. +* +* @return +* - ESP_ERR_INVALID_STATE Driver is already installed, call rmt_driver_uninstall first. +* - ESP_ERR_NO_MEM Memory allocation failure +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_driver_install(rmt_channel_t channel, size_t rx_buf_size, int intr_alloc_flags); + +/** +* @brief Uninstall RMT driver. +* +* @param channel RMT channel +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_driver_uninstall(rmt_channel_t channel); + +/** +* @brief Get the current status of eight channels. +* +* @note Do not call this function if it is possible that `rmt_driver_uninstall` will be called at the same time. +* +* @param[out] channel_status store the current status of each channel +* +* @return +* - ESP_ERR_INVALID_ARG Parameter is NULL +* - ESP_OK Success +*/ +esp_err_t rmt_get_channel_status(rmt_channel_status_result_t *channel_status); + +/** +* @brief Get speed of channel's internal counter clock. +* +* @param channel RMT channel +* @param[out] clock_hz counter clock speed, in hz +* +* @return +* - ESP_ERR_INVALID_ARG Parameter is NULL +* - ESP_OK Success +*/ +esp_err_t rmt_get_counter_clock(rmt_channel_t channel, uint32_t *clock_hz); + +/** +* @brief RMT send waveform from rmt_item array. +* +* This API allows user to send waveform with any length. +* +* @param channel RMT channel +* @param rmt_item head point of RMT items array. +* If ESP_INTR_FLAG_IRAM is used, please do not use the memory allocated from psram when calling rmt_write_items. +* @param item_num RMT data item number. +* @param wait_tx_done +* - If set 1, it will block the task and wait for sending done. +* - If set 0, it will not wait and return immediately. +* +* @note +* This function will not copy data, instead, it will point to the original items, +* and send the waveform items. +* If wait_tx_done is set to true, this function will block and will not return until +* all items have been sent out. +* If wait_tx_done is set to false, this function will return immediately, and the driver +* interrupt will continue sending the items. We must make sure the item data will not be +* damaged when the driver is still sending items in driver interrupt. +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_write_items(rmt_channel_t channel, const rmt_item32_t *rmt_item, int item_num, bool wait_tx_done); + +/** +* @brief Wait RMT TX finished. +* +* @param channel RMT channel +* @param wait_time Maximum time in ticks to wait for transmission to be complete. If set 0, return immediately with ESP_ERR_TIMEOUT if TX is busy (polling). +* +* @return +* - ESP_OK RMT Tx done successfully +* - ESP_ERR_TIMEOUT Exceeded the 'wait_time' given +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_FAIL Driver not installed +*/ +esp_err_t rmt_wait_tx_done(rmt_channel_t channel, TickType_t wait_time); + +/** +* @brief Get ringbuffer from RMT. +* +* Users can get the RMT RX ringbuffer handle, and process the RX data. +* +* @param channel RMT channel +* @param buf_handle Pointer to buffer handle to accept RX ringbuffer handle. +* +* @return +* - ESP_ERR_INVALID_ARG Parameter error +* - ESP_OK Success +*/ +esp_err_t rmt_get_ringbuf_handle(rmt_channel_t channel, RingbufHandle_t *buf_handle); + +/** +* @brief Init rmt translator and register user callback. +* The callback will convert the raw data that needs to be sent to rmt format. +* If a channel is initialized more than once, tha user callback will be replaced by the later. +* +* @param channel RMT channel . +* @param fn Point to the data conversion function. +* +* @return +* - ESP_FAIL Init fail. +* - ESP_OK Init success. +*/ +esp_err_t rmt_translator_init(rmt_channel_t channel, sample_to_rmt_t fn); + +/** +* @brief Translate uint8_t type of data into rmt format and send it out. +* Requires rmt_translator_init to init the translator first. +* +* @param channel RMT channel . +* @param src Pointer to the raw data. +* @param src_size The size of the raw data. +* @param wait_tx_done Set true to wait all data send done. +* +* @return +* - ESP_FAIL Send fail +* - ESP_OK Send success +*/ +esp_err_t rmt_write_sample(rmt_channel_t channel, const uint8_t *src, size_t src_size, bool wait_tx_done); + +/** +* @brief Registers a callback that will be called when transmission ends. +* +* Called by rmt_driver_isr_default in interrupt context. +* +* @note Requires rmt_driver_install to install the default ISR handler. +* +* @param function Function to be called from the default interrupt handler or NULL. +* @param arg Argument which will be provided to the callback when it is called. +* +* @return the previous callback settings (members will be set to NULL if there was none) +*/ +rmt_tx_end_callback_t rmt_register_tx_end_callback(rmt_tx_end_fn_t function, void *arg); + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/driver/include/driver/rtc_cntl.h b/arch/xtensa/include/esp32/driver/include/driver/rtc_cntl.h new file mode 100644 index 0000000000000..44fd015096bc4 --- /dev/null +++ b/arch/xtensa/include/esp32/driver/include/driver/rtc_cntl.h @@ -0,0 +1,56 @@ +// 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. + +#pragma once + +#include +#include "esp_err.h" +#include "esp_intr_alloc.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Register a handler for specific RTC_CNTL interrupts + * + * Multiple handlers can be registered using this function. Whenever an + * RTC interrupt happens, all handlers with matching rtc_intr_mask values + * will be called. + * + * @param handler handler function to call + * @param handler_arg argument to be passed to the handler + * @param rtc_intr_mask combination of RTC_CNTL_*_INT_ENA bits indicating the + * sources to call the handler for + * @return + * - ESP_OK on success + * - ESP_ERR_NO_MEM not enough memory to allocate handler structure + * - other errors returned by esp_intr_alloc + */ +esp_err_t rtc_isr_register(intr_handler_t handler, void* handler_arg, + uint32_t rtc_intr_mask); +/** + * @brief Deregister the handler previously registered using rtc_isr_register + * @param handler handler function to call (as passed to rtc_isr_register) + * @param handler_arg argument of the handler (as passed to rtc_isr_register) + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_STATE if a handler matching both handler and + * handler_arg isn't registered + */ +esp_err_t rtc_isr_deregister(intr_handler_t handler, void* handler_arg); + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/driver/include/driver/rtc_io.h b/arch/xtensa/include/esp32/driver/include/driver/rtc_io.h new file mode 100644 index 0000000000000..c6127e666f720 --- /dev/null +++ b/arch/xtensa/include/esp32/driver/include/driver/rtc_io.h @@ -0,0 +1,301 @@ +// 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. + +#ifndef _DRIVER_RTC_GPIO_H_ +#define _DRIVER_RTC_GPIO_H_ + +#include +#include "esp_err.h" +#include "driver/gpio.h" +#include "soc/rtc_io_periph.h" +#include "hal/rtc_io_types.h" +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Determine if the specified GPIO is a valid RTC GPIO. + * + * @param gpio_num GPIO number + * @return true if GPIO is valid for RTC GPIO use. false otherwise. + */ +static inline bool rtc_gpio_is_valid_gpio(gpio_num_t gpio_num) +{ + return (gpio_num < GPIO_PIN_COUNT + && rtc_io_num_map[gpio_num] >= 0); +} + +#define RTC_GPIO_IS_VALID_GPIO(gpio_num) rtc_gpio_is_valid_gpio(gpio_num) // Deprecated, use rtc_gpio_is_valid_gpio() + +/** + * @brief Get RTC IO index number by gpio number. + * + * @param gpio_num GPIO number + * @return + * >=0: Index of rtcio. + * -1 : The gpio is not rtcio. + */ +static inline int rtc_io_number_get(gpio_num_t gpio_num) +{ + return rtc_io_num_map[gpio_num]; +} + +/** + * @brief Init a GPIO as RTC GPIO + * + * This function must be called when initializing a pad for an analog function. + * + * @param gpio_num GPIO number (e.g. GPIO_NUM_12) + * + * @return + * - ESP_OK success + * - ESP_ERR_INVALID_ARG GPIO is not an RTC IO + */ +esp_err_t rtc_gpio_init(gpio_num_t gpio_num); + +/** + * @brief Init a GPIO as digital GPIO + * + * @param gpio_num GPIO number (e.g. GPIO_NUM_12) + * + * @return + * - ESP_OK success + * - ESP_ERR_INVALID_ARG GPIO is not an RTC IO + */ +esp_err_t rtc_gpio_deinit(gpio_num_t gpio_num); + +/** + * @brief Get the RTC IO input level + * + * @param gpio_num GPIO number (e.g. GPIO_NUM_12) + * + * @return + * - 1 High level + * - 0 Low level + * - ESP_ERR_INVALID_ARG GPIO is not an RTC IO + */ +uint32_t rtc_gpio_get_level(gpio_num_t gpio_num); + +/** + * @brief Set the RTC IO output level + * + * @param gpio_num GPIO number (e.g. GPIO_NUM_12) + * @param level output level + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG GPIO is not an RTC IO + */ +esp_err_t rtc_gpio_set_level(gpio_num_t gpio_num, uint32_t level); + +/** + * @brief RTC GPIO set direction + * + * Configure RTC GPIO direction, such as output only, input only, + * output and input. + * + * @param gpio_num GPIO number (e.g. GPIO_NUM_12) + * @param mode GPIO direction + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG GPIO is not an RTC IO + */ +esp_err_t rtc_gpio_set_direction(gpio_num_t gpio_num, rtc_gpio_mode_t mode); + +/** + * @brief RTC GPIO set direction in deep sleep mode or disable sleep status (default). + * In some application scenarios, IO needs to have another states during deep sleep. + * + * NOTE: ESP32 support INPUT_ONLY mode. + * ESP32S2 support INPUT_ONLY, OUTPUT_ONLY, INPUT_OUTPUT mode. + * + * @param gpio_num GPIO number (e.g. GPIO_NUM_12) + * @param mode GPIO direction + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG GPIO is not an RTC IO + */ +esp_err_t rtc_gpio_set_direction_in_sleep(gpio_num_t gpio_num, rtc_gpio_mode_t mode); + +/** + * @brief RTC GPIO pullup enable + * + * This function only works for RTC IOs. In general, call gpio_pullup_en, + * which will work both for normal GPIOs and RTC IOs. + * + * @param gpio_num GPIO number (e.g. GPIO_NUM_12) + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG GPIO is not an RTC IO + */ +esp_err_t rtc_gpio_pullup_en(gpio_num_t gpio_num); + +/** + * @brief RTC GPIO pulldown enable + * + * This function only works for RTC IOs. In general, call gpio_pulldown_en, + * which will work both for normal GPIOs and RTC IOs. + * + * @param gpio_num GPIO number (e.g. GPIO_NUM_12) + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG GPIO is not an RTC IO + */ +esp_err_t rtc_gpio_pulldown_en(gpio_num_t gpio_num); + +/** + * @brief RTC GPIO pullup disable + * + * This function only works for RTC IOs. In general, call gpio_pullup_dis, + * which will work both for normal GPIOs and RTC IOs. + * + * @param gpio_num GPIO number (e.g. GPIO_NUM_12) + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG GPIO is not an RTC IO + */ +esp_err_t rtc_gpio_pullup_dis(gpio_num_t gpio_num); + +/** + * @brief RTC GPIO pulldown disable + * + * This function only works for RTC IOs. In general, call gpio_pulldown_dis, + * which will work both for normal GPIOs and RTC IOs. + * + * @param gpio_num GPIO number (e.g. GPIO_NUM_12) + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG GPIO is not an RTC IO + */ +esp_err_t rtc_gpio_pulldown_dis(gpio_num_t gpio_num); + +/** + * @brief Enable hold function on an RTC IO pad + * + * Enabling HOLD function will cause the pad to latch current values of + * input enable, output enable, output value, function, drive strength values. + * This function is useful when going into light or deep sleep mode to prevent + * the pin configuration from changing. + * + * @param gpio_num GPIO number (e.g. GPIO_NUM_12) + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG GPIO is not an RTC IO + */ +esp_err_t rtc_gpio_hold_en(gpio_num_t gpio_num); + +/** + * @brief Disable hold function on an RTC IO pad + * + * Disabling hold function will allow the pad receive the values of + * input enable, output enable, output value, function, drive strength from + * RTC_IO peripheral. + * + * @param gpio_num GPIO number (e.g. GPIO_NUM_12) + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG GPIO is not an RTC IO + */ +esp_err_t rtc_gpio_hold_dis(gpio_num_t gpio_num); + +/** + * @brief Helper function to disconnect internal circuits from an RTC IO + * This function disables input, output, pullup, pulldown, and enables + * hold feature for an RTC IO. + * Use this function if an RTC IO needs to be disconnected from internal + * circuits in deep sleep, to minimize leakage current. + * + * In particular, for ESP32-WROVER module, call + * rtc_gpio_isolate(GPIO_NUM_12) before entering deep sleep, to reduce + * deep sleep current. + * + * @param gpio_num GPIO number (e.g. GPIO_NUM_12). + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG if GPIO is not an RTC IO + */ +esp_err_t rtc_gpio_isolate(gpio_num_t gpio_num); + +/** + * @brief Enable force hold signal for all RTC IOs + * + * Each RTC pad has a "force hold" input signal from the RTC controller. + * If this signal is set, pad latches current values of input enable, + * function, output enable, and other signals which come from the RTC mux. + * Force hold signal is enabled before going into deep sleep for pins which + * are used for EXT1 wakeup. + */ +esp_err_t rtc_gpio_force_hold_all(void); + +/** + * @brief Disable force hold signal for all RTC IOs + */ +esp_err_t rtc_gpio_force_hold_dis_all(void); + +/** + * @brief Set RTC GPIO pad drive capability + * + * @param gpio_num GPIO number, only support output GPIOs + * @param strength Drive capability of the pad + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t rtc_gpio_set_drive_capability(gpio_num_t gpio_num, gpio_drive_cap_t strength); + +/** + * @brief Get RTC GPIO pad drive capability + * + * @param gpio_num GPIO number, only support output GPIOs + * @param strength Pointer to accept drive capability of the pad + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t rtc_gpio_get_drive_capability(gpio_num_t gpio_num, gpio_drive_cap_t* strength); + +/** + * @brief Enable wakeup from sleep mode using specific GPIO + * @param gpio_num GPIO number + * @param intr_type Wakeup on high level (GPIO_INTR_HIGH_LEVEL) or low level + * (GPIO_INTR_LOW_LEVEL) + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG if gpio_num is not an RTC IO, or intr_type is not + * one of GPIO_INTR_HIGH_LEVEL, GPIO_INTR_LOW_LEVEL. + */ +esp_err_t rtc_gpio_wakeup_enable(gpio_num_t gpio_num, gpio_int_type_t intr_type); + +/** + * @brief Disable wakeup from sleep mode using specific GPIO + * @param gpio_num GPIO number + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG if gpio_num is not an RTC IO + */ +esp_err_t rtc_gpio_wakeup_disable(gpio_num_t gpio_num); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/arch/xtensa/include/esp32/driver/include/driver/sdio_slave.h b/arch/xtensa/include/esp32/driver/include/driver/sdio_slave.h new file mode 100644 index 0000000000000..a67ad47ea4193 --- /dev/null +++ b/arch/xtensa/include/esp32/driver/include/driver/sdio_slave.h @@ -0,0 +1,280 @@ +// 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. + +#ifndef _DRIVER_SDIO_SLAVE_H_ +#define _DRIVER_SDIO_SLAVE_H_ + +#include "freertos/FreeRTOS.h" +#include "freertos/portmacro.h" +#include "esp_err.h" +#include "sys/queue.h" + +#include "hal/sdio_slave_types.h" +#include "soc/sdio_slave_periph.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define SDIO_SLAVE_RECV_MAX_BUFFER (4096-4) + +typedef void(*sdio_event_cb_t)(uint8_t event); + + +/// Configuration of SDIO slave +typedef struct { + sdio_slave_timing_t timing; ///< timing of sdio_slave. see `sdio_slave_timing_t`. + sdio_slave_sending_mode_t sending_mode; ///< mode of sdio_slave. `SDIO_SLAVE_MODE_STREAM` if the data needs to be sent as much as possible; `SDIO_SLAVE_MODE_PACKET` if the data should be sent in packets. + int send_queue_size; ///< max buffers that can be queued before sending. + size_t recv_buffer_size; + ///< If buffer_size is too small, it costs more CPU time to handle larger number of buffers. + ///< If buffer_size is too large, the space larger than the transaction length is left blank but still counts a buffer, and the buffers are easily run out. + ///< Should be set according to length of data really transferred. + ///< All data that do not fully fill a buffer is still counted as one buffer. E.g. 10 bytes data costs 2 buffers if the size is 8 bytes per buffer. + ///< Buffer size of the slave pre-defined between host and slave before communication. All receive buffer given to the driver should be larger than this. + sdio_event_cb_t event_cb; ///< when the host interrupts slave, this callback will be called with interrupt number (0-7). + uint32_t flags; ///< Features to be enabled for the slave, combinations of ``SDIO_SLAVE_FLAG_*``. +#define SDIO_SLAVE_FLAG_DAT2_DISABLED BIT(0) /**< It is required by the SD specification that all 4 data + lines should be used and pulled up even in 1-bit mode or SPI mode. However, as a feature, the user can specify + this flag to make use of DAT2 pin in 1-bit mode. Note that the host cannot read CCCR registers to know we don't + support 4-bit mode anymore, please do this at your own risk. + */ +#define SDIO_SLAVE_FLAG_HOST_INTR_DISABLED BIT(1) /**< The DAT1 line is used as the interrupt line in SDIO + protocol. However, as a feature, the user can specify this flag to make use of DAT1 pin of the slave in 1-bit + mode. Note that the host has to do polling to the interrupt registers to know whether there are interrupts from + the slave. And it cannot read CCCR registers to know we don't support 4-bit mode anymore, please do this at + your own risk. + */ +#define SDIO_SLAVE_FLAG_INTERNAL_PULLUP BIT(2) /**< Enable internal pullups for enabled pins. It is required + by the SD specification that all the 4 data lines should be pulled up even in 1-bit mode or SPI mode. Note that + the internal pull-ups are not sufficient for stable communication, please do connect external pull-ups on the + bus. This is only for example and debug use. + */ +} sdio_slave_config_t; + +/** Handle of a receive buffer, register a handle by calling ``sdio_slave_recv_register_buf``. Use the handle to load the buffer to the + * driver, or call ``sdio_slave_recv_unregister_buf`` if it is no longer used. + */ +typedef void *sdio_slave_buf_handle_t; + +/** Initialize the sdio slave driver + * + * @param config Configuration of the sdio slave driver. + * + * @return + * - ESP_ERR_NOT_FOUND if no free interrupt found. + * - ESP_ERR_INVALID_STATE if already initialized. + * - ESP_ERR_NO_MEM if fail due to memory allocation failed. + * - ESP_OK if success + */ +esp_err_t sdio_slave_initialize(sdio_slave_config_t *config); + +/** De-initialize the sdio slave driver to release the resources. + */ +void sdio_slave_deinit(void); + +/** Start hardware for sending and receiving, as well as set the IOREADY1 to 1. + * + * @note The driver will continue sending from previous data and PKT_LEN counting, keep data received as well as start receiving from current TOKEN1 counting. + * See ``sdio_slave_reset``. + * + * @return + * - ESP_ERR_INVALID_STATE if already started. + * - ESP_OK otherwise. + */ +esp_err_t sdio_slave_start(void); + +/** Stop hardware from sending and receiving, also set IOREADY1 to 0. + * + * @note this will not clear the data already in the driver, and also not reset the PKT_LEN and TOKEN1 counting. Call ``sdio_slave_reset`` to do that. + */ +void sdio_slave_stop(void); + +/** Clear the data still in the driver, as well as reset the PKT_LEN and TOKEN1 counting. + * + * @return always return ESP_OK. + */ +esp_err_t sdio_slave_reset(void); + +/*--------------------------------------------------------------------------- + * Receive + *--------------------------------------------------------------------------*/ +/** Register buffer used for receiving. All buffers should be registered before used, and then can be used (again) in the driver by the handle returned. + * + * @param start The start address of the buffer. + * + * @note The driver will use and only use the amount of space specified in the `recv_buffer_size` member set in the `sdio_slave_config_t`. + * All buffers should be larger than that. The buffer is used by the DMA, so it should be DMA capable and 32-bit aligned. + * + * @return The buffer handle if success, otherwise NULL. + */ +sdio_slave_buf_handle_t sdio_slave_recv_register_buf(uint8_t *start); + +/** Unregister buffer from driver, and free the space used by the descriptor pointing to the buffer. + * + * @param handle Handle to the buffer to release. + * + * @return ESP_OK if success, ESP_ERR_INVALID_ARG if the handle is NULL or the buffer is being used. + */ +esp_err_t sdio_slave_recv_unregister_buf(sdio_slave_buf_handle_t handle); + +/** Load buffer to the queue waiting to receive data. The driver takes ownership of the buffer until the buffer is returned by + * ``sdio_slave_send_get_finished`` after the transaction is finished. + * + * @param handle Handle to the buffer ready to receive data. + * + * @return + * - ESP_ERR_INVALID_ARG if invalid handle or the buffer is already in the queue. Only after the buffer is returened by + * ``sdio_slave_recv`` can you load it again. + * - ESP_OK if success + */ +esp_err_t sdio_slave_recv_load_buf(sdio_slave_buf_handle_t handle); + +/** Get received data if exist. The driver returns the ownership of the buffer to the app. + * + * @param handle_ret Handle to the buffer holding received data. Use this handle in ``sdio_slave_recv_load_buf`` to receive in the same buffer again. + * @param[out] out_addr Output of the start address, set to NULL if not needed. + * @param[out] out_len Actual length of the data in the buffer, set to NULL if not needed. + * @param wait Time to wait before data received. + * + * @note Call ``sdio_slave_load_buf`` with the handle to re-load the buffer onto the link list, and receive with the same buffer again. + * The address and length of the buffer got here is the same as got from `sdio_slave_get_buffer`. + * + * @return + * - ESP_ERR_INVALID_ARG if handle_ret is NULL + * - ESP_ERR_TIMEOUT if timeout before receiving new data + * - ESP_OK if success + */ +esp_err_t sdio_slave_recv(sdio_slave_buf_handle_t* handle_ret, uint8_t **out_addr, size_t *out_len, TickType_t wait); + +/** Retrieve the buffer corresponding to a handle. + * + * @param handle Handle to get the buffer. + * @param len_o Output of buffer length + * + * @return buffer address if success, otherwise NULL. + */ +uint8_t* sdio_slave_recv_get_buf(sdio_slave_buf_handle_t handle, size_t *len_o); + +/*--------------------------------------------------------------------------- + * Send + *--------------------------------------------------------------------------*/ +/** Put a new sending transfer into the send queue. The driver takes ownership of the buffer until the buffer is returned by + * ``sdio_slave_send_get_finished`` after the transaction is finished. + * + * @param addr Address for data to be sent. The buffer should be DMA capable and 32-bit aligned. + * @param len Length of the data, should not be longer than 4092 bytes (may support longer in the future). + * @param arg Argument to returned in ``sdio_slave_send_get_finished``. The argument can be used to indicate which transaction is done, + * or as a parameter for a callback. Set to NULL if not needed. + * @param wait Time to wait if the buffer is full. + * + * @return + * - ESP_ERR_INVALID_ARG if the length is not greater than 0. + * - ESP_ERR_TIMEOUT if the queue is still full until timeout. + * - ESP_OK if success. + */ +esp_err_t sdio_slave_send_queue(uint8_t* addr, size_t len, void* arg, TickType_t wait); + +/** Return the ownership of a finished transaction. + * @param out_arg Argument of the finished transaction. Set to NULL if unused. + * @param wait Time to wait if there's no finished sending transaction. + * + * @return ESP_ERR_TIMEOUT if no transaction finished, or ESP_OK if succeed. + */ +esp_err_t sdio_slave_send_get_finished(void** out_arg, TickType_t wait); + +/** Start a new sending transfer, and wait for it (blocked) to be finished. + * + * @param addr Start address of the buffer to send + * @param len Length of buffer to send. + * + * @return + * - ESP_ERR_INVALID_ARG if the length of descriptor is not greater than 0. + * - ESP_ERR_TIMEOUT if the queue is full or host do not start a transfer before timeout. + * - ESP_OK if success. + */ +esp_err_t sdio_slave_transmit(uint8_t* addr, size_t len); + +/*--------------------------------------------------------------------------- + * Host + *--------------------------------------------------------------------------*/ +/** Read the spi slave register shared with host. + * + * @param pos register address, 0-27 or 32-63. + * + * @note register 28 to 31 are reserved for interrupt vector. + * + * @return value of the register. + */ +uint8_t sdio_slave_read_reg(int pos); + +/** Write the spi slave register shared with host. + * + * @param pos register address, 0-11, 14-15, 18-19, 24-27 and 32-63, other address are reserved. + * @param reg the value to write. + * + * @note register 29 and 31 are used for interrupt vector. + * + * @return ESP_ERR_INVALID_ARG if address wrong, otherwise ESP_OK. + */ +esp_err_t sdio_slave_write_reg(int pos, uint8_t reg); + +/** Get the interrupt enable for host. + * + * @return the interrupt mask. + */ +sdio_slave_hostint_t sdio_slave_get_host_intena(void); + +/** Set the interrupt enable for host. + * + * @param mask Enable mask for host interrupt. + */ +void sdio_slave_set_host_intena(sdio_slave_hostint_t mask); + +/** Interrupt the host by general purpose interrupt. + * + * @param pos Interrupt num, 0-7. + * + * @return + * - ESP_ERR_INVALID_ARG if interrupt num error + * - ESP_OK otherwise + */ +esp_err_t sdio_slave_send_host_int(uint8_t pos); + +/** Clear general purpose interrupt to host. + * + * @param mask Interrupt bits to clear, by bit mask. + */ +void sdio_slave_clear_host_int(sdio_slave_hostint_t mask); + +/** Wait for general purpose interrupt from host. + * + * @param pos Interrupt source number to wait for. + * is set. + * @param wait Time to wait before interrupt triggered. + * + * @note this clears the interrupt at the same time. + * + * @return ESP_OK if success, ESP_ERR_TIMEOUT if timeout. + */ +esp_err_t sdio_slave_wait_int(int pos, TickType_t wait); + + +#ifdef __cplusplus +} +#endif + +#endif /*_DRIVER_SDIO_SLAVE_H */ + + diff --git a/arch/xtensa/include/esp32/driver/include/driver/sdmmc_defs.h b/arch/xtensa/include/esp32/driver/include/driver/sdmmc_defs.h new file mode 100644 index 0000000000000..4f1e6ddc6b73e --- /dev/null +++ b/arch/xtensa/include/esp32/driver/include/driver/sdmmc_defs.h @@ -0,0 +1,484 @@ +/* + * Copyright (c) 2006 Uwe Stuehler + * Adaptations to ESP-IDF Copyright (c) 2016 Espressif Systems (Shanghai) PTE LTD + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef _SDMMC_DEFS_H_ +#define _SDMMC_DEFS_H_ + +#include +#include + +/* MMC commands */ /* response type */ +#define MMC_GO_IDLE_STATE 0 /* R0 */ +#define MMC_SEND_OP_COND 1 /* R3 */ +#define MMC_ALL_SEND_CID 2 /* R2 */ +#define MMC_SET_RELATIVE_ADDR 3 /* R1 */ +#define MMC_SWITCH 6 /* R1B */ +#define MMC_SELECT_CARD 7 /* R1 */ +#define MMC_SEND_EXT_CSD 8 /* R1 */ +#define MMC_SEND_CSD 9 /* R2 */ +#define MMC_SEND_CID 10 /* R1 */ +#define MMC_READ_DAT_UNTIL_STOP 11 /* R1 */ +#define MMC_STOP_TRANSMISSION 12 /* R1B */ +#define MMC_SEND_STATUS 13 /* R1 */ +#define MMC_SET_BLOCKLEN 16 /* R1 */ +#define MMC_READ_BLOCK_SINGLE 17 /* R1 */ +#define MMC_READ_BLOCK_MULTIPLE 18 /* R1 */ +#define MMC_WRITE_DAT_UNTIL_STOP 20 /* R1 */ +#define MMC_SET_BLOCK_COUNT 23 /* R1 */ +#define MMC_WRITE_BLOCK_SINGLE 24 /* R1 */ +#define MMC_WRITE_BLOCK_MULTIPLE 25 /* R1 */ +#define MMC_APP_CMD 55 /* R1 */ + +/* SD commands */ /* response type */ +#define SD_SEND_RELATIVE_ADDR 3 /* R6 */ +#define SD_SEND_SWITCH_FUNC 6 /* R1 */ +#define SD_SEND_IF_COND 8 /* R7 */ +#define SD_READ_OCR 58 /* R3 */ +#define SD_CRC_ON_OFF 59 /* R1 */ + +/* SD application commands */ /* response type */ +#define SD_APP_SET_BUS_WIDTH 6 /* R1 */ +#define SD_APP_SD_STATUS 13 /* R2 */ +#define SD_APP_OP_COND 41 /* R3 */ +#define SD_APP_SEND_SCR 51 /* R1 */ + +/* SD IO commands */ +#define SD_IO_SEND_OP_COND 5 /* R4 */ +#define SD_IO_RW_DIRECT 52 /* R5 */ +#define SD_IO_RW_EXTENDED 53 /* R5 */ + + +/* OCR bits */ +#define MMC_OCR_MEM_READY (1<<31) /* memory power-up status bit */ +#define MMC_OCR_ACCESS_MODE_MASK 0x60000000 /* bits 30:29 */ +#define MMC_OCR_SECTOR_MODE (1<<30) +#define MMC_OCR_BYTE_MODE (1<<29) +#define MMC_OCR_3_5V_3_6V (1<<23) +#define MMC_OCR_3_4V_3_5V (1<<22) +#define MMC_OCR_3_3V_3_4V (1<<21) +#define MMC_OCR_3_2V_3_3V (1<<20) +#define MMC_OCR_3_1V_3_2V (1<<19) +#define MMC_OCR_3_0V_3_1V (1<<18) +#define MMC_OCR_2_9V_3_0V (1<<17) +#define MMC_OCR_2_8V_2_9V (1<<16) +#define MMC_OCR_2_7V_2_8V (1<<15) +#define MMC_OCR_2_6V_2_7V (1<<14) +#define MMC_OCR_2_5V_2_6V (1<<13) +#define MMC_OCR_2_4V_2_5V (1<<12) +#define MMC_OCR_2_3V_2_4V (1<<11) +#define MMC_OCR_2_2V_2_3V (1<<10) +#define MMC_OCR_2_1V_2_2V (1<<9) +#define MMC_OCR_2_0V_2_1V (1<<8) +#define MMC_OCR_1_65V_1_95V (1<<7) + +#define SD_OCR_SDHC_CAP (1<<30) +#define SD_OCR_VOL_MASK 0xFF8000 /* bits 23:15 */ + +/* SD mode R1 response type bits */ +#define MMC_R1_READY_FOR_DATA (1<<8) /* ready for next transfer */ +#define MMC_R1_APP_CMD (1<<5) /* app. commands supported */ +#define MMC_R1_SWITCH_ERROR (1<<7) /* switch command did not succeed */ + +/* SPI mode R1 response type bits */ +#define SD_SPI_R1_IDLE_STATE (1<<0) +#define SD_SPI_R1_ERASE_RST (1<<1) +#define SD_SPI_R1_ILLEGAL_CMD (1<<2) +#define SD_SPI_R1_CMD_CRC_ERR (1<<3) +#define SD_SPI_R1_ERASE_SEQ_ERR (1<<4) +#define SD_SPI_R1_ADDR_ERR (1<<5) +#define SD_SPI_R1_PARAM_ERR (1<<6) +#define SD_SPI_R1_NO_RESPONSE (1<<7) + +#define SDIO_R1_FUNC_NUM_ERR (1<<4) + +/* 48-bit response decoding (32 bits w/o CRC) */ +#define MMC_R1(resp) ((resp)[0]) +#define MMC_R3(resp) ((resp)[0]) +#define MMC_R4(resp) ((resp)[0]) +#define MMC_R5(resp) ((resp)[0]) +#define SD_R6(resp) ((resp)[0]) +#define MMC_R1_CURRENT_STATE(resp) (((resp)[0] >> 9) & 0xf) + +/* SPI mode response decoding */ +#define SD_SPI_R1(resp) ((resp)[0] & 0xff) +#define SD_SPI_R2(resp) ((resp)[0] & 0xffff) +#define SD_SPI_R3(resp) ((resp)[0]) +#define SD_SPI_R7(resp) ((resp)[0]) + +/* SPI mode data response decoding */ +#define SD_SPI_DATA_RSP_VALID(resp_byte) (((resp_byte)&0x11)==0x1) +#define SD_SPI_DATA_RSP(resp_byte) (((resp_byte)>>1)&0x7) +#define SD_SPI_DATA_ACCEPTED 0x2 +#define SD_SPI_DATA_CRC_ERROR 0x5 +#define SD_SPI_DATA_WR_ERROR 0x6 + +/* RCA argument and response */ +#define MMC_ARG_RCA(rca) ((rca) << 16) +#define SD_R6_RCA(resp) (SD_R6((resp)) >> 16) + +/* bus width argument */ +#define SD_ARG_BUS_WIDTH_1 0 +#define SD_ARG_BUS_WIDTH_4 2 + +/* EXT_CSD fields */ +#define EXT_CSD_BUS_WIDTH 183 /* WO */ +#define EXT_CSD_HS_TIMING 185 /* R/W */ +#define EXT_CSD_REV 192 /* RO */ +#define EXT_CSD_STRUCTURE 194 /* RO */ +#define EXT_CSD_CARD_TYPE 196 /* RO */ +#define EXT_CSD_SEC_COUNT 212 /* RO */ +#define EXT_CSD_PWR_CL_26_360 203 /* RO */ +#define EXT_CSD_PWR_CL_52_360 202 /* RO */ +#define EXT_CSD_PWR_CL_26_195 201 /* RO */ +#define EXT_CSD_PWR_CL_52_195 200 /* RO */ +#define EXT_CSD_POWER_CLASS 187 /* R/W */ +#define EXT_CSD_CMD_SET 191 /* R/W */ +#define EXT_CSD_S_CMD_SET 504 /* RO */ + +/* EXT_CSD field definitions */ +#define EXT_CSD_CMD_SET_NORMAL (1U << 0) +#define EXT_CSD_CMD_SET_SECURE (1U << 1) +#define EXT_CSD_CMD_SET_CPSECURE (1U << 2) + +/* EXT_CSD_HS_TIMING */ +#define EXT_CSD_HS_TIMING_BC 0 +#define EXT_CSD_HS_TIMING_HS 1 +#define EXT_CSD_HS_TIMING_HS200 2 +#define EXT_CSD_HS_TIMING_HS400 3 + +/* EXT_CSD_BUS_WIDTH */ +#define EXT_CSD_BUS_WIDTH_1 0 +#define EXT_CSD_BUS_WIDTH_4 1 +#define EXT_CSD_BUS_WIDTH_8 2 +#define EXT_CSD_BUS_WIDTH_4_DDR 5 +#define EXT_CSD_BUS_WIDTH_8_DDR 6 + +/* EXT_CSD_CARD_TYPE */ +/* The only currently valid values for this field are 0x01, 0x03, 0x07, + * 0x0B and 0x0F. */ +#define EXT_CSD_CARD_TYPE_F_26M (1 << 0) /* SDR at "rated voltages */ +#define EXT_CSD_CARD_TYPE_F_52M (1 << 1) /* SDR at "rated voltages */ +#define EXT_CSD_CARD_TYPE_F_52M_1_8V (1 << 2) /* DDR, 1.8V or 3.3V I/O */ +#define EXT_CSD_CARD_TYPE_F_52M_1_2V (1 << 3) /* DDR, 1.2V I/O */ +#define EXT_CSD_CARD_TYPE_26M 0x01 +#define EXT_CSD_CARD_TYPE_52M 0x03 +#define EXT_CSD_CARD_TYPE_52M_V18 0x07 +#define EXT_CSD_CARD_TYPE_52M_V12 0x0b +#define EXT_CSD_CARD_TYPE_52M_V12_18 0x0f + +/* EXT_CSD MMC */ +#define EXT_CSD_MMC_SIZE 512 + +/* MMC_SWITCH access mode */ +#define MMC_SWITCH_MODE_CMD_SET 0x00 /* Change the command set */ +#define MMC_SWITCH_MODE_SET_BITS 0x01 /* Set bits in value */ +#define MMC_SWITCH_MODE_CLEAR_BITS 0x02 /* Clear bits in value */ +#define MMC_SWITCH_MODE_WRITE_BYTE 0x03 /* Set target to value */ + +/* MMC R2 response (CSD) */ +#define MMC_CSD_CSDVER(resp) MMC_RSP_BITS((resp), 126, 2) +#define MMC_CSD_CSDVER_1_0 1 +#define MMC_CSD_CSDVER_2_0 2 +#define MMC_CSD_CSDVER_EXT_CSD 3 +#define MMC_CSD_MMCVER(resp) MMC_RSP_BITS((resp), 122, 4) +#define MMC_CSD_MMCVER_1_0 0 /* MMC 1.0 - 1.2 */ +#define MMC_CSD_MMCVER_1_4 1 /* MMC 1.4 */ +#define MMC_CSD_MMCVER_2_0 2 /* MMC 2.0 - 2.2 */ +#define MMC_CSD_MMCVER_3_1 3 /* MMC 3.1 - 3.3 */ +#define MMC_CSD_MMCVER_4_0 4 /* MMC 4 */ +#define MMC_CSD_READ_BL_LEN(resp) MMC_RSP_BITS((resp), 80, 4) +#define MMC_CSD_C_SIZE(resp) MMC_RSP_BITS((resp), 62, 12) +#define MMC_CSD_CAPACITY(resp) ((MMC_CSD_C_SIZE((resp))+1) << \ + (MMC_CSD_C_SIZE_MULT((resp))+2)) +#define MMC_CSD_C_SIZE_MULT(resp) MMC_RSP_BITS((resp), 47, 3) + +/* MMC v1 R2 response (CID) */ +#define MMC_CID_MID_V1(resp) MMC_RSP_BITS((resp), 104, 24) +#define MMC_CID_PNM_V1_CPY(resp, pnm) \ + do { \ + (pnm)[0] = MMC_RSP_BITS((resp), 96, 8); \ + (pnm)[1] = MMC_RSP_BITS((resp), 88, 8); \ + (pnm)[2] = MMC_RSP_BITS((resp), 80, 8); \ + (pnm)[3] = MMC_RSP_BITS((resp), 72, 8); \ + (pnm)[4] = MMC_RSP_BITS((resp), 64, 8); \ + (pnm)[5] = MMC_RSP_BITS((resp), 56, 8); \ + (pnm)[6] = MMC_RSP_BITS((resp), 48, 8); \ + (pnm)[7] = '\0'; \ + } while (0) +#define MMC_CID_REV_V1(resp) MMC_RSP_BITS((resp), 40, 8) +#define MMC_CID_PSN_V1(resp) MMC_RSP_BITS((resp), 16, 24) +#define MMC_CID_MDT_V1(resp) MMC_RSP_BITS((resp), 8, 8) + +/* MMC v2 R2 response (CID) */ +#define MMC_CID_MID_V2(resp) MMC_RSP_BITS((resp), 120, 8) +#define MMC_CID_OID_V2(resp) MMC_RSP_BITS((resp), 104, 16) +#define MMC_CID_PNM_V2_CPY(resp, pnm) \ + do { \ + (pnm)[0] = MMC_RSP_BITS((resp), 96, 8); \ + (pnm)[1] = MMC_RSP_BITS((resp), 88, 8); \ + (pnm)[2] = MMC_RSP_BITS((resp), 80, 8); \ + (pnm)[3] = MMC_RSP_BITS((resp), 72, 8); \ + (pnm)[4] = MMC_RSP_BITS((resp), 64, 8); \ + (pnm)[5] = MMC_RSP_BITS((resp), 56, 8); \ + (pnm)[6] = '\0'; \ + } while (0) +#define MMC_CID_PSN_V2(resp) MMC_RSP_BITS((resp), 16, 32) + +/* SD R2 response (CSD) */ +#define SD_CSD_CSDVER(resp) MMC_RSP_BITS((resp), 126, 2) +#define SD_CSD_CSDVER_1_0 0 +#define SD_CSD_CSDVER_2_0 1 +#define SD_CSD_TAAC(resp) MMC_RSP_BITS((resp), 112, 8) +#define SD_CSD_TAAC_1_5_MSEC 0x26 +#define SD_CSD_NSAC(resp) MMC_RSP_BITS((resp), 104, 8) +#define SD_CSD_SPEED(resp) MMC_RSP_BITS((resp), 96, 8) +#define SD_CSD_SPEED_25_MHZ 0x32 +#define SD_CSD_SPEED_50_MHZ 0x5a +#define SD_CSD_CCC(resp) MMC_RSP_BITS((resp), 84, 12) +#define SD_CSD_CCC_BASIC (1 << 0) /* basic */ +#define SD_CSD_CCC_BR (1 << 2) /* block read */ +#define SD_CSD_CCC_BW (1 << 4) /* block write */ +#define SD_CSD_CCC_ERASE (1 << 5) /* erase */ +#define SD_CSD_CCC_WP (1 << 6) /* write protection */ +#define SD_CSD_CCC_LC (1 << 7) /* lock card */ +#define SD_CSD_CCC_AS (1 << 8) /*application specific*/ +#define SD_CSD_CCC_IOM (1 << 9) /* I/O mode */ +#define SD_CSD_CCC_SWITCH (1 << 10) /* switch */ +#define SD_CSD_READ_BL_LEN(resp) MMC_RSP_BITS((resp), 80, 4) +#define SD_CSD_READ_BL_PARTIAL(resp) MMC_RSP_BITS((resp), 79, 1) +#define SD_CSD_WRITE_BLK_MISALIGN(resp) MMC_RSP_BITS((resp), 78, 1) +#define SD_CSD_READ_BLK_MISALIGN(resp) MMC_RSP_BITS((resp), 77, 1) +#define SD_CSD_DSR_IMP(resp) MMC_RSP_BITS((resp), 76, 1) +#define SD_CSD_C_SIZE(resp) MMC_RSP_BITS((resp), 62, 12) +#define SD_CSD_CAPACITY(resp) ((SD_CSD_C_SIZE((resp))+1) << \ + (SD_CSD_C_SIZE_MULT((resp))+2)) +#define SD_CSD_V2_C_SIZE(resp) MMC_RSP_BITS((resp), 48, 22) +#define SD_CSD_V2_CAPACITY(resp) ((SD_CSD_V2_C_SIZE((resp))+1) << 10) +#define SD_CSD_V2_BL_LEN 0x9 /* 512 */ +#define SD_CSD_VDD_R_CURR_MIN(resp) MMC_RSP_BITS((resp), 59, 3) +#define SD_CSD_VDD_R_CURR_MAX(resp) MMC_RSP_BITS((resp), 56, 3) +#define SD_CSD_VDD_W_CURR_MIN(resp) MMC_RSP_BITS((resp), 53, 3) +#define SD_CSD_VDD_W_CURR_MAX(resp) MMC_RSP_BITS((resp), 50, 3) +#define SD_CSD_VDD_RW_CURR_100mA 0x7 +#define SD_CSD_VDD_RW_CURR_80mA 0x6 +#define SD_CSD_C_SIZE_MULT(resp) MMC_RSP_BITS((resp), 47, 3) +#define SD_CSD_ERASE_BLK_EN(resp) MMC_RSP_BITS((resp), 46, 1) +#define SD_CSD_SECTOR_SIZE(resp) MMC_RSP_BITS((resp), 39, 7) /* +1 */ +#define SD_CSD_WP_GRP_SIZE(resp) MMC_RSP_BITS((resp), 32, 7) /* +1 */ +#define SD_CSD_WP_GRP_ENABLE(resp) MMC_RSP_BITS((resp), 31, 1) +#define SD_CSD_R2W_FACTOR(resp) MMC_RSP_BITS((resp), 26, 3) +#define SD_CSD_WRITE_BL_LEN(resp) MMC_RSP_BITS((resp), 22, 4) +#define SD_CSD_RW_BL_LEN_2G 0xa +#define SD_CSD_RW_BL_LEN_1G 0x9 +#define SD_CSD_WRITE_BL_PARTIAL(resp) MMC_RSP_BITS((resp), 21, 1) +#define SD_CSD_FILE_FORMAT_GRP(resp) MMC_RSP_BITS((resp), 15, 1) +#define SD_CSD_COPY(resp) MMC_RSP_BITS((resp), 14, 1) +#define SD_CSD_PERM_WRITE_PROTECT(resp) MMC_RSP_BITS((resp), 13, 1) +#define SD_CSD_TMP_WRITE_PROTECT(resp) MMC_RSP_BITS((resp), 12, 1) +#define SD_CSD_FILE_FORMAT(resp) MMC_RSP_BITS((resp), 10, 2) + +/* SD R2 response (CID) */ +#define SD_CID_MID(resp) MMC_RSP_BITS((resp), 120, 8) +#define SD_CID_OID(resp) MMC_RSP_BITS((resp), 104, 16) +#define SD_CID_PNM_CPY(resp, pnm) \ + do { \ + (pnm)[0] = MMC_RSP_BITS((resp), 96, 8); \ + (pnm)[1] = MMC_RSP_BITS((resp), 88, 8); \ + (pnm)[2] = MMC_RSP_BITS((resp), 80, 8); \ + (pnm)[3] = MMC_RSP_BITS((resp), 72, 8); \ + (pnm)[4] = MMC_RSP_BITS((resp), 64, 8); \ + (pnm)[5] = '\0'; \ + } while (0) +#define SD_CID_REV(resp) MMC_RSP_BITS((resp), 56, 8) +#define SD_CID_PSN(resp) MMC_RSP_BITS((resp), 24, 32) +#define SD_CID_MDT(resp) MMC_RSP_BITS((resp), 8, 12) + +/* SCR (SD Configuration Register) */ +#define SCR_STRUCTURE(scr) MMC_RSP_BITS((scr), 60, 4) +#define SCR_STRUCTURE_VER_1_0 0 /* Version 1.0 */ +#define SCR_SD_SPEC(scr) MMC_RSP_BITS((scr), 56, 4) +#define SCR_SD_SPEC_VER_1_0 0 /* Version 1.0 and 1.01 */ +#define SCR_SD_SPEC_VER_1_10 1 /* Version 1.10 */ +#define SCR_SD_SPEC_VER_2 2 /* Version 2.00 or Version 3.0X */ +#define SCR_DATA_STAT_AFTER_ERASE(scr) MMC_RSP_BITS((scr), 55, 1) +#define SCR_SD_SECURITY(scr) MMC_RSP_BITS((scr), 52, 3) +#define SCR_SD_SECURITY_NONE 0 /* no security */ +#define SCR_SD_SECURITY_1_0 1 /* security protocol 1.0 */ +#define SCR_SD_SECURITY_1_0_2 2 /* security protocol 1.0 */ +#define SCR_SD_BUS_WIDTHS(scr) MMC_RSP_BITS((scr), 48, 4) +#define SCR_SD_BUS_WIDTHS_1BIT (1 << 0) /* 1bit (DAT0) */ +#define SCR_SD_BUS_WIDTHS_4BIT (1 << 2) /* 4bit (DAT0-3) */ +#define SCR_SD_SPEC3(scr) MMC_RSP_BITS((scr), 47, 1) +#define SCR_EX_SECURITY(scr) MMC_RSP_BITS((scr), 43, 4) +#define SCR_SD_SPEC4(scr) MMC_RSP_BITS((scr), 42, 1) +#define SCR_RESERVED(scr) MMC_RSP_BITS((scr), 34, 8) +#define SCR_CMD_SUPPORT_CMD23(scr) MMC_RSP_BITS((scr), 33, 1) +#define SCR_CMD_SUPPORT_CMD20(scr) MMC_RSP_BITS((scr), 32, 1) +#define SCR_RESERVED2(scr) MMC_RSP_BITS((scr), 0, 32) + +/* Max supply current in SWITCH_FUNC response (in mA) */ +#define SD_SFUNC_I_MAX(status) (MMC_RSP_BITS((uint32_t *)(status), 496, 16)) + +/* Supported flags in SWITCH_FUNC response */ +#define SD_SFUNC_SUPPORTED(status, group) \ + (MMC_RSP_BITS((uint32_t *)(status), 400 + (group - 1) * 16, 16)) + +/* Selected function in SWITCH_FUNC response */ +#define SD_SFUNC_SELECTED(status, group) \ + (MMC_RSP_BITS((uint32_t *)(status), 376 + (group - 1) * 4, 4)) + +/* Busy flags in SWITCH_FUNC response */ +#define SD_SFUNC_BUSY(status, group) \ + (MMC_RSP_BITS((uint32_t *)(status), 272 + (group - 1) * 16, 16)) + +/* Version of SWITCH_FUNC response */ +#define SD_SFUNC_VER(status) (MMC_RSP_BITS((uint32_t *)(status), 368, 8)) + +#define SD_SFUNC_GROUP_MAX 6 +#define SD_SFUNC_FUNC_MAX 15 + +#define SD_ACCESS_MODE 1 /* Function group 1, Access Mode */ + +#define SD_ACCESS_MODE_SDR12 0 /* 25 MHz clock */ +#define SD_ACCESS_MODE_SDR25 1 /* 50 MHz clock */ +#define SD_ACCESS_MODE_SDR50 2 /* UHS-I, 100 MHz clock */ +#define SD_ACCESS_MODE_SDR104 3 /* UHS-I, 208 MHz clock */ +#define SD_ACCESS_MODE_DDR50 4 /* UHS-I, 50 MHz clock, DDR */ + +/** + * @brief Extract up to 32 sequential bits from an array of 32-bit words + * + * Bits within the word are numbered in the increasing order from LSB to MSB. + * + * As an example, consider 2 32-bit words: + * + * 0x01234567 0x89abcdef + * + * On a little-endian system, the bytes are stored in memory as follows: + * + * 67 45 23 01 ef cd ab 89 + * + * MMC_RSP_BITS will extact bits as follows: + * + * start=0 len=4 -> result=0x00000007 + * start=0 len=12 -> result=0x00000567 + * start=28 len=8 -> result=0x000000f0 + * start=59 len=5 -> result=0x00000011 + * + * @param src array of words to extract bits from + * @param start index of the first bit to extract + * @param len number of bits to extract, 1 to 32 + * @return 32-bit word where requested bits start from LSB + */ +static inline uint32_t MMC_RSP_BITS(uint32_t *src, int start, int len) +{ + uint32_t mask = (len % 32 == 0) ? UINT_MAX : UINT_MAX >> (32 - (len % 32)); + size_t word = start / 32; + size_t shift = start % 32; + uint32_t right = src[word] >> shift; + uint32_t left = (len + shift <= 32) ? 0 : src[word + 1] << ((32 - shift) % 32); + return (left | right) & mask; +} + +/* SD R4 response (IO OCR) */ +#define SD_IO_OCR_MEM_READY (1<<31) +#define SD_IO_OCR_NUM_FUNCTIONS(ocr) (((ocr) >> 28) & 0x7) +#define SD_IO_OCR_MEM_PRESENT (1<<27) +#define SD_IO_OCR_MASK 0x00fffff0 + +/* CMD52 arguments */ +#define SD_ARG_CMD52_READ (0<<31) +#define SD_ARG_CMD52_WRITE (1<<31) +#define SD_ARG_CMD52_FUNC_SHIFT 28 +#define SD_ARG_CMD52_FUNC_MASK 0x7 +#define SD_ARG_CMD52_EXCHANGE (1<<27) +#define SD_ARG_CMD52_REG_SHIFT 9 +#define SD_ARG_CMD52_REG_MASK 0x1ffff +#define SD_ARG_CMD52_DATA_SHIFT 0 +#define SD_ARG_CMD52_DATA_MASK 0xff +#define SD_R5_DATA(resp) ((resp)[0] & 0xff) + +/* CMD53 arguments */ +#define SD_ARG_CMD53_READ (0<<31) +#define SD_ARG_CMD53_WRITE (1<<31) +#define SD_ARG_CMD53_FUNC_SHIFT 28 +#define SD_ARG_CMD53_FUNC_MASK 0x7 +#define SD_ARG_CMD53_BLOCK_MODE (1<<27) +#define SD_ARG_CMD53_INCREMENT (1<<26) +#define SD_ARG_CMD53_REG_SHIFT 9 +#define SD_ARG_CMD53_REG_MASK 0x1ffff +#define SD_ARG_CMD53_LENGTH_SHIFT 0 +#define SD_ARG_CMD53_LENGTH_MASK 0x1ff +#define SD_ARG_CMD53_LENGTH_MAX 512 + +/* Card Common Control Registers (CCCR) */ +#define SD_IO_CCCR_START 0x00000 +#define SD_IO_CCCR_SIZE 0x100 +#define SD_IO_CCCR_FN_ENABLE 0x02 +#define SD_IO_CCCR_FN_READY 0x03 +#define SD_IO_CCCR_INT_ENABLE 0x04 +#define SD_IO_CCCR_INT_PENDING 0x05 +#define SD_IO_CCCR_CTL 0x06 +#define CCCR_CTL_RES (1<<3) +#define SD_IO_CCCR_BUS_WIDTH 0x07 +#define CCCR_BUS_WIDTH_1 (0<<0) +#define CCCR_BUS_WIDTH_4 (2<<0) +#define CCCR_BUS_WIDTH_8 (3<<0) +#define CCCR_BUS_WIDTH_ECSI (1<<5) +#define SD_IO_CCCR_CARD_CAP 0x08 +#define CCCR_CARD_CAP_LSC BIT(6) +#define CCCR_CARD_CAP_4BLS BIT(7) +#define SD_IO_CCCR_CISPTR 0x09 +#define SD_IO_CCCR_BLKSIZEL 0x10 +#define SD_IO_CCCR_BLKSIZEH 0x11 +#define SD_IO_CCCR_HIGHSPEED 0x13 +#define CCCR_HIGHSPEED_SUPPORT BIT(0) +#define CCCR_HIGHSPEED_ENABLE BIT(1) + +/* Function Basic Registers (FBR) */ +#define SD_IO_FBR_START 0x00100 +#define SD_IO_FBR_SIZE 0x00700 + +/* Card Information Structure (CIS) */ +#define SD_IO_CIS_START 0x01000 +#define SD_IO_CIS_SIZE 0x17000 + +/* CIS tuple codes (based on PC Card 16) */ +#define CISTPL_CODE_NULL 0x00 +#define CISTPL_CODE_DEVICE 0x01 +#define CISTPL_CODE_CHKSUM 0x10 +#define CISTPL_CODE_VERS1 0x15 +#define CISTPL_CODE_ALTSTR 0x16 +#define CISTPL_CODE_CONFIG 0x1A +#define CISTPL_CODE_CFTABLE_ENTRY 0x1B +#define CISTPL_CODE_MANFID 0x20 +#define CISTPL_CODE_FUNCID 0x21 +#define TPLFID_FUNCTION_SDIO 0x0c +#define CISTPL_CODE_FUNCE 0x22 +#define CISTPL_CODE_VENDER_BEGIN 0x80 +#define CISTPL_CODE_VENDER_END 0x8F +#define CISTPL_CODE_SDIO_STD 0x91 +#define CISTPL_CODE_SDIO_EXT 0x92 +#define CISTPL_CODE_END 0xFF + + +/* Timing */ +#define SDMMC_TIMING_LEGACY 0 +#define SDMMC_TIMING_HIGHSPEED 1 +#define SDMMC_TIMING_MMC_DDR52 2 + +#endif //_SDMMC_DEFS_H_ diff --git a/arch/xtensa/include/esp32/driver/include/driver/sdmmc_host.h b/arch/xtensa/include/esp32/driver/include/driver/sdmmc_host.h new file mode 100644 index 0000000000000..e1d0766a4e9b2 --- /dev/null +++ b/arch/xtensa/include/esp32/driver/include/driver/sdmmc_host.h @@ -0,0 +1,247 @@ +// 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. + +#pragma once + +#include "soc/soc_caps.h" +#ifndef SOC_SDMMC_HOST_SUPPORTED +#error SDMMC host is not supported in this chip target +#endif + +#include +#include +#include "esp_err.h" +#include "sdmmc_types.h" +#include "driver/gpio.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define SDMMC_HOST_SLOT_0 0 ///< SDMMC slot 0 +#define SDMMC_HOST_SLOT_1 1 ///< SDMMC slot 1 + +/** + * @brief Default sdmmc_host_t structure initializer for SDMMC peripheral + * + * Uses SDMMC peripheral, with 4-bit mode enabled, and max frequency set to 20MHz + */ +#define SDMMC_HOST_DEFAULT() {\ + .flags = SDMMC_HOST_FLAG_8BIT | \ + SDMMC_HOST_FLAG_4BIT | \ + SDMMC_HOST_FLAG_1BIT | \ + SDMMC_HOST_FLAG_DDR, \ + .slot = SDMMC_HOST_SLOT_1, \ + .max_freq_khz = SDMMC_FREQ_DEFAULT, \ + .io_voltage = 3.3f, \ + .init = &sdmmc_host_init, \ + .set_bus_width = &sdmmc_host_set_bus_width, \ + .get_bus_width = &sdmmc_host_get_slot_width, \ + .set_bus_ddr_mode = &sdmmc_host_set_bus_ddr_mode, \ + .set_card_clk = &sdmmc_host_set_card_clk, \ + .do_transaction = &sdmmc_host_do_transaction, \ + .deinit = &sdmmc_host_deinit, \ + .io_int_enable = sdmmc_host_io_int_enable, \ + .io_int_wait = sdmmc_host_io_int_wait, \ + .command_timeout_ms = 0, \ +} + +/** + * Extra configuration for SDMMC peripheral slot + */ +typedef struct { + gpio_num_t gpio_cd; ///< GPIO number of card detect signal + gpio_num_t gpio_wp; ///< GPIO number of write protect signal + uint8_t width; ///< Bus width used by the slot (might be less than the max width supported) + uint32_t flags; ///< Features used by this slot +#define SDMMC_SLOT_FLAG_INTERNAL_PULLUP BIT(0) + /**< Enable internal pullups on enabled pins. The internal pullups + are insufficient however, please make sure external pullups are + connected on the bus. This is for debug / example purpose only. + */ +} sdmmc_slot_config_t; + +#define SDMMC_SLOT_NO_CD GPIO_NUM_NC ///< indicates that card detect line is not used +#define SDMMC_SLOT_NO_WP GPIO_NUM_NC ///< indicates that write protect line is not used +#define SDMMC_SLOT_WIDTH_DEFAULT 0 ///< use the default width for the slot (8 for slot 0, 4 for slot 1) + +/** + * Macro defining default configuration of SDMMC host slot + */ +#define SDMMC_SLOT_CONFIG_DEFAULT() {\ + .gpio_cd = SDMMC_SLOT_NO_CD, \ + .gpio_wp = SDMMC_SLOT_NO_WP, \ + .width = SDMMC_SLOT_WIDTH_DEFAULT, \ + .flags = 0, \ +} + +/** + * @brief Initialize SDMMC host peripheral + * + * @note This function is not thread safe + * + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_STATE if sdmmc_host_init was already called + * - ESP_ERR_NO_MEM if memory can not be allocated + */ +esp_err_t sdmmc_host_init(void); + +/** + * @brief Initialize given slot of SDMMC peripheral + * + * On the ESP32, SDMMC peripheral has two slots: + * - Slot 0: 8-bit wide, maps to HS1_* signals in PIN MUX + * - Slot 1: 4-bit wide, maps to HS2_* signals in PIN MUX + * + * Card detect and write protect signals can be routed to + * arbitrary GPIOs using GPIO matrix. + * + * @note This function is not thread safe + * + * @param slot slot number (SDMMC_HOST_SLOT_0 or SDMMC_HOST_SLOT_1) + * @param slot_config additional configuration for the slot + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_STATE if host has not been initialized using sdmmc_host_init + */ +esp_err_t sdmmc_host_init_slot(int slot, const sdmmc_slot_config_t* slot_config); + +/** + * @brief Select bus width to be used for data transfer + * + * SD/MMC card must be initialized prior to this command, and a command to set + * bus width has to be sent to the card (e.g. SD_APP_SET_BUS_WIDTH) + * + * @note This function is not thread safe + * + * @param slot slot number (SDMMC_HOST_SLOT_0 or SDMMC_HOST_SLOT_1) + * @param width bus width (1, 4, or 8 for slot 0; 1 or 4 for slot 1) + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG if slot number or width is not valid + */ +esp_err_t sdmmc_host_set_bus_width(int slot, size_t width); + +/** + * @brief Get bus width configured in ``sdmmc_host_init_slot`` to be used for data transfer + * + * @param slot slot number (SDMMC_HOST_SLOT_0 or SDMMC_HOST_SLOT_1) + * @return configured bus width of the specified slot. + */ +size_t sdmmc_host_get_slot_width(int slot); + +/** + * @brief Set card clock frequency + * + * Currently only integer fractions of 40MHz clock can be used. + * For High Speed cards, 40MHz can be used. + * For Default Speed cards, 20MHz can be used. + * + * @note This function is not thread safe + * + * @param slot slot number (SDMMC_HOST_SLOT_0 or SDMMC_HOST_SLOT_1) + * @param freq_khz card clock frequency, in kHz + * @return + * - ESP_OK on success + * - other error codes may be returned in the future + */ +esp_err_t sdmmc_host_set_card_clk(int slot, uint32_t freq_khz); + +/** + * @brief Enable or disable DDR mode of SD interface + * @param slot slot number (SDMMC_HOST_SLOT_0 or SDMMC_HOST_SLOT_1) + * @param ddr_enabled enable or disable DDR mode + * @return + * - ESP_OK on success + * - ESP_ERR_NOT_SUPPORTED if DDR mode is not supported on this slot + */ +esp_err_t sdmmc_host_set_bus_ddr_mode(int slot, bool ddr_enabled); + +/** + * @brief Send command to the card and get response + * + * This function returns when command is sent and response is received, + * or data is transferred, or timeout occurs. + * + * @note This function is not thread safe w.r.t. init/deinit functions, + * and bus width/clock speed configuration functions. Multiple tasks + * can call sdmmc_host_do_transaction as long as other sdmmc_host_* + * functions are not called. + * + * @attention Data buffer passed in cmdinfo->data must be in DMA capable memory + * + * @param slot slot number (SDMMC_HOST_SLOT_0 or SDMMC_HOST_SLOT_1) + * @param cmdinfo pointer to structure describing command and data to transfer + * @return + * - ESP_OK on success + * - ESP_ERR_TIMEOUT if response or data transfer has timed out + * - ESP_ERR_INVALID_CRC if response or data transfer CRC check has failed + * - ESP_ERR_INVALID_RESPONSE if the card has sent an invalid response + * - ESP_ERR_INVALID_SIZE if the size of data transfer is not valid in SD protocol + * - ESP_ERR_INVALID_ARG if the data buffer is not in DMA capable memory + */ +esp_err_t sdmmc_host_do_transaction(int slot, sdmmc_command_t* cmdinfo); + +/** + * @brief Enable IO interrupts + * + * This function configures the host to accept SDIO interrupts. + * + * @param slot slot number (SDMMC_HOST_SLOT_0 or SDMMC_HOST_SLOT_1) + * @return returns ESP_OK, other errors possible in the future + */ +esp_err_t sdmmc_host_io_int_enable(int slot); + +/** + * @brief Block until an SDIO interrupt is received, or timeout occurs + * @param slot slot number (SDMMC_HOST_SLOT_0 or SDMMC_HOST_SLOT_1) + * @param timeout_ticks number of RTOS ticks to wait for the interrupt + * @return + * - ESP_OK on success (interrupt received) + * - ESP_ERR_TIMEOUT if the interrupt did not occur within timeout_ticks + */ +esp_err_t sdmmc_host_io_int_wait(int slot, TickType_t timeout_ticks); + +/** + * @brief Disable SDMMC host and release allocated resources + * + * @note This function is not thread safe + * + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_STATE if sdmmc_host_init function has not been called + */ +esp_err_t sdmmc_host_deinit(void); + +/** + * @brief Enable the pull-ups of sd pins. + * + * @note You should always place actual pullups on the lines instead of using + * this function. Internal pullup resistance are high and not sufficient, may + * cause instability in products. This is for debug or examples only. + * + * @param slot Slot to use, normally set it to 1. + * @param width Bit width of your configuration, 1 or 4. + * + * @return + * - ESP_OK: if success + * - ESP_ERR_INVALID_ARG: if configured width larger than maximum the slot can + * support + */ +esp_err_t sdmmc_host_pullup_en(int slot, int width); + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/driver/include/driver/sdmmc_types.h b/arch/xtensa/include/esp32/driver/include/driver/sdmmc_types.h new file mode 100644 index 0000000000000..1673bb5f23370 --- /dev/null +++ b/arch/xtensa/include/esp32/driver/include/driver/sdmmc_types.h @@ -0,0 +1,179 @@ +/* + * Copyright (c) 2006 Uwe Stuehler + * Adaptations to ESP-IDF Copyright (c) 2016 Espressif Systems (Shanghai) PTE LTD + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef _SDMMC_TYPES_H_ +#define _SDMMC_TYPES_H_ + +#include +#include +#include "esp_err.h" +#include "freertos/FreeRTOS.h" + +/** + * Decoded values from SD card Card Specific Data register + */ +typedef struct { + int csd_ver; /*!< CSD structure format */ + int mmc_ver; /*!< MMC version (for CID format) */ + int capacity; /*!< total number of sectors */ + int sector_size; /*!< sector size in bytes */ + int read_block_len; /*!< block length for reads */ + int card_command_class; /*!< Card Command Class for SD */ + int tr_speed; /*!< Max transfer speed */ +} sdmmc_csd_t; + +/** + * Decoded values from SD card Card IDentification register + */ +typedef struct { + int mfg_id; /*!< manufacturer identification number */ + int oem_id; /*!< OEM/product identification number */ + char name[8]; /*!< product name (MMC v1 has the longest) */ + int revision; /*!< product revision */ + int serial; /*!< product serial number */ + int date; /*!< manufacturing date */ +} sdmmc_cid_t; + +/** + * Decoded values from SD Configuration Register + */ +typedef struct { + int sd_spec; /*!< SD Physical layer specification version, reported by card */ + int bus_width; /*!< bus widths supported by card: BIT(0) — 1-bit bus, BIT(2) — 4-bit bus */ +} sdmmc_scr_t; + +/** + * Decoded values of Extended Card Specific Data + */ +typedef struct { + uint8_t power_class; /*!< Power class used by the card */ +} sdmmc_ext_csd_t; + +/** + * SD/MMC command response buffer + */ +typedef uint32_t sdmmc_response_t[4]; + +/** + * SD SWITCH_FUNC response buffer + */ +typedef struct { + uint32_t data[512 / 8 / sizeof(uint32_t)]; /*!< response data */ +} sdmmc_switch_func_rsp_t; + +/** + * SD/MMC command information + */ +typedef struct { + uint32_t opcode; /*!< SD or MMC command index */ + uint32_t arg; /*!< SD/MMC command argument */ + sdmmc_response_t response; /*!< response buffer */ + void* data; /*!< buffer to send or read into */ + size_t datalen; /*!< length of data buffer */ + size_t blklen; /*!< block length */ + int flags; /*!< see below */ +/** @cond */ +#define SCF_ITSDONE 0x0001 /*!< command is complete */ +#define SCF_CMD(flags) ((flags) & 0x00f0) +#define SCF_CMD_AC 0x0000 +#define SCF_CMD_ADTC 0x0010 +#define SCF_CMD_BC 0x0020 +#define SCF_CMD_BCR 0x0030 +#define SCF_CMD_READ 0x0040 /*!< read command (data expected) */ +#define SCF_RSP_BSY 0x0100 +#define SCF_RSP_136 0x0200 +#define SCF_RSP_CRC 0x0400 +#define SCF_RSP_IDX 0x0800 +#define SCF_RSP_PRESENT 0x1000 +/* response types */ +#define SCF_RSP_R0 0 /*!< none */ +#define SCF_RSP_R1 (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_IDX) +#define SCF_RSP_R1B (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_IDX|SCF_RSP_BSY) +#define SCF_RSP_R2 (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_136) +#define SCF_RSP_R3 (SCF_RSP_PRESENT) +#define SCF_RSP_R4 (SCF_RSP_PRESENT) +#define SCF_RSP_R5 (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_IDX) +#define SCF_RSP_R5B (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_IDX|SCF_RSP_BSY) +#define SCF_RSP_R6 (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_IDX) +#define SCF_RSP_R7 (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_IDX) +/* special flags */ +#define SCF_WAIT_BUSY 0x2000 /*!< Wait for completion of card busy signal before returning */ +/** @endcond */ + esp_err_t error; /*!< error returned from transfer */ + int timeout_ms; /*!< response timeout, in milliseconds */ +} sdmmc_command_t; + +/** + * SD/MMC Host description + * + * This structure defines properties of SD/MMC host and functions + * of SD/MMC host which can be used by upper layers. + */ +typedef struct { + uint32_t flags; /*!< flags defining host properties */ +#define SDMMC_HOST_FLAG_1BIT BIT(0) /*!< host supports 1-line SD and MMC protocol */ +#define SDMMC_HOST_FLAG_4BIT BIT(1) /*!< host supports 4-line SD and MMC protocol */ +#define SDMMC_HOST_FLAG_8BIT BIT(2) /*!< host supports 8-line MMC protocol */ +#define SDMMC_HOST_FLAG_SPI BIT(3) /*!< host supports SPI protocol */ +#define SDMMC_HOST_FLAG_DDR BIT(4) /*!< host supports DDR mode for SD/MMC */ + int slot; /*!< slot number, to be passed to host functions */ + int max_freq_khz; /*!< max frequency supported by the host */ +#define SDMMC_FREQ_DEFAULT 20000 /*!< SD/MMC Default speed (limited by clock divider) */ +#define SDMMC_FREQ_HIGHSPEED 40000 /*!< SD High speed (limited by clock divider) */ +#define SDMMC_FREQ_PROBING 400 /*!< SD/MMC probing speed */ +#define SDMMC_FREQ_52M 52000 /*!< MMC 52MHz speed */ +#define SDMMC_FREQ_26M 26000 /*!< MMC 26MHz speed */ + float io_voltage; /*!< I/O voltage used by the controller (voltage switching is not supported) */ + esp_err_t (*init)(void); /*!< Host function to initialize the driver */ + esp_err_t (*set_bus_width)(int slot, size_t width); /*!< host function to set bus width */ + size_t (*get_bus_width)(int slot); /*!< host function to get bus width */ + esp_err_t (*set_bus_ddr_mode)(int slot, bool ddr_enable); /*!< host function to set DDR mode */ + esp_err_t (*set_card_clk)(int slot, uint32_t freq_khz); /*!< host function to set card clock frequency */ + esp_err_t (*do_transaction)(int slot, sdmmc_command_t* cmdinfo); /*!< host function to do a transaction */ + esp_err_t (*deinit)(void); /*!< host function to deinitialize the driver */ + esp_err_t (*io_int_enable)(int slot); /*!< Host function to enable SDIO interrupt line */ + esp_err_t (*io_int_wait)(int slot, TickType_t timeout_ticks); /*!< Host function to wait for SDIO interrupt line to be active */ + int command_timeout_ms; /*!< timeout, in milliseconds, of a single command. Set to 0 to use the default value. */ +} sdmmc_host_t; + +/** + * SD/MMC card information structure + */ +typedef struct { + sdmmc_host_t host; /*!< Host with which the card is associated */ + uint32_t ocr; /*!< OCR (Operation Conditions Register) value */ + union { + sdmmc_cid_t cid; /*!< decoded CID (Card IDentification) register value */ + sdmmc_response_t raw_cid; /*!< raw CID of MMC card to be decoded + after the CSD is fetched in the data transfer mode*/ + }; + sdmmc_csd_t csd; /*!< decoded CSD (Card-Specific Data) register value */ + sdmmc_scr_t scr; /*!< decoded SCR (SD card Configuration Register) value */ + sdmmc_ext_csd_t ext_csd; /*!< decoded EXT_CSD (Extended Card Specific Data) register value */ + uint16_t rca; /*!< RCA (Relative Card Address) */ + uint16_t max_freq_khz; /*!< Maximum frequency, in kHz, supported by the card */ + uint32_t is_mem : 1; /*!< Bit indicates if the card is a memory card */ + uint32_t is_sdio : 1; /*!< Bit indicates if the card is an IO card */ + uint32_t is_mmc : 1; /*!< Bit indicates if the card is MMC */ + uint32_t num_io_functions : 3; /*!< If is_sdio is 1, contains the number of IO functions on the card */ + uint32_t log_bus_width : 2; /*!< log2(bus width supported by card) */ + uint32_t is_ddr : 1; /*!< Card supports DDR mode */ + uint32_t reserved : 23; /*!< Reserved for future expansion */ +} sdmmc_card_t; + + +#endif // _SDMMC_TYPES_H_ diff --git a/arch/xtensa/include/esp32/driver/include/driver/sdspi_host.h b/arch/xtensa/include/esp32/driver/include/driver/sdspi_host.h new file mode 100644 index 0000000000000..6eb24587decec --- /dev/null +++ b/arch/xtensa/include/esp32/driver/include/driver/sdspi_host.h @@ -0,0 +1,186 @@ +// 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. + +#pragma once + +#include +#include +#include "esp_err.h" +#include "sdmmc_types.h" +#include "driver/gpio.h" +#include "driver/spi_master.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Default sdmmc_host_t structure initializer for SD over SPI driver + * + * Uses SPI mode and max frequency set to 20MHz + * + * 'slot' can be set to one of HSPI_HOST, VSPI_HOST. + */ +#define SDSPI_HOST_DEFAULT() {\ + .flags = SDMMC_HOST_FLAG_SPI, \ + .slot = HSPI_HOST, \ + .max_freq_khz = SDMMC_FREQ_DEFAULT, \ + .io_voltage = 3.3f, \ + .init = &sdspi_host_init, \ + .set_bus_width = NULL, \ + .get_bus_width = NULL, \ + .set_bus_ddr_mode = NULL, \ + .set_card_clk = &sdspi_host_set_card_clk, \ + .do_transaction = &sdspi_host_do_transaction, \ + .deinit = &sdspi_host_deinit, \ + .io_int_enable = &sdspi_host_io_int_enable, \ + .io_int_wait = &sdspi_host_io_int_wait, \ + .command_timeout_ms = 0, \ +} + +/** + * Extra configuration for SPI host + */ +typedef struct { + gpio_num_t gpio_miso; ///< GPIO number of MISO signal + gpio_num_t gpio_mosi; ///< GPIO number of MOSI signal + gpio_num_t gpio_sck; ///< GPIO number of SCK signal + gpio_num_t gpio_cs; ///< GPIO number of CS signal + gpio_num_t gpio_cd; ///< GPIO number of card detect signal + gpio_num_t gpio_wp; ///< GPIO number of write protect signal + gpio_num_t gpio_int; ///< GPIO number of interrupt line (input) for SDIO card. + int dma_channel; ///< DMA channel to be used by SPI driver (1 or 2) +} sdspi_slot_config_t; + +#define SDSPI_SLOT_NO_CD GPIO_NUM_NC ///< indicates that card detect line is not used +#define SDSPI_SLOT_NO_WP GPIO_NUM_NC ///< indicates that write protect line is not used +#define SDSPI_SLOT_NO_INT GPIO_NUM_NC ///< indicates that interrupt line is not used + +/** + * Macro defining default configuration of SPI host + */ +#define SDSPI_SLOT_CONFIG_DEFAULT() {\ + .gpio_miso = GPIO_NUM_2, \ + .gpio_mosi = GPIO_NUM_15, \ + .gpio_sck = GPIO_NUM_14, \ + .gpio_cs = GPIO_NUM_13, \ + .gpio_cd = SDSPI_SLOT_NO_CD, \ + .gpio_wp = SDSPI_SLOT_NO_WP, \ + .gpio_int = GPIO_NUM_NC, \ + .dma_channel = 1 \ +} + +/** + * @brief Initialize SD SPI driver + * + * @note This function is not thread safe + * + * @return + * - ESP_OK on success + * - other error codes may be returned in future versions + */ +esp_err_t sdspi_host_init(void); + +/** +* @brief Initialize SD SPI driver for the specific SPI controller +* +* @note This function is not thread safe +* +* @note The SDIO over sdspi needs an extra interrupt line. Call ``gpio_install_isr_service()`` before this function. +* +* @param slot SPI controller to use (HSPI_HOST or VSPI_HOST) +* @param slot_config pointer to slot configuration structure +* +* @return +* - ESP_OK on success +* - ESP_ERR_INVALID_ARG if sdspi_init_slot has invalid arguments +* - ESP_ERR_NO_MEM if memory can not be allocated +* - other errors from the underlying spi_master and gpio drivers +*/ +esp_err_t sdspi_host_init_slot(int slot, const sdspi_slot_config_t* slot_config); + +/** + * @brief Send command to the card and get response + * + * This function returns when command is sent and response is received, + * or data is transferred, or timeout occurs. + * + * @note This function is not thread safe w.r.t. init/deinit functions, + * and bus width/clock speed configuration functions. Multiple tasks + * can call sdspi_host_do_transaction as long as other sdspi_host_* + * functions are not called. + * + * @param slot SPI controller (HSPI_HOST or VSPI_HOST) + * @param cmdinfo pointer to structure describing command and data to transfer + * @return + * - ESP_OK on success + * - ESP_ERR_TIMEOUT if response or data transfer has timed out + * - ESP_ERR_INVALID_CRC if response or data transfer CRC check has failed + * - ESP_ERR_INVALID_RESPONSE if the card has sent an invalid response + */ +esp_err_t sdspi_host_do_transaction(int slot, sdmmc_command_t *cmdinfo); + +/** + * @brief Set card clock frequency + * + * Currently only integer fractions of 40MHz clock can be used. + * For High Speed cards, 40MHz can be used. + * For Default Speed cards, 20MHz can be used. + * + * @note This function is not thread safe + * + * @param slot SPI controller (HSPI_HOST or VSPI_HOST) + * @param freq_khz card clock frequency, in kHz + * @return + * - ESP_OK on success + * - other error codes may be returned in the future + */ +esp_err_t sdspi_host_set_card_clk(int slot, uint32_t freq_khz); + + +/** + * @brief Release resources allocated using sdspi_host_init + * + * @note This function is not thread safe + * + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_STATE if sdspi_host_init function has not been called + */ +esp_err_t sdspi_host_deinit(void); + +/** + * @brief Enable SDIO interrupt. + * + * @param slot SPI controller to use (HSPI_HOST or VSPI_HOST) + * + * @return + * - ESP_OK on success + */ +esp_err_t sdspi_host_io_int_enable(int slot); + +/** + * @brief Wait for SDIO interrupt until timeout. + * + * @param slot SPI controller to use (HSPI_HOST or VSPI_HOST) + * @param timeout_ticks Ticks to wait before timeout. + * + * @return + * - ESP_OK on success + */ +esp_err_t sdspi_host_io_int_wait(int slot, TickType_t timeout_ticks); + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/driver/include/driver/sigmadelta.h b/arch/xtensa/include/esp32/driver/include/driver/sigmadelta.h new file mode 100644 index 0000000000000..783baa14217a0 --- /dev/null +++ b/arch/xtensa/include/esp32/driver/include/driver/sigmadelta.h @@ -0,0 +1,86 @@ +// 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. + +#pragma once + +#include +#include "soc/sigmadelta_periph.h" +#include "soc/sigmadelta_caps.h" +#include "driver/gpio.h" +#include "hal/sigmadelta_types.h" + +#ifdef _cplusplus +extern "C" { +#endif + +/** + * @brief Configure Sigma-delta channel + * + * @param config Pointer of Sigma-delta channel configuration struct + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_STATE sigmadelta driver already initialized + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t sigmadelta_config(const sigmadelta_config_t *config); + +/** + * @brief Set Sigma-delta channel duty. + * + * This function is used to set Sigma-delta channel duty, + * If you add a capacitor between the output pin and ground, + * the average output voltage will be Vdc = VDDIO / 256 * duty + VDDIO/2, + * where VDDIO is the power supply voltage. + * + * @param channel Sigma-delta channel number + * @param duty Sigma-delta duty of one channel, the value ranges from -128 to 127, recommended range is -90 ~ 90. + * The waveform is more like a random one in this range. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_STATE sigmadelta driver has not been initialized + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t sigmadelta_set_duty(sigmadelta_channel_t channel, int8_t duty); + +/** + * @brief Set Sigma-delta channel's clock pre-scale value. + * The source clock is APP_CLK, 80MHz. The clock frequency of the sigma-delta channel is APP_CLK / pre_scale + * + * @param channel Sigma-delta channel number + * @param prescale The divider of source clock, ranges from 0 to 255 + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_STATE sigmadelta driver has not been initialized + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t sigmadelta_set_prescale(sigmadelta_channel_t channel, uint8_t prescale); + +/** + * @brief Set Sigma-delta signal output pin + * + * @param channel Sigma-delta channel number + * @param gpio_num GPIO number of output pin. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_STATE sigmadelta driver has not been initialized + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t sigmadelta_set_pin(sigmadelta_channel_t channel, gpio_num_t gpio_num); + +#ifdef _cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/driver/include/driver/spi_common.h b/arch/xtensa/include/esp32/driver/include/driver/spi_common.h new file mode 100644 index 0000000000000..61d10f6d0a1ac --- /dev/null +++ b/arch/xtensa/include/esp32/driver/include/driver/spi_common.h @@ -0,0 +1,143 @@ +// Copyright 2010-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 +#include +#include "esp_err.h" +#include "soc/lldesc.h" +#include "soc/spi_periph.h" +#include "hal/spi_types.h" +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + +//Maximum amount of bytes that can be put in one DMA descriptor +#define SPI_MAX_DMA_LEN (4096-4) + +/** + * Transform unsigned integer of length <= 32 bits to the format which can be + * sent by the SPI driver directly. + * + * E.g. to send 9 bits of data, you can: + * + * uint16_t data = SPI_SWAP_DATA_TX(0x145, 9); + * + * Then points tx_buffer to ``&data``. + * + * @param DATA Data to be sent, can be uint8_t, uint16_t or uint32_t. + * @param LEN Length of data to be sent, since the SPI peripheral sends from + * the MSB, this helps to shift the data to the MSB. + */ +#define SPI_SWAP_DATA_TX(DATA, LEN) __builtin_bswap32((uint32_t)(DATA)<<(32-(LEN))) + +/** + * Transform received data of length <= 32 bits to the format of an unsigned integer. + * + * E.g. to transform the data of 15 bits placed in a 4-byte array to integer: + * + * uint16_t data = SPI_SWAP_DATA_RX(*(uint32_t*)t->rx_data, 15); + * + * @param DATA Data to be rearranged, can be uint8_t, uint16_t or uint32_t. + * @param LEN Length of data received, since the SPI peripheral writes from + * the MSB, this helps to shift the data to the LSB. + */ +#define SPI_SWAP_DATA_RX(DATA, LEN) (__builtin_bswap32(DATA)>>(32-(LEN))) + +#define SPICOMMON_BUSFLAG_SLAVE 0 ///< Initialize I/O in slave mode +#define SPICOMMON_BUSFLAG_MASTER (1<<0) ///< Initialize I/O in master mode +#define SPICOMMON_BUSFLAG_IOMUX_PINS (1<<1) ///< Check using iomux pins. Or indicates the pins are configured through the IO mux rather than GPIO matrix. +#define SPICOMMON_BUSFLAG_SCLK (1<<2) ///< Check existing of SCLK pin. Or indicates CLK line initialized. +#define SPICOMMON_BUSFLAG_MISO (1<<3) ///< Check existing of MISO pin. Or indicates MISO line initialized. +#define SPICOMMON_BUSFLAG_MOSI (1<<4) ///< Check existing of MOSI pin. Or indicates CLK line initialized. +#define SPICOMMON_BUSFLAG_DUAL (1<<5) ///< Check MOSI and MISO pins can output. Or indicates bus able to work under DIO mode. +#define SPICOMMON_BUSFLAG_WPHD (1<<6) ///< 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. + +#define SPICOMMON_BUSFLAG_NATIVE_PINS SPICOMMON_BUSFLAG_IOMUX_PINS + + +/** + * @brief This is a configuration structure for a SPI bus. + * + * You can use this structure to specify the GPIO pins of the bus. Normally, the driver will use the + * GPIO matrix to route the signals. An exception is made when all signals either can be routed through + * the IO_MUX or are -1. In that case, the IO_MUX is used, allowing for >40MHz speeds. + * + * @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 4094 if 0. + 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; + + +/** + * @brief Initialize a SPI bus + * + * @warning For now, only supports HSPI and VSPI. + * + * @param host SPI peripheral that controls this bus + * @param bus_config Pointer to a spi_bus_config_t struct specifying how the host should be initialized + * @param dma_chan Either channel 1 or 2, or 0 in the case when no DMA is required. Selecting a DMA channel + * for a SPI bus allows transfers on the bus to have sizes only limited by the amount of + * internal memory. Selecting no DMA channel (by passing the value 0) limits the amount of + * bytes transfered to a maximum of 64. Set to 0 if only the SPI flash uses + * this bus. + * + * @warning If a DMA channel is selected, any transmit and receive buffer used should be allocated in + * DMA-capable memory. + * + * @warning The ISR of SPI is always executed on the core which calls this + * function. Never starve the ISR on this core or the SPI transactions will not + * be handled. + * + * @return + * - ESP_ERR_INVALID_ARG if configuration is invalid + * - ESP_ERR_INVALID_STATE if host already is in use + * - ESP_ERR_NO_MEM if out of memory + * - ESP_OK on success + */ +esp_err_t spi_bus_initialize(spi_host_device_t host, const spi_bus_config_t *bus_config, int dma_chan); + +/** + * @brief Free a SPI bus + * + * @warning In order for this to succeed, all devices have to be removed first. + * + * @param host SPI peripheral to free + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_ERR_INVALID_STATE if not all devices on the bus are freed + * - ESP_OK on success + */ +esp_err_t spi_bus_free(spi_host_device_t host); + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/driver/include/driver/spi_common_internal.h b/arch/xtensa/include/esp32/driver/include/driver/spi_common_internal.h new file mode 100644 index 0000000000000..8b692745ba1f3 --- /dev/null +++ b/arch/xtensa/include/esp32/driver/include/driver/spi_common_internal.h @@ -0,0 +1,267 @@ +// Copyright 2010-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. + +// Internal header, don't use it in the user code + +#pragma once + +#include "driver/spi_common.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** + * @brief Try to claim a SPI peripheral + * + * Call this if your driver wants to manage a SPI peripheral. + * + * @param host Peripheral to claim + * @param source The caller indentification string. + * + * @note This public API is deprecated. + * + * @return True if peripheral is claimed successfully; false if peripheral already is claimed. + */ +bool spicommon_periph_claim(spi_host_device_t host, const char* source); + +/** + * @brief Check whether the spi periph is in use. + * + * @param host Peripheral to check. + * + * @note This public API is deprecated. + * + * @return True if in use, otherwise false. + */ +bool spicommon_periph_in_use(spi_host_device_t host); + +/** + * @brief Return the SPI peripheral so another driver can claim it. + * + * @param host Peripheral to return + * + * @note This public API is deprecated. + * + * @return True if peripheral is returned successfully; false if peripheral was free to claim already. + */ +bool spicommon_periph_free(spi_host_device_t host); + +/** + * @brief Try to claim a SPI DMA channel + * + * Call this if your driver wants to use SPI with a DMA channnel. + * + * @param dma_chan channel to claim + * + * @note This public API is deprecated. + * + * @return True if success; false otherwise. + */ +bool spicommon_dma_chan_claim(int dma_chan); + +/** + * @brief Check whether the spi DMA channel is in use. + * + * @param dma_chan DMA channel to check. + * + * @note This public API is deprecated. + * + * @return True if in use, otherwise false. + */ +bool spicommon_dma_chan_in_use(int dma_chan); + +/** + * @brief Return the SPI DMA channel so other driver can claim it, or just to power down DMA. + * + * @param dma_chan channel to return + * + * @note This public API is deprecated. + * + * @return True if success; false otherwise. + */ +bool spicommon_dma_chan_free(int dma_chan); + +/** + * @brief Connect a SPI peripheral to GPIO pins + * + * This routine is used to connect a SPI peripheral to the IO-pads and DMA channel given in + * the arguments. Depending on the IO-pads requested, the routing is done either using the + * IO_mux or using the GPIO matrix. + * + * @note This public API is deprecated. Please call ``spi_bus_initialize`` for master + * bus initialization and ``spi_slave_initialize`` for slave initialization. + * + * @param host SPI peripheral to be routed + * @param bus_config Pointer to a spi_bus_config struct detailing the GPIO pins + * @param dma_chan DMA-channel (1 or 2) to use, or 0 for no DMA. + * @param flags Combination of SPICOMMON_BUSFLAG_* flags, set to ensure the pins set are capable with some functions: + * - ``SPICOMMON_BUSFLAG_MASTER``: Initialize I/O in master mode + * - ``SPICOMMON_BUSFLAG_SLAVE``: Initialize I/O in slave mode + * - ``SPICOMMON_BUSFLAG_IOMUX_PINS``: Pins set should match the iomux pins of the controller. + * - ``SPICOMMON_BUSFLAG_SCLK``, ``SPICOMMON_BUSFLAG_MISO``, ``SPICOMMON_BUSFLAG_MOSI``: + * Make sure SCLK/MISO/MOSI is/are set to a valid GPIO. Also check output capability according to the mode. + * - ``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``. + * @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. + * - ``SPICOMMON_BUSFLAG_SCLK``, ``SPICOMMON_BUSFLAG_MISO``, ``SPICOMMON_BUSFLAG_MOSI``: The bus has + * CLK/MISO/MOSI connected. + * - ``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``. + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_OK on success + */ +esp_err_t spicommon_bus_initialize_io(spi_host_device_t host, const spi_bus_config_t *bus_config, int dma_chan, uint32_t flags, uint32_t *flags_o); + +/** + * @brief Free the IO used by a SPI peripheral + * + * @note This public API is deprecated. Please call ``spi_bus_free`` for master + * bus deinitialization and ``spi_slave_free`` for slave deinitialization. + * + * @param bus_cfg Bus config struct which defines which pins to be used. + * + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_OK on success + */ +esp_err_t spicommon_bus_free_io_cfg(const spi_bus_config_t *bus_cfg); + +/** + * @brief Initialize a Chip Select pin for a specific SPI peripheral + * + * @note This public API is deprecated. Please call corresponding device initialization + * functions. + * + * @param host SPI peripheral + * @param cs_io_num GPIO pin to route + * @param cs_num CS id to route + * @param force_gpio_matrix If true, CS will always be routed through the GPIO matrix. If false, + * if the GPIO number allows it, the routing will happen through the IO_mux. + */ +void spicommon_cs_initialize(spi_host_device_t host, int cs_io_num, int cs_num, int force_gpio_matrix); + +/** + * @brief Free a chip select line + * + * @param cs_gpio_num CS gpio num to free + * + * @note This public API is deprecated. + */ +void spicommon_cs_free_io(int cs_gpio_num); + +/** + * @brief Check whether all pins used by a host are through IOMUX. + * + * @param host SPI peripheral + * + * @note This public API is deprecated. + * + * @return false if any pins are through the GPIO matrix, otherwise true. + */ +bool spicommon_bus_using_iomux(spi_host_device_t host); + +/** + * @brief Get the IRQ source for a specific SPI host + * + * @param host The SPI host + * + * @note This public API is deprecated. + * + * @return The hosts IRQ source + */ +int spicommon_irqsource_for_host(spi_host_device_t host); + +/** + * @brief Get the IRQ source for a specific SPI DMA + * + * @param host The SPI host + * + * @note This public API is deprecated. + * + * @return The hosts IRQ source + */ +int spicommon_irqdma_source_for_host(spi_host_device_t host); + +/** + * Callback, to be called when a DMA engine reset is completed +*/ +typedef void(*dmaworkaround_cb_t)(void *arg); + + +/** + * @brief Request a reset for a certain DMA channel + * + * @note In some (well-defined) cases in the ESP32 (at least rev v.0 and v.1), a SPI DMA channel will get confused. This can be remedied + * by resetting the SPI DMA hardware in case this happens. Unfortunately, the reset knob used for thsi will reset _both_ DMA channels, and + * as such can only done safely when both DMA channels are idle. These functions coordinate this. + * + * Essentially, when a reset is needed, a driver can request this using spicommon_dmaworkaround_req_reset. This is supposed to be called + * with an user-supplied function as an argument. If both DMA channels are idle, this call will reset the DMA subsystem and return true. + * If the other DMA channel is still busy, it will return false; as soon as the other DMA channel is done, however, it will reset the + * DMA subsystem and call the callback. The callback is then supposed to be used to continue the SPI drivers activity. + * + * @param dmachan DMA channel associated with the SPI host that needs a reset + * @param cb Callback to call in case DMA channel cannot be reset immediately + * @param arg Argument to the callback + * + * @note This public API is deprecated. + * + * @return True when a DMA reset could be executed immediately. False when it could not; in this + * case the callback will be called with the specified argument when the logic can execute + * a reset, after that reset. + */ +bool spicommon_dmaworkaround_req_reset(int dmachan, dmaworkaround_cb_t cb, void *arg); + + +/** + * @brief Check if a DMA reset is requested but has not completed yet + * + * @note This public API is deprecated. + * + * @return True when a DMA reset is requested but hasn't completed yet. False otherwise. + */ +bool spicommon_dmaworkaround_reset_in_progress(void); + + +/** + * @brief Mark a DMA channel as idle. + * + * A call to this function tells the workaround logic that this channel will + * not be affected by a global SPI DMA reset. + * + * @note This public API is deprecated. + */ +void spicommon_dmaworkaround_idle(int dmachan); + +/** + * @brief Mark a DMA channel as active. + * + * A call to this function tells the workaround logic that this channel will + * be affected by a global SPI DMA reset, and a reset like that should not be attempted. + * + * @note This public API is deprecated. + */ +void spicommon_dmaworkaround_transfer_active(int dmachan); + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/driver/include/driver/spi_master.h b/arch/xtensa/include/esp32/driver/include/driver/spi_master.h new file mode 100644 index 0000000000000..4753a780c89f8 --- /dev/null +++ b/arch/xtensa/include/esp32/driver/include/driver/spi_master.h @@ -0,0 +1,397 @@ +// Copyright 2010-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 "esp_err.h" +#include "freertos/FreeRTOS.h" +//for spi_bus_initialization funcions. to be back-compatible +#include "driver/spi_common.h" + +/** SPI master clock is divided by 80MHz apb clock. Below defines are example frequencies, and are accurate. Be free to specify a random frequency, it will be rounded to closest frequency (to macros below if above 8MHz). + * 8MHz + */ +#if APB_CLK_FREQ==80*1000*1000 +#define SPI_MASTER_FREQ_8M (APB_CLK_FREQ/10) +#define SPI_MASTER_FREQ_9M (APB_CLK_FREQ/9) ///< 8.89MHz +#define SPI_MASTER_FREQ_10M (APB_CLK_FREQ/8) ///< 10MHz +#define SPI_MASTER_FREQ_11M (APB_CLK_FREQ/7) ///< 11.43MHz +#define SPI_MASTER_FREQ_13M (APB_CLK_FREQ/6) ///< 13.33MHz +#define SPI_MASTER_FREQ_16M (APB_CLK_FREQ/5) ///< 16MHz +#define SPI_MASTER_FREQ_20M (APB_CLK_FREQ/4) ///< 20MHz +#define SPI_MASTER_FREQ_26M (APB_CLK_FREQ/3) ///< 26.67MHz +#define SPI_MASTER_FREQ_40M (APB_CLK_FREQ/2) ///< 40MHz +#define SPI_MASTER_FREQ_80M (APB_CLK_FREQ/1) ///< 80MHz +#elif APB_CLK_FREQ==40*1000*1000 +#define SPI_MASTER_FREQ_7M (APB_CLK_FREQ/6) ///< 13.33MHz +#define SPI_MASTER_FREQ_8M (APB_CLK_FREQ/5) ///< 16MHz +#define SPI_MASTER_FREQ_10M (APB_CLK_FREQ/4) ///< 20MHz +#define SPI_MASTER_FREQ_13M (APB_CLK_FREQ/3) ///< 26.67MHz +#define SPI_MASTER_FREQ_20M (APB_CLK_FREQ/2) ///< 40MHz +#define SPI_MASTER_FREQ_40M (APB_CLK_FREQ/1) ///< 80MHz +#endif +#ifdef __cplusplus +extern "C" +{ +#endif + +#define SPI_DEVICE_TXBIT_LSBFIRST (1<<0) ///< Transmit command/address/data LSB first instead of the default MSB first +#define SPI_DEVICE_RXBIT_LSBFIRST (1<<1) ///< Receive data LSB first instead of the default MSB first +#define SPI_DEVICE_BIT_LSBFIRST (SPI_DEVICE_TXBIT_LSBFIRST|SPI_DEVICE_RXBIT_LSBFIRST) ///< Transmit and receive LSB first +#define SPI_DEVICE_3WIRE (1<<2) ///< Use MOSI (=spid) for both sending and receiving data +#define SPI_DEVICE_POSITIVE_CS (1<<3) ///< Make CS positive during a transaction instead of negative +#define SPI_DEVICE_HALFDUPLEX (1<<4) ///< Transmit data before receiving it, instead of simultaneously +#define SPI_DEVICE_CLK_AS_CS (1<<5) ///< Output clock on CS line if CS is active +/** There are timing issue when reading at high frequency (the frequency is related to whether iomux pins are used, valid time after slave sees the clock). + * - In half-duplex mode, the driver automatically inserts dummy bits before reading phase to fix the timing issue. Set this flag to disable this feature. + * - In full-duplex mode, however, the hardware cannot use dummy bits, so there is no way to prevent data being read from getting corrupted. + * Set this flag to confirm that you're going to work with output only, or read without dummy bits at your own risk. + */ +#define SPI_DEVICE_NO_DUMMY (1<<6) +#define SPI_DEVICE_DDRCLK (1<<7) + + +typedef struct spi_transaction_t spi_transaction_t; +typedef void(*transaction_cb_t)(spi_transaction_t *trans); + +/** + * @brief This is a configuration for a SPI slave device that is connected to one of the SPI buses. + */ +typedef struct { + uint8_t command_bits; ///< Default amount of bits in command phase (0-16), used when ``SPI_TRANS_VARIABLE_CMD`` is not used, otherwise ignored. + uint8_t address_bits; ///< Default amount of bits in address phase (0-64), used when ``SPI_TRANS_VARIABLE_ADDR`` is not used, otherwise ignored. + uint8_t dummy_bits; ///< Amount of dummy bits to insert between address and data phase + uint8_t mode; ///< SPI mode (0-3) + uint16_t duty_cycle_pos; ///< Duty cycle of positive clock, in 1/256th increments (128 = 50%/50% duty). Setting this to 0 (=not setting it) is equivalent to setting this to 128. + uint16_t cs_ena_pretrans; ///< Amount of SPI bit-cycles the cs should be activated before the transmission (0-16). This only works on half-duplex transactions. + uint8_t cs_ena_posttrans; ///< Amount of SPI bit-cycles the cs should stay active after the transmission (0-16) + int clock_speed_hz; ///< Clock speed, divisors of 80MHz, in Hz. See ``SPI_MASTER_FREQ_*``. + int input_delay_ns; /**< Maximum data valid time of slave. The time required between SCLK and MISO + valid, including the possible clock delay from slave to master. The driver uses this value to give an extra + delay before the MISO is ready on the line. Leave at 0 unless you know you need a delay. For better timing + performance at high frequency (over 8MHz), it's suggest to have the right value. + */ + int spics_io_num; ///< CS GPIO pin for this device, or -1 if not used + uint32_t flags; ///< Bitwise OR of SPI_DEVICE_* flags + int queue_size; ///< Transaction queue size. This sets how many transactions can be 'in the air' (queued using spi_device_queue_trans but not yet finished using spi_device_get_trans_result) at the same time + transaction_cb_t pre_cb; /**< Callback to be called before a transmission is started. + * + * This callback is called within interrupt + * context should be in IRAM for best + * performance, see "Transferring Speed" + * section in the SPI Master documentation for + * full details. If not, the callback may crash + * during flash operation when the driver is + * initialized with ESP_INTR_FLAG_IRAM. + */ + transaction_cb_t post_cb; /**< Callback to be called after a transmission has completed. + * + * This callback is called within interrupt + * context should be in IRAM for best + * performance, see "Transferring Speed" + * section in the SPI Master documentation for + * full details. If not, the callback may crash + * during flash operation when the driver is + * initialized with ESP_INTR_FLAG_IRAM. + */ +} spi_device_interface_config_t; + + +#define SPI_TRANS_MODE_DIO (1<<0) ///< Transmit/receive data in 2-bit mode +#define SPI_TRANS_MODE_QIO (1<<1) ///< Transmit/receive data in 4-bit mode +#define SPI_TRANS_USE_RXDATA (1<<2) ///< Receive into rx_data member of spi_transaction_t instead into memory at rx_buffer. +#define SPI_TRANS_USE_TXDATA (1<<3) ///< Transmit tx_data member of spi_transaction_t instead of data at tx_buffer. Do not set tx_buffer when using this. +#define SPI_TRANS_MODE_DIOQIO_ADDR (1<<4) ///< Also transmit address in mode selected by SPI_MODE_DIO/SPI_MODE_QIO +#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 + +/** + * This structure describes one SPI transaction. The descriptor should not be modified until the transaction finishes. + */ +struct spi_transaction_t { + uint32_t flags; ///< Bitwise OR of SPI_TRANS_* flags + uint16_t cmd; /**< Command data, of which the length is set in the ``command_bits`` of spi_device_interface_config_t. + * + * NOTE: this field, used to be "command" in ESP-IDF 2.1 and before, is re-written to be used in a new way in ESP-IDF 3.0. + * + * Example: write 0x0123 and command_bits=12 to send command 0x12, 0x3_ (in previous version, you may have to write 0x3_12). + */ + uint64_t addr; /**< Address data, of which the length is set in the ``address_bits`` of spi_device_interface_config_t. + * + * NOTE: this field, used to be "address" in ESP-IDF 2.1 and before, is re-written to be used in a new way in ESP-IDF3.0. + * + * Example: write 0x123400 and address_bits=24 to send address of 0x12, 0x34, 0x00 (in previous version, you may have to write 0x12340000). + */ + size_t length; ///< Total data length, in bits + size_t rxlength; ///< Total data length received, should be not greater than ``length`` in full-duplex mode (0 defaults this to the value of ``length``). + void *user; ///< User-defined variable. Can be used to store eg transaction ID. + union { + const void *tx_buffer; ///< Pointer to transmit buffer, or NULL for no MOSI phase + uint8_t tx_data[4]; ///< If SPI_TRANS_USE_TXDATA is set, data set here is sent directly from this variable. + }; + union { + void *rx_buffer; ///< Pointer to receive buffer, or NULL for no MISO phase. Written by 4 bytes-unit if DMA is used. + uint8_t rx_data[4]; ///< If SPI_TRANS_USE_RXDATA is set, data is received directly to this variable + }; +} ; //the rx data should start from a 32-bit aligned address to get around dma issue. + +/** + * This struct is for SPI transactions which may change their address and command length. + * Please do set the flags in base to ``SPI_TRANS_VARIABLE_CMD_ADR`` to use the bit length here. + */ +typedef struct { + struct spi_transaction_t base; ///< Transaction data, so that pointer to spi_transaction_t can be converted into spi_transaction_ext_t + uint8_t command_bits; ///< The command length in this transaction, in bits. + uint8_t address_bits; ///< The address length in this transaction, in bits. + uint8_t dummy_bits; ///< The dummy length in this transaction, in bits. +} spi_transaction_ext_t ; + + +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 + * + * This initializes the internal structures for a device, plus allocates a CS pin on the indicated SPI master + * peripheral and routes it to the indicated GPIO. All SPI master devices have three CS pins and can thus control + * up to three devices. + * + * @note While in general, speeds up to 80MHz on the dedicated SPI pins and 40MHz on GPIO-matrix-routed pins are + * supported, full-duplex transfers routed over the GPIO matrix only support speeds up to 26MHz. + * + * @param host SPI peripheral to allocate device on + * @param dev_config SPI interface protocol config for the device + * @param handle Pointer to variable to hold the device handle + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_ERR_NOT_FOUND if host doesn't have any free CS slots + * - ESP_ERR_NO_MEM if out of memory + * - ESP_OK on success + */ +esp_err_t spi_bus_add_device(spi_host_device_t host, const spi_device_interface_config_t *dev_config, spi_device_handle_t *handle); + + +/** + * @brief Remove a device from the SPI bus + * + * @param handle Device handle to free + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_ERR_INVALID_STATE if device already is freed + * - ESP_OK on success + */ +esp_err_t spi_bus_remove_device(spi_device_handle_t handle); + + +/** + * @brief Queue a SPI transaction for interrupt transaction execution. Get the result by ``spi_device_get_trans_result``. + * + * @note Normally a device cannot start (queue) polling and interrupt + * transactions simultaneously. + * + * @param handle Device handle obtained using spi_host_add_dev + * @param trans_desc Description of transaction to execute + * @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_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 + * - ESP_OK on success + */ +esp_err_t spi_device_queue_trans(spi_device_handle_t handle, spi_transaction_t *trans_desc, TickType_t ticks_to_wait); + + +/** + * @brief Get the result of a SPI transaction queued earlier by ``spi_device_queue_trans``. + * + * This routine will wait until a transaction to the given device + * succesfully completed. It will then return the description of the + * completed transaction so software can inspect the result and e.g. free the memory or + * re-use the buffers. + * + * @param handle Device handle obtained using spi_host_add_dev + * @param trans_desc Pointer to variable able to contain a pointer to the description of the transaction + that is executed. The descriptor should not be modified until the descriptor is returned by + spi_device_get_trans_result. + * @param ticks_to_wait Ticks to wait until there's a returned item; use portMAX_DELAY to never time + out. + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_ERR_TIMEOUT if there was no completed transaction before ticks_to_wait expired + * - ESP_OK on success + */ +esp_err_t spi_device_get_trans_result(spi_device_handle_t handle, spi_transaction_t **trans_desc, TickType_t ticks_to_wait); + + +/** + * @brief Send a SPI transaction, wait for it to complete, and return the result + * + * This function is the equivalent of calling spi_device_queue_trans() followed by spi_device_get_trans_result(). + * Do not use this when there is still a transaction separately queued (started) from spi_device_queue_trans() or polling_start/transmit that hasn't been finalized. + * + * @note This function is not thread safe when multiple tasks access the same SPI device. + * Normally a device cannot start (queue) polling and interrupt + * transactions simutanuously. + * + * @param handle Device handle obtained using spi_host_add_dev + * @param trans_desc Description of transaction to execute + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_OK on success + */ +esp_err_t spi_device_transmit(spi_device_handle_t handle, spi_transaction_t *trans_desc); + + +/** + * @brief Immediately start a polling transaction. + * + * @note Normally a device cannot start (queue) polling and interrupt + * transactions simutanuously. Moreover, a device cannot start a new polling + * transaction if another polling transaction is not finished. + * + * @param handle Device handle obtained using spi_host_add_dev + * @param trans_desc Description of transaction to execute + * @param ticks_to_wait Ticks to wait until there's room in the queue; + * currently only portMAX_DELAY is supported. + * + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - 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 + * - ESP_OK on success + */ +esp_err_t spi_device_polling_start(spi_device_handle_t handle, spi_transaction_t *trans_desc, TickType_t ticks_to_wait); + + +/** + * @brief Poll until the polling transaction ends. + * + * This routine will not return until the transaction to the given device has + * succesfully completed. The task is not blocked, but actively busy-spins for + * the transaction to be completed. + * + * @param handle Device handle obtained using spi_host_add_dev + * @param ticks_to_wait Ticks to wait until there's a returned item; use portMAX_DELAY to never time + out. + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_ERR_TIMEOUT if the transaction cannot finish before ticks_to_wait expired + * - ESP_OK on success + */ +esp_err_t spi_device_polling_end(spi_device_handle_t handle, TickType_t ticks_to_wait); + + +/** + * @brief Send a polling transaction, wait for it to complete, and return the result + * + * This function is the equivalent of calling spi_device_polling_start() followed by spi_device_polling_end(). + * Do not use this when there is still a transaction that hasn't been finalized. + * + * @note This function is not thread safe when multiple tasks access the same SPI device. + * Normally a device cannot start (queue) polling and interrupt + * transactions simutanuously. + * + * @param handle Device handle obtained using spi_host_add_dev + * @param trans_desc Description of transaction to execute + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_OK on success + */ +esp_err_t spi_device_polling_transmit(spi_device_handle_t handle, spi_transaction_t *trans_desc); + + +/** + * @brief Occupy the SPI bus for a device to do continuous transactions. + * + * Transactions to all other devices will be put off until ``spi_device_release_bus`` is called. + * + * @note The function will wait until all the existing transactions have been sent. + * + * @param device The device to occupy the bus. + * @param wait Time to wait before the the bus is occupied by the device. Currently MUST set to portMAX_DELAY. + * + * @return + * - ESP_ERR_INVALID_ARG : ``wait`` is not set to portMAX_DELAY. + * - ESP_OK : Success. + */ +esp_err_t spi_device_acquire_bus(spi_device_handle_t device, TickType_t wait); + +/** + * @brief Release the SPI bus occupied by the device. All other devices can start sending transactions. + * + * @param dev The device to release the bus. + */ +void spi_device_release_bus(spi_device_handle_t dev); + + +/** + * @brief Calculate the working frequency that is most close to desired frequency, and also the register value. + * + * @param fapb The frequency of apb clock, should be ``APB_CLK_FREQ``. + * @param hz Desired working frequency + * @param duty_cycle Duty cycle of the spi clock + * @param reg_o Output of value to be set in clock register, or NULL if not needed. + * + * @deprecated The app shouldn't care about the register. Call ``spi_get_actual_clock`` instead. + * + * @return Actual working frequency that most fit. + */ +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. + * + * @param fapb The frequency of apb clock, should be ``APB_CLK_FREQ``. + * @param hz Desired working frequency + * @param duty_cycle Duty cycle of the spi clock + * + * @return Actual working frequency that most fit. + */ +int spi_get_actual_clock(int fapb, int hz, int duty_cycle); + +/** + * @brief Calculate the timing settings of specified frequency and settings. + * + * @param gpio_is_used True if using GPIO matrix, or False if iomux pins are used. + * @param input_delay_ns Input delay from SCLK launch edge to MISO data valid. + * @param eff_clk Effective clock frequency (in Hz) from spi_cal_clock. + * @param dummy_o Address of dummy bits used output. Set to NULL if not needed. + * @param cycles_remain_o Address of cycles remaining (after dummy bits are used) output. + * - -1 If too many cycles remaining, suggest to compensate half a clock. + * - 0 If no remaining cycles or dummy bits are not used. + * - positive value: cycles suggest to compensate. + * + * @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); + +/** + * @brief Get the frequency limit of current configurations. + * SPI master working at this limit is OK, while above the limit, full duplex mode and DMA will not work, + * and dummy bits will be aplied in the half duplex mode. + * + * @param gpio_is_used True if using GPIO matrix, or False if native pins are used. + * @param input_delay_ns Input delay from SCLK launch edge to MISO data valid. + * @return Frequency limit of current configurations. + */ +int spi_get_freq_limit(bool gpio_is_used, int input_delay_ns); + +#ifdef __cplusplus +} +#endif + diff --git a/arch/xtensa/include/esp32/driver/include/driver/spi_slave.h b/arch/xtensa/include/esp32/driver/include/driver/spi_slave.h new file mode 100644 index 0000000000000..522c9fb8ab0cf --- /dev/null +++ b/arch/xtensa/include/esp32/driver/include/driver/spi_slave.h @@ -0,0 +1,191 @@ +// Copyright 2010-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 _DRIVER_SPI_SLAVE_H_ +#define _DRIVER_SPI_SLAVE_H_ + +#include "esp_err.h" +#include "freertos/FreeRTOS.h" +#include "freertos/semphr.h" +#include "driver/spi_common.h" + + +#ifdef __cplusplus +extern "C" +{ +#endif + + +#define SPI_SLAVE_TXBIT_LSBFIRST (1<<0) ///< Transmit command/address/data LSB first instead of the default MSB first +#define SPI_SLAVE_RXBIT_LSBFIRST (1<<1) ///< Receive data LSB first instead of the default MSB first +#define SPI_SLAVE_BIT_LSBFIRST (SPI_SLAVE_TXBIT_LSBFIRST|SPI_SLAVE_RXBIT_LSBFIRST) ///< Transmit and receive LSB first + + +typedef struct spi_slave_transaction_t spi_slave_transaction_t; +typedef void(*slave_transaction_cb_t)(spi_slave_transaction_t *trans); + +/** + * @brief This is a configuration for a SPI host acting as a slave device. + */ +typedef struct { + int spics_io_num; ///< CS GPIO pin for this device + uint32_t flags; ///< Bitwise OR of SPI_SLAVE_* flags + int queue_size; ///< Transaction queue size. This sets how many transactions can be 'in the air' (queued using spi_slave_queue_trans but not yet finished using spi_slave_get_trans_result) at the same time + uint8_t mode; ///< SPI mode (0-3) + slave_transaction_cb_t post_setup_cb; /**< Callback called after the SPI registers are loaded with new data. + * + * This callback is called within interrupt + * context should be in IRAM for best + * performance, see "Transferring Speed" + * section in the SPI Master documentation for + * full details. If not, the callback may crash + * during flash operation when the driver is + * initialized with ESP_INTR_FLAG_IRAM. + */ + slave_transaction_cb_t post_trans_cb; /**< Callback called after a transaction is done. + * + * This callback is called within interrupt + * context should be in IRAM for best + * performance, see "Transferring Speed" + * section in the SPI Master documentation for + * full details. If not, the callback may crash + * during flash operation when the driver is + * initialized with ESP_INTR_FLAG_IRAM. + */ +} spi_slave_interface_config_t; + +/** + * This structure describes one SPI transaction + */ +struct spi_slave_transaction_t { + size_t length; ///< Total data length, in bits + size_t trans_len; ///< Transaction data length, in bits + const void *tx_buffer; ///< Pointer to transmit buffer, or NULL for no MOSI phase + void *rx_buffer; /**< Pointer to receive buffer, or NULL for no MISO phase. + * When the DMA is anabled, must start at WORD boundary (``rx_buffer%4==0``), + * and has length of a multiple of 4 bytes. + */ + void *user; ///< User-defined variable. Can be used to store eg transaction ID. +}; + +/** + * @brief Initialize a SPI bus as a slave interface + * + * @warning For now, only supports HSPI and VSPI. + * + * @param host SPI peripheral to use as a SPI slave interface + * @param bus_config Pointer to a spi_bus_config_t struct specifying how the host should be initialized + * @param slave_config Pointer to a spi_slave_interface_config_t struct specifying the details for the slave interface + * @param dma_chan Either 1 or 2. A SPI bus used by this driver must have a DMA channel associated with + * it. The SPI hardware has two DMA channels to share. This parameter indicates which + * one to use. + * + * @warning If a DMA channel is selected, any transmit and receive buffer used should be allocated in + * DMA-capable memory. + * + * @warning The ISR of SPI is always executed on the core which calls this + * function. Never starve the ISR on this core or the SPI transactions will not + * be handled. + * + * @return + * - ESP_ERR_INVALID_ARG if configuration is invalid + * - ESP_ERR_INVALID_STATE if host already is in use + * - ESP_ERR_NO_MEM if out of memory + * - ESP_OK on success + */ +esp_err_t spi_slave_initialize(spi_host_device_t host, const spi_bus_config_t *bus_config, const spi_slave_interface_config_t *slave_config, int dma_chan); + +/** + * @brief Free a SPI bus claimed as a SPI slave interface + * + * @param host SPI peripheral to free + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_ERR_INVALID_STATE if not all devices on the bus are freed + * - ESP_OK on success + */ +esp_err_t spi_slave_free(spi_host_device_t host); + + +/** + * @brief Queue a SPI transaction for execution + * + * Queues a SPI transaction to be executed by this slave device. (The transaction queue size was specified when the slave + * device was initialised via spi_slave_initialize.) This function may block if the queue is full (depending on the + * ticks_to_wait parameter). No SPI operation is directly initiated by this function, the next queued transaction + * will happen when the master initiates a SPI transaction by pulling down CS and sending out clock signals. + * + * This function hands over ownership of the buffers in ``trans_desc`` to the SPI slave driver; the application is + * not to access this memory until ``spi_slave_queue_trans`` is called to hand ownership back to the application. + * + * @param host SPI peripheral that is acting as a slave + * @param trans_desc Description of transaction to execute. Not const because we may want to write status back + * into the transaction description. + * @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_OK on success + */ +esp_err_t spi_slave_queue_trans(spi_host_device_t host, const spi_slave_transaction_t *trans_desc, TickType_t ticks_to_wait); + + +/** + * @brief Get the result of a SPI transaction queued earlier + * + * This routine will wait until a transaction to the given device (queued earlier with + * spi_slave_queue_trans) has succesfully completed. It will then return the description of the + * completed transaction so software can inspect the result and e.g. free the memory or + * re-use the buffers. + * + * It is mandatory to eventually use this function for any transaction queued by ``spi_slave_queue_trans``. + * + * @param host SPI peripheral to that is acting as a slave + * @param[out] trans_desc Pointer to variable able to contain a pointer to the description of the + * transaction that is executed + * @param ticks_to_wait Ticks to wait until there's a returned item; use portMAX_DELAY to never time + * out. + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_OK on success + */ +esp_err_t spi_slave_get_trans_result(spi_host_device_t host, spi_slave_transaction_t **trans_desc, TickType_t ticks_to_wait); + + +/** + * @brief Do a SPI transaction + * + * Essentially does the same as spi_slave_queue_trans followed by spi_slave_get_trans_result. Do + * not use this when there is still a transaction queued that hasn't been finalized + * using spi_slave_get_trans_result. + * + * @param host SPI peripheral to that is acting as a slave + * @param trans_desc Pointer to variable able to contain a pointer to the description of the + * transaction that is executed. Not const because we may want to write status back + * into the transaction description. + * @param ticks_to_wait Ticks to wait until there's a returned item; use portMAX_DELAY to never time + * out. + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_OK on success + */ +esp_err_t spi_slave_transmit(spi_host_device_t host, spi_slave_transaction_t *trans_desc, TickType_t ticks_to_wait); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/arch/xtensa/include/esp32/driver/include/driver/timer.h b/arch/xtensa/include/esp32/driver/include/driver/timer.h new file mode 100644 index 0000000000000..f99784410fa2c --- /dev/null +++ b/arch/xtensa/include/esp32/driver/include/driver/timer.h @@ -0,0 +1,452 @@ +// Copyright 2010-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 "esp_err.h" +#include "esp_attr.h" +#include "soc/soc.h" +#include "soc/timer_periph.h" +#include "esp_intr_alloc.h" +#include "hal/timer_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define TIMER_BASE_CLK (APB_CLK_FREQ) /*!< Frequency of the clock on the input of the timer groups */ + +typedef void (*timer_isr_t)(void *); + +/** + * @brief Interrupt handle, used in order to free the isr after use. + * Aliases to an int handle for now. + */ +typedef intr_handle_t timer_isr_handle_t; + +/** + * @brief Read the counter value of hardware timer. + * + * @param group_num Timer group, 0 for TIMERG0 or 1 for TIMERG1 + * @param timer_num Timer index, 0 for hw_timer[0] & 1 for hw_timer[1] + * @param timer_val Pointer to accept timer counter value. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t timer_get_counter_value(timer_group_t group_num, timer_idx_t timer_num, uint64_t *timer_val); + +/** + * @brief Read the counter value of hardware timer, in unit of a given scale. + * + * @param group_num Timer group, 0 for TIMERG0 or 1 for TIMERG1 + * @param timer_num Timer index, 0 for hw_timer[0] & 1 for hw_timer[1] + * @param time Pointer, type of double*, to accept timer counter value, in seconds. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t timer_get_counter_time_sec(timer_group_t group_num, timer_idx_t timer_num, double *time); + +/** + * @brief Set counter value to hardware timer. + * + * @param group_num Timer group, 0 for TIMERG0 or 1 for TIMERG1 + * @param timer_num Timer index, 0 for hw_timer[0] & 1 for hw_timer[1] + * @param load_val Counter value to write to the hardware timer. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t timer_set_counter_value(timer_group_t group_num, timer_idx_t timer_num, uint64_t load_val); + +/** + * @brief Start the counter of hardware timer. + * + * @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] + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t timer_start(timer_group_t group_num, timer_idx_t timer_num); + +/** + * @brief Pause the counter of hardware timer. + * + * @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] + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t timer_pause(timer_group_t group_num, timer_idx_t timer_num); + +/** + * @brief Set counting mode for hardware timer. + * + * @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 counter_dir Counting direction of timer, count-up or count-down + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t timer_set_counter_mode(timer_group_t group_num, timer_idx_t timer_num, timer_count_dir_t counter_dir); + +/** + * @brief Enable or disable counter reload function when alarm event occurs. + * + * @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 reload Counter reload mode. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +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. + * + * @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. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t timer_set_divider(timer_group_t group_num, timer_idx_t timer_num, uint32_t divider); + +/** + * @brief Set timer alarm value. + * + * @param group_num Timer group, 0 for TIMERG0 or 1 for TIMERG1 + * @param timer_num Timer index, 0 for hw_timer[0] & 1 for hw_timer[1] + * @param alarm_value A 64-bit value to set the alarm value. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t timer_set_alarm_value(timer_group_t group_num, timer_idx_t timer_num, uint64_t alarm_value); + +/** + * @brief Get timer alarm value. + * + * @param group_num Timer group, 0 for TIMERG0 or 1 for TIMERG1 + * @param timer_num Timer index, 0 for hw_timer[0] & 1 for hw_timer[1] + * @param alarm_value Pointer of A 64-bit value to accept the alarm value. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t timer_get_alarm_value(timer_group_t group_num, timer_idx_t timer_num, uint64_t *alarm_value); + +/** + * @brief Enable or disable generation of timer alarm events. + * + * @param group_num Timer group, 0 for TIMERG0 or 1 for TIMERG1 + * @param timer_num Timer index, 0 for hw_timer[0] & 1 for hw_timer[1] + * @param alarm_en To enable or disable timer alarm function. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t timer_set_alarm(timer_group_t group_num, timer_idx_t timer_num, timer_alarm_t alarm_en); + +/** + * @brief Add ISR handle callback for the corresponding timer. + * + * @param group_num Timer group number + * @param timer_num Timer index of timer group + * @param isr_handler Interrupt handler function, it is a callback function. + * @param arg Parameter for handler function + * @param 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. + * + * @note This ISR handler will be called from an ISR. + * This ISR handler do not need to handle interrupt status, and should be kept short. + * If you want to realize some specific applications or write the whole ISR, you can + * call timer_isr_register(...) to register ISR. + * + * If the intr_alloc_flags value ESP_INTR_FLAG_IRAM is set, + * the handler function must be declared with IRAM_ATTR attribute + * and can only call functions in IRAM or ROM. It cannot call other timer APIs. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t timer_isr_callback_add(timer_group_t group_num, timer_idx_t timer_num, timer_isr_t isr_handler, void *arg, int intr_alloc_flags); + +/** + * @brief Remove ISR handle callback for the corresponding timer. + * + * @param group_num Timer group number + * @param timer_num Timer index of timer group + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t timer_isr_callback_remove(timer_group_t group_num, timer_idx_t timer_num); + +/** + * @brief Register Timer interrupt handler, the handler is an ISR. + * The handler will be attached to the same CPU core that this function is running on. + * + * @param group_num Timer group number + * @param timer_num Timer index of timer group + * @param fn Interrupt handler function. + * @param arg Parameter for handler function + * @param 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. + * @param handle Pointer to return handle. If non-NULL, a handle for the interrupt will + * be returned here. + * + * @note If use this function to reigster ISR, you need to write the whole ISR. + * In the interrupt handler, you need to call timer_spinlock_take(..) before + * your handling, and call timer_spinlock_give(...) after your handling. + * + * If the intr_alloc_flags value ESP_INTR_FLAG_IRAM is set, + * the handler function must be declared with IRAM_ATTR attribute + * and can only call functions in IRAM or ROM. It cannot call other timer APIs. + * Use direct register access to configure timers from inside the ISR in this case. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t timer_isr_register(timer_group_t group_num, timer_idx_t timer_num, void (*fn)(void *), void *arg, int intr_alloc_flags, timer_isr_handle_t *handle); + +/** @brief Initializes and configure the timer. + * + * @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 config Pointer to timer initialization parameters. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t timer_init(timer_group_t group_num, timer_idx_t timer_num, const timer_config_t *config); + +/** @brief Deinitializes the timer. + * + * @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] + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t timer_deinit(timer_group_t group_num, timer_idx_t timer_num); + +/** @brief Get timer configure value. + * + * @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 config Pointer of struct to accept timer parameters. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t timer_get_config(timer_group_t group_num, timer_idx_t timer_num, timer_config_t *config); + +/** @brief Enable timer group interrupt, by enable mask + * + * @param group_num Timer group number, 0 for TIMERG0 or 1 for TIMERG1 + * @param intr_mask Timer interrupt enable mask. + * - TIMER_INTR_T0: t0 interrupt + * - TIMER_INTR_T1: t1 interrupt + * - TIMER_INTR_WDT: watchdog interrupt + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t timer_group_intr_enable(timer_group_t group_num, timer_intr_t intr_mask); + +/** @brief Disable timer group interrupt, by disable mask + * + * @param group_num Timer group number, 0 for TIMERG0 or 1 for TIMERG1 + * @param intr_mask Timer interrupt disable mask. + * - TIMER_INTR_T0: t0 interrupt + * - TIMER_INTR_T1: t1 interrupt + * - TIMER_INTR_WDT: watchdog interrupt + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t timer_group_intr_disable(timer_group_t group_num, timer_intr_t intr_mask); + +/** @brief Enable timer interrupt + * + * @param group_num Timer group number, 0 for TIMERG0 or 1 for TIMERG1 + * @param timer_num Timer index. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t timer_enable_intr(timer_group_t group_num, timer_idx_t timer_num); + +/** @brief Disable timer interrupt + * + * @param group_num Timer group number, 0 for TIMERG0 or 1 for TIMERG1 + * @param timer_num Timer index. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t timer_disable_intr(timer_group_t group_num, timer_idx_t timer_num); + +/** @brief Clear timer interrupt status, just used in ISR + * + * @param group_num Timer group number, 0 for TIMERG0 or 1 for TIMERG1 + * @param timer_num Timer index. + * + * @return + * - None + */ +void timer_group_intr_clr_in_isr(timer_group_t group_num, timer_idx_t timer_num) __attribute__((deprecated)); + +/** @brief Clear timer interrupt status, just used in ISR + * + * @param group_num Timer group number, 0 for TIMERG0 or 1 for TIMERG1 + * @param timer_num Timer index. + * + * @return + * - None + */ +void timer_group_clr_intr_status_in_isr(timer_group_t group_num, timer_idx_t timer_num); + +/** @brief Enable alarm interrupt, just used in ISR + * + * @param group_num Timer group number, 0 for TIMERG0 or 1 for TIMERG1 + * @param timer_num Timer index. + * + * @return + * - None + */ +void timer_group_enable_alarm_in_isr(timer_group_t group_num, timer_idx_t timer_num); + +/** @brief Get the current counter value, just used in ISR + * + * @param group_num Timer group number, 0 for TIMERG0 or 1 for TIMERG1 + * @param timer_num Timer index. + * + * @return + * - Counter value + */ +uint64_t timer_group_get_counter_value_in_isr(timer_group_t group_num, timer_idx_t timer_num); + +/** @brief Set the alarm threshold for the timer, just used in ISR + * + * @param group_num Timer group number, 0 for TIMERG0 or 1 for TIMERG1 + * @param timer_num Timer index. + * @param alarm_val Alarm threshold. + * + * @return + * - None + */ +void timer_group_set_alarm_value_in_isr(timer_group_t group_num, timer_idx_t timer_num, uint64_t alarm_val); + +/** @brief Enable/disable a counter, just used in ISR + * + * @param group_num Timer group number, 0 for TIMERG0 or 1 for TIMERG1 + * @param timer_num Timer index. + * @param counter_en Enable/disable. + * + * @return + * - None + */ +void timer_group_set_counter_enable_in_isr(timer_group_t group_num, timer_idx_t timer_num, timer_start_t counter_en); + +/** @brief Get the masked interrupt status, just used in ISR + * + * @param group_num Timer group number, 0 for TIMERG0 or 1 for TIMERG1 + * + * @return + * - Interrupt status + */ +timer_intr_t timer_group_intr_get_in_isr(timer_group_t group_num) __attribute__((deprecated)); + +/** @brief Get interrupt status, just used in ISR + * + * @param group_num Timer group number, 0 for TIMERG0 or 1 for TIMERG1 + * + * @return + * - Interrupt status + */ +uint32_t timer_group_get_intr_status_in_isr(timer_group_t group_num); + +/** @brief Clear the masked interrupt status, just used in ISR + * + * @param group_num Timer group number, 0 for TIMERG0 or 1 for TIMERG1 + * @param intr_mask Masked interrupt. + * + * @return + * - None + */ +void timer_group_clr_intr_sta_in_isr(timer_group_t group_num, timer_intr_t intr_mask) __attribute__((deprecated)); + +/** @brief Get auto reload enable status, just used in ISR + * + * @param group_num Timer group number, 0 for TIMERG0 or 1 for TIMERG1 + * @param timer_num Timer index + * + * @return + * - True Auto reload enabled + * - False Auto reload disabled + */ +bool timer_group_get_auto_reload_in_isr(timer_group_t group_num, timer_idx_t timer_num); + +/** @brief Take timer spinlock to enter critical protect + * + * @param group_num Timer group number, 0 for TIMERG0 or 1 for TIMERG1 + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t timer_spinlock_take(timer_group_t group_num); + +/** @brief Give timer spinlock to exit critical protect + * + * @param group_num Timer group number, 0 for TIMERG0 or 1 for TIMERG1 + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t timer_spinlock_give(timer_group_t group_num); + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/driver/include/driver/touch_pad.h b/arch/xtensa/include/esp32/driver/include/driver/touch_pad.h new file mode 100644 index 0000000000000..2cc8518442412 --- /dev/null +++ b/arch/xtensa/include/esp32/driver/include/driver/touch_pad.h @@ -0,0 +1,17 @@ +// 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. + +#pragma once + +#include "touch_sensor_common.h" \ No newline at end of file diff --git a/arch/xtensa/include/esp32/driver/include/driver/touch_sensor_common.h b/arch/xtensa/include/esp32/driver/include/driver/touch_sensor_common.h new file mode 100644 index 0000000000000..7294ffccbd7e5 --- /dev/null +++ b/arch/xtensa/include/esp32/driver/include/driver/touch_sensor_common.h @@ -0,0 +1,162 @@ +// 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. + +#pragma once + +#include "esp_err.h" +#include "esp_intr_alloc.h" +#include "soc/touch_sensor_periph.h" +#include "hal/touch_sensor_types.h" +#include "touch_sensor.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Initialize touch module. + * @note If default parameter don't match the usage scenario, it can be changed after this function. + * @return + * - ESP_OK Success + * - ESP_ERR_NO_MEM Touch pad init error + */ +esp_err_t touch_pad_init(void); + +/** + * @brief Un-install touch pad driver. + * @note After this function is called, other touch functions are prohibited from being called. + * @return + * - ESP_OK Success + * - ESP_FAIL Touch pad driver not initialized + */ +esp_err_t touch_pad_deinit(void); + +/** + * @brief Initialize touch pad GPIO + * @param touch_num touch pad index + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG if argument is wrong + */ +esp_err_t touch_pad_io_init(touch_pad_t touch_num); + +/** + * @brief Set touch sensor high voltage threshold of chanrge. + * The touch sensor measures the channel capacitance value by charging and discharging the channel. + * So the high threshold should be less than the supply voltage. + * @param refh the value of DREFH + * @param refl the value of DREFL + * @param atten the attenuation on DREFH + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG if argument is wrong + */ +esp_err_t touch_pad_set_voltage(touch_high_volt_t refh, touch_low_volt_t refl, touch_volt_atten_t atten); + +/** + * @brief Get touch sensor reference voltage, + * @param refh pointer to accept DREFH value + * @param refl pointer to accept DREFL value + * @param atten pointer to accept the attenuation on DREFH + * @return + * - ESP_OK on success + */ +esp_err_t touch_pad_get_voltage(touch_high_volt_t *refh, touch_low_volt_t *refl, touch_volt_atten_t *atten); + +/** + * @brief Set touch sensor charge/discharge speed for each pad. + * If the slope is 0, the counter would always be zero. + * If the slope is 1, the charging and discharging would be slow, accordingly. + * If the slope is set 7, which is the maximum value, the charging and discharging would be fast. + * @note The higher the charge and discharge current, the greater the immunity of the touch channel, + * but it will increase the system power consumption. + * @param touch_num touch pad index + * @param slope touch pad charge/discharge speed + * @param opt the initial voltage + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG if argument is wrong + */ +esp_err_t touch_pad_set_cnt_mode(touch_pad_t touch_num, touch_cnt_slope_t slope, touch_tie_opt_t opt); + +/** + * @brief Get touch sensor charge/discharge speed for each pad + * @param touch_num touch pad index + * @param slope pointer to accept touch pad charge/discharge slope + * @param opt pointer to accept the initial voltage + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG if argument is wrong + */ +esp_err_t touch_pad_get_cnt_mode(touch_pad_t touch_num, touch_cnt_slope_t *slope, touch_tie_opt_t *opt); + +/** + * @brief Deregister the handler previously registered using touch_pad_isr_handler_register + * @param fn handler function to call (as passed to touch_pad_isr_handler_register) + * @param arg argument of the handler (as passed to touch_pad_isr_handler_register) + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_STATE if a handler matching both fn and + * arg isn't registered + */ +esp_err_t touch_pad_isr_deregister(void(*fn)(void *), void *arg); + +/** + * @brief Get the touch pad which caused wakeup from deep sleep. + * @param pad_num pointer to touch pad which caused wakeup + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG parameter is NULL + */ +esp_err_t touch_pad_get_wakeup_status(touch_pad_t *pad_num); + +/** + * @brief Set touch sensor FSM mode, the test action can be triggered by the timer, + * as well as by the software. + * @param mode FSM mode + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG if argument is wrong + */ +esp_err_t touch_pad_set_fsm_mode(touch_fsm_mode_t mode); + +/** + * @brief Get touch sensor FSM mode + * @param mode pointer to accept FSM mode + * @return + * - ESP_OK on success + */ +esp_err_t touch_pad_get_fsm_mode(touch_fsm_mode_t *mode); + + +/** + * @brief To clear the touch status register, usually use this function in touch ISR to clear status. + * + * @note Generally no manual removal is required. + * @return + * - ESP_OK on success + */ +esp_err_t touch_pad_clear_status(void); + +/** + * @brief Get the touch sensor status, usually used in ISR to decide which pads are 'touched'. + * + * @return + * - The touch sensor status. e.g. Touch1 trigger status is `status_mask & (BIT1)`. + */ +uint32_t touch_pad_get_status(void); + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/arch/xtensa/include/esp32/driver/include/driver/uart.h b/arch/xtensa/include/esp32/driver/include/driver/uart.h new file mode 100644 index 0000000000000..b0596a8cfb532 --- /dev/null +++ b/arch/xtensa/include/esp32/driver/include/driver/uart.h @@ -0,0 +1,851 @@ +// 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. + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "esp_err.h" +#include "esp_intr_alloc.h" +#include "freertos/FreeRTOS.h" +#include "freertos/semphr.h" +#include "freertos/xtensa_api.h" +#include "freertos/task.h" +#include "freertos/queue.h" +#include "freertos/ringbuf.h" +#include "hal/uart_types.h" +#include "soc/uart_caps.h" + +// Valid UART port number +#define UART_NUM_0 (0) /*!< UART port 0 */ +#define UART_NUM_1 (1) /*!< UART port 1 */ +#if SOC_UART_NUM > 2 +#define UART_NUM_2 (2) /*!< UART port 2 */ +#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 UART interrupt configuration parameters for uart_intr_config function + */ +typedef struct { + uint32_t intr_enable_mask; /*!< UART interrupt enable mask, choose from UART_XXXX_INT_ENA_M under UART_INT_ENA_REG(i), connect with bit-or operator*/ + uint8_t rx_timeout_thresh; /*!< UART timeout interrupt threshold (unit: time of sending one byte)*/ + uint8_t txfifo_empty_intr_thresh; /*!< UART TX empty interrupt threshold.*/ + uint8_t rxfifo_full_thresh; /*!< UART RX full interrupt threshold.*/ +} uart_intr_config_t; + +/** + * @brief UART event types used in the ring buffer + */ +typedef enum { + UART_DATA, /*!< UART data event*/ + UART_BREAK, /*!< UART break event*/ + UART_BUFFER_FULL, /*!< UART RX buffer full event*/ + UART_FIFO_OVF, /*!< UART FIFO overflow event*/ + UART_FRAME_ERR, /*!< UART RX frame error event*/ + UART_PARITY_ERR, /*!< UART RX parity event*/ + UART_DATA_BREAK, /*!< UART TX data and break event*/ + UART_PATTERN_DET, /*!< UART pattern detected */ + UART_EVENT_MAX, /*!< UART event max index*/ +} uart_event_type_t; + +/** + * @brief Event structure used in UART event queue + */ +typedef struct { + uart_event_type_t type; /*!< UART event type */ + size_t size; /*!< UART data size for UART_DATA event*/ +} uart_event_t; + +typedef intr_handle_t uart_isr_handle_t; + +/** + * @brief Install UART driver and set the UART to the default configuration. + * + * UART ISR handler will be attached to the same CPU core that this function is running on. + * + * @note Rx_buffer_size should be greater than UART_FIFO_LEN. Tx_buffer_size should be either zero or greater than UART_FIFO_LEN. + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * @param rx_buffer_size UART RX ring buffer size. + * @param tx_buffer_size UART TX ring buffer size. + * If set to zero, driver will not use TX buffer, TX function will block task until all data have been sent out. + * @param queue_size UART event queue size/depth. + * @param uart_queue UART event queue handle (out param). On success, a new queue handle is written here to provide + * access to UART events. If set to NULL, driver will not use an event queue. + * @param 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. Do not set ESP_INTR_FLAG_IRAM here + * (the driver's ISR handler is not located in IRAM) + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +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); + +/** + * @brief Uninstall UART driver. + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_driver_delete(uart_port_t uart_num); + +/** + * @brief Checks whether the driver is installed or not + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * + * @return + * - true driver is installed + * - false driver is not installed + */ +bool uart_is_driver_installed(uart_port_t uart_num); + +/** + * @brief Set UART data bits. + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * @param data_bit UART data bits + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_set_word_length(uart_port_t uart_num, uart_word_length_t data_bit); + +/** + * @brief Get the UART data bit configuration. + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * @param data_bit Pointer to accept value of UART data bits. + * + * @return + * - ESP_FAIL Parameter error + * - ESP_OK Success, result will be put in (*data_bit) + */ +esp_err_t uart_get_word_length(uart_port_t uart_num, uart_word_length_t* data_bit); + +/** + * @brief Set UART stop bits. + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * @param stop_bits UART stop bits + * + * @return + * - ESP_OK Success + * - ESP_FAIL Fail + */ +esp_err_t uart_set_stop_bits(uart_port_t uart_num, uart_stop_bits_t stop_bits); + +/** + * @brief Get the UART stop bit configuration. + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * @param stop_bits Pointer to accept value of UART stop bits. + * + * @return + * - ESP_FAIL Parameter error + * - ESP_OK Success, result will be put in (*stop_bit) + */ +esp_err_t uart_get_stop_bits(uart_port_t uart_num, uart_stop_bits_t* stop_bits); + +/** + * @brief Set UART parity mode. + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * @param parity_mode the enum of uart parity configuration + * + * @return + * - ESP_FAIL Parameter error + * - ESP_OK Success + */ +esp_err_t uart_set_parity(uart_port_t uart_num, uart_parity_t parity_mode); + +/** + * @brief Get the UART parity mode configuration. + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * @param parity_mode Pointer to accept value of UART parity mode. + * + * @return + * - ESP_FAIL Parameter error + * - ESP_OK Success, result will be put in (*parity_mode) + * + */ +esp_err_t uart_get_parity(uart_port_t uart_num, uart_parity_t* parity_mode); + +/** + * @brief Set UART baud rate. + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * @param baudrate UART baud rate. + * + * @return + * - ESP_FAIL Parameter error + * - ESP_OK Success + */ +esp_err_t uart_set_baudrate(uart_port_t uart_num, uint32_t baudrate); + +/** + * @brief Get the UART baud rate configuration. + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * @param baudrate Pointer to accept value of UART baud rate + * + * @return + * - ESP_FAIL Parameter error + * - ESP_OK Success, result will be put in (*baudrate) + * + */ +esp_err_t uart_get_baudrate(uart_port_t uart_num, uint32_t* baudrate); + +/** + * @brief Set UART line inverse mode + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * @param inverse_mask Choose the wires that need to be inverted. Using the ORred mask of `uart_signal_inv_t` + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_set_line_inverse(uart_port_t uart_num, uint32_t inverse_mask); + +/** + * @brief Set hardware flow control. + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * @param flow_ctrl Hardware flow control mode + * @param rx_thresh Threshold of Hardware RX flow control (0 ~ UART_FIFO_LEN). + * Only when UART_HW_FLOWCTRL_RTS is set, will the rx_thresh value be set. + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_set_hw_flow_ctrl(uart_port_t uart_num, uart_hw_flowcontrol_t flow_ctrl, uint8_t rx_thresh); + +/** + * @brief Set software flow control. + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * @param enable switch on or off + * @param rx_thresh_xon low water mark + * @param rx_thresh_xoff high water mark + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ + esp_err_t uart_set_sw_flow_ctrl(uart_port_t uart_num, bool enable, uint8_t rx_thresh_xon, uint8_t rx_thresh_xoff); + +/** + * @brief Get the UART hardware flow control configuration. + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * @param flow_ctrl Option for different flow control mode. + * + * @return + * - ESP_FAIL Parameter error + * - ESP_OK Success, result will be put in (*flow_ctrl) + */ +esp_err_t uart_get_hw_flow_ctrl(uart_port_t uart_num, uart_hw_flowcontrol_t* flow_ctrl); + +/** + * @brief Clear UART interrupt status + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * @param clr_mask Bit mask of the interrupt status to be cleared. + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_clear_intr_status(uart_port_t uart_num, uint32_t clr_mask); + +/** + * @brief Set UART interrupt enable + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * @param enable_mask Bit mask of the enable bits. + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_enable_intr_mask(uart_port_t uart_num, uint32_t enable_mask); + +/** + * @brief Clear UART interrupt enable bits + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * @param disable_mask Bit mask of the disable bits. + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_disable_intr_mask(uart_port_t uart_num, uint32_t disable_mask); + +/** + * @brief Enable UART RX interrupt (RX_FULL & RX_TIMEOUT INTERRUPT) + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_enable_rx_intr(uart_port_t uart_num); + +/** + * @brief Disable UART RX interrupt (RX_FULL & RX_TIMEOUT INTERRUPT) + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_disable_rx_intr(uart_port_t uart_num); + +/** + * @brief Disable UART TX interrupt (TX_FULL & TX_TIMEOUT INTERRUPT) + * + * @param uart_num UART port number + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_disable_tx_intr(uart_port_t uart_num); + +/** + * @brief Enable UART TX interrupt (TX_FULL & TX_TIMEOUT INTERRUPT) + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * @param enable 1: enable; 0: disable + * @param thresh Threshold of TX interrupt, 0 ~ UART_FIFO_LEN + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_enable_tx_intr(uart_port_t uart_num, int enable, int thresh); + +/** + * @brief Register UART interrupt handler (ISR). + * + * @note UART ISR handler will be attached to the same CPU core that this function is running on. + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * @param fn Interrupt handler function. + * @param arg parameter for handler function + * @param 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. + * @param handle Pointer to return handle. If non-NULL, a handle for the interrupt will + * be returned here. + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +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); + +/** + * @brief Free UART interrupt handler registered by uart_isr_register. Must be called on the same core as + * uart_isr_register was called. + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_isr_free(uart_port_t uart_num); + +/** + * @brief Set UART pin number + * + * @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. + * @param rts_io_num UART RTS pin GPIO number. + * @param cts_io_num UART CTS pin GPIO number. + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +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); + +/** + * @brief Manually set the UART RTS pin level. + * @note UART must be configured with hardware flow control disabled. + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * @param level 1: RTS output low (active); 0: RTS output high (block) + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_set_rts(uart_port_t uart_num, int level); + +/** + * @brief Manually set the UART DTR pin level. + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * @param level 1: DTR output low; 0: DTR output high + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_set_dtr(uart_port_t uart_num, int level); + +/** + * @brief Set UART idle interval after tx FIFO is empty + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * @param idle_num idle interval after tx FIFO is empty(unit: the time it takes to send one bit + * under current baudrate) + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_set_tx_idle_num(uart_port_t uart_num, uint16_t idle_num); + +/** + * @brief Set UART configuration parameters. + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * @param uart_config UART parameter settings + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_param_config(uart_port_t uart_num, const uart_config_t *uart_config); + +/** + * @brief Configure UART interrupts. + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * @param intr_conf UART interrupt settings + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_intr_config(uart_port_t uart_num, const uart_intr_config_t *intr_conf); + +/** + * @brief Wait until UART TX FIFO is empty. + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * @param ticks_to_wait Timeout, count in RTOS ticks + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + * - ESP_ERR_TIMEOUT Timeout + */ +esp_err_t uart_wait_tx_done(uart_port_t uart_num, TickType_t ticks_to_wait); + +/** + * @brief Send data to the UART port from a given buffer and length. + * + * This function will not wait for enough space in TX FIFO. It will just fill the available TX FIFO and return when the FIFO is full. + * @note This function should only be used when UART TX buffer is not enabled. + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * @param buffer data buffer address + * @param len data length to send + * + * @return + * - (-1) Parameter error + * - OTHERS (>=0) The number of bytes pushed to the TX FIFO + */ +int uart_tx_chars(uart_port_t uart_num, const char* buffer, uint32_t len); + +/** + * @brief Send data to the UART port from a given buffer and length, + * + * If the UART driver's parameter 'tx_buffer_size' is set to zero: + * This function will not return until all the data have been sent out, or at least pushed into TX FIFO. + * + * Otherwise, if the 'tx_buffer_size' > 0, this function will return after copying all the data to tx ring buffer, + * UART ISR will then move data from the ring buffer to TX FIFO gradually. + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * @param src data buffer address + * @param size data length to send + * + * @return + * - (-1) Parameter error + * - OTHERS (>=0) The number of bytes pushed to the TX FIFO + */ +int uart_write_bytes(uart_port_t uart_num, const char* src, size_t size); + +/** + * @brief Send data to the UART port from a given buffer and length, + * + * If the UART driver's parameter 'tx_buffer_size' is set to zero: + * This function will not return until all the data and the break signal have been sent out. + * After all data is sent out, send a break signal. + * + * Otherwise, if the 'tx_buffer_size' > 0, this function will return after copying all the data to tx ring buffer, + * UART ISR will then move data from the ring buffer to TX FIFO gradually. + * After all data sent out, send a break signal. + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * @param src data buffer address + * @param size data length to send + * @param brk_len break signal duration(unit: the time it takes to send one bit at current baudrate) + * + * @return + * - (-1) Parameter error + * - OTHERS (>=0) The number of bytes pushed to the TX FIFO + */ +int uart_write_bytes_with_break(uart_port_t uart_num, const char* src, size_t size, int brk_len); + +/** + * @brief UART read bytes from UART buffer + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * @param buf pointer to the buffer. + * @param length data length + * @param ticks_to_wait sTimeout, count in RTOS ticks + * + * @return + * - (-1) Error + * - OTHERS (>=0) The number of bytes read from UART FIFO + */ +int uart_read_bytes(uart_port_t uart_num, uint8_t* buf, uint32_t length, TickType_t ticks_to_wait); + +/** + * @brief Alias of uart_flush_input. + * UART ring buffer flush. This will discard all data in the UART RX buffer. + * @note Instead of waiting the data sent out, this function will clear UART rx buffer. + * In order to send all the data in tx FIFO, we can use uart_wait_tx_done function. + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_flush(uart_port_t uart_num); + +/** + * @brief Clear input buffer, discard all the data is in the ring-buffer. + * @note In order to send all the data in tx FIFO, we can use uart_wait_tx_done function. + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_flush_input(uart_port_t uart_num); + +/** + * @brief UART get RX ring buffer cached data length + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * @param size Pointer of size_t to accept cached data length + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_get_buffered_data_len(uart_port_t uart_num, size_t* size); + +/** + * @brief UART disable pattern detect function. + * Designed for applications like 'AT commands'. + * When the hardware detects a series of one same character, the interrupt will be triggered. + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_disable_pattern_det_intr(uart_port_t uart_num); + +#if CONFIG_IDF_TARGET_ESP32 +/** + * @brief UART enable pattern detect function. + * Designed for applications like 'AT commands'. + * When the hardware detect a series of one same character, the interrupt will be triggered. + * @note This function only works for esp32. And this function is deprecated, please use + * uart_enable_pattern_det_baud_intr instead. + * + * @param uart_num UART port number. + * @param pattern_chr character of the pattern. + * @param chr_num number of the character, 8bit value. + * @param chr_tout timeout of the interval between each pattern characters, 24bit value, unit is APB (80Mhz) clock cycle. + * When the duration is less than this value, it will not take this data as at_cmd char. + * @param post_idle idle time after the last pattern character, 24bit value, unit is APB (80Mhz) clock cycle. + * When the duration is less than this value, it will not take the previous data as the last at_cmd char + * @param pre_idle idle time before the first pattern character, 24bit value, unit is APB (80Mhz) clock cycle. + * When the duration is less than this value, it will not take this data as the first at_cmd char. + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_enable_pattern_det_intr(uart_port_t uart_num, char pattern_chr, uint8_t chr_num, int chr_tout, int post_idle, int pre_idle) __attribute__((deprecated)); +#endif + +/** + * @brief UART enable pattern detect function. + * Designed for applications like 'AT commands'. + * When the hardware detect a series of one same character, the interrupt will be triggered. + * + * @param uart_num UART port number. + * @param pattern_chr character of the pattern. + * @param chr_num number of the character, 8bit value. + * @param chr_tout timeout of the interval between each pattern characters, 16bit value, unit is the baud-rate cycle you configured. + * When the duration is more than this value, it will not take this data as at_cmd char. + * @param post_idle idle time after the last pattern character, 16bit value, unit is the baud-rate cycle you configured. + * When the duration is less than this value, it will not take the previous data as the last at_cmd char + * @param pre_idle idle time before the first pattern character, 16bit value, unit is the baud-rate cycle you configured. + * When the duration is less than this value, it will not take this data as the first at_cmd char. + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_enable_pattern_det_baud_intr(uart_port_t uart_num, char pattern_chr, uint8_t chr_num, int chr_tout, int post_idle, int pre_idle); + +/** + * @brief Return the nearest detected pattern position in buffer. + * The positions of the detected pattern are saved in a queue, + * this function will dequeue the first pattern position and move the pointer to next pattern position. + * @note If the RX buffer is full and flow control is not enabled, + * the detected pattern may not be found in the rx buffer due to overflow. + * + * The following APIs will modify the pattern position info: + * uart_flush_input, uart_read_bytes, uart_driver_delete, uart_pop_pattern_pos + * It is the application's responsibility to ensure atomic access to the pattern queue and the rx data buffer + * when using pattern detect feature. + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * @return + * - (-1) No pattern found for current index or parameter error + * - others the pattern position in rx buffer. + */ +int uart_pattern_pop_pos(uart_port_t uart_num); + +/** + * @brief Return the nearest detected pattern position in buffer. + * The positions of the detected pattern are saved in a queue, + * This function do nothing to the queue. + * @note If the RX buffer is full and flow control is not enabled, + * the detected pattern may not be found in the rx buffer due to overflow. + * + * The following APIs will modify the pattern position info: + * uart_flush_input, uart_read_bytes, uart_driver_delete, uart_pop_pattern_pos + * It is the application's responsibility to ensure atomic access to the pattern queue and the rx data buffer + * when using pattern detect feature. + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * @return + * - (-1) No pattern found for current index or parameter error + * - others the pattern position in rx buffer. + */ +int uart_pattern_get_pos(uart_port_t uart_num); + +/** + * @brief Allocate a new memory with the given length to save record the detected pattern position in rx buffer. + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * @param queue_length Max queue length for the detected pattern. + * If the queue length is not large enough, some pattern positions might be lost. + * Set this value to the maximum number of patterns that could be saved in data buffer at the same time. + * @return + * - ESP_ERR_NO_MEM No enough memory + * - ESP_ERR_INVALID_STATE Driver not installed + * - ESP_FAIL Parameter error + * - ESP_OK Success + */ +esp_err_t uart_pattern_queue_reset(uart_port_t uart_num, int queue_length); + +/** + * @brief UART set communication mode + * + * @note This function must be executed after uart_driver_install(), when the driver object is initialized. + * @param uart_num Uart number to configure, the max port number is (UART_NUM_MAX -1). + * @param mode UART UART mode to set + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t uart_set_mode(uart_port_t uart_num, uart_mode_t mode); + +/** + * @brief Set uart threshold value for RX fifo full + * @note If application is using higher baudrate and it is observed that bytes + * in hardware RX fifo are overwritten then this threshold can be reduced + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * @param threshold Threshold value above which RX fifo full interrupt is generated + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_ERR_INVALID_STATE Driver is not installed + */ +esp_err_t uart_set_rx_full_threshold(uart_port_t uart_num, int threshold); + +/** + * @brief Set uart threshold values for TX fifo empty + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * @param threshold Threshold value below which TX fifo empty interrupt is generated + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_ERR_INVALID_STATE Driver is not installed + */ +esp_err_t uart_set_tx_empty_threshold(uart_port_t uart_num, int threshold); + +/** + * @brief UART set threshold timeout for TOUT feature + * + * @param uart_num Uart number to configure, the max port number is (UART_NUM_MAX -1). + * @param tout_thresh This parameter defines timeout threshold in uart symbol periods. The maximum value of threshold is 126. + * tout_thresh = 1, defines TOUT interrupt timeout equal to transmission time of one symbol (~11 bit) on current baudrate. + * If the time is expired the UART_RXFIFO_TOUT_INT interrupt is triggered. If tout_thresh == 0, + * the TOUT feature is disabled. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_ERR_INVALID_STATE Driver is not installed + */ +esp_err_t uart_set_rx_timeout(uart_port_t uart_num, const uint8_t tout_thresh); + +/** + * @brief Returns collision detection flag for RS485 mode + * Function returns the collision detection flag into variable pointed by collision_flag. + * *collision_flag = true, if collision detected else it is equal to false. + * This function should be executed when actual transmission is completed (after uart_write_bytes()). + * + * @param uart_num Uart number to configure the max port number is (UART_NUM_MAX -1). + * @param collision_flag Pointer to variable of type bool to return collision flag. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t uart_get_collision_flag(uart_port_t uart_num, bool* collision_flag); + +/** + * @brief Set the number of RX pin signal edges for light sleep wakeup + * + * UART can be used to wake up the system from light sleep. This feature works + * by counting the number of positive edges on RX pin and comparing the count to + * the threshold. When the count exceeds the threshold, system is woken up from + * light sleep. This function allows setting the threshold value. + * + * Stop bit and parity bits (if enabled) also contribute to the number of edges. + * For example, letter 'a' with ASCII code 97 is encoded as 0100001101 on the wire + * (with 8n1 configuration), start and stop bits included. This sequence has 3 + * positive edges (transitions from 0 to 1). Therefore, to wake up the system + * when 'a' is sent, set wakeup_threshold=3. + * + * The character that triggers wakeup is not received by UART (i.e. it can not + * be obtained from UART FIFO). Depending on the baud rate, a few characters + * after that will also not be received. Note that when the chip enters and exits + * light sleep mode, APB frequency will be changing. To make sure that UART has + * correct baud rate all the time, select REF_TICK as UART clock source, + * by setting use_ref_tick field in uart_config_t to true. + * + * @note in ESP32, the wakeup signal can only be input via IO_MUX (i.e. + * GPIO3 should be configured as function_1 to wake up UART0, + * GPIO9 should be configured as function_5 to wake up UART1), UART2 + * does not support light sleep wakeup feature. + * + * @param uart_num UART number, the max port number is (UART_NUM_MAX -1). + * @param wakeup_threshold number of RX edges for light sleep wakeup, value is 3 .. 0x3ff. + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG if uart_num is incorrect or wakeup_threshold is + * outside of [3, 0x3ff] range. + */ +esp_err_t uart_set_wakeup_threshold(uart_port_t uart_num, int wakeup_threshold); + +/** + * @brief Get the number of RX pin signal edges for light sleep wakeup. + * + * See description of uart_set_wakeup_threshold for the explanation of UART + * wakeup feature. + * + * @param uart_num UART number, the max port number is (UART_NUM_MAX -1). + * @param[out] out_wakeup_threshold output, set to the current value of wakeup + * threshold for the given UART. + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG if out_wakeup_threshold is NULL + */ +esp_err_t uart_get_wakeup_threshold(uart_port_t uart_num, int* out_wakeup_threshold); + +/** + * @brief Wait until UART tx memory empty and the last char send ok (polling mode). + * + * @param uart_num UART number + * + * * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_FAIL Driver not installed + */ +esp_err_t uart_wait_tx_idle_polling(uart_port_t uart_num); + +/** + * @brief Configure TX signal loop back to RX module, just for the test usage. + * + * @param uart_num UART number + * @param loop_back_en Set ture to enable the loop back function, else set it false. + * + * * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_FAIL Driver not installed + */ +esp_err_t uart_set_loop_back(uart_port_t uart_num, bool loop_back_en); + +#ifdef __cplusplus +} +#endif + diff --git a/arch/xtensa/include/esp32/driver/include/driver/uart_select.h b/arch/xtensa/include/esp32/driver/include/driver/uart_select.h new file mode 100644 index 0000000000000..f7a21a315b64c --- /dev/null +++ b/arch/xtensa/include/esp32/driver/include/driver/uart_select.h @@ -0,0 +1,49 @@ + +// 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. + +#ifndef _UART_SELECT_H_ +#define _UART_SELECT_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "driver/uart.h" + +typedef enum { + UART_SELECT_READ_NOTIF, + UART_SELECT_WRITE_NOTIF, + UART_SELECT_ERROR_NOTIF, +} uart_select_notif_t; + +typedef void (*uart_select_notif_callback_t)(uart_port_t uart_num, uart_select_notif_t uart_select_notif, BaseType_t *task_woken); + +/** + * @brief Set notification callback function for select() events + * @param uart_num UART port number + * @param uart_select_notif_callback callback function + */ +void uart_set_select_notif_callback(uart_port_t uart_num, uart_select_notif_callback_t uart_select_notif_callback); + +/** + * @brief Get mutex guarding select() notifications + */ +portMUX_TYPE *uart_get_selectlock(void); + +#ifdef __cplusplus +} +#endif + +#endif //_UART_SELECT_H_ diff --git a/arch/xtensa/include/esp32/esp32_chip/include/esp32/brownout.h b/arch/xtensa/include/esp32/esp32_chip/include/esp32/brownout.h new file mode 100644 index 0000000000000..dafba8dd79ecd --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/esp32/brownout.h @@ -0,0 +1,21 @@ +// 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. + + +#ifndef __ESP_BROWNOUT_H +#define __ESP_BROWNOUT_H + +void esp_brownout_init(void); + +#endif \ No newline at end of file diff --git a/arch/xtensa/include/esp32/esp32_chip/include/esp32/cache_err_int.h b/arch/xtensa/include/esp32/esp32_chip/include/esp32/cache_err_int.h new file mode 100644 index 0000000000000..8881291a2d8fd --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/esp32/cache_err_int.h @@ -0,0 +1,33 @@ +// 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. + + +/** + * @brief initialize cache invalid access interrupt + * + * This function enables cache invalid access interrupt source and connects it + * to interrupt input number ETS_CACHEERR_INUM (see soc/soc.h). It is called + * from the startup code. + */ +void esp_cache_err_int_init(void); + + +/** + * @brief get the CPU which caused cache invalid access interrupt + * @return + * - PRO_CPU_NUM, if PRO_CPU has caused cache IA interrupt + * - APP_CPU_NUM, if APP_CPU has caused cache IA interrupt + * - (-1) otherwise + */ +int esp_cache_err_get_cpuid(void); diff --git a/arch/xtensa/include/esp32/esp32_chip/include/esp32/clk.h b/arch/xtensa/include/esp32/esp32_chip/include/esp32/clk.h new file mode 100644 index 0000000000000..dde169a16e152 --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/esp32/clk.h @@ -0,0 +1,95 @@ +// 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. + +#pragma once +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file esp32/clk.h + * + * This file contains declarations of clock related functions. + */ + +/** + * @brief Get the calibration value of RTC slow clock + * + * The value is in the same format as returned by rtc_clk_cal (microseconds, + * in Q13.19 fixed-point format). + * + * @return the calibration value obtained using rtc_clk_cal, at startup time + */ +uint32_t esp_clk_slowclk_cal_get(void); + +/** + * @brief Update the calibration value of RTC slow clock + * + * The value has to be in the same format as returned by rtc_clk_cal (microseconds, + * in Q13.19 fixed-point format). + * This value is used by timekeeping functions (such as gettimeofday) to + * calculate current time based on RTC counter value. + * @param value calibration value obtained using rtc_clk_cal + */ +void esp_clk_slowclk_cal_set(uint32_t value); + +/** + * @brief Return current CPU clock frequency + * When frequency switching is performed, this frequency may change. + * However it is guaranteed that the frequency never changes with a critical + * section. + * + * @return CPU clock frequency, in Hz + */ +int esp_clk_cpu_freq(void); + +/** + * @brief Return current APB clock frequency + * + * When frequency switching is performed, this frequency may change. + * However it is guaranteed that the frequency never changes with a critical + * section. + * + * @return APB clock frequency, in Hz + */ +int esp_clk_apb_freq(void); + +/** + * @brief Return frequency of the main XTAL + * + * Frequency of the main XTAL can be either auto-detected or set at compile + * time (see CONFIG_ESP32_XTAL_FREQ_SEL sdkconfig option). In both cases, this + * function returns the actual value at run time. + * + * @return XTAL frequency, in Hz + */ +int esp_clk_xtal_freq(void); + + +/** + * @brief Read value of RTC counter, converting it to microseconds + * @attention The value returned by this function may change abruptly when + * calibration value of RTC counter is updated via esp_clk_slowclk_cal_set + * function. This should not happen unless application calls esp_clk_slowclk_cal_set. + * In ESP-IDF, esp_clk_slowclk_cal_set is only called in startup code. + * + * @return Value or RTC counter, expressed in microseconds + */ +uint64_t esp_clk_rtc_time(void); + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/esp32_chip/include/esp32/dport_access.h b/arch/xtensa/include/esp32/esp32_chip/include/esp32/dport_access.h new file mode 100644 index 0000000000000..84095403766ae --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/esp32/dport_access.h @@ -0,0 +1,52 @@ +// 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. + +#include + +#ifndef _ESP_DPORT_ACCESS_H_ +#define _ESP_DPORT_ACCESS_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_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); + +#if defined(BOOTLOADER_BUILD) || !defined(CONFIG_ESP32_DPORT_WORKAROUND) || !defined(ESP_PLATFORM) +#define DPORT_STALL_OTHER_CPU_START() +#define DPORT_STALL_OTHER_CPU_END() +#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() +#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 + +#ifdef __cplusplus +} +#endif + +#endif /* _ESP_DPORT_ACCESS_H_ */ diff --git a/arch/xtensa/include/esp32/esp32_chip/include/esp32/himem.h b/arch/xtensa/include/esp32/esp32_chip/include/esp32/himem.h new file mode 100644 index 0000000000000..0297725a198ff --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/esp32/himem.h @@ -0,0 +1,152 @@ +// 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. +#pragma once + +#include +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +//Opaque pointers as handles for ram/range data +typedef struct esp_himem_ramdata_t *esp_himem_handle_t; +typedef struct esp_himem_rangedata_t *esp_himem_rangehandle_t; + +//ESP32 MMU block size +#define ESP_HIMEM_BLKSZ (0x8000) + +#define ESP_HIMEM_MAPFLAG_RO 1 /*!< Indicates that a mapping will only be read from. Note that this is unused for now. */ + +/** + * @brief Allocate a block in high memory + * + * @param size Size of the to-be-allocated block, in bytes. Note that this needs to be + * a multiple of the external RAM mmu block size (32K). + * @param[out] handle_out Handle to be returned + * @returns - ESP_OK if succesful + * - ESP_ERR_NO_MEM if out of memory + * - ESP_ERR_INVALID_SIZE if size is not a multiple of 32K + */ +esp_err_t esp_himem_alloc(size_t size, esp_himem_handle_t *handle_out); + + +/** + * @brief Allocate a memory region to map blocks into + * + * This allocates a contiguous CPU memory region that can be used to map blocks + * of physical memory into. + * + * @param size Size of the range to be allocated. Note this needs to be a multiple of + * the external RAM mmu block size (32K). + * @param[out] handle_out Handle to be returned + * @returns - ESP_OK if succesful + * - ESP_ERR_NO_MEM if out of memory or address space + * - ESP_ERR_INVALID_SIZE if size is not a multiple of 32K + */ +esp_err_t esp_himem_alloc_map_range(size_t size, esp_himem_rangehandle_t *handle_out); + +/** + * @brief Map a block of high memory into the CPUs address space + * + * This effectively makes the block available for read/write operations. + * + * @note The region to be mapped needs to have offsets and sizes that are aligned to the + * SPI RAM MMU block size (32K) + * + * @param handle Handle to the block of memory, as given by esp_himem_alloc + * @param range Range handle to map the memory in + * @param ram_offset Offset into the block of physical memory of the block to map + * @param range_offset Offset into the address range where the block will be mapped + * @param len Length of region to map + * @param flags One of ESP_HIMEM_MAPFLAG_* + * @param[out] out_ptr Pointer to variable to store resulting memory pointer in + * @returns - ESP_OK if the memory could be mapped + * - ESP_ERR_INVALID_ARG if offset, range or len aren't MMU-block-aligned (32K) + * - ESP_ERR_INVALID_SIZE if the offsets/lengths don't fit in the allocated memory or range + * - ESP_ERR_INVALID_STATE if a block in the selected ram offset/length is already mapped, or + * if a block in the selected range offset/length already has a mapping. + */ +esp_err_t esp_himem_map(esp_himem_handle_t handle, esp_himem_rangehandle_t range, size_t ram_offset, size_t range_offset, size_t len, int flags, void **out_ptr); + + +/** + * @brief Free a block of physical memory + * + * This clears out the associated handle making the memory available for re-allocation again. + * This will only succeed if none of the memory blocks currently have a mapping. + * + * @param handle Handle to the block of memory, as given by esp_himem_alloc + * @returns - ESP_OK if the memory is succesfully freed + * - ESP_ERR_INVALID_ARG if the handle still is (partially) mapped + */ +esp_err_t esp_himem_free(esp_himem_handle_t handle); + + + +/** + * @brief Free a mapping range + * + * This clears out the associated handle making the range available for re-allocation again. + * This will only succeed if none of the range blocks currently are used for a mapping. + * + * @param handle Handle to the range block, as given by esp_himem_alloc_map_range + * @returns - ESP_OK if the memory is succesfully freed + * - ESP_ERR_INVALID_ARG if the handle still is (partially) mapped to + */ +esp_err_t esp_himem_free_map_range(esp_himem_rangehandle_t handle); + + +/** + * @brief Unmap a region + * + * @param range Range handle + * @param ptr Pointer returned by esp_himem_map + * @param len Length of the block to be unmapped. Must be aligned to the SPI RAM MMU blocksize (32K) + * @returns - ESP_OK if the memory is succesfully unmapped, + * - ESP_ERR_INVALID_ARG if ptr or len are invalid. + */ +esp_err_t esp_himem_unmap(esp_himem_rangehandle_t range, void *ptr, size_t len); + + +/** + * @brief Get total amount of memory under control of himem API + * + * @returns Amount of memory, in bytes + */ +size_t esp_himem_get_phys_size(void); + +/** + * @brief Get free amount of memory under control of himem API + * + * @returns Amount of free memory, in bytes + */ +size_t esp_himem_get_free_size(void); + + +/** + * @brief Get amount of SPI memory address space needed for bankswitching + * + * @note This is also weakly defined in esp32/spiram.c and returns 0 there, so + * if no other function in this file is used, no memory is reserved. + * + * @returns Amount of reserved area, in bytes + */ +size_t esp_himem_reserved_area_size(void); + + +#ifdef __cplusplus +} +#endif + diff --git a/arch/xtensa/include/esp32/esp32_chip/include/esp32/pm.h b/arch/xtensa/include/esp32/esp32_chip/include/esp32/pm.h new file mode 100644 index 0000000000000..8c3682cc7ec23 --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/esp32/pm.h @@ -0,0 +1,42 @@ +// 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. + + +#pragma once +#include +#include +#include "esp_err.h" + +#include "soc/rtc.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/** + * @brief Power management config for ESP32 + * + * Pass a pointer to this structure as an argument to esp_pm_configure function. + */ +typedef struct { + int max_freq_mhz; /*!< Maximum CPU frequency, in MHz */ + int min_freq_mhz; /*!< Minimum CPU frequency to use when no locks are taken, in MHz */ + bool light_sleep_enable; /*!< Enter light sleep when no locks are taken */ +} esp_pm_config_esp32_t; + + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/esp32_chip/include/esp32/spiram.h b/arch/xtensa/include/esp32/esp32_chip/include/esp32/spiram.h new file mode 100644 index 0000000000000..ccbca2c0b8d81 --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/esp32/spiram.h @@ -0,0 +1,116 @@ +// 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. + + +#ifndef __ESP_SPIRAM_H +#define __ESP_SPIRAM_H + +#include +#include +#include +#include "esp_err.h" + +typedef enum { + ESP_SPIRAM_SIZE_16MBITS = 0, /*!< SPI RAM size is 16 MBits */ + ESP_SPIRAM_SIZE_32MBITS = 1, /*!< SPI RAM size is 32 MBits */ + ESP_SPIRAM_SIZE_64MBITS = 2, /*!< SPI RAM size is 64 MBits */ + ESP_SPIRAM_SIZE_INVALID, /*!< SPI RAM size is invalid */ +} esp_spiram_size_t; + +/** + * @brief get SPI RAM size + * @return + * - ESP_SPIRAM_SIZE_INVALID if SPI RAM not enabled or not valid + * - SPI RAM size + */ +esp_spiram_size_t esp_spiram_get_chip_size(void); + +/** + * @brief Initialize spiram interface/hardware. Normally called from cpu_start.c. + * + * @return ESP_OK on success + */ +esp_err_t esp_spiram_init(void); + +/** + * @brief Configure Cache/MMU for access to external SPI RAM. + * + * Normally this function is called from cpu_start, if CONFIG_SPIRAM_BOOT_INIT + * option is enabled. Applications which need to enable SPI RAM at run time + * can disable CONFIG_SPIRAM_BOOT_INIT, and call this function later. + * + * @attention this function must be called with flash cache disabled. + */ +void esp_spiram_init_cache(void); + + +/** + * @brief Memory test for SPI RAM. Should be called after SPI RAM is initialized and + * (in case of a dual-core system) the app CPU is online. This test overwrites the + * memory with crap, so do not call after e.g. the heap allocator has stored important + * stuff in SPI RAM. + * + * @return true on success, false on failed memory test + */ +bool esp_spiram_test(void); + + +/** + * @brief Add the initialized SPI RAM to the heap allocator. + */ +esp_err_t esp_spiram_add_to_heapalloc(void); + + +/** + * @brief Get the size of the attached SPI RAM chip selected in menuconfig + * + * @return Size in bytes, or 0 if no external RAM chip support compiled in. + */ +size_t esp_spiram_get_size(void); + + +/** + * @brief Force a writeback of the data in the SPI RAM cache. This is to be called whenever + * cache is disabled, because disabling cache on the ESP32 discards the data in the SPI + * RAM cache. + * + * This is meant for use from within the SPI flash code. + */ +void esp_spiram_writeback_cache(void); + + + +/** + * @brief Reserve a pool of internal memory for specific DMA/internal allocations + * + * @param size Size of reserved pool in bytes + * + * @return + * - ESP_OK on success + * - ESP_ERR_NO_MEM when no memory available for pool + */ +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); + + +#endif diff --git a/arch/xtensa/include/esp32/esp32_chip/include/esp_clk.h b/arch/xtensa/include/esp32/esp32_chip/include/esp_clk.h new file mode 100644 index 0000000000000..920f310c920ec --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/esp_clk.h @@ -0,0 +1,2 @@ +#warning esp_clk.h has been replaced by esp32/clk.h, please include esp32/clk.h instead +#include "esp32/clk.h" diff --git a/arch/xtensa/include/esp32/esp32_chip/include/esp_himem.h b/arch/xtensa/include/esp32/esp32_chip/include/esp_himem.h new file mode 100644 index 0000000000000..c3ac9f52eb10a --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/esp_himem.h @@ -0,0 +1,2 @@ +#warning esp_himem.h has been replaced by esp32/himem.h, please include esp32/himem.h instead +#include "esp32/himem.h" diff --git a/arch/xtensa/include/esp32/esp32_chip/include/esp_intr.h b/arch/xtensa/include/esp32/esp32_chip/include/esp_intr.h new file mode 100644 index 0000000000000..c29dc9bfd1a94 --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/esp_intr.h @@ -0,0 +1,17 @@ +// 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 +#warning esp_intr.h is deprecated, please include esp_intr_alloc.h instead +#include "esp_intr_alloc.h" diff --git a/arch/xtensa/include/esp32/esp32_chip/include/esp_intr_alloc.h b/arch/xtensa/include/esp32/esp32_chip/include/esp_intr_alloc.h new file mode 100644 index 0000000000000..ad201475317f8 --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/esp_intr_alloc.h @@ -0,0 +1,300 @@ +// 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. + +#ifndef __ESP_INTR_ALLOC_H__ +#define __ESP_INTR_ALLOC_H__ + +#include +#include +#include "../../esp_common/esp_err.h" +#include "../../freertos/xtensa_api.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/** @addtogroup Intr_Alloc + * @{ + */ + + +/** @brief Interrupt allocation flags + * + * These flags can be used to specify which interrupt qualities the + * code calling esp_intr_alloc* needs. + * + */ + +//Keep the LEVELx values as they are here; they match up with (1<3 + * is requested, because these types of interrupts aren't C-callable. + * @param arg Optional argument for passed to the interrupt handler + * @param ret_handle Pointer to an intr_handle_t to store a handle that can later be + * used to request details or free the interrupt. Can be NULL if no handle + * is required. + * + * @return ESP_ERR_INVALID_ARG if the combination of arguments is invalid. + * ESP_ERR_NOT_FOUND No free interrupt found with the specified flags + * ESP_OK otherwise + */ +esp_err_t esp_intr_alloc(int source, int flags, intr_handler_t handler, void *arg, intr_handle_t *ret_handle); + + +/** + * @brief Allocate an interrupt with the given parameters. + * + * + * This essentially does the same as esp_intr_alloc, but allows specifying a register and mask + * combo. For shared interrupts, the handler is only called if a read from the specified + * register, ANDed with the mask, returns non-zero. By passing an interrupt status register + * address and a fitting mask, this can be used to accelerate interrupt handling in the case + * a shared interrupt is triggered; by checking the interrupt statuses first, the code can + * decide which ISRs can be skipped + * + * @param source The interrupt source. One of the ETS_*_INTR_SOURCE interrupt mux + * sources, as defined in soc/soc.h, or one of the internal + * ETS_INTERNAL_*_INTR_SOURCE sources as defined in this header. + * @param flags An ORred mask of the ESP_INTR_FLAG_* defines. These restrict the + * choice of interrupts that this routine can choose from. If this value + * is 0, it will default to allocating a non-shared interrupt of level + * 1, 2 or 3. If this is ESP_INTR_FLAG_SHARED, it will allocate a shared + * interrupt of level 1. Setting ESP_INTR_FLAG_INTRDISABLED will return + * from this function with the interrupt disabled. + * @param intrstatusreg The address of an interrupt status register + * @param intrstatusmask A mask. If a read of address intrstatusreg has any of the bits + * that are 1 in the mask set, the ISR will be called. If not, it will be + * skipped. + * @param handler The interrupt handler. Must be NULL when an interrupt of level >3 + * is requested, because these types of interrupts aren't C-callable. + * @param arg Optional argument for passed to the interrupt handler + * @param ret_handle Pointer to an intr_handle_t to store a handle that can later be + * used to request details or free the interrupt. Can be NULL if no handle + * is required. + * + * @return ESP_ERR_INVALID_ARG if the combination of arguments is invalid. + * ESP_ERR_NOT_FOUND No free interrupt found with the specified flags + * ESP_OK otherwise + */ +esp_err_t esp_intr_alloc_intrstatus(int source, int flags, uint32_t intrstatusreg, uint32_t intrstatusmask, intr_handler_t handler, void *arg, intr_handle_t *ret_handle); + + +/** + * @brief Disable and free an interrupt. + * + * Use an interrupt handle to disable the interrupt and release the resources associated with it. + * If the current core is not the core that registered this interrupt, this routine will be assigned to + * the core that allocated this interrupt, blocking and waiting until the resource is successfully released. + * + * @note + * When the handler shares its source with other handlers, the interrupt status + * bits it's responsible for should be managed properly before freeing it. see + * ``esp_intr_disable`` for more details. Please do not call this function in ``esp_ipc_call_blocking``. + * + * @param handle The handle, as obtained by esp_intr_alloc or esp_intr_alloc_intrstatus + * + * @return ESP_ERR_INVALID_ARG the handle is NULL + * ESP_FAIL failed to release this handle + * ESP_OK otherwise + */ +esp_err_t esp_intr_free(intr_handle_t handle); + + +/** + * @brief Get CPU number an interrupt is tied to + * + * @param handle The handle, as obtained by esp_intr_alloc or esp_intr_alloc_intrstatus + * + * @return The core number where the interrupt is allocated + */ +int esp_intr_get_cpu(intr_handle_t handle); + +/** + * @brief Get the allocated interrupt for a certain handle + * + * @param handle The handle, as obtained by esp_intr_alloc or esp_intr_alloc_intrstatus + * + * @return The interrupt number + */ +int esp_intr_get_intno(intr_handle_t handle); + +/** + * @brief Disable the interrupt associated with the handle + * + * @note + * 1. For local interrupts (ESP_INTERNAL_* sources), this function has to be called on the + * CPU the interrupt is allocated on. Other interrupts have no such restriction. + * 2. When several handlers sharing a same interrupt source, interrupt status bits, which are + * handled in the handler to be disabled, should be masked before the disabling, or handled + * in other enabled interrupts properly. Miss of interrupt status handling will cause infinite + * interrupt calls and finally system crash. + * + * @param handle The handle, as obtained by esp_intr_alloc or esp_intr_alloc_intrstatus + * + * @return ESP_ERR_INVALID_ARG if the combination of arguments is invalid. + * ESP_OK otherwise + */ +esp_err_t esp_intr_disable(intr_handle_t handle); + +/** + * @brief Enable the interrupt associated with the handle + * + * @note For local interrupts (ESP_INTERNAL_* sources), this function has to be called on the + * CPU the interrupt is allocated on. Other interrupts have no such restriction. + * + * @param handle The handle, as obtained by esp_intr_alloc or esp_intr_alloc_intrstatus + * + * @return ESP_ERR_INVALID_ARG if the combination of arguments is invalid. + * ESP_OK otherwise + */ +esp_err_t esp_intr_enable(intr_handle_t handle); + +/** + * @brief Set the "in IRAM" status of the handler. + * + * @note Does not work on shared interrupts. + * + * @param handle The handle, as obtained by esp_intr_alloc or esp_intr_alloc_intrstatus + * @param is_in_iram Whether the handler associated with this handle resides in IRAM. + * Handlers residing in IRAM can be called when cache is disabled. + * + * @return ESP_ERR_INVALID_ARG if the combination of arguments is invalid. + * ESP_OK otherwise + */ +esp_err_t esp_intr_set_in_iram(intr_handle_t handle, bool is_in_iram); + +/** + * @brief Disable interrupts that aren't specifically marked as running from IRAM + */ +void esp_intr_noniram_disable(void); + + +/** + * @brief Re-enable interrupts disabled by esp_intr_noniram_disable + */ +void esp_intr_noniram_enable(void); + +/**@}*/ + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/arch/xtensa/include/esp32/esp32_chip/include/esp_sleep.h b/arch/xtensa/include/esp32/esp32_chip/include/esp_sleep.h new file mode 100644 index 0000000000000..b706673270fc8 --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/esp_sleep.h @@ -0,0 +1,363 @@ +// 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. + +#pragma once + +#include +#include "esp_err.h" +#include "driver/gpio.h" +#include "driver/touch_pad.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Logic function used for EXT1 wakeup mode. + */ +typedef enum { + ESP_EXT1_WAKEUP_ALL_LOW = 0, //!< Wake the chip when all selected GPIOs go low + ESP_EXT1_WAKEUP_ANY_HIGH = 1 //!< Wake the chip when any of the selected GPIOs go high +} esp_sleep_ext1_wakeup_mode_t; + +/** + * @brief Power domains which can be powered down in sleep mode + */ +typedef enum { + ESP_PD_DOMAIN_RTC_PERIPH, //!< RTC IO, sensors and ULP co-processor + ESP_PD_DOMAIN_RTC_SLOW_MEM, //!< RTC slow memory + ESP_PD_DOMAIN_RTC_FAST_MEM, //!< RTC fast memory + ESP_PD_DOMAIN_XTAL, //!< XTAL oscillator + ESP_PD_DOMAIN_MAX //!< Number of domains +} esp_sleep_pd_domain_t; + +/** + * @brief Power down options + */ +typedef enum { + ESP_PD_OPTION_OFF, //!< Power down the power domain in sleep mode + ESP_PD_OPTION_ON, //!< Keep power domain enabled during sleep mode + ESP_PD_OPTION_AUTO //!< Keep power domain enabled in sleep mode, if it is needed by one of the wakeup options. Otherwise power it down. +} esp_sleep_pd_option_t; + +/** + * @brief Sleep wakeup cause + */ +typedef enum { + ESP_SLEEP_WAKEUP_UNDEFINED, //!< In case of deep sleep, reset was not caused by exit from deep sleep + ESP_SLEEP_WAKEUP_ALL, //!< Not a wakeup cause, used to disable all wakeup sources with esp_sleep_disable_wakeup_source + ESP_SLEEP_WAKEUP_EXT0, //!< Wakeup caused by external signal using RTC_IO + ESP_SLEEP_WAKEUP_EXT1, //!< Wakeup caused by external signal using RTC_CNTL + ESP_SLEEP_WAKEUP_TIMER, //!< Wakeup caused by timer + ESP_SLEEP_WAKEUP_TOUCHPAD, //!< Wakeup caused by touchpad + ESP_SLEEP_WAKEUP_ULP, //!< Wakeup caused by ULP program + ESP_SLEEP_WAKEUP_GPIO, //!< Wakeup caused by GPIO (light sleep only) + ESP_SLEEP_WAKEUP_UART, //!< Wakeup caused by UART (light sleep only) +} esp_sleep_source_t; + +/* Leave this type define for compatibility */ +typedef esp_sleep_source_t esp_sleep_wakeup_cause_t; + +/** + * @brief Disable wakeup source + * + * This function is used to deactivate wake up trigger for source + * defined as parameter of the function. + * + * @note This function does not modify wake up configuration in RTC. + * It will be performed in esp_sleep_start function. + * + * See docs/sleep-modes.rst for details. + * + * @param source - number of source to disable of type esp_sleep_source_t + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_STATE if trigger was not active + */ +esp_err_t esp_sleep_disable_wakeup_source(esp_sleep_source_t source); + +/** + * @brief Enable wakeup by ULP coprocessor + * @note In revisions 0 and 1 of the ESP32, ULP wakeup source + * can not be used when RTC_PERIPH power domain is forced + * to be powered on (ESP_PD_OPTION_ON) or when ext0 wakeup + * source is used. + * @return + * - ESP_OK on success + * - ESP_ERR_NOT_SUPPORTED if additional current by touch (CONFIG_ESP32_RTC_EXT_CRYST_ADDIT_CURRENT) is enabled. + * - ESP_ERR_INVALID_STATE if ULP co-processor is not enabled or if wakeup triggers conflict + */ +esp_err_t esp_sleep_enable_ulp_wakeup(void); + +/** + * @brief Enable wakeup by timer + * @param time_in_us time before wakeup, in microseconds + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG if value is out of range (TBD) + */ +esp_err_t esp_sleep_enable_timer_wakeup(uint64_t time_in_us); + +/** + * @brief Enable wakeup by touch sensor + * + * @note In revisions 0 and 1 of the ESP32, touch wakeup source + * can not be used when RTC_PERIPH power domain is forced + * to be powered on (ESP_PD_OPTION_ON) or when ext0 wakeup + * source is used. + * + * @note The FSM mode of the touch button should be configured + * as the timer trigger mode. + * + * @return + * - ESP_OK on success + * - ESP_ERR_NOT_SUPPORTED if additional current by touch (CONFIG_ESP32_RTC_EXT_CRYST_ADDIT_CURRENT) is enabled. + * - ESP_ERR_INVALID_STATE if wakeup triggers conflict + */ +esp_err_t esp_sleep_enable_touchpad_wakeup(void); + +/** + * @brief Get the touch pad which caused wakeup + * + * If wakeup was caused by another source, this function will return TOUCH_PAD_MAX; + * + * @return touch pad which caused wakeup + */ +touch_pad_t esp_sleep_get_touchpad_wakeup_status(void); + +/** + * @brief Enable wakeup using a pin + * + * This function uses external wakeup feature of RTC_IO peripheral. + * It will work only if RTC peripherals are kept on during sleep. + * + * This feature can monitor any pin which is an RTC IO. Once the pin transitions + * into the state given by level argument, the chip will be woken up. + * + * @note This function does not modify pin configuration. The pin is + * configured in esp_sleep_start, immediately before entering sleep mode. + * + * @note In revisions 0 and 1 of the ESP32, ext0 wakeup source + * can not be used together with touch or ULP wakeup sources. + * + * @param gpio_num GPIO number used as wakeup source. Only GPIOs which are have RTC + * functionality can be used: 0,2,4,12-15,25-27,32-39. + * @param level input level which will trigger wakeup (0=low, 1=high) + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG if the selected GPIO is not an RTC GPIO, + * or the mode is invalid + * - ESP_ERR_INVALID_STATE if wakeup triggers conflict + */ +esp_err_t esp_sleep_enable_ext0_wakeup(gpio_num_t gpio_num, int level); + +/** + * @brief Enable wakeup using multiple pins + * + * This function uses external wakeup feature of RTC controller. + * It will work even if RTC peripherals are shut down during sleep. + * + * This feature can monitor any number of pins which are in RTC IOs. + * Once any of the selected pins goes into the state given by mode argument, + * the chip will be woken up. + * + * @note This function does not modify pin configuration. The pins are + * configured in esp_sleep_start, immediately before + * entering sleep mode. + * + * @note internal pullups and pulldowns don't work when RTC peripherals are + * shut down. In this case, external resistors need to be added. + * Alternatively, RTC peripherals (and pullups/pulldowns) may be + * kept enabled using esp_sleep_pd_config function. + * + * @param mask bit mask of GPIO numbers which will cause wakeup. Only GPIOs + * which are have RTC functionality can be used in this bit map: + * 0,2,4,12-15,25-27,32-39. + * @param mode select logic function used to determine wakeup condition: + * - ESP_EXT1_WAKEUP_ALL_LOW: wake up when all selected GPIOs are low + * - ESP_EXT1_WAKEUP_ANY_HIGH: wake up when any of the selected GPIOs is high + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG if any of the selected GPIOs is not an RTC GPIO, + * or mode is invalid + */ +esp_err_t esp_sleep_enable_ext1_wakeup(uint64_t mask, esp_sleep_ext1_wakeup_mode_t mode); + +/** + * @brief Enable wakeup from light sleep using GPIOs + * + * Each GPIO supports wakeup function, which can be triggered on either low level + * or high level. Unlike EXT0 and EXT1 wakeup sources, this method can be used + * both for all IOs: RTC IOs and digital IOs. It can only be used to wakeup from + * light sleep though. + * + * To enable wakeup, first call gpio_wakeup_enable, specifying gpio number and + * wakeup level, for each GPIO which is used for wakeup. + * Then call this function to enable wakeup feature. + * + * @note In revisions 0 and 1 of the ESP32, GPIO wakeup source + * can not be used together with touch or ULP wakeup sources. + * + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_STATE if wakeup triggers conflict + */ +esp_err_t esp_sleep_enable_gpio_wakeup(void); + +/** + * @brief Enable wakeup from light sleep using UART + * + * Use uart_set_wakeup_threshold function to configure UART wakeup threshold. + * + * Wakeup from light sleep takes some time, so not every character sent + * to the UART can be received by the application. + * + * @note ESP32 does not support wakeup from UART2. + * + * @param uart_num UART port to wake up from + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG if wakeup from given UART is not supported + */ +esp_err_t esp_sleep_enable_uart_wakeup(int uart_num); + +/** + * @brief Get the bit mask of GPIOs which caused wakeup (ext1) + * + * If wakeup was caused by another source, this function will return 0. + * + * @return bit mask, if GPIOn caused wakeup, BIT(n) will be set + */ +uint64_t esp_sleep_get_ext1_wakeup_status(void); + +/** + * @brief Set power down mode for an RTC power domain in sleep mode + * + * If not set set using this API, all power domains default to ESP_PD_OPTION_AUTO. + * + * @param domain power domain to configure + * @param option power down option (ESP_PD_OPTION_OFF, ESP_PD_OPTION_ON, or ESP_PD_OPTION_AUTO) + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG if either of the arguments is out of range + */ +esp_err_t esp_sleep_pd_config(esp_sleep_pd_domain_t domain, + esp_sleep_pd_option_t option); + +/** + * @brief Enter deep sleep with the configured wakeup options + * + * This function does not return. + */ +void esp_deep_sleep_start(void) __attribute__((noreturn)); + +/** + * @brief Enter light sleep with the configured wakeup options + * + * @return + * - ESP_OK on success (returned after wakeup) + * - ESP_ERR_INVALID_STATE if WiFi or BT is not stopped + */ +esp_err_t esp_light_sleep_start(void); + +/** + * @brief Enter deep-sleep mode + * + * The device will automatically wake up after the deep-sleep time + * Upon waking up, the device calls deep sleep wake stub, and then proceeds + * to load application. + * + * Call to this function is equivalent to a call to esp_deep_sleep_enable_timer_wakeup + * followed by a call to esp_deep_sleep_start. + * + * esp_deep_sleep does not shut down WiFi, BT, and higher level protocol + * connections gracefully. + * Make sure relevant WiFi and BT stack functions are called to close any + * connections and deinitialize the peripherals. These include: + * - esp_bluedroid_disable + * - esp_bt_controller_disable + * - esp_wifi_stop + * + * This function does not return. + * + * @param time_in_us deep-sleep time, unit: microsecond + */ +void esp_deep_sleep(uint64_t time_in_us) __attribute__((noreturn)); + + +/** + * @brief Get the wakeup source which caused wakeup from sleep + * + * @return cause of wake up from last sleep (deep sleep or light sleep) + */ +esp_sleep_wakeup_cause_t esp_sleep_get_wakeup_cause(void); + + +/** + * @brief Default stub to run on wake from deep sleep. + * + * Allows for executing code immediately on wake from sleep, before + * the software bootloader or ESP-IDF app has started up. + * + * This function is weak-linked, so you can implement your own version + * to run code immediately when the chip wakes from + * sleep. + * + * See docs/deep-sleep-stub.rst for details. + */ +void esp_wake_deep_sleep(void); + +/** + * @brief Function type for stub to run on wake from sleep. + * + */ +typedef void (*esp_deep_sleep_wake_stub_fn_t)(void); + +/** + * @brief Install a new stub at runtime to run on wake from deep sleep + * + * If implementing esp_wake_deep_sleep() then it is not necessary to + * call this function. + * + * However, it is possible to call this function to substitute a + * different deep sleep stub. Any function used as a deep sleep stub + * must be marked RTC_IRAM_ATTR, and must obey the same rules given + * for esp_wake_deep_sleep(). + */ +void esp_set_deep_sleep_wake_stub(esp_deep_sleep_wake_stub_fn_t new_stub); + +/** + * @brief Get current wake from deep sleep stub + * @return Return current wake from deep sleep stub, or NULL if + * no stub is installed. + */ +esp_deep_sleep_wake_stub_fn_t esp_get_deep_sleep_wake_stub(void); + +/** + * @brief The default esp-idf-provided esp_wake_deep_sleep() stub. + * + * See docs/deep-sleep-stub.rst for details. + */ +void esp_default_wake_deep_sleep(void); + +/** + * @brief Disable logging from the ROM code after deep sleep. + * + * Using LSB of RTC_STORE4. + */ +void esp_deep_sleep_disable_rom_logging(void); + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/esp32_chip/include/esp_spiram.h b/arch/xtensa/include/esp32/esp32_chip/include/esp_spiram.h new file mode 100644 index 0000000000000..eabd6b6b35126 --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/esp_spiram.h @@ -0,0 +1,2 @@ +#warning esp_spiram.h has been replaced by esp32/spiram.h, please include esp32/spiram.h instead +#include "esp32/spiram.h" diff --git a/arch/xtensa/include/esp32/esp32_chip/include/esp_ssc.h b/arch/xtensa/include/esp32/esp32_chip/include/esp_ssc.h new file mode 100644 index 0000000000000..02893ff410614 --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/esp_ssc.h @@ -0,0 +1,119 @@ +// 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. + +#ifndef __ESP_SSC_H__ +#define __ESP_SSC_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define CMD_T_ASYNC 0x01 +#define CMD_T_SYNC 0x02 + +typedef struct cmd_s { + char *cmd_str; + uint8_t flag; + uint8_t id; + void (* cmd_func)(void); + void (* cmd_callback)(void *arg); +} ssc_cmd_t; + +#define MAX_LINE_N 127 + +typedef enum { + SSC_BR_9600 = 9600, + SSC_BR_19200 = 19200, + SSC_BR_38400 = 38400, + SSC_BR_57600 = 57600, + SSC_BR_74880 = 74880, + SSC_BR_115200 = 115200, + SSC_BR_230400 = 230400, + SSC_BR_460800 = 460800, + SSC_BR_921600 = 921600 +} SscBaudRate; + +/** \defgroup SSC_APIs SSC APIs + * @brief SSC APIs + * + * SSC means simple serial command. + * SSC APIs allows users to define their own command, users can refer to spiffs_test/test_main.c. + * + */ + +/** @addtogroup SSC_APIs + * @{ + */ + +/** + * @brief Initial the ssc function. + * + * @attention param is no use, just compatible with ESP8266, default bandrate is 115200 + * + * @param SscBaudRate bandrate : baud rate + * + * @return null + */ +void ssc_attach(SscBaudRate bandrate); + +/** + * @brief Get the length of the simple serial command. + * + * @param null + * + * @return length of the command. + */ +int ssc_param_len(void); + +/** + * @brief Get the simple serial command string. + * + * @param null + * + * @return the command. + */ +char *ssc_param_str(void); + +/** + * @brief Parse the simple serial command (ssc). + * + * @param char *pLine : [input] the ssc string + * @param char *argv[] : [output] parameters of the ssc + * + * @return the number of parameters. + */ +int ssc_parse_param(char *pLine, char *argv[]); + +/** + * @brief Register the user-defined simple serial command (ssc) set. + * + * @param ssc_cmd_t *cmdset : the ssc set + * @param uint8 cmdnum : number of commands + * @param void (* help)(void) : callback of user-guide + * + * @return null + */ +void ssc_register(ssc_cmd_t *cmdset, uint8_t cmdnum, void (* help)(void)); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __ESP_SSC_H__ */ diff --git a/arch/xtensa/include/esp32/esp32_chip/include/rom/aes.h b/arch/xtensa/include/esp32/esp32_chip/include/rom/aes.h new file mode 100644 index 0000000000000..5cb2e94b82b09 --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/rom/aes.h @@ -0,0 +1,2 @@ +#warning rom/aes.h is deprecated, please use esp32/rom/aes.h instead +#include "esp32/rom/aes.h" diff --git a/arch/xtensa/include/esp32/esp32_chip/include/rom/bigint.h b/arch/xtensa/include/esp32/esp32_chip/include/rom/bigint.h new file mode 100644 index 0000000000000..d6390d003b9fc --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/rom/bigint.h @@ -0,0 +1,2 @@ +#warning rom/bigint.h is deprecated, please use esp32/rom/bigint.h instead +#include "esp32/rom/bigint.h" diff --git a/arch/xtensa/include/esp32/esp32_chip/include/rom/cache.h b/arch/xtensa/include/esp32/esp32_chip/include/rom/cache.h new file mode 100644 index 0000000000000..4b3e44ad5e878 --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/rom/cache.h @@ -0,0 +1,2 @@ +#warning rom/cache.h is deprecated, please use esp32/rom/cache.h instead +#include "esp32/rom/cache.h" diff --git a/arch/xtensa/include/esp32/esp32_chip/include/rom/crc.h b/arch/xtensa/include/esp32/esp32_chip/include/rom/crc.h new file mode 100644 index 0000000000000..85ea280be6576 --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/rom/crc.h @@ -0,0 +1,2 @@ +#warning rom/crc.h is deprecated, please use esp32/rom/crc.h instead +#include "esp32/rom/crc.h" diff --git a/arch/xtensa/include/esp32/esp32_chip/include/rom/efuse.h b/arch/xtensa/include/esp32/esp32_chip/include/rom/efuse.h new file mode 100644 index 0000000000000..511b34c5f84e2 --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/rom/efuse.h @@ -0,0 +1,2 @@ +#warning rom/efuse.h is deprecated, please use esp32/rom/efuse.h instead +#include "esp32/rom/efuse.h" diff --git a/arch/xtensa/include/esp32/esp32_chip/include/rom/ets_sys.h b/arch/xtensa/include/esp32/esp32_chip/include/rom/ets_sys.h new file mode 100644 index 0000000000000..19a1248d4aa1e --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/rom/ets_sys.h @@ -0,0 +1,2 @@ +#warning rom/ets_sys.h is deprecated, please use esp32/rom/ets_sys.h instead +#include "../../../esp_rom/include/esp32/rom/ets_sys.h" diff --git a/arch/xtensa/include/esp32/esp32_chip/include/rom/gpio.h b/arch/xtensa/include/esp32/esp32_chip/include/rom/gpio.h new file mode 100644 index 0000000000000..445586728eb88 --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/rom/gpio.h @@ -0,0 +1,2 @@ +#warning rom/gpio.h is deprecated, please use esp32/rom/gpio.h instead +#include "esp32/rom/gpio.h" diff --git a/arch/xtensa/include/esp32/esp32_chip/include/rom/libc_stubs.h b/arch/xtensa/include/esp32/esp32_chip/include/rom/libc_stubs.h new file mode 100644 index 0000000000000..f6a50125aedff --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/rom/libc_stubs.h @@ -0,0 +1,2 @@ +#warning rom/libc_stubs.h is deprecated, please use esp32/rom/libc_stubs.h instead +#include "esp32/rom/libc_stubs.h" diff --git a/arch/xtensa/include/esp32/esp32_chip/include/rom/lldesc.h b/arch/xtensa/include/esp32/esp32_chip/include/rom/lldesc.h new file mode 100644 index 0000000000000..5d5443bfbc9c2 --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/rom/lldesc.h @@ -0,0 +1,2 @@ +#warning rom/lldesc.h is deprecated, please use esp32/rom/lldesc.h instead +#include "esp32/rom/lldesc.h" diff --git a/arch/xtensa/include/esp32/esp32_chip/include/rom/md5_hash.h b/arch/xtensa/include/esp32/esp32_chip/include/rom/md5_hash.h new file mode 100644 index 0000000000000..4b1cd15aef4da --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/rom/md5_hash.h @@ -0,0 +1,2 @@ +#warning rom/md5_hash.h is deprecated, please use esp32/rom/md5_hash.h instead +#include "esp32/rom/md5_hash.h" diff --git a/arch/xtensa/include/esp32/esp32_chip/include/rom/miniz.h b/arch/xtensa/include/esp32/esp32_chip/include/rom/miniz.h new file mode 100644 index 0000000000000..3837fbd7d0b91 --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/rom/miniz.h @@ -0,0 +1,2 @@ +#warning rom/miniz.h is deprecated, please use esp32/rom/miniz.h instead +#include "esp32/rom/miniz.h" diff --git a/arch/xtensa/include/esp32/esp32_chip/include/rom/queue.h b/arch/xtensa/include/esp32/esp32_chip/include/rom/queue.h new file mode 100644 index 0000000000000..5e0c2109544a7 --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/rom/queue.h @@ -0,0 +1,2 @@ +#warning rom/queue.h is deprecated, please use sys/queue.h instead +#include "sys/queue.h" diff --git a/arch/xtensa/include/esp32/esp32_chip/include/rom/rtc.h b/arch/xtensa/include/esp32/esp32_chip/include/rom/rtc.h new file mode 100644 index 0000000000000..95c7f0faec9a2 --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/rom/rtc.h @@ -0,0 +1,2 @@ +#warning rom/rtc.h is deprecated, please use esp32/rom/rtc.h instead +#include "../../../esp_rom/include/esp32/rom/rtc.h" diff --git a/arch/xtensa/include/esp32/esp32_chip/include/rom/secure_boot.h b/arch/xtensa/include/esp32/esp32_chip/include/rom/secure_boot.h new file mode 100644 index 0000000000000..103958d95902c --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/rom/secure_boot.h @@ -0,0 +1,2 @@ +#warning rom/secure_boot.h is deprecated, please use esp32/rom/secure_boot.h instead +#include "esp32/rom/secure_boot.h" diff --git a/arch/xtensa/include/esp32/esp32_chip/include/rom/sha.h b/arch/xtensa/include/esp32/esp32_chip/include/rom/sha.h new file mode 100644 index 0000000000000..bd7b152d761e6 --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/rom/sha.h @@ -0,0 +1,2 @@ +#warning rom/sha.h is deprecated, please use esp32/rom/sha.h instead +#include "esp32/rom/sha.h" diff --git a/arch/xtensa/include/esp32/esp32_chip/include/rom/spi_flash.h b/arch/xtensa/include/esp32/esp32_chip/include/rom/spi_flash.h new file mode 100644 index 0000000000000..f89834e002a86 --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/rom/spi_flash.h @@ -0,0 +1,2 @@ +#warning rom/spi_flash.h is deprecated, please use esp32/rom/spi_flash.h instead +#include "esp32/rom/spi_flash.h" diff --git a/arch/xtensa/include/esp32/esp32_chip/include/rom/tbconsole.h b/arch/xtensa/include/esp32/esp32_chip/include/rom/tbconsole.h new file mode 100644 index 0000000000000..e077fc458ef4d --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/rom/tbconsole.h @@ -0,0 +1,2 @@ +#warning rom/tbconsole.h is deprecated, please use esp32/rom/tbconsole.h instead +#include "esp32/rom/tbconsole.h" diff --git a/arch/xtensa/include/esp32/esp32_chip/include/rom/tjpgd.h b/arch/xtensa/include/esp32/esp32_chip/include/rom/tjpgd.h new file mode 100644 index 0000000000000..11baa03fb7a33 --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/rom/tjpgd.h @@ -0,0 +1,2 @@ +#warning rom/tjpgd.h is deprecated, please use esp32/rom/tjpgd.h instead +#include "esp32/rom/tjpgd.h" diff --git a/arch/xtensa/include/esp32/esp32_chip/include/rom/uart.h b/arch/xtensa/include/esp32/esp32_chip/include/rom/uart.h new file mode 100644 index 0000000000000..97b2f1a2a5295 --- /dev/null +++ b/arch/xtensa/include/esp32/esp32_chip/include/rom/uart.h @@ -0,0 +1,2 @@ +#warning rom/uart.h is deprecated, please use esp32/rom/uart.h instead +#include "esp32/rom/uart.h" diff --git a/arch/xtensa/include/esp32/esp_common/esp_assert.h b/arch/xtensa/include/esp32/esp_common/esp_assert.h new file mode 100644 index 0000000000000..39d6a32843f7f --- /dev/null +++ b/arch/xtensa/include/esp32/esp_common/esp_assert.h @@ -0,0 +1,37 @@ +// 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. +#ifndef __ESP_ASSERT_H__ +#define __ESP_ASSERT_H__ + +#include "assert.h" + +/* Assert at compile time if possible, runtime otherwise */ +#ifndef __cplusplus +/* __builtin_choose_expr() is only in C, makes this a lot cleaner */ +#define TRY_STATIC_ASSERT(CONDITION, MSG) do { \ + _Static_assert(__builtin_choose_expr(__builtin_constant_p(CONDITION), (CONDITION), 1), #MSG); \ + assert(#MSG && (CONDITION)); \ + } while(0) +#else +/* for C++, use __attribute__((error)) - works almost as well as _Static_assert */ +#define TRY_STATIC_ASSERT(CONDITION, MSG) do { \ + if (__builtin_constant_p(CONDITION) && !(CONDITION)) { \ + extern __attribute__((error(#MSG))) void failed_compile_time_assert(void); \ + failed_compile_time_assert(); \ + } \ + assert(#MSG && (CONDITION)); \ + } while(0) +#endif /* __cplusplus */ + +#endif /* __ESP_ASSERT_H__ */ diff --git a/arch/xtensa/include/esp32/esp_common/esp_bit_defs.h b/arch/xtensa/include/esp32/esp_common/esp_bit_defs.h new file mode 100644 index 0000000000000..d9d464e2ce1b8 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_common/esp_bit_defs.h @@ -0,0 +1,63 @@ +// Copyright 2010-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 + +//Register Bits{{ +#define BIT31 0x80000000 +#define BIT30 0x40000000 +#define BIT29 0x20000000 +#define BIT28 0x10000000 +#define BIT27 0x08000000 +#define BIT26 0x04000000 +#define BIT25 0x02000000 +#define BIT24 0x01000000 +#define BIT23 0x00800000 +#define BIT22 0x00400000 +#define BIT21 0x00200000 +#define BIT20 0x00100000 +#define BIT19 0x00080000 +#define BIT18 0x00040000 +#define BIT17 0x00020000 +#define BIT16 0x00010000 +#define BIT15 0x00008000 +#define BIT14 0x00004000 +#define BIT13 0x00002000 +#define BIT12 0x00001000 +#define BIT11 0x00000800 +#define BIT10 0x00000400 +#define BIT9 0x00000200 +#define BIT8 0x00000100 +#define BIT7 0x00000080 +#define BIT6 0x00000040 +#define BIT5 0x00000020 +#define BIT4 0x00000010 +#define BIT3 0x00000008 +#define BIT2 0x00000004 +#define BIT1 0x00000002 +#define BIT0 0x00000001 +//}} + +#ifndef __ASSEMBLER__ +#ifndef BIT +#define BIT(nr) (1UL << (nr)) +#endif +#ifndef BIT64 +#define BIT64(nr) (1ULL << (nr)) +#endif +#else +#ifndef BIT +#define BIT(nr) (1 << (nr)) +#endif +#endif diff --git a/arch/xtensa/include/esp32/esp_common/esp_compiler.h b/arch/xtensa/include/esp32/esp_common/esp_compiler.h new file mode 100644 index 0000000000000..94ec29c23c6fe --- /dev/null +++ b/arch/xtensa/include/esp32/esp_common/esp_compiler.h @@ -0,0 +1,33 @@ +// Copyright 2016-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 __ESP_COMPILER_H +#define __ESP_COMPILER_H + +/* + * The likely and unlikely macro pairs: + * These macros are useful to place when application + * knows the majority ocurrence of a decision paths, + * placing one of these macros can hint the compiler + * to reorder instructions producing more optimized + * code. + */ +#if (CONFIG_COMPILER_OPTIMIZATION_PERF) +#define likely(x) __builtin_expect(!!(x), 1) +#define unlikely(x) __builtin_expect(!!(x), 0) +#else +#define likely(x) (x) +#define unlikely(x) (x) +#endif + +#endif \ No newline at end of file diff --git a/arch/xtensa/include/esp32/esp_common/esp_crc.h b/arch/xtensa/include/esp32/esp_common/esp_crc.h new file mode 100644 index 0000000000000..34b54ab7f0222 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_common/esp_crc.h @@ -0,0 +1,113 @@ +// 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. +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +#if defined(CONFIG_IDF_TARGET_ESP32) +#include "esp32/rom/crc.h" +#endif + +/******************* Polynomials Used in the CRC APIs **************************** +* CRC-8 x8+x2+x1+1 0x07 +* CRC16-CCITT x16+x12+x5+1 0x1021 +* CRC32 x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x1+1 0x04c11db7 +********************************************************************************/ + +/** +* @brief CRC32 value in little endian. +* +* @param crc: Initial CRC value (result of last calculation or 0 for the first time) +* @param buf: Data buffer that used to calculate the CRC value +* @param len: Length of the data buffer +* @return CRC32 value +*/ +static inline uint32_t esp_crc32_le(uint32_t crc, uint8_t const *buf, uint32_t len) +{ + return crc32_le(crc, buf, len); +} + +/** +* @brief CRC32 value in big endian. +* +* @param crc: Initial CRC value (result of last calculation or 0 for the first time) +* @param buf: Data buffer that used to calculate the CRC value +* @param len: Length of the data buffer +* @return CRC32 value +*/ +static inline uint32_t esp_crc32_be(uint32_t crc, uint8_t const *buf, uint32_t len) +{ + return crc32_be(crc, buf, len); +} + +/** +* @brief CRC16 value in little endian. +* +* @param crc: Initial CRC value (result of last calculation or 0 for the first time) +* @param buf: Data buffer that used to calculate the CRC value +* @param len: Length of the data buffer +* @return CRC16 value +*/ +static inline uint16_t esp_crc16_le(uint16_t crc, uint8_t const *buf, uint32_t len) +{ + return crc16_le(crc, buf, len); +} + +/** +* @brief CRC16 value in big endian. +* +* @param crc: Initial CRC value (result of last calculation or 0 for the first time) +* @param buf: Data buffer that used to calculate the CRC value +* @param len: Length of the data buffer +* @return CRC16 value +*/ +static inline uint16_t esp_crc16_be(uint16_t crc, uint8_t const *buf, uint32_t len) +{ + return crc16_be(crc, buf, len); +} + +/** +* @brief CRC8 value in little endian. +* +* @param crc: Initial CRC value (result of last calculation or 0 for the first time) +* @param buf: Data buffer that used to calculate the CRC value +* @param len: Length of the data buffer +* @return CRC8 value +*/ +static inline uint8_t esp_crc8_le(uint8_t crc, uint8_t const *buf, uint32_t len) +{ + return crc8_le(crc, buf, len); +} + +/** +* @brief CRC8 value in big endian. +* +* @param crc: Initial CRC value (result of last calculation or 0 for the first time) +* @param buf: Data buffer that used to calculate the CRC value +* @param len: Length of the data buffer +* @return CRC8 value +*/ +static inline uint8_t esp_crc8_be(uint8_t crc, uint8_t const *buf, uint32_t len) +{ + return crc8_be(crc, buf, len); +} + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/esp_common/esp_err.h b/arch/xtensa/include/esp32/esp_common/esp_err.h new file mode 100644 index 0000000000000..105723976ddc3 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_common/esp_err.h @@ -0,0 +1,149 @@ +// 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. +#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/arch/xtensa/include/esp32/esp_common/esp_expression_with_stack.h b/arch/xtensa/include/esp32/esp_common/esp_expression_with_stack.h new file mode 100644 index 0000000000000..cd1e4765a85b1 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_common/esp_expression_with_stack.h @@ -0,0 +1,74 @@ +// 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. +#pragma once + +#include "freertos/FreeRTOS.h" +#include "freertos/semphr.h" +#include "esp_debug_helpers.h" +#include "esp_log.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Executes a 1-line expression with a application alocated stack + * @param lock Mutex object to protect in case of shared stack + * @param stack Pointer to user alocated stack + * @param stack_size Size of current stack in bytes + * @param expression Expression or function to be executed using the stack + * @note if either lock, stack or stack size is invalid, the expression will + * be called using the current stack. + */ +#define ESP_EXECUTE_EXPRESSION_WITH_STACK(lock, stack, stack_size, expression) \ +({ \ + assert(lock && stack && (stack_size >= CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE)); \ + uint32_t backup; \ + xSemaphoreTake(lock, portMAX_DELAY); \ + StackType_t *top_of_stack = esp_switch_stack_setup(stack, stack_size); \ + esp_switch_stack_enter(top_of_stack, &backup); \ + { \ + expression; \ + } \ + esp_switch_stack_exit(&backup); \ + xSemaphoreGive(lock); \ +}) + +/** + * @brief Fill stack frame with CPU-specifics value before use + * @param stack Caller allocated stack pointer + * @param stack_size Size of stack in bytes + * @return New pointer to the top of stack + * @note Application must not call this function directly + */ +StackType_t * esp_switch_stack_setup(StackType_t *stack, size_t stack_size); + +/** + * @brief Changes CPU sp-register to use another stack space and save the previous one + * @param stack Caller allocated stack pointer + * @param backup_stack Pointer to a place to save the current stack + * @note Application must not call this function directly + */ +extern void esp_switch_stack_enter(StackType_t *stack, uint32_t *backup_stack); + +/** + * @brief Restores the previous CPU sp-register + * @param backup_stack Pointer to the place where stack was saved + * @note Application must not call this function directly + */ +extern void esp_switch_stack_exit(uint32_t *backup_stack); + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/arch/xtensa/include/esp32/esp_common/esp_fault.h b/arch/xtensa/include/esp32/esp_common/esp_fault.h new file mode 100644 index 0000000000000..e3f340beb8450 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_common/esp_fault.h @@ -0,0 +1,93 @@ +// 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. +#include +#include "soc/rtc_cntl_reg.h" + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Assert a condition is true, in a way that should be resistant to fault injection for + * single fault attacks. + * + * - Expands CONDITION multiple times (condition must have no side effects) + * - Compiler is told all registers are invalid before evaluating CONDITION each time, to avoid a fault + * causing a misread of a register used in all three evaluations of CONDITION. + * - If CONDITION is ever false, a system reset is triggered. + * + * @note Place this macro after a "normal" check of CONDITION that will fail with a normal error + * message. This is the fallback in case a fault injection attack skips or corrupts the result of + * that check. (Although ensure that an attacker can't use fault injection to skip past the "normal" + * error message, to avoid this check entirely.) + * + * @note This macro increases binary size and is slow and should be used sparingly. + * + * @note This macro does not guarantee fault injection resistance. In particular CONDITION must be + * chosen carefully - a fault injection attack which sets CONDITION to true will not be detected by + * this macro. Care must also be taken that an attacker can't use a fault to completely bypass calling + * whatever function tests ESP_FAULT_ASSERT. + * + * @note This is difficult to debug as a failure triggers an instant software reset, and UART output + * is often truncated (as FIFO is not flushed). Define the ESP_FAULT_ASSERT_DEBUG macro to debug any + * failures of this macro due to software bugs. + * + * @param CONDITION A condition which will evaluate true unless an attacker used fault injection to skip or corrupt some other critical system calculation. + * + */ +#define ESP_FAULT_ASSERT(CONDITION) do { \ + asm volatile ("" ::: "memory"); \ + if(!(CONDITION)) _ESP_FAULT_RESET(); \ + asm volatile ("" ::: "memory"); \ + if(!(CONDITION)) _ESP_FAULT_RESET(); \ + asm volatile ("" ::: "memory"); \ + if(!(CONDITION)) _ESP_FAULT_RESET(); \ +} while(0) + + +// Uncomment this macro to get debug output if ESP_FAULT_ASSERT() fails +// +// Note that uncommenting this macro reduces the anti-FI effectiveness +// +//#define ESP_FAULT_ASSERT_DEBUG + +/* Internal macro, purpose is to trigger a system reset if an inconsistency due to fault injection + is detected. + + Illegal instruction opcodes are there as a fallback to crash the CPU in case it doesn't + reset as expected. +*/ +#ifndef ESP_FAULT_ASSERT_DEBUG + +#define _ESP_FAULT_RESET() do { \ + REG_WRITE(RTC_CNTL_OPTIONS0_REG, RTC_CNTL_SW_SYS_RST); \ + asm volatile("ill; ill; ill;"); \ + } while(0) + +#else // ESP_FAULT_ASSERT_DEBUG + +#warning "Enabling ESP_FAULT_ASSERT_DEBUG makes ESP_FAULT_ASSERT() less effective" + +#define _ESP_FAULT_RESET() do { \ + ets_printf("ESP_FAULT_ASSERT %s:%d\n", __FILE__, __LINE__); \ + asm volatile("ill;"); \ + } while(0) + +#endif // ESP_FAULT_ASSERT_DEBUG + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/esp_common/esp_freertos_hooks.h b/arch/xtensa/include/esp32/esp_common/esp_freertos_hooks.h new file mode 100644 index 0000000000000..47db07ce9d603 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_common/esp_freertos_hooks.h @@ -0,0 +1,131 @@ +// 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. + +#ifndef __ESP_FREERTOS_HOOKS_H__ +#define __ESP_FREERTOS_HOOKS_H__ + +#include +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* + Definitions for the tickhook and idlehook callbacks +*/ +typedef bool (*esp_freertos_idle_cb_t)(void); +typedef void (*esp_freertos_tick_cb_t)(void); + +/** + * @brief Register a callback to be called from the specified core's idle hook. + * The callback should return true if it should be called by the idle hook + * once per interrupt (or FreeRTOS tick), and return false if it should + * be called repeatedly as fast as possible by the idle hook. + * + * @warning Idle callbacks MUST NOT, UNDER ANY CIRCUMSTANCES, CALL + * A FUNCTION THAT MIGHT BLOCK. + * + * @param[in] new_idle_cb Callback to be called + * @param[in] cpuid id of the core + * + * @return + * - ESP_OK: Callback registered to the specified core's idle hook + * - ESP_ERR_NO_MEM: No more space on the specified core's idle hook to register callback + * - ESP_ERR_INVALID_ARG: cpuid is invalid + */ +esp_err_t esp_register_freertos_idle_hook_for_cpu(esp_freertos_idle_cb_t new_idle_cb, UBaseType_t cpuid); + +/** + * @brief Register a callback to the idle hook of the core that calls this function. + * The callback should return true if it should be called by the idle hook + * once per interrupt (or FreeRTOS tick), and return false if it should + * be called repeatedly as fast as possible by the idle hook. + * + * @warning Idle callbacks MUST NOT, UNDER ANY CIRCUMSTANCES, CALL + * A FUNCTION THAT MIGHT BLOCK. + * + * @param[in] new_idle_cb Callback to be called + * + * @return + * - ESP_OK: Callback registered to the calling core's idle hook + * - ESP_ERR_NO_MEM: No more space on the calling core's idle hook to register callback + */ +esp_err_t esp_register_freertos_idle_hook(esp_freertos_idle_cb_t new_idle_cb); + +/** + * @brief Register a callback to be called from the specified core's tick hook. + * + * @param[in] new_tick_cb Callback to be called + * @param[in] cpuid id of the core + * + * @return + * - ESP_OK: Callback registered to specified core's tick hook + * - ESP_ERR_NO_MEM: No more space on the specified core's tick hook to register the callback + * - ESP_ERR_INVALID_ARG: cpuid is invalid + */ +esp_err_t esp_register_freertos_tick_hook_for_cpu(esp_freertos_tick_cb_t new_tick_cb, UBaseType_t cpuid); + +/** + * @brief Register a callback to be called from the calling core's tick hook. + * + * @param[in] new_tick_cb Callback to be called + * + * @return + * - ESP_OK: Callback registered to the calling core's tick hook + * - ESP_ERR_NO_MEM: No more space on the calling core's tick hook to register the callback + */ +esp_err_t esp_register_freertos_tick_hook(esp_freertos_tick_cb_t new_tick_cb); + +/** + * @brief Unregister an idle callback from the idle hook of the specified core + * + * @param[in] old_idle_cb Callback to be unregistered + * @param[in] cpuid id of the core + */ +void esp_deregister_freertos_idle_hook_for_cpu(esp_freertos_idle_cb_t old_idle_cb, UBaseType_t cpuid); + +/** + * @brief Unregister an idle callback. If the idle callback is registered to + * the idle hooks of both cores, the idle hook will be unregistered from + * both cores + * + * @param[in] old_idle_cb Callback to be unregistered + */ +void esp_deregister_freertos_idle_hook(esp_freertos_idle_cb_t old_idle_cb); + +/** + * @brief Unregister a tick callback from the tick hook of the specified core + * + * @param[in] old_tick_cb Callback to be unregistered + * @param[in] cpuid id of the core + */ +void esp_deregister_freertos_tick_hook_for_cpu(esp_freertos_tick_cb_t old_tick_cb, UBaseType_t cpuid); + +/** + * @brief Unregister a tick callback. If the tick callback is registered to the + * tick hooks of both cores, the tick hook will be unregistered from + * both cores + * + * @param[in] old_tick_cb Callback to be unregistered + */ +void esp_deregister_freertos_tick_hook(esp_freertos_tick_cb_t old_tick_cb); + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/arch/xtensa/include/esp32/esp_common/esp_idf_version.h b/arch/xtensa/include/esp32/esp_common/esp_idf_version.h new file mode 100644 index 0000000000000..7f982413c3f23 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_common/esp_idf_version.h @@ -0,0 +1,58 @@ +// 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 + +#ifdef __cplusplus +extern "C" { +#endif + +/** Major version number (X.x.x) */ +#define ESP_IDF_VERSION_MAJOR 4 +/** Minor version number (x.X.x) */ +#define ESP_IDF_VERSION_MINOR 1 +/** Patch version number (x.x.X) */ +#define ESP_IDF_VERSION_PATCH 0 + +/** + * Macro to convert IDF version number into an integer + * + * To be used in comparisons, such as ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 0, 0) + */ +#define ESP_IDF_VERSION_VAL(major, minor, patch) ((major << 16) | (minor << 8) | (patch)) + +/** + * Current IDF version, as an integer + * + * To be used in comparisons, such as ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 0, 0) + */ +#define ESP_IDF_VERSION ESP_IDF_VERSION_VAL(ESP_IDF_VERSION_MAJOR, \ + ESP_IDF_VERSION_MINOR, \ + ESP_IDF_VERSION_PATCH) + +/** + * Return full IDF version string, same as 'git describe' output. + * + * @note If you are printing the ESP-IDF version in a log file or other information, + * this function provides more information than using the numerical version macros. + * For example, numerical version macros don't differentiate between development, + * pre-release and release versions, but the output of this function does. + * + * @return constant string from IDF_VER + */ +const char* esp_get_idf_version(void); + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/esp_common/esp_int_wdt.h b/arch/xtensa/include/esp32/esp_common/esp_int_wdt.h new file mode 100644 index 0000000000000..87cc23ec1ef2a --- /dev/null +++ b/arch/xtensa/include/esp32/esp_common/esp_int_wdt.h @@ -0,0 +1,67 @@ +// 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. + +#ifndef __ESP_INT_WDT_H +#define __ESP_INT_WDT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup Watchdog_APIs + * @{ + */ + +/* +This routine enables a watchdog to catch instances of processes disabling +interrupts for too long, or code within interrupt handlers taking too long. +It does this by setting up a watchdog which gets fed from the FreeRTOS +task switch interrupt. When this watchdog times out, initially it will call +a high-level interrupt routine that will panic FreeRTOS in order to allow +for forensic examination of the state of the both CPUs. When this interrupt +handler is not called and the watchdog times out a second time, it will +reset the SoC. + +This uses the TIMERG1 WDT. +*/ + + +/** + * @brief Initialize the non-CPU-specific parts of interrupt watchdog. + * This is called in the init code if the interrupt watchdog + * is enabled in menuconfig. + * + */ +void esp_int_wdt_init(void); + +/** + * @brief Enable the interrupt watchdog on the current CPU. This is called + * in the init code by both CPUs if the interrupt watchdog is enabled + * in menuconfig. + * + */ +void esp_int_wdt_cpu_init(void); + + + +/** + * @} + */ + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/arch/xtensa/include/esp32/esp_common/esp_interface.h b/arch/xtensa/include/esp32/esp_common/esp_interface.h new file mode 100644 index 0000000000000..950c05bb22ca9 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_common/esp_interface.h @@ -0,0 +1,37 @@ +// 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. + + +#ifndef __ESP_INTERFACE_H__ +#define __ESP_INTERFACE_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + ESP_IF_WIFI_STA = 0, /**< ESP32 station interface */ + ESP_IF_WIFI_AP, /**< ESP32 soft-AP interface */ + ESP_IF_ETH, /**< ESP32 ethernet interface */ + ESP_IF_MAX +} esp_interface_t; + +#ifdef __cplusplus +} +#endif + + +#endif /* __ESP_INTERFACE_TYPES_H__ */ diff --git a/arch/xtensa/include/esp32/esp_common/esp_ipc.h b/arch/xtensa/include/esp32/esp_common/esp_ipc.h new file mode 100644 index 0000000000000..477b3d0af4e5f --- /dev/null +++ b/arch/xtensa/include/esp32/esp_common/esp_ipc.h @@ -0,0 +1,93 @@ +// 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. + +#ifndef __ESP_IPC_H__ +#define __ESP_IPC_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif +/** @cond */ +typedef void (*esp_ipc_func_t)(void* arg); +/** @endcond */ +/* + * Inter-processor call APIs + * + * FreeRTOS provides several APIs which can be used to communicate between + * different tasks, including tasks running on different CPUs. + * This module provides additional APIs to run some code on the other CPU. + * + * These APIs can only be used when FreeRTOS scheduler is running. + */ + +/** + * @brief Execute a function on the given CPU + * + * Run a given function on a particular CPU. The given function must accept a + * void* argument and return void. The given function is run in the context of + * the IPC task of the CPU specified by the cpu_id parameter. The calling task + * will be blocked until the IPC task begins executing the given function. If + * another IPC call is ongoing, the calling task will block until the other IPC + * call completes. The stack size allocated for the IPC task can be configured + * in the "Inter-Processor Call (IPC) task stack size" setting in menuconfig. + * Increase this setting if the given function requires more stack than default. + * + * @note In single-core mode, returns ESP_ERR_INVALID_ARG for cpu_id 1. + * + * @param[in] cpu_id CPU where the given function should be executed (0 or 1) + * @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 + * + * @return + * - ESP_ERR_INVALID_ARG if cpu_id is invalid + * - ESP_ERR_INVALID_STATE if the FreeRTOS scheduler is not running + * - ESP_OK otherwise + */ +esp_err_t esp_ipc_call(uint32_t cpu_id, esp_ipc_func_t func, void* arg); + + +/** + * @brief Execute a function on the given CPU and blocks until it completes + * + * Run a given function on a particular CPU. The given function must accept a + * void* argument and return void. The given function is run in the context of + * the IPC task of the CPU specified by the cpu_id parameter. The calling task + * will be blocked until the IPC task completes execution of the given function. + * If another IPC call is ongoing, the calling task will block until the other + * IPC call completes. The stack size allocated for the IPC task can be + * configured in the "Inter-Processor Call (IPC) task stack size" setting in + * menuconfig. Increase this setting if the given function requires more stack + * than default. + * + * @note In single-core mode, returns ESP_ERR_INVALID_ARG for cpu_id 1. + * + * @param[in] cpu_id CPU where the given function should be executed (0 or 1) + * @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 + * + * @return + * - ESP_ERR_INVALID_ARG if cpu_id is invalid + * - ESP_ERR_INVALID_STATE if the FreeRTOS scheduler is not running + * - ESP_OK otherwise + */ +esp_err_t esp_ipc_call_blocking(uint32_t cpu_id, esp_ipc_func_t func, void* arg); + + +#ifdef __cplusplus +} +#endif + +#endif /* __ESP_IPC_H__ */ diff --git a/arch/xtensa/include/esp32/esp_common/esp_pm.h b/arch/xtensa/include/esp32/esp_common/esp_pm.h new file mode 100644 index 0000000000000..6d2028837f534 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_common/esp_pm.h @@ -0,0 +1,182 @@ +// 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. + +#pragma once +#include +#include +#include "esp_err.h" +#include +#if CONFIG_IDF_TARGET_ESP32 +#include "esp32/pm.h" +#elif CONFIG_IDF_TARGET_ESP32S2BETA +#include "esp32s2beta/pm.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Power management constraints + */ +typedef enum { + /** + * Require CPU frequency to be at the maximum value set via esp_pm_configure. + * Argument is unused and should be set to 0. + */ + ESP_PM_CPU_FREQ_MAX, + /** + * Require APB frequency to be at the maximum value supported by the chip. + * Argument is unused and should be set to 0. + */ + ESP_PM_APB_FREQ_MAX, + /** + * Prevent the system from going into light sleep. + * Argument is unused and should be set to 0. + */ + ESP_PM_NO_LIGHT_SLEEP, +} esp_pm_lock_type_t; + +/** + * @brief Set implementation-specific power management configuration + * @param config pointer to implementation-specific configuration structure (e.g. esp_pm_config_esp32) + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG if the configuration values are not correct + * - ESP_ERR_NOT_SUPPORTED if certain combination of values is not supported, + * or if CONFIG_PM_ENABLE is not enabled in sdkconfig + */ +esp_err_t esp_pm_configure(const void* config); + + +/** + * @brief Opaque handle to the power management lock + */ +typedef struct esp_pm_lock* esp_pm_lock_handle_t; + + +/** + * @brief Initialize a lock handle for certain power management parameter + * + * When lock is created, initially it is not taken. + * Call esp_pm_lock_acquire to take the lock. + * + * This function must not be called from an ISR. + * + * @param lock_type Power management constraint which the lock should control + * @param arg argument, value depends on lock_type, see esp_pm_lock_type_t + * @param name arbitrary string identifying the lock (e.g. "wifi" or "spi"). + * Used by the esp_pm_dump_locks function to list existing locks. + * May be set to NULL. If not set to NULL, must point to a string which is valid + * for the lifetime of the lock. + * @param[out] out_handle handle returned from this function. Use this handle when calling + * esp_pm_lock_delete, esp_pm_lock_acquire, esp_pm_lock_release. + * Must not be NULL. + * @return + * - ESP_OK on success + * - ESP_ERR_NO_MEM if the lock structure can not be allocated + * - ESP_ERR_INVALID_ARG if out_handle is NULL or type argument is not valid + * - ESP_ERR_NOT_SUPPORTED if CONFIG_PM_ENABLE is not enabled in sdkconfig + */ +esp_err_t esp_pm_lock_create(esp_pm_lock_type_t lock_type, int arg, + const char* name, esp_pm_lock_handle_t* out_handle); + +/** + * @brief Take a power management lock + * + * Once the lock is taken, power management algorithm will not switch to the + * mode specified in a call to esp_pm_lock_create, or any of the lower power + * modes (higher numeric values of 'mode'). + * + * The lock is recursive, in the sense that if esp_pm_lock_acquire is called + * a number of times, esp_pm_lock_release has to be called the same number of + * times in order to release the lock. + * + * This function may be called from an ISR. + * + * This function is not thread-safe w.r.t. calls to other esp_pm_lock_* + * functions for the same handle. + * + * @param handle handle obtained from esp_pm_lock_create function + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG if the handle is invalid + * - ESP_ERR_NOT_SUPPORTED if CONFIG_PM_ENABLE is not enabled in sdkconfig + */ +esp_err_t esp_pm_lock_acquire(esp_pm_lock_handle_t handle); + +/** + * @brief Release the lock taken using esp_pm_lock_acquire. + * + * Call to this functions removes power management restrictions placed when + * taking the lock. + * + * Locks are recursive, so if esp_pm_lock_acquire is called a number of times, + * esp_pm_lock_release has to be called the same number of times in order to + * actually release the lock. + * + * This function may be called from an ISR. + * + * This function is not thread-safe w.r.t. calls to other esp_pm_lock_* + * functions for the same handle. + * + * @param handle handle obtained from esp_pm_lock_create function + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG if the handle is invalid + * - ESP_ERR_INVALID_STATE if lock is not acquired + * - ESP_ERR_NOT_SUPPORTED if CONFIG_PM_ENABLE is not enabled in sdkconfig + */ +esp_err_t esp_pm_lock_release(esp_pm_lock_handle_t handle); + +/** + * @brief Delete a lock created using esp_pm_lock + * + * The lock must be released before calling this function. + * + * This function must not be called from an ISR. + * + * @param handle handle obtained from esp_pm_lock_create function + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG if the handle argument is NULL + * - ESP_ERR_INVALID_STATE if the lock is still acquired + * - ESP_ERR_NOT_SUPPORTED if CONFIG_PM_ENABLE is not enabled in sdkconfig + */ +esp_err_t esp_pm_lock_delete(esp_pm_lock_handle_t handle); + +/** + * Dump the list of all locks to stderr + * + * This function dumps debugging information about locks created using + * esp_pm_lock_create to an output stream. + * + * This function must not be called from an ISR. If esp_pm_lock_acquire/release + * are called while this function is running, inconsistent results may be + * reported. + * + * @param stream stream to print information to; use stdout or stderr to print + * to the console; use fmemopen/open_memstream to print to a + * string buffer. + * @return + * - ESP_OK on success + * - ESP_ERR_NOT_SUPPORTED if CONFIG_PM_ENABLE is not enabled in sdkconfig + */ +esp_err_t esp_pm_dump_locks(FILE* stream); + + + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/esp_common/esp_private/crosscore_int.h b/arch/xtensa/include/esp32/esp_common/esp_private/crosscore_int.h new file mode 100644 index 0000000000000..d0e3cadc13707 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_common/esp_private/crosscore_int.h @@ -0,0 +1,54 @@ +// 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. +#ifndef __ESP_CROSSCORE_INT_H +#define __ESP_CROSSCORE_INT_H + + +/** + * Initialize the crosscore interrupt system for this CPU. + * This needs to be called once on every CPU that is used + * by FreeRTOS. + * + * If multicore FreeRTOS support is enabled, this will be + * called automatically by the startup code and should not + * be called manually. + */ +void esp_crosscore_int_init(void); + + +/** + * Send an interrupt to a CPU indicating it should yield its + * currently running task in favour of a higher-priority task + * that presumably just woke up. + * + * This is used internally by FreeRTOS in multicore mode + * and should not be called by the user. + * + * @param core_id Core that should do the yielding + */ +void esp_crosscore_int_send_yield(int core_id); + + +/** + * Send an interrupt to a CPU indicating it should update its + * CCOMPARE1 value due to a frequency switch. + * + * This is used internally when dynamic frequency switching is + * enabled, and should not be called from application code. + * + * @param core_id Core that should update its CCOMPARE1 value + */ +void esp_crosscore_int_send_freq_switch(int core_id); + +#endif diff --git a/arch/xtensa/include/esp32/esp_common/esp_private/dbg_stubs.h b/arch/xtensa/include/esp32/esp_common/esp_private/dbg_stubs.h new file mode 100644 index 0000000000000..899dfa56ed82b --- /dev/null +++ b/arch/xtensa/include/esp32/esp_common/esp_private/dbg_stubs.h @@ -0,0 +1,50 @@ +// 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. +#ifndef ESP_DBG_STUBS_H_ +#define ESP_DBG_STUBS_H_ + +#include "esp_err.h" + +/** + * Debug stubs entries IDs + */ +typedef enum { + 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_MAX +} esp_dbg_stub_id_t; + +/** + * @brief Initializes debug stubs. + * + * @note Must be called after esp_apptrace_init() if app tracing is enabled. + */ +void esp_dbg_stubs_init(void); + +/** + * @brief Initializes application tracing module. + * + * @note Should be called before any esp_apptrace_xxx call. + * + * @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. + * + * @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); + +#endif //ESP_DBG_STUBS_H_ \ No newline at end of file diff --git a/arch/xtensa/include/esp32/esp_common/esp_private/esp_timer_impl.h b/arch/xtensa/include/esp32/esp_common/esp_private/esp_timer_impl.h new file mode 100644 index 0000000000000..bee1d07568bc3 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_common/esp_private/esp_timer_impl.h @@ -0,0 +1,101 @@ +// 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. + +#pragma once + +/** + * @file esp_private/esp_timer_impl.h + * + * @brief Interface between common and platform-specific parts of esp_timer. + * + * The functions in this header file are implemented for each supported SoC. + * High level functions defined in esp_timer.c call the functions here to + * interact with the hardware. + */ + +#include +#include "esp_err.h" +#include "esp_intr_alloc.h" + +/** + * @brief Initialize platform specific layer of esp_timer + * @param alarm_handler function to call on timer interrupt + * @return ESP_OK, ESP_ERR_NO_MEM, or one of the errors from interrupt allocator + */ +esp_err_t esp_timer_impl_init(intr_handler_t alarm_handler); + +/** + * @brief Deinitialize platform specific layer of esp_timer + */ +void esp_timer_impl_deinit(void); + +/** + * @brief Set up the timer interrupt to fire at a particular time + * + * If the alarm time is too close in the future, implementation should set the + * alarm to the earliest time possible. + * + * @param timestamp time in microseconds when interrupt should fire (relative to + * boot time, i.e. as returned by esp_timer_impl_get_time) + */ +void esp_timer_impl_set_alarm(uint64_t timestamp); + +/** + * @brief Notify esp_timer implementation that APB frequency has changed + * + * Called by the frequency switching code. + * + * @param apb_ticks_per_us new number of APB clock ticks per microsecond + */ +void esp_timer_impl_update_apb_freq(uint32_t apb_ticks_per_us); + +/** + * @brief Adjust current esp_timer time by a certain value + * + * Called from light sleep code to synchronize esp_timer time with RTC time. + * + * @param time_us adjustment to apply to esp_timer time, in microseconds + */ +void esp_timer_impl_advance(int64_t time_us); + +/** + * @brief Get time, in microseconds, since esp_timer_impl_init was called + * @return timestamp in microseconds + */ +uint64_t esp_timer_impl_get_time(void); + +/** + * @brief Get minimal timer period, in microseconds + * Periods shorter than the one returned may not be possible to achieve due to + * interrupt latency and context switch time. Short period of periodic timer may + * cause the system to spend all the time servicing the interrupt and timer + * callback, preventing other tasks from running. + * @return minimal period of periodic timer, in microseconds + */ +uint64_t esp_timer_impl_get_min_period_us(void); + +/** + * @brief obtain internal critical section used esp_timer implementation + * This can be used when a sequence of calls to esp_timer has to be made, + * and it is necessary that the state of the timer is consistent between + * the calls. Should be treated in the same way as a spinlock. + * Call esp_timer_impl_unlock to release the lock + */ +void esp_timer_impl_lock(void); + + +/** + * @brief counterpart of esp_timer_impl_lock + */ +void esp_timer_impl_unlock(void); diff --git a/arch/xtensa/include/esp32/esp_common/esp_private/gdbstub.h b/arch/xtensa/include/esp32/esp_common/esp_private/gdbstub.h new file mode 100644 index 0000000000000..9e7243aad07ab --- /dev/null +++ b/arch/xtensa/include/esp32/esp_common/esp_private/gdbstub.h @@ -0,0 +1,22 @@ +// 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. +#ifndef GDBSTUB_H +#define GDBSTUB_H + +#include +#include "freertos/xtensa_api.h" + +void esp_gdbstub_panic_handler(XtExcFrame *frame) __attribute__((noreturn)); + +#endif diff --git a/arch/xtensa/include/esp32/esp_common/esp_private/pm_impl.h b/arch/xtensa/include/esp32/esp_common/esp_private/pm_impl.h new file mode 100644 index 0000000000000..c80ad933ce4c2 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_common/esp_private/pm_impl.h @@ -0,0 +1,121 @@ +// 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. + +#pragma once + +/** + * @file esp_private/pm_impl.h + * + * This header file defines interface between PM lock functions (pm_locks.c) + * and the chip-specific power management (DFS/light sleep) implementation. + */ + +#include "soc/rtc.h" +#include "esp_pm.h" +#include "esp_timer.h" +#include + + +/** + * This is an enum of possible power modes supported by the implementation + */ +typedef enum { + PM_MODE_LIGHT_SLEEP,//!< Light sleep + PM_MODE_APB_MIN, //!< Idle (no CPU frequency or APB frequency locks) + PM_MODE_APB_MAX, //!< Maximum APB frequency mode + PM_MODE_CPU_MAX, //!< Maximum CPU frequency mode + PM_MODE_COUNT //!< Number of items +} pm_mode_t; + +/** + * @brief Get the mode corresponding to a certain lock + * @param type lock type + * @param arg argument value for this lock (passed to esp_pm_lock_create) + * @return lowest power consumption mode which meets the constraints of the lock + */ +pm_mode_t esp_pm_impl_get_mode(esp_pm_lock_type_t type, int arg); + +/** + * If profiling is enabled, this data type will be used to store microsecond + * timestamps. + */ +typedef int64_t pm_time_t; + +/** + * See \ref esp_pm_impl_switch_mode + */ +typedef enum { + MODE_LOCK, + MODE_UNLOCK +} pm_mode_switch_t; + +/** + * @brief Switch between power modes when lock is taken or released + * @param mode pm_mode_t corresponding to the lock being taken or released, + * as returned by \ref esp_pm_impl_get_mode + * @param lock_or_unlock + * - MODE_LOCK: lock was taken. Implementation needs to make sure + * that the constraints of the lock are met by switching to the + * given 'mode' or any of the higher power ones. + * - MODE_UNLOCK: lock was released. If all the locks for given + * mode are released, and no locks for higher power modes are + * taken, implementation can switch to one of lower power modes. + * @param now timestamp when the lock was taken or released. Passed as + * a minor optimization, so that the implementation does not need to + * call pm_get_time again. + */ +void esp_pm_impl_switch_mode(pm_mode_t mode, pm_mode_switch_t lock_or_unlock, pm_time_t now); + +/** + * @brief Call once at startup to initialize pm implementation + */ +void esp_pm_impl_init(void); + +/** + * @brief Hook function for the idle task + * Must be called from the IDLE task on each CPU before entering waiti state. + */ +void esp_pm_impl_idle_hook(void); + +/** + * @brief Hook function for the interrupt dispatcher + * Must be called soon after entering the ISR + */ +void esp_pm_impl_isr_hook(void); + +/** + * @brief Dump the information about time spent in each of the pm modes. + * + * Prints three columns: + * mode name, total time in mode (in microseconds), percentage of time in mode + * + * @param out stream to dump the information to + */ +void esp_pm_impl_dump_stats(FILE* out); + +/** + * @brief Hook function implementing `waiti` instruction, should be invoked from idle task context + */ +void esp_pm_impl_waiti(void); + +#ifdef CONFIG_PM_PROFILING +#define WITH_PROFILING +#endif + +#ifdef WITH_PROFILING +static inline pm_time_t IRAM_ATTR pm_get_time(void) +{ + return esp_timer_get_time(); +} +#endif // WITH_PROFILING diff --git a/arch/xtensa/include/esp32/esp_common/esp_private/pm_trace.h b/arch/xtensa/include/esp32/esp_common/esp_private/pm_trace.h new file mode 100644 index 0000000000000..247484624ce79 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_common/esp_private/pm_trace.h @@ -0,0 +1,45 @@ +// 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. + +#pragma once + +#include + +typedef enum { + ESP_PM_TRACE_IDLE, + ESP_PM_TRACE_TICK, + ESP_PM_TRACE_FREQ_SWITCH, + ESP_PM_TRACE_CCOMPARE_UPDATE, + ESP_PM_TRACE_ISR_HOOK, + ESP_PM_TRACE_SLEEP, + ESP_PM_TRACE_TYPE_MAX +} esp_pm_trace_event_t; + +void esp_pm_trace_init(void); +void esp_pm_trace_enter(esp_pm_trace_event_t event, int core_id); +void esp_pm_trace_exit(esp_pm_trace_event_t event, int core_id); + +#ifdef CONFIG_PM_TRACE + +#define ESP_PM_TRACE_ENTER(event, core_id) \ + esp_pm_trace_enter(ESP_PM_TRACE_ ## event, core_id) +#define ESP_PM_TRACE_EXIT(event, core_id) \ + esp_pm_trace_exit(ESP_PM_TRACE_ ## event, core_id) + +#else // CONFIG_PM_TRACE + +#define ESP_PM_TRACE_ENTER(type, core_id) do { (void) core_id; } while(0) +#define ESP_PM_TRACE_EXIT(type, core_id) do { (void) core_id; } while(0) + +#endif // CONFIG_PM_TRACE diff --git a/arch/xtensa/include/esp32/esp_common/esp_private/system_internal.h b/arch/xtensa/include/esp32/esp_common/esp_private/system_internal.h new file mode 100644 index 0000000000000..8ecef8da9e30d --- /dev/null +++ b/arch/xtensa/include/esp32/esp_common/esp_private/system_internal.h @@ -0,0 +1,58 @@ +// 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. + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "esp_system.h" + +#define TG0_WDT_TICK_US 500 + +/** + * @brief Internal function to restart PRO and APP CPUs. + * + * @note This function should not be called from FreeRTOS applications. + * Use esp_restart instead. + * + * This is an internal function called by esp_restart. It is called directly + * by the panic handler and brownout detector interrupt. + */ +void esp_restart_noos(void) __attribute__ ((noreturn)); + +/** + * @brief Internal function to set reset reason hint + * + * The hint is used do distinguish different reset reasons when software reset + * is performed. + * + * The hint is stored in RTC store register, RTC_RESET_CAUSE_REG. + * + * @param hint Desired esp_reset_reason_t value for the real reset reason + */ +void esp_reset_reason_set_hint(esp_reset_reason_t hint); + +/** + * @brief Internal function to get the reset hint value + * @return - Reset hint value previously stored into RTC_RESET_CAUSE_REG using + * esp_reset_reason_set_hint function + * - ESP_RST_UNKNOWN if the value in RTC_RESET_CAUSE_REG is invalid + */ +esp_reset_reason_t esp_reset_reason_get_hint(void); + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/esp_common/esp_system.h b/arch/xtensa/include/esp32/esp_common/esp_system.h new file mode 100644 index 0000000000000..9ab13b457cb5f --- /dev/null +++ b/arch/xtensa/include/esp32/esp_common/esp_system.h @@ -0,0 +1,275 @@ +// 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. + +#ifndef __ESP_SYSTEM_H__ +#define __ESP_SYSTEM_H__ + +#include +#include +#include "esp_err.h" +#include "../xtensa/include/esp_attr.h" +#include "esp_bit_defs.h" +#include "esp_idf_version.h" + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + ESP_MAC_WIFI_STA, + ESP_MAC_WIFI_SOFTAP, + ESP_MAC_BT, + ESP_MAC_ETH, +} esp_mac_type_t; + +/** @cond */ +#define TWO_UNIVERSAL_MAC_ADDR 2 +#define FOUR_UNIVERSAL_MAC_ADDR 4 +#if CONFIG_IDF_TARGET_ESP32 +#define UNIVERSAL_MAC_ADDR_NUM CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES +#elif CONFIG_IDF_TARGET_ESP32S2BETA +#define UNIVERSAL_MAC_ADDR_NUM CONFIG_ESP32S2_UNIVERSAL_MAC_ADDRESSES +#endif +/** @endcond */ + +/** + * @brief Reset reasons + */ +typedef enum { + ESP_RST_UNKNOWN, //!< Reset reason can not be determined + ESP_RST_POWERON, //!< Reset due to power-on event + ESP_RST_EXT, //!< Reset by external pin (not applicable for ESP32) + ESP_RST_SW, //!< Software reset via esp_restart + ESP_RST_PANIC, //!< Software reset due to exception/panic + ESP_RST_INT_WDT, //!< Reset (software or hardware) due to interrupt watchdog + ESP_RST_TASK_WDT, //!< Reset due to task watchdog + ESP_RST_WDT, //!< Reset due to other watchdogs + ESP_RST_DEEPSLEEP, //!< Reset after exiting deep sleep mode + ESP_RST_BROWNOUT, //!< Brownout reset (software or hardware) + ESP_RST_SDIO, //!< Reset over SDIO +} esp_reset_reason_t; + +/** + * Shutdown handler type + */ +typedef void (*shutdown_handler_t)(void); + +/** + * @brief Register shutdown handler + * + * This function allows you to register a handler that gets invoked before + * the application is restarted using esp_restart function. + * @param handle function to execute on restart + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_STATE if the handler has already been registered + * - ESP_ERR_NO_MEM if no more shutdown handler slots are available + */ +esp_err_t esp_register_shutdown_handler(shutdown_handler_t handle); + +/** + * @brief Unregister shutdown handler + * + * This function allows you to unregister a handler which was previously + * registered using esp_register_shutdown_handler function. + * - ESP_OK on success + * - ESP_ERR_INVALID_STATE if the given handler hasn't been registered before + */ +esp_err_t esp_unregister_shutdown_handler(shutdown_handler_t handle); + + +/** + * @brief Restart PRO and APP CPUs. + * + * This function can be called both from PRO and APP CPUs. + * After successful restart, CPU reset reason will be SW_CPU_RESET. + * Peripherals (except for WiFi, BT, UART0, SPI1, and legacy timers) are not reset. + * This function does not return. + */ +void esp_restart(void) __attribute__ ((noreturn)); + +/** + * @brief Get reason of last reset + * @return See description of esp_reset_reason_t for explanation of each value. + */ +esp_reset_reason_t esp_reset_reason(void); + +/** + * @brief Get the size of available heap. + * + * Note that the returned value may be larger than the maximum contiguous block + * which can be allocated. + * + * @return Available heap size, in bytes. + */ +uint32_t esp_get_free_heap_size(void); + +/** + * @brief Get the minimum heap that has ever been available + * + * @return Minimum free heap ever available + */ +uint32_t esp_get_minimum_free_heap_size( void ); + +/** + * @brief Get one random 32-bit word from hardware RNG + * + * The hardware RNG is fully functional whenever an RF subsystem is running (ie Bluetooth or WiFi is enabled). For + * random values, call this function after WiFi or Bluetooth are started. + * + * If the RF subsystem is not used by the program, the function bootloader_random_enable() can be called to enable an + * entropy source. bootloader_random_disable() must be called before RF subsystem or I2S peripheral are used. See these functions' + * documentation for more details. + * + * Any time the app is running without an RF subsystem (or bootloader_random) enabled, RNG hardware should be + * considered a PRNG. A very small amount of entropy is available due to pre-seeding while the IDF + * bootloader is running, but this should not be relied upon for any use. + * + * @return Random value between 0 and UINT32_MAX + */ +uint32_t esp_random(void); + +/** + * @brief Fill a buffer with random bytes from hardware RNG + * + * @note This function has the same restrictions regarding available entropy as esp_random() + * + * @param buf Pointer to buffer to fill with random numbers. + * @param len Length of buffer in bytes + */ +void esp_fill_random(void *buf, size_t len); + +/** + * @brief Set base MAC address with the MAC address which is stored in BLK3 of EFUSE or + * external storage e.g. flash and EEPROM. + * + * Base MAC address is used to generate the MAC addresses used by the networking interfaces. + * If using base MAC address stored in BLK3 of EFUSE or external storage, call this API to set base MAC + * address with the MAC address which is stored in BLK3 of EFUSE or external storage before initializing + * WiFi/BT/Ethernet. + * + * @note Base MAC must be a unicast MAC (least significant bit of first byte must be zero). + * + * @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. + * + * @return ESP_OK on success + * ESP_ERR_INVALID_ARG If mac is NULL or is not a unicast MAC + */ +esp_err_t esp_base_mac_addr_set(const uint8_t *mac); + +/** + * @brief Return base MAC address which is set using esp_base_mac_addr_set. + * + * @param mac base MAC address, length: 6 bytes. + * + * @return ESP_OK on success + * ESP_ERR_INVALID_MAC base MAC address has not been set + */ +esp_err_t esp_base_mac_addr_get(uint8_t *mac); + +/** + * @brief Return base MAC address which was previously written to BLK3 of EFUSE. + * + * Base MAC address is used to generate the MAC addresses used by the networking interfaces. + * This API returns the custom base MAC address which was previously written to BLK3 of EFUSE. + * Writing this EFUSE allows setting of a different (non-Espressif) base MAC address. It is also + * possible to store a custom base MAC address elsewhere, see esp_base_mac_addr_set() for details. + * + * @param mac base MAC address, length: 6 bytes. + * + * @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_t esp_efuse_mac_get_custom(uint8_t *mac); + +/** + * @brief Return base MAC address which is factory-programmed by Espressif in BLK0 of EFUSE. + * + * @param mac base MAC address, length: 6 bytes. + * + * @return ESP_OK on success + */ +esp_err_t esp_efuse_mac_get_default(uint8_t *mac); + +/** + * @brief Read base MAC address and set MAC address of the interface. + * + * This function first get base MAC address using esp_base_mac_addr_get or reads base MAC address + * from BLK0 of EFUSE. Then set the MAC address of the interface including wifi station, wifi softap, + * bluetooth and ethernet. + * + * @param mac MAC address of the interface, length: 6 bytes. + * @param type type of MAC address, 0:wifi station, 1:wifi softap, 2:bluetooth, 3:ethernet. + * + * @return ESP_OK on success + */ +esp_err_t esp_read_mac(uint8_t* mac, esp_mac_type_t type); + +/** + * @brief Derive local MAC address from universal MAC address. + * + * This function derives a local MAC address from an universal MAC address. + * A `definition of local vs universal MAC address can be found on Wikipedia + * `. + * In ESP32, universal MAC address is generated from base MAC address in EFUSE or other external storage. + * Local MAC address is derived from the universal MAC address. + * + * @param local_mac Derived local MAC address, length: 6 bytes. + * @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); + +/** + * @brief Chip models + */ +typedef enum { + CHIP_ESP32 = 1, //!< ESP32 + CHIP_ESP32S2BETA = 2, //!< ESP32-S2 Beta +} esp_chip_model_t; + +/* Chip feature flags, used in esp_chip_info_t */ +#define CHIP_FEATURE_EMB_FLASH BIT(0) //!< Chip has embedded flash memory +#define CHIP_FEATURE_WIFI_BGN BIT(1) //!< Chip has 2.4GHz WiFi +#define CHIP_FEATURE_BLE BIT(4) //!< Chip has Bluetooth LE +#define CHIP_FEATURE_BT BIT(5) //!< Chip has Bluetooth Classic + +/** + * @brief The structure represents information about the chip + */ +typedef struct { + esp_chip_model_t model; //!< chip model, one of esp_chip_model_t + uint32_t features; //!< bit mask of CHIP_FEATURE_x feature flags + uint8_t cores; //!< number of CPU cores + uint8_t revision; //!< chip revision number +} esp_chip_info_t; + +/** + * @brief Fill an esp_chip_info_t structure with information about the chip + * @param[out] out_info structure to be filled + */ +void esp_chip_info(esp_chip_info_t* out_info); + +#ifdef __cplusplus +} +#endif + +#endif /* __ESP_SYSTEM_H__ */ diff --git a/arch/xtensa/include/esp32/esp_common/esp_task.h b/arch/xtensa/include/esp32/esp_common/esp_task.h new file mode 100644 index 0000000000000..66b6cf4ec44e3 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_common/esp_task.h @@ -0,0 +1,58 @@ +// 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 + */ + +#ifndef _ESP_TASK_H_ +#define _ESP_TASK_H_ + +#include +#include "../freertos/FreeRTOS.h" + +#define ESP_TASK_PRIO_MAX (configMAX_PRIORITIES) +#define ESP_TASK_PRIO_MIN (0) + +/* 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_TASK_TIMER_PRIO (ESP_TASK_PRIO_MAX - 3) +#define ESP_TASK_TIMER_STACK (CONFIG_ESP_TIMER_TASK_STACK_SIZE + TASK_EXTRA_STACK_SIZE) +#define ESP_TASKD_EVENT_PRIO (ESP_TASK_PRIO_MAX - 5) +#define ESP_TASKD_EVENT_STACK (CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE + TASK_EXTRA_STACK_SIZE) +#define ESP_TASK_TCPIP_PRIO (ESP_TASK_PRIO_MAX - 7) +#define ESP_TASK_TCPIP_STACK (CONFIG_LWIP_TCPIP_TASK_STACK_SIZE + TASK_EXTRA_STACK_SIZE) +#define ESP_TASK_MAIN_PRIO (ESP_TASK_PRIO_MIN + 1) +#define ESP_TASK_MAIN_STACK (CONFIG_ESP_MAIN_TASK_STACK_SIZE + TASK_EXTRA_STACK_SIZE) + +#endif diff --git a/arch/xtensa/include/esp32/esp_common/esp_task_wdt.h b/arch/xtensa/include/esp32/esp_common/esp_task_wdt.h new file mode 100644 index 0000000000000..cf64cfc14776a --- /dev/null +++ b/arch/xtensa/include/esp32/esp_common/esp_task_wdt.h @@ -0,0 +1,147 @@ +// 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. + +#pragma once + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Initialize the Task Watchdog Timer (TWDT) + * + * This function configures and initializes the TWDT. If the TWDT is already + * initialized when this function is called, this function will update the + * TWDT's timeout period and panic configurations instead. After initializing + * the TWDT, any task can elect to be watched by the TWDT by subscribing to it + * using esp_task_wdt_add(). + * + * @param[in] timeout Timeout period of TWDT in seconds + * @param[in] panic Flag that controls whether the panic handler will be + * executed when the TWDT times out + * + * @return + * - ESP_OK: Initialization was successful + * - ESP_ERR_NO_MEM: Initialization failed due to lack of memory + * + * @note esp_task_wdt_init() must only be called after the scheduler + * started + */ +esp_err_t esp_task_wdt_init(uint32_t timeout, bool panic); + +/** + * @brief Deinitialize the Task Watchdog Timer (TWDT) + * + * This function will deinitialize the TWDT. Calling this function whilst tasks + * are still subscribed to the TWDT, or when the TWDT is already deinitialized, + * will result in an error code being returned. + * + * @return + * - ESP_OK: TWDT successfully deinitialized + * - ESP_ERR_INVALID_STATE: Error, tasks are still subscribed to the TWDT + * - ESP_ERR_NOT_FOUND: Error, TWDT has already been deinitialized + */ +esp_err_t esp_task_wdt_deinit(void); + +/** + * @brief Subscribe a task to the Task Watchdog Timer (TWDT) + * + * This function subscribes a task to the TWDT. Each subscribed task must + * periodically call esp_task_wdt_reset() to prevent the TWDT from elapsing its + * timeout period. Failure to do so will result in a TWDT timeout. If the task + * being subscribed is one of the Idle Tasks, this function will automatically + * enable esp_task_wdt_reset() to called from the Idle Hook of the Idle Task. + * Calling this function whilst the TWDT is uninitialized or attempting to + * subscribe an already subscribed task will result in an error code being + * returned. + * + * @param[in] handle Handle of the task. Input NULL to subscribe the current + * running task to the TWDT + * + * @return + * - ESP_OK: Successfully subscribed the task to the TWDT + * - ESP_ERR_INVALID_ARG: Error, the task is already subscribed + * - ESP_ERR_NO_MEM: Error, could not subscribe the task due to lack of + * memory + * - ESP_ERR_INVALID_STATE: Error, the TWDT has not been initialized yet + */ +esp_err_t esp_task_wdt_add(TaskHandle_t handle); + +/** + * @brief Reset the Task Watchdog Timer (TWDT) on behalf of the currently + * running task + * + * This function will reset the TWDT on behalf of the currently running task. + * Each subscribed task must periodically call this function to prevent the + * TWDT from timing out. If one or more subscribed tasks fail to reset the + * TWDT on their own behalf, a TWDT timeout will occur. If the IDLE tasks have + * been subscribed to the TWDT, they will automatically call this function from + * their idle hooks. Calling this function from a task that has not subscribed + * to the TWDT, or when the TWDT is uninitialized will result in an error code + * being returned. + * + * @return + * - ESP_OK: Successfully reset the TWDT on behalf of the currently + * running task + * - ESP_ERR_NOT_FOUND: Error, the current running task has not subscribed + * to the TWDT + * - ESP_ERR_INVALID_STATE: Error, the TWDT has not been initialized yet + */ +esp_err_t esp_task_wdt_reset(void); + +/** + * @brief Unsubscribes a task from the Task Watchdog Timer (TWDT) + * + * This function will unsubscribe a task from the TWDT. After being + * unsubscribed, the task should no longer call esp_task_wdt_reset(). If the + * task is an IDLE task, this function will automatically disable the calling + * of esp_task_wdt_reset() from the Idle Hook. Calling this function whilst the + * TWDT is uninitialized or attempting to unsubscribe an already unsubscribed + * task from the TWDT will result in an error code being returned. + * + * @param[in] handle Handle of the task. Input NULL to unsubscribe the + * current running task. + * + * @return + * - ESP_OK: Successfully unsubscribed the task from the TWDT + * - ESP_ERR_INVALID_ARG: Error, the task is already unsubscribed + * - ESP_ERR_INVALID_STATE: Error, the TWDT has not been initialized yet + */ +esp_err_t esp_task_wdt_delete(TaskHandle_t handle); + +/** + * @brief Query whether a task is subscribed to the Task Watchdog Timer (TWDT) + * + * This function will query whether a task is currently subscribed to the TWDT, + * or whether the TWDT is initialized. + * + * @param[in] handle Handle of the task. Input NULL to query the current + * running task. + * + * @return: + * - ESP_OK: The task is currently subscribed to the TWDT + * - ESP_ERR_NOT_FOUND: The task is currently not subscribed to the TWDT + * - ESP_ERR_INVALID_STATE: The TWDT is not initialized, therefore no tasks + * can be subscribed + */ +esp_err_t esp_task_wdt_status(TaskHandle_t handle); + + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/esp_common/esp_timer.h b/arch/xtensa/include/esp32/esp_common/esp_timer.h new file mode 100644 index 0000000000000..769c9fe298228 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_common/esp_timer.h @@ -0,0 +1,233 @@ +// 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. + +#pragma once + +/** + * @file esp_timer.h + * @brief microsecond-precision 64-bit timer API, replacement for ets_timer + * + * esp_timer APIs allow components to receive callbacks when a hardware timer + * reaches certain value. The timer provides microsecond accuracy and + * up to 64 bit range. Note that while the timer itself provides microsecond + * accuracy, callbacks are dispatched from an auxiliary task. Some time is + * needed to notify this task from timer ISR, and then to invoke the callback. + * If more than one callback needs to be dispatched at any particular time, + * each subsequent callback will be dispatched only when the previous callback + * returns. Therefore, callbacks should not do much work; instead, they should + * use RTOS notification mechanisms (queues, semaphores, event groups, etc.) to + * pass information to other tasks. + * + * To be implemented: it should be possible to request the callback to be called + * directly from the ISR. This reduces the latency, but has potential impact on + * all other callbacks which need to be dispatched. This option should only be + * used for simple callback functions, which do not take longer than a few + * microseconds to run. + * + * Implementation note: on the ESP32, esp_timer APIs use the "legacy" FRC2 + * timer. Timer callbacks are called from a task running on the PRO CPU. + */ + +#include +#include +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Opaque type representing a single esp_timer + */ +typedef struct esp_timer* esp_timer_handle_t; + +/** + * @brief Timer callback function type + * @param arg pointer to opaque user-specific data + */ +typedef void (*esp_timer_cb_t)(void* arg); + + +/** + * @brief Method for dispatching timer callback + */ +typedef enum { + ESP_TIMER_TASK, //!< Callback is called from timer task + + /* Not supported for now, provision to allow callbacks to run directly + * from an ISR: + + ESP_TIMER_ISR, //!< Callback is called from timer ISR + + */ +} esp_timer_dispatch_t; + +/** + * @brief Timer configuration passed to esp_timer_create + */ +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 +} esp_timer_create_args_t; + +/** + * @brief Initialize esp_timer library + * + * @note This function is called from startup code. Applications do not need + * to call this function before using other esp_timer APIs. + * + * @return + * - ESP_OK on success + * - ESP_ERR_NO_MEM if allocation has failed + * - ESP_ERR_INVALID_STATE if already initialized + * - other errors from interrupt allocator + */ +esp_err_t esp_timer_init(void); + +/** + * @brief De-initialize esp_timer library + * + * @note Normally this function should not be called from applications + * + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_STATE if not yet initialized + */ +esp_err_t esp_timer_deinit(void); + +/** + * @brief Create an esp_timer instance + * + * @note When done using the timer, delete it with esp_timer_delete function. + * + * @param create_args Pointer to a structure with timer creation arguments. + * Not saved by the library, can be allocated on the stack. + * @param[out] out_handle Output, pointer to esp_timer_handle_t variable which + * will hold the created timer handle. + * + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG if some of the create_args are not valid + * - ESP_ERR_INVALID_STATE if esp_timer library is not initialized yet + * - ESP_ERR_NO_MEM if memory allocation fails + */ +esp_err_t esp_timer_create(const esp_timer_create_args_t* create_args, + esp_timer_handle_t* out_handle); + +/** + * @brief Start one-shot timer + * + * Timer should not be running when this function is called. + * + * @param timer timer handle created using esp_timer_create + * @param timeout_us timer timeout, in microseconds relative to the current moment + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG if the handle is invalid + * - ESP_ERR_INVALID_STATE if the timer is already running + */ +esp_err_t esp_timer_start_once(esp_timer_handle_t timer, uint64_t timeout_us); + +/** + * @brief Start a periodic timer + * + * Timer should not be running when this function is called. This function will + * start the timer which will trigger every 'period' microseconds. + * + * @param timer timer handle created using esp_timer_create + * @param period timer period, in microseconds + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG if the handle is invalid + * - ESP_ERR_INVALID_STATE if the timer is already running + */ +esp_err_t esp_timer_start_periodic(esp_timer_handle_t timer, uint64_t period); + +/** + * @brief Stop the timer + * + * This function stops the timer previously started using esp_timer_start_once + * or esp_timer_start_periodic. + * + * @param timer timer handle created using esp_timer_create + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_STATE if the timer is not running + */ +esp_err_t esp_timer_stop(esp_timer_handle_t timer); + +/** + * @brief Delete an esp_timer instance + * + * The timer must be stopped before deleting. A one-shot timer which has expired + * does not need to be stopped. + * + * @param timer timer handle allocated using esp_timer_create + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_STATE if the timer is not running + */ +esp_err_t esp_timer_delete(esp_timer_handle_t timer); + +/** + * @brief Get time in microseconds since boot + * @return number of microseconds since esp_timer_init was called (this normally + * happens early during application startup). + */ +int64_t esp_timer_get_time(void); + +/** + * @brief Get the timestamp when the next timeout is expected to occur + * @return Timestamp of the nearest timer event, in microseconds. + * The timebase is the same as for the values returned by esp_timer_get_time. + */ +int64_t esp_timer_get_next_alarm(void); + +/** + * @brief Dump the list of timers to a stream + * + * If CONFIG_ESP_TIMER_PROFILING option is enabled, this prints the list of all + * the existing timers. Otherwise, only the list active timers is printed. + * + * The format is: + * + * name period alarm times_armed times_triggered total_callback_run_time + * + * where: + * + * name — timer name (if CONFIG_ESP_TIMER_PROFILING is defined), or timer pointer + * period — period of timer, in microseconds, or 0 for one-shot timer + * alarm - time of the next alarm, in microseconds since boot, or 0 if the timer + * is not started + * + * The following fields are printed if CONFIG_ESP_TIMER_PROFILING is defined: + * + * times_armed — number of times the timer was armed via esp_timer_start_X + * times_triggered - number of times the callback was called + * total_callback_run_time - total time taken by callback to execute, across all calls + * + * @param stream stream (such as stdout) to dump the information to + * @return + * - ESP_OK on success + * - ESP_ERR_NO_MEM if can not allocate temporary buffer for the output + */ +esp_err_t esp_timer_dump(FILE* stream); + + +#ifdef __cplusplus +} +#endif + diff --git a/arch/xtensa/include/esp32/esp_common/esp_types.h b/arch/xtensa/include/esp32/esp_common/esp_types.h new file mode 100644 index 0000000000000..547024e3f7548 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_common/esp_types.h @@ -0,0 +1,25 @@ +// 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. + +#ifndef __ESP_TYPES_H__ +#define __ESP_TYPES_H__ + +#ifdef __GNUC__ +#include +#endif /*__GNUC__*/ +#include +#include +#include + +#endif /* __ESP_TYPES_H__ */ diff --git a/arch/xtensa/include/esp32/esp_eth/Kconfig b/arch/xtensa/include/esp32/esp_eth/Kconfig new file mode 100644 index 0000000000000..b11b4a31b004f --- /dev/null +++ b/arch/xtensa/include/esp32/esp_eth/Kconfig @@ -0,0 +1,148 @@ +menu "Ethernet" + + # Invisible item that is enabled if any Ethernet selection is made + config ETH_ENABLED + bool + + menuconfig ETH_USE_ESP32_EMAC + depends on IDF_TARGET_ESP32 + bool "Support ESP32 internal EMAC controller" + default y + select ETH_ENABLED + help + ESP32 integrates a 10/100M Ethernet MAC controller. + + if ETH_USE_ESP32_EMAC + choice ETH_PHY_INTERFACE + prompt "PHY interface" + default ETH_PHY_INTERFACE_RMII + help + Select the communication interface between MAC and PHY chip. + + config ETH_PHY_INTERFACE_RMII + bool "Reduced Media Independent Interface (RMII)" + + config ETH_PHY_INTERFACE_MII + bool "Media Independent Interface (MII)" + endchoice + + if ETH_PHY_INTERFACE_RMII + choice ETH_RMII_CLK_MODE + prompt "RMII clock mode" + default ETH_RMII_CLK_INPUT + help + Select external or internal RMII clock. + + config ETH_RMII_CLK_INPUT + bool "Input RMII clock from external" + help + MAC will get RMII clock from outside. + Note that ESP32 only supports GPIO0 to input the RMII clock. + + config ETH_RMII_CLK_OUTPUT + bool "Output RMII clock from internal" + help + ESP32 can generate RMII clock by internal APLL. + This clock can be routed to the external PHY device. + ESP32 supports to route the RMII clock to GPIO0/16/17. + endchoice + endif + + if ETH_RMII_CLK_INPUT + config ETH_RMII_CLK_IN_GPIO + int + range 0 0 + default 0 + help + ESP32 only supports GPIO0 to input the RMII clock. + endif + + if ETH_RMII_CLK_OUTPUT + config ETH_RMII_CLK_OUTPUT_GPIO0 + bool "Output RMII clock from GPIO0 (Experimental!)" + default n + help + GPIO0 can be set to output a pre-divided PLL clock (test only!). + Enabling this option will configure GPIO0 to output a 50MHz clock. + In fact this clock doesn't have directly relationship with EMAC peripheral. + Sometimes this clock won't work well with your PHY chip. You might need to + add some extra devices after GPIO0 (e.g. inverter). + Note that outputting RMII clock on GPIO0 is an experimental practice. + If you want the Ethernet to work with WiFi, don't select GPIO0 output mode for stability. + + if !ETH_RMII_CLK_OUTPUT_GPIO0 + config ETH_RMII_CLK_OUT_GPIO + int "RMII clock GPIO number" + range 16 17 + default 17 + help + Set the GPIO number to output RMII Clock. + endif + endif + + config ETH_DMA_BUFFER_SIZE + int "Ethernet DMA buffer size (Byte)" + range 256 1600 + default 512 + help + Set the size of each buffer used by Ethernet MAC DMA. + + config ETH_DMA_RX_BUFFER_NUM + int "Amount of Ethernet DMA Rx buffers" + range 3 30 + default 10 + help + Number of DMA receive buffers. Each buffer's size is ETH_DMA_BUFFER_SIZE. + Larger number of buffers could increase throughput somehow. + + config ETH_DMA_TX_BUFFER_NUM + int "Amount of Ethernet DMA Tx buffers" + range 3 30 + default 10 + help + Number of DMA transmit buffers. Each buffer's size is ETH_DMA_BUFFER_SIZE. + Larger number of buffers could increase throughput somehow. + endif + + menuconfig ETH_USE_SPI_ETHERNET + bool "Support SPI to Ethernet Module" + default y + select ETH_ENABLED + help + ESP-IDF can also support some SPI-Ethernet modules. + + if ETH_USE_SPI_ETHERNET + config ETH_SPI_ETHERNET_DM9051 + bool "Use DM9051" + default y + help + DM9051 is a fast Ethernet controller with an SPI interface. + It's also integrated with a 10/100M PHY and MAC. + Set true to enable DM9051 driver. + endif + + menuconfig ETH_USE_OPENETH + bool "Support OpenCores Ethernet MAC (for use with QEMU)" + default n + select ETH_ENABLED + help + OpenCores Ethernet MAC driver can be used when an ESP-IDF application + is executed in QEMU. This driver is not supported when running on a + real chip. + + if ETH_USE_OPENETH + config ETH_OPENETH_DMA_RX_BUFFER_NUM + int "Number of Ethernet DMA Rx buffers" + range 1 64 + default 4 + help + Number of DMA receive buffers, each buffer is 1600 bytes. + + config ETH_OPENETH_DMA_TX_BUFFER_NUM + int "Number of Ethernet DMA Tx buffers" + range 1 64 + default 1 + help + Number of DMA transmit buffers, each buffer is 1600 bytes. + endif +endmenu diff --git a/arch/xtensa/include/esp32/esp_eth/include/esp_eth.h b/arch/xtensa/include/esp32/esp_eth/include/esp_eth.h new file mode 100644 index 0000000000000..34ee91594f8a7 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_eth/include/esp_eth.h @@ -0,0 +1,257 @@ +// 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 + +#ifdef __cplusplus +extern "C" { +#endif + +#include "esp_eth_com.h" +#include "esp_eth_mac.h" +#include "esp_eth_phy.h" + +/** +* @brief Handle of Ethernet driver +* +*/ +typedef void *esp_eth_handle_t; + +/** +* @brief Configuration of Ethernet driver +* +*/ +typedef struct { + /** + * @brief Ethernet MAC object + * + */ + esp_eth_mac_t *mac; + + /** + * @brief Ethernet PHY object + * + */ + esp_eth_phy_t *phy; + + /** + * @brief Period time of checking Ethernet link status + * + */ + uint32_t check_link_period_ms; + + /** + * @brief Input frame buffer to user's stack + * + * @param[in] eth_handle: handle of Ethernet driver + * @param[in] buffer: frame buffer that will get input to upper stack + * @param[in] length: length of the frame buffer + * + * @return + * - ESP_OK: input frame buffer to upper stack successfully + * - ESP_FAIL: error occurred when inputting buffer to upper stack + * + */ + esp_err_t (*stack_input)(esp_eth_handle_t eth_handle, uint8_t *buffer, uint32_t length, void *priv); + + /** + * @brief Callback function invoked when lowlevel initialization is finished + * + * @param[in] eth_handle: handle of Ethernet driver + * + * @return + * - ESP_OK: process extra lowlevel initialization successfully + * - ESP_FAIL: error occurred when processing extra lowlevel initialization + */ + esp_err_t (*on_lowlevel_init_done)(esp_eth_handle_t eth_handle); + + /** + * @brief Callback function invoked when lowlevel deinitialization is finished + * + * @param[in] eth_handle: handle of Ethernet driver + * + * @return + * - ESP_OK: process extra lowlevel deinitialization successfully + * - ESP_FAIL: error occurred when processing extra lowlevel deinitialization + */ + esp_err_t (*on_lowlevel_deinit_done)(esp_eth_handle_t eth_handle); + +} esp_eth_config_t; + +/** + * @brief Default configuration for Ethernet driver + * + */ +#define ETH_DEFAULT_CONFIG(emac, ephy) \ + { \ + .mac = emac, \ + .phy = ephy, \ + .check_link_period_ms = 2000, \ + .stack_input = NULL, \ + .on_lowlevel_init_done = NULL, \ + .on_lowlevel_deinit_done = NULL, \ + } + +/** +* @brief Install Ethernet driver +* +* @param[in] config: configuration of the Ethernet driver +* @param[out] out_hdl: handle of Ethernet driver +* +* @return +* - ESP_OK: install esp_eth driver successfully +* - ESP_ERR_INVALID_ARG: install esp_eth driver failed because of some invalid argument +* - ESP_ERR_NO_MEM: install esp_eth driver failed because there's no memory for driver +* - ESP_FAIL: install esp_eth driver failed because some other error occurred +*/ +esp_err_t esp_eth_driver_install(const esp_eth_config_t *config, esp_eth_handle_t *out_hdl); + +/** +* @brief Uninstall Ethernet driver +* @note It's not recommended to uninstall Ethernet driver unless it won't get used any more in application code. +* To uninstall Ethernet driver, you have to make sure, all references to the driver are released. +* Ethernet driver can only be uninstalled successfully when reference counter equals to one. +* +* @param[in] hdl: handle of Ethernet driver +* +* @return +* - ESP_OK: uninstall esp_eth driver successfully +* - ESP_ERR_INVALID_ARG: uninstall esp_eth driver failed because of some invalid argument +* - ESP_ERR_INVALID_STATE: uninstall esp_eth driver failed because it has more than one reference +* - ESP_FAIL: uninstall esp_eth driver failed because some other error occurred +*/ +esp_err_t esp_eth_driver_uninstall(esp_eth_handle_t hdl); + +/** +* @brief Start Ethernet driver **ONLY** in standalone mode (i.e. without TCP/IP stack) +* +* @note This API will start driver state machine and internal software timer (for checking link status). +* +* @param[in] hdl handle of Ethernet driver +* +* @return +* - ESP_OK: start esp_eth driver successfully +* - ESP_ERR_INVALID_ARG: start esp_eth driver failed because of some invalid argument +* - ESP_ERR_INVALID_STATE: start esp_eth driver failed because driver has started already +* - ESP_FAIL: start esp_eth driver failed because some other error occurred +*/ +esp_err_t esp_eth_start(esp_eth_handle_t hdl); + +/** +* @brief Stop Ethernet driver +* +* @note This function does the oppsite operation of `esp_eth_start`. +* +* @param[in] hdl handle of Ethernet driver +* @return +* - ESP_OK: stop esp_eth driver successfully +* - ESP_ERR_INVALID_ARG: stop esp_eth driver failed because of some invalid argument +* - ESP_ERR_INVALID_STATE: stop esp_eth driver failed because driver has not started yet +* - ESP_FAIL: stop esp_eth driver failed because some other error occurred +*/ +esp_err_t esp_eth_stop(esp_eth_handle_t hdl); + +/** +* @brief Update Ethernet data input path (i.e. specify where to pass the input buffer) +* +* @note After install driver, Ethernet still don't know where to deliver the input buffer. +* In fact, this API registers a callback function which get invoked when Ethernet received new packets. +* +* @param[in] hdl handle of Ethernet driver +* @param[in] stack_input function pointer, which does the actual process on incoming packets +* @param[in] priv private resource, which gets passed to `stack_input` callback without any modification +* @return +* - ESP_OK: update input path successfully +* - ESP_ERR_INVALID_ARG: update input path failed because of some invalid argument +* - ESP_FAIL: update input path failed because some other error occurred +*/ +esp_err_t esp_eth_update_input_path( + esp_eth_handle_t hdl, + esp_err_t (*stack_input)(esp_eth_handle_t hdl, uint8_t *buffer, uint32_t length, void *priv), + void *priv); + +/** +* @brief General Transmit +* +* @param[in] hdl: handle of Ethernet driver +* @param[in] buf: buffer of the packet to transfer +* @param[in] length: length of the buffer to transfer +* +* @return +* - ESP_OK: transmit frame buffer successfully +* - ESP_ERR_INVALID_ARG: transmit frame buffer failed because of some invalid argument +* - ESP_FAIL: transmit frame buffer failed because some other error occurred +*/ +esp_err_t esp_eth_transmit(esp_eth_handle_t hdl, void *buf, uint32_t length); + +/** +* @brief General Receive +* +* @param[in] hdl: handle of Ethernet driver +* @param[out] buf: buffer to preserve the received packet +* @param[out] length: length of the received packet +* +* @note Before this function got invoked, the value of "length" should set by user, equals the size of buffer. +* After the function returned, the value of "length" means the real length of received data. +* +* @return +* - ESP_OK: receive frame buffer successfully +* - ESP_ERR_INVALID_ARG: receive frame buffer failed because of some invalid argument +* - ESP_ERR_INVALID_SIZE: input buffer size is not enough to hold the incoming data. +* in this case, value of returned "length" indicates the real size of incoming data. +* - ESP_FAIL: receive frame buffer failed because some other error occurred +*/ +esp_err_t esp_eth_receive(esp_eth_handle_t hdl, uint8_t *buf, uint32_t *length); + +/** +* @brief Misc IO function of Etherent driver +* +* @param[in] hdl: handle of Ethernet driver +* @param[in] cmd: IO control command +* @param[in] data: specificed data for command +* +* @return +* - ESP_OK: process io command successfully +* - ESP_ERR_INVALID_ARG: process io command failed because of some invalid argument +* - ESP_FAIL: process io command failed because some other error occurred +*/ +esp_err_t esp_eth_ioctl(esp_eth_handle_t hdl, esp_eth_io_cmd_t cmd, void *data); + +/** +* @brief Increase Ethernet driver reference +* @note Ethernet driver handle can be obtained by os timer, netif, etc. +* It's dangerous when thread A is using Ethernet but thread B uninstall the driver. +* Using reference counter can prevent such risk, but care should be taken, when you obtain Ethernet driver, +* this API must be invoked so that the driver won't be uninstalled during your using time. +* +* +* @param[in] hdl: handle of Ethernet driver +* @return +* - ESP_OK: increase reference successfully +* - ESP_ERR_INVALID_ARG: increase reference failed because of some invalid argument +*/ +esp_err_t esp_eth_increase_reference(esp_eth_handle_t hdl); + +/** +* @brief Decrease Ethernet driver reference +* +* @param[in] hdl: handle of Ethernet driver +* @return +* - ESP_OK: increase reference successfully +* - ESP_ERR_INVALID_ARG: increase reference failed because of some invalid argument +*/ +esp_err_t esp_eth_decrease_reference(esp_eth_handle_t hdl); + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/esp_eth/include/esp_eth_com.h b/arch/xtensa/include/esp32/esp_eth/include/esp_eth_com.h new file mode 100644 index 0000000000000..2cbbf04e138ae --- /dev/null +++ b/arch/xtensa/include/esp32/esp_eth/include/esp_eth_com.h @@ -0,0 +1,224 @@ +// 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 + +#ifdef __cplusplus +extern "C" { +#endif + +#include "esp_err.h" +#include "../../esp_event/include/esp_event_base.h" + +/** + * @brief Maximum Ethernet payload size + * + */ +#define ETH_MAX_PAYLOAD_LEN (1500) + +/** + * @brief Minimum Ethernet payload size + * + */ +#define ETH_MIN_PAYLOAD_LEN (46) + +/** + * @brief Ethernet frame header size: Dest addr(6 Bytes) + Src addr(6 Bytes) + length/type(2 Bytes) + * + */ +#define ETH_HEADER_LEN (14) + +/** + * @brief Ethernet frame CRC length + * + */ +#define ETH_CRC_LEN (4) + +/** + * @brief Optional 802.1q VLAN Tag length + * + */ +#define ETH_VLAN_TAG_LEN (4) + +/** + * @brief Jumbo frame payload size + * + */ +#define ETH_JUMBO_FRAME_PAYLOAD_LEN (9000) + +/** + * @brief Maximum frame size (1522 Bytes) + * + */ +#define ETH_MAX_PACKET_SIZE (ETH_HEADER_LEN + ETH_VLAN_TAG_LEN + ETH_MAX_PAYLOAD_LEN + ETH_CRC_LEN) + +/** + * @brief Minimum frame size (64 Bytes) + * + */ +#define ETH_MIN_PACKET_SIZE (ETH_HEADER_LEN + ETH_MIN_PAYLOAD_LEN + ETH_CRC_LEN) + +/** +* @brief Ethernet driver state +* +*/ +typedef enum { + ETH_STATE_LLINIT, /*!< Lowlevel init done */ + ETH_STATE_DEINIT, /*!< Deinit done */ + ETH_STATE_LINK, /*!< Link status changed */ + ETH_STATE_SPEED, /*!< Speed updated */ + ETH_STATE_DUPLEX, /*!< Duplex updated */ +} esp_eth_state_t; + +/** +* @brief Command list for ioctl API +* +*/ +typedef enum { + ETH_CMD_G_MAC_ADDR, /*!< Get MAC address */ + ETH_CMD_S_MAC_ADDR, /*!< Set MAC address */ + ETH_CMD_G_PHY_ADDR, /*!< Get PHY address */ + ETH_CMD_S_PHY_ADDR, /*!< Set PHY address */ + ETH_CMD_G_SPEED, /*!< Get Speed */ + ETH_CMD_S_PROMISCUOUS, /*!< Set promiscuous mode */ +} esp_eth_io_cmd_t; + +/** +* @brief Ethernet link status +* +*/ +typedef enum { + ETH_LINK_UP, /*!< Ethernet link is up */ + ETH_LINK_DOWN /*!< Ethernet link is down */ +} eth_link_t; + +/** +* @brief Ethernet speed +* +*/ +typedef enum { + ETH_SPEED_10M, /*!< Ethernet speed is 10Mbps */ + ETH_SPEED_100M /*!< Ethernet speed is 100Mbps */ +} eth_speed_t; + +/** +* @brief Ethernet duplex mode +* +*/ +typedef enum { + ETH_DUPLEX_HALF, /*!< Ethernet is in half duplex */ + ETH_DUPLEX_FULL /*!< Ethernet is in full duplex */ +} eth_duplex_t; + +/** +* @brief Ethernet mediator +* +*/ +typedef struct esp_eth_mediator_s esp_eth_mediator_t; + +/** +* @brief Ethernet mediator +* +*/ +struct esp_eth_mediator_s { + /** + * @brief Read PHY register + * + * @param[in] eth: mediator of Ethernet driver + * @param[in] phy_addr: PHY Chip address (0~31) + * @param[in] phy_reg: PHY register index code + * @param[out] reg_value: PHY register value + * + * @return + * - ESP_OK: read PHY register successfully + * - ESP_FAIL: read PHY register failed because some error occurred + * + */ + esp_err_t (*phy_reg_read)(esp_eth_mediator_t *eth, uint32_t phy_addr, uint32_t phy_reg, uint32_t *reg_value); + + /** + * @brief Write PHY register + * + * @param[in] eth: mediator of Ethernet driver + * @param[in] phy_addr: PHY Chip address (0~31) + * @param[in] phy_reg: PHY register index code + * @param[in] reg_value: PHY register value + * + * @return + * - ESP_OK: write PHY register successfully + * - ESP_FAIL: write PHY register failed because some error occurred + */ + esp_err_t (*phy_reg_write)(esp_eth_mediator_t *eth, uint32_t phy_addr, uint32_t phy_reg, uint32_t reg_value); + + /** + * @brief Deliver packet to upper stack + * + * @param[in] eth: mediator of Ethernet driver + * @param[in] buffer: packet buffer + * @param[in] length: length of the packet + * + * @return + * - ESP_OK: deliver packet to upper stack successfully + * - ESP_FAIL: deliver packet failed because some error occurred + * + */ + esp_err_t (*stack_input)(esp_eth_mediator_t *eth, uint8_t *buffer, uint32_t length); + + /** + * @brief Callback on Ethernet state changed + * + * @param[in] eth: mediator of Ethernet driver + * @param[in] state: new state + * @param[in] args: optional argument for the new state + * + * @return + * - ESP_OK: process the new state successfully + * - ESP_FAIL: process the new state failed because some error occurred + * + */ + esp_err_t (*on_state_changed)(esp_eth_mediator_t *eth, esp_eth_state_t state, void *args); +}; + +/** +* @brief Ethernet event declarations +* +*/ +typedef enum { + ETHERNET_EVENT_START, /*!< Ethernet driver start */ + ETHERNET_EVENT_STOP, /*!< Ethernet driver stop */ + ETHERNET_EVENT_CONNECTED, /*!< Ethernet got a valid link */ + ETHERNET_EVENT_DISCONNECTED, /*!< Ethernet lost a valid link */ +} eth_event_t; + +/** +* @brief Ethernet event base declaration +* +*/ +ESP_EVENT_DECLARE_BASE(ETH_EVENT); + +/** +* @brief Detect PHY address +* +* @param[in] eth: mediator of Ethernet driver +* @param[out] detected_addr: a valid address after detection +* @return +* - ESP_OK: detect phy address successfully +* - ESP_ERR_INVALID_ARG: invalid parameter +* - ESP_ERR_NOT_FOUND: can't detect any PHY device +* - ESP_FAIL: detect phy address failed because some error occurred +*/ +esp_err_t esp_eth_detect_phy_addr(esp_eth_mediator_t *eth, uint32_t *detected_addr); + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/esp_eth/include/esp_eth_mac.h b/arch/xtensa/include/esp32/esp_eth/include/esp_eth_mac.h new file mode 100644 index 0000000000000..31960288babbd --- /dev/null +++ b/arch/xtensa/include/esp32/esp_eth/include/esp_eth_mac.h @@ -0,0 +1,325 @@ +// 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 + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "esp_eth_com.h" +#include +#if CONFIG_ETH_USE_SPI_ETHERNET +#include "driver/spi_master.h" +#endif + +/** +* @brief Ethernet MAC +* +*/ +typedef struct esp_eth_mac_s esp_eth_mac_t; + +/** +* @brief Ethernet MAC +* +*/ +struct esp_eth_mac_s { + /** + * @brief Set mediator for Ethernet MAC + * + * @param[in] mac: Ethernet MAC instance + * @param[in] eth: Ethernet mediator + * + * @return + * - ESP_OK: set mediator for Ethernet MAC successfully + * - ESP_ERR_INVALID_ARG: set mediator for Ethernet MAC failed because of invalid argument + * + */ + esp_err_t (*set_mediator)(esp_eth_mac_t *mac, esp_eth_mediator_t *eth); + + /** + * @brief Initialize Ethernet MAC + * + * @param[in] mac: Ethernet MAC instance + * + * @return + * - ESP_OK: initialize Ethernet MAC successfully + * - ESP_ERR_TIMEOUT: initialize Ethernet MAC failed because of timeout + * - ESP_FAIL: initialize Ethernet MAC failed because some other error occurred + * + */ + esp_err_t (*init)(esp_eth_mac_t *mac); + + /** + * @brief Deinitialize Ethernet MAC + * + * @param[in] mac: Ethernet MAC instance + * + * @return + * - ESP_OK: deinitialize Ethernet MAC successfully + * - ESP_FAIL: deinitialize Ethernet MAC failed because some error occurred + * + */ + esp_err_t (*deinit)(esp_eth_mac_t *mac); + + /** + * @brief Transmit packet from Ethernet MAC + * + * @param[in] mac: Ethernet MAC instance + * @param[in] buf: packet buffer to transmit + * @param[in] length: length of packet + * + * @return + * - ESP_OK: transmit packet successfully + * - ESP_ERR_INVALID_ARG: transmit packet failed because of invalid argument + * - ESP_ERR_INVALID_STATE: transmit packet failed because of wrong state of MAC + * - ESP_FAIL: transmit packet failed because some other error occurred + * + */ + esp_err_t (*transmit)(esp_eth_mac_t *mac, uint8_t *buf, uint32_t length); + + /** + * @brief Receive packet from Ethernet MAC + * + * @param[in] mac: Ethernet MAC instance + * @param[out] buf: packet buffer which will preserve the received frame + * @param[out] length: length of the received packet + * + * @note Memory of buf is allocated in the Layer2, make sure it get free after process. + * @note Before this function got invoked, the value of "length" should set by user, equals the size of buffer. + * After the function returned, the value of "length" means the real length of received data. + * + * @return + * - ESP_OK: receive packet successfully + * - ESP_ERR_INVALID_ARG: receive packet failed because of invalid argument + * - ESP_ERR_INVALID_SIZE: input buffer size is not enough to hold the incoming data. + * in this case, value of returned "length" indicates the real size of incoming data. + * - ESP_FAIL: receive packet failed because some other error occurred + * + */ + esp_err_t (*receive)(esp_eth_mac_t *mac, uint8_t *buf, uint32_t *length); + + /** + * @brief Read PHY register + * + * @param[in] mac: Ethernet MAC instance + * @param[in] phy_addr: PHY chip address (0~31) + * @param[in] phy_reg: PHY register index code + * @param[out] reg_value: PHY register value + * + * @return + * - ESP_OK: read PHY register successfully + * - ESP_ERR_INVALID_ARG: read PHY register failed because of invalid argument + * - ESP_ERR_INVALID_STATE: read PHY register failed because of wrong state of MAC + * - ESP_ERR_TIMEOUT: read PHY register failed because of timeout + * - ESP_FAIL: read PHY register failed because some other error occurred + * + */ + esp_err_t (*read_phy_reg)(esp_eth_mac_t *mac, uint32_t phy_addr, uint32_t phy_reg, uint32_t *reg_value); + + /** + * @brief Write PHY register + * + * @param[in] mac: Ethernet MAC instance + * @param[in] phy_addr: PHY chip address (0~31) + * @param[in] phy_reg: PHY register index code + * @param[in] reg_value: PHY register value + * + * @return + * - ESP_OK: write PHY register successfully + * - ESP_ERR_INVALID_STATE: write PHY register failed because of wrong state of MAC + * - ESP_ERR_TIMEOUT: write PHY register failed because of timeout + * - ESP_FAIL: write PHY register failed because some other error occurred + * + */ + esp_err_t (*write_phy_reg)(esp_eth_mac_t *mac, uint32_t phy_addr, uint32_t phy_reg, uint32_t reg_value); + + /** + * @brief Set MAC address + * + * @param[in] mac: Ethernet MAC instance + * @param[in] addr: MAC address + * + * @return + * - ESP_OK: set MAC address successfully + * - ESP_ERR_INVALID_ARG: set MAC address failed because of invalid argument + * - ESP_FAIL: set MAC address failed because some other error occurred + * + */ + esp_err_t (*set_addr)(esp_eth_mac_t *mac, uint8_t *addr); + + /** + * @brief Get MAC address + * + * @param[in] mac: Ethernet MAC instance + * @param[out] addr: MAC address + * + * @return + * - ESP_OK: get MAC address successfully + * - ESP_ERR_INVALID_ARG: get MAC address failed because of invalid argument + * - ESP_FAIL: get MAC address failed because some other error occurred + * + */ + esp_err_t (*get_addr)(esp_eth_mac_t *mac, uint8_t *addr); + + /** + * @brief Set speed of MAC + * + * @param[in] ma:c Ethernet MAC instance + * @param[in] speed: MAC speed + * + * @return + * - ESP_OK: set MAC speed successfully + * - ESP_ERR_INVALID_ARG: set MAC speed failed because of invalid argument + * - ESP_FAIL: set MAC speed failed because some other error occurred + * + */ + esp_err_t (*set_speed)(esp_eth_mac_t *mac, eth_speed_t speed); + + /** + * @brief Set duplex mode of MAC + * + * @param[in] mac: Ethernet MAC instance + * @param[in] duplex: MAC duplex + * + * @return + * - ESP_OK: set MAC duplex mode successfully + * - ESP_ERR_INVALID_ARG: set MAC duplex failed because of invalid argument + * - ESP_FAIL: set MAC duplex failed because some other error occurred + * + */ + esp_err_t (*set_duplex)(esp_eth_mac_t *mac, eth_duplex_t duplex); + + /** + * @brief Set link status of MAC + * + * @param[in] mac: Ethernet MAC instance + * @param[in] link: Link status + * + * @return + * - ESP_OK: set link status successfully + * - ESP_ERR_INVALID_ARG: set link status failed because of invalid argument + * - ESP_FAIL: set link status failed because some other error occurred + * + */ + esp_err_t (*set_link)(esp_eth_mac_t *mac, eth_link_t link); + + /** + * @brief Set promiscuous of MAC + * + * @param[in] mac: Ethernet MAC instance + * @param[in] enable: set true to enable promiscuous mode; set false to disable promiscuous mode + * + * @return + * - ESP_OK: set promiscuous mode successfully + * - ESP_FAIL: set promiscuous mode failed because some error occurred + * + */ + esp_err_t (*set_promiscuous)(esp_eth_mac_t *mac, bool enable); + + /** + * @brief Free memory of Ethernet MAC + * + * @param[in] mac: Ethernet MAC instance + * + * @return + * - ESP_OK: free Ethernet MAC instance successfully + * - ESP_FAIL: free Ethernet MAC instance failed because some error occurred + * + */ + esp_err_t (*del)(esp_eth_mac_t *mac); +}; + +/** +* @brief Configuration of Ethernet MAC object +* +*/ +typedef struct { + uint32_t sw_reset_timeout_ms; /*!< Software reset timeout value (Unit: ms) */ + uint32_t rx_task_stack_size; /*!< Stack size of the receive task */ + uint32_t rx_task_prio; /*!< Priority of the receive task */ + int smi_mdc_gpio_num; /*!< SMI MDC GPIO number */ + int smi_mdio_gpio_num; /*!< SMI MDIO GPIO number */ + uint32_t flags; /*!< Flags that specify extra capability for mac driver */ +} eth_mac_config_t; + +#define ETH_MAC_FLAG_WORK_WITH_CACHE_DISABLE (1 << 0) /*!< MAC driver can work when cache is disabled */ + +/** + * @brief Default configuration for Ethernet MAC object + * + */ +#define ETH_MAC_DEFAULT_CONFIG() \ + { \ + .sw_reset_timeout_ms = 100, \ + .rx_task_stack_size = 4096, \ + .rx_task_prio = 15, \ + .smi_mdc_gpio_num = 23, \ + .smi_mdio_gpio_num = 18, \ + .flags = 0, \ + } + +#if CONFIG_ETH_USE_ESP32_EMAC +/** +* @brief Create ESP32 Ethernet MAC instance +* +* @param 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_esp32(const eth_mac_config_t *config); +#endif + +#if CONFIG_ETH_SPI_ETHERNET_DM9051 +/** + * @brief DM9051 specific configuration + * + */ +typedef struct { + spi_device_handle_t spi_hdl; /*!< Handle of SPI device driver */ + int int_gpio_num; /*!< Interrupt GPIO number */ +} eth_dm9051_config_t; + +/** + * @brief Default DM9051 specific configuration + * + */ +#define ETH_DM9051_DEFAULT_CONFIG(spi_device) \ + { \ + .spi_hdl = spi_device, \ + .int_gpio_num = 4, \ + } + +/** +* @brief Create DM9051 Ethernet MAC instance +* +* @param dm9051_config: DM9051 specific configuration +* @param 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_dm9051(const eth_dm9051_config_t *dm9051_config, const eth_mac_config_t *mac_config); +#endif + +#if CONFIG_ETH_USE_OPENETH +esp_eth_mac_t *esp_eth_mac_new_openeth(const eth_mac_config_t *config); +#endif // CONFIG_ETH_USE_OPENETH + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/esp_eth/include/esp_eth_netif_glue.h b/arch/xtensa/include/esp32/esp_eth/include/esp_eth_netif_glue.h new file mode 100644 index 0000000000000..25bc1cff6c3ce --- /dev/null +++ b/arch/xtensa/include/esp32/esp_eth/include/esp_eth_netif_glue.h @@ -0,0 +1,66 @@ +// 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 + +#ifdef __cplusplus +extern "C" { +#endif + +#include "esp_eth.h" + +/** + * @brief Create a netif glue for Ethernet driver + * @note netif glue is used to attach io driver to TCP/IP netif + * + * @param eth_hdl Ethernet driver handle + * @return glue object, which inherits esp_netif_driver_base_t + */ +void *esp_eth_new_netif_glue(esp_eth_handle_t eth_hdl); + +/** + * @brief Delete netif glue of Ethernet driver + * + * @param glue netif glue + * @return -ESP_OK: delete netif glue successfully + */ +esp_err_t esp_eth_del_netif_glue(void *glue); + +/** + * @brief Register default IP layer handlers for Ethernet + * + * @note: Ethernet handle might not yet properly initialized when setting up these default handlers + * + * @param[in] esp_netif esp network interface handle created for Ethernet driver + * @return + * - ESP_ERR_INVALID_ARG: invalid parameter (esp_netif is NULL) + * - ESP_OK: set default IP layer handlers successfully + * - others: other failure occurred during register esp_event handler + */ + +esp_err_t esp_eth_set_default_handlers(void *esp_netif); + +/** + * @brief Unregister default IP layer handlers for Ethernet + * + * @param[in] esp_netif esp network interface handle created for Ethernet driver + * @return + * - ESP_ERR_INVALID_ARG: invalid parameter (esp_netif is NULL) + * - ESP_OK: clear default IP layer handlers successfully + * - others: other failure occurred during unregister esp_event handler + */ +esp_err_t esp_eth_clear_default_handlers(void *esp_netif); + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/esp_eth/include/esp_eth_phy.h b/arch/xtensa/include/esp32/esp_eth/include/esp_eth_phy.h new file mode 100644 index 0000000000000..7266347aefac1 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_eth/include/esp_eth_phy.h @@ -0,0 +1,257 @@ +// 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 + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "esp_eth_com.h" +#include + +#define ESP_ETH_PHY_ADDR_AUTO (-1) + +/** +* @brief Ethernet PHY +* +*/ +typedef struct esp_eth_phy_s esp_eth_phy_t; + +/** +* @brief Ethernet PHY +* +*/ +struct esp_eth_phy_s { + /** + * @brief Set mediator for PHY + * + * @param[in] phy: Ethernet PHY instance + * @param[in] mediator: mediator of Ethernet driver + * + * @return + * - ESP_OK: set mediator for Ethernet PHY instance successfully + * - ESP_ERR_INVALID_ARG: set mediator for Ethernet PHY instance failed because of some invalid arguments + * + */ + esp_err_t (*set_mediator)(esp_eth_phy_t *phy, esp_eth_mediator_t *mediator); + + /** + * @brief Software Reset Ethernet PHY + * + * @param[in] phy: Ethernet PHY instance + * + * @return + * - ESP_OK: reset Ethernet PHY successfully + * - ESP_FAIL: reset Ethernet PHY failed because some error occurred + * + */ + esp_err_t (*reset)(esp_eth_phy_t *phy); + + /** + * @brief Hardware Reset Ethernet PHY + * + * @note Hardware reset is mostly done by pull down and up PHY's nRST pin + * + * @param[in] phy: Ethernet PHY instance + * + * @return + * - ESP_OK: reset Ethernet PHY successfully + * - ESP_FAIL: reset Ethernet PHY failed because some error occurred + * + */ + esp_err_t (*reset_hw)(esp_eth_phy_t *phy); + + /** + * @brief Initialize Ethernet PHY + * + * @param[in] phy: Ethernet PHY instance + * + * @return + * - ESP_OK: initialize Ethernet PHY successfully + * - ESP_FAIL: initialize Ethernet PHY failed because some error occurred + * + */ + esp_err_t (*init)(esp_eth_phy_t *phy); + + /** + * @brief Deinitialize Ethernet PHY + * + * @param[in] phyL Ethernet PHY instance + * + * @return + * - ESP_OK: deinitialize Ethernet PHY successfully + * - ESP_FAIL: deinitialize Ethernet PHY failed because some error occurred + * + */ + esp_err_t (*deinit)(esp_eth_phy_t *phy); + + /** + * @brief Start auto negotiation + * + * @param[in] phy: Ethernet PHY instance + * + * @return + * - ESP_OK: restart auto negotiation successfully + * - ESP_FAIL: restart auto negotiation failed because some error occurred + * + */ + esp_err_t (*negotiate)(esp_eth_phy_t *phy); + + /** + * @brief Get Ethernet PHY link status + * + * @param[in] phy: Ethernet PHY instance + * + * @return + * - ESP_OK: get Ethernet PHY link status successfully + * - ESP_FAIL: get Ethernet PHY link status failed because some error occurred + * + */ + esp_err_t (*get_link)(esp_eth_phy_t *phy); + + /** + * @brief Power control of Ethernet PHY + * + * @param[in] phy: Ethernet PHY instance + * @param[in] enable: set true to power on Ethernet PHY; ser false to power off Ethernet PHY + * + * @return + * - ESP_OK: control Ethernet PHY power successfully + * - ESP_FAIL: control Ethernet PHY power failed because some error occurred + * + */ + esp_err_t (*pwrctl)(esp_eth_phy_t *phy, bool enable); + + /** + * @brief Set PHY chip address + * + * @param[in] phy: Ethernet PHY instance + * @param[in] addr: PHY chip address + * + * @return + * - ESP_OK: set Ethernet PHY address successfully + * - ESP_FAIL: set Ethernet PHY address failed because some error occurred + * + */ + esp_err_t (*set_addr)(esp_eth_phy_t *phy, uint32_t addr); + + /** + * @brief Get PHY chip address + * + * @param[in] phy: Ethernet PHY instance + * @param[out] addr: PHY chip address + * + * @return + * - ESP_OK: get Ethernet PHY address successfully + * - ESP_ERR_INVALID_ARG: get Ethernet PHY address failed because of invalid argument + * + */ + esp_err_t (*get_addr)(esp_eth_phy_t *phy, uint32_t *addr); + + /** + * @brief Free memory of Ethernet PHY instance + * + * @param[in] phy: Ethernet PHY instance + * + * @return + * - ESP_OK: free PHY instance successfully + * - ESP_FAIL: free PHY instance failed because some error occurred + * + */ + esp_err_t (*del)(esp_eth_phy_t *phy); +}; + +/** +* @brief Ethernet PHY configuration +* +*/ +typedef struct { + int32_t phy_addr; /*!< PHY address, set -1 to enable PHY address detection at initialization stage */ + uint32_t reset_timeout_ms; /*!< Reset timeout value (Unit: ms) */ + uint32_t autonego_timeout_ms; /*!< Auto-negotiation timeout value (Unit: ms) */ + int reset_gpio_num; /*!< Reset GPIO number, -1 means no hardware reset */ +} eth_phy_config_t; + +/** + * @brief Default configuration for Ethernet PHY object + * + */ +#define ETH_PHY_DEFAULT_CONFIG() \ + { \ + .phy_addr = ESP_ETH_PHY_ADDR_AUTO, \ + .reset_timeout_ms = 100, \ + .autonego_timeout_ms = 4000, \ + .reset_gpio_num = 5, \ + } + +/** +* @brief Create a PHY instance of IP101 +* +* @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_ip101(const eth_phy_config_t *config); + +/** +* @brief Create a PHY instance of RTL8201 +* +* @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_rtl8201(const eth_phy_config_t *config); + +/** +* @brief Create a PHY instance of LAN8720 +* +* @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_lan8720(const eth_phy_config_t *config); + +/** +* @brief Create a PHY instance of DP83848 +* +* @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_dp83848(const eth_phy_config_t *config); + +#if CONFIG_ETH_SPI_ETHERNET_DM9051 +/** +* @brief Create a PHY instance of DM9051 +* +* @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_dm9051(const eth_phy_config_t *config); +#endif +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/esp_eth/include/eth_phy_regs_struct.h b/arch/xtensa/include/esp32/esp_eth/include/eth_phy_regs_struct.h new file mode 100644 index 0000000000000..023ccf2a6b7af --- /dev/null +++ b/arch/xtensa/include/esp32/esp_eth/include/eth_phy_regs_struct.h @@ -0,0 +1,163 @@ +// 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 + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/******************Basic PHY Registers*******************/ + +/** + * @brief BMCR(Basic Mode Control Register) + * + */ +typedef union { + struct { + uint32_t reserved : 7; /*!< Reserved */ + uint32_t collision_test : 1; /*!< Collision test */ + uint32_t duplex_mode : 1; /*!< Duplex mode:Full Duplex(1) and Half Duplex(0) */ + uint32_t restart_auto_nego : 1; /*!< Restart auto-negotiation */ + uint32_t isolate : 1; /*!< Isolate the PHY from MII except the SMI interface */ + uint32_t power_down : 1; /*!< Power off PHY except SMI interface */ + uint32_t en_auto_nego : 1; /*!< Enable auto negotiation */ + uint32_t speed_select : 1; /*!< Select speed: 100Mbps(1) and 10Mbps(0) */ + uint32_t en_loopback : 1; /*!< Enables transmit data to be routed to the receive path */ + uint32_t reset : 1; /*!< Reset PHY registers. This bit is self-clearing. */ + }; + uint32_t val; +} bmcr_reg_t; +#define ETH_PHY_BMCR_REG_ADDR (0x00) + +/** + * @brief BMSR(Basic Mode Status Register) + * + */ +typedef union { + struct { + uint32_t ext_capability : 1; /*!< Extended register capability */ + uint32_t jabber_detect : 1; /*!< Jabber condition detected */ + uint32_t link_status : 1; /*!< Link status */ + uint32_t auto_nego_ability : 1; /*!< Auto negotiation ability */ + uint32_t remote_fault : 1; /*!< Remote fault detected */ + uint32_t auto_nego_complete : 1; /*!< Auto negotiation completed */ + uint32_t mf_preamble_suppress : 1; /*!< Preamble suppression capability for management frame */ + uint32_t reserved : 1; /*!< Reserved */ + uint32_t ext_status : 1; /*!< Extended Status */ + uint32_t base100_t2_hdx : 1; /*!< 100Base-T2 Half Duplex capability */ + uint32_t base100_t2_fdx : 1; /*!< 100Base-T2 Full Duplex capability */ + uint32_t base10_t_hdx : 1; /*!< 10Base-T Half Duplex capability */ + uint32_t base10_t_fdx : 1; /*!< 10Base-T Full Duplex capability */ + uint32_t base100_tx_hdx : 1; /*!< 100Base-Tx Half Duplex capability */ + uint32_t base100_tx_fdx : 1; /*!< 100Base-Tx Full Duplex capability */ + uint32_t based100_t4 : 1; /*!< 100Base-T4 capability */ + }; + uint32_t val; +} bmsr_reg_t; +#define ETH_PHY_BMSR_REG_ADDR (0x01) + +/** + * @brief PHYIDR1(PHY Identifier Register 1) + * + */ +typedef union { + struct { + uint32_t oui_msb : 16; /*!< Organizationally Unique Identifier(OUI) most significant bits */ + }; + uint32_t val; +} phyidr1_reg_t; +#define ETH_PHY_IDR1_REG_ADDR (0x02) + +/** + * @brief PHYIDR2(PHY Identifier Register 2) + * + */ +typedef union { + struct { + uint32_t model_revision : 4; /*!< Model revision number */ + uint32_t vendor_model : 6; /*!< Vendor model number */ + uint32_t oui_lsb : 6; /*!< Organizationally Unique Identifier(OUI) least significant bits */ + }; + uint32_t val; +} phyidr2_reg_t; +#define ETH_PHY_IDR2_REG_ADDR (0x03) + +/** + * @brief ANAR(Auto-Negotiation Advertisement Register) + * + */ +typedef union { + struct { + uint32_t protocol_select : 5; /*!< Binary encoded selector supported by this PHY */ + uint32_t base10_t : 1; /*!< 10Base-T support */ + uint32_t base10_t_fd : 1; /*!< 10Base-T full duplex support */ + uint32_t base100_tx : 1; /*!< 100Base-TX support */ + uint32_t base100_tx_fd : 1; /*!< 100Base-TX full duplex support */ + uint32_t base100_t4 : 1; /*!< 100Base-T4 support */ + uint32_t symmetric_pause : 1; /*!< Symmetric pause support for full duplex links */ + uint32_t asymmetric_pause : 1; /*!< Asymmetric pause support for full duplex links */ + uint32_t reserved1 : 1; /*!< Reserved */ + uint32_t remote_fault : 1; /*!< Advertise remote fault detection capability */ + uint32_t acknowledge : 1; /*!< Link partner ability data reception acknowledged */ + uint32_t next_page : 1; /*!< Next page indication, if set, next page transfer is desired */ + }; + uint32_t val; +} anar_reg_t; +#define ETH_PHY_ANAR_REG_ADDR (0x04) + +/** + * @brief ANLPAR(Auto-Negotiation Link Partner Ability Register) + * + */ +typedef union { + struct { + uint32_t protocol_select : 5; /*!< Link Partner’s binary encoded node selector */ + uint32_t base10_t : 1; /*!< 10Base-T support */ + uint32_t base10_t_fd : 1; /*!< 10Base-T full duplex support */ + uint32_t base100_tx : 1; /*!< 100Base-TX support */ + uint32_t base100_tx_fd : 1; /*!< 100Base-TX full duplex support */ + uint32_t base100_t4 : 1; /*!< 100Base-T4 support */ + uint32_t symmetric_pause : 1; /*!< Symmetric pause supported by Link Partner */ + uint32_t asymmetric_pause : 1; /*!< Asymmetric pause supported by Link Partner */ + uint32_t reserved : 1; /*!< Reserved */ + uint32_t remote_fault : 1; /*!< Link partner is indicating a remote fault */ + uint32_t acknowledge : 1; /*!< Acknowledges from link partner */ + uint32_t next_page : 1; /*!< Next page indication */ + }; + uint32_t val; +} anlpar_reg_t; +#define ETH_PHY_ANLPAR_REG_ADDR (0x05) + +/** + * @brief ANER(Auto-Negotiate Expansion Register) + * + */ +typedef union { + struct { + uint32_t link_partner_auto_nego_able : 1; /*!< Link partner auto-negotiation ability */ + uint32_t link_page_received : 1; /*!< Link code word page has received */ + uint32_t next_page_able : 1; /*!< Next page ablility */ + uint32_t link_partner_next_page_able : 1; /*!< Link partner next page ability */ + uint32_t parallel_detection_fault : 1; /*!< Parallel detection fault */ + uint32_t reserved : 11; /*!< Reserved */ + }; + uint32_t val; +} aner_reg_t; +#define ETH_PHY_ANER_REG_ADDR (0x06) + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/esp_event/include/esp_event.h b/arch/xtensa/include/esp32/esp_event/include/esp_event.h new file mode 100644 index 0000000000000..60c41a2a35701 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_event/include/esp_event.h @@ -0,0 +1,382 @@ +// 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. + +#ifndef ESP_EVENT_H_ +#define ESP_EVENT_H_ + +#include "../../esp_common/esp_err.h" + +#include "../../freertos/FreeRTOS.h" +#include "../../freertos/task.h" +#include "../../freertos/queue.h" +#include "../../freertos/semphr.h" + +#include "esp_event_base.h" +#include "esp_event_legacy.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/// Configuration for creating event loops +typedef struct { + int32_t queue_size; /**< size of the event loop queue */ + const char* task_name; /**< name of the event loop task; if NULL, + a dedicated task is not created for event loop*/ + UBaseType_t task_priority; /**< priority of the event loop task, ignored if task name is NULL */ + uint32_t task_stack_size; /**< stack size of the event loop task, ignored if task name is NULL */ + BaseType_t task_core_id; /**< core to which the event loop task is pinned to, + ignored if task name is NULL */ +} esp_event_loop_args_t; + +/** + * @brief Create a new event loop. + * + * @param[in] event_loop_args configuration structure for the event loop to create + * @param[out] event_loop handle to the created event loop + * + * @return + * - ESP_OK: Success + * - ESP_ERR_NO_MEM: Cannot allocate memory for event loops list + * - ESP_FAIL: Failed to create task loop + * - Others: Fail + */ +esp_err_t esp_event_loop_create(const esp_event_loop_args_t* event_loop_args, esp_event_loop_handle_t* event_loop); + +/** + * @brief Delete an existing event loop. + * + * @param[in] event_loop event loop to delete + * + * @return + * - ESP_OK: Success + * - Others: Fail + */ +esp_err_t esp_event_loop_delete(esp_event_loop_handle_t event_loop); + +/** + * @brief Create default event loop + * + * @return + * - ESP_OK: Success + * - ESP_ERR_NO_MEM: Cannot allocate memory for event loops list + * - ESP_FAIL: Failed to create task loop + * - Others: Fail + */ +esp_err_t esp_event_loop_create_default(void); + +/** + * @brief Delete the default event loop + * + * @return + * - ESP_OK: Success + * - Others: Fail + */ +esp_err_t esp_event_loop_delete_default(void); + +/** + * @brief Dispatch events posted to an event loop. + * + * This function is used to dispatch events posted to a loop with no dedicated task, i.e task name was set to NULL + * in event_loop_args argument during loop creation. This function includes an argument to limit the amount of time + * it runs, returning control to the caller when that time expires (or some time afterwards). There is no guarantee + * that a call to this function will exit at exactly the time of expiry. There is also no guarantee that events have + * been dispatched during the call, as the function might have spent all of the alloted time waiting on the event queue. + * Once an event has been unqueued, however, it is guaranteed to be dispatched. This guarantee contributes to not being + * able to exit exactly at time of expiry as (1) blocking on internal mutexes is necessary for dispatching the unqueued + * event, and (2) during dispatch of the unqueued event there is no way to control the time occupied by handler code + * execution. The guaranteed time of exit is therefore the alloted time + amount of time required to dispatch + * the last unqueued event. + * + * 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] 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. + * + * @return + * - ESP_OK: Success + * - Others: Fail + */ +esp_err_t esp_event_loop_run(esp_event_loop_handle_t event_loop, TickType_t ticks_to_run); + +/** + * @brief Register an event handler to the system event loop. + * + * This function can be used to register a handler for either: (1) specific events, + * (2) all events of a certain event base, or (3) all events known by the system event loop. + * + * - 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 + * + * Registering multiple handlers to events is possible. Registering a single handler to multiple events is + * also possible. However, registering the same handler to the same event multiple times would cause the + * previous registrations to be overwritten. + * + * @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 + * @param[in] event_handler_arg data, aside from event data, that is passed to the handler when it is called + * + * @note the event loop library does not maintain a copy of event_handler_arg, therefore the user should + * ensure that event_handler_arg still points to a valid location by the time the handler gets called + * + * @return + * - ESP_OK: Success + * - ESP_ERR_NO_MEM: Cannot allocate memory for the handler + * - ESP_ERR_INVALID_ARG: Invalid combination of event base and event id + * - Others: Fail + */ +esp_err_t esp_event_handler_register(esp_event_base_t event_base, + int32_t event_id, + esp_event_handler_t event_handler, + void* event_handler_arg); + +/** + * @brief Register an event handler to a specific loop. + * + * 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_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 + * @param[in] event_handler_arg data, aside from event data, that is passed to the handler when it is called + * + * @note the event loop library does not maintain a copy of event_handler_arg, therefore the user should + * ensure that event_handler_arg still points to a valid location by the time the handler gets called + * + * @return + * - ESP_OK: Success + * - ESP_ERR_NO_MEM: Cannot allocate memory for the handler + * - ESP_ERR_INVALID_ARG: Invalid combination of event base and event id + * - Others: Fail + */ +esp_err_t esp_event_handler_register_with(esp_event_loop_handle_t event_loop, + esp_event_base_t event_base, + int32_t event_id, + esp_event_handler_t event_handler, + void* event_handler_arg); + +/** + * @brief Unregister a handler with the system 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 + * + * - 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. + * + * @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 + * + * @return ESP_OK success + * @return ESP_ERR_INVALID_ARG invalid combination of event base and event id + * @return others fail + */ +esp_err_t esp_event_handler_unregister(esp_event_base_t event_base, int32_t event_id, esp_event_handler_t event_handler); + +/** + * @brief Unregister a handler with the system event loop. + * + * 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_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 + * + * @return + * - ESP_OK: Success + * - ESP_ERR_INVALID_ARG: Invalid combination of event base and event id + * - Others: Fail + */ +esp_err_t esp_event_handler_unregister_with(esp_event_loop_handle_t event_loop, + esp_event_base_t event_base, + int32_t event_id, + esp_event_handler_t event_handler); + +/** + * @brief Posts an event to the system default event loop. The event loop library keeps a copy of event_data and manages + * the copy's lifetime automatically (allocation + deletion); this ensures that the data the + * handler recieves is always valid. + * + * @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 + * @param[in] event_data_size the size of the event data + * @param[in] ticks_to_wait number of ticks to block on a full event queue + * + * @return + * - ESP_OK: Success + * - ESP_ERR_TIMEOUT: Time to wait for event queue to unblock expired, + * queue full when posting from ISR + * - ESP_ERR_INVALID_ARG: Invalid combination of event base and event id + * - Others: Fail + */ +esp_err_t esp_event_post(esp_event_base_t event_base, + int32_t event_id, + void* event_data, + size_t event_data_size, + TickType_t ticks_to_wait); + +/** + * @brief Posts an event to the specified event loop. The event loop library keeps a copy of event_data and manages + * the copy's lifetime automatically (allocation + deletion); this ensures that the data the + * handler recieves is always valid. + * + * 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_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 + * @param[in] event_data_size the size of the event data + * @param[in] ticks_to_wait number of ticks to block on a full event queue + * + * @return + * - ESP_OK: Success + * - ESP_ERR_TIMEOUT: Time to wait for event queue to unblock expired, + * queue full when posting from ISR + * - ESP_ERR_INVALID_ARG: Invalid combination of event base and event id + * - Others: Fail + */ +esp_err_t esp_event_post_to(esp_event_loop_handle_t event_loop, + esp_event_base_t event_base, + int32_t event_id, + void* event_data, + size_t event_data_size, + TickType_t ticks_to_wait); + +#if CONFIG_ESP_EVENT_POST_FROM_ISR +/** + * @brief Special variant of esp_event_post for posting events from interrupt handlers. + * + * @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 + * @param[in] event_data_size the size of the event data; max is 4 bytes + * @param[out] task_unblocked an optional parameter (can be NULL) which indicates that an event task with + * higher priority than currently running task has been unblocked by the posted event; + * a context switch should be requested before the interrupt is existed. + * + * @note this function is only available when CONFIG_ESP_EVENT_POST_FROM_ISR is enabled + * @note when this function is called from an interrupt handler placed in IRAM, this function should + * be placed in IRAM as well by enabling CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR + * + * @return + * - ESP_OK: Success + * - ESP_FAIL: Event queue for the default event loop full + * - ESP_ERR_INVALID_ARG: Invalid combination of event base and event id, + * data size of more than 4 bytes + * - Others: Fail + */ +esp_err_t esp_event_isr_post(esp_event_base_t event_base, + int32_t event_id, + void* event_data, + size_t event_data_size, + BaseType_t* task_unblocked); + +/** + * @brief Special variant of esp_event_post_to for posting events from interrupt handlers + * + * @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 + * @param[in] event_data_size the size of the event data + * @param[out] task_unblocked an optional parameter (can be NULL) which indicates that an event task with + * higher priority than currently running task has been unblocked by the posted event; + * a context switch should be requested before the interrupt is existed. + * + * @note this function is only available when CONFIG_ESP_EVENT_POST_FROM_ISR is enabled + * @note when this function is called from an interrupt handler placed in IRAM, this function should + * be placed in IRAM as well by enabling CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR + * + * @return + * - ESP_OK: Success + * - ESP_FAIL: Event queue for the loop full + * - ESP_ERR_INVALID_ARG: Invalid combination of event base and event id, + * data size of more than 4 bytes + * - Others: Fail + */ +esp_err_t esp_event_isr_post_to(esp_event_loop_handle_t event_loop, + esp_event_base_t event_base, + int32_t event_id, + void* event_data, + size_t event_data_size, + BaseType_t* task_unblocked); +#endif + +/** + * @brief Dumps statistics of all event loops. + * + * Dumps event loop info in the format: + * + @verbatim + event loop + handler + handler + ... + event loop + handler + handler + ... + + where: + + event loop + format: address,name rx:total_recieved dr:total_dropped + where: + address - memory address of the event loop + name - name of the event loop, 'none' if no dedicated task + total_recieved - number of successfully posted events + total_dropped - number of events unsuccessfully posted due to queue being full + + handler + format: address ev:base,id inv:total_invoked run:total_runtime + where: + address - address of the handler function + base,id - the event specified by event base and id this handler executes + total_invoked - number of times this handler has been invoked + total_runtime - total amount of time used for invoking this handler + + @endverbatim + * + * @param[in] file the file stream to output to + * + * @note this function is a noop when CONFIG_ESP_EVENT_LOOP_PROFILING is disabled + * + * @return + * - ESP_OK: Success + * - ESP_ERR_NO_MEM: Cannot allocate memory for event loops list + * - Others: Fail + */ +esp_err_t esp_event_dump(FILE* file); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // #ifndef ESP_EVENT_H_ diff --git a/arch/xtensa/include/esp32/esp_event/include/esp_event_base.h b/arch/xtensa/include/esp32/esp_event/include/esp_event_base.h new file mode 100644 index 0000000000000..73bc73be859a2 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_event/include/esp_event_base.h @@ -0,0 +1,43 @@ +// 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. + +#ifndef ESP_EVENT_BASE_H_ +#define ESP_EVENT_BASE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +// Defines for declaring and defining event base +#define ESP_EVENT_DECLARE_BASE(id) extern esp_event_base_t id +#define ESP_EVENT_DEFINE_BASE(id) esp_event_base_t id = #id + +// Event loop library types +typedef const char* esp_event_base_t; /**< unique pointer to a subsystem that exposes events */ +typedef void* esp_event_loop_handle_t; /**< a number that identifies an event with respect to a base */ +typedef void (*esp_event_handler_t)(void* event_handler_arg, + esp_event_base_t event_base, + int32_t event_id, + void* event_data); /**< function called when an event is posted to the queue */ + + +// Defines for registering/unregistering event handlers +#define ESP_EVENT_ANY_BASE NULL /**< register handler for any event base */ +#define ESP_EVENT_ANY_ID -1 /**< register handler for any event id */ + +#ifdef __cplusplus +} +#endif + +#endif // #ifndef ESP_EVENT_BASE_H_ diff --git a/arch/xtensa/include/esp32/esp_event/include/esp_event_legacy.h b/arch/xtensa/include/esp32/esp_event/include/esp_event_legacy.h new file mode 100644 index 0000000000000..ea96c0c2f9512 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_event/include/esp_event_legacy.h @@ -0,0 +1,248 @@ +// 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. + +#pragma once + +#include +#include + +#include "../../esp_common/esp_err.h" +#include "../../esp_wifi/esp_wifi_types.h" +#include "../../esp_netif/include/esp_netif.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** System event types enumeration */ +typedef enum { + SYSTEM_EVENT_WIFI_READY = 0, /*!< ESP32 WiFi ready */ + SYSTEM_EVENT_SCAN_DONE, /*!< ESP32 finish scanning AP */ + SYSTEM_EVENT_STA_START, /*!< ESP32 station start */ + SYSTEM_EVENT_STA_STOP, /*!< ESP32 station stop */ + SYSTEM_EVENT_STA_CONNECTED, /*!< ESP32 station connected to AP */ + SYSTEM_EVENT_STA_DISCONNECTED, /*!< ESP32 station disconnected from AP */ + SYSTEM_EVENT_STA_AUTHMODE_CHANGE, /*!< the auth mode of AP connected by ESP32 station changed */ + SYSTEM_EVENT_STA_GOT_IP, /*!< ESP32 station got IP from connected AP */ + SYSTEM_EVENT_STA_LOST_IP, /*!< ESP32 station lost IP and the IP is reset to 0 */ + SYSTEM_EVENT_STA_WPS_ER_SUCCESS, /*!< ESP32 station wps succeeds in enrollee mode */ + SYSTEM_EVENT_STA_WPS_ER_FAILED, /*!< ESP32 station wps fails in enrollee mode */ + SYSTEM_EVENT_STA_WPS_ER_TIMEOUT, /*!< ESP32 station wps timeout in enrollee mode */ + SYSTEM_EVENT_STA_WPS_ER_PIN, /*!< ESP32 station wps pin code in enrollee mode */ + SYSTEM_EVENT_STA_WPS_ER_PBC_OVERLAP, /*!< ESP32 station wps overlap in enrollee mode */ + SYSTEM_EVENT_AP_START, /*!< ESP32 soft-AP start */ + SYSTEM_EVENT_AP_STOP, /*!< ESP32 soft-AP stop */ + SYSTEM_EVENT_AP_STACONNECTED, /*!< a station connected to ESP32 soft-AP */ + SYSTEM_EVENT_AP_STADISCONNECTED, /*!< a station disconnected from ESP32 soft-AP */ + SYSTEM_EVENT_AP_STAIPASSIGNED, /*!< ESP32 soft-AP assign an IP to a connected station */ + SYSTEM_EVENT_AP_PROBEREQRECVED, /*!< Receive probe request packet in soft-AP interface */ + SYSTEM_EVENT_GOT_IP6, /*!< ESP32 station or ap or ethernet interface v6IP addr is preferred */ + SYSTEM_EVENT_ETH_START, /*!< ESP32 ethernet start */ + SYSTEM_EVENT_ETH_STOP, /*!< ESP32 ethernet stop */ + SYSTEM_EVENT_ETH_CONNECTED, /*!< ESP32 ethernet phy link up */ + SYSTEM_EVENT_ETH_DISCONNECTED, /*!< ESP32 ethernet phy link down */ + SYSTEM_EVENT_ETH_GOT_IP, /*!< ESP32 ethernet got IP from connected AP */ + SYSTEM_EVENT_MAX /*!< Number of members in this enum */ +} system_event_id_t; + +/* add this macro define for compatible with old IDF version */ +#ifndef SYSTEM_EVENT_AP_STA_GOT_IP6 +#define SYSTEM_EVENT_AP_STA_GOT_IP6 SYSTEM_EVENT_GOT_IP6 +#endif + + +/** Argument structure of SYSTEM_EVENT_STA_WPS_ER_FAILED event */ +typedef wifi_event_sta_wps_fail_reason_t system_event_sta_wps_fail_reason_t; + +/** Argument structure of SYSTEM_EVENT_SCAN_DONE event */ +typedef wifi_event_sta_scan_done_t system_event_sta_scan_done_t; + +/** Argument structure of SYSTEM_EVENT_STA_CONNECTED event */ +typedef wifi_event_sta_connected_t system_event_sta_connected_t; + +/** Argument structure of SYSTEM_EVENT_STA_DISCONNECTED event */ +typedef wifi_event_sta_disconnected_t system_event_sta_disconnected_t; + +/** Argument structure of SYSTEM_EVENT_STA_AUTHMODE_CHANGE event */ +typedef wifi_event_sta_authmode_change_t system_event_sta_authmode_change_t; + +/** Argument structure of SYSTEM_EVENT_STA_WPS_ER_PIN event */ +typedef wifi_event_sta_wps_er_pin_t system_event_sta_wps_er_pin_t; + +/** Argument structure of event */ +typedef wifi_event_ap_staconnected_t system_event_ap_staconnected_t; + +/** Argument structure of event */ +typedef wifi_event_ap_stadisconnected_t system_event_ap_stadisconnected_t; + +/** Argument structure of event */ +typedef wifi_event_ap_probe_req_rx_t system_event_ap_probe_req_rx_t; + +/** Argument structure of event */ +typedef ip_event_ap_staipassigned_t system_event_ap_staipassigned_t; + +/** Argument structure of event */ +typedef ip_event_got_ip_t system_event_sta_got_ip_t; + +/** Argument structure of event */ +typedef ip_event_got_ip6_t system_event_got_ip6_t; + +/** Union of all possible system_event argument structures */ +typedef union { + system_event_sta_connected_t connected; /*!< ESP32 station connected to AP */ + system_event_sta_disconnected_t disconnected; /*!< ESP32 station disconnected to AP */ + system_event_sta_scan_done_t scan_done; /*!< ESP32 station scan (APs) done */ + system_event_sta_authmode_change_t auth_change; /*!< the auth mode of AP ESP32 station connected to changed */ + system_event_sta_got_ip_t got_ip; /*!< ESP32 station got IP, first time got IP or when IP is changed */ + system_event_sta_wps_er_pin_t sta_er_pin; /*!< ESP32 station WPS enrollee mode PIN code received */ + system_event_sta_wps_fail_reason_t sta_er_fail_reason; /*!< ESP32 station WPS enrollee mode failed reason code received */ + system_event_ap_staconnected_t sta_connected; /*!< a station connected to ESP32 soft-AP */ + system_event_ap_stadisconnected_t sta_disconnected; /*!< a station disconnected to ESP32 soft-AP */ + system_event_ap_probe_req_rx_t ap_probereqrecved; /*!< ESP32 soft-AP receive probe request packet */ + system_event_ap_staipassigned_t ap_staipassigned; /**< ESP32 soft-AP assign an IP to the station*/ + system_event_got_ip6_t got_ip6; /*!< ESP32 station or ap or ethernet ipv6 addr state change to preferred */ +} system_event_info_t; + +/** Event, as a tagged enum */ +typedef struct { + system_event_id_t event_id; /*!< event ID */ + system_event_info_t event_info; /*!< event information */ +} system_event_t; + +/** Event handler function type */ +typedef esp_err_t (*system_event_handler_t)(esp_event_base_t event_base, + int32_t event_id, + void* event_data, + size_t event_data_size, + TickType_t ticks_to_wait); + +/** + * @brief Send a event to event task + * + * @note This API is part of the legacy event system. New code should use event library API in esp_event.h + * + * Other task/modules, such as the tcpip_adapter, can call this API to send an event to event task + * + * @param event Event to send + * + * @return ESP_OK : succeed + * @return others : fail + */ +esp_err_t esp_event_send(system_event_t *event) __attribute__ ((deprecated)); + +/** + * @brief Send a event to event task + * + * @note This API is used by WiFi Driver only. + * + * Other task/modules, such as the tcpip_adapter, can call this API to send an event to event task + * + * @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 + * @param[in] event_data_size the size of the event data + * @param[in] ticks_to_wait number of ticks to block on a full event queue + * + * @return ESP_OK : succeed + * @return others : fail + */ +esp_err_t esp_event_send_internal(esp_event_base_t event_base, + int32_t event_id, + void* event_data, + size_t event_data_size, + TickType_t ticks_to_wait); + +/** + * @brief Default event handler for system events + * + * @note This API is part of the legacy event system. New code should use event library API in esp_event.h + * + * This function performs default handling of system events. + * When using esp_event_loop APIs, it is called automatically before invoking the user-provided + * callback function. + * + * Applications which implement a custom event loop must call this function + * as part of event processing. + * + * @param event pointer to event to be handled + * @return ESP_OK if an event was handled successfully + */ +esp_err_t esp_event_process_default(system_event_t *event) __attribute__ ((deprecated)); + +/** + * @brief Install default event handlers for Ethernet interface + * + * @note This API is part of the legacy event system. New code should use event library API in esp_event.h + * + */ +void esp_event_set_default_eth_handlers(void); + +/** + * @brief Install default event handlers for Wi-Fi interfaces (station and AP) + * + * @note This API is part of the legacy event system. New code should use event library API in esp_event.h + */ +void esp_event_set_default_wifi_handlers(void) __attribute__ ((deprecated)); + +/** + * @brief Application specified event callback function + * + * @note This API is part of the legacy event system. New code should use event library API in esp_event.h + * + * + * @param ctx reserved for user + * @param event event type defined in this file + * + * @return + * - ESP_OK: succeed + * - others: fail + */ +typedef esp_err_t (*system_event_cb_t)(void *ctx, system_event_t *event); + +/** + * @brief Initialize event loop + * + * @note This API is part of the legacy event system. New code should use event library API in esp_event.h + * + * Create the event handler and task + * + * @param cb application specified event callback, it can be modified by call esp_event_set_cb + * @param ctx reserved for user + * + * @return + * - ESP_OK: succeed + * - others: fail + */ +esp_err_t esp_event_loop_init(system_event_cb_t cb, void *ctx) __attribute__ ((deprecated)); + +/** + * @brief Set application specified event callback function + * + * @note This API is part of the legacy event system. New code should use event library API in esp_event.h + * + * @attention 1. If cb is NULL, means application don't need to handle + * If cb is not NULL, it will be call when an event is received, after the default event callback is completed + * + * @param cb application callback function + * @param ctx argument to be passed to callback + * + * + * @return old callback + */ +system_event_cb_t esp_event_loop_set_cb(system_event_cb_t cb, void *ctx) __attribute__ ((deprecated)); + +#ifdef __cplusplus +} +#endif + diff --git a/arch/xtensa/include/esp32/esp_event/include/esp_event_loop.h b/arch/xtensa/include/esp32/esp_event/include/esp_event_loop.h new file mode 100644 index 0000000000000..14ab627e51125 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_event/include/esp_event_loop.h @@ -0,0 +1,3 @@ +#pragma once +#warning "esp_event_loop.h is deprecated, please include esp_event.h instead" +#include "esp_event.h" diff --git a/arch/xtensa/include/esp32/esp_event/private_include/esp_event_internal.h b/arch/xtensa/include/esp32/esp_event/private_include/esp_event_internal.h new file mode 100644 index 0000000000000..fb970a806801d --- /dev/null +++ b/arch/xtensa/include/esp32/esp_event/private_include/esp_event_internal.h @@ -0,0 +1,112 @@ +// 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. + +#ifndef ESP_EVENT_INTERNAL_H_ +#define ESP_EVENT_INTERNAL_H_ + +#include "esp_event.h" +#include "stdatomic.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef SLIST_HEAD(base_nodes, base_node) base_nodes_t; + +/// Event handler +typedef struct esp_event_handler_instance { + esp_event_handler_t handler; /**< event handler function*/ + void* arg; /**< event handler argument */ +#ifdef CONFIG_ESP_EVENT_LOOP_PROFILING + uint32_t invoked; /**< number of times this handler has been invoked */ + int64_t time; /**< total runtime of this handler across all calls */ +#endif + SLIST_ENTRY(esp_event_handler_instance) next; /**< next event handler in the list */ +} esp_event_handler_instance_t; + +typedef SLIST_HEAD(esp_event_handler_instances, esp_event_handler_instance) esp_event_handler_instances_t; + +/// Event +typedef struct esp_event_id_node { + int32_t id; /**< id number of the event */ + esp_event_handler_instances_t handlers; /**< list of handlers to be executed when + this event is raised */ + SLIST_ENTRY(esp_event_id_node) next; /**< pointer to the next event node on the linked list */ +} esp_event_id_node_t; + +typedef SLIST_HEAD(esp_event_id_nodes, esp_event_id_node) esp_event_id_nodes_t; + +typedef struct esp_event_base_node { + esp_event_base_t base; /**< base identifier of the event */ + esp_event_handler_instances_t handlers; /**< event base level handlers, handlers for + all events with this base */ + esp_event_id_nodes_t id_nodes; /**< list of event ids with this base */ + SLIST_ENTRY(esp_event_base_node) next; /**< pointer to the next base node on the linked list */ +} esp_event_base_node_t; + +typedef SLIST_HEAD(esp_event_base_nodes, esp_event_base_node) esp_event_base_nodes_t; + +typedef struct esp_event_loop_node { + esp_event_handler_instances_t handlers; /** event loop level handlers */ + esp_event_base_nodes_t base_nodes; /** list of event bases registered to the loop */ + SLIST_ENTRY(esp_event_loop_node) next; /** pointer to the next loop node containing + event loop level handlers and the rest of + event bases registered to the loop */ +} esp_event_loop_node_t; + +typedef SLIST_HEAD(esp_event_loop_nodes, esp_event_loop_node) esp_event_loop_nodes_t; + +/// Event loop +typedef struct esp_event_loop_instance { + const char* name; /**< name of this event loop */ + QueueHandle_t queue; /**< event queue */ + TaskHandle_t task; /**< task that consumes the event queue */ + TaskHandle_t running_task; /**< for loops with no dedicated task, the + task that consumes the queue */ + SemaphoreHandle_t mutex; /**< mutex for updating the events linked list */ + esp_event_loop_nodes_t loop_nodes; /**< set of linked lists containing the + registered handlers for the loop */ +#ifdef CONFIG_ESP_EVENT_LOOP_PROFILING + atomic_uint_least32_t events_recieved; /**< number of events successfully posted to the loop */ + atomic_uint_least32_t events_dropped; /**< number of events dropped due to queue being full */ + SemaphoreHandle_t profiling_mutex; /**< mutex used for profiliing */ + SLIST_ENTRY(esp_event_loop_instance) next; /**< next event loop in the list */ +#endif +} esp_event_loop_instance_t; + +#if CONFIG_ESP_EVENT_POST_FROM_ISR +typedef union esp_event_post_data { + uint32_t val; + void *ptr; +} esp_event_post_data_t; +#else +typedef void* esp_event_post_data_t; +#endif + +/// Event posted to the event queue +typedef struct esp_event_post_instance { +#if CONFIG_ESP_EVENT_POST_FROM_ISR + bool data_allocated; /**< indicates whether data is allocated from heap */ + bool data_set; /**< indicates if data is null */ +#endif + esp_event_base_t base; /**< the event base */ + int32_t id; /**< the event id */ + esp_event_post_data_t data; /**< data associated with the event */ +} esp_event_post_instance_t; + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // #ifndef ESP_EVENT_INTERNAL_H_ diff --git a/arch/xtensa/include/esp32/esp_event/private_include/esp_event_private.h b/arch/xtensa/include/esp32/esp_event/private_include/esp_event_private.h new file mode 100644 index 0000000000000..d96f66e2df45c --- /dev/null +++ b/arch/xtensa/include/esp32/esp_event/private_include/esp_event_private.h @@ -0,0 +1,54 @@ +// 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. + +#ifndef ESP_EVENT_PRIVATE_H_ +#define ESP_EVENT_PRIVATE_H_ + +#include "esp_event.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Searches handlers registered with an event loop to see if it has been registered. + * + * @param[in] event_loop the loop to search + * @param[in] event_base the event base to search + * @param[in] event_id the event id to search + * @param[in] event_handler the event handler to look for + * + * @return true handler registered + * @return false handler not registered + * + * @return + * - true: Handler registered + * - false: Handler not registered + */ +bool esp_event_is_handler_registered(esp_event_loop_handle_t event_loop, esp_event_base_t event_base, int32_t event_id, esp_event_handler_t event_handler); + +/** + * @brief Deinitializes the event loop library + * + * @return + * - ESP_OK: Success + * - Others: Fail + */ +esp_err_t esp_event_loop_deinit(void); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // #ifndef ESP_EVENT_PRIVATE_H_ \ No newline at end of file diff --git a/arch/xtensa/include/esp32/esp_netif/include/esp_netif.h b/arch/xtensa/include/esp32/esp_netif/include/esp_netif.h new file mode 100644 index 0000000000000..7a43f20f28e5a --- /dev/null +++ b/arch/xtensa/include/esp32/esp_netif/include/esp_netif.h @@ -0,0 +1,771 @@ +// 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. + +#ifndef _ESP_NETIF_H_ +#define _ESP_NETIF_H_ + +#include +#include +#include "../../esp_wifi/esp_wifi_types.h" +#include "esp_netif_ip_addr.h" +#include "esp_netif_types.h" +#include "esp_netif_defaults.h" + +#if CONFIG_ETH_ENABLED +#include "../../esp_eth/include/esp_eth_netif_glue.h" +#endif + +// +// Note: tcpip_adapter legacy API has to be included by default to provide full compatibility +// for applications that used tcpip_adapter API without explicit inclusion of tcpip_adapter.h +// +#if CONFIG_ESP_NETIF_TCPIP_ADAPTER_COMPATIBLE_LAYER +#define _ESP_NETIF_SUPPRESS_LEGACY_WARNING_ +#include "tcpip_adapter.h" +#undef _ESP_NETIF_SUPPRESS_LEGACY_WARNING_ +#endif // CONFIG_ESP_NETIF_TCPIP_ADAPTER_COMPATIBLE_LAYER + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup ESP_NETIF_INIT_API ESP-NETIF Initialization API + * @brief Initialization and deinitialization of underlying TCP/IP stack and esp-netif instances + * + */ + +/** @addtogroup ESP_NETIF_INIT_API + * @{ + */ + +/** + * @brief Initialize the underlying TCP/IP stack + * + * @return + * - ESP_OK on success + * - ESP_FAIL if initializing failed + + * @note This function should be called exactly once from application code, when the application starts up. + */ +esp_err_t esp_netif_init(void); + +/** + * @brief Deinitialize the esp-netif component (and the underlying TCP/IP stack) + * + * Note: Deinitialization is not supported yet + * + * @return + * - ESP_ERR_INVALID_STATE if esp_netif not initialized + * - ESP_ERR_NOT_SUPPORTED otherwise + */ +esp_err_t esp_netif_deinit(void); + +/** + * @brief Creates an instance of new esp-netif object based on provided config + * + * @param[in] esp_netif_config pointer esp-netif configuration + * + * @return + * - pointer to esp-netif object on success + * - NULL otherwise + */ +esp_netif_t *esp_netif_new(const esp_netif_config_t *esp_netif_config); + +/** + * @brief Destroys the esp_netif object + * + * @param[in] esp_netif pointer to the object to be deleted + */ +void esp_netif_destroy(esp_netif_t *esp_netif); + +/** + * @brief Configures driver related options of esp_netif object + * + * @param[inout] esp_netif pointer to the object to be configured + * @param[in] driver_config pointer esp-netif io driver related configuration + * @return + * - ESP_OK on success + * - ESP_ERR_ESP_NETIF_INVALID_PARAMS if invalid parameters provided + * + */ +esp_err_t esp_netif_set_driver_config(esp_netif_t *esp_netif, + const esp_netif_driver_ifconfig_t *driver_config); + +/** + * @brief Attaches esp_netif instance to the io driver handle + * + * Calling this function enables connecting specific esp_netif object + * with already initialized io driver to update esp_netif object with driver + * specific configuration (i.e. calls post_attach callback, which typically + * sets io driver callbacks to esp_netif instance and starts the driver) + * + * @param[inout] esp_netif pointer to esp_netif object to be attached + * @param[in] driver_handle pointer to the driver handle + * @return + * - ESP_OK on success + * - ESP_ERR_ESP_NETIF_DRIVER_ATTACH_FAILED if driver's pot_attach callback failed + */ +esp_err_t esp_netif_attach(esp_netif_t *esp_netif, esp_netif_iodriver_handle driver_handle); + +/** + * @} + */ + +/** + * @defgroup ESP_NETIF_DATA_IO_API ESP-NETIF Input Output API + * @brief Input and Output functions to pass data packets from communication media (IO driver) + * to TCP/IP stack. + * + * These functions are usually not directly called from user code, but installed, or registered + * as callbacks in either IO driver on one hand or TCP/IP stack on the other. More specifically + * esp_netif_receive is typically called from io driver on reception callback to input the packets + * to TCP/IP stack. Similarly esp_netif_transmit is called from the TCP/IP stack whenever + * a packet ought to output to the communication media. + * + * @note These IO functions are registerd (installed) automatically for default interfaces + * (interfaces with the keys such as WIFI_STA_DEF, WIFI_AP_DEF, ETH_DEF). Custom interface + * has to register these IO functions when creating interface using @ref esp_netif_new + * + */ + +/** @addtogroup ESP_NETIF_DATA_IO_API + * @{ + */ + +/** + * @brief Passes the raw packets from communication media to the appropriate TCP/IP stack + * + * This function is called from the configured (peripheral) driver layer. + * The data are then forwarded as frames to the TCP/IP stack. + * + * @param[in] esp_netif Handle to esp-netif instance + * @param[in] buffer Received data + * @param[in] len Length of the data frame + * @param[in] eb Pointer to internal buffer (used in Wi-Fi driver) + * + * @return + * - ESP_OK + */ +esp_err_t esp_netif_receive(esp_netif_t *esp_netif, void *buffer, size_t len, void *eb); + +/** + * @} + */ + +/** + * @defgroup ESP_NETIF_LIFECYCLE ESP-NETIF Lifecycle control + * @brief These APIS define basic building blocks to control network interface lifecycle, i.e. + * start, stop, set_up or set_down. These functions can be directly used as event handlers + * registered to follow the events from communication media. + */ + +/** @addtogroup ESP_NETIF_LIFECYCLE + * @{ + */ + +/** + * @brief Default building block for network interface action upon IO driver start event + * Creates network interface, if AUTOUP enabled turns the interface on, + * if DHCPS enabled starts dhcp server + * + * @note This API can be directly used as event handler + * + * @param[in] esp_netif Handle to esp-netif instance + * @param base + * @param event_id + * @param data + */ +void esp_netif_action_start(void *esp_netif, esp_event_base_t base, int32_t event_id, void *data); + +/** + * @brief Default building block for network interface action upon IO driver stop event + * + * @note This API can be directly used as event handler + * + * @param[in] esp_netif Handle to esp-netif instance + * @param base + * @param event_id + * @param data + */ +void esp_netif_action_stop(void *esp_netif, esp_event_base_t base, int32_t event_id, void *data); + +/** + * @brief Default building block for network interface action upon IO driver connected event + * + * @note This API can be directly used as event handler + * + * @param[in] esp_netif Handle to esp-netif instance + * @param base + * @param event_id + * @param data + */ +void esp_netif_action_connected(void *esp_netif, esp_event_base_t base, int32_t event_id, void *data); + +/** + * @brief Default building block for network interface action upon IO driver disconnected event + * + * @note This API can be directly used as event handler + * + * @param[in] esp_netif Handle to esp-netif instance + * @param base + * @param event_id + * @param data + */ +void esp_netif_action_disconnected(void *esp_netif, esp_event_base_t base, int32_t event_id, void *data); + +/** + * @brief Default building block for network interface action upon network got IP event + * + * @note This API can be directly used as event handler + * + * @param[in] esp_netif Handle to esp-netif instance + * @param base + * @param event_id + * @param data + */ +void esp_netif_action_got_ip(void *esp_netif, esp_event_base_t base, int32_t event_id, void *data); + +/** + * @} + */ + +/** + * @defgroup ESP_NETIF_GET_SET ESP-NETIF Runtime configuration + * @brief Getters and setters for various TCP/IP related parameters + */ + +/** @addtogroup ESP_NETIF_GET_SET + * @{ + */ + +/** + * @brief Set the mac address for the interface instance + + * @param[in] esp_netif Handle to esp-netif instance + * @param[in] mac Desired mac address for the related network interface + * @return ESP_OK + */ +esp_err_t esp_netif_set_mac(esp_netif_t *esp_netif, uint8_t mac[]); + +/** + * @brief Set the hostname of an interface + * + * @param[in] esp_netif Handle to esp-netif instance + * @param[in] hostname New hostname for the interface. Maximum length 32 bytes. + * + * @return + * - ESP_OK - success + * - ESP_ERR_ESP_NETIF_IF_NOT_READY - interface status error + * - ESP_ERR_ESP_NETIF_INVALID_PARAMS - parameter error + */ +esp_err_t esp_netif_set_hostname(esp_netif_t *esp_netif, const char *hostname); + +/** + * @brief Get interface hostname. + * + * @param[in] esp_netif Handle to esp-netif instance + * @param[out] hostname Returns a pointer to the hostname. May be NULL if no hostname is set. If set non-NULL, pointer remains valid (and string may change if the hostname changes). + * + * @return + * - ESP_OK - success + * - ESP_ERR_ESP_NETIF_IF_NOT_READY - interface status error + * - ESP_ERR_ESP_NETIF_INVALID_PARAMS - parameter error + */ +esp_err_t esp_netif_get_hostname(esp_netif_t *esp_netif, const char **hostname); + +/** + * @brief Test if supplied interface is up or down + * + * @param[in] esp_netif Handle to esp-netif instance + * + * @return + * - true - Interface is up + * - false - Interface is down + */ +bool esp_netif_is_netif_up(esp_netif_t *esp_netif); + +/** + * @brief Get interface's IP address information + * + * If the interface is up, IP information is read directly from the TCP/IP stack. + * If the interface is down, IP information is read from a copy kept in the ESP-NETIF instance + * + * @param[in] esp_netif Handle to esp-netif instance + * @param[out] ip_info If successful, IP information will be returned in this argument. + * + * @return + * - ESP_OK + * - ESP_ERR_ESP_NETIF_INVALID_PARAMS + */ +esp_err_t esp_netif_get_ip_info(esp_netif_t *esp_netif, esp_netif_ip_info_t *ip_info); + +/** + * @brief Get interface's old IP information + * + * Returns an "old" IP address previously stored for the interface when the valid IP changed. + * + * If the IP lost timer has expired (meaning the interface was down for longer than the configured interval) + * then the old IP information will be zero. + * + * @param[in] esp_netif Handle to esp-netif instance + * @param[out] ip_info If successful, IP information will be returned in this argument. + * + * @return + * - ESP_OK + * - ESP_ERR_ESP_NETIF_INVALID_PARAMS + */ +esp_err_t esp_netif_get_old_ip_info(esp_netif_t *esp_netif, esp_netif_ip_info_t *ip_info); + +/** + * @brief Set interface's IP address information + * + * This function is mainly used to set a static IP on an interface. + * + * If the interface is up, the new IP information is set directly in the TCP/IP stack. + * + * The copy of IP information kept in the ESP-NETIF instance is also updated (this + * copy is returned if the IP is queried while the interface is still down.) + * + * @note DHCP client/server must be stopped (if enabled for this interface) before setting new IP information. + * + * @note Calling this interface for may generate a SYSTEM_EVENT_STA_GOT_IP or SYSTEM_EVENT_ETH_GOT_IP event. + * + * @param[in] esp_netif Handle to esp-netif instance + * @param[in] ip_info IP information to set on the specified interface + * + * @return + * - ESP_OK + * - ESP_ERR_ESP_NETIF_INVALID_PARAMS + * - ESP_ERR_ESP_NETIF_DHCP_NOT_STOPPED If DHCP server or client is still running + */ +esp_err_t esp_netif_set_ip_info(esp_netif_t *esp_netif, const esp_netif_ip_info_t *ip_info); + +/** + * @brief Set interface old IP information + * + * This function is called from the DHCP client (if enabled), before a new IP is set. + * It is also called from the default handlers for the SYSTEM_EVENT_STA_CONNECTED and SYSTEM_EVENT_ETH_CONNECTED events. + * + * Calling this function stores the previously configured IP, which can be used to determine if the IP changes in the future. + * + * If the interface is disconnected or down for too long, the "IP lost timer" will expire (after the configured interval) and set the old IP information to zero. + * + * @param[in] esp_netif Handle to esp-netif instance + * @param[in] ip_info Store the old IP information for the specified interface + * + * @return + * - ESP_OK + * - ESP_ERR_ESP_NETIF_INVALID_PARAMS + */ +esp_err_t esp_netif_set_old_ip_info(esp_netif_t *esp_netif, const esp_netif_ip_info_t *ip_info); + +/** + * @brief Get net interface index from network stack implementation + * + * @note This index could be used in `setsockopt()` to bind socket with multicast interface + * + * @param[in] esp_netif Handle to esp-netif instance + * + * @return + * implementation specific index of interface represented with supplied esp_netif + */ +int esp_netif_get_netif_impl_index(esp_netif_t *esp_netif); + +/** + * @} + */ + +/** + * @defgroup ESP_NETIF_NET_DHCP ESP-NETIF DHCP Settings + * @brief Network stack related interface to DHCP client and server + */ + +/** @addtogroup ESP_NETIF_NET_DHCP + * @{ + */ + +/** + * @brief Set or Get DHCP server option + * + * @param[in] esp_netif Handle to esp-netif instance + * @param[in] opt_op ESP_NETIF_OP_SET to set an option, ESP_NETIF_OP_GET to get an option. + * @param[in] opt_id Option index to get or set, must be one of the supported enum values. + * @param[inout] opt_val Pointer to the option parameter. + * @param[in] opt_len Length of the option parameter. + * + * @return + * - ESP_OK + * - ESP_ERR_ESP_NETIF_INVALID_PARAMS + * - ESP_ERR_ESP_NETIF_DHCP_ALREADY_STOPPED + * - ESP_ERR_ESP_NETIF_DHCP_ALREADY_STARTED + */ +esp_err_t +esp_netif_dhcps_option(esp_netif_t *esp_netif, esp_netif_dhcp_option_mode_t opt_op, esp_netif_dhcp_option_id_t opt_id, + void *opt_val, uint32_t opt_len); + +/** + * @brief Set or Get DHCP client option + * + * @param[in] esp_netif Handle to esp-netif instance + * @param[in] opt_op ESP_NETIF_OP_SET to set an option, ESP_NETIF_OP_GET to get an option. + * @param[in] opt_id Option index to get or set, must be one of the supported enum values. + * @param[inout] opt_val Pointer to the option parameter. + * @param[in] opt_len Length of the option parameter. + * + * @return + * - ESP_OK + * - ESP_ERR_ESP_NETIF_INVALID_PARAMS + * - ESP_ERR_ESP_NETIF_DHCP_ALREADY_STOPPED + * - ESP_ERR_ESP_NETIF_DHCP_ALREADY_STARTED + */ +esp_err_t +esp_netif_dhcpc_option(esp_netif_t *esp_netif, esp_netif_dhcp_option_mode_t opt_op, esp_netif_dhcp_option_id_t opt_id, + void *opt_val, uint32_t opt_len); + +/** + * @brief Start DHCP client (only if enabled in interface object) + * + * @note The default event handlers for the SYSTEM_EVENT_STA_CONNECTED and SYSTEM_EVENT_ETH_CONNECTED events call this function. + * + * @param[in] esp_netif Handle to esp-netif instance + * + * @return + * - ESP_OK + * - ESP_ERR_ESP_NETIF_INVALID_PARAMS + * - ESP_ERR_ESP_NETIF_DHCP_ALREADY_STARTED + * - ESP_ERR_ESP_NETIF_DHCPC_START_FAILED + */ +esp_err_t esp_netif_dhcpc_start(esp_netif_t *esp_netif); + +/** + * @brief Stop DHCP client (only if enabled in interface object) + * + * @note Calling action_netif_stop() will also stop the DHCP Client if it is running. + * + * @param[in] esp_netif Handle to esp-netif instance + * + * @return + * - ESP_OK + * - ESP_ERR_ESP_NETIF_INVALID_PARAMS + * - ESP_ERR_ESP_NETIF_DHCP_ALREADY_STOPPED + * - ESP_ERR_ESP_NETIF_IF_NOT_READY + */ +esp_err_t esp_netif_dhcpc_stop(esp_netif_t *esp_netif); + +/** + * @brief Get DHCP client status + * + * @param[in] esp_netif Handle to esp-netif instance + * @param[out] status If successful, the status of DHCP client will be returned in this argument. + * + * @return + * - ESP_OK + */ +esp_err_t esp_netif_dhcpc_get_status(esp_netif_t *esp_netif, esp_netif_dhcp_status_t *status); + +/** + * @brief Get DHCP Server status + * + * @param[in] esp_netif Handle to esp-netif instance + * @param[out] status If successful, the status of the DHCP server will be returned in this argument. + * + * @return + * - ESP_OK + */ +esp_err_t esp_netif_dhcps_get_status(esp_netif_t *esp_netif, esp_netif_dhcp_status_t *status); + +/** + * @brief Start DHCP server (only if enabled in interface object) + * + * @param[in] esp_netif Handle to esp-netif instance + * + * @return + * - ESP_OK + * - ESP_ERR_ESP_NETIF_INVALID_PARAMS + * - ESP_ERR_ESP_NETIF_DHCP_ALREADY_STARTED + */ +esp_err_t esp_netif_dhcps_start(esp_netif_t *esp_netif); + +/** + * @brief Stop DHCP server (only if enabled in interface object) + * + * @param[in] esp_netif Handle to esp-netif instance + * + * @return + * - ESP_OK + * - ESP_ERR_ESP_NETIF_INVALID_PARAMS + * - ESP_ERR_ESP_NETIF_DHCP_ALREADY_STOPPED + * - ESP_ERR_ESP_NETIF_IF_NOT_READY + */ +esp_err_t esp_netif_dhcps_stop(esp_netif_t *esp_netif); + +/** + * @} + */ + +/** + * @defgroup ESP_NETIF_NET_DNS ESP-NETIF DNS Settings + * @brief Network stack related interface to NDS + */ + +/** @addtogroup ESP_NETIF_NET_DNS + * @{ + */ + +/** + * @brief Set DNS Server information + * + * This function behaves differently if DHCP server or client is enabled + * + * If DHCP client is enabled, main and backup DNS servers will be updated automatically + * from the DHCP lease if the relevant DHCP options are set. Fallback DNS Server is never updated from the DHCP lease + * and is designed to be set via this API. + * If DHCP client is disabled, all DNS server types can be set via this API only. + * + * If DHCP server is enabled, the Main DNS Server setting is used by the DHCP server to provide a DNS Server option + * to DHCP clients (Wi-Fi stations). + * - The default Main DNS server is typically the IP of the Wi-Fi AP interface itself. + * - This function can override it by setting server type ESP_NETIF_DNS_MAIN. + * - Other DNS Server types are not supported for the Wi-Fi AP interface. + * + * @param[in] esp_netif Handle to esp-netif instance + * @param[in] type Type of DNS Server to set: ESP_NETIF_DNS_MAIN, ESP_NETIF_DNS_BACKUP, ESP_NETIF_DNS_FALLBACK + * @param[in] dns DNS Server address to set + * + * @return + * - ESP_OK on success + * - ESP_ERR_ESP_NETIF_INVALID_PARAMS invalid params + */ +esp_err_t esp_netif_set_dns_info(esp_netif_t *esp_netif, esp_netif_dns_type_t type, esp_netif_dns_info_t *dns); + +/** + * @brief Get DNS Server information + * + * Return the currently configured DNS Server address for the specified interface and Server type. + * + * This may be result of a previous call to esp_netif_set_dns_info(). If the interface's DHCP client is enabled, + * the Main or Backup DNS Server may be set by the current DHCP lease. + * + * @param[in] esp_netif Handle to esp-netif instance + * @param[in] type Type of DNS Server to get: ESP_NETIF_DNS_MAIN, ESP_NETIF_DNS_BACKUP, ESP_NETIF_DNS_FALLBACK + * @param[out] dns DNS Server result is written here on success + * + * @return + * - ESP_OK on success + * - ESP_ERR_ESP_NETIF_INVALID_PARAMS invalid params + */ +esp_err_t esp_netif_get_dns_info(esp_netif_t *esp_netif, esp_netif_dns_type_t type, esp_netif_dns_info_t *dns); + +/** + * @} + */ + +/** + * @defgroup ESP_NETIF_NET_IP ESP-NETIF IP address related interface + * @brief Network stack related interface to IP + */ + +/** @addtogroup ESP_NETIF_NET_IP + * @{ + */ + +/** + * @brief Create interface link-local IPv6 address + * + * Cause the TCP/IP stack to create a link-local IPv6 address for the specified interface. + * + * This function also registers a callback for the specified interface, so that if the link-local address becomes + * verified as the preferred address then a SYSTEM_EVENT_GOT_IP6 event will be sent. + * + * @param[in] esp_netif Handle to esp-netif instance + * + * @return + * - ESP_OK + * - ESP_ERR_ESP_NETIF_INVALID_PARAMS + */ +esp_err_t esp_netif_create_ip6_linklocal(esp_netif_t *esp_netif); + +/** + * @brief Get interface link-local IPv6 address + * + * If the specified interface is up and a preferred link-local IPv6 address + * has been created for the interface, return a copy of it. + * + * @param[in] esp_netif Handle to esp-netif instance + * @param[out] if_ip6 IPv6 information will be returned in this argument if successful. + * + * @return + * - ESP_OK + * - ESP_FAIL If interface is down, does not have a link-local IPv6 address, + * or the link-local IPv6 address is not a preferred address. + */ +esp_err_t esp_netif_get_ip6_linklocal(esp_netif_t *esp_netif, esp_ip6_addr_t *if_ip6); + +/** + * @brief Get interface global IPv6 address + * + * If the specified interface is up and a preferred global IPv6 address + * has been created for the interface, return a copy of it. + * + * @param[in] esp_netif Handle to esp-netif instance + * @param[out] if_ip6 IPv6 information will be returned in this argument if successful. + * + * @return + * - ESP_OK + * - ESP_FAIL If interface is down, does not have a global IPv6 address, + * or the global IPv6 address is not a preferred address. + */ +esp_err_t esp_netif_get_ip6_global(esp_netif_t *esp_netif, esp_ip6_addr_t *if_ip6); + +/** + * @brief Sets IPv4 address to the specified octets + * + * @param[out] addr IP address to be set + * @param a the first octet (127 for IP 127.0.0.1) + * @param b + * @param c + * @param d + */ +void esp_netif_set_ip4_addr(esp_ip4_addr_t *addr, uint8_t a, uint8_t b, uint8_t c, uint8_t d); + + +/** + * @brief Converts numeric IP address into decimal dotted ASCII representation. + * + * @param addr ip address in network order to convert + * @param buf target buffer where the string is stored + * @param buflen length of buf + * @return either pointer to buf which now holds the ASCII + * representation of addr or NULL if buf was too small + */ +char *esp_ip4addr_ntoa(const esp_ip4_addr_t *addr, char *buf, int buflen); + +/** + * @brief Ascii internet address interpretation routine + * The value returned is in network order. + * + * @param addr IP address in ascii representation (e.g. "127.0.0.1") + * @return ip address in network order +*/ +uint32_t esp_ip4addr_aton(const char *addr); + +/** + * @} + */ + +/** + * @defgroup ESP_NETIF_CONVERT ESP-NETIF Conversion utilities + * @brief ESP-NETIF conversion utilities to related keys, flags, implementation handle + */ + +/** @addtogroup ESP_NETIF_CONVERT + * @{ + */ + +/** + * @brief Gets media driver handle for this esp-netif instance + * + * @param[in] esp_netif Handle to esp-netif instance + * + * @return opaque pointer of related IO driver + */ +esp_netif_iodriver_handle esp_netif_get_io_driver(esp_netif_t *esp_netif); + +/** + * @brief Searches over a list of created objects to find an instance with supplied if key + * + * @param if_key Textual description of network interface + * + * @return Handle to esp-netif instance + */ +esp_netif_t *esp_netif_get_handle_from_ifkey(const char *if_key); + +/** + * @brief Returns configured flags for this interface + * + * @param[in] esp_netif Handle to esp-netif instance + * + * @return Configuration flags + */ +esp_netif_flags_t esp_netif_get_flags(esp_netif_t *esp_netif); + +/** + * @brief Returns configured interface key for this esp-netif instance + * + * @param[in] esp_netif Handle to esp-netif instance + * + * @return Textual description of related interface + */ +const char *esp_netif_get_ifkey(esp_netif_t *esp_netif); + +/** + * @brief Returns configured interface type for this esp-netif instance + * + * @param[in] esp_netif Handle to esp-netif instance + * + * @return Enumerated type of this interface, such as station, AP, ethernet + */ +const char *esp_netif_get_desc(esp_netif_t *esp_netif); + +/** + * @brief Returns configured event for this esp-netif instance and supplied event type + * + * @param[in] esp_netif Handle to esp-netif instance + * + * @param event_type (either get or lost IP) + * + * @return specific event id which is configured to be raised if the interface lost or acquired IP address + * -1 if supplied event_type is not known + */ +int32_t esp_netif_get_event_id(esp_netif_t *esp_netif, esp_netif_ip_event_type_t event_type); + +/** + * @} + */ + +/** + * @defgroup ESP_NETIF_LIST ESP-NETIF List of interfaces + * @brief APIs to enumerate all registered interfaces + */ + +/** @addtogroup ESP_NETIF_LIST + * @{ + */ + +/** + * @brief Iterates over list of interfaces. Returns first netif if NULL given as parameter + * + * @param[in] esp_netif Handle to esp-netif instance + * + * @return First netif from the list if supplied parameter is NULL, next one otherwise + */ +esp_netif_t *esp_netif_next(esp_netif_t *esp_netif); + +/** + * @brief Returns number of registered esp_netif objects + * + * @return Number of esp_netifs + */ +size_t esp_netif_get_nr_of_ifs(void); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* _ESP_NETIF_H_ */ diff --git a/arch/xtensa/include/esp32/esp_netif/include/esp_netif_defaults.h b/arch/xtensa/include/esp32/esp_netif/include/esp_netif_defaults.h new file mode 100644 index 0000000000000..d03c45965a5fb --- /dev/null +++ b/arch/xtensa/include/esp32/esp_netif/include/esp_netif_defaults.h @@ -0,0 +1,116 @@ +// 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. + +#ifndef _ESP_NETIF_DEFAULTS_H +#define _ESP_NETIF_DEFAULTS_H + +#ifdef __cplusplus +extern "C" { +#endif + +// +// Macros to assemble master configs with partial configs from netif, stack and driver +// + +/** + * @brief Default configuration reference of ethernet interface + */ +#define ESP_NETIF_DEFAULT_ETH() \ + { \ + .base = ESP_NETIF_BASE_DEFAULT_ETH, \ + .driver = NULL, \ + .stack = ESP_NETIF_NETSTACK_DEFAULT_ETH, \ + } + +/** + * @brief Default configuration reference of WIFI AP + */ +#define ESP_NETIF_DEFAULT_WIFI_AP() \ +{ \ + .base = ESP_NETIF_BASE_DEFAULT_WIFI_AP, \ + .driver = NULL, \ + .stack = ESP_NETIF_NETSTACK_DEFAULT_WIFI_AP, \ + } + +/** +* @brief Default configuration reference of WIFI STA +*/ +#define ESP_NETIF_DEFAULT_WIFI_STA() \ + { \ + .base = ESP_NETIF_BASE_DEFAULT_WIFI_STA, \ + .driver = NULL, \ + .stack = ESP_NETIF_NETSTACK_DEFAULT_WIFI_STA, \ + } + +/** +* @brief Default configuration reference of PPP client +*/ +#define ESP_NETIF_DEFAULT_PPP() \ + { \ + .base = ESP_NETIF_BASE_DEFAULT_PPP, \ + .driver = NULL, \ + .stack = ESP_NETIF_NETSTACK_DEFAULT_PPP, \ + } +/** + * @brief Default base config (esp-netif inherent) of WIFI STA + */ +#define ESP_NETIF_BASE_DEFAULT_WIFI_STA &_g_esp_netif_inherent_sta_config + +/** + * @brief Default base config (esp-netif inherent) of WIFI AP + */ +#define ESP_NETIF_BASE_DEFAULT_WIFI_AP &_g_esp_netif_inherent_ap_config + +/** + * @brief Default base config (esp-netif inherent) of ethernet interface + */ +#define ESP_NETIF_BASE_DEFAULT_ETH &_g_esp_netif_inherent_eth_config + +/** + * @brief Default base config (esp-netif inherent) of ppp interface + */ +#define ESP_NETIF_BASE_DEFAULT_PPP &_g_esp_netif_inherent_ppp_config + + +#define ESP_NETIF_NETSTACK_DEFAULT_ETH _g_esp_netif_netstack_default_eth +#define ESP_NETIF_NETSTACK_DEFAULT_WIFI_STA _g_esp_netif_netstack_default_wifi_sta +#define ESP_NETIF_NETSTACK_DEFAULT_WIFI_AP _g_esp_netif_netstack_default_wifi_ap +#define ESP_NETIF_NETSTACK_DEFAULT_PPP _g_esp_netif_netstack_default_ppp + +// +// Include default network stacks configs +// - Network stack configurations are provided in a specific network stack +// implementation that is invisible to user API +// - Here referenced only as opaque pointers +// +extern const esp_netif_netstack_config_t *_g_esp_netif_netstack_default_eth; +extern const esp_netif_netstack_config_t *_g_esp_netif_netstack_default_wifi_sta; +extern const esp_netif_netstack_config_t *_g_esp_netif_netstack_default_wifi_ap; +extern const esp_netif_netstack_config_t *_g_esp_netif_netstack_default_ppp; + +// +// Include default common configs inherent to esp-netif +// - These inherent configs are defined in esp_netif_defaults.c and describe +// common behavioural patters for common interfaces such as STA, AP, ETH +// +extern const esp_netif_inherent_config_t _g_esp_netif_inherent_sta_config; +extern const esp_netif_inherent_config_t _g_esp_netif_inherent_ap_config; +extern const esp_netif_inherent_config_t _g_esp_netif_inherent_eth_config; +extern const esp_netif_inherent_config_t _g_esp_netif_inherent_ppp_config; + +#ifdef __cplusplus +} +#endif + +#endif //_ESP_NETIF_DEFAULTS_H diff --git a/arch/xtensa/include/esp32/esp_netif/include/esp_netif_ip_addr.h b/arch/xtensa/include/esp32/esp_netif/include/esp_netif_ip_addr.h new file mode 100644 index 0000000000000..e4b126272e8cd --- /dev/null +++ b/arch/xtensa/include/esp32/esp_netif/include/esp_netif_ip_addr.h @@ -0,0 +1,107 @@ +// 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. + +#ifndef _ESP_NETIF_IP_ADDR_H_ +#define _ESP_NETIF_IP_ADDR_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#if BYTE_ORDER == BIG_ENDIAN +#define esp_netif_htonl(x) ((uint32_t)(x)) +#else +#define esp_netif_htonl(x) ((((x) & (uint32_t)0x000000ffUL) << 24) | \ + (((x) & (uint32_t)0x0000ff00UL) << 8) | \ + (((x) & (uint32_t)0x00ff0000UL) >> 8) | \ + (((x) & (uint32_t)0xff000000UL) >> 24)) +#endif + +#define esp_netif_ip4_makeu32(a,b,c,d) (((uint32_t)((a) & 0xff) << 24) | \ + ((uint32_t)((b) & 0xff) << 16) | \ + ((uint32_t)((c) & 0xff) << 8) | \ + (uint32_t)((d) & 0xff)) + +// Access address in 16-bit block +#define ESP_IP6_ADDR_BLOCK1(ip6addr) ((uint16_t)((esp_netif_htonl((ip6addr)->addr[0]) >> 16) & 0xffff)) +#define ESP_IP6_ADDR_BLOCK2(ip6addr) ((uint16_t)((esp_netif_htonl((ip6addr)->addr[0])) & 0xffff)) +#define ESP_IP6_ADDR_BLOCK3(ip6addr) ((uint16_t)((esp_netif_htonl((ip6addr)->addr[1]) >> 16) & 0xffff)) +#define ESP_IP6_ADDR_BLOCK4(ip6addr) ((uint16_t)((esp_netif_htonl((ip6addr)->addr[1])) & 0xffff)) +#define ESP_IP6_ADDR_BLOCK5(ip6addr) ((uint16_t)((esp_netif_htonl((ip6addr)->addr[2]) >> 16) & 0xffff)) +#define ESP_IP6_ADDR_BLOCK6(ip6addr) ((uint16_t)((esp_netif_htonl((ip6addr)->addr[2])) & 0xffff)) +#define ESP_IP6_ADDR_BLOCK7(ip6addr) ((uint16_t)((esp_netif_htonl((ip6addr)->addr[3]) >> 16) & 0xffff)) +#define ESP_IP6_ADDR_BLOCK8(ip6addr) ((uint16_t)((esp_netif_htonl((ip6addr)->addr[3])) & 0xffff)) + +#define IPSTR "%d.%d.%d.%d" +#define esp_ip4_addr_get_byte(ipaddr, idx) (((const uint8_t*)(&(ipaddr)->addr))[idx]) +#define esp_ip4_addr1(ipaddr) esp_ip4_addr_get_byte(ipaddr, 0) +#define esp_ip4_addr2(ipaddr) esp_ip4_addr_get_byte(ipaddr, 1) +#define esp_ip4_addr3(ipaddr) esp_ip4_addr_get_byte(ipaddr, 2) +#define esp_ip4_addr4(ipaddr) esp_ip4_addr_get_byte(ipaddr, 3) + + +#define esp_ip4_addr1_16(ipaddr) ((uint16_t)esp_ip4_addr1(ipaddr)) +#define esp_ip4_addr2_16(ipaddr) ((uint16_t)esp_ip4_addr2(ipaddr)) +#define esp_ip4_addr3_16(ipaddr) ((uint16_t)esp_ip4_addr3(ipaddr)) +#define esp_ip4_addr4_16(ipaddr) ((uint16_t)esp_ip4_addr4(ipaddr)) + +#define IP2STR(ipaddr) esp_ip4_addr1_16(ipaddr), \ + esp_ip4_addr2_16(ipaddr), \ + esp_ip4_addr3_16(ipaddr), \ + esp_ip4_addr4_16(ipaddr) + +#define IPV6STR "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x" + +#define IPV62STR(ipaddr) ESP_IP6_ADDR_BLOCK1(&(ipaddr)), \ + ESP_IP6_ADDR_BLOCK2(&(ipaddr)), \ + ESP_IP6_ADDR_BLOCK3(&(ipaddr)), \ + ESP_IP6_ADDR_BLOCK4(&(ipaddr)), \ + ESP_IP6_ADDR_BLOCK5(&(ipaddr)), \ + ESP_IP6_ADDR_BLOCK6(&(ipaddr)), \ + ESP_IP6_ADDR_BLOCK7(&(ipaddr)), \ + ESP_IP6_ADDR_BLOCK8(&(ipaddr)) + +#define ESP_IPADDR_TYPE_V4 0U +#define ESP_IPADDR_TYPE_V6 6U +#define ESP_IPADDR_TYPE_ANY 46U + + +struct esp_ip6_addr { + uint32_t addr[4]; + uint8_t zone; +}; + +struct esp_ip4_addr { + uint32_t addr; +}; + +typedef struct esp_ip4_addr esp_ip4_addr_t; + +typedef struct esp_ip6_addr esp_ip6_addr_t; + +typedef struct _ip_addr { + union { + esp_ip6_addr_t ip6; + esp_ip4_addr_t ip4; + } u_addr; + uint8_t type; +} esp_ip_addr_t; + +#ifdef __cplusplus +} +#endif + +#endif //_ESP_NETIF_IP_ADDR_H_ diff --git a/arch/xtensa/include/esp32/esp_netif/include/esp_netif_net_stack.h b/arch/xtensa/include/esp32/esp_netif/include/esp_netif_net_stack.h new file mode 100644 index 0000000000000..c38297a9f76fe --- /dev/null +++ b/arch/xtensa/include/esp32/esp_netif/include/esp_netif_net_stack.h @@ -0,0 +1,92 @@ +// 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. + +#ifndef _ESP_NETIF_NET_STACK_H_ +#define _ESP_NETIF_NET_STACK_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +// +// Network stack API: This ESP-NETIF API are supposed to be called only from internals of TCP/IP stack +// + +/** @addtogroup ESP_NETIF_CONVERT + * @{ + */ + +/** + * @brief Returns esp-netif handle + * + * @param[in] dev opaque ptr to network interface of specific TCP/IP stack + * + * @return handle to related esp-netif instance + */ +esp_netif_t* esp_netif_get_handle_from_netif_impl(void *dev); + +/** + * @brief Returns network stack specific implementation handle (if supported) + * + * Note that it is not supported to acquire PPP netif impl pointer and + * this function will return NULL for esp_netif instances configured to PPP mode + * + * @param[in] esp_netif Handle to esp-netif instance + * + * @return handle to related network stack netif handle + */ +void* esp_netif_get_netif_impl(esp_netif_t *esp_netif); + +/** + * @} + */ + +/** @addtogroup ESP_NETIF_DATA_IO_API + * @{ + */ + +/** + * @brief Outputs packets from the TCP/IP stack to the media to be transmitted + * + * This function gets called from network stack to output packets to IO driver. + * + * @param[in] esp_netif Handle to esp-netif instance + * @param[in] data Data to be transmitted + * @param[in] len Length of the data frame + * + * @return ESP_OK on success, an error passed from the I/O driver otherwise + */ +esp_err_t esp_netif_transmit(esp_netif_t *esp_netif, void* data, size_t len); + +/** + * @brief Free the rx buffer allocated by the media driver + * + * This function gets called from network stack when the rx buffer to be freed in IO driver context, + * i.e. to deallocate a buffer owned by io driver (when data packets were passed to higher levels + * to avoid copying) + * + * @param[in] esp_netif Handle to esp-netif instance + * @param[in] buffer Rx buffer pointer + */ +void esp_netif_free_rx_buffer(void *esp_netif, void* buffer); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif //_ESP_NETIF_NET_STACK_H_ diff --git a/arch/xtensa/include/esp32/esp_netif/include/esp_netif_ppp.h b/arch/xtensa/include/esp32/esp_netif/include/esp_netif_ppp.h new file mode 100644 index 0000000000000..413910c4331c2 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_netif/include/esp_netif_ppp.h @@ -0,0 +1,110 @@ +// 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. +// + +#ifndef _ESP_NETIF_PPP_H_ +#define _ESP_NETIF_PPP_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/** @brief PPP event base */ +ESP_EVENT_DECLARE_BASE(NETIF_PPP_STATUS); + +/** @brief Configuration structure for PPP network interface + * + */ +typedef struct esp_netif_ppp_config { + bool ppp_phase_event_enabled; /**< Enables events coming from PPP PHASE change */ + bool ppp_error_event_enabled; /**< Enables events from main PPP state machine producing errors */ +} esp_netif_ppp_config_t; + +/** @brief event id offset for PHASE related events + * + * All PPP related events are produced from esp-netif under `NETIF_PPP_STATUS`, this offset defines + * helps distinguish between error and phase events + */ +#define NETIF_PP_PHASE_OFFSET (0x100) + +/** @brief event ids for different PPP related events + * + */ +typedef enum { + NETIF_PPP_ERRORNONE = 0, /* No error. */ + NETIF_PPP_ERRORPARAM = 1, /* Invalid parameter. */ + NETIF_PPP_ERROROPEN = 2, /* Unable to open PPP session. */ + NETIF_PPP_ERRORDEVICE = 3, /* Invalid I/O device for PPP. */ + NETIF_PPP_ERRORALLOC = 4, /* Unable to allocate resources. */ + NETIF_PPP_ERRORUSER = 5, /* User interrupt. */ + NETIF_PPP_ERRORCONNECT = 6, /* Connection lost. */ + NETIF_PPP_ERRORAUTHFAIL = 7, /* Failed authentication challenge. */ + NETIF_PPP_ERRORPROTOCOL = 8, /* Failed to meet protocol. */ + NETIF_PPP_ERRORPEERDEAD = 9, /* Connection timeout */ + NETIF_PPP_ERRORIDLETIMEOUT = 10, /* Idle Timeout */ + NETIF_PPP_ERRORCONNECTTIME = 11, /* Max connect time reached */ + NETIF_PPP_ERRORLOOPBACK = 12, /* Loopback detected */ + NETIF_PPP_PHASE_DEAD = NETIF_PP_PHASE_OFFSET + 0, + NETIF_PPP_PHASE_MASTER = NETIF_PP_PHASE_OFFSET + 1, + NETIF_PPP_PHASE_HOLDOFF = NETIF_PP_PHASE_OFFSET + 2, + NETIF_PPP_PHASE_INITIALIZE = NETIF_PP_PHASE_OFFSET + 3, + NETIF_PPP_PHASE_SERIALCONN = NETIF_PP_PHASE_OFFSET + 4, + NETIF_PPP_PHASE_DORMANT = NETIF_PP_PHASE_OFFSET + 5, + NETIF_PPP_PHASE_ESTABLISH = NETIF_PP_PHASE_OFFSET + 6, + NETIF_PPP_PHASE_AUTHENTICATE = NETIF_PP_PHASE_OFFSET + 7, + NETIF_PPP_PHASE_CALLBACK = NETIF_PP_PHASE_OFFSET + 8, + NETIF_PPP_PHASE_NETWORK = NETIF_PP_PHASE_OFFSET + 9, + NETIF_PPP_PHASE_RUNNING = NETIF_PP_PHASE_OFFSET + 10, + NETIF_PPP_PHASE_TERMINATE = NETIF_PP_PHASE_OFFSET + 11, + NETIF_PPP_PHASE_DISCONNECT = NETIF_PP_PHASE_OFFSET + 12, +} esp_netif_ppp_status_event_t; + +/** @brief definitions of different authorisation types + * + */ +typedef enum { + NETIF_PPP_AUTHTYPE_NONE = 0x00, + NETIF_PPP_AUTHTYPE_PAP = 0x01, + NETIF_PPP_AUTHTYPE_CHAP = 0x02, + NETIF_PPP_AUTHTYPE_MSCHAP = 0x04, + NETIF_PPP_AUTHTYPE_MSCHAP_V2 = 0x08, + NETIF_PPP_AUTHTYPE_EAP = 0x10, +} esp_netif_auth_type_t; + +/** @brief Sets the auth parameters for the supplied esp-netif. + * + * @param[in] esp_netif Handle to esp-netif instance + * @param[in] authtype Authorisation type + * @param[in] user User name + * @param[in] passwd Password + * + * @return ESP_OK on success, ESP_ERR_ESP_NETIF_INVALID_PARAMS if netif null or not PPP + */ +esp_err_t esp_netif_ppp_set_auth(esp_netif_t *netif, esp_netif_auth_type_t authtype, const char *user, const char *passwd); + +/** @brief Sets common parameters for the supplied esp-netif. + * + * @param[in] esp_netif Handle to esp-netif instance + * @param[in] config Pointer to PPP netif configuration structure + * + * @return ESP_OK on success, ESP_ERR_ESP_NETIF_INVALID_PARAMS if netif null or not PPP + */ +esp_err_t esp_netif_ppp_set_params(esp_netif_t *netif, const esp_netif_ppp_config_t *config); + + +#ifdef __cplusplus +} +#endif + +#endif //_ESP_NETIF_PPP_H_ diff --git a/arch/xtensa/include/esp32/esp_netif/include/esp_netif_sta_list.h b/arch/xtensa/include/esp32/esp_netif/include/esp_netif_sta_list.h new file mode 100644 index 0000000000000..d464132ace886 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_netif/include/esp_netif_sta_list.h @@ -0,0 +1,71 @@ +// 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. + +#ifndef _ESP_NETIF_STA_LIST_H_ +#define _ESP_NETIF_STA_LIST_H_ + +#include "esp_netif_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief station list info element + */ +typedef struct { + uint8_t mac[6]; /**< Station MAC address */ + esp_ip4_addr_t ip; /**< Station assigned IP address */ +} esp_netif_sta_info_t; + +/** + * @brief station list structure + */ +typedef struct { + esp_netif_sta_info_t sta[ESP_WIFI_MAX_CONN_NUM]; /**< Connected stations */ + int num; /**< Number of connected stations */ +} esp_netif_sta_list_t; + +/** + * @defgroup ESP_NETIF_STA_LIST ESP-NETIF STA list api + * @brief List of stations for Wi-Fi AP interface + * + */ + +/** @addtogroup ESP_NETIF_STA_LIST + * @{ + */ + +/** + * @brief Get IP information for stations connected to the Wi-Fi AP interface + * + * @param[in] wifi_sta_list Wi-Fi station info list, returned from esp_wifi_ap_get_sta_list() + * @param[out] netif_sta_list IP layer station info list, corresponding to MAC addresses provided in wifi_sta_list + * + * @return + * - ESP_OK + * - ESP_ERR_ESP_NETIF_NO_MEM + * - ESP_ERR_ESP_NETIF_INVALID_PARAMS + */ +esp_err_t esp_netif_get_sta_list(const wifi_sta_list_t *wifi_sta_list, esp_netif_sta_list_t *netif_sta_list); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif //_ESP_NETIF_STA_LIST_H_ diff --git a/arch/xtensa/include/esp32/esp_netif/include/esp_netif_types.h b/arch/xtensa/include/esp32/esp_netif/include/esp_netif_types.h new file mode 100644 index 0000000000000..9c785ad8830c6 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_netif/include/esp_netif_types.h @@ -0,0 +1,214 @@ +// 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. + +#ifndef _ESP_NETIF_TYPES_H_ +#define _ESP_NETIF_TYPES_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Definition of ESP-NETIF based errors + */ +#define ESP_ERR_ESP_NETIF_BASE 0x5000 +#define ESP_ERR_ESP_NETIF_INVALID_PARAMS ESP_ERR_ESP_NETIF_BASE + 0x01 +#define ESP_ERR_ESP_NETIF_IF_NOT_READY ESP_ERR_ESP_NETIF_BASE + 0x02 +#define ESP_ERR_ESP_NETIF_DHCPC_START_FAILED ESP_ERR_ESP_NETIF_BASE + 0x03 +#define ESP_ERR_ESP_NETIF_DHCP_ALREADY_STARTED ESP_ERR_ESP_NETIF_BASE + 0x04 +#define ESP_ERR_ESP_NETIF_DHCP_ALREADY_STOPPED ESP_ERR_ESP_NETIF_BASE + 0x05 +#define ESP_ERR_ESP_NETIF_NO_MEM ESP_ERR_ESP_NETIF_BASE + 0x06 +#define ESP_ERR_ESP_NETIF_DHCP_NOT_STOPPED ESP_ERR_ESP_NETIF_BASE + 0x07 +#define ESP_ERR_ESP_NETIF_DRIVER_ATTACH_FAILED ESP_ERR_ESP_NETIF_BASE + 0x08 +#define ESP_ERR_ESP_NETIF_INIT_FAILED ESP_ERR_ESP_NETIF_BASE + 0x09 +#define ESP_ERR_ESP_NETIF_DNS_NOT_CONFIGURED ESP_ERR_ESP_NETIF_BASE + 0x0A + + +/** @brief Type of esp_netif_object server */ +struct esp_netif_obj; + +typedef struct esp_netif_obj esp_netif_t; + + +/** @brief Type of DNS server */ +typedef enum { + ESP_NETIF_DNS_MAIN= 0, /**< DNS main server address*/ + ESP_NETIF_DNS_BACKUP, /**< DNS backup server address (Wi-Fi STA and Ethernet only) */ + ESP_NETIF_DNS_FALLBACK, /**< DNS fallback server address (Wi-Fi STA and Ethernet only) */ + ESP_NETIF_DNS_MAX +} esp_netif_dns_type_t; + +/** @brief DNS server info */ +typedef struct { + esp_ip_addr_t ip; /**< IPV4 address of DNS server */ +} esp_netif_dns_info_t; + +/** @brief Status of DHCP client or DHCP server */ +typedef enum { + ESP_NETIF_DHCP_INIT = 0, /**< DHCP client/server is in initial state (not yet started) */ + ESP_NETIF_DHCP_STARTED, /**< DHCP client/server has been started */ + ESP_NETIF_DHCP_STOPPED, /**< DHCP client/server has been stopped */ + ESP_NETIF_DHCP_STATUS_MAX +} esp_netif_dhcp_status_t; + + +/** @brief Mode for DHCP client or DHCP server option functions */ +typedef enum{ + ESP_NETIF_OP_START = 0, + ESP_NETIF_OP_SET, /**< Set option */ + ESP_NETIF_OP_GET, /**< Get option */ + ESP_NETIF_OP_MAX +} esp_netif_dhcp_option_mode_t; + +/** @brief Supported options for DHCP client or DHCP server */ +typedef enum{ + ESP_NETIF_DOMAIN_NAME_SERVER = 6, /**< Domain name server */ + ESP_NETIF_ROUTER_SOLICITATION_ADDRESS = 32, /**< Solicitation router address */ + ESP_NETIF_REQUESTED_IP_ADDRESS = 50, /**< Request specific IP address */ + ESP_NETIF_IP_ADDRESS_LEASE_TIME = 51, /**< Request IP address lease time */ + ESP_NETIF_IP_REQUEST_RETRY_TIME = 52, /**< Request IP address retry counter */ +} esp_netif_dhcp_option_id_t; + +/** IP event declarations */ +typedef enum { + IP_EVENT_STA_GOT_IP, /*!< station got IP from connected AP */ + IP_EVENT_STA_LOST_IP, /*!< station lost IP and the IP is reset to 0 */ + IP_EVENT_AP_STAIPASSIGNED, /*!< soft-AP assign an IP to a connected station */ + IP_EVENT_GOT_IP6, /*!< station or ap or ethernet interface v6IP addr is preferred */ + IP_EVENT_ETH_GOT_IP, /*!< ethernet got IP from connected AP */ + IP_EVENT_PPP_GOT_IP, /*!< PPP interface got IP */ + IP_EVENT_PPP_LOST_IP, /*!< PPP interface lost IP */ +} ip_event_t; + +/** @brief IP event base declaration */ +ESP_EVENT_DECLARE_BASE(IP_EVENT); + +/** Event structure for IP_EVENT_STA_GOT_IP, IP_EVENT_ETH_GOT_IP events */ + +typedef struct { + esp_ip4_addr_t ip; /**< Interface IPV4 address */ + esp_ip4_addr_t netmask; /**< Interface IPV4 netmask */ + esp_ip4_addr_t gw; /**< Interface IPV4 gateway address */ +} esp_netif_ip_info_t; + +/** @brief IPV6 IP address information + */ +typedef struct { + esp_ip6_addr_t ip; /**< Interface IPV6 address */ +} esp_netif_ip6_info_t; + +typedef struct { + int if_index; /*!< Interface index for which the event is received (left for legacy compilation) */ + esp_netif_t *esp_netif; /*!< Pointer to corresponding esp-netif object */ + esp_netif_ip_info_t ip_info; /*!< IP address, netmask, gatway IP address */ + bool ip_changed; /*!< Whether the assigned IP has changed or not */ +} ip_event_got_ip_t; + +/** Event structure for IP_EVENT_GOT_IP6 event */ +typedef struct { + int if_index; /*!< Interface index for which the event is received (left for legacy compilation) */ + esp_netif_t *esp_netif; /*!< Pointer to corresponding esp-netif object */ + esp_netif_ip6_info_t ip6_info; /*!< IPv6 address of the interface */ +} ip_event_got_ip6_t; + +/** Event structure for IP_EVENT_AP_STAIPASSIGNED event */ +typedef struct { + esp_ip4_addr_t ip; /*!< IP address which was assigned to the station */ +} ip_event_ap_staipassigned_t; + + + + +typedef enum esp_netif_flags { + ESP_NETIF_DHCP_CLIENT = 1 << 0, + ESP_NETIF_DHCP_SERVER = 1 << 1, + ESP_NETIF_FLAG_AUTOUP = 1 << 2, + ESP_NETIF_FLAG_GARP = 1 << 3, + ESP_NETIF_FLAG_EVENT_IP_MODIFIED = 1 << 4, + ESP_NETIF_FLAG_IS_PPP = 1 << 5 +} esp_netif_flags_t; + +typedef enum esp_netif_ip_event_type { + ESP_NETIF_IP_EVENT_GOT_IP = 1, + ESP_NETIF_IP_EVENT_LOST_IP = 2, +} esp_netif_ip_event_type_t; + + +// +// ESP-NETIF interface configuration: +// 1) general (behavioral) config (esp_netif_config_t) +// 2) (peripheral) driver specific config (esp_netif_driver_ifconfig_t) +// 3) network stack specific config (esp_netif_net_stack_ifconfig_t) -- no publicly available +// + +typedef struct esp_netif_inherent_config { + esp_netif_flags_t flags; /*!< flags that define esp-netif behavior */ + uint8_t mac[6]; /*!< initial mac address for this interface */ + esp_netif_ip_info_t* ip_info; /*!< initial ip address for this interface */ + uint32_t get_ip_event; /*!< event id to be raised when interface gets an IP */ + uint32_t lost_ip_event; /*!< event id to be raised when interface losts its IP */ + const char * if_key; /*!< string identifier of the interface */ + const char * if_desc; /*!< textual description of the interface */ + int route_prio; /*!< numeric priority of this interface to become a default + routing if (if other netifs are up) */ +} esp_netif_inherent_config_t; + +typedef struct esp_netif_config esp_netif_config_t; + +/** + * @brief IO driver handle type + */ +typedef void * esp_netif_iodriver_handle; + +typedef struct esp_netif_driver_base_s { + esp_err_t (*post_attach)(esp_netif_t *netif, esp_netif_iodriver_handle h); + esp_netif_t *netif; +} esp_netif_driver_base_t; + +/** + * @brief Specific IO driver configuration + */ +struct esp_netif_driver_ifconfig { + esp_netif_iodriver_handle handle; + esp_err_t (*transmit)(void *h, void *buffer, size_t len); + void (*driver_free_rx_buffer)(void *h, void* buffer); +}; + +typedef struct esp_netif_driver_ifconfig esp_netif_driver_ifconfig_t; + +/** + * @brief Specific L3 network stack configuration + */ + +typedef struct esp_netif_netstack_config esp_netif_netstack_config_t; + +/** + * @brief Generic esp_netif configuration + */ +struct esp_netif_config { + const esp_netif_inherent_config_t *base; + const esp_netif_driver_ifconfig_t *driver; + const esp_netif_netstack_config_t *stack; +}; + +/** + * @brief ESP-NETIF Receive function type + */ +typedef esp_err_t (*esp_netif_receive_t)(esp_netif_t *esp_netif, void *buffer, size_t len, void *eb); + +#ifdef __cplusplus +} +#endif + +#endif // _ESP_NETIF_TYPES_H_ \ No newline at end of file diff --git a/arch/xtensa/include/esp32/esp_rom/CMakeLists.txt b/arch/xtensa/include/esp32/esp_rom/CMakeLists.txt new file mode 100644 index 0000000000000..d73ef604bdb53 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_rom/CMakeLists.txt @@ -0,0 +1,62 @@ +idf_build_get_property(target IDF_TARGET) + +idf_component_register(INCLUDE_DIRS include) + +if(BOOTLOADER_BUILD) + set(scripts + "${target}/ld/${target}.rom.ld" + "${target}/ld/${target}.rom.newlib-funcs.ld" + "${target}/ld/${target}.rom.libgcc.ld" + ) + if(target STREQUAL "esp32s2beta") + list(APPEND scripts "esp32s2beta/ld/esp32s2beta.rom.spiflash.ld") + endif() + + if(CONFIG_ESP32_REV_MIN_3) + list(APPEND scripts "esp32/ld/esp32.rom.eco3.ld") + endif() + + target_linker_script(${COMPONENT_LIB} INTERFACE "${scripts}") +else() # Regular app build + set(scripts + "${target}/ld/${target}.rom.ld" + "${target}/ld/${target}.rom.libgcc.ld" + "${target}/ld/${target}.rom.newlib-data.ld") + + if(target STREQUAL "esp32") + list(APPEND scripts "${target}/ld/${target}.rom.syscalls.ld") + + if(NOT CONFIG_SPIRAM_CACHE_WORKAROUND) + list(APPEND scripts "esp32/ld/esp32.rom.newlib-funcs.ld") + if(NOT CONFIG_SDK_TOOLCHAIN_SUPPORTS_TIME_WIDE_64_BITS) + # If SDK_TOOLCHAIN_SUPPORTS_TIME_WIDE_64_BITS option is defined + # then all time functions from the ROM memory will not be linked. + # Instead, those functions can be used from the toolchain by ESP-IDF. + target_linker_script(${COMPONENT_LIB} INTERFACE "esp32/ld/esp32.rom.newlib-funcs-time.ld") + endif() + + # Include in newlib nano from ROM only if SPIRAM cache workaround is disabled + if(CONFIG_NEWLIB_NANO_FORMAT) + list(APPEND scripts "esp32/ld/esp32.rom.newlib-nano.ld") + endif() + + endif() + + if(NOT CONFIG_SPI_FLASH_ROM_DRIVER_PATCH) + list(APPEND scripts "esp32/ld/esp32.rom.spiflash.ld") + endif() + + elseif(target STREQUAL "esp32s2beta") + # no SPIRAM workaround for esp32s2beta + # no nano formatting function in ROM + + list(APPEND scripts "esp32s2beta/ld/esp32s2beta.rom.newlib-funcs.ld" + "esp32s2beta/ld/esp32s2beta.rom.spiflash.ld") + endif() + if(CONFIG_ESP32_REV_MIN_3) + list(APPEND scripts "esp32/ld/esp32.rom.eco3.ld") + endif() + + target_linker_script(${COMPONENT_LIB} INTERFACE "${scripts}") + +endif() diff --git a/arch/xtensa/include/esp32/esp_rom/component.mk b/arch/xtensa/include/esp32/esp_rom/component.mk new file mode 100644 index 0000000000000..40f327e247f52 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_rom/component.mk @@ -0,0 +1,32 @@ +#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 += esp32.rom.ld \ + esp32.rom.libgcc.ld \ + esp32.rom.syscalls.ld \ + esp32.rom.newlib-data.ld + +#SPI-RAM incompatible functions can be used in when the SPI RAM +#workaround is not enabled. +ifndef CONFIG_SPIRAM_CACHE_WORKAROUND +LINKER_SCRIPTS += esp32.rom.newlib-funcs.ld + +ifdef CONFIG_ESP32_REV_MIN_3 +LINKER_SCRIPTS += esp32.rom.eco3.ld +endif + +# Include in newlib nano from ROM only if SPIRAM cache workaround is disabled +ifdef CONFIG_NEWLIB_NANO_FORMAT +LINKER_SCRIPTS += esp32.rom.newlib-nano.ld +endif + +endif #CONFIG_SPIRAM_CACHE_WORKAROUND + +ifndef CONFIG_SPI_FLASH_ROM_DRIVER_PATCH +LINKER_SCRIPTS += esp32.rom.spiflash.ld +endif + +COMPONENT_ADD_LDFLAGS += -L $(COMPONENT_PATH)/esp32/ld \ + $(addprefix -T ,$(LINKER_SCRIPTS)) \ + +COMPONENT_ADD_LINKER_DEPS += $(addprefix esp32/ld/, $(LINKER_SCRIPTS)) diff --git a/arch/xtensa/include/esp32/esp_rom/esp_rom.c b/arch/xtensa/include/esp32/esp_rom/esp_rom.c new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/aes.h b/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/aes.h new file mode 100644 index 0000000000000..bbe13d22e47fb --- /dev/null +++ b/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/aes.h @@ -0,0 +1,57 @@ +/* + ROM functions for hardware AES support. + + It is not recommended to use these functions directly, + use the wrapper functions in esp32/aes.h instead. + + */ +// 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. + +#ifndef _ROM_AES_H_ +#define _ROM_AES_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +//TODO, add comment for aes apis +enum AES_BITS { + AES128, + AES192, + AES256 +}; + +void ets_aes_enable(void); + +void ets_aes_disable(void); + +void ets_aes_set_endian(bool key_word_swap, bool key_byte_swap, + bool in_word_swap, bool in_byte_swap, + bool out_word_swap, bool out_byte_swap); + +bool ets_aes_setkey_enc(const uint8_t *key, enum AES_BITS bits); + +bool ets_aes_setkey_dec(const uint8_t *key, enum AES_BITS bits); + +void ets_aes_crypt(const uint8_t input[16], uint8_t output[16]); + +#ifdef __cplusplus +} +#endif + +#endif /* _ROM_AES_H_ */ diff --git a/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/bigint.h b/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/bigint.h new file mode 100644 index 0000000000000..97ad72202a334 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/bigint.h @@ -0,0 +1,62 @@ +/* + ROM functions for hardware bigint support. + + It is not recommended to use these functions directly, + use the wrapper functions in hwcrypto/mpi.h instead. + + */ +// 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. + +#ifndef _ROM_BIGINT_H_ +#define _ROM_BIGINT_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +//TODO: add comment here +void ets_bigint_enable(void); + +void ets_bigint_disable(void); + +void ets_bigint_wait_finish(void); + +bool ets_bigint_mod_power_prepare(uint32_t *x, uint32_t *y, uint32_t *m, + uint32_t m_dash, uint32_t *rb, uint32_t len, bool again); + +bool ets_bigint_mod_power_getz(uint32_t *z, uint32_t len); + +bool ets_bigint_mult_prepare(uint32_t *x, uint32_t *y, uint32_t len); + +bool ets_bigint_mult_getz(uint32_t *z, uint32_t len); + +bool ets_bigint_montgomery_mult_prepare(uint32_t *x, uint32_t *y, uint32_t *m, + uint32_t m_dash, uint32_t len, bool again); + +bool ets_bigint_montgomery_mult_getz(uint32_t *z, uint32_t len); + +bool ets_bigint_mod_mult_prepare(uint32_t *x, uint32_t *y, uint32_t *m, + uint32_t m_dash, uint32_t *rb, uint32_t len, bool again); + +bool ets_bigint_mod_mult_getz(uint32_t *m, uint32_t *z, uint32_t len); + +#ifdef __cplusplus +} +#endif + +#endif /* _ROM_BIGINT_H_ */ diff --git a/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/cache.h b/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/cache.h new file mode 100644 index 0000000000000..4b923e669d77c --- /dev/null +++ b/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/cache.h @@ -0,0 +1,186 @@ +// 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. + +#ifndef _ROM_CACHE_H_ +#define _ROM_CACHE_H_ + +#include "soc/dport_access.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup uart_apis, uart configuration and communication related apis + * @brief uart apis + */ + +/** @addtogroup uart_apis + * @{ + */ + +/** + * @brief Initialise cache mmu, mark all entries as invalid. + * Please do not call this function in your SDK application. + * + * @param int cpu_no : 0 for PRO cpu, 1 for APP cpu. + * + * @return None + */ +void mmu_init(int cpu_no); + +/** + * @brief Set Flash-Cache mmu mapping. + * Please do not call this function in your SDK application. + * + * @param int cpu_no : CPU number, 0 for PRO cpu, 1 for APP cpu. + * + * @param int pod : process identifier. Range 0~7. + * + * @param unsigned int vaddr : virtual address in CPU address space. + * Can be IRam0, IRam1, IRom0 and DRom0 memory address. + * Should be aligned by psize. + * + * @param unsigned int paddr : physical address in Flash. + * Should be aligned by psize. + * + * @param int psize : page size of flash, in kilobytes. Should be 64 here. + * + * @param int num : pages to be set. + * + * @return unsigned int: error status + * 0 : mmu set success + * 1 : vaddr or paddr is not aligned + * 2 : pid error + * 3 : psize error + * 4 : mmu table to be written is out of range + * 5 : vaddr is out of range + */ +static inline unsigned int IRAM_ATTR cache_flash_mmu_set(int cpu_no, int pid, unsigned int vaddr, unsigned int paddr, int psize, int num) +{ + extern unsigned int cache_flash_mmu_set_rom(int cpu_no, int pid, unsigned int vaddr, unsigned int paddr, int psize, int num); + + unsigned int ret; + + DPORT_STALL_OTHER_CPU_START(); + ret = cache_flash_mmu_set_rom(cpu_no, pid, vaddr, paddr, psize, num); + DPORT_STALL_OTHER_CPU_END(); + + return ret; +} + +/** + * @brief Set Ext-SRAM-Cache mmu mapping. + * Please do not call this function in your SDK application. + * + * Note that this code lives in IRAM and has a bugfix in respect to the ROM version + * of this function (which erroneously refused a vaddr > 2MiB + * + * @param int cpu_no : CPU number, 0 for PRO cpu, 1 for APP cpu. + * + * @param int pod : process identifier. Range 0~7. + * + * @param unsigned int vaddr : virtual address in CPU address space. + * Can be IRam0, IRam1, IRom0 and DRom0 memory address. + * Should be aligned by psize. + * + * @param unsigned int paddr : physical address in Ext-SRAM. + * Should be aligned by psize. + * + * @param int psize : page size of flash, in kilobytes. Should be 32 here. + * + * @param int num : pages to be set. + * + * @return unsigned int: error status + * 0 : mmu set success + * 1 : vaddr or paddr is not aligned + * 2 : pid error + * 3 : psize error + * 4 : mmu table to be written is out of range + * 5 : vaddr is out of range + */ +unsigned int IRAM_ATTR cache_sram_mmu_set(int cpu_no, int pid, unsigned int vaddr, unsigned int paddr, int psize, int num); + +/** + * @brief Initialise cache access for the cpu. + * Please do not call this function in your SDK application. + * + * @param int cpu_no : 0 for PRO cpu, 1 for APP cpu. + * + * @return None + */ +static inline void IRAM_ATTR Cache_Read_Init(int cpu_no) +{ + extern void Cache_Read_Init_rom(int cpu_no); + DPORT_STALL_OTHER_CPU_START(); + Cache_Read_Init_rom(cpu_no); + DPORT_STALL_OTHER_CPU_END(); +} + +/** + * @brief Flush the cache value for the cpu. + * Please do not call this function in your SDK application. + * + * @param int cpu_no : 0 for PRO cpu, 1 for APP cpu. + * + * @return None + */ +static inline void IRAM_ATTR Cache_Flush(int cpu_no) +{ + extern void Cache_Flush_rom(int cpu_no); + DPORT_STALL_OTHER_CPU_START(); + Cache_Flush_rom(cpu_no); + DPORT_STALL_OTHER_CPU_END(); +} + +/** + * @brief Disable Cache access for the cpu. + * Please do not call this function in your SDK application. + * + * @param int cpu_no : 0 for PRO cpu, 1 for APP cpu. + * + * @return None + */ +static inline void IRAM_ATTR Cache_Read_Disable(int cpu_no) +{ + extern void Cache_Read_Disable_rom(int cpu_no); + DPORT_STALL_OTHER_CPU_START(); + Cache_Read_Disable_rom(cpu_no); + DPORT_STALL_OTHER_CPU_END(); +} + +/** + * @brief Enable Cache access for the cpu. + * Please do not call this function in your SDK application. + * + * @param int cpu_no : 0 for PRO cpu, 1 for APP cpu. + * + * @return None + */ +static inline void IRAM_ATTR Cache_Read_Enable(int cpu_no) +{ + extern void Cache_Read_Enable_rom(int cpu_no); + DPORT_STALL_OTHER_CPU_START(); + Cache_Read_Enable_rom(cpu_no); + DPORT_STALL_OTHER_CPU_END(); +} + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* _ROM_CACHE_H_ */ diff --git a/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/crc.h b/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/crc.h new file mode 100644 index 0000000000000..faa1e8c351b31 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/crc.h @@ -0,0 +1,160 @@ +// 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. + +#ifndef ROM_CRC_H +#define ROM_CRC_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup uart_apis, uart configuration and communication related apis + * @brief uart apis + */ + +/** @addtogroup uart_apis + * @{ + */ + + +/* Notes about CRC APIs usage + * The ESP32 ROM include some CRC tables and CRC APIs to speed up CRC calculation. + * The CRC APIs include CRC8, CRC16, CRC32 algorithms for both little endian and big endian modes. + * Here are the polynomials for the algorithms: + * CRC-8 x8+x2+x1+1 0x07 + * CRC16-CCITT x16+x12+x5+1 0x1021 + * CRC32 x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x1+1 0x04c11db7 + * + * These group of CRC APIs are designed to calculate the data in buffers either continuous or not. + * To make it easy, we had added a `~` at the beginning and the end of the functions. + * To calculate non-continuous buffers, we can write the code like this: + * init = ~init; + * crc = crc32_le(init, buf0, length0); + * crc = crc32_le(crc, buf1, length1); + * crc = ~crc; + * + * However, it is not easy to select which API to use and give the correct parameters. + * A specific CRC algorithm will include this parameters: width, polynomials, init, refin, refout, xorout + * refin and refout show the endian of the algorithm: + * if both of them are true, please use the little endian API. + * if both of them are false, please use the big endian API. + * xorout is the value which you need to be xored to the raw result. + * However, these group of APIs need one '~' before and after the APIs. + * + * Here are some examples for CRC16: + * CRC-16/CCITT, poly = 0x1021, init = 0x0000, refin = true, refout = true, xorout = 0x0000 + * crc = ~crc16_le((uint16_t)~0x0000, buf, length); + * + * CRC-16/CCITT-FALSE, poly = 0x1021, init = 0xffff, refin = false, refout = false, xorout = 0x0000 + * crc = ~crc16_be((uint16_t)~0xffff, buf, length); + * + * CRC-16/X25, poly = 0x1021, init = 0xffff, refin = true, refout = true, xorout = 0xffff + * crc = (~crc16_le((uint16_t)~(0xffff), buf, length))^0xffff; + * + * CRC-16/XMODEM, poly= 0x1021, init = 0x0000, refin = false, refout = false, xorout = 0x0000 + * crc = ~crc16_be((uint16_t)~0x0000, buf, length); + * + * + */ + +/** + * @brief CRC32 value that is in little endian. + * + * @param uint32_t crc : init crc value, use 0 at the first use. + * + * @param uint8_t const *buf : buffer to start calculate crc. + * + * @param uint32_t len : buffer length in byte. + * + * @return None + */ +uint32_t crc32_le(uint32_t crc, uint8_t const *buf, uint32_t len); + +/** + * @brief CRC32 value that is in big endian. + * + * @param uint32_t crc : init crc value, use 0 at the first use. + * + * @param uint8_t const *buf : buffer to start calculate crc. + * + * @param uint32_t len : buffer length in byte. + * + * @return None + */ +uint32_t crc32_be(uint32_t crc, uint8_t const *buf, uint32_t len); + +/** + * @brief CRC16 value that is in little endian. + * + * @param uint16_t crc : init crc value, use 0 at the first use. + * + * @param uint8_t const *buf : buffer to start calculate crc. + * + * @param uint32_t len : buffer length in byte. + * + * @return None + */ +uint16_t crc16_le(uint16_t crc, uint8_t const *buf, uint32_t len); + +/** + * @brief CRC16 value that is in big endian. + * + * @param uint16_t crc : init crc value, use 0 at the first use. + * + * @param uint8_t const *buf : buffer to start calculate crc. + * + * @param uint32_t len : buffer length in byte. + * + * @return None + */ +uint16_t crc16_be(uint16_t crc, uint8_t const *buf, uint32_t len); + +/** + * @brief CRC8 value that is in little endian. + * + * @param uint8_t crc : init crc value, use 0 at the first use. + * + * @param uint8_t const *buf : buffer to start calculate crc. + * + * @param uint32_t len : buffer length in byte. + * + * @return None + */ +uint8_t crc8_le(uint8_t crc, uint8_t const *buf, uint32_t len); + +/** + * @brief CRC8 value that is in big endian. + * + * @param uint32_t crc : init crc value, use 0 at the first use. + * + * @param uint8_t const *buf : buffer to start calculate crc. + * + * @param uint32_t len : buffer length in byte. + * + * @return None + */ +uint8_t crc8_be(uint8_t crc, uint8_t const *buf, uint32_t len); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/efuse.h b/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/efuse.h new file mode 100644 index 0000000000000..337227ab0d47c --- /dev/null +++ b/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/efuse.h @@ -0,0 +1,117 @@ +// 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. + +#ifndef _ROM_EFUSE_H_ +#define _ROM_EFUSE_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup efuse_APIs efuse APIs + * @brief ESP32 efuse read/write APIs + * @attention + * + */ + +/** @addtogroup efuse_APIs + * @{ + */ + +/** + * @brief Do a efuse read operation, to update the efuse value to efuse read registers. + * + * @param null + * + * @return null + */ +void ets_efuse_read_op(void); + +/** + * @brief Do a efuse write operation, to update efuse write registers to efuse, then you need call ets_efuse_read_op again. + * + * @param null + * + * @return null + */ +void ets_efuse_program_op(void); + +/** + * @brief Read 8M Analog Clock value(8 bit) in efuse, the analog clock will not change with temperature. + * It can be used to test the external xtal frequency, do not touch this efuse field. + * + * @param null + * + * @return u32: 1 for 100KHZ, range is 0 to 255. + */ +uint32_t ets_efuse_get_8M_clock(void); + +/** + * @brief Read spi flash pin configuration from Efuse + * + * @return + * - 0 for default SPI pins. + * - 1 for default HSPI pins. + * - Other values define a custom pin configuration mask. Pins are encoded as per the EFUSE_SPICONFIG_RET_SPICLK, + * EFUSE_SPICONFIG_RET_SPIQ, EFUSE_SPICONFIG_RET_SPID, EFUSE_SPICONFIG_RET_SPICS0, EFUSE_SPICONFIG_RET_SPIHD macros. + * WP pin (for quad I/O modes) is not saved in efuse and not returned by this function. + */ +uint32_t ets_efuse_get_spiconfig(void); + +#define EFUSE_SPICONFIG_SPI_DEFAULTS 0 +#define EFUSE_SPICONFIG_HSPI_DEFAULTS 1 + +#define EFUSE_SPICONFIG_RET_SPICLK_MASK 0x3f +#define EFUSE_SPICONFIG_RET_SPICLK_SHIFT 0 +#define EFUSE_SPICONFIG_RET_SPICLK(ret) (((ret) >> EFUSE_SPICONFIG_RET_SPICLK_SHIFT) & EFUSE_SPICONFIG_RET_SPICLK_MASK) + +#define EFUSE_SPICONFIG_RET_SPIQ_MASK 0x3f +#define EFUSE_SPICONFIG_RET_SPIQ_SHIFT 6 +#define EFUSE_SPICONFIG_RET_SPIQ(ret) (((ret) >> EFUSE_SPICONFIG_RET_SPIQ_SHIFT) & EFUSE_SPICONFIG_RET_SPIQ_MASK) + +#define EFUSE_SPICONFIG_RET_SPID_MASK 0x3f +#define EFUSE_SPICONFIG_RET_SPID_SHIFT 12 +#define EFUSE_SPICONFIG_RET_SPID(ret) (((ret) >> EFUSE_SPICONFIG_RET_SPID_SHIFT) & EFUSE_SPICONFIG_RET_SPID_MASK) + +#define EFUSE_SPICONFIG_RET_SPICS0_MASK 0x3f +#define EFUSE_SPICONFIG_RET_SPICS0_SHIFT 18 +#define EFUSE_SPICONFIG_RET_SPICS0(ret) (((ret) >> EFUSE_SPICONFIG_RET_SPICS0_SHIFT) & EFUSE_SPICONFIG_RET_SPICS0_MASK) + + +#define EFUSE_SPICONFIG_RET_SPIHD_MASK 0x3f +#define EFUSE_SPICONFIG_RET_SPIHD_SHIFT 24 +#define EFUSE_SPICONFIG_RET_SPIHD(ret) (((ret) >> EFUSE_SPICONFIG_RET_SPIHD_SHIFT) & EFUSE_SPICONFIG_RET_SPIHD_MASK) + +/** + * @brief A crc8 algorithm used in efuse check. + * + * @param unsigned char const *p : Pointer to original data. + * + * @param unsigned int len : Data length in byte. + * + * @return unsigned char: Crc value. + */ +unsigned char esp_crc8(unsigned char const *p, unsigned int len); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* _ROM_EFUSE_H_ */ diff --git a/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/ets_sys.h b/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/ets_sys.h new file mode 100644 index 0000000000000..24c8242810bd3 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/ets_sys.h @@ -0,0 +1,655 @@ +// 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. + +#ifndef _ROM_ETS_SYS_H_ +#define _ROM_ETS_SYS_H_ + +#include +#include +#include + +#include + +#ifdef CONFIG_LEGACY_INCLUDE_COMMON_HEADERS +#include "soc/soc.h" +#endif + +#ifndef CONFIG_IDF_TARGET_ESP32 +#error "This header should only be included when building for ESP32" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup ets_sys_apis, ets system related apis + * @brief ets system apis + */ + +/** @addtogroup ets_sys_apis + * @{ + */ + +/************************************************************************ + * NOTE + * Many functions in this header files can't be run in FreeRTOS. + * Please see the comment of the Functions. + * There are also some functions that doesn't work on FreeRTOS + * without listed in the header, such as: + * xtos functions start with "_xtos_" in ld file. + * + *********************************************************************** + */ + +/** \defgroup ets_apis, Espressif Task Scheduler related apis + * @brief ets apis + */ + +/** @addtogroup ets_apis + * @{ + */ + +typedef enum { + ETS_OK = 0, /**< return successful in ets*/ + ETS_FAILED = 1 /**< return failed in ets*/ +} ETS_STATUS; + +typedef uint32_t ETSSignal; +typedef uint32_t ETSParam; + +typedef struct ETSEventTag ETSEvent; /**< Event transmit/receive in ets*/ + +struct ETSEventTag { + ETSSignal sig; /**< Event signal, in same task, different Event with different signal*/ + ETSParam par; /**< Event parameter, sometimes without usage, then will be set as 0*/ +}; + +typedef void (*ETSTask)(ETSEvent *e); /**< Type of the Task processer*/ +typedef void (* ets_idle_cb_t)(void *arg); /**< Type of the system idle callback*/ + +/** + * @brief Start the Espressif Task Scheduler, which is an infinit loop. Please do not add code after it. + * + * @param none + * + * @return none + */ +void ets_run(void); + +/** + * @brief Set the Idle callback, when Tasks are processed, will call the callback before CPU goto sleep. + * + * @param ets_idle_cb_t func : The callback function. + * + * @param void *arg : Argument of the callback. + * + * @return None + */ +void ets_set_idle_cb(ets_idle_cb_t func, void *arg); + +/** + * @brief Init a task with processer, priority, queue to receive Event, queue length. + * + * @param ETSTask task : The task processer. + * + * @param uint8_t prio : Task priority, 0-31, bigger num with high priority, one priority with one task. + * + * @param ETSEvent *queue : Queue belongs to the task, task always receives Events, Queue is circular used. + * + * @param uint8_t qlen : Queue length. + * + * @return None + */ +void ets_task(ETSTask task, uint8_t prio, ETSEvent *queue, uint8_t qlen); + +/** + * @brief Post an event to an Task. + * + * @param uint8_t prio : Priority of the Task. + * + * @param ETSSignal sig : Event signal. + * + * @param ETSParam par : Event parameter + * + * @return ETS_OK : post successful + * @return ETS_FAILED : post failed + */ +ETS_STATUS ets_post(uint8_t prio, ETSSignal sig, ETSParam par); + +/** + * @} + */ + +/** \defgroup ets_boot_apis, Boot routing related apis + * @brief ets boot apis + */ + +/** @addtogroup ets_apis + * @{ + */ + +extern const char *const exc_cause_table[40]; ///**< excption cause that defined by the core.*/ + +/** + * @brief Set Pro cpu Entry code, code can be called in PRO CPU when booting is not completed. + * When Pro CPU booting is completed, Pro CPU will call the Entry code if not NULL. + * + * @param uint32_t start : the PRO Entry code address value in uint32_t + * + * @return None + */ +void ets_set_user_start(uint32_t start); + +/** + * @brief Set Pro cpu Startup code, code can be called when booting is not completed, or in Entry code. + * When Entry code completed, CPU will call the Startup code if not NULL, else call ets_run. + * + * @param uint32_t callback : the Startup code address value in uint32_t + * + * @return None : post successful + */ +void ets_set_startup_callback(uint32_t callback); + +/** + * @brief Set App cpu Entry code, code can be called in PRO CPU. + * When APP booting is completed, APP CPU will call the Entry code if not NULL. + * + * @param uint32_t start : the APP Entry code address value in uint32_t, stored in register APPCPU_CTRL_REG_D. + * + * @return None + */ +void ets_set_appcpu_boot_addr(uint32_t start); + +/** + * @brief unpack the image in flash to iram and dram, no using cache. + * + * @param uint32_t pos : Flash physical address. + * + * @param uint32_t *entry_addr: the pointer of an variable that can store Entry code address. + * + * @param bool jump : Jump into the code in the function or not. + * + * @param bool config : Config the flash when unpacking the image, config should be done only once. + * + * @return ETS_OK : unpack successful + * @return ETS_FAILED : unpack failed + */ +ETS_STATUS ets_unpack_flash_code_legacy(uint32_t pos, uint32_t *entry_addr, bool jump, bool config); + +/** + * @brief unpack the image in flash to iram and dram, using cache, maybe decrypting. + * + * @param uint32_t pos : Flash physical address. + * + * @param uint32_t *entry_addr: the pointer of an variable that can store Entry code address. + * + * @param bool jump : Jump into the code in the function or not. + * + * @param bool sb_need_check : Do security boot check or not. + * + * @param bool config : Config the flash when unpacking the image, config should be done only once. + * + * @return ETS_OK : unpack successful + * @return ETS_FAILED : unpack failed + */ +ETS_STATUS ets_unpack_flash_code(uint32_t pos, uint32_t *entry_addr, bool jump, bool sb_need_check, bool config); + +/** + * @} + */ + +/** \defgroup ets_printf_apis, ets_printf related apis used in ets + * @brief ets printf apis + */ + +/** @addtogroup ets_printf_apis + * @{ + */ + +/** + * @brief Printf the strings to uart or other devices, similar with printf, simple than printf. + * Can not print float point data format, or longlong data format. + * So we maybe only use this in ROM. + * + * @param const char *fmt : See printf. + * + * @param ... : See printf. + * + * @return int : the length printed to the output device. + */ +int ets_printf(const char *fmt, ...); + +/** + * @brief Output a char to uart, which uart to output(which is in uart module in ROM) is not in scope of the function. + * Can not print float point data format, or longlong data format + * + * @param char c : char to output. + * + * @return None + */ +void ets_write_char_uart(char c); + +/** + * @brief Ets_printf have two output functions: putc1 and putc2, both of which will be called if need ouput. + * To install putc1, which is defaulted installed as ets_write_char_uart in none silent boot mode, as NULL in silent mode. + * + * @param void (*)(char) p: Output function to install. + * + * @return None + */ +void ets_install_putc1(void (*p)(char c)); + +/** + * @brief Ets_printf have two output functions: putc1 and putc2, both of which will be called if need ouput. + * To install putc2, which is defaulted installed as NULL. + * + * @param void (*)(char) p: Output function to install. + * + * @return None + */ +void ets_install_putc2(void (*p)(char c)); + +/** + * @brief Install putc1 as ets_write_char_uart. + * In silent boot mode(to void interfere the UART attached MCU), we can call this function, after booting ok. + * + * @param None + * + * @return None + */ +void ets_install_uart_printf(void); + +#define ETS_PRINTF(...) ets_printf(...) + +#define ETS_ASSERT(v) do { \ + if (!(v)) { \ + ets_printf("%s %u \n", __FILE__, __LINE__); \ + while (1) {}; \ + } \ +} while (0) + +/** + * @} + */ + +/** \defgroup ets_timer_apis, ets_timer related apis used in ets + * @brief ets timer apis + */ + +/** @addtogroup ets_timer_apis + * @{ + */ +typedef void ETSTimerFunc(void *timer_arg);/**< timer handler*/ + +typedef struct _ETSTIMER_ { + struct _ETSTIMER_ *timer_next; /**< timer linker*/ + uint32_t timer_expire; /**< abstruct time when timer expire*/ + uint32_t timer_period; /**< timer period, 0 means timer is not periodic repeated*/ + ETSTimerFunc *timer_func; /**< timer handler*/ + void *timer_arg; /**< timer handler argument*/ +} ETSTimer; + +/** + * @brief Init ets timer, this timer range is 640 us to 429496 ms + * In FreeRTOS, please call FreeRTOS apis, never call this api. + * + * @param None + * + * @return None + */ +void ets_timer_init(void); + +/** + * @brief In FreeRTOS, please call FreeRTOS apis, never call this api. + * + * @param None + * + * @return None + */ +void ets_timer_deinit(void); + +/** + * @brief Arm an ets timer, this timer range is 640 us to 429496 ms. + * In FreeRTOS, please call FreeRTOS apis, never call this api. + * + * @param ETSTimer *timer : Timer struct pointer. + * + * @param uint32_t tmout : Timer value in ms, range is 1 to 429496. + * + * @param bool repeat : Timer is periodic repeated. + * + * @return None + */ +void ets_timer_arm(ETSTimer *timer, uint32_t tmout, bool repeat); + +/** + * @brief Arm an ets timer, this timer range is 640 us to 429496 ms. + * In FreeRTOS, please call FreeRTOS apis, never call this api. + * + * @param ETSTimer *timer : Timer struct pointer. + * + * @param uint32_t tmout : Timer value in us, range is 1 to 429496729. + * + * @param bool repeat : Timer is periodic repeated. + * + * @return None + */ +void ets_timer_arm_us(ETSTimer *ptimer, uint32_t us, bool repeat); + +/** + * @brief Disarm an ets timer. + * In FreeRTOS, please call FreeRTOS apis, never call this api. + * + * @param ETSTimer *timer : Timer struct pointer. + * + * @return None + */ +void ets_timer_disarm(ETSTimer *timer); + +/** + * @brief Set timer callback and argument. + * In FreeRTOS, please call FreeRTOS apis, never call this api. + * + * @param ETSTimer *timer : Timer struct pointer. + * + * @param ETSTimerFunc *pfunction : Timer callback. + * + * @param void *parg : Timer callback argument. + * + * @return None + */ +void ets_timer_setfn(ETSTimer *ptimer, ETSTimerFunc *pfunction, void *parg); + +/** + * @brief Unset timer callback and argument to NULL. + * In FreeRTOS, please call FreeRTOS apis, never call this api. + * + * @param ETSTimer *timer : Timer struct pointer. + * + * @return None + */ +void ets_timer_done(ETSTimer *ptimer); + +/** + * @brief CPU do while loop for some time. + * In FreeRTOS task, please call FreeRTOS apis. + * + * @param uint32_t us : Delay time in us. + * + * @return None + */ +void ets_delay_us(uint32_t us); + +/** + * @brief Set the real CPU ticks per us to the ets, so that ets_delay_us will be accurate. + * Call this function when CPU frequency is changed. + * + * @param uint32_t ticks_per_us : CPU ticks per us. + * + * @return None + */ +void ets_update_cpu_frequency(uint32_t ticks_per_us); + +/** + * @brief Set the real CPU ticks per us to the ets, so that ets_delay_us will be accurate. + * + * @note This function only sets the tick rate for the current CPU. It is located in ROM, + * so the deep sleep stub can use it even if IRAM is not initialized yet. + * + * @param uint32_t ticks_per_us : CPU ticks per us. + * + * @return None + */ +void ets_update_cpu_frequency_rom(uint32_t ticks_per_us); + +/** + * @brief Get the real CPU ticks per us to the ets. + * This function do not return real CPU ticks per us, just the record in ets. It can be used to check with the real CPU frequency. + * + * @param None + * + * @return uint32_t : CPU ticks per us record in ets. + */ +uint32_t ets_get_cpu_frequency(void); + +/** + * @brief Get xtal_freq/analog_8M*256 value calibrated in rtc module. + * + * @param None + * + * @return uint32_t : xtal_freq/analog_8M*256. + */ +uint32_t ets_get_xtal_scale(void); + +/** + * @brief Get xtal_freq value, If value not stored in RTC_STORE5, than store. + * + * @param None + * + * @return uint32_t : if rtc store the value (RTC_STORE5 high 16 bits and low 16 bits with same value), read from rtc register. + * clock = (REG_READ(RTC_STORE5) & 0xffff) << 12; + * else if analog_8M in efuse + * clock = ets_get_xtal_scale() * 15625 * ets_efuse_get_8M_clock() / 40; + * else clock = 26M. + */ +uint32_t ets_get_detected_xtal_freq(void); + +/** + * @} + */ + +/** \defgroup ets_intr_apis, ets interrupt configure related apis + * @brief ets intr apis + */ + +/** @addtogroup ets_intr_apis + * @{ + */ + +typedef void (* ets_isr_t)(void *);/**< interrupt handler type*/ + +/** + * @brief Attach a interrupt handler to a CPU interrupt number. + * This function equals to _xtos_set_interrupt_handler_arg(i, func, arg). + * In FreeRTOS, please call FreeRTOS apis, never call this api. + * + * @param int i : CPU interrupt number. + * + * @param ets_isr_t func : Interrupt handler. + * + * @param void *arg : argument of the handler. + * + * @return None + */ +void ets_isr_attach(int i, ets_isr_t func, void *arg); + +/** + * @brief Mask the interrupts which show in mask bits. + * This function equals to _xtos_ints_off(mask). + * In FreeRTOS, please call FreeRTOS apis, never call this api. + * + * @param uint32_t mask : BIT(i) means mask CPU interrupt number i. + * + * @return None + */ +void ets_isr_mask(uint32_t mask); + +/** + * @brief Unmask the interrupts which show in mask bits. + * This function equals to _xtos_ints_on(mask). + * In FreeRTOS, please call FreeRTOS apis, never call this api. + * + * @param uint32_t mask : BIT(i) means mask CPU interrupt number i. + * + * @return None + */ +void ets_isr_unmask(uint32_t unmask); + +/** + * @brief Lock the interrupt to level 2. + * This function direct set the CPU registers. + * In FreeRTOS, please call FreeRTOS apis, never call this api. + * + * @param None + * + * @return None + */ +void ets_intr_lock(void); + +/** + * @brief Unlock the interrupt to level 0. + * This function direct set the CPU registers. + * In FreeRTOS, please call FreeRTOS apis, never call this api. + * + * @param None + * + * @return None + */ +void ets_intr_unlock(void); + +/** + * @brief Unlock the interrupt to level 0, and CPU will go into power save mode(wait interrupt). + * This function direct set the CPU registers. + * In FreeRTOS, please call FreeRTOS apis, never call this api. + * + * @param None + * + * @return None + */ +void ets_waiti0(void); + +/** + * @brief Attach an CPU interrupt to a hardware source. + * We have 4 steps to use an interrupt: + * 1.Attach hardware interrupt source to CPU. intr_matrix_set(0, ETS_WIFI_MAC_INTR_SOURCE, ETS_WMAC_INUM); + * 2.Set interrupt handler. xt_set_interrupt_handler(ETS_WMAC_INUM, func, NULL); + * 3.Enable interrupt for CPU. xt_ints_on(1 << ETS_WMAC_INUM); + * 4.Enable interrupt in the module. + * + * @param int cpu_no : The CPU which the interrupt number belongs. + * + * @param uint32_t model_num : The interrupt hardware source number, please see the interrupt hardware source table. + * + * @param uint32_t intr_num : The interrupt number CPU, please see the interrupt cpu using table. + * + * @return None + */ +void intr_matrix_set(int cpu_no, uint32_t model_num, uint32_t intr_num); + +#define _ETSTR(v) # v +#define _ETS_SET_INTLEVEL(intlevel) ({ unsigned __tmp; \ + __asm__ __volatile__( "rsil %0, " _ETSTR(intlevel) "\n" \ + : "=a" (__tmp) : : "memory" ); \ + }) + +#ifdef CONFIG_NONE_OS +#define ETS_INTR_LOCK() \ + ets_intr_lock() + +#define ETS_INTR_UNLOCK() \ + ets_intr_unlock() + +#define ETS_ISR_ATTACH \ + ets_isr_attach + +#define ETS_INTR_ENABLE(inum) \ + ets_isr_unmask((1< +#include + +#include "esp_attr.h" + +#include + +#ifdef CONFIG_LEGACY_INCLUDE_COMMON_HEADERS +#include "soc/gpio_reg.h" +#include "soc/gpio_pins.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup gpio_apis, uart configuration and communication related apis + * @brief gpio apis + */ + +/** @addtogroup gpio_apis + * @{ + */ + +#define GPIO_REG_READ(reg) READ_PERI_REG(reg) +#define GPIO_REG_WRITE(reg, val) WRITE_PERI_REG(reg, val) +#define GPIO_ID_PIN0 0 +#define GPIO_ID_PIN(n) (GPIO_ID_PIN0+(n)) +#define GPIO_PIN_ADDR(i) (GPIO_PIN0_REG + i*4) + +#define GPIO_FUNC_IN_HIGH 0x38 +#define GPIO_FUNC_IN_LOW 0x30 + +#define GPIO_ID_IS_PIN_REGISTER(reg_id) \ + ((reg_id >= GPIO_ID_PIN0) && (reg_id <= GPIO_ID_PIN(GPIO_PIN_COUNT-1))) + +#define GPIO_REGID_TO_PINIDX(reg_id) ((reg_id) - GPIO_ID_PIN0) + +typedef enum { + GPIO_PIN_INTR_DISABLE = 0, + GPIO_PIN_INTR_POSEDGE = 1, + GPIO_PIN_INTR_NEGEDGE = 2, + GPIO_PIN_INTR_ANYEDGE = 3, + GPIO_PIN_INTR_LOLEVEL = 4, + GPIO_PIN_INTR_HILEVEL = 5 +} GPIO_INT_TYPE; + +#define GPIO_OUTPUT_SET(gpio_no, bit_value) \ + ((gpio_no < 32) ? gpio_output_set(bit_value<>gpio_no)&BIT0) : ((gpio_input_get_high()>>(gpio_no - 32))&BIT0)) + +/* GPIO interrupt handler, registered through gpio_intr_handler_register */ +typedef void (* gpio_intr_handler_fn_t)(uint32_t intr_mask, bool high, void *arg); + +/** + * @brief Initialize GPIO. This includes reading the GPIO Configuration DataSet + * to initialize "output enables" and pin configurations for each gpio pin. + * Please do not call this function in SDK. + * + * @param None + * + * @return None + */ +void gpio_init(void); + +/** + * @brief Change GPIO(0-31) pin output by setting, clearing, or disabling pins, GPIO0<->BIT(0). + * There is no particular ordering guaranteed; so if the order of writes is significant, + * calling code should divide a single call into multiple calls. + * + * @param uint32_t set_mask : the gpios that need high level. + * + * @param uint32_t clear_mask : the gpios that need low level. + * + * @param uint32_t enable_mask : the gpios that need be changed. + * + * @param uint32_t disable_mask : the gpios that need diable output. + * + * @return None + */ +void gpio_output_set(uint32_t set_mask, uint32_t clear_mask, uint32_t enable_mask, uint32_t disable_mask); + +/** + * @brief Change GPIO(32-39) pin output by setting, clearing, or disabling pins, GPIO32<->BIT(0). + * There is no particular ordering guaranteed; so if the order of writes is significant, + * calling code should divide a single call into multiple calls. + * + * @param uint32_t set_mask : the gpios that need high level. + * + * @param uint32_t clear_mask : the gpios that need low level. + * + * @param uint32_t enable_mask : the gpios that need be changed. + * + * @param uint32_t disable_mask : the gpios that need diable output. + * + * @return None + */ +void gpio_output_set_high(uint32_t set_mask, uint32_t clear_mask, uint32_t enable_mask, uint32_t disable_mask); + +/** + * @brief Sample the value of GPIO input pins(0-31) and returns a bitmask. + * + * @param None + * + * @return uint32_t : bitmask for GPIO input pins, BIT(0) for GPIO0. + */ +uint32_t gpio_input_get(void); + +/** + * @brief Sample the value of GPIO input pins(32-39) and returns a bitmask. + * + * @param None + * + * @return uint32_t : bitmask for GPIO input pins, BIT(0) for GPIO32. + */ +uint32_t gpio_input_get_high(void); + +/** + * @brief Register an application-specific interrupt handler for GPIO pin interrupts. + * Once the interrupt handler is called, it will not be called again until after a call to gpio_intr_ack. + * Please do not call this function in SDK. + * + * @param gpio_intr_handler_fn_t fn : gpio application-specific interrupt handler + * + * @param void *arg : gpio application-specific interrupt handler argument. + * + * @return None + */ +void gpio_intr_handler_register(gpio_intr_handler_fn_t fn, void *arg); + +/** + * @brief Get gpio interrupts which happens but not processed. + * Please do not call this function in SDK. + * + * @param None + * + * @return uint32_t : bitmask for GPIO pending interrupts, BIT(0) for GPIO0. + */ +uint32_t gpio_intr_pending(void); + +/** + * @brief Get gpio interrupts which happens but not processed. + * Please do not call this function in SDK. + * + * @param None + * + * @return uint32_t : bitmask for GPIO pending interrupts, BIT(0) for GPIO32. + */ +uint32_t gpio_intr_pending_high(void); + +/** + * @brief Ack gpio interrupts to process pending interrupts. + * Please do not call this function in SDK. + * + * @param uint32_t ack_mask: bitmask for GPIO ack interrupts, BIT(0) for GPIO0. + * + * @return None + */ +void gpio_intr_ack(uint32_t ack_mask); + +/** + * @brief Ack gpio interrupts to process pending interrupts. + * Please do not call this function in SDK. + * + * @param uint32_t ack_mask: bitmask for GPIO ack interrupts, BIT(0) for GPIO32. + * + * @return None + */ +void gpio_intr_ack_high(uint32_t ack_mask); + +/** + * @brief Set GPIO to wakeup the ESP32. + * Please do not call this function in SDK. + * + * @param uint32_t i: gpio number. + * + * @param GPIO_INT_TYPE intr_state : only GPIO_PIN_INTR_LOLEVEL\GPIO_PIN_INTR_HILEVEL can be used + * + * @return None + */ +void gpio_pin_wakeup_enable(uint32_t i, GPIO_INT_TYPE intr_state); + +/** + * @brief disable GPIOs to wakeup the ESP32. + * Please do not call this function in SDK. + * + * @param None + * + * @return None + */ +void gpio_pin_wakeup_disable(void); + +/** + * @brief set gpio input to a signal, one gpio can input to several signals. + * + * @param uint32_t gpio : gpio number, 0~0x27 + * gpio == 0x30, input 0 to signal + * gpio == 0x34, ??? + * gpio == 0x38, input 1 to signal + * + * @param uint32_t signal_idx : signal index. + * + * @param bool inv : the signal is inv or not + * + * @return None + */ +void gpio_matrix_in(uint32_t gpio, uint32_t signal_idx, bool inv); + +/** + * @brief set signal output to gpio, one signal can output to several gpios. + * + * @param uint32_t gpio : gpio number, 0~0x27 + * + * @param uint32_t signal_idx : signal index. + * signal_idx == 0x100, cancel output put to the gpio + * + * @param bool out_inv : the signal output is inv or not + * + * @param bool oen_inv : the signal output enable is inv or not + * + * @return None + */ +void gpio_matrix_out(uint32_t gpio, uint32_t signal_idx, bool out_inv, bool oen_inv); + +/** + * @brief Select pad as a gpio function from IOMUX. + * + * @param uint32_t gpio_num : gpio number, 0~0x27 + * + * @return None + */ +void gpio_pad_select_gpio(uint8_t gpio_num); + +/** + * @brief Set pad driver capability. + * + * @param uint32_t gpio_num : gpio number, 0~0x27 + * + * @param uint8_t drv : 0-3 + * + * @return None + */ +void gpio_pad_set_drv(uint8_t gpio_num, uint8_t drv); + +/** + * @brief Pull up the pad from gpio number. + * + * @param uint32_t gpio_num : gpio number, 0~0x27 + * + * @return None + */ +void gpio_pad_pullup(uint8_t gpio_num); + +/** + * @brief Pull down the pad from gpio number. + * + * @param uint32_t gpio_num : gpio number, 0~0x27 + * + * @return None + */ +void gpio_pad_pulldown(uint8_t gpio_num); + +/** + * @brief Unhold the pad from gpio number. + * + * @param uint32_t gpio_num : gpio number, 0~0x27 + * + * @return None + */ +void gpio_pad_unhold(uint8_t gpio_num); + +/** + * @brief Hold the pad from gpio number. + * + * @param uint32_t gpio_num : gpio number, 0~0x27 + * + * @return None + */ +void gpio_pad_hold(uint8_t gpio_num); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* _ROM_GPIO_H_ */ diff --git a/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/libc_stubs.h b/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/libc_stubs.h new file mode 100644 index 0000000000000..47e75bcb33be3 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/libc_stubs.h @@ -0,0 +1,89 @@ +// 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. +#ifndef _ROM_LIBC_STUBS_H_ +#define _ROM_LIBC_STUBS_H_ + +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* +ESP32 ROM code contains implementations of some of C library functions. +Whenever a function in ROM needs to use a syscall, it calls a pointer to the corresponding syscall +implementation defined in the following struct. + +The table itself, by default, is not allocated in RAM. There are two pointers, `syscall_table_ptr_pro` and +`syscall_table_ptr_app`, which can be set to point to the locations of syscall tables of CPU 0 (aka PRO CPU) +and CPU 1 (aka APP CPU). Location of these pointers in .bss segment of ROM code is defined in linker script. + +So, before using any of the C library functions (except for pure functions and memcpy/memset functions), +application must allocate syscall table structure for each CPU being used, and populate it with pointers +to actual implementations of corresponding syscalls. +*/ + +struct syscall_stub_table +{ + struct _reent* (*__getreent)(void); + void* (*_malloc_r)(struct _reent *r, size_t); + void (*_free_r)(struct _reent *r, void*); + void* (*_realloc_r)(struct _reent *r, void*, size_t); + void* (*_calloc_r)(struct _reent *r, size_t, size_t); + void (*_abort)(void); + int (*_system_r)(struct _reent *r, const char*); + int (*_rename_r)(struct _reent *r, const char*, const char*); + clock_t (*_times_r)(struct _reent *r, struct tms *); + int (*_gettimeofday_r) (struct _reent *r, struct timeval *, void *); + void (*_raise_r)(struct _reent *r); /* function signature is incorrect in ROM */ + int (*_unlink_r)(struct _reent *r, const char*); + int (*_link_r)(struct _reent *r, const char*, const char*); + int (*_stat_r)(struct _reent *r, const char*, struct stat *); + int (*_fstat_r)(struct _reent *r, int, struct stat *); + void* (*_sbrk_r)(struct _reent *r, ptrdiff_t); + int (*_getpid_r)(struct _reent *r); + int (*_kill_r)(struct _reent *r, int, int); + void (*_exit_r)(struct _reent *r, int); + int (*_close_r)(struct _reent *r, int); + int (*_open_r)(struct _reent *r, const char *, int, int); + int (*_write_r)(struct _reent *r, int, const void *, int); + int (*_lseek_r)(struct _reent *r, int, int, int); + int (*_read_r)(struct _reent *r, int, void *, int); + void (*_lock_init)(_lock_t *lock); + void (*_lock_init_recursive)(_lock_t *lock); + void (*_lock_close)(_lock_t *lock); + void (*_lock_close_recursive)(_lock_t *lock); + void (*_lock_acquire)(_lock_t *lock); + void (*_lock_acquire_recursive)(_lock_t *lock); + int (*_lock_try_acquire)(_lock_t *lock); + int (*_lock_try_acquire_recursive)(_lock_t *lock); + void (*_lock_release)(_lock_t *lock); + void (*_lock_release_recursive)(_lock_t *lock); + int (*_printf_float)(struct _reent *data, void *pdata, FILE * fp, int (*pfunc) (struct _reent *, FILE *, const char *, size_t len), va_list * ap); + int (*_scanf_float) (struct _reent *rptr, void *pdata, FILE *fp, va_list *ap); +}; + +extern struct syscall_stub_table* syscall_table_ptr_pro; +extern struct syscall_stub_table* syscall_table_ptr_app; + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif /* _ROM_LIBC_STUBS_H_ */ diff --git a/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/lldesc.h b/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/lldesc.h new file mode 100644 index 0000000000000..ae5b4160ba1de --- /dev/null +++ b/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/lldesc.h @@ -0,0 +1,176 @@ +// 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. + +#ifndef _ROM_LLDESC_H_ +#define _ROM_LLDESC_H_ + +#include + +#include "sys/queue.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define LLDESC_TX_MBLK_SIZE 268 /* */ +#define LLDESC_RX_SMBLK_SIZE 64 /* small block size, for small mgmt frame */ +#define LLDESC_RX_MBLK_SIZE 524 /* rx is large sinec we want to contain mgmt frame in one block*/ +#define LLDESC_RX_AMPDU_ENTRY_MBLK_SIZE 64 /* it is a small buffer which is a cycle link*/ +#define LLDESC_RX_AMPDU_LEN_MBLK_SIZE 256 /*for ampdu entry*/ +#ifdef ESP_MAC_5 +#define LLDESC_TX_MBLK_NUM 116 /* 64K / 256 */ +#define LLDESC_RX_MBLK_NUM 82 /* 64K / 512 MAX 172*/ +#define LLDESC_RX_AMPDU_ENTRY_MBLK_NUM 4 +#define LLDESC_RX_AMPDU_LEN_MLBK_NUM 12 +#else +#ifdef SBUF_RXTX +#define LLDESC_TX_MBLK_NUM_MAX (2 * 48) /* 23K / 260 - 8 */ +#define LLDESC_RX_MBLK_NUM_MAX (2 * 48) /* 23K / 524 */ +#define LLDESC_TX_MBLK_NUM_MIN (2 * 16) /* 23K / 260 - 8 */ +#define LLDESC_RX_MBLK_NUM_MIN (2 * 16) /* 23K / 524 */ +#endif +#define LLDESC_TX_MBLK_NUM 10 //(2 * 32) /* 23K / 260 - 8 */ + +#ifdef IEEE80211_RX_AMPDU +#define LLDESC_RX_MBLK_NUM 30 +#else +#define LLDESC_RX_MBLK_NUM 10 +#endif /*IEEE80211_RX_AMPDU*/ + +#define LLDESC_RX_AMPDU_ENTRY_MBLK_NUM 4 +#define LLDESC_RX_AMPDU_LEN_MLBK_NUM 8 +#endif /* !ESP_MAC_5 */ +/* + * SLC2 DMA Desc struct, aka lldesc_t + * + * -------------------------------------------------------------- + * | own | EoF | sub_sof | 5'b0 | length [11:0] | size [11:0] | + * -------------------------------------------------------------- + * | buf_ptr [31:0] | + * -------------------------------------------------------------- + * | next_desc_ptr [31:0] | + * -------------------------------------------------------------- + */ + +/* this bitfield is start from the LSB!!! */ +typedef struct lldesc_s { + volatile uint32_t size :12, + length:12, + offset: 5, /* h/w reserved 5bit, s/w use it as offset in buffer */ + sosf : 1, /* start of sub-frame */ + eof : 1, /* end of frame */ + owner : 1; /* hw or sw */ + volatile uint8_t *buf; /* point to buffer data */ + union{ + volatile uint32_t empty; + STAILQ_ENTRY(lldesc_s) qe; /* pointing to the next desc */ + }; +} lldesc_t; + +typedef struct tx_ampdu_entry_s{ + uint32_t sub_len :12, + dili_num : 7, + : 1, + null_byte: 2, + data : 1, + enc : 1, + seq : 8; +} tx_ampdu_entry_t; + +typedef struct lldesc_chain_s { + lldesc_t *head; + lldesc_t *tail; +} lldesc_chain_t; + +#ifdef SBUF_RXTX +enum sbuf_mask_s { + SBUF_MOVE_NO = 0, + SBUF_MOVE_TX2RX, + SBUF_MOVE_RX2TX, +} ; + +#define SBUF_MOVE_STEP 8 +#endif +#define LLDESC_SIZE sizeof(struct lldesc_s) + +/* SLC Descriptor */ +#define LLDESC_OWNER_MASK 0x80000000 +#define LLDESC_OWNER_SHIFT 31 +#define LLDESC_SW_OWNED 0 +#define LLDESC_HW_OWNED 1 + +#define LLDESC_EOF_MASK 0x40000000 +#define LLDESC_EOF_SHIFT 30 + +#define LLDESC_SOSF_MASK 0x20000000 +#define LLDESC_SOSF_SHIFT 29 + +#define LLDESC_LENGTH_MASK 0x00fff000 +#define LLDESC_LENGTH_SHIFT 12 + +#define LLDESC_SIZE_MASK 0x00000fff +#define LLDESC_SIZE_SHIFT 0 + +#define LLDESC_ADDR_MASK 0x000fffff + +void lldesc_build_chain(uint8_t *descptr, uint32_t desclen, uint8_t * mblkptr, uint32_t buflen, uint32_t blksz, uint8_t owner, + lldesc_t **head, +#ifdef TO_HOST_RESTART + lldesc_t ** one_before_tail, +#endif + lldesc_t **tail); + +lldesc_t *lldesc_num2link(lldesc_t * head, uint16_t nblks); + +lldesc_t *lldesc_set_owner(lldesc_t * head, uint16_t nblks, uint8_t owner); + +static inline uint32_t lldesc_get_chain_length(lldesc_t *head) +{ + lldesc_t *ds = head; + uint32_t len = 0; + + while (ds) { + len += ds->length; + ds = STAILQ_NEXT(ds, qe); + } + + return len; +} + +static inline void lldesc_config(lldesc_t *ds, uint8_t owner, uint8_t eof, uint8_t sosf, uint16_t len) +{ + ds->owner = owner; + ds->eof = eof; + ds->sosf = sosf; + ds->length = len; +} + +#define LLDESC_CONFIG(_desc, _owner, _eof, _sosf, _len) do { \ + (_desc)->owner = (_owner); \ + (_desc)->eof = (_eof); \ + (_desc)->sosf = (_sosf); \ + (_desc)->length = (_len); \ +} while(0) + +#define LLDESC_FROM_HOST_CLEANUP(ds) LLDESC_CONFIG((ds), LLDESC_HW_OWNED, 0, 0, 0) + +#define LLDESC_MAC_RX_CLEANUP(ds) LLDESC_CONFIG((ds), LLDESC_HW_OWNED, 0, 0, (ds)->size) + +#define LLDESC_TO_HOST_CLEANUP(ds) LLDESC_CONFIG((ds), LLDESC_HW_OWNED, 0, 0, 0) + +#ifdef __cplusplus +} +#endif + +#endif /* _ROM_LLDESC_H_ */ diff --git a/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/md5_hash.h b/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/md5_hash.h new file mode 100644 index 0000000000000..f116f1e670f42 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/md5_hash.h @@ -0,0 +1,38 @@ +/* + * MD5 internal definitions + * 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. + */ + +#ifndef _ROM_MD5_HASH_H_ +#define _ROM_MD5_HASH_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct MD5Context { + uint32_t buf[4]; + uint32_t bits[2]; + uint8_t in[64]; +}; + +void MD5Init(struct MD5Context *context); +void MD5Update(struct MD5Context *context, unsigned char const *buf, unsigned len); +void MD5Final(unsigned char digest[16], struct MD5Context *context); + +#ifdef __cplusplus +} +#endif + +#endif /* _ROM_MD5_HASH_H_ */ diff --git a/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/miniz.h b/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/miniz.h new file mode 100644 index 0000000000000..773a0d057018a --- /dev/null +++ b/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/miniz.h @@ -0,0 +1,792 @@ +#ifndef MINIZ_HEADER_INCLUDED +#define MINIZ_HEADER_INCLUDED + +#include + +// Defines to completely disable specific portions of miniz.c: +// If all macros here are defined the only functionality remaining will be CRC-32, adler-32, tinfl, and tdefl. + +// Define MINIZ_NO_STDIO to disable all usage and any functions which rely on stdio for file I/O. +#define MINIZ_NO_STDIO + +// If MINIZ_NO_TIME is specified then the ZIP archive functions will not be able to get the current time, or +// get/set file times, and the C run-time funcs that get/set times won't be called. +// The current downside is the times written to your archives will be from 1979. +#define MINIZ_NO_TIME + +// Define MINIZ_NO_ARCHIVE_APIS to disable all ZIP archive API's. +#define MINIZ_NO_ARCHIVE_APIS + +// Define MINIZ_NO_ARCHIVE_APIS to disable all writing related ZIP archive API's. +#define MINIZ_NO_ARCHIVE_WRITING_APIS + +// Define MINIZ_NO_ZLIB_APIS to remove all ZLIB-style compression/decompression API's. +#define MINIZ_NO_ZLIB_APIS + +// Define MINIZ_NO_ZLIB_COMPATIBLE_NAME to disable zlib names, to prevent conflicts against stock zlib. +#define MINIZ_NO_ZLIB_COMPATIBLE_NAMES + +// Define MINIZ_NO_MALLOC to disable all calls to malloc, free, and realloc. +// Note if MINIZ_NO_MALLOC is defined then the user must always provide custom user alloc/free/realloc +// callbacks to the zlib and archive API's, and a few stand-alone helper API's which don't provide custom user +// functions (such as tdefl_compress_mem_to_heap() and tinfl_decompress_mem_to_heap()) won't work. +#define MINIZ_NO_MALLOC + +#if defined(__TINYC__) && (defined(__linux) || defined(__linux__)) + // TODO: Work around "error: include file 'sys\utime.h' when compiling with tcc on Linux + #define MINIZ_NO_TIME +#endif + +#if !defined(MINIZ_NO_TIME) && !defined(MINIZ_NO_ARCHIVE_APIS) + #include +#endif + +//Hardcoded options for Xtensa - JD +#define MINIZ_X86_OR_X64_CPU 0 +#define MINIZ_LITTLE_ENDIAN 1 +#define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 0 +#define MINIZ_HAS_64BIT_REGISTERS 0 +#define TINFL_USE_64BIT_BITBUF 0 + + +#if defined(_M_IX86) || defined(_M_X64) || defined(__i386__) || defined(__i386) || defined(__i486__) || defined(__i486) || defined(i386) || defined(__ia64__) || defined(__x86_64__) +// MINIZ_X86_OR_X64_CPU is only used to help set the below macros. +#define MINIZ_X86_OR_X64_CPU 1 +#endif + +#if (__BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__) || MINIZ_X86_OR_X64_CPU +// Set MINIZ_LITTLE_ENDIAN to 1 if the processor is little endian. +#define MINIZ_LITTLE_ENDIAN 1 +#endif + +#if MINIZ_X86_OR_X64_CPU +// Set MINIZ_USE_UNALIGNED_LOADS_AND_STORES to 1 on CPU's that permit efficient integer loads and stores from unaligned addresses. +#define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1 +#endif + +#if defined(_M_X64) || defined(_WIN64) || defined(__MINGW64__) || defined(_LP64) || defined(__LP64__) || defined(__ia64__) || defined(__x86_64__) +// Set MINIZ_HAS_64BIT_REGISTERS to 1 if operations on 64-bit integers are reasonably fast (and don't involve compiler generated calls to helper functions). +#define MINIZ_HAS_64BIT_REGISTERS 1 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +// ------------------- zlib-style API Definitions. + +// For more compatibility with zlib, miniz.c uses unsigned long for some parameters/struct members. Beware: mz_ulong can be either 32 or 64-bits! +typedef unsigned long mz_ulong; + +// mz_free() internally uses the MZ_FREE() macro (which by default calls free() unless you've modified the MZ_MALLOC macro) to release a block allocated from the heap. +void mz_free(void *p); + +#define MZ_ADLER32_INIT (1) +// mz_adler32() returns the initial adler-32 value to use when called with ptr==NULL. +mz_ulong mz_adler32(mz_ulong adler, const unsigned char *ptr, size_t buf_len); + +#define MZ_CRC32_INIT (0) +// mz_crc32() returns the initial CRC-32 value to use when called with ptr==NULL. +mz_ulong mz_crc32(mz_ulong crc, const unsigned char *ptr, size_t buf_len); + +// Compression strategies. +enum { MZ_DEFAULT_STRATEGY = 0, MZ_FILTERED = 1, MZ_HUFFMAN_ONLY = 2, MZ_RLE = 3, MZ_FIXED = 4 }; + +// Method +#define MZ_DEFLATED 8 + +#ifndef MINIZ_NO_ZLIB_APIS + +// Heap allocation callbacks. +// Note that mz_alloc_func parameter types purpsosely differ from zlib's: items/size is size_t, not unsigned long. +typedef void *(*mz_alloc_func)(void *opaque, size_t items, size_t size); +typedef void (*mz_free_func)(void *opaque, void *address); +typedef void *(*mz_realloc_func)(void *opaque, void *address, size_t items, size_t size); + +#define MZ_VERSION "9.1.15" +#define MZ_VERNUM 0x91F0 +#define MZ_VER_MAJOR 9 +#define MZ_VER_MINOR 1 +#define MZ_VER_REVISION 15 +#define MZ_VER_SUBREVISION 0 + +// Flush values. For typical usage you only need MZ_NO_FLUSH and MZ_FINISH. The other values are for advanced use (refer to the zlib docs). +enum { MZ_NO_FLUSH = 0, MZ_PARTIAL_FLUSH = 1, MZ_SYNC_FLUSH = 2, MZ_FULL_FLUSH = 3, MZ_FINISH = 4, MZ_BLOCK = 5 }; + +// Return status codes. MZ_PARAM_ERROR is non-standard. +enum { MZ_OK = 0, MZ_STREAM_END = 1, MZ_NEED_DICT = 2, MZ_ERRNO = -1, MZ_STREAM_ERROR = -2, MZ_DATA_ERROR = -3, MZ_MEM_ERROR = -4, MZ_BUF_ERROR = -5, MZ_VERSION_ERROR = -6, MZ_PARAM_ERROR = -10000 }; + +// Compression levels: 0-9 are the standard zlib-style levels, 10 is best possible compression (not zlib compatible, and may be very slow), MZ_DEFAULT_COMPRESSION=MZ_DEFAULT_LEVEL. +enum { MZ_NO_COMPRESSION = 0, MZ_BEST_SPEED = 1, MZ_BEST_COMPRESSION = 9, MZ_UBER_COMPRESSION = 10, MZ_DEFAULT_LEVEL = 6, MZ_DEFAULT_COMPRESSION = -1 }; + +// Window bits +#define MZ_DEFAULT_WINDOW_BITS 15 + +struct mz_internal_state; + +// Compression/decompression stream struct. +typedef struct mz_stream_s +{ + const unsigned char *next_in; // pointer to next byte to read + unsigned int avail_in; // number of bytes available at next_in + mz_ulong total_in; // total number of bytes consumed so far + + unsigned char *next_out; // pointer to next byte to write + unsigned int avail_out; // number of bytes that can be written to next_out + mz_ulong total_out; // total number of bytes produced so far + + char *msg; // error msg (unused) + struct mz_internal_state *state; // internal state, allocated by zalloc/zfree + + mz_alloc_func zalloc; // optional heap allocation function (defaults to malloc) + mz_free_func zfree; // optional heap free function (defaults to free) + void *opaque; // heap alloc function user pointer + + int data_type; // data_type (unused) + mz_ulong adler; // adler32 of the source or uncompressed data + mz_ulong reserved; // not used +} mz_stream; + +typedef mz_stream *mz_streamp; + +// Returns the version string of miniz.c. +const char *mz_version(void); + +// mz_deflateInit() initializes a compressor with default options: +// Parameters: +// pStream must point to an initialized mz_stream struct. +// level must be between [MZ_NO_COMPRESSION, MZ_BEST_COMPRESSION]. +// level 1 enables a specially optimized compression function that's been optimized purely for performance, not ratio. +// (This special func. is currently only enabled when MINIZ_USE_UNALIGNED_LOADS_AND_STORES and MINIZ_LITTLE_ENDIAN are defined.) +// Return values: +// MZ_OK on success. +// MZ_STREAM_ERROR if the stream is bogus. +// MZ_PARAM_ERROR if the input parameters are bogus. +// MZ_MEM_ERROR on out of memory. +int mz_deflateInit(mz_streamp pStream, int level); + +// mz_deflateInit2() is like mz_deflate(), except with more control: +// Additional parameters: +// method must be MZ_DEFLATED +// window_bits must be MZ_DEFAULT_WINDOW_BITS (to wrap the deflate stream with zlib header/adler-32 footer) or -MZ_DEFAULT_WINDOW_BITS (raw deflate/no header or footer) +// mem_level must be between [1, 9] (it's checked but ignored by miniz.c) +int mz_deflateInit2(mz_streamp pStream, int level, int method, int window_bits, int mem_level, int strategy); + +// Quickly resets a compressor without having to reallocate anything. Same as calling mz_deflateEnd() followed by mz_deflateInit()/mz_deflateInit2(). +int mz_deflateReset(mz_streamp pStream); + +// mz_deflate() compresses the input to output, consuming as much of the input and producing as much output as possible. +// Parameters: +// pStream is the stream to read from and write to. You must initialize/update the next_in, avail_in, next_out, and avail_out members. +// flush may be MZ_NO_FLUSH, MZ_PARTIAL_FLUSH/MZ_SYNC_FLUSH, MZ_FULL_FLUSH, or MZ_FINISH. +// Return values: +// MZ_OK on success (when flushing, or if more input is needed but not available, and/or there's more output to be written but the output buffer is full). +// MZ_STREAM_END if all input has been consumed and all output bytes have been written. Don't call mz_deflate() on the stream anymore. +// MZ_STREAM_ERROR if the stream is bogus. +// MZ_PARAM_ERROR if one of the parameters is invalid. +// MZ_BUF_ERROR if no forward progress is possible because the input and/or output buffers are empty. (Fill up the input buffer or free up some output space and try again.) +int mz_deflate(mz_streamp pStream, int flush); + +// mz_deflateEnd() deinitializes a compressor: +// Return values: +// MZ_OK on success. +// MZ_STREAM_ERROR if the stream is bogus. +int mz_deflateEnd(mz_streamp pStream); + +// mz_deflateBound() returns a (very) conservative upper bound on the amount of data that could be generated by deflate(), assuming flush is set to only MZ_NO_FLUSH or MZ_FINISH. +mz_ulong mz_deflateBound(mz_streamp pStream, mz_ulong source_len); + +// Single-call compression functions mz_compress() and mz_compress2(): +// Returns MZ_OK on success, or one of the error codes from mz_deflate() on failure. +int mz_compress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len); +int mz_compress2(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len, int level); + +// mz_compressBound() returns a (very) conservative upper bound on the amount of data that could be generated by calling mz_compress(). +mz_ulong mz_compressBound(mz_ulong source_len); + +// Initializes a decompressor. +int mz_inflateInit(mz_streamp pStream); + +// mz_inflateInit2() is like mz_inflateInit() with an additional option that controls the window size and whether or not the stream has been wrapped with a zlib header/footer: +// window_bits must be MZ_DEFAULT_WINDOW_BITS (to parse zlib header/footer) or -MZ_DEFAULT_WINDOW_BITS (raw deflate). +int mz_inflateInit2(mz_streamp pStream, int window_bits); + +// Decompresses the input stream to the output, consuming only as much of the input as needed, and writing as much to the output as possible. +// Parameters: +// pStream is the stream to read from and write to. You must initialize/update the next_in, avail_in, next_out, and avail_out members. +// flush may be MZ_NO_FLUSH, MZ_SYNC_FLUSH, or MZ_FINISH. +// On the first call, if flush is MZ_FINISH it's assumed the input and output buffers are both sized large enough to decompress the entire stream in a single call (this is slightly faster). +// MZ_FINISH implies that there are no more source bytes available beside what's already in the input buffer, and that the output buffer is large enough to hold the rest of the decompressed data. +// Return values: +// MZ_OK on success. Either more input is needed but not available, and/or there's more output to be written but the output buffer is full. +// MZ_STREAM_END if all needed input has been consumed and all output bytes have been written. For zlib streams, the adler-32 of the decompressed data has also been verified. +// MZ_STREAM_ERROR if the stream is bogus. +// MZ_DATA_ERROR if the deflate stream is invalid. +// MZ_PARAM_ERROR if one of the parameters is invalid. +// MZ_BUF_ERROR if no forward progress is possible because the input buffer is empty but the inflater needs more input to continue, or if the output buffer is not large enough. Call mz_inflate() again +// with more input data, or with more room in the output buffer (except when using single call decompression, described above). +int mz_inflate(mz_streamp pStream, int flush); + +// Deinitializes a decompressor. +int mz_inflateEnd(mz_streamp pStream); + +// Single-call decompression. +// Returns MZ_OK on success, or one of the error codes from mz_inflate() on failure. +int mz_uncompress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len); + +// Returns a string description of the specified error code, or NULL if the error code is invalid. +const char *mz_error(int err); + +// Redefine zlib-compatible names to miniz equivalents, so miniz.c can be used as a drop-in replacement for the subset of zlib that miniz.c supports. +// Define MINIZ_NO_ZLIB_COMPATIBLE_NAMES to disable zlib-compatibility if you use zlib in the same project. +#ifndef MINIZ_NO_ZLIB_COMPATIBLE_NAMES + typedef unsigned char Byte; + typedef unsigned int uInt; + typedef mz_ulong uLong; + typedef Byte Bytef; + typedef uInt uIntf; + typedef char charf; + typedef int intf; + typedef void *voidpf; + typedef uLong uLongf; + typedef void *voidp; + typedef void *const voidpc; + #define Z_NULL 0 + #define Z_NO_FLUSH MZ_NO_FLUSH + #define Z_PARTIAL_FLUSH MZ_PARTIAL_FLUSH + #define Z_SYNC_FLUSH MZ_SYNC_FLUSH + #define Z_FULL_FLUSH MZ_FULL_FLUSH + #define Z_FINISH MZ_FINISH + #define Z_BLOCK MZ_BLOCK + #define Z_OK MZ_OK + #define Z_STREAM_END MZ_STREAM_END + #define Z_NEED_DICT MZ_NEED_DICT + #define Z_ERRNO MZ_ERRNO + #define Z_STREAM_ERROR MZ_STREAM_ERROR + #define Z_DATA_ERROR MZ_DATA_ERROR + #define Z_MEM_ERROR MZ_MEM_ERROR + #define Z_BUF_ERROR MZ_BUF_ERROR + #define Z_VERSION_ERROR MZ_VERSION_ERROR + #define Z_PARAM_ERROR MZ_PARAM_ERROR + #define Z_NO_COMPRESSION MZ_NO_COMPRESSION + #define Z_BEST_SPEED MZ_BEST_SPEED + #define Z_BEST_COMPRESSION MZ_BEST_COMPRESSION + #define Z_DEFAULT_COMPRESSION MZ_DEFAULT_COMPRESSION + #define Z_DEFAULT_STRATEGY MZ_DEFAULT_STRATEGY + #define Z_FILTERED MZ_FILTERED + #define Z_HUFFMAN_ONLY MZ_HUFFMAN_ONLY + #define Z_RLE MZ_RLE + #define Z_FIXED MZ_FIXED + #define Z_DEFLATED MZ_DEFLATED + #define Z_DEFAULT_WINDOW_BITS MZ_DEFAULT_WINDOW_BITS + #define alloc_func mz_alloc_func + #define free_func mz_free_func + #define internal_state mz_internal_state + #define z_stream mz_stream + #define deflateInit mz_deflateInit + #define deflateInit2 mz_deflateInit2 + #define deflateReset mz_deflateReset + #define deflate mz_deflate + #define deflateEnd mz_deflateEnd + #define deflateBound mz_deflateBound + #define compress mz_compress + #define compress2 mz_compress2 + #define compressBound mz_compressBound + #define inflateInit mz_inflateInit + #define inflateInit2 mz_inflateInit2 + #define inflate mz_inflate + #define inflateEnd mz_inflateEnd + #define uncompress mz_uncompress + #define crc32 mz_crc32 + #define adler32 mz_adler32 + #define MAX_WBITS 15 + #define MAX_MEM_LEVEL 9 + #define zError mz_error + #define ZLIB_VERSION MZ_VERSION + #define ZLIB_VERNUM MZ_VERNUM + #define ZLIB_VER_MAJOR MZ_VER_MAJOR + #define ZLIB_VER_MINOR MZ_VER_MINOR + #define ZLIB_VER_REVISION MZ_VER_REVISION + #define ZLIB_VER_SUBREVISION MZ_VER_SUBREVISION + #define zlibVersion mz_version + #define zlib_version mz_version() +#endif // #ifndef MINIZ_NO_ZLIB_COMPATIBLE_NAMES + +#endif // MINIZ_NO_ZLIB_APIS + +// ------------------- Types and macros + +typedef unsigned char mz_uint8; +typedef signed short mz_int16; +typedef unsigned short mz_uint16; +typedef unsigned int mz_uint32; +typedef unsigned int mz_uint; +typedef long long mz_int64; +typedef unsigned long long mz_uint64; +typedef int mz_bool; + +#define MZ_FALSE (0) +#define MZ_TRUE (1) + +// An attempt to work around MSVC's spammy "warning C4127: conditional expression is constant" message. +#ifdef _MSC_VER + #define MZ_MACRO_END while (0, 0) +#else + #define MZ_MACRO_END while (0) +#endif + +// ------------------- ZIP archive reading/writing + +#ifndef MINIZ_NO_ARCHIVE_APIS + +enum +{ + MZ_ZIP_MAX_IO_BUF_SIZE = 64*1024, + MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE = 260, + MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE = 256 +}; + +typedef struct +{ + mz_uint32 m_file_index; + mz_uint32 m_central_dir_ofs; + mz_uint16 m_version_made_by; + mz_uint16 m_version_needed; + mz_uint16 m_bit_flag; + mz_uint16 m_method; +#ifndef MINIZ_NO_TIME + time_t m_time; +#endif + mz_uint32 m_crc32; + mz_uint64 m_comp_size; + mz_uint64 m_uncomp_size; + mz_uint16 m_internal_attr; + mz_uint32 m_external_attr; + mz_uint64 m_local_header_ofs; + mz_uint32 m_comment_size; + char m_filename[MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE]; + char m_comment[MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE]; +} mz_zip_archive_file_stat; + +typedef size_t (*mz_file_read_func)(void *pOpaque, mz_uint64 file_ofs, void *pBuf, size_t n); +typedef size_t (*mz_file_write_func)(void *pOpaque, mz_uint64 file_ofs, const void *pBuf, size_t n); + +struct mz_zip_internal_state_tag; +typedef struct mz_zip_internal_state_tag mz_zip_internal_state; + +typedef enum +{ + MZ_ZIP_MODE_INVALID = 0, + MZ_ZIP_MODE_READING = 1, + MZ_ZIP_MODE_WRITING = 2, + MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED = 3 +} mz_zip_mode; + +typedef struct mz_zip_archive_tag +{ + mz_uint64 m_archive_size; + mz_uint64 m_central_directory_file_ofs; + mz_uint m_total_files; + mz_zip_mode m_zip_mode; + + mz_uint m_file_offset_alignment; + + mz_alloc_func m_pAlloc; + mz_free_func m_pFree; + mz_realloc_func m_pRealloc; + void *m_pAlloc_opaque; + + mz_file_read_func m_pRead; + mz_file_write_func m_pWrite; + void *m_pIO_opaque; + + mz_zip_internal_state *m_pState; + +} mz_zip_archive; + +typedef enum +{ + MZ_ZIP_FLAG_CASE_SENSITIVE = 0x0100, + MZ_ZIP_FLAG_IGNORE_PATH = 0x0200, + MZ_ZIP_FLAG_COMPRESSED_DATA = 0x0400, + MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY = 0x0800 +} mz_zip_flags; + +// ZIP archive reading + +// Inits a ZIP archive reader. +// These functions read and validate the archive's central directory. +mz_bool mz_zip_reader_init(mz_zip_archive *pZip, mz_uint64 size, mz_uint32 flags); +mz_bool mz_zip_reader_init_mem(mz_zip_archive *pZip, const void *pMem, size_t size, mz_uint32 flags); + +#ifndef MINIZ_NO_STDIO +mz_bool mz_zip_reader_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint32 flags); +#endif + +// Returns the total number of files in the archive. +mz_uint mz_zip_reader_get_num_files(mz_zip_archive *pZip); + +// Returns detailed information about an archive file entry. +mz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index, mz_zip_archive_file_stat *pStat); + +// Determines if an archive file entry is a directory entry. +mz_bool mz_zip_reader_is_file_a_directory(mz_zip_archive *pZip, mz_uint file_index); +mz_bool mz_zip_reader_is_file_encrypted(mz_zip_archive *pZip, mz_uint file_index); + +// Retrieves the filename of an archive file entry. +// Returns the number of bytes written to pFilename, or if filename_buf_size is 0 this function returns the number of bytes needed to fully store the filename. +mz_uint mz_zip_reader_get_filename(mz_zip_archive *pZip, mz_uint file_index, char *pFilename, mz_uint filename_buf_size); + +// Attempts to locates a file in the archive's central directory. +// Valid flags: MZ_ZIP_FLAG_CASE_SENSITIVE, MZ_ZIP_FLAG_IGNORE_PATH +// Returns -1 if the file cannot be found. +int mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName, const char *pComment, mz_uint flags); + +// Extracts a archive file to a memory buffer using no memory allocation. +mz_bool mz_zip_reader_extract_to_mem_no_alloc(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size); +mz_bool mz_zip_reader_extract_file_to_mem_no_alloc(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size); + +// Extracts a archive file to a memory buffer. +mz_bool mz_zip_reader_extract_to_mem(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags); +mz_bool mz_zip_reader_extract_file_to_mem(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags); + +// Extracts a archive file to a dynamically allocated heap buffer. +void *mz_zip_reader_extract_to_heap(mz_zip_archive *pZip, mz_uint file_index, size_t *pSize, mz_uint flags); +void *mz_zip_reader_extract_file_to_heap(mz_zip_archive *pZip, const char *pFilename, size_t *pSize, mz_uint flags); + +// Extracts a archive file using a callback function to output the file's data. +mz_bool mz_zip_reader_extract_to_callback(mz_zip_archive *pZip, mz_uint file_index, mz_file_write_func pCallback, void *pOpaque, mz_uint flags); +mz_bool mz_zip_reader_extract_file_to_callback(mz_zip_archive *pZip, const char *pFilename, mz_file_write_func pCallback, void *pOpaque, mz_uint flags); + +#ifndef MINIZ_NO_STDIO +// Extracts a archive file to a disk file and sets its last accessed and modified times. +// This function only extracts files, not archive directory records. +mz_bool mz_zip_reader_extract_to_file(mz_zip_archive *pZip, mz_uint file_index, const char *pDst_filename, mz_uint flags); +mz_bool mz_zip_reader_extract_file_to_file(mz_zip_archive *pZip, const char *pArchive_filename, const char *pDst_filename, mz_uint flags); +#endif + +// Ends archive reading, freeing all allocations, and closing the input archive file if mz_zip_reader_init_file() was used. +mz_bool mz_zip_reader_end(mz_zip_archive *pZip); + +// ZIP archive writing + +#ifndef MINIZ_NO_ARCHIVE_WRITING_APIS + +// Inits a ZIP archive writer. +mz_bool mz_zip_writer_init(mz_zip_archive *pZip, mz_uint64 existing_size); +mz_bool mz_zip_writer_init_heap(mz_zip_archive *pZip, size_t size_to_reserve_at_beginning, size_t initial_allocation_size); + +#ifndef MINIZ_NO_STDIO +mz_bool mz_zip_writer_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint64 size_to_reserve_at_beginning); +#endif + +// Converts a ZIP archive reader object into a writer object, to allow efficient in-place file appends to occur on an existing archive. +// For archives opened using mz_zip_reader_init_file, pFilename must be the archive's filename so it can be reopened for writing. If the file can't be reopened, mz_zip_reader_end() will be called. +// For archives opened using mz_zip_reader_init_mem, the memory block must be growable using the realloc callback (which defaults to realloc unless you've overridden it). +// Finally, for archives opened using mz_zip_reader_init, the mz_zip_archive's user provided m_pWrite function cannot be NULL. +// Note: In-place archive modification is not recommended unless you know what you're doing, because if execution stops or something goes wrong before +// the archive is finalized the file's central directory will be hosed. +mz_bool mz_zip_writer_init_from_reader(mz_zip_archive *pZip, const char *pFilename); + +// Adds the contents of a memory buffer to an archive. These functions record the current local time into the archive. +// To add a directory entry, call this method with an archive name ending in a forwardslash with empty buffer. +// level_and_flags - compression level (0-10, see MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or just set to MZ_DEFAULT_COMPRESSION. +mz_bool mz_zip_writer_add_mem(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, mz_uint level_and_flags); +mz_bool mz_zip_writer_add_mem_ex(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, mz_uint64 uncomp_size, mz_uint32 uncomp_crc32); + +#ifndef MINIZ_NO_STDIO +// Adds the contents of a disk file to an archive. This function also records the disk file's modified time into the archive. +// level_and_flags - compression level (0-10, see MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or just set to MZ_DEFAULT_COMPRESSION. +mz_bool mz_zip_writer_add_file(mz_zip_archive *pZip, const char *pArchive_name, const char *pSrc_filename, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags); +#endif + +// Adds a file to an archive by fully cloning the data from another archive. +// This function fully clones the source file's compressed data (no recompression), along with its full filename, extra data, and comment fields. +mz_bool mz_zip_writer_add_from_zip_reader(mz_zip_archive *pZip, mz_zip_archive *pSource_zip, mz_uint file_index); + +// Finalizes the archive by writing the central directory records followed by the end of central directory record. +// After an archive is finalized, the only valid call on the mz_zip_archive struct is mz_zip_writer_end(). +// An archive must be manually finalized by calling this function for it to be valid. +mz_bool mz_zip_writer_finalize_archive(mz_zip_archive *pZip); +mz_bool mz_zip_writer_finalize_heap_archive(mz_zip_archive *pZip, void **pBuf, size_t *pSize); + +// Ends archive writing, freeing all allocations, and closing the output file if mz_zip_writer_init_file() was used. +// Note for the archive to be valid, it must have been finalized before ending. +mz_bool mz_zip_writer_end(mz_zip_archive *pZip); + +// Misc. high-level helper functions: + +// mz_zip_add_mem_to_archive_file_in_place() efficiently (but not atomically) appends a memory blob to a ZIP archive. +// level_and_flags - compression level (0-10, see MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or just set to MZ_DEFAULT_COMPRESSION. +mz_bool mz_zip_add_mem_to_archive_file_in_place(const char *pZip_filename, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags); + +// Reads a single file from an archive into a heap block. +// Returns NULL on failure. +// +// Note: Due to MINIZ_NO_MALLOC, this function will not work. +// +void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, const char *pArchive_name, size_t *pSize, mz_uint zip_flags) __attribute__((warning("miniz is compiled without malloc so this function does not work"))); + +#endif // #ifndef MINIZ_NO_ARCHIVE_WRITING_APIS + +#endif // #ifndef MINIZ_NO_ARCHIVE_APIS + +// ------------------- Low-level Decompression API Definitions + +// Decompression flags used by tinfl_decompress(). +// TINFL_FLAG_PARSE_ZLIB_HEADER: If set, the input has a valid zlib header and ends with an adler32 checksum (it's a valid zlib stream). Otherwise, the input is a raw deflate stream. +// TINFL_FLAG_HAS_MORE_INPUT: If set, there are more input bytes available beyond the end of the supplied input buffer. If clear, the input buffer contains all remaining input. +// TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF: If set, the output buffer is large enough to hold the entire decompressed stream. If clear, the output buffer is at least the size of the dictionary (typically 32KB). +// TINFL_FLAG_COMPUTE_ADLER32: Force adler-32 checksum computation of the decompressed bytes. +enum +{ + TINFL_FLAG_PARSE_ZLIB_HEADER = 1, + TINFL_FLAG_HAS_MORE_INPUT = 2, + TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF = 4, + TINFL_FLAG_COMPUTE_ADLER32 = 8 +}; + +// High level decompression functions: +// tinfl_decompress_mem_to_heap() decompresses a block in memory to a heap block allocated via malloc(). +// On entry: +// pSrc_buf, src_buf_len: Pointer and size of the Deflate or zlib source data to decompress. +// On return: +// Function returns a pointer to the decompressed data, or NULL on failure. +// *pOut_len will be set to the decompressed data's size, which could be larger than src_buf_len on uncompressible data. +// The caller must call mz_free() on the returned block when it's no longer needed. +// +// Note: Due to MINIZ_NO_MALLOC, this function will not work. +// +void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags) __attribute__((warning("miniz is compiled without malloc so this function does not work"))); + +// tinfl_decompress_mem_to_mem() decompresses a block in memory to another block in memory. +// Returns TINFL_DECOMPRESS_MEM_TO_MEM_FAILED on failure, or the number of bytes written on success. +#define TINFL_DECOMPRESS_MEM_TO_MEM_FAILED ((size_t)(-1)) +size_t tinfl_decompress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags); + +// tinfl_decompress_mem_to_callback() decompresses a block in memory to an internal 32KB buffer, and a user provided callback function will be called to flush the buffer. +// +// Note: Due to MINIZ_NO_MALLOC, this function will not work. +// +// Returns 1 on success or 0 or -1 on failure. +typedef int (*tinfl_put_buf_func_ptr)(const void* pBuf, int len, void *pUser); +int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size, tinfl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags) __attribute__((warning("miniz is compiled without malloc so this function does not work")));; + +struct tinfl_decompressor_tag; typedef struct tinfl_decompressor_tag tinfl_decompressor; + +// Max size of LZ dictionary. +#define TINFL_LZ_DICT_SIZE 32768 + +// Return status. +typedef enum +{ + TINFL_STATUS_BAD_PARAM = -3, + TINFL_STATUS_ADLER32_MISMATCH = -2, + TINFL_STATUS_FAILED = -1, + TINFL_STATUS_DONE = 0, + TINFL_STATUS_NEEDS_MORE_INPUT = 1, + TINFL_STATUS_HAS_MORE_OUTPUT = 2 +} tinfl_status; + +// Initializes the decompressor to its initial state. +#define tinfl_init(r) do { (r)->m_state = 0; } MZ_MACRO_END +#define tinfl_get_adler32(r) (r)->m_check_adler32 + +// Main low-level decompressor coroutine function. This is the only function actually needed for decompression. All the other functions are just high-level helpers for improved usability. +// This is a universal API, i.e. it can be used as a building block to build any desired higher level decompression API. In the limit case, it can be called once per every byte input or output. +tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, const mz_uint32 decomp_flags); + +// Internal/private bits follow. +enum +{ + TINFL_MAX_HUFF_TABLES = 3, TINFL_MAX_HUFF_SYMBOLS_0 = 288, TINFL_MAX_HUFF_SYMBOLS_1 = 32, TINFL_MAX_HUFF_SYMBOLS_2 = 19, + TINFL_FAST_LOOKUP_BITS = 10, TINFL_FAST_LOOKUP_SIZE = 1 << TINFL_FAST_LOOKUP_BITS +}; + +typedef struct +{ + mz_uint8 m_code_size[TINFL_MAX_HUFF_SYMBOLS_0]; + mz_int16 m_look_up[TINFL_FAST_LOOKUP_SIZE], m_tree[TINFL_MAX_HUFF_SYMBOLS_0 * 2]; +} tinfl_huff_table; + +#if MINIZ_HAS_64BIT_REGISTERS + #define TINFL_USE_64BIT_BITBUF 1 +#endif + +#if TINFL_USE_64BIT_BITBUF + typedef mz_uint64 tinfl_bit_buf_t; + #define TINFL_BITBUF_SIZE (64) +#else + typedef mz_uint32 tinfl_bit_buf_t; + #define TINFL_BITBUF_SIZE (32) +#endif + +struct tinfl_decompressor_tag +{ + mz_uint32 m_state, m_num_bits, m_zhdr0, m_zhdr1, m_z_adler32, m_final, m_type, m_check_adler32, m_dist, m_counter, m_num_extra, m_table_sizes[TINFL_MAX_HUFF_TABLES]; + tinfl_bit_buf_t m_bit_buf; + size_t m_dist_from_out_buf_start; + tinfl_huff_table m_tables[TINFL_MAX_HUFF_TABLES]; + mz_uint8 m_raw_header[4], m_len_codes[TINFL_MAX_HUFF_SYMBOLS_0 + TINFL_MAX_HUFF_SYMBOLS_1 + 137]; +}; + +// ------------------- Low-level Compression API Definitions + +// Set TDEFL_LESS_MEMORY to 1 to use less memory (compression will be slightly slower, and raw/dynamic blocks will be output more frequently). +#define TDEFL_LESS_MEMORY 1 + +// tdefl_init() compression flags logically OR'd together (low 12 bits contain the max. number of probes per dictionary search): +// TDEFL_DEFAULT_MAX_PROBES: The compressor defaults to 128 dictionary probes per dictionary search. 0=Huffman only, 1=Huffman+LZ (fastest/crap compression), 4095=Huffman+LZ (slowest/best compression). +enum +{ + TDEFL_HUFFMAN_ONLY = 0, TDEFL_DEFAULT_MAX_PROBES = 128, TDEFL_MAX_PROBES_MASK = 0xFFF +}; + +// TDEFL_WRITE_ZLIB_HEADER: If set, the compressor outputs a zlib header before the deflate data, and the Adler-32 of the source data at the end. Otherwise, you'll get raw deflate data. +// TDEFL_COMPUTE_ADLER32: Always compute the adler-32 of the input data (even when not writing zlib headers). +// TDEFL_GREEDY_PARSING_FLAG: Set to use faster greedy parsing, instead of more efficient lazy parsing. +// TDEFL_NONDETERMINISTIC_PARSING_FLAG: Enable to decrease the compressor's initialization time to the minimum, but the output may vary from run to run given the same input (depending on the contents of memory). +// TDEFL_RLE_MATCHES: Only look for RLE matches (matches with a distance of 1) +// TDEFL_FILTER_MATCHES: Discards matches <= 5 chars if enabled. +// TDEFL_FORCE_ALL_STATIC_BLOCKS: Disable usage of optimized Huffman tables. +// TDEFL_FORCE_ALL_RAW_BLOCKS: Only use raw (uncompressed) deflate blocks. +// The low 12 bits are reserved to control the max # of hash probes per dictionary lookup (see TDEFL_MAX_PROBES_MASK). +enum +{ + TDEFL_WRITE_ZLIB_HEADER = 0x01000, + TDEFL_COMPUTE_ADLER32 = 0x02000, + TDEFL_GREEDY_PARSING_FLAG = 0x04000, + TDEFL_NONDETERMINISTIC_PARSING_FLAG = 0x08000, + TDEFL_RLE_MATCHES = 0x10000, + TDEFL_FILTER_MATCHES = 0x20000, + TDEFL_FORCE_ALL_STATIC_BLOCKS = 0x40000, + TDEFL_FORCE_ALL_RAW_BLOCKS = 0x80000 +}; + +// High level compression functions: +// tdefl_compress_mem_to_heap() compresses a block in memory to a heap block allocated via malloc(). +// On entry: +// pSrc_buf, src_buf_len: Pointer and size of source block to compress. +// flags: The max match finder probes (default is 128) logically OR'd against the above flags. Higher probes are slower but improve compression. +// On return: +// Function returns a pointer to the compressed data, or NULL on failure. +// *pOut_len will be set to the compressed data's size, which could be larger than src_buf_len on uncompressible data. +// The caller must free() the returned block when it's no longer needed. +// +// Note: Due to MINIZ_NO_MALLOC, this function will not work. +// +void *tdefl_compress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags) __attribute__((warning("miniz is compiled without malloc so this function does not work")));; + +// tdefl_compress_mem_to_mem() compresses a block in memory to another block in memory. +// Returns 0 on failure. +size_t tdefl_compress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags); + +// Compresses an image to a compressed PNG file in memory. +// On entry: +// pImage, w, h, and num_chans describe the image to compress. num_chans may be 1, 2, 3, or 4. +// The image pitch in bytes per scanline will be w*num_chans. The leftmost pixel on the top scanline is stored first in memory. +// level may range from [0,10], use MZ_NO_COMPRESSION, MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc. or a decent default is MZ_DEFAULT_LEVEL +// If flip is true, the image will be flipped on the Y axis (useful for OpenGL apps). +// On return: +// Function returns a pointer to the compressed data, or NULL on failure. +// *pLen_out will be set to the size of the PNG image file. +// The caller must mz_free() the returned heap block (which will typically be larger than *pLen_out) when it's no longer needed. +void *tdefl_write_image_to_png_file_in_memory_ex(const void *pImage, int w, int h, int num_chans, size_t *pLen_out, mz_uint level, mz_bool flip); +void *tdefl_write_image_to_png_file_in_memory(const void *pImage, int w, int h, int num_chans, size_t *pLen_out); + +// Output stream interface. The compressor uses this interface to write compressed data. It'll typically be called TDEFL_OUT_BUF_SIZE at a time. +typedef mz_bool (*tdefl_put_buf_func_ptr)(const void* pBuf, int len, void *pUser); + +// tdefl_compress_mem_to_output() compresses a block to an output stream. The above helpers use this function internally. +// +// Note: Due to MINIZ_NO_MALLOC, this function will not work. +// +mz_bool tdefl_compress_mem_to_output(const void *pBuf, size_t buf_len, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags) __attribute__((warning("miniz is compiled without malloc so this function does not work")));; + +enum { TDEFL_MAX_HUFF_TABLES = 3, TDEFL_MAX_HUFF_SYMBOLS_0 = 288, TDEFL_MAX_HUFF_SYMBOLS_1 = 32, TDEFL_MAX_HUFF_SYMBOLS_2 = 19, TDEFL_LZ_DICT_SIZE = 32768, TDEFL_LZ_DICT_SIZE_MASK = TDEFL_LZ_DICT_SIZE - 1, TDEFL_MIN_MATCH_LEN = 3, TDEFL_MAX_MATCH_LEN = 258 }; + +// TDEFL_OUT_BUF_SIZE MUST be large enough to hold a single entire compressed output block (using static/fixed Huffman codes). +#if TDEFL_LESS_MEMORY +enum { TDEFL_LZ_CODE_BUF_SIZE = 24 * 1024, TDEFL_OUT_BUF_SIZE = (TDEFL_LZ_CODE_BUF_SIZE * 13 ) / 10, TDEFL_MAX_HUFF_SYMBOLS = 288, TDEFL_LZ_HASH_BITS = 12, TDEFL_LEVEL1_HASH_SIZE_MASK = 4095, TDEFL_LZ_HASH_SHIFT = (TDEFL_LZ_HASH_BITS + 2) / 3, TDEFL_LZ_HASH_SIZE = 1 << TDEFL_LZ_HASH_BITS }; +#else +enum { TDEFL_LZ_CODE_BUF_SIZE = 64 * 1024, TDEFL_OUT_BUF_SIZE = (TDEFL_LZ_CODE_BUF_SIZE * 13 ) / 10, TDEFL_MAX_HUFF_SYMBOLS = 288, TDEFL_LZ_HASH_BITS = 15, TDEFL_LEVEL1_HASH_SIZE_MASK = 4095, TDEFL_LZ_HASH_SHIFT = (TDEFL_LZ_HASH_BITS + 2) / 3, TDEFL_LZ_HASH_SIZE = 1 << TDEFL_LZ_HASH_BITS }; +#endif + +// The low-level tdefl functions below may be used directly if the above helper functions aren't flexible enough. The low-level functions don't make any heap allocations, unlike the above helper functions. +typedef enum +{ + TDEFL_STATUS_BAD_PARAM = -2, + TDEFL_STATUS_PUT_BUF_FAILED = -1, + TDEFL_STATUS_OKAY = 0, + TDEFL_STATUS_DONE = 1, +} tdefl_status; + +// Must map to MZ_NO_FLUSH, MZ_SYNC_FLUSH, etc. enums +typedef enum +{ + TDEFL_NO_FLUSH = 0, + TDEFL_SYNC_FLUSH = 2, + TDEFL_FULL_FLUSH = 3, + TDEFL_FINISH = 4 +} tdefl_flush; + +// tdefl's compression state structure. +typedef struct +{ + tdefl_put_buf_func_ptr m_pPut_buf_func; + void *m_pPut_buf_user; + mz_uint m_flags, m_max_probes[2]; + int m_greedy_parsing; + mz_uint m_adler32, m_lookahead_pos, m_lookahead_size, m_dict_size; + mz_uint8 *m_pLZ_code_buf, *m_pLZ_flags, *m_pOutput_buf, *m_pOutput_buf_end; + mz_uint m_num_flags_left, m_total_lz_bytes, m_lz_code_buf_dict_pos, m_bits_in, m_bit_buffer; + mz_uint m_saved_match_dist, m_saved_match_len, m_saved_lit, m_output_flush_ofs, m_output_flush_remaining, m_finished, m_block_index, m_wants_to_finish; + tdefl_status m_prev_return_status; + const void *m_pIn_buf; + void *m_pOut_buf; + size_t *m_pIn_buf_size, *m_pOut_buf_size; + tdefl_flush m_flush; + const mz_uint8 *m_pSrc; + size_t m_src_buf_left, m_out_buf_ofs; + mz_uint8 m_dict[TDEFL_LZ_DICT_SIZE + TDEFL_MAX_MATCH_LEN - 1]; + mz_uint16 m_huff_count[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS]; + mz_uint16 m_huff_codes[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS]; + mz_uint8 m_huff_code_sizes[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS]; + mz_uint8 m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE]; + mz_uint16 m_next[TDEFL_LZ_DICT_SIZE]; + mz_uint16 m_hash[TDEFL_LZ_HASH_SIZE]; + mz_uint8 m_output_buf[TDEFL_OUT_BUF_SIZE]; +} tdefl_compressor; + +// Initializes the compressor. +// There is no corresponding deinit() function because the tdefl API's do not dynamically allocate memory. +// pBut_buf_func: If NULL, output data will be supplied to the specified callback. In this case, the user should call the tdefl_compress_buffer() API for compression. +// If pBut_buf_func is NULL the user should always call the tdefl_compress() API. +// flags: See the above enums (TDEFL_HUFFMAN_ONLY, TDEFL_WRITE_ZLIB_HEADER, etc.) +tdefl_status tdefl_init(tdefl_compressor *d, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags); + +// Compresses a block of data, consuming as much of the specified input buffer as possible, and writing as much compressed data to the specified output buffer as possible. +tdefl_status tdefl_compress(tdefl_compressor *d, const void *pIn_buf, size_t *pIn_buf_size, void *pOut_buf, size_t *pOut_buf_size, tdefl_flush flush); + +// tdefl_compress_buffer() is only usable when the tdefl_init() is called with a non-NULL tdefl_put_buf_func_ptr. +// tdefl_compress_buffer() always consumes the entire input buffer. +tdefl_status tdefl_compress_buffer(tdefl_compressor *d, const void *pIn_buf, size_t in_buf_size, tdefl_flush flush); + +tdefl_status tdefl_get_prev_return_status(tdefl_compressor *d); +mz_uint32 tdefl_get_adler32(tdefl_compressor *d); + +// Can't use tdefl_create_comp_flags_from_zip_params if MINIZ_NO_ZLIB_APIS isn't defined, because it uses some of its macros. +#ifndef MINIZ_NO_ZLIB_APIS +// Create tdefl_compress() flags given zlib-style compression parameters. +// level may range from [0,10] (where 10 is absolute max compression, but may be much slower on some files) +// window_bits may be -15 (raw deflate) or 15 (zlib) +// strategy may be either MZ_DEFAULT_STRATEGY, MZ_FILTERED, MZ_HUFFMAN_ONLY, MZ_RLE, or MZ_FIXED +mz_uint tdefl_create_comp_flags_from_zip_params(int level, int window_bits, int strategy); +#endif // #ifndef MINIZ_NO_ZLIB_APIS + +#ifdef __cplusplus +} +#endif + +#endif // MINIZ_HEADER_INCLUDED + diff --git a/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/rtc.h b/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/rtc.h new file mode 100644 index 0000000000000..54b724fd2a0f3 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/rtc.h @@ -0,0 +1,221 @@ +// 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. + +#ifndef _ROM_RTC_H_ +#define _ROM_RTC_H_ + +#include "ets_sys.h" + +#include +#include + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup rtc_apis, rtc registers and memory related apis + * @brief rtc apis + */ + +/** @addtogroup rtc_apis + * @{ + */ + +/************************************************************************************** + * Note: * + * Some Rtc memory and registers are used, in ROM or in internal library. * + * Please do not use reserved or used rtc memory or registers. * + * * + ************************************************************************************* + * RTC Memory & Store Register usage + ************************************************************************************* + * rtc memory addr type size usage + * 0x3ff61000(0x50000000) Slow SIZE_CP Co-Processor code/Reset Entry + * 0x3ff61000+SIZE_CP Slow 4096-SIZE_CP + * 0x3ff62800 Slow 4096 Reserved + * + * 0x3ff80000(0x400c0000) Fast 8192 deep sleep entry code + * + ************************************************************************************* + * RTC store registers usage + * RTC_CNTL_STORE0_REG Reserved + * RTC_CNTL_STORE1_REG RTC_SLOW_CLK calibration value + * RTC_CNTL_STORE2_REG Boot time, low word + * RTC_CNTL_STORE3_REG Boot time, high word + * RTC_CNTL_STORE4_REG External XTAL frequency. The frequency must necessarily be even, otherwise there will be a conflict with the low bit, which is used to disable logs in the ROM code. + * RTC_CNTL_STORE5_REG APB bus frequency + * RTC_CNTL_STORE6_REG FAST_RTC_MEMORY_ENTRY + * RTC_CNTL_STORE7_REG FAST_RTC_MEMORY_CRC + ************************************************************************************* + */ + +#define RTC_SLOW_CLK_CAL_REG RTC_CNTL_STORE1_REG +#define RTC_BOOT_TIME_LOW_REG RTC_CNTL_STORE2_REG +#define RTC_BOOT_TIME_HIGH_REG RTC_CNTL_STORE3_REG +#define RTC_XTAL_FREQ_REG RTC_CNTL_STORE4_REG +#define RTC_APB_FREQ_REG RTC_CNTL_STORE5_REG +#define RTC_ENTRY_ADDR_REG RTC_CNTL_STORE6_REG +#define RTC_RESET_CAUSE_REG RTC_CNTL_STORE6_REG +#define RTC_MEMORY_CRC_REG RTC_CNTL_STORE7_REG + +#define RTC_DISABLE_ROM_LOG ((1 << 0) | (1 << 16)) //!< Disable logging from the ROM code. + +typedef enum { + AWAKE = 0, // + +#ifndef _ROM_SECURE_BOOT_H_ +#define _ROM_SECURE_BOOT_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +void ets_secure_boot_start(void); + +void ets_secure_boot_finish(void); + +void ets_secure_boot_hash(const uint32_t *buf); + +void ets_secure_boot_obtain(void); + +int ets_secure_boot_check(uint32_t *buf); + +void ets_secure_boot_rd_iv(uint32_t *buf); + +void ets_secure_boot_rd_abstract(uint32_t *buf); + +bool ets_secure_boot_check_start(uint8_t abs_index, uint32_t iv_addr); + +int ets_secure_boot_check_finish(uint32_t *abstract); + +#ifdef CONFIG_ESP32_REV_MIN_3 +#define SECURE_BOOT_NUM_BLOCKS 1 + +typedef enum { + SBV2_SUCCESS = 0x3A5A5AA5, + SBV2_FAILED = 0xA533885A, +} secure_boot_v2_status_t; + +/* Secure Boot Version 2 - Public Key format */ +typedef struct { + uint8_t n[384]; /* Public key modulus */ + uint32_t e; /* Public key exponent */ + uint8_t rinv[384]; + uint32_t mdash; +} ets_rsa_pubkey_t; + +/* Secure Boot Version 2 signature format for ESP32 ECO3 */ +typedef struct { + uint8_t magic_byte; + uint8_t version; + uint8_t _reserved1; + uint8_t _reserved2; + uint8_t image_digest[32]; + ets_rsa_pubkey_t key; + uint8_t signature[384]; + uint32_t block_crc; + uint8_t _padding[16]; +} ets_secure_boot_sig_block_t; + +/* Multiple key block support */ +struct ets_secure_boot_signature { + ets_secure_boot_sig_block_t block[SECURE_BOOT_NUM_BLOCKS]; + uint8_t _padding[4096 - (sizeof(ets_secure_boot_sig_block_t) * SECURE_BOOT_NUM_BLOCKS)]; +}; +typedef struct ets_secure_boot_signature ets_secure_boot_signature_t; + +/** @brief Verifies the signature block appended to a firmware image. Implemented in the ROM. + * + * This function is used to verify the bootloader before burning its public key hash into Efuse. + * Also, it is used to verify the app on loading the image on boot and on OTA. + * + * @param sig The signature block flashed aligned 4096 bytes from the firmware. + * @param image_digest The SHA-256 Digest of the firmware to be verified + * @param trusted_key_digest The SHA-256 Digest of the public key (ets_rsa_pubkey_t) of a single signature block. + * @param verified_digest RSA-PSS signature of image_digest. Pass an uninitialised array. + * + * @return SBV2_SUCCESS if signature is valid + * SBV2_FAILED for failures. + */ +secure_boot_v2_status_t ets_secure_boot_verify_signature(const ets_secure_boot_signature_t *sig, const uint8_t *image_digest, const uint8_t *trusted_key_digest, uint8_t *verified_digest); + +/** @brief This function verifies the 1st stage bootloader. Implemented in the ROM. + * Reboots post verification. It reads the Efuse key for verification of the public key. + * + * This function is not used in the current workflow. + * + */ +void ets_secure_boot_verify_boot_bootloader(void); + +/** @brief Confirms if the secure boot V2 has been enabled. Implemented in the ROM. + * + * In ESP32-ECO3 - It checks the value of ABS_DONE_1 in EFuse. + * + * @return true if is Secure boot v2 has been enabled + * False if Secure boot v2 has not been enabled. + */ +bool ets_use_secure_boot_v2(); + +#endif /* CONFIG_ESP32_REV_MIN_3 */ + +#endif /* _ROM_SECURE_BOOT_H_ */ \ No newline at end of file diff --git a/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/sha.h b/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/sha.h new file mode 100644 index 0000000000000..323749efddab0 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/sha.h @@ -0,0 +1,64 @@ +/* + ROM functions for hardware SHA support. + + It is not recommended to use these functions directly. If using + them from esp-idf then use the esp_sha_lock_engine() and + esp_sha_lock_memory_block() functions in esp32/sha.h to ensure + exclusive access. + */ +// 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. +#ifndef _ROM_SHA_H_ +#define _ROM_SHA_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct SHAContext { + bool start; + uint32_t total_input_bits[4]; +} SHA_CTX; + +enum SHA_TYPE { + SHA1 = 0, + SHA2_256, + SHA2_384, + SHA2_512, + + + SHA_INVALID = -1, +}; + +/* Do not use these function in multi core mode due to + * inside they have no safe implementation (without DPORT workaround). +*/ +void ets_sha_init(SHA_CTX *ctx); + +void ets_sha_enable(void); + +void ets_sha_disable(void); + +void ets_sha_update(SHA_CTX *ctx, enum SHA_TYPE type, const uint8_t *input, size_t input_bits); + +void ets_sha_finish(SHA_CTX *ctx, enum SHA_TYPE type, uint8_t *output); + +#ifdef __cplusplus +} +#endif + +#endif /* _ROM_SHA_H_ */ diff --git a/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/spi_flash.h b/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/spi_flash.h new file mode 100644 index 0000000000000..a2496be6418f1 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/spi_flash.h @@ -0,0 +1,558 @@ +// 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. + +#ifndef _ROM_SPI_FLASH_H_ +#define _ROM_SPI_FLASH_H_ + +#include +#include + +#include "esp_attr.h" + +#include + +#ifdef CONFIG_LEGACY_INCLUDE_COMMON_HEADERS +#include "soc/spi_reg.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup spi_flash_apis, spi flash operation related apis + * @brief spi_flash apis + */ + +/** @addtogroup spi_flash_apis + * @{ + */ + +/************************************************************* + * Note + ************************************************************* + * 1. ESP32 chip have 4 SPI slave/master, however, SPI0 is + * used as an SPI master to access Flash and ext-SRAM by + * Cache module. It will support Decryto read for Flash, + * read/write for ext-SRAM. And SPI1 is also used as an + * SPI master for Flash read/write and ext-SRAM read/write. + * It will support Encrypto write for Flash. + * 2. As an SPI master, SPI support Highest clock to 80M, + * however, Flash with 80M Clock should be configured + * for different Flash chips. If you want to use 80M + * clock We should use the SPI that is certified by + * Espressif. However, the certification is not started + * at the time, so please use 40M clock at the moment. + * 3. SPI Flash can use 2 lines or 4 lines mode. If you + * use 2 lines mode, you can save two pad SPIHD and + * SPIWP for gpio. ESP32 support configured SPI pad for + * Flash, the configuration is stored in efuse and flash. + * However, the configurations of pads should be certified + * by Espressif. If you use this function, please use 40M + * clock at the moment. + * 4. ESP32 support to use Common SPI command to configure + * Flash to QIO mode, if you failed to configure with fix + * command. With Common SPI Command, ESP32 can also provide + * a way to use same Common SPI command groups on different + * Flash chips. + * 5. This functions are not protected by packeting, Please use the + ************************************************************* + */ + +#define PERIPHS_SPI_FLASH_CMD SPI_CMD_REG(1) +#define PERIPHS_SPI_FLASH_ADDR SPI_ADDR_REG(1) +#define PERIPHS_SPI_FLASH_CTRL SPI_CTRL_REG(1) +#define PERIPHS_SPI_FLASH_CTRL1 SPI_CTRL1_REG(1) +#define PERIPHS_SPI_FLASH_STATUS SPI_RD_STATUS_REG(1) +#define PERIPHS_SPI_FLASH_USRREG SPI_USER_REG(1) +#define PERIPHS_SPI_FLASH_USRREG1 SPI_USER1_REG(1) +#define PERIPHS_SPI_FLASH_USRREG2 SPI_USER2_REG(1) +#define PERIPHS_SPI_FLASH_C0 SPI_W0_REG(1) +#define PERIPHS_SPI_FLASH_C1 SPI_W1_REG(1) +#define PERIPHS_SPI_FLASH_C2 SPI_W2_REG(1) +#define PERIPHS_SPI_FLASH_C3 SPI_W3_REG(1) +#define PERIPHS_SPI_FLASH_C4 SPI_W4_REG(1) +#define PERIPHS_SPI_FLASH_C5 SPI_W5_REG(1) +#define PERIPHS_SPI_FLASH_C6 SPI_W6_REG(1) +#define PERIPHS_SPI_FLASH_C7 SPI_W7_REG(1) +#define PERIPHS_SPI_FLASH_TX_CRC SPI_TX_CRC_REG(1) + +#define SPI0_R_QIO_DUMMY_CYCLELEN 3 +#define SPI0_R_QIO_ADDR_BITSLEN 31 +#define SPI0_R_FAST_DUMMY_CYCLELEN 7 +#define SPI0_R_DIO_DUMMY_CYCLELEN 1 +#define SPI0_R_DIO_ADDR_BITSLEN 27 +#define SPI0_R_FAST_ADDR_BITSLEN 23 +#define SPI0_R_SIO_ADDR_BITSLEN 23 + +#define SPI1_R_QIO_DUMMY_CYCLELEN 3 +#define SPI1_R_QIO_ADDR_BITSLEN 31 +#define SPI1_R_FAST_DUMMY_CYCLELEN 7 +#define SPI1_R_DIO_DUMMY_CYCLELEN 3 +#define SPI1_R_DIO_ADDR_BITSLEN 31 +#define SPI1_R_FAST_ADDR_BITSLEN 23 +#define SPI1_R_SIO_ADDR_BITSLEN 23 + +#define ESP_ROM_SPIFLASH_W_SIO_ADDR_BITSLEN 23 + +#define ESP_ROM_SPIFLASH_TWO_BYTE_STATUS_EN SPI_WRSR_2B + +//SPI address register +#define ESP_ROM_SPIFLASH_BYTES_LEN 24 +#define ESP_ROM_SPIFLASH_BUFF_BYTE_WRITE_NUM 32 +#define ESP_ROM_SPIFLASH_BUFF_BYTE_READ_NUM 64 +#define ESP_ROM_SPIFLASH_BUFF_BYTE_READ_BITS 0x3f + +//SPI status register +#define ESP_ROM_SPIFLASH_BUSY_FLAG BIT0 +#define ESP_ROM_SPIFLASH_WRENABLE_FLAG BIT1 +#define ESP_ROM_SPIFLASH_BP0 BIT2 +#define ESP_ROM_SPIFLASH_BP1 BIT3 +#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 + +//Extra dummy for flash read +#define ESP_ROM_SPIFLASH_DUMMY_LEN_PLUS_20M 0 +#define ESP_ROM_SPIFLASH_DUMMY_LEN_PLUS_40M 1 +#define ESP_ROM_SPIFLASH_DUMMY_LEN_PLUS_80M 2 + +#define FLASH_ID_GD25LQ32C 0xC86016 + +typedef enum { + ESP_ROM_SPIFLASH_QIO_MODE = 0, + ESP_ROM_SPIFLASH_QOUT_MODE, + ESP_ROM_SPIFLASH_DIO_MODE, + ESP_ROM_SPIFLASH_DOUT_MODE, + ESP_ROM_SPIFLASH_FASTRD_MODE, + ESP_ROM_SPIFLASH_SLOWRD_MODE +} esp_rom_spiflash_read_mode_t; + +typedef enum { + ESP_ROM_SPIFLASH_RESULT_OK, + ESP_ROM_SPIFLASH_RESULT_ERR, + ESP_ROM_SPIFLASH_RESULT_TIMEOUT +} esp_rom_spiflash_result_t; + +typedef struct { + uint32_t device_id; + uint32_t chip_size; // chip size in bytes + uint32_t block_size; + uint32_t sector_size; + uint32_t page_size; + uint32_t status_mask; +} esp_rom_spiflash_chip_t; + +typedef struct { + uint8_t data_length; + uint8_t read_cmd0; + uint8_t read_cmd1; + uint8_t write_cmd; + uint16_t data_mask; + uint16_t data; +} esp_rom_spiflash_common_cmd_t; + +/** + * @brief Fix the bug in SPI hardware communication with Flash/Ext-SRAM in High Speed. + * Please do not call this function in SDK. + * + * @param uint8_t spi: 0 for SPI0(Cache Access), 1 for SPI1(Flash read/write). + * + * @param uint8_t freqdiv: Pll is 80M, 4 for 20M, 3 for 26.7M, 2 for 40M, 1 for 80M. + * + * @return None + */ +void esp_rom_spiflash_fix_dummylen(uint8_t spi, uint8_t freqdiv); + +/** + * @brief Select SPI Flash to QIO mode when WP pad is read from Flash. + * Please do not call this function in SDK. + * + * @param uint8_t wp_gpio_num: WP gpio number. + * + * @param uint32_t ishspi: 0 for spi, 1 for hspi, flash pad decided by strapping + * else, bit[5:0] spiclk, bit[11:6] spiq, bit[17:12] spid, bit[23:18] spics0, bit[29:24] spihd + * + * @return None + */ +void esp_rom_spiflash_select_qiomode(uint8_t wp_gpio_num, uint32_t ishspi); + +/** + * @brief Set SPI Flash pad drivers. + * Please do not call this function in SDK. + * + * @param uint8_t wp_gpio_num: WP gpio number. + * + * @param uint32_t ishspi: 0 for spi, 1 for hspi, flash pad decided by strapping + * else, bit[5:0] spiclk, bit[11:6] spiq, bit[17:12] spid, bit[23:18] spics0, bit[29:24] spihd + * + * @param uint8_t *drvs: drvs[0]-bit[3:0] for cpiclk, bit[7:4] for spiq, drvs[1]-bit[3:0] for spid, drvs[1]-bit[7:4] for spid + * drvs[2]-bit[3:0] for spihd, drvs[2]-bit[7:4] for spiwp. + * Values usually read from falsh by rom code, function usually callde by rom code. + * if value with bit(3) set, the value is valid, bit[2:0] is the real value. + * + * @return None + */ +void esp_rom_spiflash_set_drvs(uint8_t wp_gpio_num, uint32_t ishspi, uint8_t *drvs); + +/** + * @brief Select SPI Flash function for pads. + * Please do not call this function in SDK. + * + * @param uint32_t ishspi: 0 for spi, 1 for hspi, flash pad decided by strapping + * else, bit[5:0] spiclk, bit[11:6] spiq, bit[17:12] spid, bit[23:18] spics0, bit[29:24] spihd + * + * @return None + */ +void esp_rom_spiflash_select_padsfunc(uint32_t ishspi); + +/** + * @brief SPI Flash init, clock divisor is 4, use 1 line Slow read mode. + * Please do not call this function in SDK. + * + * @param uint32_t ishspi: 0 for spi, 1 for hspi, flash pad decided by strapping + * else, bit[5:0] spiclk, bit[11:6] spiq, bit[17:12] spid, bit[23:18] spics0, bit[29:24] spihd + * + * @param uint8_t legacy: In legacy mode, more SPI command is used in line. + * + * @return None + */ +void esp_rom_spiflash_attach(uint32_t ishspi, bool legacy); + +/** + * @brief SPI Read Flash status register. We use CMD 0x05 (RDSR). + * 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. + * + * @param uint32_t *status : The pointer to which to return the Flash status value. + * + * @return ESP_ROM_SPIFLASH_RESULT_OK : read OK. + * ESP_ROM_SPIFLASH_RESULT_ERR : read error. + * ESP_ROM_SPIFLASH_RESULT_TIMEOUT : read timeout. + */ +esp_rom_spiflash_result_t esp_rom_spiflash_read_status(esp_rom_spiflash_chip_t *spi, uint32_t *status); + +/** + * @brief SPI Read Flash status register bits 8-15. We use CMD 0x35 (RDSR2). + * 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. + * + * @param uint32_t *status : The pointer to which to return the Flash status value. + * + * @return ESP_ROM_SPIFLASH_RESULT_OK : read OK. + * ESP_ROM_SPIFLASH_RESULT_ERR : read error. + * ESP_ROM_SPIFLASH_RESULT_TIMEOUT : read timeout. + */ +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. + * 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. + * + * @param uint32_t status_value : Value to . + * + * @return ESP_ROM_SPIFLASH_RESULT_OK : write OK. + * ESP_ROM_SPIFLASH_RESULT_ERR : write error. + * ESP_ROM_SPIFLASH_RESULT_TIMEOUT : write timeout. + */ +esp_rom_spiflash_result_t esp_rom_spiflash_write_status(esp_rom_spiflash_chip_t *spi, uint32_t status_value); + +/** + * @brief Use a command to Read 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. + * + * @param uint32_t*status : The pointer to which to return the Flash status value. + * + * @return ESP_ROM_SPIFLASH_RESULT_OK : read OK. + * ESP_ROM_SPIFLASH_RESULT_ERR : read error. + * ESP_ROM_SPIFLASH_RESULT_TIMEOUT : read timeout. + */ +esp_rom_spiflash_result_t esp_rom_spiflash_read_user_cmd(uint32_t *status, uint8_t cmd); + +/** + * @brief Config SPI Flash read mode when init. + * Please do not call this function in SDK. + * + * @param esp_rom_spiflash_read_mode_t mode : QIO/QOUT/DIO/DOUT/FastRD/SlowRD. + * + * This function does not try to set the QIO Enable bit in the status register, caller is responsible for this. + * + * @return ESP_ROM_SPIFLASH_RESULT_OK : config OK. + * ESP_ROM_SPIFLASH_RESULT_ERR : config error. + * ESP_ROM_SPIFLASH_RESULT_TIMEOUT : config timeout. + */ +esp_rom_spiflash_result_t esp_rom_spiflash_config_readmode(esp_rom_spiflash_read_mode_t mode); + +/** + * @brief Config SPI Flash clock divisor. + * Please do not call this function in SDK. + * + * @param uint8_t freqdiv: clock divisor. + * + * @param uint8_t spi: 0 for SPI0, 1 for SPI1. + * + * @return ESP_ROM_SPIFLASH_RESULT_OK : config OK. + * ESP_ROM_SPIFLASH_RESULT_ERR : config error. + * ESP_ROM_SPIFLASH_RESULT_TIMEOUT : config timeout. + */ +esp_rom_spiflash_result_t esp_rom_spiflash_config_clk(uint8_t freqdiv, uint8_t spi); + +/** + * @brief Send CommonCmd to Flash so that is can go into QIO mode, some Flash use different CMD. + * Please do not call this function in SDK. + * + * @param esp_rom_spiflash_common_cmd_t *cmd : A struct to show the action of a command. + * + * @return uint16_t 0 : do not send command any more. + * 1 : go to the next command. + * n > 1 : skip (n - 1) commands. + */ +uint16_t esp_rom_spiflash_common_cmd(esp_rom_spiflash_common_cmd_t *cmd); + +/** + * @brief Unlock SPI write protect. + * Please do not call this function in SDK. + * + * @param None. + * + * @return ESP_ROM_SPIFLASH_RESULT_OK : Unlock OK. + * ESP_ROM_SPIFLASH_RESULT_ERR : Unlock error. + * ESP_ROM_SPIFLASH_RESULT_TIMEOUT : Unlock timeout. + */ +esp_rom_spiflash_result_t esp_rom_spiflash_unlock(void); + +/** + * @brief SPI write protect. + * Please do not call this function in SDK. + * + * @param None. + * + * @return ESP_ROM_SPIFLASH_RESULT_OK : Lock OK. + * ESP_ROM_SPIFLASH_RESULT_ERR : Lock error. + * ESP_ROM_SPIFLASH_RESULT_TIMEOUT : Lock timeout. + */ +esp_rom_spiflash_result_t esp_rom_spiflash_lock(void); + +/** + * @brief Update SPI Flash parameter. + * Please do not call this function in SDK. + * + * @param uint32_t deviceId : Device ID read from SPI, the low 32 bit. + * + * @param uint32_t chip_size : The Flash size. + * + * @param uint32_t block_size : The Flash block size. + * + * @param uint32_t sector_size : The Flash sector size. + * + * @param uint32_t page_size : The Flash page size. + * + * @param uint32_t status_mask : The Mask used when read status from Flash(use single CMD). + * + * @return ESP_ROM_SPIFLASH_RESULT_OK : Update OK. + * ESP_ROM_SPIFLASH_RESULT_ERR : Update error. + * ESP_ROM_SPIFLASH_RESULT_TIMEOUT : Update timeout. + */ +esp_rom_spiflash_result_t esp_rom_spiflash_config_param(uint32_t deviceId, uint32_t chip_size, uint32_t block_size, + uint32_t sector_size, uint32_t page_size, uint32_t status_mask); + +/** + * @brief Erase whole flash chip. + * Please do not call this function in SDK. + * + * @param None + * + * @return ESP_ROM_SPIFLASH_RESULT_OK : Erase OK. + * ESP_ROM_SPIFLASH_RESULT_ERR : Erase error. + * ESP_ROM_SPIFLASH_RESULT_TIMEOUT : Erase timeout. + */ +esp_rom_spiflash_result_t esp_rom_spiflash_erase_chip(void); + +/** + * @brief Erase a 64KB block of flash + * Uses SPI flash command D8H. + * Please do not call this function in SDK. + * + * @param uint32_t block_num : Which block to erase. + * + * @return ESP_ROM_SPIFLASH_RESULT_OK : Erase OK. + * ESP_ROM_SPIFLASH_RESULT_ERR : Erase error. + * ESP_ROM_SPIFLASH_RESULT_TIMEOUT : Erase timeout. + */ +esp_rom_spiflash_result_t esp_rom_spiflash_erase_block(uint32_t block_num); + +/** + * @brief Erase a sector of flash. + * Uses SPI flash command 20H. + * Please do not call this function in SDK. + * + * @param uint32_t sector_num : Which sector to erase. + * + * @return ESP_ROM_SPIFLASH_RESULT_OK : Erase OK. + * ESP_ROM_SPIFLASH_RESULT_ERR : Erase error. + * ESP_ROM_SPIFLASH_RESULT_TIMEOUT : Erase timeout. + */ +esp_rom_spiflash_result_t esp_rom_spiflash_erase_sector(uint32_t sector_num); + +/** + * @brief Erase some sectors. + * Please do not call this function in SDK. + * + * @param uint32_t start_addr : Start addr to erase, should be sector aligned. + * + * @param uint32_t area_len : Length to erase, should be sector aligned. + * + * @return ESP_ROM_SPIFLASH_RESULT_OK : Erase OK. + * ESP_ROM_SPIFLASH_RESULT_ERR : Erase error. + * ESP_ROM_SPIFLASH_RESULT_TIMEOUT : Erase timeout. + */ +esp_rom_spiflash_result_t esp_rom_spiflash_erase_area(uint32_t start_addr, uint32_t area_len); + +/** + * @brief Write Data to Flash, you should Erase it yourself if need. + * Please do not call this function in SDK. + * + * @param uint32_t dest_addr : Address to write, should be 4 bytes aligned. + * + * @param const uint32_t *src : The pointer to data which is to write. + * + * @param uint32_t len : Length to write, should be 4 bytes aligned. + * + * @return ESP_ROM_SPIFLASH_RESULT_OK : Write OK. + * ESP_ROM_SPIFLASH_RESULT_ERR : Write error. + * ESP_ROM_SPIFLASH_RESULT_TIMEOUT : Write timeout. + */ +esp_rom_spiflash_result_t esp_rom_spiflash_write(uint32_t dest_addr, const uint32_t *src, int32_t len); + +/** + * @brief Read Data from Flash, you should Erase it yourself if need. + * Please do not call this function in SDK. + * + * @param uint32_t src_addr : Address to read, should be 4 bytes aligned. + * + * @param uint32_t *dest : The buf to read the data. + * + * @param uint32_t len : Length to read, should be 4 bytes aligned. + * + * @return ESP_ROM_SPIFLASH_RESULT_OK : Read OK. + * ESP_ROM_SPIFLASH_RESULT_ERR : Read error. + * ESP_ROM_SPIFLASH_RESULT_TIMEOUT : Read timeout. + */ +esp_rom_spiflash_result_t esp_rom_spiflash_read(uint32_t src_addr, uint32_t *dest, int32_t len); + +/** + * @brief SPI1 go into encrypto mode. + * Please do not call this function in SDK. + * + * @param None + * + * @return None + */ +void esp_rom_spiflash_write_encrypted_enable(void); + +/** + * @brief Prepare 32 Bytes data to encrpto writing, you should Erase it yourself if need. + * Please do not call this function in SDK. + * + * @param uint32_t flash_addr : Address to write, should be 32 bytes aligned. + * + * @param uint32_t *data : The pointer to data which is to write. + * + * @return ESP_ROM_SPIFLASH_RESULT_OK : Prepare OK. + * ESP_ROM_SPIFLASH_RESULT_ERR : Prepare error. + * ESP_ROM_SPIFLASH_RESULT_TIMEOUT : Prepare timeout. + */ +esp_rom_spiflash_result_t esp_rom_spiflash_prepare_encrypted_data(uint32_t flash_addr, uint32_t *data); + +/** + * @brief SPI1 go out of encrypto mode. + * Please do not call this function in SDK. + * + * @param None + * + * @return None + */ +void esp_rom_spiflash_write_encrypted_disable(void); + +/** + * @brief Write data to flash with transparent encryption. + * @note Sectors to be written should already be erased. + * + * @note Please do not call this function in SDK. + * + * @param uint32_t flash_addr : Address to write, should be 32 byte aligned. + * + * @param uint32_t *data : The pointer to data to write. Note, this pointer must + * be 32 bit aligned and the content of the data will be + * modified by the encryption function. + * + * @param uint32_t len : Length to write, should be 32 bytes aligned. + * + * @return ESP_ROM_SPIFLASH_RESULT_OK : Data written successfully. + * ESP_ROM_SPIFLASH_RESULT_ERR : Encryption write error. + * ESP_ROM_SPIFLASH_RESULT_TIMEOUT : Encrypto write timeout. + */ +esp_rom_spiflash_result_t esp_rom_spiflash_write_encrypted(uint32_t flash_addr, uint32_t *data, uint32_t len); + + +/** @brief Wait until SPI flash write operation is complete + * + * @note Please do not call this function in SDK. + * + * Reads the Write In Progress bit of the SPI flash status register, + * repeats until this bit is zero (indicating write complete). + * + * @return ESP_ROM_SPIFLASH_RESULT_OK : Write is complete + * ESP_ROM_SPIFLASH_RESULT_ERR : Error while reading status. + */ +esp_rom_spiflash_result_t esp_rom_spiflash_wait_idle(esp_rom_spiflash_chip_t *spi); + + +/** @brief Enable Quad I/O pin functions + * + * @note Please do not call this function in SDK. + * + * Sets the HD & WP pin functions for Quad I/O modes, based on the + * efuse SPI pin configuration. + * + * @param wp_gpio_num - Number of the WP pin to reconfigure for quad I/O. + * + * @param spiconfig - Pin configuration, as returned from ets_efuse_get_spiconfig(). + * - If this parameter is 0, default SPI pins are used and wp_gpio_num parameter is ignored. + * - If this parameter is 1, default HSPI pins are used and wp_gpio_num parameter is ignored. + * - For other values, this parameter encodes the HD pin number and also the CLK pin number. CLK pin selection is used + * to determine if HSPI or SPI peripheral will be used (use HSPI if CLK pin is the HSPI clock pin, otherwise use SPI). + * Both HD & WP pins are configured via GPIO matrix to map to the selected peripheral. + */ +void esp_rom_spiflash_select_qio_pins(uint8_t wp_gpio_num, uint32_t spiconfig); + +/** @brief Global esp_rom_spiflash_chip_t structure used by ROM functions + * + */ +extern esp_rom_spiflash_chip_t g_rom_flashchip; + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* _ROM_SPI_FLASH_H_ */ diff --git a/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/tbconsole.h b/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/tbconsole.h new file mode 100644 index 0000000000000..d6ca069cc75b1 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/tbconsole.h @@ -0,0 +1,27 @@ +// 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. +#ifndef _ROM_TBCONSOLE_H_ +#define _ROM_TBCONSOLE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +void start_tb_console(void); + +#ifdef __cplusplus +} +#endif + +#endif /* _ROM_TBCONSOLE_H_ */ diff --git a/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/tjpgd.h b/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/tjpgd.h new file mode 100644 index 0000000000000..31fbc97cce995 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/tjpgd.h @@ -0,0 +1,99 @@ +/*----------------------------------------------------------------------------/ +/ TJpgDec - Tiny JPEG Decompressor include file (C)ChaN, 2012 +/----------------------------------------------------------------------------*/ +#ifndef _TJPGDEC +#define _TJPGDEC +/*---------------------------------------------------------------------------*/ +/* System Configurations */ + +#define JD_SZBUF 512 /* Size of stream input buffer */ +#define JD_FORMAT 0 /* Output pixel format 0:RGB888 (3 BYTE/pix), 1:RGB565 (1 WORD/pix) */ +#define JD_USE_SCALE 1 /* Use descaling feature for output */ +#define JD_TBLCLIP 1 /* Use table for saturation (might be a bit faster but increases 1K bytes of code size) */ + +/*---------------------------------------------------------------------------*/ + +#ifdef __cplusplus +extern "C" { +#endif + +/* These types must be 16-bit, 32-bit or larger integer */ +typedef int INT; +typedef unsigned int UINT; + +/* These types must be 8-bit integer */ +typedef char CHAR; +typedef unsigned char UCHAR; +typedef unsigned char BYTE; + +/* These types must be 16-bit integer */ +typedef short SHORT; +typedef unsigned short USHORT; +typedef unsigned short WORD; +typedef unsigned short WCHAR; + +/* These types must be 32-bit integer */ +typedef long LONG; +typedef unsigned long ULONG; +typedef unsigned long DWORD; + + +/* Error code */ +typedef enum { + JDR_OK = 0, /* 0: Succeeded */ + JDR_INTR, /* 1: Interrupted by output function */ + JDR_INP, /* 2: Device error or wrong termination of input stream */ + JDR_MEM1, /* 3: Insufficient memory pool for the image */ + JDR_MEM2, /* 4: Insufficient stream input buffer */ + JDR_PAR, /* 5: Parameter error */ + JDR_FMT1, /* 6: Data format error (may be damaged data) */ + JDR_FMT2, /* 7: Right format but not supported */ + JDR_FMT3 /* 8: Not supported JPEG standard */ +} JRESULT; + + + +/* Rectangular structure */ +typedef struct { + WORD left, right, top, bottom; +} JRECT; + + + +/* Decompressor object structure */ +typedef struct JDEC JDEC; +struct JDEC { + UINT dctr; /* Number of bytes available in the input buffer */ + BYTE* dptr; /* Current data read ptr */ + BYTE* inbuf; /* Bit stream input buffer */ + BYTE dmsk; /* Current bit in the current read byte */ + BYTE scale; /* Output scaling ratio */ + BYTE msx, msy; /* MCU size in unit of block (width, height) */ + BYTE qtid[3]; /* Quantization table ID of each component */ + SHORT dcv[3]; /* Previous DC element of each component */ + WORD nrst; /* Restart inverval */ + UINT width, height; /* Size of the input image (pixel) */ + BYTE* huffbits[2][2]; /* Huffman bit distribution tables [id][dcac] */ + WORD* huffcode[2][2]; /* Huffman code word tables [id][dcac] */ + BYTE* huffdata[2][2]; /* Huffman decoded data tables [id][dcac] */ + LONG* qttbl[4]; /* Dequaitizer tables [id] */ + void* workbuf; /* Working buffer for IDCT and RGB output */ + BYTE* mcubuf; /* Working buffer for the MCU */ + void* pool; /* Pointer to available memory pool */ + UINT sz_pool; /* Size of momory pool (bytes available) */ + UINT (*infunc)(JDEC*, BYTE*, UINT);/* Pointer to jpeg stream input function */ + void* device; /* Pointer to I/O device identifiler for the session */ +}; + + + +/* TJpgDec API functions */ +JRESULT jd_prepare (JDEC*, UINT(*)(JDEC*,BYTE*,UINT), void*, UINT, void*); +JRESULT jd_decomp (JDEC*, UINT(*)(JDEC*,void*,JRECT*), BYTE); + + +#ifdef __cplusplus +} +#endif + +#endif /* _TJPGDEC */ diff --git a/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/uart.h b/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/uart.h new file mode 100644 index 0000000000000..49d0e8cf71bf3 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_rom/include/esp32/rom/uart.h @@ -0,0 +1,420 @@ +// 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. + +#ifndef _ROM_UART_H_ +#define _ROM_UART_H_ + +#include "esp_types.h" +#include "esp_attr.h" +#include "ets_sys.h" +#include "soc/soc.h" +#include "soc/uart_periph.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup uart_apis, uart configuration and communication related apis + * @brief uart apis + */ + +/** @addtogroup uart_apis + * @{ + */ + +#define RX_BUFF_SIZE 0x100 +#define TX_BUFF_SIZE 100 + +//uart int enable register ctrl bits +#define UART_RCV_INTEN BIT0 +#define UART_TRX_INTEN BIT1 +#define UART_LINE_STATUS_INTEN BIT2 + +//uart int identification ctrl bits +#define UART_INT_FLAG_MASK 0x0E + +//uart fifo ctrl bits +#define UART_CLR_RCV_FIFO BIT1 +#define UART_CLR_TRX_FIFO BIT2 +#define UART_RCVFIFO_TRG_LVL_BITS BIT6 + +//uart line control bits +#define UART_DIV_LATCH_ACCESS_BIT BIT7 + +//uart line status bits +#define UART_RCV_DATA_RDY_FLAG BIT0 +#define UART_RCV_OVER_FLOW_FLAG BIT1 +#define UART_RCV_PARITY_ERR_FLAG BIT2 +#define UART_RCV_FRAME_ERR_FLAG BIT3 +#define UART_BRK_INT_FLAG BIT4 +#define UART_TRX_FIFO_EMPTY_FLAG BIT5 +#define UART_TRX_ALL_EMPTY_FLAG BIT6 // include fifo and shift reg +#define UART_RCV_ERR_FLAG BIT7 + +//send and receive message frame head +#define FRAME_FLAG 0x7E + +typedef enum { + UART_LINE_STATUS_INT_FLAG = 0x06, + UART_RCV_FIFO_INT_FLAG = 0x04, + UART_RCV_TMOUT_INT_FLAG = 0x0C, + UART_TXBUFF_EMPTY_INT_FLAG = 0x02 +} UartIntType; //consider bit0 for int_flag + +typedef enum { + RCV_ONE_BYTE = 0x0, + RCV_FOUR_BYTE = 0x1, + RCV_EIGHT_BYTE = 0x2, + RCV_FOURTEEN_BYTE = 0x3 +} UartRcvFifoTrgLvl; + +typedef enum { + FIVE_BITS = 0x0, + SIX_BITS = 0x1, + SEVEN_BITS = 0x2, + EIGHT_BITS = 0x3 +} UartBitsNum4Char; + +typedef enum { + ONE_STOP_BIT = 1, + ONE_HALF_STOP_BIT = 2, + TWO_STOP_BIT = 3 +} UartStopBitsNum; + +typedef enum { + NONE_BITS = 0, + ODD_BITS = 2, + EVEN_BITS = 3 + +} UartParityMode; + +typedef enum { + STICK_PARITY_DIS = 0, + STICK_PARITY_EN = 2 +} UartExistParity; + +typedef enum { + BIT_RATE_9600 = 9600, + BIT_RATE_19200 = 19200, + BIT_RATE_38400 = 38400, + BIT_RATE_57600 = 57600, + BIT_RATE_115200 = 115200, + BIT_RATE_230400 = 230400, + BIT_RATE_460800 = 460800, + BIT_RATE_921600 = 921600 +} UartBautRate; + +typedef enum { + NONE_CTRL, + HARDWARE_CTRL, + XON_XOFF_CTRL +} UartFlowCtrl; + +typedef enum { + EMPTY, + UNDER_WRITE, + WRITE_OVER +} RcvMsgBuffState; + +typedef struct { + uint8_t *pRcvMsgBuff; + uint8_t *pWritePos; + uint8_t *pReadPos; + uint8_t TrigLvl; + RcvMsgBuffState BuffState; +} RcvMsgBuff; + +typedef struct { + uint32_t TrxBuffSize; + uint8_t *pTrxBuff; +} TrxMsgBuff; + +typedef enum { + BAUD_RATE_DET, + WAIT_SYNC_FRM, + SRCH_MSG_HEAD, + RCV_MSG_BODY, + RCV_ESC_CHAR, +} RcvMsgState; + +typedef struct { + UartBautRate baut_rate; + UartBitsNum4Char data_bits; + UartExistParity exist_parity; + UartParityMode parity; // chip size in byte + UartStopBitsNum stop_bits; + UartFlowCtrl flow_ctrl; + uint8_t buff_uart_no; //indicate which uart use tx/rx buffer + uint8_t tx_uart_no; + RcvMsgBuff rcv_buff; +// TrxMsgBuff trx_buff; + RcvMsgState rcv_state; + int received; +} UartDevice; + +/** + * @brief Init uart device struct value and reset uart0/uart1 rx. + * Please do not call this function in SDK. + * + * @param None + * + * @return None + */ +void uartAttach(void); + +/** + * @brief Init uart0 or uart1 for UART download booting mode. + * Please do not call this function in SDK. + * + * @param uint8_t uart_no : 0 for UART0, else for UART1. + * + * @param uint32_t clock : clock used by uart module, to adjust baudrate. + * + * @return None + */ +void Uart_Init(uint8_t uart_no, uint32_t clock); + +/** + * @brief Modify uart baudrate. + * This function will reset RX/TX fifo for uart. + * + * @param uint8_t uart_no : 0 for UART0, 1 for UART1. + * + * @param uint32_t DivLatchValue : (clock << 4)/baudrate. + * + * @return None + */ +void uart_div_modify(uint8_t uart_no, uint32_t DivLatchValue); + +/** + * @brief Init uart0 or uart1 for UART download booting mode. + * Please do not call this function in SDK. + * + * @param uint8_t uart_no : 0 for UART0, 1 for UART1. + * + * @param uint8_t is_sync : 0, only one UART module, easy to detect, wait until detected; + * 1, two UART modules, hard to detect, detect and return. + * + * @return None + */ +int uart_baudrate_detect(uint8_t uart_no, uint8_t is_sync); + +/** + * @brief Switch printf channel of uart_tx_one_char. + * Please do not call this function when printf. + * + * @param uint8_t uart_no : 0 for UART0, 1 for UART1. + * + * @return None + */ +void uart_tx_switch(uint8_t uart_no); + +/** + * @brief Switch message exchange channel for UART download booting. + * Please do not call this function in SDK. + * + * @param uint8_t uart_no : 0 for UART0, 1 for UART1. + * + * @return None + */ +void uart_buff_switch(uint8_t uart_no); + +/** + * @brief Output a char to printf channel, wait until fifo not full. + * + * @param None + * + * @return OK. + */ +STATUS uart_tx_one_char(uint8_t TxChar); + +/** + * @brief Output a char to message exchange channel, wait until fifo not full. + * Please do not call this function in SDK. + * + * @param None + * + * @return OK. + */ +STATUS uart_tx_one_char2(uint8_t TxChar); + +/** + * @brief Wait until uart tx full empty. + * + * @param uint8_t uart_no : 0 for UART0, 1 for UART1. + * + * @return None. + */ +void uart_tx_flush(uint8_t uart_no); + +/** + * @brief Wait until uart tx full empty and the last char send ok. + * + * @param uart_no : 0 for UART0, 1 for UART1, 2 for UART2 + * + * The function defined in ROM code has a bug, so we define the correct version + * here for compatibility. + */ +static inline void IRAM_ATTR uart_tx_wait_idle(uint8_t uart_no) { + uint32_t status; + do { + status = READ_PERI_REG(UART_STATUS_REG(uart_no)); + /* either tx count or state is non-zero */ + } while ((status & (UART_ST_UTX_OUT_M | UART_TXFIFO_CNT_M)) != 0); +} + +/** + * @brief Get an input char from message channel. + * Please do not call this function in SDK. + * + * @param uint8_t *pRxChar : the pointer to store the char. + * + * @return OK for successful. + * FAIL for failed. + */ +STATUS uart_rx_one_char(uint8_t *pRxChar); + +/** + * @brief Get an input char from message channel, wait until successful. + * Please do not call this function in SDK. + * + * @param None + * + * @return char : input char value. + */ +char uart_rx_one_char_block(void); + +/** + * @brief Get an input string line from message channel. + * Please do not call this function in SDK. + * + * @param uint8_t *pString : the pointer to store the string. + * + * @param uint8_t MaxStrlen : the max string length, include '\0'. + * + * @return OK. + */ +STATUS UartRxString(uint8_t *pString, uint8_t MaxStrlen); + +/** + * @brief Process uart received information in the interrupt handler. + * Please do not call this function in SDK. + * + * @param void *para : the message receive buffer. + * + * @return None + */ +void uart_rx_intr_handler(void *para); + +/** + * @brief Get an char from receive buffer. + * Please do not call this function in SDK. + * + * @param RcvMsgBuff *pRxBuff : the pointer to the struct that include receive buffer. + * + * @param uint8_t *pRxByte : the pointer to store the char. + * + * @return OK for successful. + * FAIL for failed. + */ +STATUS uart_rx_readbuff( RcvMsgBuff *pRxBuff, uint8_t *pRxByte); + +/** + * @brief Get all chars from receive buffer. + * Please do not call this function in SDK. + * + * @param uint8_t *pCmdLn : the pointer to store the string. + * + * @return OK for successful. + * FAIL for failed. + */ +STATUS UartGetCmdLn(uint8_t *pCmdLn); + +/** + * @brief Get uart configuration struct. + * Please do not call this function in SDK. + * + * @param None + * + * @return UartDevice * : uart configuration struct pointer. + */ +UartDevice *GetUartDevice(void); + +/** + * @brief Send an packet to download tool, with SLIP escaping. + * Please do not call this function in SDK. + * + * @param uint8_t *p : the pointer to output string. + * + * @param int len : the string length. + * + * @return None. + */ +void send_packet(uint8_t *p, int len); + +/** + * @brief Receive an packet from download tool, with SLIP escaping. + * Please do not call this function in SDK. + * + * @param uint8_t *p : the pointer to input string. + * + * @param int len : If string length > len, the string will be truncated. + * + * @param uint8_t is_sync : 0, only one UART module; + * 1, two UART modules. + * + * @return int : the length of the string. + */ +int recv_packet(uint8_t *p, int len, uint8_t is_sync); + +/** + * @brief Send an packet to download tool, with SLIP escaping. + * Please do not call this function in SDK. + * + * @param uint8_t *pData : the pointer to input string. + * + * @param uint16_t DataLen : the string length. + * + * @return OK for successful. + * FAIL for failed. + */ +STATUS SendMsg(uint8_t *pData, uint16_t DataLen); + +/** + * @brief Receive an packet from download tool, with SLIP escaping. + * Please do not call this function in SDK. + * + * @param uint8_t *pData : the pointer to input string. + * + * @param uint16_t MaxDataLen : If string length > MaxDataLen, the string will be truncated. + * + * @param uint8_t is_sync : 0, only one UART module; + * 1, two UART modules. + * + * @return OK for successful. + * FAIL for failed. + */ +STATUS RcvMsg(uint8_t *pData, uint16_t MaxDataLen, uint8_t is_sync); + +extern UartDevice UartDev; + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* _ROM_UART_H_ */ diff --git a/arch/xtensa/include/esp32/esp_wifi/esp_coexist.h b/arch/xtensa/include/esp32/esp_wifi/esp_coexist.h new file mode 100644 index 0000000000000..1ff624d9b5574 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_wifi/esp_coexist.h @@ -0,0 +1,93 @@ +// 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. + +#ifndef __ESP_COEXIST_H__ +#define __ESP_COEXIST_H__ + +#include +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief coex prefer value + */ +typedef enum { + ESP_COEX_PREFER_WIFI = 0, /*!< Prefer to WiFi, WiFi will have more opportunity to use RF */ + ESP_COEX_PREFER_BT, /*!< Prefer to bluetooth, bluetooth will have more opportunity to use RF */ + ESP_COEX_PREFER_BALANCE, /*!< Do balance of WiFi and bluetooth */ + ESP_COEX_PREFER_NUM, /*!< Prefer value numbers */ +} esp_coex_prefer_t; + +/** + * @brief coex status type + */ +typedef enum { + ESP_COEX_ST_TYPE_WIFI = 0, + ESP_COEX_ST_TYPE_BLE, + ESP_COEX_ST_TYPE_BT, +} esp_coex_status_type_t; + +#define ESP_COEX_BLE_ST_MESH_CONFIG 0x08 +#define ESP_COEX_BLE_ST_MESH_TRAFFIC 0x10 +#define ESP_COEX_BLE_ST_MESH_STANDBY 0x20 + +#define ESP_COEX_BT_ST_A2DP_STREAMING 0x10 +#define ESP_COEX_BT_ST_A2DP_PAUSED 0x20 + +/** + * @brief Get software coexist version string + * + * @return : version string + */ +const char *esp_coex_version_get(void); + +/** + * @deprecated Use esp_coex_status_bit_set() and esp_coex_status_bit_clear() instead. + * Set coexist preference of performance + * For example, if prefer to bluetooth, then it will make A2DP(play audio via classic bt) + * more smooth while wifi is runnning something. + * If prefer to wifi, it will do similar things as prefer to bluetooth. + * Default, it prefer to balance. + * + * @param prefer : the prefer enumeration value + * @return : ESP_OK - success, other - failed + */ +esp_err_t esp_coex_preference_set(esp_coex_prefer_t prefer); + +/** + * @brief Set coex schm status + * @param type : WIFI/BLE/BT + * @param status : WIFI/BLE/BT STATUS + * @return : ESP_OK - success, other - failed + */ +esp_err_t esp_coex_status_bit_set(esp_coex_status_type_t type, uint32_t status); + +/** + * @brief Clear coex schm status + * @param type : WIFI/BLE/BT + * @param status : WIFI/BLE/BT STATUS + * @return : ESP_OK - success, other - failed + */ +esp_err_t esp_coex_status_bit_clear(esp_coex_status_type_t type, uint32_t status); + + +#ifdef __cplusplus +} +#endif + + +#endif /* __ESP_COEXIST_H__ */ diff --git a/arch/xtensa/include/esp32/esp_wifi/esp_coexist_adapter.h b/arch/xtensa/include/esp32/esp_wifi/esp_coexist_adapter.h new file mode 100644 index 0000000000000..f2a38c31e6310 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_wifi/esp_coexist_adapter.h @@ -0,0 +1,59 @@ +// 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. + +#ifndef __ESP_COEXIST_ADAPTER_H__ +#define __ESP_COEXIST_ADAPTER_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define COEX_ADAPTER_VERSION 0x00000001 +#define COEX_ADAPTER_MAGIC 0xDEADBEAF + +#define COEX_ADAPTER_FUNCS_TIME_BLOCKING 0xffffffff + +typedef struct { + int32_t _version; + void *(* _spin_lock_create)(void); + void (* _spin_lock_delete)(void *lock); + uint32_t (*_int_disable)(void *mux); + void (*_int_enable)(void *mux, uint32_t tmp); + void (*_task_yield_from_isr)(void); + void *(*_semphr_create)(uint32_t max, uint32_t init); + void (*_semphr_delete)(void *semphr); + int32_t (*_semphr_take_from_isr)(void *semphr, void *hptw); + int32_t (*_semphr_give_from_isr)(void *semphr, void *hptw); + int32_t (*_semphr_take)(void *semphr, uint32_t block_time_tick); + int32_t (*_semphr_give)(void *semphr); + int32_t (* _is_in_isr)(void); + void * (* _malloc_internal)(size_t size); + void (* _free)(void *p); + void (* _timer_disarm)(void *timer); + void (* _timer_done)(void *ptimer); + void (* _timer_setfn)(void *ptimer, void *pfunction, void *parg); + void (* _timer_arm_us)(void *ptimer, uint32_t us, bool repeat); + int64_t (* _esp_timer_get_time)(void); + int32_t _magic; +} coex_adapter_funcs_t; + +extern coex_adapter_funcs_t g_coex_adapter_funcs; + +#ifdef __cplusplus +} +#endif + +#endif /* __ESP_COEXIST_ADAPTER_H__ */ diff --git a/arch/xtensa/include/esp32/esp_wifi/esp_coexist_internal.h b/arch/xtensa/include/esp32/esp_wifi/esp_coexist_internal.h new file mode 100644 index 0000000000000..bdd023a93d974 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_wifi/esp_coexist_internal.h @@ -0,0 +1,177 @@ +// Copyright 2018-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 __ESP_COEXIST_INTERNAL_H__ +#define __ESP_COEXIST_INTERNAL_H__ + +#include +#include "esp_coexist_adapter.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + COEX_PREFER_WIFI = 0, + COEX_PREFER_BT, + COEX_PREFER_BALANCE, + COEX_PREFER_NUM, +} coex_prefer_t; + +typedef void (* coex_func_cb_t)(uint32_t event, int sched_cnt); + +/** + * @brief Pre-Init software coexist + * extern function for internal use. + * + * @return Init ok or failed. + */ +esp_err_t coex_pre_init(void); + +/** + * @brief Init software coexist + * extern function for internal use. + * + * @return Init ok or failed. + */ +esp_err_t coex_init(void); + +/** + * @brief De-init software coexist + * extern function for internal use. + */ +void coex_deinit(void); + +/** + * @brief Pause software coexist + * extern function for internal use. + */ +void coex_pause(void); + +/** + * @brief Resume software coexist + * extern function for internal use. + */ +void coex_resume(void); + +/** + * @brief Get software coexist version string + * extern function for internal use. + * @return : version string + */ +const char *coex_version_get(void); + +/** + * @brief Coexist performance preference set from libbt.a + * extern function for internal use. + * + * @param prefer : the prefer enumeration value + * @return : ESP_OK - success, other - failed + */ +esp_err_t coex_preference_set(coex_prefer_t prefer); + +/** + * @brief Get software coexist status. + * @return : software coexist status + */ +uint32_t coex_status_get(void); + +/** + * @brief Set software coexist condition. + * @return : software coexist condition + */ +void coex_condition_set(uint32_t type, bool dissatisfy); + +/** + * @brief WiFi requests coexistence. + * + * @param event : WiFi event + * @param latency : WiFi will request coexistence after latency + * @param duration : duration for WiFi to request coexistence + * @return : 0 - success, other - failed + */ +int coex_wifi_request(uint32_t event, uint32_t latency, uint32_t duration); + +/** + * @brief WiFi release coexistence. + * + * @param event : WiFi event + * @return : 0 - success, other - failed + */ +int coex_wifi_release(uint32_t event); + +/** + * @brief Blue tooth requests coexistence. + * + * @param event : blue tooth event + * @param latency : blue tooth will request coexistence after latency + * @param duration : duration for blue tooth to request coexistence + * @return : 0 - success, other - failed + */ +int coex_bt_request(uint32_t event, uint32_t latency, uint32_t duration); + +/** + * @brief Blue tooth release coexistence. + * + * @param event : blue tooth event + * @return : 0 - success, other - failed + */ +int coex_bt_release(uint32_t event); + +/** + * @brief Register callback function for blue tooth. + * + * @param cb : callback function + * @return : 0 - success, other - failed + */ +int coex_register_bt_cb(coex_func_cb_t cb); + +/** + * @brief Lock before reset base band. + * + * @return : lock value + */ +uint32_t coex_bb_reset_lock(void); + +/** + * @brief Unlock after reset base band. + * + * @param restore : lock value + */ +void coex_bb_reset_unlock(uint32_t restore); + +/** + * @brief Register coexistence adapter functions. + * + * @param funcs : coexistence adapter functions + * @return : ESP_OK - success, other - failed + */ +esp_err_t esp_coex_adapter_register(coex_adapter_funcs_t *funcs); + +/** + * @brief Check the MD5 values of the coexistence adapter header files in IDF and WiFi library + * + * @attention 1. It is used for internal CI version check + * + * @return + * - ESP_OK : succeed + * - ESP_WIFI_INVALID_ARG : MD5 check fail + */ +esp_err_t esp_coex_adapter_funcs_md5_check(const char *md5); + +#ifdef __cplusplus +} +#endif + +#endif /* __ESP_COEXIST_INTERNAL_H__ */ diff --git a/arch/xtensa/include/esp32/esp_wifi/esp_mesh.h b/arch/xtensa/include/esp32/esp_wifi/esp_mesh.h new file mode 100644 index 0000000000000..3b11883c4ca73 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_wifi/esp_mesh.h @@ -0,0 +1,1460 @@ +// 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. + +/* + * Software Stack demonstrated: + * |------------------------------------------------------------------------------| + * | | | + * | | Application | + * | |-----------------------------------------------------------------| + * | | | Protocols: | | | | | + * | | Mesh Stack | HTTP, DNS, | | | Other | | + * | RTOS: | (Networking, | DHCP, ... | | | Components | | + * | (freeRTOS) | self-healing, |------------| | | | | + * | | flow control, | Network Stack: | | | | + * | | ...) | (LwIP) | | | | + * | |-----------------------------------| |---------------| | + * | | | | + * | | Wi-Fi Driver | | + * | |--------------------------------------------------| | + * | | | + * | | Platform HAL | + * |------------------------------------------------------------------------------| + * + * System Events delivery: + * + * |---------------| + * | | default handler + * | Wi-Fi stack | events |---------------------| + * | | -------------> | | + * |---------------| | | + * | event task | + * |---------------| events | | + * | | -------------> | | + * | LwIP stack | |---------------------| + * | |--------| + * |---------------| | + * | mesh event callback handler + * | |----------------------------| + * |-----> | | + * |---------------| | application | + * | | events | task | + * | mesh stack | -------------> | | + * | | |----------------------------| + * |---------------| + * + * + * Mesh Stack + * + * Mesh event defines almost all system events applications tasks need. + * Mesh event contains Wi-Fi connection states on station interface, children connection states on softAP interface and etc.. + * Applications need to register a mesh event callback handler by API esp_mesh_set_config() firstly. + * This handler is to receive events posted from mesh stack and LwIP stack. + * Applications could add relative handler for each event. + * Examples: + * (1) Applications could use Wi-Fi station connect states to decide when to send data to its parent, to the root or to external IP network; + * (2) Applications could use Wi-Fi softAP states to decide when to send data to its children. + * + * In present implementation, applications are able to access mesh stack directly without having to go through LwIP stack. + * Applications use esp_mesh_send() and esp_mesh_recv() to send and receive messages over the mesh network. + * In mesh stack design, normal devices don't require LwIP stack. But since IDF hasn't supported system without initializing LwIP stack yet, + * applications still need to do LwIP initialization and two more things are required to be done + * (1) stop DHCP server on softAP interface by default + * (2) stop DHCP client on station interface by default. + * Examples: + * tcpip_adapter_init(); + * tcpip_adapter_dhcps_stop(TCPIP_ADAPTER_IF_AP); + * tcpip_adapter_dhcpc_stop(TCPIP_ADAPTER_IF_STA); + * + * Over the mesh network, only the root is able to access external IP network. + * In application mesh event handler, once a device becomes a root, start DHCP client immediately whether DHCP is chosen. + */ + +#ifndef __ESP_MESH_H__ +#define __ESP_MESH_H__ + +#include "esp_err.h" +#include "esp_wifi.h" +#include "esp_wifi_types.h" +#include "esp_mesh_internal.h" +#include "lwip/ip_addr.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/******************************************************* + * Constants + *******************************************************/ +#define MESH_ROOT_LAYER (1) /**< root layer value */ +#define MESH_MTU (1500) /**< max transmit unit(in bytes) */ +#define MESH_MPS (1472) /**< max payload size(in bytes) */ +/** + * @brief Mesh error code definition + */ +#define ESP_ERR_MESH_WIFI_NOT_START (ESP_ERR_MESH_BASE + 1) /**< Wi-Fi isn't started */ +#define ESP_ERR_MESH_NOT_INIT (ESP_ERR_MESH_BASE + 2) /**< mesh isn't initialized */ +#define ESP_ERR_MESH_NOT_CONFIG (ESP_ERR_MESH_BASE + 3) /**< mesh isn't configured */ +#define ESP_ERR_MESH_NOT_START (ESP_ERR_MESH_BASE + 4) /**< mesh isn't started */ +#define ESP_ERR_MESH_NOT_SUPPORT (ESP_ERR_MESH_BASE + 5) /**< not supported yet */ +#define ESP_ERR_MESH_NOT_ALLOWED (ESP_ERR_MESH_BASE + 6) /**< operation is not allowed */ +#define ESP_ERR_MESH_NO_MEMORY (ESP_ERR_MESH_BASE + 7) /**< out of memory */ +#define ESP_ERR_MESH_ARGUMENT (ESP_ERR_MESH_BASE + 8) /**< illegal argument */ +#define ESP_ERR_MESH_EXCEED_MTU (ESP_ERR_MESH_BASE + 9) /**< packet size exceeds MTU */ +#define ESP_ERR_MESH_TIMEOUT (ESP_ERR_MESH_BASE + 10) /**< timeout */ +#define ESP_ERR_MESH_DISCONNECTED (ESP_ERR_MESH_BASE + 11) /**< disconnected with parent on station interface */ +#define ESP_ERR_MESH_QUEUE_FAIL (ESP_ERR_MESH_BASE + 12) /**< queue fail */ +#define ESP_ERR_MESH_QUEUE_FULL (ESP_ERR_MESH_BASE + 13) /**< queue full */ +#define ESP_ERR_MESH_NO_PARENT_FOUND (ESP_ERR_MESH_BASE + 14) /**< no parent found to join the mesh network */ +#define ESP_ERR_MESH_NO_ROUTE_FOUND (ESP_ERR_MESH_BASE + 15) /**< no route found to forward the packet */ +#define ESP_ERR_MESH_OPTION_NULL (ESP_ERR_MESH_BASE + 16) /**< no option found */ +#define ESP_ERR_MESH_OPTION_UNKNOWN (ESP_ERR_MESH_BASE + 17) /**< unknown option */ +#define ESP_ERR_MESH_XON_NO_WINDOW (ESP_ERR_MESH_BASE + 18) /**< no window for software flow control on upstream */ +#define ESP_ERR_MESH_INTERFACE (ESP_ERR_MESH_BASE + 19) /**< low-level Wi-Fi interface error */ +#define ESP_ERR_MESH_DISCARD_DUPLICATE (ESP_ERR_MESH_BASE + 20) /**< discard the packet due to the duplicate sequence number */ +#define ESP_ERR_MESH_DISCARD (ESP_ERR_MESH_BASE + 21) /**< discard the packet */ +#define ESP_ERR_MESH_VOTING (ESP_ERR_MESH_BASE + 22) /**< vote in progress */ + +/** + * @brief Flags bitmap for esp_mesh_send() and esp_mesh_recv() + */ +#define MESH_DATA_ENC (0x01) /**< data encrypted (Unimplemented) */ +#define MESH_DATA_P2P (0x02) /**< point-to-point delivery over the mesh network */ +#define MESH_DATA_FROMDS (0x04) /**< receive from external IP network */ +#define MESH_DATA_TODS (0x08) /**< identify this packet is target to external IP network */ +#define MESH_DATA_NONBLOCK (0x10) /**< esp_mesh_send() non-block */ +#define MESH_DATA_DROP (0x20) /**< in the situation of the root having been changed, identify this packet can be dropped by new root */ +#define MESH_DATA_GROUP (0x40) /**< identify this packet is target to a group address */ + +/** + * @brief Option definitions for esp_mesh_send() and esp_mesh_recv() + */ +#define MESH_OPT_SEND_GROUP (7) /**< data transmission by group; used with esp_mesh_send() and shall have payload */ +#define MESH_OPT_RECV_DS_ADDR (8) /**< return a remote IP address; used with esp_mesh_send() and esp_mesh_recv() */ + +/** + * @brief Flag of mesh networking IE + */ +#define MESH_ASSOC_FLAG_VOTE_IN_PROGRESS (0x02) /**< vote in progress */ +#define MESH_ASSOC_FLAG_NETWORK_FREE (0x08) /**< no root in current network */ +#define MESH_ASSOC_FLAG_ROOTS_FOUND (0x20) /**< root conflict is found */ +#define MESH_ASSOC_FLAG_ROOT_FIXED (0x40) /**< fixed root */ + +/******************************************************* + * Enumerations + *******************************************************/ +/** + * @brief Enumerated list of mesh event id + */ +typedef enum { + MESH_EVENT_STARTED, /**< mesh is started */ + MESH_EVENT_STOPPED, /**< mesh is stopped */ + MESH_EVENT_CHANNEL_SWITCH, /**< channel switch */ + MESH_EVENT_CHILD_CONNECTED, /**< a child is connected on softAP interface */ + MESH_EVENT_CHILD_DISCONNECTED, /**< a child is disconnected on softAP interface */ + MESH_EVENT_ROUTING_TABLE_ADD, /**< routing table is changed by adding newly joined children */ + MESH_EVENT_ROUTING_TABLE_REMOVE, /**< routing table is changed by removing leave children */ + MESH_EVENT_PARENT_CONNECTED, /**< parent is connected on station interface */ + MESH_EVENT_PARENT_DISCONNECTED, /**< parent is disconnected on station interface */ + MESH_EVENT_NO_PARENT_FOUND, /**< no parent found */ + MESH_EVENT_LAYER_CHANGE, /**< layer changes over the mesh network */ + MESH_EVENT_TODS_STATE, /**< state represents whether the root is able to access external IP network */ + MESH_EVENT_VOTE_STARTED, /**< the process of voting a new root is started either by children or by the root */ + MESH_EVENT_VOTE_STOPPED, /**< the process of voting a new root is stopped */ + MESH_EVENT_ROOT_ADDRESS, /**< the root address is obtained. It is posted by mesh stack automatically. */ + MESH_EVENT_ROOT_SWITCH_REQ, /**< root switch request sent from a new voted root candidate */ + MESH_EVENT_ROOT_SWITCH_ACK, /**< root switch acknowledgment responds the above request sent from current root */ + MESH_EVENT_ROOT_ASKED_YIELD, /**< the root is asked yield by a more powerful existing root. If self organized is disabled + and this device is specified to be a root by users, users should set a new parent + for this device. if self organized is enabled, this device will find a new parent + by itself, users could ignore this event. */ + MESH_EVENT_ROOT_FIXED, /**< when devices join a network, if the setting of Fixed Root for one device is different + from that of its parent, the device will update the setting the same as its parent's. + Fixed Root Setting of each device is variable as that setting changes of the root. */ + MESH_EVENT_SCAN_DONE, /**< if self-organized networking is disabled, user can call esp_wifi_scan_start() to trigger + this event, and add the corresponding scan done handler in this event. */ + MESH_EVENT_NETWORK_STATE, /**< network state, such as whether current mesh network has a root. */ + MESH_EVENT_STOP_RECONNECTION, /**< the root stops reconnecting to the router and non-root devices stop reconnecting to their parents. */ + MESH_EVENT_FIND_NETWORK, /**< when the channel field in mesh configuration is set to zero, mesh stack will perform a + full channel scan to find a mesh network that can join, and return the channel value + after finding it. */ + MESH_EVENT_ROUTER_SWITCH, /**< if users specify BSSID of the router in mesh configuration, when the root connects to another + router with the same SSID, this event will be posted and the new router information is attached. */ + MESH_EVENT_MAX, +} mesh_event_id_t; + +/** @brief ESP-MESH event base declaration */ +ESP_EVENT_DECLARE_BASE(MESH_EVENT); + +/** + * @brief Device type + */ +typedef enum { + MESH_IDLE, /**< hasn't joined the mesh network yet */ + MESH_ROOT, /**< the only sink of the mesh network. Has the ability to access external IP network */ + MESH_NODE, /**< intermediate device. Has the ability to forward packets over the mesh network */ + MESH_LEAF, /**< has no forwarding ability */ +} mesh_type_t; + +/** + * @brief Protocol of transmitted application data + */ +typedef enum { + MESH_PROTO_BIN, /**< binary */ + MESH_PROTO_HTTP, /**< HTTP protocol */ + MESH_PROTO_JSON, /**< JSON format */ + MESH_PROTO_MQTT, /**< MQTT protocol */ +} mesh_proto_t; + +/** + * @brief For reliable transmission, mesh stack provides three type of services + */ +typedef enum { + MESH_TOS_P2P, /**< provide P2P (point-to-point) retransmission on mesh stack by default */ + MESH_TOS_E2E, /**< provide E2E (end-to-end) retransmission on mesh stack (Unimplemented) */ + MESH_TOS_DEF, /**< no retransmission on mesh stack */ +} mesh_tos_t; + +/** + * @brief Vote reason + */ +typedef enum { + MESH_VOTE_REASON_ROOT_INITIATED = 1, /**< vote is initiated by the root */ + MESH_VOTE_REASON_CHILD_INITIATED, /**< vote is initiated by children */ +} mesh_vote_reason_t; + +/** + * @brief Mesh disconnect reason code + */ +typedef enum { + MESH_REASON_CYCLIC = 100, /**< cyclic is detected */ + MESH_REASON_PARENT_IDLE, /**< parent is idle */ + MESH_REASON_LEAF, /**< the connected device is changed to a leaf */ + MESH_REASON_DIFF_ID, /**< in different mesh ID */ + MESH_REASON_ROOTS, /**< root conflict is detected */ + MESH_REASON_PARENT_STOPPED, /**< parent has stopped the mesh */ + MESH_REASON_SCAN_FAIL, /**< scan fail */ + MESH_REASON_IE_UNKNOWN, /**< unknown IE */ + MESH_REASON_WAIVE_ROOT, /**< waive root */ + MESH_REASON_PARENT_WORSE, /**< parent with very poor RSSI */ + MESH_REASON_EMPTY_PASSWORD, /**< use an empty password to connect to an encrypted parent */ + MESH_REASON_PARENT_UNENCRYPTED, /**< connect to an unencrypted parent/router */ +} mesh_disconnect_reason_t; + +/******************************************************* + * Structures + *******************************************************/ +/** + * @brief IP address and port + */ +typedef struct { + ip4_addr_t ip4; /**< IP address */ + uint16_t port; /**< port */ +} __attribute__((packed)) mip_t; + +/** + * @brief Mesh address + */ +typedef union { + uint8_t addr[6]; /**< mac address */ + mip_t mip; /**< mip address */ +} mesh_addr_t; + +/** + * @brief Channel switch information + */ +typedef struct { + uint8_t channel; /**< new channel */ +} mesh_event_channel_switch_t; + +/** + * @brief Parent connected information + */ +typedef struct { + wifi_event_sta_connected_t connected; /**< parent information, same as Wi-Fi event SYSTEM_EVENT_STA_CONNECTED does */ + uint8_t self_layer; /**< layer */ +} mesh_event_connected_t; + +/** + * @brief No parent found information + */ +typedef struct { + int scan_times; /**< scan times being through */ +} mesh_event_no_parent_found_t; + +/** + * @brief Layer change information + */ +typedef struct { + uint8_t new_layer; /**< new layer */ +} mesh_event_layer_change_t; + +/** + * @brief The reachability of the root to a DS (distribute system) + */ +typedef enum { + MESH_TODS_UNREACHABLE, /**< the root isn't able to access external IP network */ + MESH_TODS_REACHABLE, /**< the root is able to access external IP network */ +} mesh_event_toDS_state_t; + +/** + * @brief vote started information + */ +typedef struct { + int reason; /**< vote reason, vote could be initiated by children or by the root itself */ + int attempts; /**< max vote attempts before stopped */ + mesh_addr_t rc_addr; /**< root address specified by users via API esp_mesh_waive_root() */ +} mesh_event_vote_started_t; + +/** + * @brief find a mesh network that this device can join + */ +typedef struct { + uint8_t channel; /**< channel number of the new found network */ + uint8_t router_bssid[6]; /**< router BSSID */ +} mesh_event_find_network_t; + +/** + * @brief Root address + */ +typedef mesh_addr_t mesh_event_root_address_t; + +/** + * @brief Parent disconnected information + */ +typedef wifi_event_sta_disconnected_t mesh_event_disconnected_t; + +/** + * @brief Child connected information + */ +typedef wifi_event_ap_staconnected_t mesh_event_child_connected_t; + +/** + * @brief Child disconnected information + */ +typedef wifi_event_ap_stadisconnected_t mesh_event_child_disconnected_t; + +/** + * @brief Root switch request information + */ +typedef struct { + int reason; /**< root switch reason, generally root switch is initialized by users via API esp_mesh_waive_root() */ + mesh_addr_t rc_addr; /**< the address of root switch requester */ +} mesh_event_root_switch_req_t; + +/** + * @brief Other powerful root address + */ +typedef struct { + int8_t rssi; /**< rssi with router */ + uint16_t capacity; /**< the number of devices in current network */ + uint8_t addr[6]; /**< other powerful root address */ +} mesh_event_root_conflict_t; + +/** + * @brief Routing table change + */ +typedef struct { + uint16_t rt_size_new; /**< the new value */ + uint16_t rt_size_change; /**< the changed value */ +} mesh_event_routing_table_change_t; + +/** + * @brief Root fixed + */ +typedef struct { + bool is_fixed; /**< status */ +} mesh_event_root_fixed_t; + +/** + * @brief Scan done event information + */ +typedef struct { + uint8_t number; /**< the number of APs scanned */ +} mesh_event_scan_done_t; + +/** + * @brief Network state information + */ +typedef struct { + bool is_rootless; /**< whether current mesh network has a root */ +} mesh_event_network_state_t; + +/** + * @brief New router information + */ +typedef wifi_event_sta_connected_t mesh_event_router_switch_t; + +/** + * @brief Mesh event information + */ +typedef union { + mesh_event_channel_switch_t channel_switch; /**< channel switch */ + mesh_event_child_connected_t child_connected; /**< child connected */ + mesh_event_child_disconnected_t child_disconnected; /**< child disconnected */ + mesh_event_routing_table_change_t routing_table; /**< routing table change */ + mesh_event_connected_t connected; /**< parent connected */ + mesh_event_disconnected_t disconnected; /**< parent disconnected */ + mesh_event_no_parent_found_t no_parent; /**< no parent found */ + mesh_event_layer_change_t layer_change; /**< layer change */ + mesh_event_toDS_state_t toDS_state; /**< toDS state, devices shall check this state firstly before trying to send packets to + external IP network. This state indicates right now whether the root is capable of sending + packets out. If not, devices had better to wait until this state changes to be + MESH_TODS_REACHABLE. */ + mesh_event_vote_started_t vote_started; /**< vote started */ + //mesh_event_root_got_ip_t got_ip; /**< root obtains IP address */ + mesh_event_root_address_t root_addr; /**< root address */ + mesh_event_root_switch_req_t switch_req; /**< root switch request */ + mesh_event_root_conflict_t root_conflict; /**< other powerful root */ + mesh_event_root_fixed_t root_fixed; /**< fixed root */ + mesh_event_scan_done_t scan_done; /**< scan done */ + mesh_event_network_state_t network_state; /**< network state, such as whether current mesh network has a root. */ + mesh_event_find_network_t find_network; /**< network found that can join */ + mesh_event_router_switch_t router_switch; /**< new router information */ +} mesh_event_info_t; + +/** + * @brief Mesh option + */ +typedef struct { + uint8_t type; /**< option type */ + uint16_t len; /**< option length */ + uint8_t *val; /**< option value */ +} __attribute__((packed)) mesh_opt_t; + +/** + * @brief Mesh data for esp_mesh_send() and esp_mesh_recv() + */ +typedef struct { + uint8_t *data; /**< data */ + uint16_t size; /**< data size */ + mesh_proto_t proto; /**< data protocol */ + mesh_tos_t tos; /**< data type of service */ +} mesh_data_t; + +/** + * @brief Router configuration + */ +typedef struct { + uint8_t ssid[32]; /**< SSID */ + uint8_t ssid_len; /**< length of SSID */ + uint8_t bssid[6]; /**< BSSID, if this value is specified, users should also specify "allow_router_switch". */ + uint8_t password[64]; /**< password */ + bool allow_router_switch; /**< if the BSSID is specified and this value is also set, when the router of this specified BSSID + fails to be found after "fail" (mesh_attempts_t) times, the whole network is allowed to switch + to another router with the same SSID. The new router might also be on a different channel. + The default value is false. + There is a risk that if the password is different between the new switched router and the previous + one, the mesh network could be established but the root will never connect to the new switched router. */ +} mesh_router_t; + +/** + * @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 */ +} mesh_ap_cfg_t; + +/** + * @brief Mesh initialization configuration + */ +typedef struct { + uint8_t channel; /**< channel, the mesh network on */ + bool allow_channel_switch; /**< if this value is set, when "fail" (mesh_attempts_t) times is reached, device will change to + a full channel scan for a network that could join. The default value is false. */ + mesh_addr_t mesh_id; /**< mesh network identification */ + mesh_router_t router; /**< router configuration */ + mesh_ap_cfg_t mesh_ap; /**< mesh softAP configuration */ + const mesh_crypto_funcs_t *crypto_funcs; /**< crypto functions */ +} mesh_cfg_t; + +/** + * @brief Vote address configuration + */ +typedef union { + int attempts; /**< max vote attempts before a new root is elected automatically by mesh network. (min:15, 15 by default) */ + mesh_addr_t rc_addr; /**< a new root address specified by users for API esp_mesh_waive_root() */ +} mesh_rc_config_t; + +/** + * @brief Vote + */ +typedef struct { + float percentage; /**< vote percentage threshold for approval of being a root */ + bool is_rc_specified; /**< if true, rc_addr shall be specified (Unimplemented). + if false, attempts value shall be specified to make network start root election. */ + mesh_rc_config_t config; /**< vote address configuration */ +} mesh_vote_t; + +/** + * @brief The number of packets pending in the queue waiting to be sent by the mesh stack + */ +typedef struct { + int to_parent; /**< to parent queue */ + int to_parent_p2p; /**< to parent (P2P) queue */ + int to_child; /**< to child queue */ + int to_child_p2p; /**< to child (P2P) queue */ + int mgmt; /**< management queue */ + int broadcast; /**< broadcast and multicast queue */ +} mesh_tx_pending_t; + +/** + * @brief The number of packets available in the queue waiting to be received by applications + */ +typedef struct { + int toDS; /**< to external DS */ + int toSelf; /**< to self */ +} mesh_rx_pending_t; + +/******************************************************* + * Variable Declaration + *******************************************************/ +/* mesh IE crypto callback function */ +extern const mesh_crypto_funcs_t g_wifi_default_mesh_crypto_funcs; + +#define MESH_INIT_CONFIG_DEFAULT() { \ + .crypto_funcs = &g_wifi_default_mesh_crypto_funcs, \ +} + +/******************************************************* + * Function Definitions + *******************************************************/ +/** + * @brief Mesh initialization + * - Check whether Wi-Fi is started. + * - Initialize mesh global variables with default values. + * + * @attention This API shall be called after Wi-Fi is started. + * + * @return + * - ESP_OK + * - ESP_FAIL + */ +esp_err_t esp_mesh_init(void); + +/** + * @brief Mesh de-initialization + * + * - Release resources and stop the mesh + * + * @return + * - ESP_OK + * - ESP_FAIL + */ +esp_err_t esp_mesh_deinit(void); + +/** + * @brief Start mesh + * - Initialize mesh IE. + * - Start mesh network management service. + * - Create TX and RX queues according to the configuration. + * - Register mesh packets receive callback. + * + * @attention  This API shall be called after mesh initialization and configuration. + * + * @return + * - ESP_OK + * - ESP_FAIL + * - ESP_ERR_MESH_NOT_INIT + * - ESP_ERR_MESH_NOT_CONFIG + * - ESP_ERR_MESH_NO_MEMORY + */ +esp_err_t esp_mesh_start(void); + +/** + * @brief Stop mesh + * - Deinitialize mesh IE. + * - Disconnect with current parent. + * - Disassociate all currently associated children. + * - Stop mesh network management service. + * - Unregister mesh packets receive callback. + * - Delete TX and RX queues. + * - Release resources. + * - Restore Wi-Fi softAP to default settings if Wi-Fi dual mode is enabled. + * + * @return + * - ESP_OK + * - ESP_FAIL + */ +esp_err_t esp_mesh_stop(void); + +/** + * @brief Send a packet over the mesh network + * - Send a packet to any device in the mesh network. + * - Send a packet to external IP network. + * + * @attention This API is not reentrant. + * + * @param[in] to the address of the final destination of the packet + * - If the packet is to the root, set this parameter to NULL. + * - If the packet is to an external IP network, set this parameter to the IPv4:PORT combination. + * This packet will be delivered to the root firstly, then the root will forward this packet to the final IP server address. + * @param[in] data pointer to a sending mesh packet + * - Field size should not exceed MESH_MPS. Note that the size of one mesh packet should not exceed MESH_MTU. + * - Field proto should be set to data protocol in use (default is MESH_PROTO_BIN for binary). + * - Field tos should be set to transmission tos (type of service) in use (default is MESH_TOS_P2P for point-to-point reliable). + * @param[in] flag bitmap for data sent + * - Speed up the route search + * - If the packet is to the root and "to" parameter is NULL, set this parameter to 0. + * - If the packet is to an internal device, MESH_DATA_P2P should be set. + * - If the packet is to the root ("to" parameter isn't NULL) or to external IP network, MESH_DATA_TODS should be set. + * - If the packet is from the root to an internal device, MESH_DATA_FROMDS should be set. + * - Specify whether this API is block or non-block, block by default + * - If needs non-block, MESH_DATA_NONBLOCK should be set. + * - In the situation of the root change, MESH_DATA_DROP identifies this packet can be dropped by the new root + * for upstream data to external IP network, we try our best to avoid data loss caused by the root change, but + * there is a risk that the new root is running out of memory because most of memory is occupied by the pending data which + * isn't read out in time by esp_mesh_recv_toDS(). + * + * Generally, we suggest esp_mesh_recv_toDS() is called after a connection with IP network is created. Thus data outgoing + * to external IP network via socket is just from reading esp_mesh_recv_toDS() which avoids unnecessary memory copy. + * + * @param[in] opt options + * - In case of sending a packet to a certain group, MESH_OPT_SEND_GROUP is a good choice. + * In this option, the value field should be set to the target receiver addresses in this group. + * - Root sends a packet to an internal device, this packet is from external IP network in case the receiver device responds + * this packet, MESH_OPT_RECV_DS_ADDR is required to attach the target DS address. + * @param[in] opt_count option count + * - Currently, this API only takes one option, so opt_count is only supported to be 1. + * + * @return + * - ESP_OK + * - ESP_FAIL + * - ESP_ERR_MESH_ARGUMENT + * - ESP_ERR_MESH_NOT_START + * - ESP_ERR_MESH_DISCONNECTED + * - ESP_ERR_MESH_OPT_UNKNOWN + * - ESP_ERR_MESH_EXCEED_MTU + * - ESP_ERR_MESH_NO_MEMORY + * - ESP_ERR_MESH_TIMEOUT + * - ESP_ERR_MESH_QUEUE_FULL + * - ESP_ERR_MESH_NO_ROUTE_FOUND + * - ESP_ERR_MESH_DISCARD + */ +esp_err_t esp_mesh_send(const mesh_addr_t *to, const mesh_data_t *data, + int flag, const mesh_opt_t opt[], int opt_count); + +/** + * @brief Receive a packet targeted to self over the mesh network + * + * @attention Mesh RX queue should be checked regularly to avoid running out of memory. + * - Use esp_mesh_get_rx_pending() to check the number of packets available in the queue waiting + * to be received by applications. + * + * @param[out] from the address of the original source of the packet + * @param[out] data pointer to the received mesh packet + * - Field proto is the data protocol in use. Should follow it to parse the received data. + * - Field tos is the transmission tos (type of service) in use. + * @param[in] timeout_ms wait time if a packet isn't immediately available (0:no wait, portMAX_DELAY:wait forever) + * @param[out] flag bitmap for data received + * - MESH_DATA_FROMDS represents data from external IP network + * - MESH_DATA_TODS represents data directed upward within the mesh network + * + * flag could be MESH_DATA_FROMDS or MESH_DATA_TODS. + * @param[out] opt options desired to receive + * - MESH_OPT_RECV_DS_ADDR attaches the DS address + * @param[in] opt_count option count desired to receive + * - Currently, this API only takes one option, so opt_count is only supported to be 1. + * + * @return + * - ESP_OK + * - ESP_ERR_MESH_ARGUMENT + * - ESP_ERR_MESH_NOT_START + * - ESP_ERR_MESH_TIMEOUT + * - ESP_ERR_MESH_DISCARD + */ +esp_err_t esp_mesh_recv(mesh_addr_t *from, mesh_data_t *data, int timeout_ms, + int *flag, mesh_opt_t opt[], int opt_count); + +/** + * @brief Receive a packet targeted to external IP network + * - Root uses this API to receive packets destined to external IP network + * - Root forwards the received packets to the final destination via socket. + * - If no socket connection is ready to send out the received packets and this esp_mesh_recv_toDS() + * hasn't been called by applications, packets from the whole mesh network will be pending in toDS queue. + * + * Use esp_mesh_get_rx_pending() to check the number of packets available in the queue waiting + * to be received by applications in case of running out of memory in the root. + * + * Using esp_mesh_set_xon_qsize() users may configure the RX queue size, default:32. If this size is too large, + * and esp_mesh_recv_toDS() isn't called in time, there is a risk that a great deal of memory is occupied + * by the pending packets. If this size is too small, it will impact the efficiency on upstream. How to + * decide this value depends on the specific application scenarios. + * + * @attention This API is only called by the root. + * + * @param[out] from the address of the original source of the packet + * @param[out] to the address contains remote IP address and port (IPv4:PORT) + * @param[out] data pointer to the received packet + * - Contain the protocol and applications should follow it to parse the data. + * @param[in] timeout_ms wait time if a packet isn't immediately available (0:no wait, portMAX_DELAY:wait forever) + * @param[out] flag bitmap for data received + * - MESH_DATA_TODS represents the received data target to external IP network. Root shall forward this data to external IP network via the association with router. + * + * flag could be MESH_DATA_TODS. + * @param[out] opt options desired to receive + * @param[in] opt_count option count desired to receive + * + * @return + * - ESP_OK + * - ESP_ERR_MESH_ARGUMENT + * - ESP_ERR_MESH_NOT_START + * - ESP_ERR_MESH_TIMEOUT + * - ESP_ERR_MESH_DISCARD + */ +esp_err_t esp_mesh_recv_toDS(mesh_addr_t *from, mesh_addr_t *to, + mesh_data_t *data, int timeout_ms, int *flag, mesh_opt_t opt[], + int opt_count); + +/** + * @brief Set mesh stack configuration + * - Use MESH_INIT_CONFIG_DEFAULT() to initialize the default values, mesh IE is encrypted by default. + * - Mesh network is established on a fixed channel (1-14). + * - Mesh event callback is mandatory. + * - Mesh ID is an identifier of an MBSS. Nodes with the same mesh ID can communicate with each other. + * - Regarding to the router configuration, if the router is hidden, BSSID field is mandatory. + * + * If BSSID field isn't set and there exists more than one router with same SSID, there is a risk that more + * roots than one connected with different BSSID will appear. It means more than one mesh network is established + * with the same mesh ID. + * + * Root conflict function could eliminate redundant roots connected with the same BSSID, but couldn't handle roots + * connected with different BSSID. Because users might have such requirements of setting up routers with same SSID + * for the future replacement. But in that case, if the above situations happen, please make sure applications + * implement forward functions on the root to guarantee devices in different mesh networks can communicate with each other. + * max_connection of mesh softAP is limited by the max number of Wi-Fi softAP supported (max:10). + * + * @attention This API shall be called before mesh is started after mesh is initialized. + * + * @param[in] config pointer to mesh stack configuration + * + * @return + * - ESP_OK + * - ESP_ERR_MESH_ARGUMENT + * - ESP_ERR_MESH_NOT_ALLOWED + */ +esp_err_t esp_mesh_set_config(const mesh_cfg_t *config); + +/** + * @brief Get mesh stack configuration + * + * @param[out] config pointer to mesh stack configuration + * + * @return + * - ESP_OK + * - ESP_ERR_MESH_ARGUMENT + */ +esp_err_t esp_mesh_get_config(mesh_cfg_t *config); + +/** + * @brief Get router configuration + * + * @attention This API is used to dynamically modify the router configuration after mesh is configured. + * + * @param[in] router pointer to router configuration + * + * @return + * - ESP_OK + * - ESP_ERR_MESH_ARGUMENT + */ +esp_err_t esp_mesh_set_router(const mesh_router_t *router); + +/** + * @brief Get router configuration + * + * @param[out] router pointer to router configuration + * + * @return + * - ESP_OK + * - ESP_ERR_MESH_ARGUMENT + */ +esp_err_t esp_mesh_get_router(mesh_router_t *router); + +/** + * @brief Set mesh network ID + * + * @attention This API is used to dynamically modify the mesh network ID. + * + * @param[in] id pointer to mesh network ID + * + * @return + * - ESP_OK + * - ESP_ERR_MESH_ARGUMENT: invalid argument + */ +esp_err_t esp_mesh_set_id(const mesh_addr_t *id); + +/** + * @brief Get mesh network ID + * + * @param[out] id pointer to mesh network ID + * + * @return + * - ESP_OK + * - ESP_ERR_MESH_ARGUMENT + */ +esp_err_t esp_mesh_get_id(mesh_addr_t *id); + +/** + * @brief Designate device type over the mesh network + * - MESH_ROOT: designates the root node for a mesh network + * - MESH_LEAF: designates a device as a standalone Wi-Fi station + * + * @param[in] type device type + * + * @return + * - ESP_OK + * - ESP_ERR_MESH_NOT_ALLOWED + */ +esp_err_t esp_mesh_set_type(mesh_type_t type); + +/** + * @brief Get device type over mesh network + * + * @attention This API shall be called after having received the event MESH_EVENT_PARENT_CONNECTED. + * + * @return mesh type + * + */ +mesh_type_t esp_mesh_get_type(void); + +/** + * @brief Set network max layer value (max:25, default:25) + * - Network max layer limits the max hop count. + * + * @attention This API shall be called before mesh is started. + * + * @param[in] max_layer max layer value + * + * @return + * - ESP_OK + * - ESP_ERR_MESH_ARGUMENT + * - ESP_ERR_MESH_NOT_ALLOWED + */ +esp_err_t esp_mesh_set_max_layer(int max_layer); + +/** + * @brief Get max layer value + * + * @return max layer value + */ +int esp_mesh_get_max_layer(void); + +/** + * @brief Set mesh softAP password + * + * @attention This API shall be called before mesh is started. + * + * @param[in] pwd pointer to the password + * @param[in] len password length + * + * @return + * - ESP_OK + * - ESP_ERR_MESH_ARGUMENT + * - ESP_ERR_MESH_NOT_ALLOWED + */ +esp_err_t esp_mesh_set_ap_password(const uint8_t *pwd, int len); + +/** + * @brief Set mesh softAP authentication mode + * + * @attention This API shall be called before mesh is started. + * + * @param[in] authmode authentication mode + * + * @return + * - ESP_OK + * - ESP_ERR_MESH_ARGUMENT + * - ESP_ERR_MESH_NOT_ALLOWED + */ +esp_err_t esp_mesh_set_ap_authmode(wifi_auth_mode_t authmode); + +/** + * @brief Get mesh softAP authentication mode + * + * @return authentication mode + */ +wifi_auth_mode_t esp_mesh_get_ap_authmode(void); + +/** + * @brief Set mesh softAP max connection value + * + * @attention This API shall be called before mesh is started. + * + * @param[in] connections the number of max connections + * + * @return + * - ESP_OK + * - ESP_ERR_MESH_ARGUMENT + */ +esp_err_t esp_mesh_set_ap_connections(int connections); + +/** + * @brief Get mesh softAP max connection configuration + * + * @return the number of max connections + */ +int esp_mesh_get_ap_connections(void); + +/** + * @brief Get current layer value over the mesh network + * + * @attention This API shall be called after having received the event MESH_EVENT_PARENT_CONNECTED. + * + * @return layer value + * + */ +int esp_mesh_get_layer(void); + +/** + * @brief Get the parent BSSID + * + * @attention This API shall be called after having received the event MESH_EVENT_PARENT_CONNECTED. + * + * @param[out] bssid pointer to parent BSSID + * + * @return + * - ESP_OK + * - ESP_FAIL + */ +esp_err_t esp_mesh_get_parent_bssid(mesh_addr_t *bssid); + +/** + * @brief Return whether the device is the root node of the network + * + * @return true/false + */ +bool esp_mesh_is_root(void); + +/** + * @brief Enable/disable self-organized networking + * - Self-organized networking has three main functions: + * select the root node; + * find a preferred parent; + * initiate reconnection if a disconnection is detected. + * - Self-organized networking is enabled by default. + * - If self-organized is disabled, users should set a parent for the device via esp_mesh_set_parent(). + * + * @attention This API is used to dynamically modify whether to enable the self organizing. + * + * @param[in] enable enable or disable self-organized networking + * @param[in] select_parent Only valid when self-organized networking is enabled. + * - if select_parent is set to true, the root will give up its mesh root status and search for a new parent + * like other non-root devices. + * + * @return + * - ESP_OK + * - ESP_FAIL + */ +esp_err_t esp_mesh_set_self_organized(bool enable, bool select_parent); + +/** + * @brief Return whether enable self-organized networking or not + * + * @return true/false + */ +bool esp_mesh_get_self_organized(void); + +/** + * @brief Cause the root device to give up (waive) its mesh root status + * - A device is elected root primarily based on RSSI from the external router. + * - If external router conditions change, users can call this API to perform a root switch. + * - In this API, users could specify a desired root address to replace itself or specify an attempts value + * to ask current root to initiate a new round of voting. During the voting, a better root candidate would + * be expected to find to replace the current one. + * - If no desired root candidate, the vote will try a specified number of attempts (at least 15). If no better + * root candidate is found, keep the current one. If a better candidate is found, the new better one will + * send a root switch request to the current root, current root will respond with a root switch acknowledgment. + * - After that, the new candidate will connect to the router to be a new root, the previous root will disconnect + * with the router and choose another parent instead. + * + * Root switch is completed with minimal disruption to the whole mesh network. + * + * @attention This API is only called by the root. + * + * @param[in] vote vote configuration + * - If this parameter is set NULL, the vote will perform the default 15 times. + * + * - Field percentage threshold is 0.9 by default. + * - Field is_rc_specified shall be false. + * - Field attempts shall be at least 15 times. + * @param[in] reason only accept MESH_VOTE_REASON_ROOT_INITIATED for now + * + * @return + * - ESP_OK + * - ESP_ERR_MESH_QUEUE_FULL + * - ESP_ERR_MESH_DISCARD + * - ESP_FAIL + */ +esp_err_t esp_mesh_waive_root(const mesh_vote_t *vote, int reason); + +/** + * @brief Set vote percentage threshold for approval of being a root + * - During the networking, only obtaining vote percentage reaches this threshold, + * the device could be a root. + * + * @attention This API shall be called before mesh is started. + * + * @param[in] percentage vote percentage threshold + * + * @return + * - ESP_OK + * - ESP_FAIL + */ +esp_err_t esp_mesh_set_vote_percentage(float percentage); + +/** + * @brief Get vote percentage threshold for approval of being a root + * + * @return percentage threshold + */ +float esp_mesh_get_vote_percentage(void); + +/** + * @brief Set mesh softAP associate expired time (default:10 seconds) + * - If mesh softAP hasn't received any data from an associated child within this time, + * mesh softAP will take this child inactive and disassociate it. + * - If mesh softAP is encrypted, this value should be set a greater value, such as 30 seconds. + * + * @param[in] seconds the expired time + * + * @return + * - ESP_OK + * - ESP_FAIL + */ +esp_err_t esp_mesh_set_ap_assoc_expire(int seconds); + +/** + * @brief Get mesh softAP associate expired time + * + * @return seconds + */ +int esp_mesh_get_ap_assoc_expire(void); + +/** + * @brief Get total number of devices in current network (including the root) + * + * @attention The returned value might be incorrect when the network is changing. + ** + * @return total number of devices (including the root) + */ +int esp_mesh_get_total_node_num(void); + +/** + * @brief Get the number of devices in this device's sub-network (including self) + * + * @return the number of devices over this device's sub-network (including self) + */ +int esp_mesh_get_routing_table_size(void); + +/** + * @brief Get routing table of this device's sub-network (including itself) + * + * @param[out] mac pointer to routing table + * @param[in] len routing table size(in bytes) + * @param[out] size pointer to the number of devices in routing table (including itself) + * + * @return + * - ESP_OK + * - ESP_ERR_MESH_ARGUMENT + */ +esp_err_t esp_mesh_get_routing_table(mesh_addr_t *mac, int len, int *size); + +/** + * @brief Post the toDS state to the mesh stack + * + * @attention This API is only for the root. + * + * @param[in] reachable this state represents whether the root is able to access external IP network + * + * @return + * - ESP_OK + * - ESP_FAIL + */ +esp_err_t esp_mesh_post_toDS_state(bool reachable); + +/** + * @brief Return the number of packets pending in the queue waiting to be sent by the mesh stack + * + * @param[out] pending pointer to the TX pending + * + * @return + * - ESP_OK + * - ESP_FAIL + */ +esp_err_t esp_mesh_get_tx_pending(mesh_tx_pending_t *pending); + +/** + * @brief Return the number of packets available in the queue waiting to be received by applications + * + * @param[out] pending pointer to the RX pending + * + * @return + * - ESP_OK + * - ESP_FAIL + */ +esp_err_t esp_mesh_get_rx_pending(mesh_rx_pending_t *pending); + +/** + * @brief Return the number of packets could be accepted from the specified address + * + * @param[in] addr self address or an associate children address + * @param[out] xseqno_in sequence number of the last received packet from the specified address + * + * @return the number of upQ for a certain address + */ +int esp_mesh_available_txupQ_num(const mesh_addr_t *addr, uint32_t *xseqno_in); + +/** + * @brief Set the number of queue + * + * @attention This API shall be called before mesh is started. + * + * @param[in] qsize default:32 (min:16) + * + * @return + * - ESP_OK + * - ESP_FAIL + */ +esp_err_t esp_mesh_set_xon_qsize(int qsize); + +/** + * @brief Get queue size + * + * @return the number of queue + */ +int esp_mesh_get_xon_qsize(void); + +/** + * @brief Set whether allow more than one root existing in one network + * + * @param[in] allowed allow or not + * + * @return + * - ESP_OK + * - ESP_WIFI_ERR_NOT_INIT + * - ESP_WIFI_ERR_NOT_START + */ +esp_err_t esp_mesh_allow_root_conflicts(bool allowed); + +/** + * @brief Check whether allow more than one root to exist in one network + * + * @return true/false + */ +bool esp_mesh_is_root_conflicts_allowed(void); + +/** + * @brief Set group ID addresses + * + * @param[in] addr pointer to new group ID addresses + * @param[in] num the number of group ID addresses + * + * @return + * - ESP_OK + * - ESP_MESH_ERR_ARGUMENT + */ +esp_err_t esp_mesh_set_group_id(const mesh_addr_t *addr, int num); + +/** + * @brief Delete group ID addresses + * + * @param[in] addr pointer to deleted group ID address + * @param[in] num the number of group ID addresses + * + * @return + * - ESP_OK + * - ESP_MESH_ERR_ARGUMENT + */ +esp_err_t esp_mesh_delete_group_id(const mesh_addr_t *addr, int num); + +/** + * @brief Get the number of group ID addresses + * + * @return the number of group ID addresses + */ +int esp_mesh_get_group_num(void); + +/** + * @brief Get group ID addresses + * + * @param[out] addr pointer to group ID addresses + * @param[in] num the number of group ID addresses + * + * @return + * - ESP_OK + * - ESP_MESH_ERR_ARGUMENT + */ +esp_err_t esp_mesh_get_group_list(mesh_addr_t *addr, int num); + +/** + * @brief Check whether the specified group address is my group + * + * @return true/false + */ +bool esp_mesh_is_my_group(const mesh_addr_t *addr); + +/** + * @brief Set mesh network capacity (max:1000, default:300) + * + * @attention This API shall be called before mesh is started. + * + * @param[in] num mesh network capacity + * + * @return + * - ESP_OK + * - ESP_ERR_MESH_NOT_ALLOWED + * - ESP_MESH_ERR_ARGUMENT + */ +esp_err_t esp_mesh_set_capacity_num(int num); + +/** + * @brief Get mesh network capacity + * + * @return mesh network capacity + */ +int esp_mesh_get_capacity_num(void); + +/** + * @brief Set mesh IE crypto functions + * + * @attention This API can be called at any time after mesh is initialized. + * + * @param[in] crypto_funcs crypto functions for mesh IE + * - If crypto_funcs is set to NULL, mesh IE is no longer encrypted. + * @return + * - ESP_OK + */ +esp_err_t esp_mesh_set_ie_crypto_funcs(const mesh_crypto_funcs_t *crypto_funcs); + +/** + * @brief Set mesh IE crypto key + * + * @attention This API can be called at any time after mesh is initialized. + * + * @param[in] key ASCII crypto key + * @param[in] len length in bytes, range:8~64 + * + * @return + * - ESP_OK + * - ESP_MESH_ERR_ARGUMENT + */ +esp_err_t esp_mesh_set_ie_crypto_key(const char *key, int len); + +/** + * @brief Get mesh IE crypto key + * + * @param[out] key ASCII crypto key + * @param[in] len length in bytes, range:8~64 + * + * @return + * - ESP_OK + * - ESP_MESH_ERR_ARGUMENT + */ +esp_err_t esp_mesh_get_ie_crypto_key(char *key, int len); + +/** + * @brief Set delay time before starting root healing + * + * @param[in] delay_ms delay time in milliseconds + * + * @return + * - ESP_OK + */ +esp_err_t esp_mesh_set_root_healing_delay(int delay_ms); + +/** + * @brief Get delay time before network starts root healing + * + * @return delay time in milliseconds + */ +int esp_mesh_get_root_healing_delay(void); + +/** + * @brief Enable network Fixed Root Setting + * - Enabling fixed root disables automatic election of the root node via voting. + * - All devices in the network shall use the same Fixed Root Setting (enabled or disabled). + * - If Fixed Root is enabled, users should make sure a root node is designated for the network. + * + * @param[in] enable enable or not + * + * @return + * - ESP_OK + */ +esp_err_t esp_mesh_fix_root(bool enable); + +/** + * @brief Check whether network Fixed Root Setting is enabled + * - Enable/disable network Fixed Root Setting by API esp_mesh_fix_root(). + * - Network Fixed Root Setting also changes with the "flag" value in parent networking IE. + * + * @return true/false + */ +bool esp_mesh_is_root_fixed(void); + +/** + * @brief Set a specified parent for the device + * + * @attention This API can be called at any time after mesh is configured. + * + * @param[in] parent parent configuration, the SSID and the channel of the parent are mandatory. + * - If the BSSID is set, make sure that the SSID and BSSID represent the same parent, + * otherwise the device will never find this specified parent. + * @param[in] parent_mesh_id parent mesh ID, + * - If this value is not set, the original mesh ID is used. + * @param[in] my_type mesh type + * - If the parent set for the device is the same as the router in the network configuration, + * then my_type shall set MESH_ROOT and my_layer shall set MESH_ROOT_LAYER. + * @param[in] my_layer mesh layer + * - my_layer of the device may change after joining the network. + * - If my_type is set MESH_NODE, my_layer shall be greater than MESH_ROOT_LAYER. + * - If my_type is set MESH_LEAF, the device becomes a standalone Wi-Fi station and no longer + * has the ability to extend the network. + * + * @return + * - ESP_OK + * - ESP_ERR_ARGUMENT + * - ESP_ERR_MESH_NOT_CONFIG + */ +esp_err_t esp_mesh_set_parent(const wifi_config_t *parent, const mesh_addr_t *parent_mesh_id, mesh_type_t my_type, int my_layer); + +/** + * @brief Get mesh networking IE length of one AP + * + * @param[out] len mesh networking IE length + * + * @return + * - ESP_OK + * - ESP_ERR_WIFI_NOT_INIT + * - ESP_ERR_WIFI_ARG + * - ESP_ERR_WIFI_FAIL + */ +esp_err_t esp_mesh_scan_get_ap_ie_len(int *len); + +/** + * @brief Get AP record + * + * @attention Different from esp_wifi_scan_get_ap_records(), this API only gets one of APs scanned each time. + * See "manual_networking" example. + * + * @param[out] ap_record pointer to one AP record + * @param[out] buffer pointer to the mesh networking IE of this AP + * + * @return + * - ESP_OK + * - ESP_ERR_WIFI_NOT_INIT + * - ESP_ERR_WIFI_ARG + * - ESP_ERR_WIFI_FAIL + */ +esp_err_t esp_mesh_scan_get_ap_record(wifi_ap_record_t *ap_record, void *buffer); + +/** + * @brief Flush upstream packets pending in to_parent queue and to_parent_p2p queue + * + * @return + * - ESP_OK + */ +esp_err_t esp_mesh_flush_upstream_packets(void); + +/** + * @brief Get the number of nodes in the subnet of a specific child + * + * @param[in] child_mac an associated child address of this device + * @param[out] nodes_num pointer to the number of nodes in the subnet of a specific child + * + * @return + * - ESP_OK + * - ESP_ERR_MESH_NOT_START + * - ESP_ERR_MESH_ARGUMENT + */ +esp_err_t esp_mesh_get_subnet_nodes_num(const mesh_addr_t *child_mac, int *nodes_num); + +/** + * @brief Get nodes in the subnet of a specific child + * + * @param[in] child_mac an associated child address of this device + * @param[out] nodes pointer to nodes in the subnet of a specific child + * @param[in] nodes_num the number of nodes in the subnet of a specific child + * + * @return + * - ESP_OK + * - ESP_ERR_MESH_NOT_START + * - ESP_ERR_MESH_ARGUMENT + */ +esp_err_t esp_mesh_get_subnet_nodes_list(const mesh_addr_t *child_mac, mesh_addr_t *nodes, int nodes_num); + +/** + * @brief Disconnect from current parent + * + * @return + * - ESP_OK + */ +esp_err_t esp_mesh_disconnect(void); + +/** + * @brief Connect to current parent + * + * @return + * - ESP_OK + */ +esp_err_t esp_mesh_connect(void); + +/** + * @brief Flush scan result + * + * @return + * - ESP_OK + */ +esp_err_t esp_mesh_flush_scan_result(void); + +/** + * @brief Cause the root device to add Channel Switch Announcement Element (CSA IE) to beacon + * - Set the new channel + * - Set how many beacons with CSA IE will be sent before changing a new channel + * - Enable the channel switch function + * + * @attention This API is only called by the root. + * + * @param[in] new_bssid the new router BSSID if the router changes + * @param[in] csa_newchan the new channel number to which the whole network is moving + * @param[in] csa_count channel switch period(beacon count), unit is based on beacon interval of its softAP, the default value is 15. + * + * @return + * - ESP_OK + */ +esp_err_t esp_mesh_switch_channel(const uint8_t *new_bssid, int csa_newchan, int csa_count); + +/** + * @brief Get the router BSSID + * + * @param[out] router_bssid pointer to the router BSSID + * + * @return + * - ESP_OK + * - ESP_ERR_WIFI_NOT_INIT + * - ESP_ERR_WIFI_ARG + */ +esp_err_t esp_mesh_get_router_bssid(uint8_t *router_bssid); + +/** + * @brief Get the TSF time + * + * @return the TSF time + */ +int64_t esp_mesh_get_tsf_time(void); + +#ifdef __cplusplus +} +#endif +#endif /* __ESP_MESH_H__ */ diff --git a/arch/xtensa/include/esp32/esp_wifi/esp_mesh_internal.h b/arch/xtensa/include/esp32/esp_wifi/esp_mesh_internal.h new file mode 100644 index 0000000000000..89b03e7f2a318 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_wifi/esp_mesh_internal.h @@ -0,0 +1,269 @@ +// 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 __ESP_MESH_INTERNAL_H__ +#define __ESP_MESH_INTERNAL_H__ + +#include "esp_err.h" +#include "esp_wifi.h" +#include "esp_wifi_types.h" +#include "esp_private/wifi.h" +#include "esp_wifi_crypto_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/******************************************************* + * Constants + *******************************************************/ + +/******************************************************* + * Structures + *******************************************************/ +typedef struct { + int scan; /**< minimum scan times before being a root, default:10 */ + int vote; /**< max vote times in self-healing, default:1000 */ + int fail; /**< parent selection fail times, if the scan times reach this value, + device will disconnect with associated children and join self-healing. default:60 */ + int monitor_ie; /**< acceptable times of parent networking IE change before update its own networking IE. default:3 */ +} mesh_attempts_t; + +typedef struct { + int duration_ms; /* parent weak RSSI monitor duration, if the RSSI continues to be weak during this duration_ms, + device will search for a new parent. */ + int cnx_rssi; /* RSSI threshold for keeping a good connection with parent. + If set a value greater than -120 dBm, a timer will be armed to monitor parent RSSI at a period time of duration_ms. */ + int select_rssi; /* RSSI threshold for parent selection. It should be a value greater than switch_rssi. */ + int switch_rssi; /* Disassociate with current parent and switch to a new parent when the RSSI is greater than this set threshold. */ + int backoff_rssi; /* RSSI threshold for connecting to the root */ +} mesh_switch_parent_t; + +typedef struct { + int high; + int medium; + int low; +} mesh_rssi_threshold_t; + +/** + * @brief Mesh networking IE + */ +typedef struct { + /**< mesh networking IE head */ + uint8_t eid; /**< element ID */ + uint8_t len; /**< element length */ + uint8_t oui[3]; /**< organization identifier */ + /**< mesh networking IE content */ + uint8_t type; /** ESP defined IE type */ + uint8_t encrypted : 1; /**< whether mesh networking IE is encrypted */ + uint8_t version : 7; /**< mesh networking IE version */ + /**< content */ + uint8_t mesh_type; /**< mesh device type */ + uint8_t mesh_id[6]; /**< mesh ID */ + uint8_t layer_cap; /**< max layer */ + uint8_t layer; /**< current layer */ + uint8_t assoc_cap; /**< max connections of mesh AP */ + uint8_t assoc; /**< current connections */ + uint8_t leaf_cap; /**< leaf capacity */ + uint8_t leaf_assoc; /**< the number of current connected leaf */ + uint16_t root_cap; /**< root capacity */ + uint16_t self_cap; /**< self capacity */ + uint16_t layer2_cap; /**< layer2 capacity */ + uint16_t scan_ap_num; /**< the number of scanning APs */ + int8_t rssi; /**< RSSI of the parent */ + int8_t router_rssi; /**< RSSI of the router */ + uint8_t flag; /**< flag of networking */ + uint8_t rc_addr[6]; /**< root address */ + int8_t rc_rssi; /**< root RSSI */ + uint8_t vote_addr[6]; /**< voter address */ + int8_t vote_rssi; /**< vote RSSI of the router */ + uint8_t vote_ttl; /**< vote ttl */ + uint16_t votes; /**< votes */ + uint16_t my_votes; /**< my votes */ + uint8_t reason; /**< reason */ + uint8_t child[6]; /**< child address */ + uint8_t toDS; /**< toDS state */ +} __attribute__((packed)) mesh_assoc_t; + +/******************************************************* + * Function Definitions + *******************************************************/ +/** + * @brief Set mesh softAP beacon interval + * + * @param[in] interval beacon interval (msecs) (100 msecs ~ 60000 msecs) + * + * @return + * - ESP_OK + * - ESP_FAIL + * - ESP_ERR_WIFI_ARG + */ +esp_err_t esp_mesh_set_beacon_interval(int interval_ms); + +/** + * @brief Get mesh softAP beacon interval + * + * @param[out] interval beacon interval (msecs) + * + * @return + * - ESP_OK + */ +esp_err_t esp_mesh_get_beacon_interval(int *interval_ms); + +/** + * @brief Set attempts for mesh self-organized networking + * + * @param[in] attempts + * + * @return + * - ESP_OK + * - ESP_FAIL + */ +esp_err_t esp_mesh_set_attempts(mesh_attempts_t *attempts); + +/** + * @brief Get attempts for mesh self-organized networking + * + * @param[out] attempts + * + * @return + * - ESP_OK + * - ESP_ERR_MESH_ARGUMENT + */ +esp_err_t esp_mesh_get_attempts(mesh_attempts_t *attempts); + +/** + * @brief Set parameters for parent switch + * + * @param[in] paras parameters for parent switch + * + * @return + * - ESP_OK + * - ESP_ERR_MESH_ARGUMENT + */ +esp_err_t esp_mesh_set_switch_parent_paras(mesh_switch_parent_t *paras); + +/** + * @brief Get parameters for parent switch + * + * @param[out] paras parameters for parent switch + * + * @return + * - ESP_OK + * - ESP_ERR_MESH_ARGUMENT + */ +esp_err_t esp_mesh_get_switch_parent_paras(mesh_switch_parent_t *paras); + +/** + * @brief Set RSSI threshold + * - The default high RSSI threshold value is -78 dBm. + * - The default medium RSSI threshold value is -82 dBm. + * - The default low RSSI threshold value is -85 dBm. + * + * @param[in] threshold RSSI threshold + * + * @return + * - ESP_OK + * - ESP_ERR_MESH_ARGUMENT + */ +esp_err_t esp_mesh_set_rssi_threshold(const mesh_rssi_threshold_t *threshold); + +/** + * @brief Get RSSI threshold + * + * @param[out] threshold RSSI threshold + * + * @return + * - ESP_OK + * - ESP_ERR_MESH_ARGUMENT + */ +esp_err_t esp_mesh_get_rssi_threshold(mesh_rssi_threshold_t *threshold); + +/** + * @brief Enable the minimum rate to 6 Mbps + * + * @attention This API shall be called before Wi-Fi is started. + * + * @param[in] is_6m enable or not + * + * @return + * - ESP_OK + */ +esp_err_t esp_mesh_set_6m_rate(bool is_6m); + +/** + * @brief Print the number of txQ waiting + * + * @return + * - ESP_OK + * - ESP_FAIL + */ +esp_err_t esp_mesh_print_txQ_waiting(void); + +/** + * @brief Print the number of rxQ waiting + * + * @return + * - ESP_OK + * - ESP_FAIL + */ +esp_err_t esp_mesh_print_rxQ_waiting(void); + +/** + * @brief Set passive scan time + * + * @param[in] interval_ms passive scan time (msecs) + * + * @return + * - ESP_OK + * - ESP_FAIL + * - ESP_ERR_ARGUMENT + */ +esp_err_t esp_mesh_set_passive_scan_time(int time_ms); + +/** + * @brief Get passive scan time + * + * @return interval_ms passive scan time (msecs) + */ +int esp_mesh_get_passive_scan_time(void); + +/** + * @brief Set announce interval + * - The default short interval is 500 milliseconds. + * - The default long interval is 3000 milliseconds. + * + * @param[in] short_ms shall be greater than the default value + * @param[in] long_ms shall be greater than the default value + * + * @return + * - ESP_OK + */ +esp_err_t esp_mesh_set_announce_interval(int short_ms, int long_ms); + +/** + * @brief Get announce interval + * + * @param[out] short_ms short interval + * @param[out] long_ms long interval + * + * @return + * - ESP_OK + */ +esp_err_t esp_mesh_get_announce_interval(int *short_ms, int *long_ms); + +#ifdef __cplusplus +} +#endif +#endif /* __ESP_MESH_INTERNAL_H__ */ diff --git a/arch/xtensa/include/esp32/esp_wifi/esp_now.h b/arch/xtensa/include/esp32/esp_wifi/esp_now.h new file mode 100644 index 0000000000000..981c9001e490d --- /dev/null +++ b/arch/xtensa/include/esp32/esp_wifi/esp_now.h @@ -0,0 +1,317 @@ +// 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. + +#ifndef __ESP_NOW_H__ +#define __ESP_NOW_H__ + +#include +#include "esp_err.h" +#include "esp_wifi_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup WiFi_APIs WiFi Related APIs + * @brief WiFi APIs + */ + +/** @addtogroup WiFi_APIs + * @{ + */ + +/** \defgroup ESPNOW_APIs ESPNOW APIs + * @brief ESP32 ESPNOW APIs + * + */ + +/** @addtogroup ESPNOW_APIs + * @{ + */ + +#define ESP_ERR_ESPNOW_BASE (ESP_ERR_WIFI_BASE + 100) /*!< ESPNOW error number base. */ +#define ESP_ERR_ESPNOW_NOT_INIT (ESP_ERR_ESPNOW_BASE + 1) /*!< ESPNOW is not initialized. */ +#define ESP_ERR_ESPNOW_ARG (ESP_ERR_ESPNOW_BASE + 2) /*!< Invalid argument */ +#define ESP_ERR_ESPNOW_NO_MEM (ESP_ERR_ESPNOW_BASE + 3) /*!< Out of memory */ +#define ESP_ERR_ESPNOW_FULL (ESP_ERR_ESPNOW_BASE + 4) /*!< ESPNOW peer list is full */ +#define ESP_ERR_ESPNOW_NOT_FOUND (ESP_ERR_ESPNOW_BASE + 5) /*!< ESPNOW peer is not found */ +#define ESP_ERR_ESPNOW_INTERNAL (ESP_ERR_ESPNOW_BASE + 6) /*!< Internal error */ +#define ESP_ERR_ESPNOW_EXIST (ESP_ERR_ESPNOW_BASE + 7) /*!< ESPNOW peer has existed */ +#define ESP_ERR_ESPNOW_IF (ESP_ERR_ESPNOW_BASE + 8) /*!< Interface error */ + +#define ESP_NOW_ETH_ALEN 6 /*!< Length of ESPNOW peer MAC address */ +#define ESP_NOW_KEY_LEN 16 /*!< Length of ESPNOW peer local master key */ + +#define ESP_NOW_MAX_TOTAL_PEER_NUM 20 /*!< Maximum number of ESPNOW total peers */ +#define ESP_NOW_MAX_ENCRYPT_PEER_NUM 6 /*!< Maximum number of ESPNOW encrypted peers */ + +#define ESP_NOW_MAX_DATA_LEN 250 /*!< Maximum length of ESPNOW data which is sent very time */ + +/** + * @brief Status of sending ESPNOW data . + */ +typedef enum { + ESP_NOW_SEND_SUCCESS = 0, /**< Send ESPNOW data successfully */ + ESP_NOW_SEND_FAIL, /**< Send ESPNOW data fail */ +} esp_now_send_status_t; + +/** + * @brief ESPNOW peer information parameters. + */ +typedef struct esp_now_peer_info { + uint8_t peer_addr[ESP_NOW_ETH_ALEN]; /**< ESPNOW peer MAC address that is also the MAC address of station or softap */ + uint8_t lmk[ESP_NOW_KEY_LEN]; /**< ESPNOW peer local master key that is used to encrypt data */ + uint8_t channel; /**< Wi-Fi channel that peer uses to send/receive ESPNOW data. If the value is 0, + use the current channel which station or softap is on. Otherwise, it must be + set as the channel that station or softap is on. */ + wifi_interface_t ifidx; /**< Wi-Fi interface that peer uses to send/receive ESPNOW data */ + bool encrypt; /**< ESPNOW data that this peer sends/receives is encrypted or not */ + void *priv; /**< ESPNOW peer private data */ +} esp_now_peer_info_t; + +/** + * @brief Number of ESPNOW peers which exist currently. + */ +typedef struct esp_now_peer_num { + int total_num; /**< Total number of ESPNOW peers, maximum value is ESP_NOW_MAX_TOTAL_PEER_NUM */ + int encrypt_num; /**< Number of encrypted ESPNOW peers, maximum value is ESP_NOW_MAX_ENCRYPT_PEER_NUM */ +} esp_now_peer_num_t; + +/** + * @brief Callback function of receiving ESPNOW data + * @param mac_addr peer MAC address + * @param data received data + * @param data_len length of received data + */ +typedef void (*esp_now_recv_cb_t)(const uint8_t *mac_addr, const uint8_t *data, int data_len); + +/** + * @brief Callback function of sending ESPNOW data + * @param mac_addr peer MAC address + * @param status status of sending ESPNOW data (succeed or fail) + */ +typedef void (*esp_now_send_cb_t)(const uint8_t *mac_addr, esp_now_send_status_t status); + +/** + * @brief Initialize ESPNOW function + * + * @return + * - ESP_OK : succeed + * - ESP_ERR_ESPNOW_INTERNAL : Internal error + */ +esp_err_t esp_now_init(void); + +/** + * @brief De-initialize ESPNOW function + * + * @return + * - ESP_OK : succeed + */ +esp_err_t esp_now_deinit(void); + +/** + * @brief Get the version of ESPNOW + * + * @param version ESPNOW version + * + * @return + * - ESP_OK : succeed + * - ESP_ERR_ESPNOW_ARG : invalid argument + */ +esp_err_t esp_now_get_version(uint32_t *version); + +/** + * @brief Register callback function of receiving ESPNOW data + * + * @param cb callback function of receiving ESPNOW data + * + * @return + * - ESP_OK : succeed + * - ESP_ERR_ESPNOW_NOT_INIT : ESPNOW is not initialized + * - ESP_ERR_ESPNOW_INTERNAL : internal error + */ +esp_err_t esp_now_register_recv_cb(esp_now_recv_cb_t cb); + +/** + * @brief Unregister callback function of receiving ESPNOW data + * + * @return + * - ESP_OK : succeed + * - ESP_ERR_ESPNOW_NOT_INIT : ESPNOW is not initialized + */ +esp_err_t esp_now_unregister_recv_cb(void); + +/** + * @brief Register callback function of sending ESPNOW data + * + * @param cb callback function of sending ESPNOW data + * + * @return + * - ESP_OK : succeed + * - ESP_ERR_ESPNOW_NOT_INIT : ESPNOW is not initialized + * - ESP_ERR_ESPNOW_INTERNAL : internal error + */ +esp_err_t esp_now_register_send_cb(esp_now_send_cb_t cb); + +/** + * @brief Unregister callback function of sending ESPNOW data + * + * @return + * - ESP_OK : succeed + * - ESP_ERR_ESPNOW_NOT_INIT : ESPNOW is not initialized + */ +esp_err_t esp_now_unregister_send_cb(void); + +/** + * @brief Send ESPNOW data + * + * @attention 1. If peer_addr is not NULL, send data to the peer whose MAC address matches peer_addr + * @attention 2. If peer_addr is NULL, send data to all of the peers that are added to the peer list + * @attention 3. The maximum length of data must be less than ESP_NOW_MAX_DATA_LEN + * @attention 4. The buffer pointed to by data argument does not need to be valid after esp_now_send returns + * + * @param peer_addr peer MAC address + * @param data data to send + * @param len length of data + * + * @return + * - ESP_OK : succeed + * - ESP_ERR_ESPNOW_NOT_INIT : ESPNOW is not initialized + * - ESP_ERR_ESPNOW_ARG : invalid argument + * - ESP_ERR_ESPNOW_INTERNAL : internal error + * - ESP_ERR_ESPNOW_NO_MEM : out of memory + * - ESP_ERR_ESPNOW_NOT_FOUND : peer is not found + * - ESP_ERR_ESPNOW_IF : current WiFi interface doesn't match that of peer + */ +esp_err_t esp_now_send(const uint8_t *peer_addr, const uint8_t *data, size_t len); + +/** + * @brief Add a peer to peer list + * + * @param peer peer information + * + * @return + * - ESP_OK : succeed + * - ESP_ERR_ESPNOW_NOT_INIT : ESPNOW is not initialized + * - ESP_ERR_ESPNOW_ARG : invalid argument + * - ESP_ERR_ESPNOW_FULL : peer list is full + * - ESP_ERR_ESPNOW_NO_MEM : out of memory + * - ESP_ERR_ESPNOW_EXIST : peer has existed + */ +esp_err_t esp_now_add_peer(const esp_now_peer_info_t *peer); + +/** + * @brief Delete a peer from peer list + * + * @param peer_addr peer MAC address + * + * @return + * - ESP_OK : succeed + * - ESP_ERR_ESPNOW_NOT_INIT : ESPNOW is not initialized + * - ESP_ERR_ESPNOW_ARG : invalid argument + * - ESP_ERR_ESPNOW_NOT_FOUND : peer is not found + */ +esp_err_t esp_now_del_peer(const uint8_t *peer_addr); + +/** + * @brief Modify a peer + * + * @param peer peer information + * + * @return + * - ESP_OK : succeed + * - ESP_ERR_ESPNOW_NOT_INIT : ESPNOW is not initialized + * - ESP_ERR_ESPNOW_ARG : invalid argument + * - ESP_ERR_ESPNOW_FULL : peer list is full + */ +esp_err_t esp_now_mod_peer(const esp_now_peer_info_t *peer); + +/** + * @brief Get a peer whose MAC address matches peer_addr from peer list + * + * @param peer_addr peer MAC address + * @param peer peer information + * + * @return + * - ESP_OK : succeed + * - ESP_ERR_ESPNOW_NOT_INIT : ESPNOW is not initialized + * - ESP_ERR_ESPNOW_ARG : invalid argument + * - ESP_ERR_ESPNOW_NOT_FOUND : peer is not found + */ +esp_err_t esp_now_get_peer(const uint8_t *peer_addr, esp_now_peer_info_t *peer); + +/** + * @brief Fetch a peer from peer list + * + * @param from_head fetch from head of list or not + * @param peer peer information + * + * @return + * - ESP_OK : succeed + * - ESP_ERR_ESPNOW_NOT_INIT : ESPNOW is not initialized + * - ESP_ERR_ESPNOW_ARG : invalid argument + * - ESP_ERR_ESPNOW_NOT_FOUND : peer is not found + */ +esp_err_t esp_now_fetch_peer(bool from_head, esp_now_peer_info_t *peer); + +/** + * @brief Peer exists or not + * + * @param peer_addr peer MAC address + * + * @return + * - true : peer exists + * - false : peer not exists + */ +bool esp_now_is_peer_exist(const uint8_t *peer_addr); + +/** + * @brief Get the number of peers + * + * @param num number of peers + * + * @return + * - ESP_OK : succeed + * - ESP_ERR_ESPNOW_NOT_INIT : ESPNOW is not initialized + * - ESP_ERR_ESPNOW_ARG : invalid argument + */ +esp_err_t esp_now_get_peer_num(esp_now_peer_num_t *num); + +/** + * @brief Set the primary master key + * + * @param pmk primary master key + * + * @attention 1. primary master key is used to encrypt local master key + * + * @return + * - ESP_OK : succeed + * - ESP_ERR_ESPNOW_NOT_INIT : ESPNOW is not initialized + * - ESP_ERR_ESPNOW_ARG : invalid argument + */ +esp_err_t esp_now_set_pmk(const uint8_t *pmk); + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __ESP_NOW_H__ */ diff --git a/arch/xtensa/include/esp32/esp_wifi/esp_phy_init.h b/arch/xtensa/include/esp32/esp_wifi/esp_phy_init.h new file mode 100644 index 0000000000000..40997a4c732d6 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_wifi/esp_phy_init.h @@ -0,0 +1,250 @@ +// 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. + +#pragma once +#include +#include +#include "../esp_common/esp_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file PHY init parameters and API + */ + + +/** + * @brief Structure holding PHY init parameters + */ +typedef struct { + uint8_t params[128]; /*!< opaque PHY initialization parameters */ +} esp_phy_init_data_t; + +/** + * @brief Opaque PHY calibration data + */ +typedef struct { + uint8_t version[4]; /*!< PHY version */ + uint8_t mac[6]; /*!< The MAC address of the station */ + uint8_t opaque[1894]; /*!< calibration data */ +} esp_phy_calibration_data_t; + +typedef enum { + PHY_RF_CAL_PARTIAL = 0x00000000, /*!< Do part of RF calibration. This should be used after power-on reset. */ + PHY_RF_CAL_NONE = 0x00000001, /*!< Don't do any RF calibration. This mode is only suggested to be used after deep sleep reset. */ + PHY_RF_CAL_FULL = 0x00000002 /*!< Do full RF calibration. Produces best results, but also consumes a lot of time and current. Suggested to be used once. */ +} esp_phy_calibration_mode_t; + + +/** + * @brief Modules for modem sleep + */ +typedef enum{ + MODEM_BLE_MODULE, //!< BLE controller used + MODEM_CLASSIC_BT_MODULE, //!< Classic BT controller used + MODEM_WIFI_STATION_MODULE, //!< Wi-Fi Station used + MODEM_WIFI_SOFTAP_MODULE, //!< Wi-Fi SoftAP used + MODEM_WIFI_SNIFFER_MODULE, //!< Wi-Fi Sniffer used + MODEM_WIFI_NULL_MODULE, //!< Wi-Fi Null mode used + MODEM_USER_MODULE, //!< User used + MODEM_MODULE_COUNT //!< Number of items +}modem_sleep_module_t; + +/** + * @brief Module WIFI mask for medem sleep + */ +#define MODEM_BT_MASK ((1< +#include "../esp_wifi_crypto_types.h" +#include "wifi_os_adapter.h" + + +#endif /* _ESP_WIFI_PRIVATE_H */ diff --git a/arch/xtensa/include/esp32/esp_wifi/esp_private/esp_wifi_types_private.h b/arch/xtensa/include/esp32/esp_wifi/esp_private/esp_wifi_types_private.h new file mode 100644 index 0000000000000..592b0facc0ff2 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_wifi/esp_private/esp_wifi_types_private.h @@ -0,0 +1,25 @@ +// 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. + +#ifndef _ESP_WIFI_TYPES_PRIVATE_H +#define _ESP_WIFI_TYPES_PRIVATE_H + +#include +#include +#include "sys/queue.h" +#include "../../esp_common/esp_err.h" +#include "../../esp_common/esp_interface.h" +#include "../../esp_event/include/esp_event_base.h" + +#endif diff --git a/arch/xtensa/include/esp32/esp_wifi/esp_private/wifi.h b/arch/xtensa/include/esp32/esp_wifi/esp_private/wifi.h new file mode 100644 index 0000000000000..229d691e788c4 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_wifi/esp_private/wifi.h @@ -0,0 +1,421 @@ +// 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. + +/* + * All the APIs declared here are internal only APIs, it can only be used by + * espressif internal modules, such as SSC, LWIP, TCPIP adapter etc, espressif + * customers are not recommended to use them. + * + * If someone really want to use specified APIs declared in here, please contact + * espressif AE/developer to make sure you know the limitations or risk of + * the API, otherwise you may get unexpected behavior!!! + * + */ + + +#ifndef __ESP_WIFI_INTERNAL_H__ +#define __ESP_WIFI_INTERNAL_H__ + +#include +#include +#include "../../freertos/FreeRTOS.h" +#include "../../freertos/queue.h" +#include "sys/queue.h" +#include "../../esp_common/esp_err.h" +#include "../esp_wifi_types.h" +#include "../../esp_event/include/esp_event.h" +#include "../esp_wifi.h" +#include "../esp_smartconfig.h" +#include "wifi_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + QueueHandle_t handle; /**< FreeRTOS queue handler */ + void *storage; /**< storage for FreeRTOS queue */ +} wifi_static_queue_t; + +/** + * @brief WiFi log level + * + */ +typedef enum { + WIFI_LOG_ERROR = 0, /*enabled by default*/ + WIFI_LOG_WARNING, /*enabled by default*/ + WIFI_LOG_INFO, /*enabled by default*/ + WIFI_LOG_DEBUG, /*can be set in menuconfig*/ + WIFI_LOG_VERBOSE, /*can be set in menuconfig*/ +} wifi_log_level_t; + +/** + * @brief WiFi log module definition + * + */ +typedef enum { + WIFI_LOG_MODULE_ALL = 0, /*all log modules */ + WIFI_LOG_MODULE_WIFI, /*logs related to WiFi*/ + WIFI_LOG_MODULE_COEX, /*logs related to WiFi and BT(or BLE) coexist*/ + WIFI_LOG_MODULE_MESH, /*logs related to Mesh*/ +} wifi_log_module_t; + +/** + * @brief WiFi log submodule definition + * + */ +#define WIFI_LOG_SUBMODULE_ALL (0) /*all log submodules*/ +#define WIFI_LOG_SUBMODULE_INIT (1) /*logs related to initialization*/ +#define WIFI_LOG_SUBMODULE_IOCTL (1<<1) /*logs related to API calling*/ +#define WIFI_LOG_SUBMODULE_CONN (1<<2) /*logs related to connecting*/ +#define WIFI_LOG_SUBMODULE_SCAN (1<<3) /*logs related to scaning*/ + + +/** + * @brief Initialize Wi-Fi Driver + * Alloc resource for WiFi driver, such as WiFi control structure, RX/TX buffer, + * WiFi NVS structure among others. + * + * For the most part, you need not call this function directly. It gets called + * from esp_wifi_init(). + * + * This function may be called, if you only need to initialize the Wi-Fi driver + * without having to use the network stack on top. + * + * @param config provide WiFi init configuration + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_NO_MEM: out of memory + * - others: refer to error code esp_err.h + */ +esp_err_t esp_wifi_init_internal(const wifi_init_config_t *config); + +/** + * @brief Deinitialize Wi-Fi Driver + * Free resource for WiFi driver, such as WiFi control structure, RX/TX buffer, + * WiFi NVS structure among others. + * + * For the most part, you need not call this function directly. It gets called + * from esp_wifi_deinit(). + * + * This function may be called, if you call esp_wifi_init_internal to initialize + * WiFi driver. + * + * @return + * - ESP_OK: succeed + * - others: refer to error code esp_err.h + */ +esp_err_t esp_wifi_deinit_internal(void); + +/** + * @brief get whether the wifi driver is allowed to transmit data or not + * + * @return + * - true : upper layer should stop to transmit data to wifi driver + * - false : upper layer can transmit data to wifi driver + */ +bool esp_wifi_internal_tx_is_stop(void); + +/** + * @brief free the rx buffer which allocated by wifi driver + * + * @param void* buffer: rx buffer pointer + */ +void esp_wifi_internal_free_rx_buffer(void* buffer); + +/** + * @brief transmit the buffer via wifi driver + * + * @param wifi_interface_t wifi_if : wifi interface id + * @param void *buffer : the buffer to be tansmit + * @param uint16_t len : the length of buffer + * + * @return + * - ERR_OK : Successfully transmit the buffer to wifi driver + * - ERR_MEM : Out of memory + * - ERR_IF : WiFi driver error + * - ERR_ARG : Invalid argument + */ +int esp_wifi_internal_tx(wifi_interface_t wifi_if, void *buffer, uint16_t len); + +/** + * @brief The WiFi RX callback function + * + * Each time the WiFi need to forward the packets to high layer, the callback function will be called + */ +typedef esp_err_t (*wifi_rxcb_t)(void *buffer, uint16_t len, void *eb); + +/** + * @brief Set the WiFi RX callback + * + * @attention 1. Currently we support only one RX callback for each interface + * + * @param wifi_interface_t ifx : interface + * @param wifi_rxcb_t fn : WiFi RX callback + * + * @return + * - ESP_OK : succeed + * - others : fail + */ +esp_err_t esp_wifi_internal_reg_rxcb(wifi_interface_t ifx, wifi_rxcb_t fn); + +/** + * @brief Notify WIFI driver that the station got ip successfully + * + * @return + * - ESP_OK : succeed + * - others : fail + */ +esp_err_t esp_wifi_internal_set_sta_ip(void); + +/** + * @brief enable or disable transmitting WiFi MAC frame with fixed rate + * + * @attention 1. If fixed rate is enabled, both management and data frame are transmitted with fixed rate + * @attention 2. Make sure that the receiver is able to receive the frame with the fixed rate if you want the frame to be received + * + * @param ifx : wifi interface + * @param en : false - disable, true - enable + * @param rate : PHY rate + * + * @return + * - ERR_OK : succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_WIFI_NOT_STARTED: WiFi was not started by esp_wifi_start + * - ESP_ERR_WIFI_IF : invalid WiFi interface + * - ESP_ERR_INVALID_ARG : invalid rate + * - ESP_ERR_NOT_SUPPORTED : do not support to set fixed rate if TX AMPDU is enabled + */ +esp_err_t esp_wifi_internal_set_fix_rate(wifi_interface_t ifx, bool en, wifi_phy_rate_t rate); + +/** + * @brief Start SmartConfig, config ESP device to connect AP. You need to broadcast information by phone APP. + * Device sniffer special packets from the air that containing SSID and password of target AP. + * + * @attention 1. This API can be called in station or softAP-station mode. + * @attention 2. Can not call esp_smartconfig_start twice before it finish, please call + * esp_smartconfig_stop first. + * + * @param config pointer to smartconfig start configure structure + * + * @return + * - ESP_OK: succeed + * - others: fail + */ +esp_err_t esp_smartconfig_internal_start(const smartconfig_start_config_t *config); + +/** + * @brief Stop SmartConfig, free the buffer taken by esp_smartconfig_start. + * + * @attention Whether connect to AP succeed or not, this API should be called to free + * memory taken by smartconfig_start. + * + * @return + * - ESP_OK: succeed + * - others: fail + */ +esp_err_t esp_smartconfig_internal_stop(void); + +/** + * @brief Check the MD5 values of the OS adapter header files in IDF and WiFi library + * + * @attention 1. It is used for internal CI version check + * + * @return + * - ESP_OK : succeed + * - ESP_WIFI_INVALID_ARG : MD5 check fail + */ +esp_err_t esp_wifi_internal_osi_funcs_md5_check(const char *md5); + +/** + * @brief Check the MD5 values of the crypto types header files in IDF and WiFi library + * + * @attention 1. It is used for internal CI version check + * + * @return + * - ESP_OK : succeed + * - ESP_WIFI_INVALID_ARG : MD5 check fail + */ +esp_err_t esp_wifi_internal_crypto_funcs_md5_check(const char *md5); + +/** + * @brief Check the MD5 values of the esp_wifi_types.h in IDF and WiFi library + * + * @attention 1. It is used for internal CI version check + * + * @return + * - ESP_OK : succeed + * - ESP_WIFI_INVALID_ARG : MD5 check fail + */ +esp_err_t esp_wifi_internal_wifi_type_md5_check(const char *md5); + +/** + * @brief Check the MD5 values of the esp_wifi.h in IDF and WiFi library + * + * @attention 1. It is used for internal CI version check + * + * @return + * - ESP_OK : succeed + * - ESP_WIFI_INVALID_ARG : MD5 check fail + */ +esp_err_t esp_wifi_internal_esp_wifi_md5_check(const char *md5); + +/** + * @brief Allocate a chunk of memory for WiFi driver + * + * @attention This API is not used for DMA memory allocation. + * + * @param size_t size : Size, in bytes, of the amount of memory to allocate + * + * @return A pointer to the memory allocated on success, NULL on failure + */ +void *wifi_malloc( size_t size ); + +/** + * @brief Reallocate a chunk of memory for WiFi driver + * + * @attention This API is not used for DMA memory allocation. + * + * @param void * ptr : Pointer to previously allocated memory, or NULL for a new allocation. + * @param size_t size : Size, in bytes, of the amount of memory to allocate + * + * @return A pointer to the memory allocated on success, NULL on failure + */ +void *wifi_realloc( void *ptr, size_t size ); + +/** + * @brief Callocate memory for WiFi driver + * + * @attention This API is not used for DMA memory allocation. + * + * @param size_t n : Number of continuing chunks of memory to allocate + * @param size_t size : Size, in bytes, of the amount of memory to allocate + * + * @return A pointer to the memory allocated on success, NULL on failure + */ +void *wifi_calloc( size_t n, size_t size ); + +/** + * @brief Update WiFi MAC time + * + * @param uint32_t time_delta : time duration since the WiFi/BT common clock is disabled + * + * @return Always returns ESP_OK + */ +typedef esp_err_t (* wifi_mac_time_update_cb_t)( uint32_t time_delta ); + +/** + * @brief Update WiFi MAC time + * + * @param uint32_t time_delta : time duration since the WiFi/BT common clock is disabled + * + * @return Always returns ESP_OK + */ +esp_err_t esp_wifi_internal_update_mac_time( uint32_t time_delta ); + +/** + * @brief Set current WiFi log level + * + * @param level Log level. + * + * @return + * - ESP_OK: succeed + * - ESP_FAIL: level is invalid + */ +esp_err_t esp_wifi_internal_set_log_level(wifi_log_level_t level); + +/** + * @brief Set current log module and submodule + * + * @param module Log module + * @param submodule Log submodule + * @param enable enable or disable + * If module == 0 && enable == 0, all log modules are disabled. + * If module == 0 && enable == 1, all log modules are enabled. + * If submodule == 0 && enable == 0, all log submodules are disabled. + * If submodule == 0 && enable == 1, all log submodules are enabled. + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_WIFI_ARG: invalid argument + */ +esp_err_t esp_wifi_internal_set_log_mod(wifi_log_module_t module, uint32_t submodule, bool enable); + +/** + * @brief Get current WiFi log info + * + * @param log_level the return log level. + * @param log_mod the return log module and submodule + * + * @return + * - ESP_OK: succeed + */ +esp_err_t esp_wifi_internal_get_log(wifi_log_level_t *log_level, uint32_t *log_mod); + +/** + * @brief A general API to set/get WiFi internal configuration, it's for debug only + * + * @param cmd : ioctl command type + * @param cfg : configuration for the command + * + * @return + * - ESP_OK: succeed + * - others: failed + */ +esp_err_t esp_wifi_internal_ioctl(int cmd, wifi_ioctl_config_t *cfg); + +/** + * @brief Get the user-configured channel info + * + * @param ifx : WiFi interface + * @param primary : store the configured primary channel + * @param second : store the configured second channel + * + * @return + * - ESP_OK: succeed + */ +esp_err_t esp_wifi_internal_get_config_channel(wifi_interface_t ifx, uint8_t *primary, uint8_t *second); + +/** + * @brief Get the negotiated channel info after WiFi connection established + * + * @param ifx : WiFi interface + * @param aid : the connection number when a STA connects to the softAP + * @param primary : store the negotiated primary channel + * @param second : store the negotiated second channel + * @attention the aid param is only works when the ESP32 in softAP/softAP+STA mode + * + * @return + * - ESP_OK: succeed + */ +esp_err_t esp_wifi_internal_get_negotiated_channel(wifi_interface_t ifx, uint8_t aid, uint8_t *primary, uint8_t *second); + +/** + * @brief Get the negotiated bandwidth info after WiFi connection established + * + * @param ifx : WiFi interface + * @param bw : store the negotiated bandwidth + * + * @return + * - ESP_OK: succeed + */ +esp_err_t esp_wifi_internal_get_negotiated_bandwidth(wifi_interface_t ifx, uint8_t aid, uint8_t *bw); + +#ifdef __cplusplus +} +#endif + +#endif /* __ESP_WIFI_H__ */ diff --git a/arch/xtensa/include/esp32/esp_wifi/esp_private/wifi_os_adapter.h b/arch/xtensa/include/esp32/esp_wifi/esp_private/wifi_os_adapter.h new file mode 100644 index 0000000000000..7fde7bf3ca356 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_wifi/esp_private/wifi_os_adapter.h @@ -0,0 +1,143 @@ +// 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. + +#ifndef ESP_WIFI_OS_ADAPTER_H_ +#define ESP_WIFI_OS_ADAPTER_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define ESP_WIFI_OS_ADAPTER_VERSION 0x00000004 +#define ESP_WIFI_OS_ADAPTER_MAGIC 0xDEADBEAF + +#define OSI_FUNCS_TIME_BLOCKING 0xffffffff + +#define OSI_QUEUE_SEND_FRONT 0 +#define OSI_QUEUE_SEND_BACK 1 +#define OSI_QUEUE_SEND_OVERWRITE 2 + +typedef struct { + int32_t _version; + void (*_set_isr)(int32_t n, void *f, void *arg); + void (*_ints_on)(uint32_t mask); + void (*_ints_off)(uint32_t mask); + void *(* _spin_lock_create)(void); + void (* _spin_lock_delete)(void *lock); + uint32_t (*_wifi_int_disable)(void *wifi_int_mux); + void (*_wifi_int_restore)(void *wifi_int_mux, uint32_t tmp); + void (*_task_yield_from_isr)(void); + void *(*_semphr_create)(uint32_t max, uint32_t init); + void (*_semphr_delete)(void *semphr); + int32_t (*_semphr_take)(void *semphr, uint32_t block_time_tick); + int32_t (*_semphr_give)(void *semphr); + void *(*_wifi_thread_semphr_get)(void); + void *(*_mutex_create)(void); + void *(*_recursive_mutex_create)(void); + void (*_mutex_delete)(void *mutex); + int32_t (*_mutex_lock)(void *mutex); + int32_t (*_mutex_unlock)(void *mutex); + void *(* _queue_create)(uint32_t queue_len, uint32_t item_size); + void (* _queue_delete)(void *queue); + int32_t (* _queue_send)(void *queue, void *item, uint32_t block_time_tick); + int32_t (* _queue_send_from_isr)(void *queue, void *item, void *hptw); + int32_t (* _queue_send_to_back)(void *queue, void *item, uint32_t block_time_tick); + int32_t (* _queue_send_to_front)(void *queue, void *item, uint32_t block_time_tick); + int32_t (* _queue_recv)(void *queue, void *item, uint32_t block_time_tick); + uint32_t (* _queue_msg_waiting)(void *queue); + void *(* _event_group_create)(void); + void (* _event_group_delete)(void *event); + uint32_t (* _event_group_set_bits)(void *event, uint32_t bits); + uint32_t (* _event_group_clear_bits)(void *event, uint32_t bits); + uint32_t (* _event_group_wait_bits)(void *event, uint32_t bits_to_wait_for, int32_t clear_on_exit, int32_t wait_for_all_bits, uint32_t block_time_tick); + int32_t (* _task_create_pinned_to_core)(void *task_func, const char *name, uint32_t stack_depth, void *param, uint32_t prio, void *task_handle, uint32_t core_id); + int32_t (* _task_create)(void *task_func, const char *name, uint32_t stack_depth, void *param, uint32_t prio, void *task_handle); + void (* _task_delete)(void *task_handle); + void (* _task_delay)(uint32_t tick); + int32_t (* _task_ms_to_tick)(uint32_t ms); + void *(* _task_get_current_task)(void); + int32_t (* _task_get_max_priority)(void); + void *(* _malloc)(uint32_t size); + void (* _free)(void *p); + int32_t (* _event_post)(const char* event_base, int32_t event_id, void* event_data, size_t event_data_size, uint32_t ticks_to_wait); + uint32_t (* _get_free_heap_size)(void); + uint32_t (* _rand)(void); + void (* _dport_access_stall_other_cpu_start_wrap)(void); + void (* _dport_access_stall_other_cpu_end_wrap)(void); + int32_t (* _phy_rf_deinit)(uint32_t module); + void (* _phy_load_cal_and_init)(uint32_t module); +#if CONFIG_IDF_TARGET_ESP32 + void (* _phy_common_clock_enable)(void); + void (* _phy_common_clock_disable)(void); +#endif + int32_t (* _read_mac)(uint8_t* mac, uint32_t type); + void (* _timer_arm)(void *timer, uint32_t tmout, bool repeat); + void (* _timer_disarm)(void *timer); + void (* _timer_done)(void *ptimer); + void (* _timer_setfn)(void *ptimer, void *pfunction, void *parg); + void (* _timer_arm_us)(void *ptimer, uint32_t us, bool repeat); + void (* _periph_module_enable)(uint32_t periph); + void (* _periph_module_disable)(uint32_t periph); + int64_t (* _esp_timer_get_time)(void); + int32_t (* _nvs_set_i8)(uint32_t handle, const char* key, int8_t value); + int32_t (* _nvs_get_i8)(uint32_t handle, const char* key, int8_t* out_value); + int32_t (* _nvs_set_u8)(uint32_t handle, const char* key, uint8_t value); + int32_t (* _nvs_get_u8)(uint32_t handle, const char* key, uint8_t* out_value); + int32_t (* _nvs_set_u16)(uint32_t handle, const char* key, uint16_t value); + int32_t (* _nvs_get_u16)(uint32_t handle, const char* key, uint16_t* out_value); + int32_t (* _nvs_open)(const char* name, uint32_t open_mode, uint32_t *out_handle); + void (* _nvs_close)(uint32_t handle); + int32_t (* _nvs_commit)(uint32_t handle); + int32_t (* _nvs_set_blob)(uint32_t handle, const char* key, const void* value, size_t length); + int32_t (* _nvs_get_blob)(uint32_t handle, const char* key, void* out_value, size_t* length); + int32_t (* _nvs_erase_key)(uint32_t handle, const char* key); + int32_t (* _get_random)(uint8_t *buf, size_t len); + int32_t (* _get_time)(void *t); + unsigned long (* _random)(void); +#if CONFIG_IDF_TARGET_ESP32S2BETA + uint32_t (* _slowclk_cal_get)(void); +#endif + void (* _log_write)(uint32_t level, const char* tag, const char* format, ...); + void (* _log_writev)(uint32_t level, const char* tag, const char* format, va_list args); + uint32_t (* _log_timestamp)(void); + void * (* _malloc_internal)(size_t size); + void * (* _realloc_internal)(void *ptr, size_t size); + void * (* _calloc_internal)(size_t n, size_t size); + void * (* _zalloc_internal)(size_t size); + void * (* _wifi_malloc)(size_t size); + void * (* _wifi_realloc)(void *ptr, size_t size); + void * (* _wifi_calloc)(size_t n, size_t size); + void * (* _wifi_zalloc)(size_t size); + void * (* _wifi_create_queue)(int32_t queue_len, int32_t item_size); + void (* _wifi_delete_queue)(void * queue); + int32_t (* _modem_sleep_enter)(uint32_t module); + int32_t (* _modem_sleep_exit)(uint32_t module); + int32_t (* _modem_sleep_register)(uint32_t module); + int32_t (* _modem_sleep_deregister)(uint32_t module); + uint32_t (* _coex_status_get)(void); + void (* _coex_condition_set)(uint32_t type, bool dissatisfy); + int32_t (* _coex_wifi_request)(uint32_t event, uint32_t latency, uint32_t duration); + int32_t (* _coex_wifi_release)(uint32_t event); + int32_t _magic; +} wifi_osi_funcs_t; + +extern wifi_osi_funcs_t g_wifi_osi_funcs; + +#ifdef __cplusplus +} +#endif + +#endif /* ESP_WIFI_OS_ADAPTER_H_ */ diff --git a/arch/xtensa/include/esp32/esp_wifi/esp_private/wifi_types.h b/arch/xtensa/include/esp32/esp_wifi/esp_private/wifi_types.h new file mode 100644 index 0000000000000..4542492c8f1ad --- /dev/null +++ b/arch/xtensa/include/esp32/esp_wifi/esp_private/wifi_types.h @@ -0,0 +1,54 @@ +// 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. + +#ifndef _WIFI_TYPES_H +#define _WIFI_TYPES_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief WiFi ioctl command type + * + */ +typedef enum { + WIFI_IOCTL_SET_STA_HT2040_COEX = 1, /**< Set the configuration of STA's HT2040 coexist management */ + WIFI_IOCTL_GET_STA_HT2040_COEX, /**< Get the configuration of STA's HT2040 coexist management */ + WIFI_IOCTL_MAX, +} wifi_ioctl_cmd_t; + +/** + * @brief Configuration for STA's HT2040 coexist management + * + */ +typedef struct { + int enable; /**< Indicate whether STA's HT2040 coexist management is enabled or not */ +} wifi_ht2040_coex_t; + +/** + * @brief Configuration for WiFi ioctl + * + */ +typedef struct { + union { + wifi_ht2040_coex_t ht2040_coex; /**< Configuration of STA's HT2040 coexist management */ + } data; /**< Configuration of ioctl command */ +} wifi_ioctl_config_t; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/arch/xtensa/include/esp32/esp_wifi/esp_smartconfig.h b/arch/xtensa/include/esp32/esp_wifi/esp_smartconfig.h new file mode 100644 index 0000000000000..058403ec60cba --- /dev/null +++ b/arch/xtensa/include/esp32/esp_wifi/esp_smartconfig.h @@ -0,0 +1,146 @@ +// 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. + +#ifndef __ESP_SMARTCONFIG_H__ +#define __ESP_SMARTCONFIG_H__ + +#include +#include +#include "../esp_common/esp_err.h" +#include "../esp_event/include/esp_event_base.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + SC_TYPE_ESPTOUCH = 0, /**< protocol: ESPTouch */ + SC_TYPE_AIRKISS, /**< protocol: AirKiss */ + SC_TYPE_ESPTOUCH_AIRKISS, /**< protocol: ESPTouch and AirKiss */ +} smartconfig_type_t; + +/** Smartconfig event declarations */ +typedef enum { + SC_EVENT_SCAN_DONE, /*!< ESP32 station smartconfig has finished to scan for APs */ + SC_EVENT_FOUND_CHANNEL, /*!< ESP32 station smartconfig has found the channel of the target AP */ + SC_EVENT_GOT_SSID_PSWD, /*!< ESP32 station smartconfig got the SSID and password */ + SC_EVENT_SEND_ACK_DONE, /*!< ESP32 station smartconfig has sent ACK to cellphone */ +} smartconfig_event_t; + +/** @brief smartconfig event base declaration */ +ESP_EVENT_DECLARE_BASE(SC_EVENT); + +/** Argument structure for SC_EVENT_GOT_SSID_PSWD event */ +typedef struct { + uint8_t ssid[32]; /**< SSID of the AP. Null terminated string. */ + uint8_t password[64]; /**< Password of the AP. Null terminated string. */ + bool bssid_set; /**< whether set MAC address of target AP or not. */ + uint8_t bssid[6]; /**< MAC address of target AP. */ + smartconfig_type_t type; /**< Type of smartconfig(ESPTouch or AirKiss). */ + uint8_t token; /**< Token from cellphone which is used to send ACK to cellphone. */ + uint8_t cellphone_ip[4]; /**< IP address of cellphone. */ +} smartconfig_event_got_ssid_pswd_t; + +/** Configure structure for esp_smartconfig_start */ +typedef struct { + bool enable_log; /**< Enable smartconfig logs. */ +} smartconfig_start_config_t; + +#define SMARTCONFIG_START_CONFIG_DEFAULT() { \ + .enable_log = false \ +}; + +/** + * @brief Get the version of SmartConfig. + * + * @return + * - SmartConfig version const char. + */ +const char *esp_smartconfig_get_version(void); + +/** + * @brief Start SmartConfig, config ESP device to connect AP. You need to broadcast information by phone APP. + * Device sniffer special packets from the air that containing SSID and password of target AP. + * + * @attention 1. This API can be called in station or softAP-station mode. + * @attention 2. Can not call esp_smartconfig_start twice before it finish, please call + * esp_smartconfig_stop first. + * + * @param config pointer to smartconfig start configure structure + * + * @return + * - ESP_OK: succeed + * - others: fail + */ +esp_err_t esp_smartconfig_start(const smartconfig_start_config_t *config); + +/** + * @brief Stop SmartConfig, free the buffer taken by esp_smartconfig_start. + * + * @attention Whether connect to AP succeed or not, this API should be called to free + * memory taken by smartconfig_start. + * + * @return + * - ESP_OK: succeed + * - others: fail + */ +esp_err_t esp_smartconfig_stop(void); + +/** + * @brief Set timeout of SmartConfig process. + * + * @attention Timing starts from SC_STATUS_FIND_CHANNEL status. SmartConfig will restart if timeout. + * + * @param time_s range 15s~255s, offset:45s. + * + * @return + * - ESP_OK: succeed + * - others: fail + */ +esp_err_t esp_esptouch_set_timeout(uint8_t time_s); + +/** + * @brief Set protocol type of SmartConfig. + * + * @attention If users need to set the SmartConfig type, please set it before calling + * esp_smartconfig_start. + * + * @param type Choose from the smartconfig_type_t. + * + * @return + * - ESP_OK: succeed + * - others: fail + */ +esp_err_t esp_smartconfig_set_type(smartconfig_type_t type); + +/** + * @brief Set mode of SmartConfig. default normal mode. + * + * @attention 1. Please call it before API esp_smartconfig_start. + * @attention 2. Fast mode have corresponding APP(phone). + * @attention 3. Two mode is compatible. + * + * @param enable false-disable(default); true-enable; + * + * @return + * - ESP_OK: succeed + * - others: fail + */ +esp_err_t esp_smartconfig_fast_mode(bool enable); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/arch/xtensa/include/esp32/esp_wifi/esp_wifi.h b/arch/xtensa/include/esp32/esp_wifi/esp_wifi.h new file mode 100644 index 0000000000000..6ff7fd0015a1a --- /dev/null +++ b/arch/xtensa/include/esp32/esp_wifi/esp_wifi.h @@ -0,0 +1,1053 @@ +// 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 about WiFi Programming + * + * The esp32 WiFi programming model can be depicted as following picture: + * + * + * default handler user handler + * ------------- --------------- --------------- + * | | event | | callback or | | + * | tcpip | ---------> | event | ----------> | application | + * | stack | | task | event | task | + * |-----------| |-------------| |-------------| + * /|\ | + * | | + * event | | + * | | + * | | + * --------------- | + * | | | + * | WiFi Driver |/__________________| + * | |\ API call + * | | + * |-------------| + * + * The WiFi driver can be consider as black box, it knows nothing about the high layer code, such as + * TCPIP stack, application task, event task etc, all it can do is to receive API call from high layer + * or post event queue to a specified Queue, which is initialized by API esp_wifi_init(). + * + * The event task is a daemon task, which receives events from WiFi driver or from other subsystem, such + * as TCPIP stack, event task will call the default callback function on receiving the event. For example, + * on receiving event SYSTEM_EVENT_STA_CONNECTED, it will call tcpip_adapter_start() to start the DHCP + * client in it's default handler. + * + * Application can register it's own event callback function by API esp_event_init, then the application callback + * function will be called after the default callback. Also, if application doesn't want to execute the callback + * in the event task, what it needs to do is to post the related event to application task in the application callback function. + * + * The application task (code) generally mixes all these thing together, it calls APIs to init the system/WiFi and + * handle the events when necessary. + * + */ + +#ifndef __ESP_WIFI_H__ +#define __ESP_WIFI_H__ + +#include +#include +#include "../esp_common/esp_err.h" +#include "esp_wifi_types.h" +#include "../esp_event/include/esp_event.h" +//#include "esp_event.h" +#include "esp_private/esp_wifi_private.h" +#include "esp_wifi_default.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ESP_ERR_WIFI_NOT_INIT (ESP_ERR_WIFI_BASE + 1) /*!< WiFi driver was not installed by esp_wifi_init */ +#define ESP_ERR_WIFI_NOT_STARTED (ESP_ERR_WIFI_BASE + 2) /*!< WiFi driver was not started by esp_wifi_start */ +#define ESP_ERR_WIFI_NOT_STOPPED (ESP_ERR_WIFI_BASE + 3) /*!< WiFi driver was not stopped by esp_wifi_stop */ +#define ESP_ERR_WIFI_IF (ESP_ERR_WIFI_BASE + 4) /*!< WiFi interface error */ +#define ESP_ERR_WIFI_MODE (ESP_ERR_WIFI_BASE + 5) /*!< WiFi mode error */ +#define ESP_ERR_WIFI_STATE (ESP_ERR_WIFI_BASE + 6) /*!< WiFi internal state error */ +#define ESP_ERR_WIFI_CONN (ESP_ERR_WIFI_BASE + 7) /*!< WiFi internal control block of station or soft-AP error */ +#define ESP_ERR_WIFI_NVS (ESP_ERR_WIFI_BASE + 8) /*!< WiFi internal NVS module error */ +#define ESP_ERR_WIFI_MAC (ESP_ERR_WIFI_BASE + 9) /*!< MAC address is invalid */ +#define ESP_ERR_WIFI_SSID (ESP_ERR_WIFI_BASE + 10) /*!< SSID is invalid */ +#define ESP_ERR_WIFI_PASSWORD (ESP_ERR_WIFI_BASE + 11) /*!< Password is invalid */ +#define ESP_ERR_WIFI_TIMEOUT (ESP_ERR_WIFI_BASE + 12) /*!< Timeout error */ +#define ESP_ERR_WIFI_WAKE_FAIL (ESP_ERR_WIFI_BASE + 13) /*!< WiFi is in sleep state(RF closed) and wakeup fail */ +#define ESP_ERR_WIFI_WOULD_BLOCK (ESP_ERR_WIFI_BASE + 14) /*!< The caller would block */ +#define ESP_ERR_WIFI_NOT_CONNECT (ESP_ERR_WIFI_BASE + 15) /*!< Station still in disconnect status */ + +#define ESP_ERR_WIFI_POST (ESP_ERR_WIFI_BASE + 18) /*!< Failed to post the event to WiFi task */ +#define ESP_ERR_WIFI_INIT_STATE (ESP_ERR_WIFI_BASE + 19) /*!< Invalod WiFi state when init/deinit is called */ +#define ESP_ERR_WIFI_STOP_STATE (ESP_ERR_WIFI_BASE + 20) /*!< Returned when WiFi is stopping */ + +/** + * @brief WiFi stack configuration parameters passed to esp_wifi_init call. + */ +typedef struct { + system_event_handler_t event_handler; /**< WiFi event handler */ + wifi_osi_funcs_t* osi_funcs; /**< WiFi OS functions */ + wpa_crypto_funcs_t wpa_crypto_funcs; /**< WiFi station crypto functions when connect */ + int static_rx_buf_num; /**< WiFi static RX buffer number */ + int dynamic_rx_buf_num; /**< WiFi dynamic RX buffer number */ + int tx_buf_type; /**< WiFi TX buffer type */ + int static_tx_buf_num; /**< WiFi static TX buffer number */ + int dynamic_tx_buf_num; /**< WiFi dynamic TX buffer number */ + int csi_enable; /**< WiFi channel state information enable flag */ + int ampdu_rx_enable; /**< WiFi AMPDU RX feature enable flag */ + int ampdu_tx_enable; /**< WiFi AMPDU TX feature enable flag */ + int nvs_enable; /**< WiFi NVS flash enable flag */ + int nano_enable; /**< Nano option for printf/scan family enable flag */ + int tx_ba_win; /**< WiFi Block Ack TX window size */ + int rx_ba_win; /**< WiFi Block Ack RX window size */ + int wifi_task_core_id; /**< WiFi Task Core ID */ + int beacon_max_len; /**< WiFi softAP maximum length of the beacon */ + int mgmt_sbuf_num; /**< WiFi management short buffer number, the minimum value is 6, the maximum value is 32 */ + uint64_t feature_caps; /**< Enables additional WiFi features and capabilities */ + int magic; /**< WiFi init magic number, it should be the last field */ +} wifi_init_config_t; + +#ifdef CONFIG_ESP32_WIFI_STATIC_TX_BUFFER_NUM +#define WIFI_STATIC_TX_BUFFER_NUM CONFIG_ESP32_WIFI_STATIC_TX_BUFFER_NUM +#else +#define WIFI_STATIC_TX_BUFFER_NUM 0 +#endif + +#ifdef CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM +#define WIFI_DYNAMIC_TX_BUFFER_NUM CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM +#else +#define WIFI_DYNAMIC_TX_BUFFER_NUM 0 +#endif + +#if CONFIG_ESP32_WIFI_CSI_ENABLED +#define WIFI_CSI_ENABLED 1 +#else +#define WIFI_CSI_ENABLED 0 +#endif + +#if CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED +#define WIFI_AMPDU_RX_ENABLED 1 +#else +#define WIFI_AMPDU_RX_ENABLED 0 +#endif + +#if CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED +#define WIFI_AMPDU_TX_ENABLED 1 +#else +#define WIFI_AMPDU_TX_ENABLED 0 +#endif + +#if CONFIG_ESP32_WIFI_NVS_ENABLED +#define WIFI_NVS_ENABLED 1 +#else +#define WIFI_NVS_ENABLED 0 +#endif + +#if CONFIG_NEWLIB_NANO_FORMAT +#define WIFI_NANO_FORMAT_ENABLED 1 +#else +#define WIFI_NANO_FORMAT_ENABLED 0 +#endif + +extern const wpa_crypto_funcs_t g_wifi_default_wpa_crypto_funcs; +extern uint64_t g_wifi_feature_caps; + +#define WIFI_INIT_CONFIG_MAGIC 0x1F2F3F4F + +#ifdef CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED +#define WIFI_DEFAULT_TX_BA_WIN CONFIG_ESP32_WIFI_TX_BA_WIN +#else +#define WIFI_DEFAULT_TX_BA_WIN 0 /* unused if ampdu_tx_enable == false */ +#endif + +#ifdef CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED +#define WIFI_DEFAULT_RX_BA_WIN CONFIG_ESP32_WIFI_RX_BA_WIN +#else +#define WIFI_DEFAULT_RX_BA_WIN 0 /* unused if ampdu_rx_enable == false */ +#endif + +#if CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1 +#define WIFI_TASK_CORE_ID 1 +#else +#define WIFI_TASK_CORE_ID 0 +#endif + +#ifdef CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN +#define WIFI_SOFTAP_BEACON_MAX_LEN CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN +#else +#define WIFI_SOFTAP_BEACON_MAX_LEN 752 +#endif + +#ifdef CONFIG_ESP32_WIFI_MGMT_SBUF_NUM +#define WIFI_MGMT_SBUF_NUM CONFIG_ESP32_WIFI_MGMT_SBUF_NUM +#else +#define WIFI_MGMT_SBUF_NUM 32 +#endif + +#define CONFIG_FEATURE_WPA3_SAE_BIT (1<<0) + +#define WIFI_INIT_CONFIG_DEFAULT() { \ + .event_handler = &esp_event_send_internal, \ + .osi_funcs = &g_wifi_osi_funcs, \ + .wpa_crypto_funcs = g_wifi_default_wpa_crypto_funcs, \ + .static_rx_buf_num = CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM,\ + .dynamic_rx_buf_num = CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM,\ + .tx_buf_type = CONFIG_ESP32_WIFI_TX_BUFFER_TYPE,\ + .static_tx_buf_num = WIFI_STATIC_TX_BUFFER_NUM,\ + .dynamic_tx_buf_num = WIFI_DYNAMIC_TX_BUFFER_NUM,\ + .csi_enable = WIFI_CSI_ENABLED,\ + .ampdu_rx_enable = WIFI_AMPDU_RX_ENABLED,\ + .ampdu_tx_enable = WIFI_AMPDU_TX_ENABLED,\ + .nvs_enable = WIFI_NVS_ENABLED,\ + .nano_enable = WIFI_NANO_FORMAT_ENABLED,\ + .tx_ba_win = WIFI_DEFAULT_TX_BA_WIN,\ + .rx_ba_win = WIFI_DEFAULT_RX_BA_WIN,\ + .wifi_task_core_id = WIFI_TASK_CORE_ID,\ + .beacon_max_len = WIFI_SOFTAP_BEACON_MAX_LEN, \ + .mgmt_sbuf_num = WIFI_MGMT_SBUF_NUM, \ + .feature_caps = g_wifi_feature_caps, \ + .magic = WIFI_INIT_CONFIG_MAGIC\ +}; + +/** + * @brief Init WiFi + * Alloc resource for WiFi driver, such as WiFi control structure, RX/TX buffer, + * WiFi NVS structure etc, this WiFi also start WiFi task + * + * @attention 1. This API must be called before all other WiFi API can be called + * @attention 2. Always use WIFI_INIT_CONFIG_DEFAULT macro to init the config to default values, this can + * guarantee all the fields got correct value when more fields are added into wifi_init_config_t + * in future release. If you want to set your owner initial values, overwrite the default values + * which are set by WIFI_INIT_CONFIG_DEFAULT, please be notified that the field 'magic' of + * wifi_init_config_t should always be WIFI_INIT_CONFIG_MAGIC! + * + * @param config pointer to WiFi init configuration structure; can point to a temporary variable. + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_NO_MEM: out of memory + * - others: refer to error code esp_err.h + */ +esp_err_t esp_wifi_init(const wifi_init_config_t *config); + +/** + * @brief Deinit WiFi + * Free all resource allocated in esp_wifi_init and stop WiFi task + * + * @attention 1. This API should be called if you want to remove WiFi driver from the system + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + */ +esp_err_t esp_wifi_deinit(void); + +/** + * @brief Set the WiFi operating mode + * + * Set the WiFi operating mode as station, soft-AP or station+soft-AP, + * The default mode is soft-AP mode. + * + * @param mode WiFi operating mode + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_INVALID_ARG: invalid argument + * - others: refer to error code in esp_err.h + */ +esp_err_t esp_wifi_set_mode(wifi_mode_t mode); + +/** + * @brief Get current operating mode of WiFi + * + * @param[out] mode store current WiFi mode + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_INVALID_ARG: invalid argument + */ +esp_err_t esp_wifi_get_mode(wifi_mode_t *mode); + +/** + * @brief Start WiFi according to current configuration + * If mode is WIFI_MODE_STA, it create station control block and start station + * If mode is WIFI_MODE_AP, it create soft-AP control block and start soft-AP + * If mode is WIFI_MODE_APSTA, it create soft-AP and station control block and start soft-AP and station + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_INVALID_ARG: invalid argument + * - ESP_ERR_NO_MEM: out of memory + * - ESP_ERR_WIFI_CONN: WiFi internal error, station or soft-AP control block wrong + * - ESP_FAIL: other WiFi internal errors + */ +esp_err_t esp_wifi_start(void); + +/** + * @brief Stop WiFi + * If mode is WIFI_MODE_STA, it stop station and free station control block + * If mode is WIFI_MODE_AP, it stop soft-AP and free soft-AP control block + * If mode is WIFI_MODE_APSTA, it stop station/soft-AP and free station/soft-AP control block + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + */ +esp_err_t esp_wifi_stop(void); + +/** + * @brief Restore WiFi stack persistent settings to default values + * + * This function will reset settings made using the following APIs: + * - esp_wifi_get_auto_connect, + * - esp_wifi_set_protocol, + * - esp_wifi_set_config related + * - esp_wifi_set_mode + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + */ +esp_err_t esp_wifi_restore(void); + +/** + * @brief Connect the ESP32 WiFi station to the AP. + * + * @attention 1. This API only impact WIFI_MODE_STA or WIFI_MODE_APSTA mode + * @attention 2. If the ESP32 is connected to an AP, call esp_wifi_disconnect to disconnect. + * @attention 3. The scanning triggered by esp_wifi_start_scan() will not be effective until connection between ESP32 and the AP is established. + * If ESP32 is scanning and connecting at the same time, ESP32 will abort scanning and return a warning message and error + * number ESP_ERR_WIFI_STATE. + * If you want to do reconnection after ESP32 received disconnect event, remember to add the maximum retry time, otherwise the called + * scan will not work. This is especially true when the AP doesn't exist, and you still try reconnection after ESP32 received disconnect + * event with the reason code WIFI_REASON_NO_AP_FOUND. + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_WIFI_NOT_STARTED: WiFi is not started by esp_wifi_start + * - ESP_ERR_WIFI_CONN: WiFi internal error, station or soft-AP control block wrong + * - ESP_ERR_WIFI_SSID: SSID of AP which station connects is invalid + */ +esp_err_t esp_wifi_connect(void); + +/** + * @brief Disconnect the ESP32 WiFi station from the AP. + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi was not initialized by esp_wifi_init + * - ESP_ERR_WIFI_NOT_STARTED: WiFi was not started by esp_wifi_start + * - ESP_FAIL: other WiFi internal errors + */ +esp_err_t esp_wifi_disconnect(void); + +/** + * @brief Currently this API is just an stub API + * + + * @return + * - ESP_OK: succeed + * - others: fail + */ +esp_err_t esp_wifi_clear_fast_connect(void); + +/** + * @brief deauthenticate all stations or associated id equals to aid + * + * @param aid when aid is 0, deauthenticate all stations, otherwise deauthenticate station whose associated id is aid + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_WIFI_NOT_STARTED: WiFi was not started by esp_wifi_start + * - ESP_ERR_INVALID_ARG: invalid argument + * - ESP_ERR_WIFI_MODE: WiFi mode is wrong + */ +esp_err_t esp_wifi_deauth_sta(uint16_t aid); + +/** + * @brief Scan all available APs. + * + * @attention If this API is called, the found APs are stored in WiFi driver dynamic allocated memory and the + * will be freed in esp_wifi_scan_get_ap_records, so generally, call esp_wifi_scan_get_ap_records to cause + * the memory to be freed once the scan is done + * @attention The values of maximum active scan time and passive scan time per channel are limited to 1500 milliseconds. + * Values above 1500ms may cause station to disconnect from AP and are not recommended. + * + * @param config configuration of scanning + * @param block if block is true, this API will block the caller until the scan is done, otherwise + * it will return immediately + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_WIFI_NOT_STARTED: WiFi was not started by esp_wifi_start + * - ESP_ERR_WIFI_TIMEOUT: blocking scan is timeout + * - ESP_ERR_WIFI_STATE: wifi still connecting when invoke esp_wifi_scan_start + * - others: refer to error code in esp_err.h + */ +esp_err_t esp_wifi_scan_start(const wifi_scan_config_t *config, bool block); + +/** + * @brief Stop the scan in process + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_WIFI_NOT_STARTED: WiFi is not started by esp_wifi_start + */ +esp_err_t esp_wifi_scan_stop(void); + +/** + * @brief Get number of APs found in last scan + * + * @param[out] number store number of APIs found in last scan + * + * @attention This API can only be called when the scan is completed, otherwise it may get wrong value. + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_WIFI_NOT_STARTED: WiFi is not started by esp_wifi_start + * - ESP_ERR_INVALID_ARG: invalid argument + */ +esp_err_t esp_wifi_scan_get_ap_num(uint16_t *number); + +/** + * @brief Get AP list found in last scan + * + * @param[inout] number As input param, it stores max AP number ap_records can hold. + * As output param, it receives the actual AP number this API returns. + * @param ap_records wifi_ap_record_t array to hold the found APs + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_WIFI_NOT_STARTED: WiFi is not started by esp_wifi_start + * - ESP_ERR_INVALID_ARG: invalid argument + * - ESP_ERR_NO_MEM: out of memory + */ +esp_err_t esp_wifi_scan_get_ap_records(uint16_t *number, wifi_ap_record_t *ap_records); + + +/** + * @brief Get information of AP which the ESP32 station is associated with + * + * @param ap_info the wifi_ap_record_t to hold AP information + * sta can get the connected ap's phy mode info through the struct member + * phy_11b,phy_11g,phy_11n,phy_lr in the wifi_ap_record_t struct. + * For example, phy_11b = 1 imply that ap support 802.11b mode + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_CONN: The station interface don't initialized + * - ESP_ERR_WIFI_NOT_CONNECT: The station is in disconnect status + */ +esp_err_t esp_wifi_sta_get_ap_info(wifi_ap_record_t *ap_info); + +/** + * @brief Set current WiFi power save type + * + * @attention Default power save type is WIFI_PS_MIN_MODEM. + * + * @param type power save type + * + * @return ESP_OK: succeed + */ +esp_err_t esp_wifi_set_ps(wifi_ps_type_t type); + +/** + * @brief Get current WiFi power save type + * + * @attention Default power save type is WIFI_PS_MIN_MODEM. + * + * @param[out] type: store current power save type + * + * @return ESP_OK: succeed + */ +esp_err_t esp_wifi_get_ps(wifi_ps_type_t *type); + +/** + * @brief Set protocol type of specified interface + * The default protocol is (WIFI_PROTOCOL_11B|WIFI_PROTOCOL_11G|WIFI_PROTOCOL_11N) + * + * @attention Currently we only support 802.11b or 802.11bg or 802.11bgn mode + * + * @param ifx interfaces + * @param protocol_bitmap WiFi protocol bitmap + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_WIFI_IF: invalid interface + * - others: refer to error codes in esp_err.h + */ +esp_err_t esp_wifi_set_protocol(wifi_interface_t ifx, uint8_t protocol_bitmap); + +/** + * @brief Get the current protocol bitmap of the specified interface + * + * @param ifx interface + * @param[out] protocol_bitmap store current WiFi protocol bitmap of interface ifx + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_WIFI_IF: invalid interface + * - ESP_ERR_INVALID_ARG: invalid argument + * - others: refer to error codes in esp_err.h + */ +esp_err_t esp_wifi_get_protocol(wifi_interface_t ifx, uint8_t *protocol_bitmap); + +/** + * @brief Set the bandwidth of ESP32 specified interface + * + * @attention 1. API return false if try to configure an interface that is not enabled + * @attention 2. WIFI_BW_HT40 is supported only when the interface support 11N + * + * @param ifx interface to be configured + * @param bw bandwidth + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_WIFI_IF: invalid interface + * - ESP_ERR_INVALID_ARG: invalid argument + * - others: refer to error codes in esp_err.h + */ +esp_err_t esp_wifi_set_bandwidth(wifi_interface_t ifx, wifi_bandwidth_t bw); + +/** + * @brief Get the bandwidth of ESP32 specified interface + * + * @attention 1. API return false if try to get a interface that is not enable + * + * @param ifx interface to be configured + * @param[out] bw store bandwidth of interface ifx + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_WIFI_IF: invalid interface + * - ESP_ERR_INVALID_ARG: invalid argument + */ +esp_err_t esp_wifi_get_bandwidth(wifi_interface_t ifx, wifi_bandwidth_t *bw); + +/** + * @brief Set primary/secondary channel of ESP32 + * + * @attention 1. This API should be called after esp_wifi_start() + * @attention 2. When ESP32 is in STA mode, this API should not be called when STA is scanning or connecting to an external AP + * @attention 3. When ESP32 is in softAP mode, this API should not be called when softAP has connected to external STAs + * @attention 4. When ESP32 is in STA+softAP mode, this API should not be called when in the scenarios described above + * + * @param primary for HT20, primary is the channel number, for HT40, primary is the primary channel + * @param second for HT20, second is ignored, for HT40, second is the second channel + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_WIFI_IF: invalid interface + * - ESP_ERR_INVALID_ARG: invalid argument + */ +esp_err_t esp_wifi_set_channel(uint8_t primary, wifi_second_chan_t second); + +/** + * @brief Get the primary/secondary channel of ESP32 + * + * @attention 1. API return false if try to get a interface that is not enable + * + * @param primary store current primary channel + * @param[out] second store current second channel + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_INVALID_ARG: invalid argument + */ +esp_err_t esp_wifi_get_channel(uint8_t *primary, wifi_second_chan_t *second); + +/** + * @brief configure country info + * + * @attention 1. The default country is {.cc="CN", .schan=1, .nchan=13, policy=WIFI_COUNTRY_POLICY_AUTO} + * @attention 2. When the country policy is WIFI_COUNTRY_POLICY_AUTO, the country info of the AP to which + * the station is connected is used. E.g. if the configured country info is {.cc="USA", .schan=1, .nchan=11} + * and the country info of the AP to which the station is connected is {.cc="JP", .schan=1, .nchan=14} + * then the country info that will be used is {.cc="JP", .schan=1, .nchan=14}. If the station disconnected + * from the AP the country info is set back back to the country info of the station automatically, + * {.cc="US", .schan=1, .nchan=11} in the example. + * @attention 3. When the country policy is WIFI_COUNTRY_POLICY_MANUAL, always use the configured country info. + * @attention 4. When the country info is changed because of configuration or because the station connects to a different + * external AP, the country IE in probe response/beacon of the soft-AP is changed also. + * @attention 5. The country configuration is not stored into flash + * @attention 6. This API doesn't validate the per-country rules, it's up to the user to fill in all fields according to + * local regulations. + * + * @param country the configured country info + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_INVALID_ARG: invalid argument + */ +esp_err_t esp_wifi_set_country(const wifi_country_t *country); + +/** + * @brief get the current country info + * + * @param country country info + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_INVALID_ARG: invalid argument + */ +esp_err_t esp_wifi_get_country(wifi_country_t *country); + + +/** + * @brief Set MAC address of the ESP32 WiFi station or the soft-AP interface. + * + * @attention 1. This API can only be called when the interface is disabled + * @attention 2. ESP32 soft-AP and station have different MAC addresses, do not set them to be the same. + * @attention 3. The bit 0 of the first byte of ESP32 MAC address can not be 1. For example, the MAC address + * can set to be "1a:XX:XX:XX:XX:XX", but can not be "15:XX:XX:XX:XX:XX". + * + * @param ifx interface + * @param mac the MAC address + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_INVALID_ARG: invalid argument + * - ESP_ERR_WIFI_IF: invalid interface + * - ESP_ERR_WIFI_MAC: invalid mac address + * - ESP_ERR_WIFI_MODE: WiFi mode is wrong + * - others: refer to error codes in esp_err.h + */ +esp_err_t esp_wifi_set_mac(wifi_interface_t ifx, const uint8_t mac[6]); + +/** + * @brief Get mac of specified interface + * + * @param ifx interface + * @param[out] mac store mac of the interface ifx + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_INVALID_ARG: invalid argument + * - ESP_ERR_WIFI_IF: invalid interface + */ +esp_err_t esp_wifi_get_mac(wifi_interface_t ifx, uint8_t mac[6]); + +/** + * @brief The RX callback function in the promiscuous mode. + * Each time a packet is received, the callback function will be called. + * + * @param buf Data received. Type of data in buffer (wifi_promiscuous_pkt_t or wifi_pkt_rx_ctrl_t) indicated by 'type' parameter. + * @param type promiscuous packet type. + * + */ +typedef void (* wifi_promiscuous_cb_t)(void *buf, wifi_promiscuous_pkt_type_t type); + +/** + * @brief Register the RX callback function in the promiscuous mode. + * + * Each time a packet is received, the registered callback function will be called. + * + * @param cb callback + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + */ +esp_err_t esp_wifi_set_promiscuous_rx_cb(wifi_promiscuous_cb_t cb); + +/** + * @brief Enable the promiscuous mode. + * + * @param en false - disable, true - enable + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + */ +esp_err_t esp_wifi_set_promiscuous(bool en); + +/** + * @brief Get the promiscuous mode. + * + * @param[out] en store the current status of promiscuous mode + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_INVALID_ARG: invalid argument + */ +esp_err_t esp_wifi_get_promiscuous(bool *en); + +/** + * @brief Enable the promiscuous mode packet type filter. + * + * @note The default filter is to filter all packets except WIFI_PKT_MISC + * + * @param filter the packet type filtered in promiscuous mode. + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + */ +esp_err_t esp_wifi_set_promiscuous_filter(const wifi_promiscuous_filter_t *filter); + +/** + * @brief Get the promiscuous filter. + * + * @param[out] filter store the current status of promiscuous filter + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_INVALID_ARG: invalid argument + */ +esp_err_t esp_wifi_get_promiscuous_filter(wifi_promiscuous_filter_t *filter); + +/** + * @brief Enable subtype filter of the control packet in promiscuous mode. + * + * @note The default filter is to filter none control packet. + * + * @param filter the subtype of the control packet filtered in promiscuous mode. + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + */ +esp_err_t esp_wifi_set_promiscuous_ctrl_filter(const wifi_promiscuous_filter_t *filter); + +/** + * @brief Get the subtype filter of the control packet in promiscuous mode. + * + * @param[out] filter store the current status of subtype filter of the control packet in promiscuous mode + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_WIFI_ARG: invalid argument + */ +esp_err_t esp_wifi_get_promiscuous_ctrl_filter(wifi_promiscuous_filter_t *filter); + +/** + * @brief Set the configuration of the ESP32 STA or AP + * + * @attention 1. This API can be called only when specified interface is enabled, otherwise, API fail + * @attention 2. For station configuration, bssid_set needs to be 0; and it needs to be 1 only when users need to check the MAC address of the AP. + * @attention 3. ESP32 is limited to only one channel, so when in the soft-AP+station mode, the soft-AP will adjust its channel automatically to be the same as + * the channel of the ESP32 station. + * + * @param interface interface + * @param conf station or soft-AP configuration + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_INVALID_ARG: invalid argument + * - ESP_ERR_WIFI_IF: invalid interface + * - ESP_ERR_WIFI_MODE: invalid mode + * - ESP_ERR_WIFI_PASSWORD: invalid password + * - ESP_ERR_WIFI_NVS: WiFi internal NVS error + * - others: refer to the erro code in esp_err.h + */ +esp_err_t esp_wifi_set_config(wifi_interface_t interface, wifi_config_t *conf); + +/** + * @brief Get configuration of specified interface + * + * @param interface interface + * @param[out] conf station or soft-AP configuration + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_INVALID_ARG: invalid argument + * - ESP_ERR_WIFI_IF: invalid interface + */ +esp_err_t esp_wifi_get_config(wifi_interface_t interface, wifi_config_t *conf); + +/** + * @brief Get STAs associated with soft-AP + * + * @attention SSC only API + * + * @param[out] sta station list + * ap can get the connected sta's phy mode info through the struct member + * phy_11b,phy_11g,phy_11n,phy_lr in the wifi_sta_info_t struct. + * For example, phy_11b = 1 imply that sta support 802.11b mode + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_INVALID_ARG: invalid argument + * - ESP_ERR_WIFI_MODE: WiFi mode is wrong + * - ESP_ERR_WIFI_CONN: WiFi internal error, the station/soft-AP control block is invalid + */ +esp_err_t esp_wifi_ap_get_sta_list(wifi_sta_list_t *sta); + + +/** + * @brief Set the WiFi API configuration storage type + * + * @attention 1. The default value is WIFI_STORAGE_FLASH + * + * @param storage : storage type + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_INVALID_ARG: invalid argument + */ +esp_err_t esp_wifi_set_storage(wifi_storage_t storage); + +/** + * @brief Function signature for received Vendor-Specific Information Element callback. + * @param ctx Context argument, as passed to esp_wifi_set_vendor_ie_cb() when registering callback. + * @param type Information element type, based on frame type received. + * @param sa Source 802.11 address. + * @param vnd_ie Pointer to the vendor specific element data received. + * @param rssi Received signal strength indication. + */ +typedef void (*esp_vendor_ie_cb_t) (void *ctx, wifi_vendor_ie_type_t type, const uint8_t sa[6], const vendor_ie_data_t *vnd_ie, int rssi); + +/** + * @brief Set 802.11 Vendor-Specific Information Element + * + * @param enable If true, specified IE is enabled. If false, specified IE is removed. + * @param type Information Element type. Determines the frame type to associate with the IE. + * @param idx Index to set or clear. Each IE type can be associated with up to two elements (indices 0 & 1). + * @param vnd_ie Pointer to vendor specific element data. First 6 bytes should be a header with fields matching vendor_ie_data_t. + * If enable is false, this argument is ignored and can be NULL. Data does not need to remain valid after the function returns. + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init() + * - ESP_ERR_INVALID_ARG: Invalid argument, including if first byte of vnd_ie is not WIFI_VENDOR_IE_ELEMENT_ID (0xDD) + * or second byte is an invalid length. + * - ESP_ERR_NO_MEM: Out of memory + */ +esp_err_t esp_wifi_set_vendor_ie(bool enable, wifi_vendor_ie_type_t type, wifi_vendor_ie_id_t idx, const void *vnd_ie); + +/** + * @brief Register Vendor-Specific Information Element monitoring callback. + * + * @param cb Callback function + * @param ctx Context argument, passed to callback function. + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + */ +esp_err_t esp_wifi_set_vendor_ie_cb(esp_vendor_ie_cb_t cb, void *ctx); + +/** + * @brief Set maximum WiFi transmitting power + * + * @param power Maximum WiFi transmitting power, unit is 0.25dBm, range is [40, 82] corresponding to 10dBm - 20.5dBm here. + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_WIFI_NOT_START: WiFi is not started by esp_wifi_start + * - ESP_ERR_WIFI_NOT_ARG: invalid argument + */ +esp_err_t esp_wifi_set_max_tx_power(int8_t power); + +/** + * @brief Get maximum WiFi transmiting power + * + * @param power Maximum WiFi transmitting power, unit is 0.25dBm. + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_WIFI_NOT_START: WiFi is not started by esp_wifi_start + * - ESP_ERR_INVALID_ARG: invalid argument + */ +esp_err_t esp_wifi_get_max_tx_power(int8_t *power); + +/** + * @brief Set mask to enable or disable some WiFi events + * + * @attention 1. Mask can be created by logical OR of various WIFI_EVENT_MASK_ constants. + * Events which have corresponding bit set in the mask will not be delivered to the system event handler. + * @attention 2. Default WiFi event mask is WIFI_EVENT_MASK_AP_PROBEREQRECVED. + * @attention 3. There may be lots of stations sending probe request data around. + * Don't unmask this event unless you need to receive probe request data. + * + * @param mask WiFi event mask. + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + */ +esp_err_t esp_wifi_set_event_mask(uint32_t mask); + +/** + * @brief Get mask of WiFi events + * + * @param mask WiFi event mask. + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_WIFI_ARG: invalid argument + */ +esp_err_t esp_wifi_get_event_mask(uint32_t *mask); + +/** + * @brief Send raw ieee80211 data + * + * @attention Currently only support for sending beacon/probe request/probe response/action and non-QoS + * data frame + * + * @param ifx interface if the Wi-Fi mode is Station, the ifx should be WIFI_IF_STA. If the Wi-Fi + * mode is SoftAP, the ifx should be WIFI_IF_AP. If the Wi-Fi mode is Station+SoftAP, the + * ifx should be WIFI_IF_STA or WIFI_IF_AP. If the ifx is wrong, the API returns ESP_ERR_WIFI_IF. + * @param buffer raw ieee80211 buffer + * @param len the length of raw buffer, the len must be <= 1500 Bytes and >= 24 Bytes + * @param en_sys_seq indicate whether use the internal sequence number. If en_sys_seq is false, the + * sequence in raw buffer is unchanged, otherwise it will be overwritten by WiFi driver with + * the system sequence number. + * Generally, if esp_wifi_80211_tx is called before the Wi-Fi connection has been set up, both + * en_sys_seq==true and en_sys_seq==false are fine. However, if the API is called after the Wi-Fi + * connection has been set up, en_sys_seq must be true, otherwise ESP_ERR_WIFI_ARG is returned. + * + * @return + * - ESP_OK: success + * - ESP_ERR_WIFI_IF: Invalid interface + * - ESP_ERR_INVALID_ARG: Invalid parameter + * - ESP_ERR_WIFI_NO_MEM: out of memory + */ + +esp_err_t esp_wifi_80211_tx(wifi_interface_t ifx, const void *buffer, int len, bool en_sys_seq); + +/** + * @brief The RX callback function of Channel State Information(CSI) data. + * + * Each time a CSI data is received, the callback function will be called. + * + * @param ctx context argument, passed to esp_wifi_set_csi_rx_cb() when registering callback function. + * @param data CSI data received. The memory that it points to will be deallocated after callback function returns. + * + */ +typedef void (* wifi_csi_cb_t)(void *ctx, wifi_csi_info_t *data); + + +/** + * @brief Register the RX callback function of CSI data. + * + * Each time a CSI data is received, the callback function will be called. + * + * @param cb callback + * @param ctx context argument, passed to callback function + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + */ + +esp_err_t esp_wifi_set_csi_rx_cb(wifi_csi_cb_t cb, void *ctx); + +/** + * @brief Set CSI data configuration + * + * @param config configuration + * + * return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_WIFI_NOT_START: WiFi is not started by esp_wifi_start or promiscuous mode is not enabled + * - ESP_ERR_INVALID_ARG: invalid argument + */ +esp_err_t esp_wifi_set_csi_config(const wifi_csi_config_t *config); + +/** + * @brief Enable or disable CSI + * + * @param en true - enable, false - disable + * + * return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_WIFI_NOT_START: WiFi is not started by esp_wifi_start or promiscuous mode is not enabled + * - ESP_ERR_INVALID_ARG: invalid argument + */ +esp_err_t esp_wifi_set_csi(bool en); + +/** + * @brief Set antenna GPIO configuration + * + * @param config Antenna GPIO configuration. + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_WIFI_ARG: Invalid argument, e.g. parameter is NULL, invalid GPIO number etc + */ +esp_err_t esp_wifi_set_ant_gpio(const wifi_ant_gpio_config_t *config); + +/** + * @brief Get current antenna GPIO configuration + * + * @param config Antenna GPIO configuration. + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_WIFI_ARG: invalid argument, e.g. parameter is NULL + */ +esp_err_t esp_wifi_get_ant_gpio(wifi_ant_gpio_config_t *config); + + +/** + * @brief Set antenna configuration + * + * @param config Antenna configuration. + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_WIFI_ARG: Invalid argument, e.g. parameter is NULL, invalid antenna mode or invalid GPIO number + */ +esp_err_t esp_wifi_set_ant(const wifi_ant_config_t *config); + +/** + * @brief Get current antenna configuration + * + * @param config Antenna configuration. + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init + * - ESP_ERR_WIFI_ARG: invalid argument, e.g. parameter is NULL + */ +esp_err_t esp_wifi_get_ant(wifi_ant_config_t *config); + +#ifdef __cplusplus +} +#endif + +#endif /* __ESP_WIFI_H__ */ diff --git a/arch/xtensa/include/esp32/esp_wifi/esp_wifi_crypto_types.h b/arch/xtensa/include/esp32/esp_wifi/esp_wifi_crypto_types.h new file mode 100644 index 0000000000000..47620802e089f --- /dev/null +++ b/arch/xtensa/include/esp32/esp_wifi/esp_wifi_crypto_types.h @@ -0,0 +1,404 @@ +// Hardware crypto support 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. + + +#ifndef __ESP_WIFI_CRYPTO_TYPES_H__ +#define __ESP_WIFI_CRYPTO_TYPES_H__ + +/* This is an internal API header for configuring the implementation used for WiFi cryptographic + operations. + + During normal operation, you don't need to use any of these types or functions in this header. + See esp_wifi.h & esp_wifi_types.h instead. +*/ + +#ifdef __cplusplus +extern "C" { +#endif + +#define ESP_WIFI_CRYPTO_VERSION 0x00000001 + +/* + * Enumeration for hash operations. + * When WPA2 is connecting, this enum is used to + * request a hash algorithm via crypto_hash_xxx functions. + */ +typedef enum { + ESP_CRYPTO_HASH_ALG_MD5, ESP_CRYPTO_HASH_ALG_SHA1, + ESP_CRYPTO_HASH_ALG_HMAC_MD5, ESP_CRYPTO_HASH_ALG_HMAC_SHA1, + ESP_CRYPTO_HASH_ALG_SHA256, ESP_CRYPTO_HASH_ALG_HMAC_SHA256 +}esp_crypto_hash_alg_t; + +/* + * Enumeration for block cipher operations. + * When WPA2 is connecting, this enum is used to request a block + * cipher algorithm via crypto_cipher_xxx functions. + */ +typedef enum { + ESP_CRYPTO_CIPHER_NULL, ESP_CRYPTO_CIPHER_ALG_AES, ESP_CRYPTO_CIPHER_ALG_3DES, + ESP_CRYPTO_CIPHER_ALG_DES, ESP_CRYPTO_CIPHER_ALG_RC2, ESP_CRYPTO_CIPHER_ALG_RC4 +} esp_crypto_cipher_alg_t; + +/* + * This structure is about the algorithm when do crypto_hash operation, for detail, + * please reference to the structure crypto_hash. + */ +typedef struct crypto_hash esp_crypto_hash_t; + +/* + * This structure is about the algorithm when do crypto_cipher operation, for detail, + * please reference to the structure crypto_cipher. + */ +typedef struct crypto_cipher esp_crypto_cipher_t; + +/** + * @brief The AES callback function when do WPS connect. + * + * @param key Encryption key. + * @param iv Encryption IV for CBC mode (16 bytes). + * @param data Data to encrypt in-place. + * @param data_len Length of data in bytes (must be divisible by 16) + */ +typedef int (*esp_aes_128_encrypt_t)(const unsigned char *key, const unsigned char *iv, unsigned char *data, int data_len); + +/** + * @brief The AES callback function when do WPS connect. + * + * @param key Decryption key. + * @param iv Decryption IV for CBC mode (16 bytes). + * @param data Data to decrypt in-place. + * @param data_len Length of data in bytes (must be divisible by 16) + * + */ +typedef int (*esp_aes_128_decrypt_t)(const unsigned char *key, const unsigned char *iv, unsigned char *data, int data_len); + +/** + * @brief The AES callback function when do STA connect. + * + * @param kek 16-octet Key encryption key (KEK). + * @param n Length of the plaintext key in 64-bit units; + * @param plain Plaintext key to be wrapped, n * 64 bits + * @param cipher Wrapped key, (n + 1) * 64 bits + * + */ +typedef int (*esp_aes_wrap_t)(const unsigned char *kek, int n, const unsigned char *plain, unsigned char *cipher); + +/** + * @brief The AES callback function when do STA connect. + * + * @param kek 16-octet Key decryption key (KEK). + * @param n Length of the plaintext key in 64-bit units; + * @param cipher Wrapped key to be unwrapped, (n + 1) * 64 bits + * @param plain Plaintext key, n * 64 bits + * + */ +typedef int (*esp_aes_unwrap_t)(const unsigned char *kek, int n, const unsigned char *cipher, unsigned char *plain); + +/** + * @brief The SHA256 callback function when do WPS connect. + * + * @param key Key for HMAC operations. + * @param key_len Length of the key in bytes. + * @param num_elem Number of elements in the data vector. + * @param addr Pointers to the data areas. + * @param len Lengths of the data blocks. + * @param mac Buffer for the hash (32 bytes). + * + */ +typedef int (*esp_hmac_sha256_vector_t)(const unsigned char *key, int key_len, int num_elem, + const unsigned char *addr[], const int *len, unsigned char *mac); + +/** + * @brief The AES callback function when do STA connect. + * + * @param key Key for PRF. + * @param key_len Length of the key in bytes. + * @param label A unique label for each purpose of the PRF. + * @param data Extra data to bind into the key. + * @param data_len Length of the data. + * @param buf Buffer for the generated pseudo-random key. + * @param buf_len Number of bytes of key to generate. + * + */ +typedef int (*esp_sha256_prf_t)(const unsigned char *key, int key_len, const char *label, + const unsigned char *data, int data_len, unsigned char *buf, int buf_len); + +/** + * @brief HMAC-MD5 over data buffer (RFC 2104)' + * + * @key: Key for HMAC operations + * @key_len: Length of the key in bytes + * @data: Pointers to the data area + * @data_len: Length of the data area + * @mac: Buffer for the hash (16 bytes) + * Returns: 0 on success, -1 on failure + */ +typedef int (*esp_hmac_md5_t)(const unsigned char *key, unsigned int key_len, const unsigned char *data, + unsigned int data_len, unsigned char *mac); + +/** + * @brief HMAC-MD5 over data vector (RFC 2104) + * + * @key: Key for HMAC operations + * @key_len: Length of the key in bytes + * @num_elem: Number of elements in the data vector + * @addr: Pointers to the data areas + * @len: Lengths of the data blocks + * @mac: Buffer for the hash (16 bytes) + * Returns: 0 on success, -1 on failure + */ +typedef int (*esp_hmac_md5_vector_t)(const unsigned char *key, unsigned int key_len, unsigned int num_elem, + const unsigned char *addr[], const unsigned int *len, unsigned char *mac); + +/** + * @brief HMAC-SHA1 over data buffer (RFC 2104) + * + * @key: Key for HMAC operations + * @key_len: Length of the key in bytes + * @data: Pointers to the data area + * @data_len: Length of the data area + * @mac: Buffer for the hash (20 bytes) + * Returns: 0 on success, -1 of failure + */ +typedef int (*esp_hmac_sha1_t)(const unsigned char *key, unsigned int key_len, const unsigned char *data, + unsigned int data_len, unsigned char *mac); + +/** + * @brief HMAC-SHA1 over data vector (RFC 2104) + * + * @key: Key for HMAC operations + * @key_len: Length of the key in bytes + * @num_elem: Number of elements in the data vector + * @addr: Pointers to the data areas + * @len: Lengths of the data blocks + * @mac: Buffer for the hash (20 bytes) + * Returns: 0 on success, -1 on failure + */ +typedef int (*esp_hmac_sha1_vector_t)(const unsigned char *key, unsigned int key_len, unsigned int num_elem, + const unsigned char *addr[], const unsigned int *len, unsigned char *mac); + +/** + * @brief SHA1-based Pseudo-Random Function (PRF) (IEEE 802.11i, 8.5.1.1) + * + * @key: Key for PRF + * @key_len: Length of the key in bytes + * @label: A unique label for each purpose of the PRF + * @data: Extra data to bind into the key + * @data_len: Length of the data + * @buf: Buffer for the generated pseudo-random key + * @buf_len: Number of bytes of key to generate + * Returns: 0 on success, -1 of failure + * + * This function is used to derive new, cryptographically separate keys from a + * given key (e.g., PMK in IEEE 802.11i). + */ +typedef int (*esp_sha1_prf_t)(const unsigned char *key, unsigned int key_len, const char *label, + const unsigned char *data, unsigned int data_len, unsigned char *buf, unsigned int buf_len); + +/** + * @brief SHA-1 hash for data vector + * + * @num_elem: Number of elements in the data vector + * @addr: Pointers to the data areas + * @len: Lengths of the data blocks + * @mac: Buffer for the hash + * Returns: 0 on success, -1 on failure + */ +typedef int (*esp_sha1_vector_t)(unsigned int num_elem, const unsigned char *addr[], const unsigned int *len, + unsigned char *mac); + +/** + * @brief SHA1-based key derivation function (PBKDF2) for IEEE 802.11i + * + * @passphrase: ASCII passphrase + * @ssid: SSID + * @ssid_len: SSID length in bytes + * @iterations: Number of iterations to run + * @buf: Buffer for the generated key + * @buflen: Length of the buffer in bytes + * Returns: 0 on success, -1 of failure + * + * This function is used to derive PSK for WPA-PSK. For this protocol, + * iterations is set to 4096 and buflen to 32. This function is described in + * IEEE Std 802.11-2004, Clause H.4. The main construction is from PKCS#5 v2.0. + */ +typedef int (*esp_pbkdf2_sha1_t)(const char *passphrase, const char *ssid, unsigned int ssid_len, + int iterations, unsigned char *buf, unsigned int buflen); + +/** + * @brief XOR RC4 stream to given data with skip-stream-start + * + * @key: RC4 key + * @keylen: RC4 key length + * @skip: number of bytes to skip from the beginning of the RC4 stream + * @data: data to be XOR'ed with RC4 stream + * @data_len: buf length + * Returns: 0 on success, -1 on failure + * + * Generate RC4 pseudo random stream for the given key, skip beginning of the + * stream, and XOR the end result with the data buffer to perform RC4 + * encryption/decryption. + */ +typedef int (*esp_rc4_skip_t)(const unsigned char *key, unsigned int keylen, unsigned int skip, + unsigned char *data, unsigned int data_len); + +/** + * @brief MD5 hash for data vector + * + * @num_elem: Number of elements in the data vector + * @addr: Pointers to the data areas + * @len: Lengths of the data blocks + * @mac: Buffer for the hash + * Returns: 0 on success, -1 on failure + */ +typedef int (*esp_md5_vector_t)(unsigned int num_elem, const unsigned char *addr[], const unsigned int *len, + unsigned char *mac); + +/** + * @brief Encrypt one AES block + * + * @ctx: Context pointer from aes_encrypt_init() + * @plain: Plaintext data to be encrypted (16 bytes) + * @crypt: Buffer for the encrypted data (16 bytes) + */ +typedef void (*esp_aes_encrypt_t)(void *ctx, const unsigned char *plain, unsigned char *crypt); + +/** + * @brief Initialize AES for encryption + * + * @key: Encryption key + * @len: Key length in bytes (usually 16, i.e., 128 bits) + * Returns: Pointer to context data or %NULL on failure + */ +typedef void * (*esp_aes_encrypt_init_t)(const unsigned char *key, unsigned int len); + +/** + * @brief Deinitialize AES encryption + * + * @ctx: Context pointer from aes_encrypt_init() + */ +typedef void (*esp_aes_encrypt_deinit_t)(void *ctx); + +/** + * @brief Decrypt one AES block + * + * @ctx: Context pointer from aes_encrypt_init() + * @crypt: Encrypted data (16 bytes) + * @plain: Buffer for the decrypted data (16 bytes) + */ +typedef void (*esp_aes_decrypt_t)(void *ctx, const unsigned char *crypt, unsigned char *plain); + +/** + * @brief Initialize AES for decryption + * + * @key: Decryption key + * @len: Key length in bytes (usually 16, i.e., 128 bits) + * Returns: Pointer to context data or %NULL on failure + */ +typedef void * (*esp_aes_decrypt_init_t)(const unsigned char *key, unsigned int len); + +/** + * @brief Deinitialize AES decryption + * + * @ctx: Context pointer from aes_encrypt_init() + */ +typedef void (*esp_aes_decrypt_deinit_t)(void *ctx); + +/** + * @brief One-Key CBC MAC (OMAC1) hash with AES-128 for MIC computation + * + * @key: 128-bit key for the hash operation + * @data: Data buffer for which a MIC is computed + * @data_len: Length of data buffer in bytes + * @mic: Buffer for MIC (128 bits, i.e., 16 bytes) + * Returns: 0 on success, -1 on failure + */ +typedef int (*esp_omac1_aes_128_t)(const uint8_t *key, const uint8_t *data, size_t data_len, + uint8_t *mic); + +/** + * @brief Decrypt data using CCMP (Counter Mode CBC-MAC Protocol OR + * Counter Mode Cipher Block Chaining Message Authentication + * Code Protocol) which is used in IEEE 802.11i RSN standard. + * @tk: 128-bit Temporal Key for obtained during 4-way handshake + * @hdr: Pointer to IEEE802.11 frame headeri needed for AAD + * @data: Pointer to encrypted data buffer + * @data_len: Encrypted data length in bytes + * @decrypted_len: Length of decrypted data + * Returns: Pointer to decrypted data on success, NULL on failure + */ +typedef uint8_t * (*esp_ccmp_decrypt_t)(const uint8_t *tk, const uint8_t *ieee80211_hdr, + const uint8_t *data, size_t data_len, size_t *decrypted_len); + +/** + * @brief Encrypt data using CCMP (Counter Mode CBC-MAC Protocol OR + * Counter Mode Cipher Block Chaining Message Authentication + * Code Protocol) which is used in IEEE 802.11i RSN standard. + * @tk: 128-bit Temporal Key for obtained during 4-way handshake + * @frame: Pointer to IEEE802.11 frame including header + * @len: Length of the frame including header + * @hdrlen: Length of the header + * @pn: Packet Number counter + * @keyid: Key ID to be mentioned in CCMP Vector + * @encrypted_len: Length of the encrypted frame including header + */ +typedef uint8_t * (*esp_ccmp_encrypt_t)(const uint8_t *tk, uint8_t *frame, size_t len, size_t hdrlen, + uint8_t *pn, int keyid, size_t *encrypted_len); + +/** + * @brief The crypto callback function structure used when do station security connect. + * The structure can be set as software crypto or the crypto optimized by ESP32 + * hardware. + */ +typedef struct { + uint32_t size; + uint32_t version; + esp_aes_wrap_t aes_wrap; /**< station connect function used when send EAPOL frame */ + esp_aes_unwrap_t aes_unwrap; /**< station connect function used when decrypt key data */ + esp_hmac_sha256_vector_t hmac_sha256_vector; /**< station connect function used when check MIC */ + esp_sha256_prf_t sha256_prf; /**< station connect function used when check MIC */ + esp_hmac_md5_t hmac_md5; + esp_hmac_md5_vector_t hamc_md5_vector; + esp_hmac_sha1_t hmac_sha1; + esp_hmac_sha1_vector_t hmac_sha1_vector; + esp_sha1_prf_t sha1_prf; + esp_sha1_vector_t sha1_vector; + esp_pbkdf2_sha1_t pbkdf2_sha1; + esp_rc4_skip_t rc4_skip; + esp_md5_vector_t md5_vector; + esp_aes_encrypt_t aes_encrypt; + esp_aes_encrypt_init_t aes_encrypt_init; + esp_aes_encrypt_deinit_t aes_encrypt_deinit; + esp_aes_decrypt_t aes_decrypt; + esp_aes_decrypt_init_t aes_decrypt_init; + esp_aes_decrypt_deinit_t aes_decrypt_deinit; + esp_omac1_aes_128_t omac1_aes_128; + esp_ccmp_decrypt_t ccmp_decrypt; + esp_ccmp_encrypt_t ccmp_encrypt; +}wpa_crypto_funcs_t; + +/** + * @brief The crypto callback function structure used in mesh vendor IE encryption. The + * structure can be set as software crypto or the crypto optimized by ESP32 + * hardware. + */ +typedef struct{ + esp_aes_128_encrypt_t aes_128_encrypt; /**< function used in mesh vendor IE encryption */ + esp_aes_128_decrypt_t aes_128_decrypt; /**< function used in mesh vendor IE decryption */ +} mesh_crypto_funcs_t; + +#ifdef __cplusplus +} +#endif +#endif diff --git a/arch/xtensa/include/esp32/esp_wifi/esp_wifi_default.h b/arch/xtensa/include/esp32/esp_wifi/esp_wifi_default.h new file mode 100644 index 0000000000000..614a4ff9fd430 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_wifi/esp_wifi_default.h @@ -0,0 +1,106 @@ +// 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. + +#ifndef _ESP_WIFI_DEFAULT_H +#define _ESP_WIFI_DEFAULT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Attaches wifi station interface to supplied netif + * + * @param esp_netif instance to attach the wifi station to + * + * @return + * - ESP_OK on success + * - ESP_FAIL if attach failed + */ +esp_err_t esp_netif_attach_wifi_station(esp_netif_t *esp_netif); + +/** + * @brief Attaches wifi soft AP interface to supplied netif + * + * @param esp_netif instance to attach the wifi AP to + * + * @return + * - ESP_OK on success + * - ESP_FAIL if attach failed + */ +esp_err_t esp_netif_attach_wifi_ap(esp_netif_t *esp_netif); + +/** + * @brief Sets default wifi event handlers for STA interface + * + * @return + * - ESP_OK on success, error returned from esp_event_handler_register if failed + */ +esp_err_t esp_wifi_set_default_wifi_sta_handlers(void); + +/** + * @brief Sets default wifi event handlers for STA interface + * + * @return + * - ESP_OK on success, error returned from esp_event_handler_register if failed + */ +esp_err_t esp_wifi_set_default_wifi_ap_handlers(void); + +/** + * @brief Clears default wifi event handlers for supplied network interface + * + * @param esp_netif instance of corresponding if object + * + * @return + * - ESP_OK on success, error returned from esp_event_handler_register if failed + */ +esp_err_t esp_wifi_clear_default_wifi_driver_and_handlers(void *esp_netif); + +/** + * @brief Creates default WIFI AP. In case of any init error this API aborts. + * + * @return pointer to esp-netif instance + */ +esp_netif_t* esp_netif_create_default_wifi_ap(void); + +/** + * @brief Creates default WIFI STA. In case of any init error this API aborts. + * + * @return pointer to esp-netif instance + */ +esp_netif_t* esp_netif_create_default_wifi_sta(void); + +/** + * @brief Creates default STA and AP network interfaces for esp-mesh. + * + * Both netifs are almost identical to the default station and softAP, but with + * DHCP client and server disabled. Please note that the DHCP client is typically + * enabled only if the device is promoted to a root node. + * + * Returns created interfaces which could be ignored setting parameters to NULL + * if an application code does not need to save the interface instances + * for further processing. + * + * @param[out] p_netif_sta pointer where the resultant STA interface is saved (if non NULL) + * @param[out] p_netif_ap pointer where the resultant AP interface is saved (if non NULL) + * + * @return ESP_OK on success + */ +esp_err_t esp_netif_create_default_wifi_mesh_netifs(esp_netif_t **p_netif_sta, esp_netif_t **p_netif_ap); + +#ifdef __cplusplus +} +#endif + +#endif //_ESP_WIFI_DEFAULT_H diff --git a/arch/xtensa/include/esp32/esp_wifi/esp_wifi_netif.h b/arch/xtensa/include/esp32/esp_wifi/esp_wifi_netif.h new file mode 100644 index 0000000000000..203b63c61ae5a --- /dev/null +++ b/arch/xtensa/include/esp32/esp_wifi/esp_wifi_netif.h @@ -0,0 +1,91 @@ +// 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. + +#ifndef _ESP_WIFI_NETIF_H +#define _ESP_WIFI_NETIF_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Number of WiFi interfaces used by wifi-netif abstraction + */ +#define MAX_WIFI_IFS (2) + +/** + * @brief Forward declaration of WiFi interface handle + */ +typedef struct wifi_netif_driver* wifi_netif_driver_t; + +/** + * @brief Creates wifi driver instance to be used with esp-netif + * + * @param wifi_if wifi interface type (station, softAP) + * + * @return + * - pointer to wifi interface handle on success + * - NULL otherwise + */ +wifi_netif_driver_t esp_wifi_create_if_driver(wifi_interface_t wifi_if); + +/** + * @brief Destroys wifi driver instance + * + * @param h pointer to wifi interface handle + * + */ +void esp_wifi_destroy_if_driver(wifi_netif_driver_t h); + +/** + * @brief Return mac of specified wifi driver instance + * + * @param[in] ifx pointer to wifi interface handle + * @param[out] mac output mac address + * + * @return ESP_OK on success + * + */ +esp_err_t esp_wifi_get_if_mac(wifi_netif_driver_t ifx, uint8_t mac[6]); + +/** + * @brief Return true if the supplied interface instance is ready after start. + * Typically used when registering on receive callback, which ought to be + * installed as soon as AP started, but once STA gets connected. + * + * @param[in] ifx pointer to wifi interface handle + * + * @return + * - true if ready after intertace started (typically Access Point type) + * - false if ready once intertace connected (typically for Station type) + */ +bool esp_wifi_is_if_ready_when_started(wifi_netif_driver_t ifx); + +/** + * @brief Register interface receive callback function with argument + * + * @param[in] ifx pointer to wifi interface handle + * @param[in] fn funtion to be registered (typically esp_netif_receive) + * @param[in] arg argument to be supplied to registered function (typically esp_netif ptr) + * + * @return ESP_OK on success + * + */ +esp_err_t esp_wifi_register_if_rxcb(wifi_netif_driver_t ifx, esp_netif_receive_t fn, void * arg); + +#ifdef __cplusplus +} +#endif + +#endif //_ESP_WIFI_NETIF_H \ No newline at end of file diff --git a/arch/xtensa/include/esp32/esp_wifi/esp_wifi_types.h b/arch/xtensa/include/esp32/esp_wifi/esp_wifi_types.h new file mode 100644 index 0000000000000..15dd2c11316ba --- /dev/null +++ b/arch/xtensa/include/esp32/esp_wifi/esp_wifi_types.h @@ -0,0 +1,601 @@ +// 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. + + +#ifndef __ESP_WIFI_TYPES_H__ +#define __ESP_WIFI_TYPES_H__ + +#include "esp_private/esp_wifi_types_private.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + WIFI_MODE_NULL = 0, /**< null mode */ + WIFI_MODE_STA, /**< WiFi station mode */ + WIFI_MODE_AP, /**< WiFi soft-AP mode */ + WIFI_MODE_APSTA, /**< WiFi station + soft-AP mode */ + WIFI_MODE_MAX +} wifi_mode_t; + +typedef esp_interface_t wifi_interface_t; + +#define WIFI_IF_STA ESP_IF_WIFI_STA +#define WIFI_IF_AP ESP_IF_WIFI_AP + +typedef enum { + WIFI_COUNTRY_POLICY_AUTO, /**< Country policy is auto, use the country info of AP to which the station is connected */ + WIFI_COUNTRY_POLICY_MANUAL, /**< Country policy is manual, always use the configured country info */ +} wifi_country_policy_t; + +/** @brief Structure describing WiFi country-based regional restrictions. */ +typedef struct { + char cc[3]; /**< country code string */ + uint8_t schan; /**< start channel */ + uint8_t nchan; /**< total channel number */ + int8_t max_tx_power; /**< This field is used for getting WiFi maximum transmitting power, call esp_wifi_set_max_tx_power to set the maximum transmitting power. */ + wifi_country_policy_t policy; /**< country policy */ +} wifi_country_t; + +typedef enum { + WIFI_AUTH_OPEN = 0, /**< authenticate mode : open */ + WIFI_AUTH_WEP, /**< authenticate mode : WEP */ + WIFI_AUTH_WPA_PSK, /**< authenticate mode : WPA_PSK */ + WIFI_AUTH_WPA2_PSK, /**< authenticate mode : WPA2_PSK */ + WIFI_AUTH_WPA_WPA2_PSK, /**< authenticate mode : WPA_WPA2_PSK */ + WIFI_AUTH_WPA2_ENTERPRISE, /**< authenticate mode : WPA2_ENTERPRISE */ + WIFI_AUTH_WPA3_PSK, /**< authenticate mode : WPA3_PSK */ + WIFI_AUTH_MAX +} wifi_auth_mode_t; + +typedef enum { + WIFI_REASON_UNSPECIFIED = 1, + WIFI_REASON_AUTH_EXPIRE = 2, + WIFI_REASON_AUTH_LEAVE = 3, + WIFI_REASON_ASSOC_EXPIRE = 4, + WIFI_REASON_ASSOC_TOOMANY = 5, + WIFI_REASON_NOT_AUTHED = 6, + WIFI_REASON_NOT_ASSOCED = 7, + WIFI_REASON_ASSOC_LEAVE = 8, + WIFI_REASON_ASSOC_NOT_AUTHED = 9, + WIFI_REASON_DISASSOC_PWRCAP_BAD = 10, + WIFI_REASON_DISASSOC_SUPCHAN_BAD = 11, + WIFI_REASON_IE_INVALID = 13, + WIFI_REASON_MIC_FAILURE = 14, + WIFI_REASON_4WAY_HANDSHAKE_TIMEOUT = 15, + WIFI_REASON_GROUP_KEY_UPDATE_TIMEOUT = 16, + WIFI_REASON_IE_IN_4WAY_DIFFERS = 17, + WIFI_REASON_GROUP_CIPHER_INVALID = 18, + WIFI_REASON_PAIRWISE_CIPHER_INVALID = 19, + WIFI_REASON_AKMP_INVALID = 20, + WIFI_REASON_UNSUPP_RSN_IE_VERSION = 21, + WIFI_REASON_INVALID_RSN_IE_CAP = 22, + WIFI_REASON_802_1X_AUTH_FAILED = 23, + WIFI_REASON_CIPHER_SUITE_REJECTED = 24, + + WIFI_REASON_INVALID_PMKID = 53, + + WIFI_REASON_BEACON_TIMEOUT = 200, + WIFI_REASON_NO_AP_FOUND = 201, + WIFI_REASON_AUTH_FAIL = 202, + WIFI_REASON_ASSOC_FAIL = 203, + WIFI_REASON_HANDSHAKE_TIMEOUT = 204, + WIFI_REASON_CONNECTION_FAIL = 205, +} wifi_err_reason_t; + +typedef enum { + WIFI_SECOND_CHAN_NONE = 0, /**< the channel width is HT20 */ + WIFI_SECOND_CHAN_ABOVE, /**< the channel width is HT40 and the secondary channel is above the primary channel */ + WIFI_SECOND_CHAN_BELOW, /**< the channel width is HT40 and the secondary channel is below the primary channel */ +} wifi_second_chan_t; + +typedef enum { + WIFI_SCAN_TYPE_ACTIVE = 0, /**< active scan */ + WIFI_SCAN_TYPE_PASSIVE, /**< passive scan */ +} wifi_scan_type_t; + +/** @brief Range of active scan times per channel */ +typedef struct { + uint32_t min; /**< minimum active scan time per channel, units: millisecond */ + uint32_t max; /**< maximum active scan time per channel, units: millisecond, values above 1500ms may + cause station to disconnect from AP and are not recommended. */ +} wifi_active_scan_time_t; + +/** @brief Aggregate of active & passive scan time per channel */ +typedef union { + wifi_active_scan_time_t active; /**< active scan time per channel, units: millisecond. */ + uint32_t passive; /**< passive scan time per channel, units: millisecond, values above 1500ms may + cause station to disconnect from AP and are not recommended. */ +} wifi_scan_time_t; + +/** @brief Parameters for an SSID scan. */ +typedef struct { + uint8_t *ssid; /**< SSID of AP */ + uint8_t *bssid; /**< MAC address of AP */ + uint8_t channel; /**< channel, scan the specific channel */ + bool show_hidden; /**< enable to scan AP whose SSID is hidden */ + wifi_scan_type_t scan_type; /**< scan type, active or passive */ + wifi_scan_time_t scan_time; /**< scan time per channel */ +} wifi_scan_config_t; + +typedef enum { + WIFI_CIPHER_TYPE_NONE = 0, /**< the cipher type is none */ + WIFI_CIPHER_TYPE_WEP40, /**< the cipher type is WEP40 */ + WIFI_CIPHER_TYPE_WEP104, /**< the cipher type is WEP104 */ + WIFI_CIPHER_TYPE_TKIP, /**< the cipher type is TKIP */ + WIFI_CIPHER_TYPE_CCMP, /**< the cipher type is CCMP */ + WIFI_CIPHER_TYPE_TKIP_CCMP, /**< the cipher type is TKIP and CCMP */ + WIFI_CIPHER_TYPE_AES_CMAC128,/**< the cipher type is AES-CMAC-128 */ + WIFI_CIPHER_TYPE_UNKNOWN, /**< the cipher type is unknown */ +} wifi_cipher_type_t; + +/** + * @brief WiFi antenna + * + */ +typedef enum { + WIFI_ANT_ANT0, /**< WiFi antenna 0 */ + WIFI_ANT_ANT1, /**< WiFi antenna 1 */ + WIFI_ANT_MAX, /**< Invalid WiFi antenna */ +} wifi_ant_t; + +/** @brief Description of a WiFi AP */ +typedef struct { + uint8_t bssid[6]; /**< MAC address of AP */ + uint8_t ssid[33]; /**< SSID of AP */ + uint8_t primary; /**< channel of AP */ + wifi_second_chan_t second; /**< secondary channel of AP */ + int8_t rssi; /**< signal strength of AP */ + wifi_auth_mode_t authmode; /**< authmode of AP */ + wifi_cipher_type_t pairwise_cipher; /**< pairwise cipher of AP */ + wifi_cipher_type_t group_cipher; /**< group cipher of AP */ + wifi_ant_t ant; /**< antenna used to receive beacon from AP */ + uint32_t phy_11b:1; /**< bit: 0 flag to identify if 11b mode is enabled or not */ + 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 wps:1; /**< bit: 4 flag to identify if WPS is supported or not */ + uint32_t reserved:27; /**< bit: 5..31 reserved */ + wifi_country_t country; /**< country information of AP */ +} wifi_ap_record_t; + +typedef enum { + WIFI_FAST_SCAN = 0, /**< Do fast scan, scan will end after find SSID match AP */ + WIFI_ALL_CHANNEL_SCAN, /**< All channel scan, scan will end after scan all the channel */ +}wifi_scan_method_t; + +typedef enum { + WIFI_CONNECT_AP_BY_SIGNAL = 0, /**< Sort match AP in scan list by RSSI */ + WIFI_CONNECT_AP_BY_SECURITY, /**< Sort match AP in scan list by security mode */ +}wifi_sort_method_t; + +/** @brief Structure describing parameters for a WiFi fast scan */ +typedef struct { + int8_t rssi; /**< The minimum rssi to accept in the fast scan mode */ + wifi_auth_mode_t authmode; /**< The weakest authmode to accept in the fast scan mode */ +}wifi_scan_threshold_t; + +typedef enum { + WIFI_PS_NONE, /**< No power save */ + WIFI_PS_MIN_MODEM, /**< Minimum modem power saving. In this mode, station wakes up to receive beacon every DTIM period */ + WIFI_PS_MAX_MODEM, /**< Maximum modem power saving. In this mode, interval to receive beacons is determined by the listen_interval parameter in wifi_sta_config_t */ +} wifi_ps_type_t; + +#define WIFI_PROTOCOL_11B 1 +#define WIFI_PROTOCOL_11G 2 +#define WIFI_PROTOCOL_11N 4 +#define WIFI_PROTOCOL_LR 8 + +typedef enum { + WIFI_BW_HT20 = 1, /* Bandwidth is HT20 */ + WIFI_BW_HT40, /* Bandwidth is HT40 */ +} wifi_bandwidth_t; + +/** Configuration structure for Protected Management Frame */ +typedef struct { + bool capable; /**< Advertizes support for Protected Management Frame. Device will prefer to connect in PMF mode if other device also advertizes PMF capability. */ + bool required; /**< Advertizes that Protected Management Frame is required. Device will not associate to non-PMF capable devices. */ +} wifi_pmf_config_t; + +/** @brief Soft-AP configuration settings for the ESP32 */ +typedef struct { + uint8_t ssid[32]; /**< SSID of ESP32 soft-AP. If ssid_len field is 0, this must be a Null terminated string. Otherwise, length is set according to ssid_len. */ + uint8_t password[64]; /**< Password of ESP32 soft-AP. Null terminated string. */ + uint8_t ssid_len; /**< Optional length of SSID field. */ + uint8_t channel; /**< Channel of ESP32 soft-AP */ + wifi_auth_mode_t authmode; /**< Auth mode of ESP32 soft-AP. Do not support AUTH_WEP in soft-AP mode */ + uint8_t ssid_hidden; /**< Broadcast SSID or not, default 0, broadcast the SSID */ + uint8_t max_connection; /**< Max number of stations allowed to connect in, default 4, max 10 */ + uint16_t beacon_interval; /**< Beacon interval, 100 ~ 60000 ms, default 100 ms */ +} wifi_ap_config_t; + +/** @brief STA configuration settings for the ESP32 */ +typedef struct { + uint8_t ssid[32]; /**< SSID of target AP. Null terminated string. */ + uint8_t password[64]; /**< Password of target AP. Null terminated string.*/ + wifi_scan_method_t scan_method; /**< do all channel scan or fast scan */ + bool bssid_set; /**< whether set MAC address of target AP or not. Generally, station_config.bssid_set needs to be 0; and it needs to be 1 only when users need to check the MAC address of the AP.*/ + uint8_t bssid[6]; /**< MAC address of target AP*/ + uint8_t channel; /**< channel of target AP. Set to 1~13 to scan starting from the specified channel before connecting to AP. If the channel of AP is unknown, set it to 0.*/ + uint16_t listen_interval; /**< Listen interval for ESP32 station to receive beacon when WIFI_PS_MAX_MODEM is set. Units: AP beacon intervals. Defaults to 3 if set to 0. */ + wifi_sort_method_t sort_method; /**< sort the connect AP in the list by rssi or security mode */ + wifi_scan_threshold_t threshold; /**< When sort_method is set, only APs which have an auth mode that is more secure than the selected auth mode and a signal stronger than the minimum RSSI will be used. */ + wifi_pmf_config_t pmf_cfg; /**< Configuration for Protected Management Frame. Will be advertized in RSN Capabilities in RSN IE. */ +} wifi_sta_config_t; + +/** @brief Configuration data for ESP32 AP or STA. + * + * The usage of this union (for ap or sta configuration) is determined by the accompanying + * interface argument passed to esp_wifi_set_config() or esp_wifi_get_config() + * + */ +typedef union { + wifi_ap_config_t ap; /**< configuration of AP */ + wifi_sta_config_t sta; /**< configuration of STA */ +} wifi_config_t; + +/** @brief Description of STA associated with AP */ +typedef struct { + uint8_t mac[6]; /**< mac address */ + int8_t rssi; /**< current average rssi of sta connected */ + uint32_t phy_11b:1; /**< bit: 0 flag to identify if 11b mode is enabled or not */ + 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 */ +} wifi_sta_info_t; + +#define ESP_WIFI_MAX_CONN_NUM (10) /**< max number of stations which can connect to ESP32 soft-AP */ + +/** @brief List of stations associated with the ESP32 Soft-AP */ +typedef struct { + wifi_sta_info_t sta[ESP_WIFI_MAX_CONN_NUM]; /**< station list */ + int num; /**< number of stations in the list (other entries are invalid) */ +} wifi_sta_list_t; + +typedef enum { + WIFI_STORAGE_FLASH, /**< all configuration will store in both memory and flash */ + WIFI_STORAGE_RAM, /**< all configuration will only store in the memory */ +} wifi_storage_t; + +/** + * @brief Vendor Information Element type + * + * Determines the frame type that the IE will be associated with. + */ +typedef enum { + WIFI_VND_IE_TYPE_BEACON, + WIFI_VND_IE_TYPE_PROBE_REQ, + WIFI_VND_IE_TYPE_PROBE_RESP, + WIFI_VND_IE_TYPE_ASSOC_REQ, + WIFI_VND_IE_TYPE_ASSOC_RESP, +} wifi_vendor_ie_type_t; + +/** + * @brief Vendor Information Element index + * + * Each IE type can have up to two associated vendor ID elements. + */ +typedef enum { + WIFI_VND_IE_ID_0, + WIFI_VND_IE_ID_1, +} wifi_vendor_ie_id_t; + +#define WIFI_VENDOR_IE_ELEMENT_ID 0xDD + +/** + * @brief Vendor Information Element header + * + * The first bytes of the Information Element will match this header. Payload follows. + */ +typedef struct { + uint8_t element_id; /**< Should be set to WIFI_VENDOR_IE_ELEMENT_ID (0xDD) */ + uint8_t length; /**< Length of all bytes in the element data following this field. Minimum 4. */ + uint8_t vendor_oui[3]; /**< Vendor identifier (OUI). */ + uint8_t vendor_oui_type; /**< Vendor-specific OUI type. */ + uint8_t payload[0]; /**< Payload. Length is equal to value in 'length' field, minus 4. */ +} vendor_ie_data_t; + +/** @brief Received packet radio metadata header, this is the common header at the beginning of all promiscuous mode RX callback buffers */ +typedef struct { + signed rssi:8; /**< Received Signal Strength Indicator(RSSI) of packet. unit: dBm */ + unsigned rate:5; /**< PHY rate encoding of the packet. Only valid for non HT(11bg) packet */ + unsigned :1; /**< reserve */ + unsigned sig_mode:2; /**< 0: non HT(11bg) packet; 1: HT(11n) packet; 3: VHT(11ac) packet */ + unsigned :16; /**< reserve */ + unsigned mcs:7; /**< Modulation Coding Scheme. If is HT(11n) packet, shows the modulation, range from 0 to 76(MSC0 ~ MCS76) */ + unsigned cwb:1; /**< Channel Bandwidth of the packet. 0: 20MHz; 1: 40MHz */ + unsigned :16; /**< reserve */ + unsigned smoothing:1; /**< reserve */ + unsigned not_sounding:1; /**< reserve */ + unsigned :1; /**< reserve */ + unsigned aggregation:1; /**< Aggregation. 0: MPDU packet; 1: AMPDU packet */ + unsigned stbc:2; /**< Space Time Block Code(STBC). 0: non STBC packet; 1: STBC packet */ + unsigned fec_coding:1; /**< Flag is set for 11n packets which are LDPC */ + unsigned sgi:1; /**< Short Guide Interval(SGI). 0: Long GI; 1: Short GI */ +#if CONFIG_IDF_TARGET_ESP32 + signed noise_floor:8; /**< noise floor of Radio Frequency Module(RF). unit: 0.25dBm*/ +#elif CONFIG_IDF_TARGET_ESP32S2BETA + unsigned :8; +#endif + unsigned ampdu_cnt:8; /**< ampdu cnt */ + unsigned channel:4; /**< primary channel on which this packet is received */ + unsigned secondary_channel:4; /**< secondary channel on which this packet is received. 0: none; 1: above; 2: below */ + unsigned :8; /**< reserve */ + unsigned timestamp:32; /**< timestamp. The local time when this packet is received. It is precise only if modem sleep or light sleep is not enabled. unit: microsecond */ + unsigned :32; /**< reserve */ + unsigned :31; /**< reserve */ + unsigned ant:1; /**< antenna number from which this packet is received. 0: WiFi antenna 0; 1: WiFi antenna 1 */ +#if CONFIG_IDF_TARGET_ESP32S2BETA + signed noise_floor:8; /**< noise floor of Radio Frequency Module(RF). unit: 0.25dBm*/ + unsigned :24; +#endif + unsigned sig_len:12; /**< length of packet including Frame Check Sequence(FCS) */ + unsigned :12; /**< reserve */ + unsigned rx_state:8; /**< state of the packet. 0: no error; others: error numbers which are not public */ +} wifi_pkt_rx_ctrl_t; + +/** @brief Payload passed to 'buf' parameter of promiscuous mode RX callback. + */ +typedef struct { + wifi_pkt_rx_ctrl_t rx_ctrl; /**< metadata header */ + uint8_t payload[0]; /**< Data or management payload. Length of payload is described by rx_ctrl.sig_len. Type of content determined by packet type argument of callback. */ +} wifi_promiscuous_pkt_t; + +/** + * @brief Promiscuous frame type + * + * Passed to promiscuous mode RX callback to indicate the type of parameter in the buffer. + * + */ +typedef enum { + WIFI_PKT_MGMT, /**< Management frame, indicates 'buf' argument is wifi_promiscuous_pkt_t */ + WIFI_PKT_CTRL, /**< Control frame, indicates 'buf' argument is wifi_promiscuous_pkt_t */ + WIFI_PKT_DATA, /**< Data frame, indiciates 'buf' argument is wifi_promiscuous_pkt_t */ + WIFI_PKT_MISC, /**< Other type, such as MIMO etc. 'buf' argument is wifi_promiscuous_pkt_t but the payload is zero length. */ +} wifi_promiscuous_pkt_type_t; + + +#define WIFI_PROMIS_FILTER_MASK_ALL (0xFFFFFFFF) /**< filter all packets */ +#define WIFI_PROMIS_FILTER_MASK_MGMT (1) /**< filter the packets with type of WIFI_PKT_MGMT */ +#define WIFI_PROMIS_FILTER_MASK_CTRL (1<<1) /**< filter the packets with type of WIFI_PKT_CTRL */ +#define WIFI_PROMIS_FILTER_MASK_DATA (1<<2) /**< filter the packets with type of WIFI_PKT_DATA */ +#define WIFI_PROMIS_FILTER_MASK_MISC (1<<3) /**< filter the packets with type of WIFI_PKT_MISC */ +#define WIFI_PROMIS_FILTER_MASK_DATA_MPDU (1<<4) /**< filter the MPDU which is a kind of WIFI_PKT_DATA */ +#define WIFI_PROMIS_FILTER_MASK_DATA_AMPDU (1<<5) /**< filter the AMPDU which is a kind of WIFI_PKT_DATA */ + +#define WIFI_PROMIS_CTRL_FILTER_MASK_ALL (0xFF800000) /**< filter all control packets */ +#define WIFI_PROMIS_CTRL_FILTER_MASK_WRAPPER (1<<23) /**< filter the control packets with subtype of Control Wrapper */ +#define WIFI_PROMIS_CTRL_FILTER_MASK_BAR (1<<24) /**< filter the control packets with subtype of Block Ack Request */ +#define WIFI_PROMIS_CTRL_FILTER_MASK_BA (1<<25) /**< filter the control packets with subtype of Block Ack */ +#define WIFI_PROMIS_CTRL_FILTER_MASK_PSPOLL (1<<26) /**< filter the control packets with subtype of PS-Poll */ +#define WIFI_PROMIS_CTRL_FILTER_MASK_RTS (1<<27) /**< filter the control packets with subtype of RTS */ +#define WIFI_PROMIS_CTRL_FILTER_MASK_CTS (1<<28) /**< filter the control packets with subtype of CTS */ +#define WIFI_PROMIS_CTRL_FILTER_MASK_ACK (1<<29) /**< filter the control packets with subtype of ACK */ +#define WIFI_PROMIS_CTRL_FILTER_MASK_CFEND (1<<30) /**< filter the control packets with subtype of CF-END */ +#define WIFI_PROMIS_CTRL_FILTER_MASK_CFENDACK (1<<31) /**< filter the control packets with subtype of CF-END+CF-ACK */ + +/** @brief Mask for filtering different packet types in promiscuous mode. */ +typedef struct { + uint32_t filter_mask; /**< OR of one or more filter values WIFI_PROMIS_FILTER_* */ +} wifi_promiscuous_filter_t; + +#define WIFI_EVENT_MASK_ALL (0xFFFFFFFF) /**< mask all WiFi events */ +#define WIFI_EVENT_MASK_NONE (0) /**< mask none of the WiFi events */ +#define WIFI_EVENT_MASK_AP_PROBEREQRECVED (BIT(0)) /**< mask SYSTEM_EVENT_AP_PROBEREQRECVED event */ + +/** + * @brief Channel state information(CSI) configuration type + * + */ +typedef struct { + bool lltf_en; /**< enable to receive legacy long training field(lltf) data. Default enabled */ + bool htltf_en; /**< enable to receive HT long training field(htltf) data. Default enabled */ + bool stbc_htltf2_en; /**< enable to receive space time block code HT long training field(stbc-htltf2) data. Default enabled */ + bool ltf_merge_en; /**< enable to generate htlft data by averaging lltf and ht_ltf data when receiving HT packet. Otherwise, use ht_ltf data directly. Default enabled */ + bool channel_filter_en; /**< enable to turn on channel filter to smooth adjacent sub-carrier. Disable it to keep independence of adjacent sub-carrier. Default enabled */ + bool manu_scale; /**< manually scale the CSI data by left shifting or automatically scale the CSI data. If set true, please set the shift bits. false: automatically. true: manually. Default false */ + uint8_t shift; /**< manually left shift bits of the scale of the CSI data. The range of the left shift bits is 0~15 */ +} wifi_csi_config_t; + +/** + * @brief CSI data type + * + */ +typedef struct { + wifi_pkt_rx_ctrl_t rx_ctrl;/**< received packet radio metadata header of the CSI data */ + uint8_t mac[6]; /**< source MAC address of the CSI data */ + bool first_word_invalid; /**< first four bytes of the CSI data is invalid or not */ + int8_t *buf; /**< buffer of CSI data */ + uint16_t len; /**< length of CSI data */ +} wifi_csi_info_t; + +/** + * @brief WiFi GPIO configuration for antenna selection + * + */ +typedef struct { + uint8_t gpio_select: 1, /**< Whether this GPIO is connected to external antenna switch */ + gpio_num: 7; /**< The GPIO number that connects to external antenna switch */ +} wifi_ant_gpio_t; + +/** + * @brief WiFi GPIOs configuration for antenna selection + * + */ +typedef struct { + wifi_ant_gpio_t gpio_cfg[4]; /**< The configurations of GPIOs that connect to external antenna switch */ +} wifi_ant_gpio_config_t; + +/** + * @brief WiFi antenna mode + * + */ +typedef enum { + WIFI_ANT_MODE_ANT0, /**< Enable WiFi antenna 0 only */ + WIFI_ANT_MODE_ANT1, /**< Enable WiFi antenna 1 only */ + WIFI_ANT_MODE_AUTO, /**< Enable WiFi antenna 0 and 1, automatically select an antenna */ + WIFI_ANT_MODE_MAX, /**< Invalid WiFi enabled antenna */ +} wifi_ant_mode_t; + +/** + * @brief WiFi antenna configuration + * + */ +typedef struct { + wifi_ant_mode_t rx_ant_mode; /**< WiFi antenna mode for receiving */ + wifi_ant_t rx_ant_default; /**< Default antenna mode for receiving, it's ignored if rx_ant_mode is not WIFI_ANT_MODE_AUTO */ + wifi_ant_mode_t tx_ant_mode; /**< WiFi antenna mode for transmission, it can be set to WIFI_ANT_MODE_AUTO only if rx_ant_mode is set to WIFI_ANT_MODE_AUTO */ + uint8_t enabled_ant0: 4, /**< Index (in antenna GPIO configuration) of enabled WIFI_ANT_MODE_ANT0 */ + enabled_ant1: 4; /**< Index (in antenna GPIO configuration) of enabled WIFI_ANT_MODE_ANT1 */ +} wifi_ant_config_t; + +/** + * @brief WiFi PHY rate encodings + * + */ +typedef enum { + WIFI_PHY_RATE_1M_L = 0x00, /**< 1 Mbps with long preamble */ + WIFI_PHY_RATE_2M_L = 0x01, /**< 2 Mbps with long preamble */ + WIFI_PHY_RATE_5M_L = 0x02, /**< 5.5 Mbps with long preamble */ + WIFI_PHY_RATE_11M_L = 0x03, /**< 11 Mbps with long preamble */ + WIFI_PHY_RATE_2M_S = 0x05, /**< 2 Mbps with short preamble */ + WIFI_PHY_RATE_5M_S = 0x06, /**< 5.5 Mbps with short preamble */ + WIFI_PHY_RATE_11M_S = 0x07, /**< 11 Mbps with short preamble */ + WIFI_PHY_RATE_48M = 0x08, /**< 48 Mbps */ + WIFI_PHY_RATE_24M = 0x09, /**< 24 Mbps */ + WIFI_PHY_RATE_12M = 0x0A, /**< 12 Mbps */ + WIFI_PHY_RATE_6M = 0x0B, /**< 6 Mbps */ + WIFI_PHY_RATE_54M = 0x0C, /**< 54 Mbps */ + WIFI_PHY_RATE_36M = 0x0D, /**< 36 Mbps */ + WIFI_PHY_RATE_18M = 0x0E, /**< 18 Mbps */ + WIFI_PHY_RATE_9M = 0x0F, /**< 9 Mbps */ + WIFI_PHY_RATE_MCS0_LGI = 0x10, /**< MCS0 with long GI, 6.5 Mbps for 20MHz, 13.5 Mbps for 40MHz */ + WIFI_PHY_RATE_MCS1_LGI = 0x11, /**< MCS1 with long GI, 13 Mbps for 20MHz, 27 Mbps for 40MHz */ + WIFI_PHY_RATE_MCS2_LGI = 0x12, /**< MCS2 with long GI, 19.5 Mbps for 20MHz, 40.5 Mbps for 40MHz */ + WIFI_PHY_RATE_MCS3_LGI = 0x13, /**< MCS3 with long GI, 26 Mbps for 20MHz, 54 Mbps for 40MHz */ + WIFI_PHY_RATE_MCS4_LGI = 0x14, /**< MCS4 with long GI, 39 Mbps for 20MHz, 81 Mbps for 40MHz */ + WIFI_PHY_RATE_MCS5_LGI = 0x15, /**< MCS5 with long GI, 52 Mbps for 20MHz, 108 Mbps for 40MHz */ + WIFI_PHY_RATE_MCS6_LGI = 0x16, /**< MCS6 with long GI, 58.5 Mbps for 20MHz, 121.5 Mbps for 40MHz */ + WIFI_PHY_RATE_MCS7_LGI = 0x17, /**< MCS7 with long GI, 65 Mbps for 20MHz, 135 Mbps for 40MHz */ + WIFI_PHY_RATE_MCS0_SGI = 0x18, /**< MCS0 with short GI, 7.2 Mbps for 20MHz, 15 Mbps for 40MHz */ + WIFI_PHY_RATE_MCS1_SGI = 0x19, /**< MCS1 with short GI, 14.4 Mbps for 20MHz, 30 Mbps for 40MHz */ + WIFI_PHY_RATE_MCS2_SGI = 0x1A, /**< MCS2 with short GI, 21.7 Mbps for 20MHz, 45 Mbps for 40MHz */ + WIFI_PHY_RATE_MCS3_SGI = 0x1B, /**< MCS3 with short GI, 28.9 Mbps for 20MHz, 60 Mbps for 40MHz */ + WIFI_PHY_RATE_MCS4_SGI = 0x1C, /**< MCS4 with short GI, 43.3 Mbps for 20MHz, 90 Mbps for 40MHz */ + WIFI_PHY_RATE_MCS5_SGI = 0x1D, /**< MCS5 with short GI, 57.8 Mbps for 20MHz, 120 Mbps for 40MHz */ + WIFI_PHY_RATE_MCS6_SGI = 0x1E, /**< MCS6 with short GI, 65 Mbps for 20MHz, 135 Mbps for 40MHz */ + WIFI_PHY_RATE_MCS7_SGI = 0x1F, /**< MCS7 with short GI, 72.2 Mbps for 20MHz, 150 Mbps for 40MHz */ + WIFI_PHY_RATE_LORA_250K = 0x29, /**< 250 Kbps */ + WIFI_PHY_RATE_LORA_500K = 0x2A, /**< 500 Kbps */ + WIFI_PHY_RATE_MAX, +} wifi_phy_rate_t; + + +/** WiFi event declarations */ +typedef enum { + WIFI_EVENT_WIFI_READY = 0, /**< ESP32 WiFi ready */ + WIFI_EVENT_SCAN_DONE, /**< ESP32 finish scanning AP */ + WIFI_EVENT_STA_START, /**< ESP32 station start */ + WIFI_EVENT_STA_STOP, /**< ESP32 station stop */ + WIFI_EVENT_STA_CONNECTED, /**< ESP32 station connected to AP */ + WIFI_EVENT_STA_DISCONNECTED, /**< ESP32 station disconnected from AP */ + WIFI_EVENT_STA_AUTHMODE_CHANGE, /**< the auth mode of AP connected by ESP32 station changed */ + + WIFI_EVENT_STA_WPS_ER_SUCCESS, /**< ESP32 station wps succeeds in enrollee mode */ + WIFI_EVENT_STA_WPS_ER_FAILED, /**< ESP32 station wps fails in enrollee mode */ + WIFI_EVENT_STA_WPS_ER_TIMEOUT, /**< ESP32 station wps timeout in enrollee mode */ + WIFI_EVENT_STA_WPS_ER_PIN, /**< ESP32 station wps pin code in enrollee mode */ + WIFI_EVENT_STA_WPS_ER_PBC_OVERLAP, /**< ESP32 station wps overlap in enrollee mode */ + + WIFI_EVENT_AP_START, /**< ESP32 soft-AP start */ + WIFI_EVENT_AP_STOP, /**< ESP32 soft-AP stop */ + WIFI_EVENT_AP_STACONNECTED, /**< a station connected to ESP32 soft-AP */ + WIFI_EVENT_AP_STADISCONNECTED, /**< a station disconnected from ESP32 soft-AP */ + WIFI_EVENT_AP_PROBEREQRECVED, /**< Receive probe request packet in soft-AP interface */ + + WIFI_EVENT_MAX, /**< Invalid WiFi event ID */ +} wifi_event_t; + +/** @cond **/ +/** @brief WiFi event base declaration */ +ESP_EVENT_DECLARE_BASE(WIFI_EVENT); +/** @endcond **/ + +/** Argument structure for WIFI_EVENT_SCAN_DONE event */ +typedef struct { + uint32_t status; /**< status of scanning APs: 0 — success, 1 - failure */ + uint8_t number; /**< number of scan results */ + uint8_t scan_id; /**< scan sequence number, used for block scan */ +} wifi_event_sta_scan_done_t; + +/** Argument structure for WIFI_EVENT_STA_CONNECTED event */ +typedef struct { + uint8_t ssid[32]; /**< SSID of connected AP */ + uint8_t ssid_len; /**< SSID length of connected AP */ + uint8_t bssid[6]; /**< BSSID of connected AP*/ + uint8_t channel; /**< channel of connected AP*/ + wifi_auth_mode_t authmode;/**< authentication mode used by AP*/ +} wifi_event_sta_connected_t; + +/** Argument structure for WIFI_EVENT_STA_DISCONNECTED event */ +typedef struct { + uint8_t ssid[32]; /**< SSID of disconnected AP */ + uint8_t ssid_len; /**< SSID length of disconnected AP */ + uint8_t bssid[6]; /**< BSSID of disconnected AP */ + uint8_t reason; /**< reason of disconnection */ +} wifi_event_sta_disconnected_t; + +/** Argument structure for WIFI_EVENT_STA_AUTHMODE_CHANGE event */ +typedef struct { + wifi_auth_mode_t old_mode; /**< the old auth mode of AP */ + wifi_auth_mode_t new_mode; /**< the new auth mode of AP */ +} wifi_event_sta_authmode_change_t; + +/** Argument structure for WIFI_EVENT_STA_WPS_ER_PIN event */ +typedef struct { + uint8_t pin_code[8]; /**< PIN code of station in enrollee mode */ +} wifi_event_sta_wps_er_pin_t; + +/** Argument structure for WIFI_EVENT_STA_WPS_ER_FAILED event */ +typedef enum { + WPS_FAIL_REASON_NORMAL = 0, /**< ESP32 WPS normal fail reason */ + WPS_FAIL_REASON_RECV_M2D, /**< ESP32 WPS receive M2D frame */ + WPS_FAIL_REASON_MAX +} wifi_event_sta_wps_fail_reason_t; + +/** Argument structure for WIFI_EVENT_AP_STACONNECTED event */ +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 */ +} 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 */ +} wifi_event_ap_stadisconnected_t; + +/** Argument structure for WIFI_EVENT_AP_PROBEREQRECVED event */ +typedef struct { + int rssi; /**< Received probe request signal strength */ + uint8_t mac[6]; /**< MAC address of the station which send probe request */ +} wifi_event_ap_probe_req_rx_t; + +#ifdef __cplusplus +} +#endif + +#endif /* __ESP_WIFI_TYPES_H__ */ diff --git a/arch/xtensa/include/esp32/esp_wifi/phy.h b/arch/xtensa/include/esp32/esp_wifi/phy.h new file mode 100644 index 0000000000000..b101200411147 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_wifi/phy.h @@ -0,0 +1,77 @@ +// 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. + +#pragma once +#include "esp_phy_init.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ESP_CAL_DATA_CHECK_FAIL 1 + +/** + * @file phy.h + * @brief Declarations for functions provided by libphy.a + */ + +/** + * @brief Return ROM function pointer table from PHY library. + */ +void phy_get_romfunc_addr(void); + +/** + * @brief Initialize PHY module and do RF calibration + * @param[in] init_data Initialization parameters to be used by the PHY + * @param[inout] cal_data As input, calibration data previously obtained. As output, will contain new calibration data. + * @param[in] cal_mode RF calibration mode + * @return ESP_CAL_DATA_CHECK_FAIL if calibration data checksum fails, other values are reserved for future use + */ +int register_chipv7_phy(const esp_phy_init_data_t* init_data, esp_phy_calibration_data_t *cal_data, esp_phy_calibration_mode_t cal_mode); + +/** + * @brief Get the format version of calibration data used by PHY library. + * @return Format version number, OR'ed with BIT(16) if PHY is in WIFI only mode. + */ +uint32_t phy_get_rf_cal_version(void); + +/** + * @brief Set RF/BB for only WIFI mode or coexist(WIFI & BT) mode + * @param[in] true is for only WIFI mode, false is for coexist mode. default is 0. + * @return NULL + */ +void phy_set_wifi_mode_only(bool wifi_only); + +/** + * @brief Set BT the highest priority in coexist mode. + * @return NULL + */ +void coex_bt_high_prio(void); + +#if CONFIG_IDF_TARGET_ESP32S2BETA +/** + * @brief Open PHY and RF. + */ +void phy_wakeup_init(void); +#endif + +/** + * @brief Shutdown PHY and RF. + */ +void phy_close_rf(void); + +#ifdef __cplusplus +} +#endif + diff --git a/arch/xtensa/include/esp32/esp_wifi/smartconfig_ack.h b/arch/xtensa/include/esp32/esp_wifi/smartconfig_ack.h new file mode 100644 index 0000000000000..0eb3e4b6606c8 --- /dev/null +++ b/arch/xtensa/include/esp32/esp_wifi/smartconfig_ack.h @@ -0,0 +1,44 @@ +// 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. + +#ifndef SMARTCONFIG_ACK_H +#define SMARTCONFIG_ACK_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Send smartconfig ACK to cellphone. + * + * @attention The API can only be used when receiving SC_EVENT_GOT_SSID_PSWD event. + * + * @param type: smartconfig type(ESPTouch or AirKiss); + * token: token from the cellphone; + * cellphone_ip: IP address of the cellphone; + * + * @retuen ESP_OK: succeed + * others: fail + */ +esp_err_t sc_send_ack_start(smartconfig_type_t type, uint8_t token, uint8_t *cellphone_ip); + +/** + * @brief Stop sending smartconfig ACK to cellphone. + */ +void sc_send_ack_stop(void); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/arch/xtensa/include/esp32/freertos/FreeRTOS.h b/arch/xtensa/include/esp32/freertos/FreeRTOS.h new file mode 100644 index 0000000000000..94c78bff8567d --- /dev/null +++ b/arch/xtensa/include/esp32/freertos/FreeRTOS.h @@ -0,0 +1,1067 @@ +/* + FreeRTOS V8.2.0 - Copyright (C) 2015 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 INC_FREERTOS_H +#define INC_FREERTOS_H + +/* + * Include the generic headers required for the FreeRTOS port being used. + */ +#include +#include "sys/reent.h" + +/* + * If stdint.h cannot be located then: + * + If using GCC ensure the -nostdint options is *not* being used. + * + Ensure the project's include path includes the directory in which your + * compiler stores stdint.h. + * + Set any compiler options necessary for it to support C99, as technically + * stdint.h is only mandatory with C99 (FreeRTOS does not require C99 in any + * other way). + * + The FreeRTOS download includes a simple stdint.h definition that can be + * used in cases where none is provided by the compiler. The files only + * contains the typedefs required to build FreeRTOS. Read the instructions + * in FreeRTOS/source/stdint.readme for more information. + */ +#include /* READ COMMENT ABOVE. */ + +#ifdef __cplusplus +extern "C" { +#endif +/* for likely and unlikely */ +#include "../esp_common/esp_compiler.h" + +/* Application specific configuration options. */ +#include "FreeRTOSConfig.h" + +/* Basic FreeRTOS definitions. */ +#include "projdefs.h" + +/* Definitions specific to the port being used. */ +#include "portable.h" + +#ifndef OS_DEBUG +#define OS_DEBUG 0 +#endif + +/* + * Check all the required application specific macros have been defined. + * These macros are application specific and (as downloaded) are defined + * within FreeRTOSConfig.h. + */ + +#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. +#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. +#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. +#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. +#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. +#endif + +#ifndef configUSE_CO_ROUTINES + #error Missing definition: configUSE_CO_ROUTINES must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef INCLUDE_vTaskPrioritySet + #error Missing definition: INCLUDE_vTaskPrioritySet must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef INCLUDE_uxTaskPriorityGet + #error Missing definition: INCLUDE_uxTaskPriorityGet must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef INCLUDE_vTaskDelete + #error Missing definition: INCLUDE_vTaskDelete must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef INCLUDE_vTaskSuspend + #error Missing definition: INCLUDE_vTaskSuspend must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef INCLUDE_vTaskDelayUntil + #error Missing definition: INCLUDE_vTaskDelayUntil must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef INCLUDE_vTaskDelay + #error Missing definition: INCLUDE_vTaskDelay 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. +#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 +#endif + +#ifndef configMAX_PRIORITIES + #error configMAX_PRIORITIES must be defined to be greater than or equal to 1. +#endif + +#ifndef INCLUDE_xTaskGetIdleTaskHandle + #define INCLUDE_xTaskGetIdleTaskHandle 0 +#endif + +#ifndef INCLUDE_xTimerGetTimerDaemonTaskHandle + #define INCLUDE_xTimerGetTimerDaemonTaskHandle 0 +#endif + +#ifndef INCLUDE_xQueueGetMutexHolder + #define INCLUDE_xQueueGetMutexHolder 0 +#endif + +#ifndef INCLUDE_xSemaphoreGetMutexHolder + #define INCLUDE_xSemaphoreGetMutexHolder INCLUDE_xQueueGetMutexHolder +#endif + +#ifndef INCLUDE_pcTaskGetTaskName + #define INCLUDE_pcTaskGetTaskName 1 +#endif + +#ifndef configUSE_APPLICATION_TASK_TAG + #define configUSE_APPLICATION_TASK_TAG 0 +#endif + +#ifndef INCLUDE_uxTaskGetStackHighWaterMark + #define INCLUDE_uxTaskGetStackHighWaterMark 0 +#endif + +#ifndef INCLUDE_pxTaskGetStackStart + #define INCLUDE_pxTaskGetStackStart 0 +#endif + +#ifndef INCLUDE_eTaskGetState + #define INCLUDE_eTaskGetState 0 +#endif + +#ifndef configUSE_RECURSIVE_MUTEXES + #define configUSE_RECURSIVE_MUTEXES 0 +#endif + +#ifndef configUSE_MUTEXES + #define configUSE_MUTEXES 0 +#endif + +#ifndef configUSE_TIMERS + #define configUSE_TIMERS 0 +#endif + +#ifndef configUSE_COUNTING_SEMAPHORES + #define configUSE_COUNTING_SEMAPHORES 0 +#endif + +#ifndef configUSE_ALTERNATIVE_API + #define configUSE_ALTERNATIVE_API 0 +#endif + +#ifndef portCRITICAL_NESTING_IN_TCB + #define portCRITICAL_NESTING_IN_TCB 0 +#endif + +#ifndef configMAX_TASK_NAME_LEN + #define configMAX_TASK_NAME_LEN 16 +#endif + +#ifndef configIDLE_SHOULD_YIELD + #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 +#endif + +#ifndef INCLUDE_xTaskResumeFromISR + #define INCLUDE_xTaskResumeFromISR 1 +#endif + +#ifndef INCLUDE_xEventGroupSetBitFromISR + #define INCLUDE_xEventGroupSetBitFromISR 0 +#endif + +#ifndef INCLUDE_xTimerPendFunctionCall + #define INCLUDE_xTimerPendFunctionCall 0 +#endif + +#ifndef configASSERT + #define configASSERT( x ) + #define configASSERT_DEFINED 0 +#else + #define configASSERT_DEFINED 1 +#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_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 */ + +#endif /* configUSE_TIMERS */ + +#ifndef INCLUDE_xTaskGetSchedulerState + #define INCLUDE_xTaskGetSchedulerState 0 +#endif + +#ifndef INCLUDE_xTaskGetCurrentTaskHandle + #define INCLUDE_xTaskGetCurrentTaskHandle 0 +#endif + + +#ifndef portSET_INTERRUPT_MASK_FROM_ISR + #define portSET_INTERRUPT_MASK_FROM_ISR() 0 +#endif + +#ifndef portCLEAR_INTERRUPT_MASK_FROM_ISR + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue ) ( void ) uxSavedStatusValue +#endif + +#ifndef portCLEAN_UP_TCB + #define portCLEAN_UP_TCB( pxTCB ) ( void ) pxTCB +#endif + +#ifndef portPRE_TASK_DELETE_HOOK + #define portPRE_TASK_DELETE_HOOK( pvTaskToDelete, pxYieldPending ) +#endif + +#ifndef portSETUP_TCB + #define portSETUP_TCB( pxTCB ) ( void ) pxTCB +#endif + +#ifndef configQUEUE_REGISTRY_SIZE + #define configQUEUE_REGISTRY_SIZE 0U +#endif + +#if ( configQUEUE_REGISTRY_SIZE < 1 ) + #define vQueueAddToRegistry( xQueue, pcName ) + #define vQueueUnregisterQueue( xQueue ) +#endif + +#ifndef portPOINTER_SIZE_TYPE + #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() +#endif + +#ifndef 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() +#endif + +#ifndef traceINCREASE_TICK_COUNT + /* 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() +#endif + +#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() +#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 ) +#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 ) +#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 ) +#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 ) +#endif + +#ifndef configCHECK_FOR_STACK_OVERFLOW + #define configCHECK_FOR_STACK_OVERFLOW 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 ) +#endif + +#ifndef traceREADDED_TASK_TO_READY_STATE + #define traceREADDED_TASK_TO_READY_STATE( pxTCB ) traceMOVED_TASK_TO_READY_STATE( pxTCB ) +#endif + +#ifndef traceMOVED_TASK_TO_DELAYED_LIST + #define traceMOVED_TASK_TO_DELAYED_LIST() +#endif + +#ifndef traceMOVED_TASK_TO_OVERFLOW_DELAYED_LIST + #define traceMOVED_TASK_TO_OVERFLOW_DELAYED_LIST() +#endif + +#ifndef traceMOVED_TASK_TO_SUSPENDED_LIST + #define traceMOVED_TASK_TO_SUSPENDED_LIST( pxTCB ) +#endif + +#ifndef traceQUEUE_CREATE + #define traceQUEUE_CREATE( pxNewQueue ) +#endif + +#ifndef traceQUEUE_CREATE_FAILED + #define traceQUEUE_CREATE_FAILED( ucQueueType ) +#endif + +#ifndef traceCREATE_MUTEX + #define traceCREATE_MUTEX( pxNewQueue ) +#endif + +#ifndef traceCREATE_MUTEX_FAILED + #define traceCREATE_MUTEX_FAILED() +#endif + +#ifndef traceGIVE_MUTEX_RECURSIVE + #define traceGIVE_MUTEX_RECURSIVE( pxMutex ) +#endif + +#ifndef traceGIVE_MUTEX_RECURSIVE_FAILED + #define traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ) +#endif + +#ifndef traceTAKE_MUTEX_RECURSIVE + #define traceTAKE_MUTEX_RECURSIVE( pxMutex ) +#endif + +#ifndef traceTAKE_MUTEX_RECURSIVE_FAILED + #define traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex ) +#endif + +#ifndef traceCREATE_COUNTING_SEMAPHORE + #define traceCREATE_COUNTING_SEMAPHORE() +#endif + +#ifndef traceCREATE_COUNTING_SEMAPHORE_FAILED + #define traceCREATE_COUNTING_SEMAPHORE_FAILED() +#endif + +#ifndef traceQUEUE_SEND + #define traceQUEUE_SEND( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FAILED + #define traceQUEUE_SEND_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE + #define traceQUEUE_RECEIVE( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK + #define traceQUEUE_PEEK( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK_FROM_ISR + #define traceQUEUE_PEEK_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FAILED + #define traceQUEUE_RECEIVE_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FROM_ISR + #define traceQUEUE_SEND_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FROM_ISR_FAILED + #define traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FROM_ISR + #define traceQUEUE_RECEIVE_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FROM_ISR_FAILED + #define traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK_FROM_ISR_FAILED + #define traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_DELETE + #define traceQUEUE_DELETE( pxQueue ) +#endif + +#ifndef traceTASK_CREATE + #define traceTASK_CREATE( pxNewTCB ) +#endif + +#ifndef traceQUEUE_GIVE_FROM_ISR + #define traceQUEUE_GIVE_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_GIVE_FROM_ISR_FAILED + #define traceQUEUE_GIVE_FROM_ISR_FAILED( pxQueue ) +#endif + +#ifndef traceTASK_CREATE_FAILED + #define traceTASK_CREATE_FAILED() +#endif + +#ifndef traceTASK_DELETE + #define traceTASK_DELETE( pxTaskToDelete ) +#endif + +#ifndef traceTASK_DELAY_UNTIL + #define traceTASK_DELAY_UNTIL() +#endif + +#ifndef traceTASK_DELAY + #define traceTASK_DELAY() +#endif + +#ifndef traceTASK_PRIORITY_SET + #define traceTASK_PRIORITY_SET( pxTask, uxNewPriority ) +#endif + +#ifndef traceTASK_SUSPEND + #define traceTASK_SUSPEND( pxTaskToSuspend ) +#endif + +#ifndef traceTASK_RESUME + #define traceTASK_RESUME( pxTaskToResume ) +#endif + +#ifndef traceTASK_RESUME_FROM_ISR + #define traceTASK_RESUME_FROM_ISR( pxTaskToResume ) +#endif + +#ifndef traceTASK_INCREMENT_TICK + #define traceTASK_INCREMENT_TICK( xTickCount ) +#endif + +#ifndef traceTIMER_CREATE + #define traceTIMER_CREATE( pxNewTimer ) +#endif + +#ifndef traceTIMER_CREATE_FAILED + #define traceTIMER_CREATE_FAILED() +#endif + +#ifndef traceTIMER_COMMAND_SEND + #define traceTIMER_COMMAND_SEND( xTimer, xMessageID, xMessageValueValue, xReturn ) +#endif + +#ifndef traceTIMER_EXPIRED + #define traceTIMER_EXPIRED( pxTimer ) +#endif + +#ifndef traceTIMER_COMMAND_RECEIVED + #define traceTIMER_COMMAND_RECEIVED( pxTimer, xMessageID, xMessageValue ) +#endif + +#ifndef traceMALLOC + #define traceMALLOC( pvAddress, uiSize ) +#endif + +#ifndef traceFREE + #define traceFREE( pvAddress, uiSize ) +#endif + +#ifndef traceEVENT_GROUP_CREATE + #define traceEVENT_GROUP_CREATE( xEventGroup ) +#endif + +#ifndef traceEVENT_GROUP_CREATE_FAILED + #define traceEVENT_GROUP_CREATE_FAILED() +#endif + +#ifndef traceEVENT_GROUP_SYNC_BLOCK + #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 +#endif + +#ifndef traceEVENT_GROUP_WAIT_BITS_BLOCK + #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 +#endif + +#ifndef traceEVENT_GROUP_CLEAR_BITS + #define traceEVENT_GROUP_CLEAR_BITS( xEventGroup, uxBitsToClear ) +#endif + +#ifndef traceEVENT_GROUP_CLEAR_BITS_FROM_ISR + #define traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear ) +#endif + +#ifndef traceEVENT_GROUP_SET_BITS + #define traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet ) +#endif + +#ifndef traceEVENT_GROUP_SET_BITS_FROM_ISR + #define traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet ) +#endif + +#ifndef traceEVENT_GROUP_DELETE + #define traceEVENT_GROUP_DELETE( xEventGroup ) +#endif + +#ifndef tracePEND_FUNC_CALL + #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) +#endif + +#ifndef traceQUEUE_REGISTRY_ADD + #define traceQUEUE_REGISTRY_ADD(xQueue, pcQueueName) +#endif + +#ifndef traceTASK_NOTIFY_GIVE_FROM_ISR + #define traceTASK_NOTIFY_GIVE_FROM_ISR() + #endif + +#ifndef traceISR_EXIT_TO_SCHEDULER + #define traceISR_EXIT_TO_SCHEDULER() +#endif + +#ifndef traceISR_EXIT + #define traceISR_EXIT() +#endif + +#ifndef traceISR_ENTER + #define traceISR_ENTER(_n_) +#endif + +#ifndef configGENERATE_RUN_TIME_STATS + #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 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() +#endif + +#ifndef configUSE_MALLOC_FAILED_HOOK + #define configUSE_MALLOC_FAILED_HOOK 0 +#endif + +#ifndef portPRIVILEGE_BIT + #define portPRIVILEGE_BIT ( ( UBaseType_t ) 0x00 ) +#endif + +#ifndef portYIELD_WITHIN_API + #define portYIELD_WITHIN_API portYIELD +#endif + +#ifndef pvPortMallocAligned + #define pvPortMallocAligned( x, puxStackBuffer ) ( ( ( puxStackBuffer ) == NULL ) ? ( pvPortMalloc( ( x ) ) ) : ( puxStackBuffer ) ) +#endif + +#ifndef vPortFreeAligned + #define vPortFreeAligned( pvBlockToFree ) vPortFree( pvBlockToFree ) +#endif + +#ifndef portSUPPRESS_TICKS_AND_SLEEP + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) +#endif + +#ifndef configEXPECTED_IDLE_TIME_BEFORE_SLEEP + #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 +#endif + +#ifndef configUSE_TICKLESS_IDLE + #define configUSE_TICKLESS_IDLE 0 +#endif + +#ifndef configPRE_SLEEP_PROCESSING + #define configPRE_SLEEP_PROCESSING( x ) +#endif + +#ifndef configPOST_SLEEP_PROCESSING + #define configPOST_SLEEP_PROCESSING( x ) +#endif + +#ifndef configUSE_QUEUE_SETS + #define configUSE_QUEUE_SETS 0 +#endif + +#ifndef portTASK_USES_FLOATING_POINT + #define portTASK_USES_FLOATING_POINT() +#endif + +#ifndef configUSE_TIME_SLICING + #define configUSE_TIME_SLICING 1 +#endif + +#ifndef configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS + #define configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS 0 +#endif + +#ifndef configUSE_NEWLIB_REENTRANT + #define configUSE_NEWLIB_REENTRANT 0 +#endif + +#ifndef configUSE_STATS_FORMATTING_FUNCTIONS + #define configUSE_STATS_FORMATTING_FUNCTIONS 0 +#endif + +#ifndef configTASKLIST_INCLUDE_COREID + #define configTASKLIST_INCLUDE_COREID 0 +#endif + +#ifndef portASSERT_IF_INTERRUPT_PRIORITY_INVALID + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() +#endif + +#ifndef configUSE_TRACE_FACILITY + #define configUSE_TRACE_FACILITY 0 +#endif + +#ifndef mtCOVERAGE_TEST_MARKER + #define mtCOVERAGE_TEST_MARKER() +#endif + +#ifndef portASSERT_IF_IN_ISR + #define portASSERT_IF_IN_ISR() +#endif + +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 +#endif + +#ifndef configAPPLICATION_ALLOCATED_HEAP + #define configAPPLICATION_ALLOCATED_HEAP 0 +#endif + +#ifndef configUSE_TASK_NOTIFICATIONS + #define configUSE_TASK_NOTIFICATIONS 1 +#endif + +#ifndef portTICK_TYPE_IS_ATOMIC + #define portTICK_TYPE_IS_ATOMIC 0 +#endif + +#ifndef configSUPPORT_STATIC_ALLOCATION + /* 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 +#endif + +#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( 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 + +/* Definitions to allow backward compatibility with FreeRTOS versions prior to +V8 if desired. */ +#ifndef configENABLE_BACKWARD_COMPATIBILITY + #define configENABLE_BACKWARD_COMPATIBILITY 1 +#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 + + /* 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 +#endif /* configENABLE_BACKWARD_COMPATIBILITY */ + +#ifndef configESP32_PER_TASK_DATA + #define configESP32_PER_TASK_DATA 1 +#endif + +/* + * In line with software engineering best practice, FreeRTOS implements a strict + * data hiding policy, so the real structures used by FreeRTOS to maintain the + * state of tasks, queues, semaphores, etc. are not accessible to the application + * code. However, if the application writer wants to statically allocate such + * an object then the size of the object needs to be know. Dummy structures + * that are guaranteed to have the same size and alignment requirements of the + * real objects are used for this purpose. The dummy list and list item + * structures below are used for inclusion in such a dummy structure. + */ +struct xSTATIC_LIST_ITEM +{ + TickType_t xDummy1; + void *pvDummy2[ 4 ]; +}; +typedef struct xSTATIC_LIST_ITEM StaticListItem_t; + +/* See the comments above the struct xSTATIC_LIST_ITEM definition. */ +struct xSTATIC_MINI_LIST_ITEM +{ + TickType_t xDummy1; + void *pvDummy2[ 2 ]; +}; +typedef struct xSTATIC_MINI_LIST_ITEM StaticMiniListItem_t; + +/* See the comments above the struct xSTATIC_LIST_ITEM definition. */ +typedef struct xSTATIC_LIST +{ + UBaseType_t uxDummy1; + void *pvDummy2; + StaticMiniListItem_t xDummy3; +} StaticList_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 Task 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 task then + * the size of the task object needs to be know. The StaticTask_t structure + * below is provided for this purpose. Its sizes 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_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 ]; + UBaseType_t uxDummyCoreId; + #if ( portSTACK_GROWTH > 0 || configENABLE_TASK_SNAPSHOT == 1 ) + void *pxDummy8; + #endif + #if ( portCRITICAL_NESTING_IN_TCB == 1 ) + UBaseType_t uxDummy9; + uint32_t OldInterruptState; + #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; + uint32_t ucDummy19; + #endif + #if( ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) \ + || ( portUSING_MPU_WRAPPERS == 1 ) ) + uint8_t uxDummy20; + #endif + +} StaticTask_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 Queue 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 queue + * then the size of the queue object needs to be know. The StaticQueue_t + * structure below is provided for this purpose. Its sizes 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_QUEUE +{ + void *pvDummy1[ 3 ]; + + union + { + void *pvDummy2; + UBaseType_t uxDummy2; + } u; + + StaticList_t xDummy3[ 2 ]; + UBaseType_t uxDummy4[ 3 ]; + + #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucDummy6; + #endif + + #if ( configUSE_QUEUE_SETS == 1 ) + void *pvDummy7; + #endif + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy8; + uint8_t ucDummy9; + #endif + + portMUX_TYPE muxDummy; //Mutex required due to SMP + +} StaticQueue_t; +typedef StaticQueue_t StaticSemaphore_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 event group 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 an event group then the size of the event group object needs to be + * know. The StaticEventGroup_t structure below is provided for this purpose. + * Its sizes 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_EVENT_GROUP +{ + TickType_t xDummy1; + StaticList_t xDummy2; + + #if( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy3; + #endif + + #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucDummy4; + #endif + + portMUX_TYPE muxDummy; //Mutex required due to SMP + +} StaticEventGroup_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 software timer 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 software timer then the size of the queue object needs to be know. + * The StaticTimer_t structure below is provided for this purpose. Its sizes + * 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_TIMER +{ + void *pvDummy1; + StaticListItem_t xDummy2; + TickType_t xDummy3; + UBaseType_t uxDummy4; + void *pvDummy5[ 2 ]; + #if( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy6; + #endif + + #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucDummy7; + #endif + +} StaticTimer_t; + +#ifdef __cplusplus +} +#endif + +#endif /* INC_FREERTOS_H */ + diff --git a/arch/xtensa/include/esp32/freertos/FreeRTOSConfig.h b/arch/xtensa/include/esp32/freertos/FreeRTOSConfig.h new file mode 100644 index 0000000000000..4d8a8f7cd8aff --- /dev/null +++ b/arch/xtensa/include/esp32/freertos/FreeRTOSConfig.h @@ -0,0 +1,328 @@ +/* + FreeRTOS V8.2.0 - Copyright (C) 2015 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_H +#define FREERTOS_CONFIG_H + +#include + + +/* ESP31 and ESP32 are dualcore processors. */ +#ifndef CONFIG_FREERTOS_UNICORE +#define portNUM_PROCESSORS 2 +#else +#define portNUM_PROCESSORS 1 +#endif + +#define XT_USE_THREAD_SAFE_CLIB 0 +#define configASSERT_2 0 +#define portUSING_MPU_WRAPPERS 0 +#define configUSE_MUTEX 1 +#undef XT_USE_SWPRI + +#if CONFIG_FREERTOS_CORETIMER_0 +#define XT_TIMER_INDEX 0 +#elif CONFIG_FREERTOS_CORETIMER_1 +#define XT_TIMER_INDEX 1 +#endif + +#define configNUM_THREAD_LOCAL_STORAGE_POINTERS CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS +#define configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS 1 + +#ifndef __ASSEMBLER__ + +/** + * This function is defined to provide a deprecation warning whenever + * XT_CLOCK_FREQ macro is used. + * Update the code to use esp_clk_cpu_freq function instead. + * @return current CPU clock frequency, in Hz + */ +int xt_clock_freq(void) __attribute__((deprecated)); + +#define XT_CLOCK_FREQ (xt_clock_freq()) + +#endif // __ASSEMBLER__ + + +/* Required for configuration-dependent settings */ +#include "xtensa_config.h" + + +/* configASSERT behaviour */ +#ifndef __ASSEMBLER__ +#include /* for abort() */ +#if CONFIG_IDF_TARGET_ESP32 +#include "../esp_rom/include/esp32/rom/ets_sys.h" +#elif CONFIG_IDF_TARGET_ESP32S2BETA +#include "esp32s2beta/rom/ets_sys.h" +#endif + +#if defined(CONFIG_FREERTOS_ASSERT_DISABLE) +#define configASSERT(a) /* assertions disabled */ +#elif defined(CONFIG_FREERTOS_ASSERT_FAIL_PRINT_CONTINUE) +#define configASSERT(a) if (unlikely(!(a))) { \ + ets_printf("%s:%d (%s)- assert failed!\n", __FILE__, __LINE__, \ + __FUNCTION__); \ + } +#else /* CONFIG_FREERTOS_ASSERT_FAIL_ABORT */ +#define configASSERT(a) if (unlikely(!(a))) { \ + ets_printf("%s:%d (%s)- assert failed!\n", __FILE__, __LINE__, \ + __FUNCTION__); \ + abort(); \ + } +#endif + +#if CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION +#define UNTESTED_FUNCTION() { ets_printf("Untested FreeRTOS function %s\r\n", __FUNCTION__); configASSERT(false); } while(0) +#else +#define UNTESTED_FUNCTION() +#endif + + +#endif /* def __ASSEMBLER__ */ + + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * Note that the default heap size is deliberately kept small so that + * the build is more likely to succeed for configurations with limited + * memory. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 1 +#define configUSE_TICK_HOOK 1 + +#define configTICK_RATE_HZ ( CONFIG_FREERTOS_HZ ) + +/* Default clock rate for simulator */ +//#define configCPU_CLOCK_HZ 80000000 + +/* This has impact on speed of search for highest priority */ +#ifdef SMALL_TEST +#define configMAX_PRIORITIES ( 7 ) +#else +#define configMAX_PRIORITIES ( 25 ) +#endif + +#ifndef CONFIG_APPTRACE_ENABLE +#define configMINIMAL_STACK_SIZE 768 +#else +/* apptrace module requires at least 2KB of stack per task */ +#define configMINIMAL_STACK_SIZE 2048 +#endif + +#ifndef configIDLE_TASK_STACK_SIZE +#define configIDLE_TASK_STACK_SIZE CONFIG_FREERTOS_IDLE_TASK_STACKSIZE +#endif + +/* The Xtensa port uses a separate interrupt stack. Adjust the stack size */ +/* to suit the needs of your specific application. */ +#ifndef configISR_STACK_SIZE +#define configISR_STACK_SIZE CONFIG_FREERTOS_ISR_STACKSIZE +#endif + +/* Minimal heap size to make sure examples can run on memory limited + configs. Adjust this to suit your system. */ + + +//We define the heap to span all of the non-statically-allocated shared RAM. ToDo: Make sure there +//is some space left for the app and main cpu when running outside of a thread. +#define configAPPLICATION_ALLOCATED_HEAP 0 +#define configTOTAL_HEAP_SIZE (&_heap_end - &_heap_start)//( ( size_t ) (64 * 1024) ) + +#define configMAX_TASK_NAME_LEN ( CONFIG_FREERTOS_MAX_TASK_NAME_LEN ) + +#ifdef CONFIG_FREERTOS_USE_TRACE_FACILITY +#define configUSE_TRACE_FACILITY 1 /* Used by uxTaskGetSystemState(), and other trace facility functions */ +#endif + +#ifdef CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS +#define configUSE_STATS_FORMATTING_FUNCTIONS 1 /* Used by vTaskList() */ +#endif + +#ifdef CONFIG_FREERTOS_VTASKLIST_INCLUDE_COREID +#define configTASKLIST_INCLUDE_COREID 1 +#endif + +#ifdef CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS +#define configGENERATE_RUN_TIME_STATS 1 /* Used by vTaskGetRunTimeStats() */ +#endif + +#define configUSE_TRACE_FACILITY_2 0 /* Provided by Xtensa port patch */ +#define configBENCHMARK 0 /* Provided by Xtensa port patch */ +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 0 +#define configQUEUE_REGISTRY_SIZE CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE + +#define configUSE_MUTEXES 1 +#define configUSE_RECURSIVE_MUTEXES 1 +#define configUSE_COUNTING_SEMAPHORES 1 + +#if CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE +#define configCHECK_FOR_STACK_OVERFLOW 0 +#elif CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL +#define configCHECK_FOR_STACK_OVERFLOW 1 +#elif CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY +#define configCHECK_FOR_STACK_OVERFLOW 2 +#endif + + + + +/* Co-routine definitions. */ +#define configUSE_CO_ROUTINES 0 +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +/* Set the following definitions to 1 to include the API function, or zero + to exclude the API function. */ + +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 0 +#define INCLUDE_uxTaskGetStackHighWaterMark 1 +#define INCLUDE_pcTaskGetTaskName 1 +#define INCLUDE_xTaskGetIdleTaskHandle 1 +#define INCLUDE_pxTaskGetStackStart 1 + +#define INCLUDE_xSemaphoreGetMutexHolder 1 + +/* The priority at which the tick interrupt runs. This should probably be + kept at 1. */ +#define configKERNEL_INTERRUPT_PRIORITY 1 + +/* The maximum interrupt priority from which FreeRTOS.org API functions can + be called. Only API functions that end in ...FromISR() can be used within + interrupts. */ +#define configMAX_SYSCALL_INTERRUPT_PRIORITY XCHAL_EXCM_LEVEL + +#define configUSE_NEWLIB_REENTRANT 0 + +#define configSUPPORT_DYNAMIC_ALLOCATION 1 +#define configSUPPORT_STATIC_ALLOCATION CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION + +#ifndef __ASSEMBLER__ +#if CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP +extern void vPortCleanUpTCB ( void *pxTCB ); +#define portCLEAN_UP_TCB( pxTCB ) vPortCleanUpTCB( pxTCB ) +#endif +#endif + +/* Test FreeRTOS timers (with timer task) and more. */ +/* Some files don't compile if this flag is disabled */ +#define configUSE_TIMERS 1 +#define configTIMER_TASK_PRIORITY CONFIG_FREERTOS_TIMER_TASK_PRIORITY +#define configTIMER_QUEUE_LENGTH CONFIG_FREERTOS_TIMER_QUEUE_LENGTH +#define configTIMER_TASK_STACK_DEPTH CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH + +#define INCLUDE_xTimerPendFunctionCall 1 +#define INCLUDE_eTaskGetState 1 +#define configUSE_QUEUE_SETS 1 + +#define configUSE_TICKLESS_IDLE CONFIG_FREERTOS_USE_TICKLESS_IDLE +#if configUSE_TICKLESS_IDLE +#define configEXPECTED_IDLE_TIME_BEFORE_SLEEP CONFIG_FREERTOS_IDLE_TIME_BEFORE_SLEEP +#endif //configUSE_TICKLESS_IDLE + +#define configXT_BOARD 1 /* Board mode */ +#define configXT_SIMULATOR 0 + +#if CONFIG_ESP32_ENABLE_COREDUMP +#define configENABLE_TASK_SNAPSHOT 1 +#endif +#ifndef configENABLE_TASK_SNAPSHOT +#define configENABLE_TASK_SNAPSHOT 1 +#endif + +#if CONFIG_SYSVIEW_ENABLE +#ifndef __ASSEMBLER__ +#include "SEGGER_SYSVIEW_FreeRTOS.h" +#undef INLINE // to avoid redefinition +#endif /* def __ASSEMBLER__ */ +#endif + +#if CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER +#define configCHECK_MUTEX_GIVEN_BY_OWNER 1 +#else +#define configCHECK_MUTEX_GIVEN_BY_OWNER 0 +#endif + +#endif /* FREERTOS_CONFIG_H */ + diff --git a/arch/xtensa/include/esp32/freertos/StackMacros.h b/arch/xtensa/include/esp32/freertos/StackMacros.h new file mode 100644 index 0000000000000..50d2e198fc279 --- /dev/null +++ b/arch/xtensa/include/esp32/freertos/StackMacros.h @@ -0,0 +1,184 @@ +/* + FreeRTOS V8.2.0 - Copyright (C) 2015 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 STACK_MACROS_H +#define STACK_MACROS_H + +/* + * Call the stack overflow hook function if the stack of the task being swapped + * out is currently overflowed, or looks like it might have overflowed in the + * past. + * + * Setting configCHECK_FOR_STACK_OVERFLOW to 1 will cause the macro to check + * the current stack state only - comparing the current top of stack value to + * the stack limit. Setting configCHECK_FOR_STACK_OVERFLOW to greater than 1 + * will also cause the last few stack bytes to be checked to ensure the value + * to which the bytes were set when the task was created have not been + * overwritten. Note this second test does not guarantee that an overflowed + * stack will always be recognised. + */ + +/*-----------------------------------------------------------*/ + +#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() + +#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() + +#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 ); \ + } \ + } + +#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 ); \ + } \ + } + +#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 ); \ + } \ + } + +#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ +/*-----------------------------------------------------------*/ + +#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 ); \ + } \ + } + +#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ +/*-----------------------------------------------------------*/ + +#endif /* STACK_MACROS_H */ + diff --git a/arch/xtensa/include/esp32/freertos/croutine.h b/arch/xtensa/include/esp32/freertos/croutine.h new file mode 100644 index 0000000000000..7dfd4b8c357d3 --- /dev/null +++ b/arch/xtensa/include/esp32/freertos/croutine.h @@ -0,0 +1,762 @@ +/* + FreeRTOS V8.2.0 - Copyright (C) 2015 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 CO_ROUTINE_H +#define CO_ROUTINE_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include croutine.h" +#endif + +#include "list.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* 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. */ +typedef void * CoRoutineHandle_t; + +/* Defines the prototype to which co-routine functions must conform. */ +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. */ + +/** + * croutine. h + *
+ BaseType_t xCoRoutineCreate(
+                                 crCOROUTINE_CODE pxCoRoutineCode,
+                                 UBaseType_t uxPriority,
+                                 UBaseType_t uxIndex
+                               );
+ * + * Create a new co-routine and add it to the list of co-routines that are + * ready to run. + * + * @param pxCoRoutineCode Pointer to the co-routine function. Co-routine + * functions require special syntax - see the co-routine section of the WEB + * documentation for more information. + * + * @param uxPriority The priority with respect to other co-routines at which + * the co-routine will run. + * + * @param uxIndex Used to distinguish between different co-routines that + * execute the same function. See the example below and the co-routine section + * of the WEB documentation for further information. + * + * @return pdPASS if the co-routine was successfully created and added to a ready + * 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 );
+     }
+ }
+   
+ * \defgroup xCoRoutineCreate xCoRoutineCreate + * \ingroup Tasks + */ +BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, UBaseType_t uxPriority, UBaseType_t uxIndex ); + + +/** + * croutine. h + *
+ void vCoRoutineSchedule( void );
+ * + * Run a co-routine. + * + * vCoRoutineSchedule() executes the highest priority co-routine that is able + * to run. The co-routine will execute until it either blocks, yields or is + * preempted by a task. Co-routines execute cooperatively so one + * co-routine cannot be preempted by another, but can be preempted by a task. + * + * If an application comprises of both tasks and co-routines then + * vCoRoutineSchedule should be called from the idle task (in an idle task + * 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();
+    }
+ }
+ 
+ * \defgroup vCoRoutineSchedule vCoRoutineSchedule + * \ingroup Tasks + */ +void vCoRoutineSchedule( void ); + +/** + * croutine. h + *
+ crSTART( CoRoutineHandle_t xHandle );
+ * + * 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();
+ }
+ * \defgroup crSTART crSTART + * \ingroup Tasks + */ +#define crSTART( pxCRCB ) switch( ( ( CRCB_t * )( pxCRCB ) )->uxState ) { case 0: + +/** + * croutine. h + *
+ crEND();
+ * + * 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();
+ }
+ * \defgroup crSTART crSTART + * \ingroup Tasks + */ +#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): + +/** + * croutine. h + *
+ crDELAY( CoRoutineHandle_t xHandle, TickType_t xTicksToDelay );
+ * + * Delay a co-routine for a fixed period of time. + * + * crDELAY can only be called from the co-routine function itself - not + * from within a function called by the co-routine function. This is because + * co-routines do not maintain their own stack. + * + * @param xHandle The handle of the co-routine to delay. This is the xHandle + * parameter of the co-routine function. + * + * @param xTickToDelay The number of ticks that the co-routine should delay + * for. The actual amount of time this equates to is defined by + * configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant portTICK_PERIOD_MS + * 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();
+ }
+ * \defgroup crDELAY crDELAY + * \ingroup Tasks + */ +#define crDELAY( xHandle, xTicksToDelay ) \ + if( ( xTicksToDelay ) > 0 ) \ + { \ + vCoRoutineAddToDelayedList( ( xTicksToDelay ), NULL ); \ + } \ + crSET_STATE0( ( xHandle ) ); + +/** + *
+ crQUEUE_SEND(
+                  CoRoutineHandle_t xHandle,
+                  QueueHandle_t pxQueue,
+                  void *pvItemToQueue,
+                  TickType_t xTicksToWait,
+                  BaseType_t *pxResult
+             )
+ * + * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine + * equivalent to the xQueueSend() and xQueueReceive() functions used by tasks. + * + * crQUEUE_SEND and crQUEUE_RECEIVE can only be used from a co-routine whereas + * xQueueSend() and xQueueReceive() can only be used from tasks. + * + * crQUEUE_SEND can only be called from the co-routine function itself - not + * from within a function called by the co-routine function. This is because + * co-routines do not maintain their own stack. + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xHandle The handle of the calling co-routine. This is the xHandle + * parameter of the co-routine function. + * + * @param pxQueue The handle of the queue on which the data will be posted. + * The handle is obtained as the return value when the queue is created using + * the xQueueCreate() API function. + * + * @param pvItemToQueue A pointer to the data being posted onto the queue. + * The number of bytes of each queued item is specified when the queue is + * created. This number of bytes is copied from pvItemToQueue into the queue + * itself. + * + * @param xTickToDelay The number of ticks that the co-routine should block + * to wait for space to become available on the queue, should space not be + * available immediately. The actual amount of time this equates to is defined + * by configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant + * portTICK_PERIOD_MS can be used to convert ticks to milliseconds (see example + * below). + * + * @param pxResult The variable pointed to by pxResult will be set to pdPASS if + * data was successfully posted onto the queue, otherwise it will be set to an + * 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();
+ }
+ * \defgroup crQUEUE_SEND crQUEUE_SEND + * \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; \ + } \ +} + +/** + * croutine. h + *
+  crQUEUE_RECEIVE(
+                     CoRoutineHandle_t xHandle,
+                     QueueHandle_t pxQueue,
+                     void *pvBuffer,
+                     TickType_t xTicksToWait,
+                     BaseType_t *pxResult
+                 )
+ * + * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine + * equivalent to the xQueueSend() and xQueueReceive() functions used by tasks. + * + * crQUEUE_SEND and crQUEUE_RECEIVE can only be used from a co-routine whereas + * xQueueSend() and xQueueReceive() can only be used from tasks. + * + * crQUEUE_RECEIVE can only be called from the co-routine function itself - not + * from within a function called by the co-routine function. This is because + * co-routines do not maintain their own stack. + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xHandle The handle of the calling co-routine. This is the xHandle + * parameter of the co-routine function. + * + * @param pxQueue The handle of the queue from which the data will be received. + * The handle is obtained as the return value when the queue is created using + * the xQueueCreate() API function. + * + * @param pvBuffer The buffer into which the received item is to be copied. + * The number of bytes of each queued item is specified when the queue is + * created. This number of bytes is copied into pvBuffer. + * + * @param xTickToDelay The number of ticks that the co-routine should block + * to wait for data to become available from the queue, should data not be + * available immediately. The actual amount of time this equates to is defined + * by configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant + * portTICK_PERIOD_MS can be used to convert ticks to milliseconds (see the + * crQUEUE_SEND example). + * + * @param pxResult The variable pointed to by pxResult will be set to pdPASS if + * data was successfully retrieved from the queue, otherwise it will be set to + * 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();
+ }
+ * \defgroup crQUEUE_RECEIVE crQUEUE_RECEIVE + * \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; \ + } \ +} + +/** + * croutine. h + *
+  crQUEUE_SEND_FROM_ISR(
+                            QueueHandle_t pxQueue,
+                            void *pvItemToQueue,
+                            BaseType_t xCoRoutinePreviouslyWoken
+                       )
+ * + * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the + * co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR() + * functions used by tasks. + * + * crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() can only be used to + * pass data between a co-routine and and ISR, whereas xQueueSendFromISR() and + * xQueueReceiveFromISR() can only be used to pass data between a task and and + * ISR. + * + * crQUEUE_SEND_FROM_ISR can only be called from an ISR to send data to a queue + * that is being used from within a co-routine. + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xCoRoutinePreviouslyWoken This is included so an ISR can post onto + * the same queue multiple times from a single interrupt. The first call + * should always pass in pdFALSE. Subsequent calls should pass in + * the value returned from the previous call. + * + * @return pdTRUE if a co-routine was woken by posting onto the queue. This is + * used by the ISR to determine if a context switch may be required following + * 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 );
+     }
+ }
+ * \defgroup crQUEUE_SEND_FROM_ISR crQUEUE_SEND_FROM_ISR + * \ingroup Tasks + */ +#define crQUEUE_SEND_FROM_ISR( pxQueue, pvItemToQueue, xCoRoutinePreviouslyWoken ) xQueueCRSendFromISR( ( pxQueue ), ( pvItemToQueue ), ( xCoRoutinePreviouslyWoken ) ) + + +/** + * croutine. h + *
+  crQUEUE_SEND_FROM_ISR(
+                            QueueHandle_t pxQueue,
+                            void *pvBuffer,
+                            BaseType_t * pxCoRoutineWoken
+                       )
+ * + * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the + * co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR() + * functions used by tasks. + * + * crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() can only be used to + * pass data between a co-routine and and ISR, whereas xQueueSendFromISR() and + * xQueueReceiveFromISR() can only be used to pass data between a task and and + * ISR. + * + * crQUEUE_RECEIVE_FROM_ISR can only be called from an ISR to receive data + * from a queue that is being used from within a co-routine (a co-routine + * posted to the queue). + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvBuffer A pointer to a buffer into which the received item will be + * placed. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from the queue into + * pvBuffer. + * + * @param pxCoRoutineWoken A co-routine may be blocked waiting for space to become + * available on the queue. If crQUEUE_RECEIVE_FROM_ISR causes such a + * co-routine to unblock *pxCoRoutineWoken will get set to pdTRUE, otherwise + * *pxCoRoutineWoken will remain unchanged. + * + * @return pdTRUE an item was successfully received from the queue, otherwise + * 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 );
+		 }
+     }
+ }
+ * \defgroup crQUEUE_RECEIVE_FROM_ISR crQUEUE_RECEIVE_FROM_ISR + * \ingroup Tasks + */ +#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. + * The macro nature of the co-routine implementation requires that the + * prototype appears here. The function should not be used by application + * writers. + * + * 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 ); + +/* + * This function is intended for internal use by the queue implementation only. + * The function should not be used by application writers. + * + * 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 ); + +#ifdef __cplusplus +} +#endif + +#endif /* CO_ROUTINE_H */ diff --git a/arch/xtensa/include/esp32/freertos/deprecated_definitions.h b/arch/xtensa/include/esp32/freertos/deprecated_definitions.h new file mode 100644 index 0000000000000..dc061f33f3cec --- /dev/null +++ b/arch/xtensa/include/esp32/freertos/deprecated_definitions.h @@ -0,0 +1,321 @@ +/* + FreeRTOS V8.2.0 - Copyright (C) 2015 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 DEPRECATED_DEFINITIONS_H +#define DEPRECATED_DEFINITIONS_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. 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 )(void); +#endif + +#ifdef OPEN_WATCOM_FLASH_LITE_186_PORT + #include "..\..\Source\portable\owatcom\16bitdos\flsh186\portmacro.h" + typedef void ( __interrupt __far *pxISR )(void); +#endif + +#ifdef GCC_MEGA_AVR + #include "../portable/GCC/ATMega323/portmacro.h" +#endif + +#ifdef IAR_MEGA_AVR + #include "../portable/IAR/ATMega323/portmacro.h" +#endif + +#ifdef MPLAB_PIC24_PORT + #include "../../Source/portable/MPLAB/PIC24_dsPIC/portmacro.h" +#endif + +#ifdef MPLAB_DSPIC_PORT + #include "../../Source/portable/MPLAB/PIC24_dsPIC/portmacro.h" +#endif + +#ifdef MPLAB_PIC18F_PORT + #include "../../Source/portable/MPLAB/PIC18F/portmacro.h" +#endif + +#ifdef MPLAB_PIC32MX_PORT + #include "../../Source/portable/MPLAB/PIC32MX/portmacro.h" +#endif + +#ifdef _FEDPICC + #include "libFreeRTOS/Include/portmacro.h" +#endif + +#ifdef SDCC_CYGNAL + #include "../../Source/portable/SDCC/Cygnal/portmacro.h" +#endif + +#ifdef GCC_ARM7 + #include "../../Source/portable/GCC/ARM7_LPC2000/portmacro.h" +#endif + +#ifdef GCC_ARM7_ECLIPSE + #include "portmacro.h" +#endif + +#ifdef ROWLEY_LPC23xx + #include "../../Source/portable/GCC/ARM7_LPC23xx/portmacro.h" +#endif + +#ifdef IAR_MSP430 + #include "..\..\Source\portable\IAR\MSP430\portmacro.h" +#endif + +#ifdef GCC_MSP430 + #include "../../Source/portable/GCC/MSP430F449/portmacro.h" +#endif + +#ifdef ROWLEY_MSP430 + #include "../../Source/portable/Rowley/MSP430F449/portmacro.h" +#endif + +#ifdef ARM7_LPC21xx_KEIL_RVDS + #include "..\..\Source\portable\RVDS\ARM7_LPC21xx\portmacro.h" +#endif + +#ifdef SAM7_GCC + #include "../../Source/portable/GCC/ARM7_AT91SAM7S/portmacro.h" +#endif + +#ifdef SAM7_IAR + #include "..\..\Source\portable\IAR\AtmelSAM7S64\portmacro.h" +#endif + +#ifdef SAM9XE_IAR + #include "..\..\Source\portable\IAR\AtmelSAM9XE\portmacro.h" +#endif + +#ifdef LPC2000_IAR + #include "..\..\Source\portable\IAR\LPC2000\portmacro.h" +#endif + +#ifdef STR71X_IAR + #include "..\..\Source\portable\IAR\STR71x\portmacro.h" +#endif + +#ifdef STR75X_IAR + #include "..\..\Source\portable\IAR\STR75x\portmacro.h" +#endif + +#ifdef STR75X_GCC + #include "..\..\Source\portable\GCC\STR75x\portmacro.h" +#endif + +#ifdef STR91X_IAR + #include "..\..\Source\portable\IAR\STR91x\portmacro.h" +#endif + +#ifdef GCC_H8S + #include "../../Source/portable/GCC/H8S2329/portmacro.h" +#endif + +#ifdef GCC_AT91FR40008 + #include "../../Source/portable/GCC/ARM7_AT91FR40008/portmacro.h" +#endif + +#ifdef RVDS_ARMCM3_LM3S102 + #include "../../Source/portable/RVDS/ARM_CM3/portmacro.h" +#endif + +#ifdef GCC_ARMCM3_LM3S102 + #include "../../Source/portable/GCC/ARM_CM3/portmacro.h" +#endif + +#ifdef GCC_ARMCM3 + #include "../../Source/portable/GCC/ARM_CM3/portmacro.h" +#endif + +#ifdef IAR_ARM_CM3 + #include "../../Source/portable/IAR/ARM_CM3/portmacro.h" +#endif + +#ifdef IAR_ARMCM3_LM + #include "../../Source/portable/IAR/ARM_CM3/portmacro.h" +#endif + +#ifdef HCS12_CODE_WARRIOR + #include "../../Source/portable/CodeWarrior/HCS12/portmacro.h" +#endif + +#ifdef MICROBLAZE_GCC + #include "../../Source/portable/GCC/MicroBlaze/portmacro.h" +#endif + +#ifdef TERN_EE + #include "..\..\Source\portable\Paradigm\Tern_EE\small\portmacro.h" +#endif + +#ifdef GCC_HCS12 + #include "../../Source/portable/GCC/HCS12/portmacro.h" +#endif + +#ifdef GCC_MCF5235 + #include "../../Source/portable/GCC/MCF5235/portmacro.h" +#endif + +#ifdef COLDFIRE_V2_GCC + #include "../../../Source/portable/GCC/ColdFire_V2/portmacro.h" +#endif + +#ifdef COLDFIRE_V2_CODEWARRIOR + #include "../../Source/portable/CodeWarrior/ColdFire_V2/portmacro.h" +#endif + +#ifdef GCC_PPC405 + #include "../../Source/portable/GCC/PPC405_Xilinx/portmacro.h" +#endif + +#ifdef GCC_PPC440 + #include "../../Source/portable/GCC/PPC440_Xilinx/portmacro.h" +#endif + +#ifdef _16FX_SOFTUNE + #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 )(void); +#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 )(void); +#endif + +#ifdef __GNUC__ + #ifdef __AVR32_AVR32A__ + #include "portmacro.h" + #endif +#endif + +#ifdef __ICCAVR32__ + #ifdef __CORE__ + #if __CORE__ == __AVR32A__ + #include "portmacro.h" + #endif + #endif +#endif + +#ifdef __91467D + #include "portmacro.h" +#endif + +#ifdef __96340 + #include "portmacro.h" +#endif + + +#ifdef __IAR_V850ES_Fx3__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_V850ES_Jx3__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_V850ES_Jx3_L__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_V850ES_Jx2__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_V850ES_Hx2__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_78K0R_Kx3__ + #include "../../Source/portable/IAR/78K0R/portmacro.h" +#endif + +#ifdef __IAR_78K0R_Kx3L__ + #include "../../Source/portable/IAR/78K0R/portmacro.h" +#endif + +#endif /* DEPRECATED_DEFINITIONS_H */ + diff --git a/arch/xtensa/include/esp32/freertos/event_groups.h b/arch/xtensa/include/esp32/freertos/event_groups.h new file mode 100644 index 0000000000000..eda2456388d66 --- /dev/null +++ b/arch/xtensa/include/esp32/freertos/event_groups.h @@ -0,0 +1,726 @@ +/* + FreeRTOS V8.2.0 - Copyright (C) 2015 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 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" +#endif + +#include "timers.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * An event group is a collection of bits to which an application can assign a + * meaning. For example, an application may create an event group to convey + * the status of various CAN bus related events in which bit 0 might mean "A CAN + * message has been received and is ready for processing", bit 1 might mean "The + * application has queued a message that is ready for sending onto the CAN + * network", and bit 2 might mean "It is time to send a SYNC message onto the + * CAN network" etc. A task can then test the bit values to see which events + * are active, and optionally enter the Blocked state to wait for a specified + * bit or a group of specified bits to be active. To continue the CAN bus + * example, a CAN controlling task can enter the Blocked state (and therefore + * not consume any processing time) until either bit 0, bit 1 or bit 2 are + * active, at which time the bit that was actually active would inform the task + * which action it had to take (process a received message, send a message, or + * send a SYNC). + * + * The event groups implementation contains intelligence to avoid race + * conditions that would otherwise occur were an application to use a simple + * variable for the same purpose. This is particularly important with respect + * to when a bit within an event group is to be cleared, and when bits have to + * be set and then tested atomically - as is the case where event groups are + * used to create a synchronisation point between multiple tasks (a + * 'rendezvous'). + * + */ + + + +/** + * event_groups.h + * + * Type by which event groups are referenced. For example, a call to + * xEventGroupCreate() returns an EventGroupHandle_t variable that can then + * be used as a parameter to other event group functions. + * + * \ingroup EventGroup + */ +typedef void * EventGroupHandle_t; + +/* + * The type that holds event bits always matches TickType_t - therefore the + * number of bits it holds is set by configUSE_16_BIT_TICKS (16 bits if set to 1, + * 32 bits if set to 0. + * + * \ingroup EventGroup + */ +typedef TickType_t EventBits_t; + +/** + * 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 + * using xEventGropuCreateStatic() 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. + * + * Although event groups are not related to ticks, for internal implementation + * reasons the number of bits available for use in an event group is dependent + * on the configUSE_16_BIT_TICKS setting in FreeRTOSConfig.h. If + * configUSE_16_BIT_TICKS is 1 then each event group contains 8 usable bits (bit + * 0 to bit 7). If configUSE_16_BIT_TICKS is set to 0 then each event group has + * 24 usable bits (bit 0 to bit 23). The EventBits_t type is used to store + * event bits within an event group. + * + * @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 + * + * Example usage: + * @code{c} + * // Declare a variable to hold the created event group. + * EventGroupHandle_t xCreatedEventGroup; + * + * // 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. + * } + * @endcode + * \ingroup EventGroup + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + EventGroupHandle_t xEventGroupCreate( void ) PRIVILEGED_FUNCTION; +#endif + +/** + * 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 xEventGropuCreate() 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 + * 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. + * + * Although event groups are not related to ticks, for internal implementation + * reasons the number of bits available for use in an event group is dependent + * on the configUSE_16_BIT_TICKS setting in FreeRTOSConfig.h. If + * configUSE_16_BIT_TICKS is 1 then each event group contains 8 usable bits (bit + * 0 to bit 7). If configUSE_16_BIT_TICKS is set to 0 then each event group has + * 24 usable bits (bit 0 to bit 23). The EventBits_t type is used to store + * event bits within an event group. + * + * @param pxEventGroupBuffer pxEventGroupBuffer must point to a variable of type + * StaticEventGroup_t, which will be then be used to hold the event group's data + * structures, removing the need for the memory to be allocated dynamically. + * + * @return If the event group was created then a handle to the event group is + * returned. If pxEventGroupBuffer was NULL then NULL is returned. + * + * 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; + * + * // 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; +#endif + +/** + * [Potentially] block to wait for one or more bits to be set within a + * previously created event group. + * + * This function cannot be called from an interrupt. + * + * @param xEventGroup The event group in which the bits are being tested. The + * event group must have previously been created using a call to + * xEventGroupCreate(). + * + * @param uxBitsToWaitFor A bitwise value that indicates the bit or bits to test + * inside the event group. For example, to wait for bit 0 and/or bit 2 set + * uxBitsToWaitFor to 0x05. To wait for bits 0 and/or bit 1 and/or bit 2 set + * uxBitsToWaitFor to 0x07. Etc. + * + * @param xClearOnExit If xClearOnExit is set to pdTRUE then any bits within + * uxBitsToWaitFor that are set within the event group will be cleared before + * xEventGroupWaitBits() returns if the wait condition was met (if the function + * returns for a reason other than a timeout). If xClearOnExit is set to + * pdFALSE then the bits set in the event group are not altered when the call to + * xEventGroupWaitBits() returns. + * + * @param xWaitForAllBits If xWaitForAllBits is set to pdTRUE then + * xEventGroupWaitBits() will return when either all the bits in uxBitsToWaitFor + * are set or the specified block time expires. If xWaitForAllBits is set to + * pdFALSE then xEventGroupWaitBits() will return when any one of the bits set + * in uxBitsToWaitFor is set or the specified block time expires. The block + * time is specified by the xTicksToWait parameter. + * + * @param xTicksToWait The maximum amount of time (specified in 'ticks') to wait + * for one/all (depending on the xWaitForAllBits value) of the bits specified by + * uxBitsToWaitFor to become set. + * + * @return The value of the event group at the time either the bits being waited + * for became set, or the block time expired. Test the return value to know + * which bits were set. If xEventGroupWaitBits() returned because its timeout + * expired then not all the bits being waited for will be set. If + * xEventGroupWaitBits() returned because the bits it was waiting for were set + * then the returned value is the event group value before any bits were + * automatically cleared in the case that xClearOnExit parameter was set to + * pdTRUE. + * + * Example usage: + * @code{c} + * #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; + * + * // 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} + * \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; + +/** + * Clear bits within an event group. This function cannot be called from an + * interrupt. + * + * @param xEventGroup The event group in which the bits are to be cleared. + * + * @param uxBitsToClear A bitwise value that indicates the bit or bits to clear + * in the event group. For example, to clear bit 3 only, set uxBitsToClear to + * 0x08. To clear bit 3 and bit 0 set uxBitsToClear to 0x09. + * + * @return The value of the event group before the specified bits were cleared. + * + * Example usage: + * @code{c} + * #define BIT_0 ( 1 << 0 ) + * #define BIT_4 ( 1 << 4 ) + * + * 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. + * + * 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 + * \ingroup EventGroup + */ +EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION; + +/** + * A version of xEventGroupClearBits() that can be called from an interrupt. + * + * Setting bits in an event group is not a deterministic operation because there + * are an unknown number of tasks that may be waiting for the bit or bits being + * set. FreeRTOS does not allow nondeterministic operations to be performed + * while interrupts are disabled, so protects event groups that are accessed + * from tasks by suspending the scheduler rather than disabling interrupts. As + * a result event groups cannot be accessed directly from an interrupt service + * routine. Therefore xEventGroupClearBitsFromISR() sends a message to the + * timer task to have the clear operation performed in the context of the timer + * task. + * + * @param xEventGroup The event group in which the bits are to be cleared. + * + * @param uxBitsToClear A bitwise value that indicates the bit or bits to clear. + * For example, to clear bit 3 only, set uxBitsToClear to 0x08. To clear bit 3 + * and bit 0 set uxBitsToClear to 0x09. + * + * @return If the request to execute the function was posted successfully then + * pdPASS is returned, otherwise pdFALSE is returned. pdFALSE will be returned + * if the timer service queue was full. + * + * Example usage: + * @code{c} + * #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; + * + * 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. + * } + * } + * @endcode + * \ingroup EventGroup + */ +#if( configUSE_TRACE_FACILITY == 1 ) + BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ); +#else + #define xEventGroupClearBitsFromISR( xEventGroup, uxBitsToClear ) xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL ) +#endif + +/** + * Set bits within an event group. + * This function cannot be called from an interrupt. xEventGroupSetBitsFromISR() + * is a version that can be called from an interrupt. + * + * Setting bits in an event group will automatically unblock tasks that are + * blocked waiting for the bits. + * + * @param xEventGroup The event group in which the bits are to be set. + * + * @param uxBitsToSet A bitwise value that indicates the bit or bits to set. + * For example, to set bit 3 only, set uxBitsToSet to 0x08. To set bit 3 + * and bit 0 set uxBitsToSet to 0x09. + * + * @return The value of the event group at the time the call to + * xEventGroupSetBits() returns. There are two reasons why the returned value + * might have the bits specified by the uxBitsToSet parameter cleared. First, + * if setting a bit results in a task that was waiting for the bit leaving the + * blocked state then it is possible the bit will be cleared automatically + * (see the xClearBitOnExit parameter of xEventGroupWaitBits()). Second, any + * unblocked (or otherwise Ready state) task that has a priority above that of + * the task that called xEventGroupSetBits() will execute and may change the + * event group value before the call to xEventGroupSetBits() returns. + * + * Example usage: + * @code{c} + * #define BIT_0 ( 1 << 0 ) + * #define BIT_4 ( 1 << 4 ) + * + * 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. + * + * 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} + * \ingroup EventGroup + */ +EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) PRIVILEGED_FUNCTION; + +/** + * A version of xEventGroupSetBits() that can be called from an interrupt. + * + * Setting bits in an event group is not a deterministic operation because there + * are an unknown number of tasks that may be waiting for the bit or bits being + * set. FreeRTOS does not allow nondeterministic operations to be performed in + * interrupts or from critical sections. Therefore xEventGroupSetBitFromISR() + * sends a message to the timer task to have the set operation performed in the + * context of the timer task - where a scheduler lock is used in place of a + * critical section. + * + * @param xEventGroup The event group in which the bits are to be set. + * + * @param uxBitsToSet A bitwise value that indicates the bit or bits to set. + * For example, to set bit 3 only, set uxBitsToSet to 0x08. To set bit 3 + * and bit 0 set uxBitsToSet to 0x09. + * + * @param pxHigherPriorityTaskWoken As mentioned above, calling this function + * will result in a message being sent to the timer daemon task. If the + * priority of the timer daemon task is higher than the priority of the + * currently running task (the task the interrupt interrupted) then + * *pxHigherPriorityTaskWoken will be set to pdTRUE by + * xEventGroupSetBitsFromISR(), indicating that a context switch should be + * requested before the interrupt exits. For that reason + * *pxHigherPriorityTaskWoken must be initialised to pdFALSE. See the + * example code below. + * + * @return If the request to execute the function was posted successfully then + * pdPASS is returned, otherwise pdFALSE is returned. pdFALSE will be returned + * if the timer service queue was full. + * + * Example usage: + * @code{c} + * #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; + * + * void anInterruptHandler( void ) + * { + * BaseType_t xHigherPriorityTaskWoken, xResult; + * + * // 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 ); + * + * // 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 + * \ingroup EventGroup + */ +#if( configUSE_TRACE_FACILITY == 1 ) + BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken ); +#else + #define xEventGroupSetBitsFromISR( xEventGroup, uxBitsToSet, pxHigherPriorityTaskWoken ) xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken ) +#endif + +/** + * 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 + * used to synchronise multiple tasks, where each task has to wait for the other + * tasks to reach a synchronisation point before proceeding. + * + * This function cannot be used from an interrupt. + * + * The function will return before its block time expires if the bits specified + * by the uxBitsToWait parameter are set, or become set within that time. In + * this case all the bits specified by uxBitsToWait will be automatically + * cleared before the function returns. + * + * @param xEventGroup The event group in which the bits are being tested. The + * event group must have previously been created using a call to + * xEventGroupCreate(). + * + * @param uxBitsToSet The bits to set in the event group before determining + * if, and possibly waiting for, all the bits specified by the uxBitsToWait + * parameter are set. + * + * @param uxBitsToWaitFor A bitwise value that indicates the bit or bits to test + * inside the event group. For example, to wait for bit 0 and bit 2 set + * uxBitsToWaitFor to 0x05. To wait for bits 0 and bit 1 and bit 2 set + * uxBitsToWaitFor to 0x07. Etc. + * + * @param xTicksToWait The maximum amount of time (specified in 'ticks') to wait + * for all of the bits specified by uxBitsToWaitFor to become set. + * + * @return The value of the event group at the time either the bits being waited + * for became set, or the block time expired. Test the return value to know + * which bits were set. If xEventGroupSync() returned because its timeout + * expired then not all the bits being waited for will be set. If + * xEventGroupSync() returned because all the bits it was waiting for were + * set then the returned value is the event group value before any bits were + * automatically cleared. + * + * 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 ) + * + * #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; + * + * void vTask0( void *pvParameters ) + * { + * EventBits_t uxReturn; + * TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS; + * + * 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 ); + * + * 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. + * + * // 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. + * } + * } + * + * @endcode + * \ingroup EventGroup + */ +EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + + +/** + * Returns the current value of the bits in an event group. This function + * cannot be used from an interrupt. + * + * @param xEventGroup The event group being queried. + * + * @return The event group bits at the time xEventGroupGetBits() was called. + * + * \ingroup EventGroup + */ +#define xEventGroupGetBits( xEventGroup ) xEventGroupClearBits( xEventGroup, 0 ) + +/** + * A version of xEventGroupGetBits() that can be called from an ISR. + * + * @param xEventGroup The event group being queried. + * + * @return The event group bits at the time xEventGroupGetBitsFromISR() was called. + * + * \ingroup EventGroup + */ +EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ); + +/** + * + * 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. + * + * @param xEventGroup The event group being deleted. + */ +void vEventGroupDelete( EventGroupHandle_t xEventGroup ); + +/** @cond */ + +/* For internal use only. */ +void vEventGroupSetBitsCallback( void *pvEventGroup, const uint32_t ulBitsToSet ); +void vEventGroupClearBitsCallback( void *pvEventGroup, const uint32_t ulBitsToClear ); + +#if (configUSE_TRACE_FACILITY == 1) + UBaseType_t uxEventGroupGetNumber( void* xEventGroup ); +#endif + +/** @endcond */ + +#ifdef __cplusplus +} +#endif + +#endif /* EVENT_GROUPS_H */ + + diff --git a/arch/xtensa/include/esp32/freertos/list.h b/arch/xtensa/include/esp32/freertos/list.h new file mode 100644 index 0000000000000..8606deba5aef1 --- /dev/null +++ b/arch/xtensa/include/esp32/freertos/list.h @@ -0,0 +1,466 @@ +/* + FreeRTOS V8.2.0 - Copyright (C) 2015 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! +*/ + +/* + * This is the list implementation used by the scheduler. While it is tailored + * heavily for the schedulers needs, it is also available for use by + * application code. + * + * list_ts can only store pointers to list_item_ts. Each ListItem_t contains a + * numeric value (xItemValue). Most of the time the lists are sorted in + * descending item value order. + * + * Lists are created already containing one list item. The value of this + * item is the maximum possible that can be stored, it is therefore always at + * the end of the list and acts as a marker. The list member pxHead always + * points to this marker - even though it is at the tail of the list. This + * is because the tail contains a wrap back pointer to the true head of + * the list. + * + * In addition to it's value, each list item contains a pointer to the next + * item in the list (pxNext), a pointer to the list it is in (pxContainer) + * and a pointer to back to the object that contains it. These later two + * pointers are included for efficiency of list manipulation. There is + * effectively a two way link between the object containing the list item and + * the list item itself. + * + * + * \page ListIntroduction List Implementation + * \ingroup FreeRTOSIntro + */ + +#ifndef INC_FREERTOS_H + #error FreeRTOS.h must be included before list.h +#endif + +#ifndef LIST_H +#define LIST_H + +/* + * The list structure members are modified from within interrupts, and therefore + * by rights should be declared volatile. However, they are only modified in a + * functionally atomic way (within critical sections of with the scheduler + * suspended) and are either passed by reference into a function or indexed via + * a volatile variable. Therefore, in all use cases tested so far, the volatile + * qualifier can be omitted in order to provide a moderate performance + * improvement without adversely affecting functional behaviour. The assembly + * instructions generated by the IAR, ARM and GCC compilers when the respective + * compiler's options were set for maximum optimisation has been inspected and + * deemed to be as intended. That said, as compiler technology advances, and + * especially if aggressive cross module optimisation is used (a use case that + * has not been exercised to any great extend) then it is feasible that the + * volatile qualifier will be needed for correct optimisation. It is expected + * that a compiler removing essential code because, without the volatile + * qualifier on the list structure members and with aggressive cross module + * optimisation, the compiler deemed the code unnecessary will result in + * complete and obvious failure of the scheduler. If this is ever experienced + * then the volatile qualifier can be inserted in the relevant places within the + * list structures by simply defining configLIST_VOLATILE to volatile in + * FreeRTOSConfig.h (as per the example at the bottom of this comment block). + * If configLIST_VOLATILE is not defined then the preprocessor directives below + * will simply #define configLIST_VOLATILE away completely. + * + * To use volatile list structure members then add the following line to + * FreeRTOSConfig.h (without the quotes): + * "#define configLIST_VOLATILE volatile" + */ +#ifndef configLIST_VOLATILE + #define configLIST_VOLATILE +#endif /* configSUPPORT_CROSS_MODULE_OPTIMISATION */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* 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; + + /* 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 ) ) +#endif /* configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES */ + + +/* + * Definition of the only type of object that a list can contain. + */ +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. */ + void * configLIST_VOLATILE pvContainer; /*< 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. */ + +#if __GNUC_PREREQ(4, 6) +_Static_assert(sizeof(StaticListItem_t) == sizeof(ListItem_t), "StaticListItem_t != ListItem_t"); +#endif + +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; +}; +typedef struct xMINI_LIST_ITEM MiniListItem_t; + +#if __GNUC_PREREQ(4, 6) +_Static_assert(sizeof(StaticMiniListItem_t) == sizeof(MiniListItem_t), "StaticMiniListItem_t != MiniListItem_t"); +#endif + + +/* + * Definition of the type of queue used by the scheduler. + */ +typedef struct xLIST +{ + listFIRST_LIST_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + configLIST_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; + +#if __GNUC_PREREQ(4, 6) +_Static_assert(sizeof(StaticList_t) == sizeof(List_t), "StaticList_t != List_t"); +#endif + +/* + * Access macro to set the owner of a list item. The owner of a list item + * is the object (usually a TCB) that contains the list item. + * + * \page listSET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER + * \ingroup LinkedList + */ +#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 + * is the object (usually a TCB) that contains the list item. + * + * \page listSET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER + * \ingroup LinkedList + */ +#define listGET_LIST_ITEM_OWNER( pxListItem ) ( ( pxListItem )->pvOwner ) + +/* + * Access macro to set the value of the list item. In most cases the value is + * used to sort the list in descending order. + * + * \page listSET_LIST_ITEM_VALUE listSET_LIST_ITEM_VALUE + * \ingroup LinkedList + */ +#define listSET_LIST_ITEM_VALUE( pxListItem, xValue ) ( ( pxListItem )->xItemValue = ( xValue ) ) + +/* + * Access macro to retrieve the value of the list item. The value can + * represent anything - for example the priority of a task, or the time at + * which a task should be unblocked. + * + * \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE + * \ingroup LinkedList + */ +#define listGET_LIST_ITEM_VALUE( pxListItem ) ( ( pxListItem )->xItemValue ) + +/* + * Access macro to retrieve the value of the list item at the head of a given + * list. + * + * \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE + * \ingroup LinkedList + */ +#define listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxList ) ( ( ( pxList )->xListEnd ).pxNext->xItemValue ) + +/* + * Return the list item at the head of the list. + * + * \page listGET_HEAD_ENTRY listGET_HEAD_ENTRY + * \ingroup LinkedList + */ +#define listGET_HEAD_ENTRY( pxList ) ( ( ( pxList )->xListEnd ).pxNext ) + +/* + * Return the list item at the head of the list. + * + * \page listGET_NEXT listGET_NEXT + * \ingroup LinkedList + */ +#define listGET_NEXT( pxListItem ) ( ( pxListItem )->pxNext ) + +/* + * Return the list item that marks the end of the list + * + * \page listGET_END_MARKER listGET_END_MARKER + * \ingroup LinkedList + */ +#define listGET_END_MARKER( pxList ) ( ( ListItem_t const * ) ( &( ( pxList )->xListEnd ) ) ) + +/* + * Access macro to determine if a list contains any items. The macro will + * only have the value true if the list is empty. + * + * \page listLIST_IS_EMPTY listLIST_IS_EMPTY + * \ingroup LinkedList + */ +#define listLIST_IS_EMPTY( pxList ) ( ( BaseType_t ) ( ( pxList )->uxNumberOfItems == ( UBaseType_t ) 0 ) ) + +/* + * Access macro to return the number of items in the list. + */ +#define listCURRENT_LIST_LENGTH( pxList ) ( ( pxList )->uxNumberOfItems ) + +/* + * Access function to obtain the owner of the next entry in a list. + * + * The list member pxIndex is used to walk through a list. Calling + * listGET_OWNER_OF_NEXT_ENTRY increments pxIndex to the next item in the list + * and returns that entry's pxOwner parameter. Using multiple calls to this + * function it is therefore possible to move through every item contained in + * a list. + * + * The pxOwner parameter of a list item is a pointer to the object that owns + * the list item. In the scheduler this is normally a task control block. + * The pxOwner parameter effectively creates a two way link between the list + * item and its owner. + * + * @param pxTCB pxTCB is set to the address of the owner of the next list item. + * @param pxList The list from which the next item owner is to be returned. + * + * \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; \ +} + + +/* + * Access function to obtain the owner of the first entry in a list. Lists + * are normally sorted in ascending item value order. + * + * This function returns the pxOwner member of the first item in the list. + * The pxOwner parameter of a list item is a pointer to the object that owns + * the list item. In the scheduler this is normally a task control block. + * The pxOwner parameter effectively creates a two way link between the list + * item and its owner. + * + * @param pxList The list from which the owner of the head item is to be + * returned. + * + * \page listGET_OWNER_OF_HEAD_ENTRY listGET_OWNER_OF_HEAD_ENTRY + * \ingroup LinkedList + */ +#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 + * "container" pointer that points to the list it is in. All this macro does + * is check to see if the container and the list match. + * + * @param pxList The list we want to know if the list item is within. + * @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 ) ( ( BaseType_t ) ( ( pxListItem )->pvContainer == ( void * ) ( pxList ) ) ) + +/* + * Return the list a list item is contained within (referenced from). + * + * @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 )->pvContainer ) + +/* + * 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 ) + +/* + * Must be called before a list is used! This initialises all the members + * of the list structure and inserts the xListEnd item into the list as a + * marker to the back of the list. + * + * @param pxList Pointer to the list being initialised. + * + * \page vListInitialise vListInitialise + * \ingroup LinkedList + */ +void vListInitialise( List_t * const pxList ); + +/* + * Must be called before a list item is used. This sets the list container to + * null so the item does not think that it is already contained in a list. + * + * @param pxItem Pointer to the list item being initialised. + * + * \page vListInitialiseItem vListInitialiseItem + * \ingroup LinkedList + */ +void vListInitialiseItem( ListItem_t * const pxItem ); + +/* + * Insert a list item into a list. The item will be inserted into the list in + * a position determined by its item value (descending item value order). + * + * @param pxList The list into which the item is to be inserted. + * + * @param pxNewListItem The item that is to be placed in the list. + * + * \page vListInsert vListInsert + * \ingroup LinkedList + */ +void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem ); + +/* + * Insert a list item into a list. The item will be inserted in a position + * such that it will be the last item within the list returned by multiple + * calls to listGET_OWNER_OF_NEXT_ENTRY. + * + * The list member pvIndex is used to walk through a list. Calling + * listGET_OWNER_OF_NEXT_ENTRY increments pvIndex to the next item in the list. + * Placing an item in a list using vListInsertEnd effectively places the item + * in the list position pointed to by pvIndex. This means that every other + * item within the list will be returned by listGET_OWNER_OF_NEXT_ENTRY before + * the pvIndex parameter again points to the item being inserted. + * + * @param pxList The list into which the item is to be inserted. + * + * @param pxNewListItem The list item to be inserted into the list. + * + * \page vListInsertEnd vListInsertEnd + * \ingroup LinkedList + */ +void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem ); + +/* + * Remove an item from a list. The list item has a pointer to the list that + * it is in, so only the list item need be passed into the function. + * + * @param uxListRemove The item to be removed. The item will remove itself from + * the list pointed to by it's pxContainer parameter. + * + * @return The number of items that remain in the list after the list item has + * been removed. + * + * \page uxListRemove uxListRemove + * \ingroup LinkedList + */ +UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/arch/xtensa/include/esp32/freertos/mpu_wrappers.h b/arch/xtensa/include/esp32/freertos/mpu_wrappers.h new file mode 100644 index 0000000000000..504f6d934da3b --- /dev/null +++ b/arch/xtensa/include/esp32/freertos/mpu_wrappers.h @@ -0,0 +1,157 @@ +/* + FreeRTOS V8.2.0 - Copyright (C) 2015 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 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. */ +#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 + + #define xTaskGenericCreate MPU_xTaskGenericCreate + #define vTaskAllocateMPURegions MPU_vTaskAllocateMPURegions + #define vTaskDelete MPU_vTaskDelete + #define vTaskDelayUntil MPU_vTaskDelayUntil + #define vTaskDelay MPU_vTaskDelay + #define uxTaskPriorityGet MPU_uxTaskPriorityGet + #define vTaskPrioritySet MPU_vTaskPrioritySet + #define eTaskGetState MPU_eTaskGetState + #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 vTaskList MPU_vTaskList + #define vTaskGetRunTimeStats MPU_vTaskGetRunTimeStats + #define vTaskSetApplicationTaskTag MPU_vTaskSetApplicationTaskTag + #define xTaskGetApplicationTaskTag MPU_xTaskGetApplicationTaskTag + #define xTaskCallApplicationTaskHook MPU_xTaskCallApplicationTaskHook + #define uxTaskGetStackHighWaterMark MPU_uxTaskGetStackHighWaterMark + #define xTaskGetCurrentTaskHandle MPU_xTaskGetCurrentTaskHandle + #define xTaskGetSchedulerState MPU_xTaskGetSchedulerState + #define xTaskGetIdleTaskHandle MPU_xTaskGetIdleTaskHandle + #define uxTaskGetSystemState MPU_uxTaskGetSystemState + + #define xQueueGenericCreate MPU_xQueueGenericCreate + #define xQueueCreateMutex MPU_xQueueCreateMutex + #define xQueueGiveMutexRecursive MPU_xQueueGiveMutexRecursive + #define xQueueTakeMutexRecursive MPU_xQueueTakeMutexRecursive + #define xQueueCreateCountingSemaphore MPU_xQueueCreateCountingSemaphore + #define xQueueGenericSend MPU_xQueueGenericSend + #define xQueueAltGenericSend MPU_xQueueAltGenericSend + #define xQueueAltGenericReceive MPU_xQueueAltGenericReceive + #define xQueueGenericReceive MPU_xQueueGenericReceive + #define uxQueueMessagesWaiting MPU_uxQueueMessagesWaiting + #define vQueueDelete MPU_vQueueDelete + #define xQueueGenericReset MPU_xQueueGenericReset + #define xQueueCreateSet MPU_xQueueCreateSet + #define xQueueSelectFromSet MPU_xQueueSelectFromSet + #define xQueueAddToSet MPU_xQueueAddToSet + #define xQueueRemoveFromSet MPU_xQueueRemoveFromSet + #define xQueuePeekFromISR MPU_xQueuePeekFromISR + #define xQueueGetMutexHolder MPU_xQueueGetMutexHolder + + #define pvPortMalloc MPU_pvPortMalloc + #define vPortFree MPU_vPortFree + #define xPortGetFreeHeapSize MPU_xPortGetFreeHeapSize + #define vPortInitialiseBlocks MPU_vPortInitialiseBlocks + + #if configQUEUE_REGISTRY_SIZE > 0 + #define vQueueAddToRegistry MPU_vQueueAddToRegistry + #define vQueueUnregisterQueue MPU_vQueueUnregisterQueue + #endif + + /* Remove the privileged function macro. */ + #define PRIVILEGED_FUNCTION + + #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"))) + + #endif /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */ + +#else /* portUSING_MPU_WRAPPERS */ + + #define PRIVILEGED_FUNCTION + #define PRIVILEGED_DATA + #define portUSING_MPU_WRAPPERS 0 + +#endif /* portUSING_MPU_WRAPPERS */ + + +#endif /* MPU_WRAPPERS_H */ + diff --git a/arch/xtensa/include/esp32/freertos/portable.h b/arch/xtensa/include/esp32/freertos/portable.h new file mode 100644 index 0000000000000..311fd1ea907a6 --- /dev/null +++ b/arch/xtensa/include/esp32/freertos/portable.h @@ -0,0 +1,245 @@ +/* + FreeRTOS V8.2.0 - Copyright (C) 2015 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! +*/ + +/*----------------------------------------------------------- + * Portable layer API. Each function must be defined for each port. + *----------------------------------------------------------*/ + +#ifndef PORTABLE_H +#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. */ +#include "deprecated_definitions.h" + +#include "../soc/esp32/include/soc/cpu.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. */ +#ifndef portENTER_CRITICAL + #include "portmacro.h" +#endif + +#if portBYTE_ALIGNMENT == 8 + #define portBYTE_ALIGNMENT_MASK ( 0x0007U ) +#endif + +#if portBYTE_ALIGNMENT == 4 + #define portBYTE_ALIGNMENT_MASK ( 0x0003 ) +#endif + +#if portBYTE_ALIGNMENT == 2 + #define portBYTE_ALIGNMENT_MASK ( 0x0001 ) +#endif + +#if portBYTE_ALIGNMENT == 1 + #define portBYTE_ALIGNMENT_MASK ( 0x0000 ) +#endif + +#ifndef portBYTE_ALIGNMENT_MASK + #error "Invalid portBYTE_ALIGNMENT definition" +#endif + +#ifndef portNUM_CONFIGURABLE_REGIONS + #define portNUM_CONFIGURABLE_REGIONS 1 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mpu_wrappers.h" +#include "../esp_common/esp_system.h" + +/* + * Setup the stack of a new task so it is ready to be placed under the + * scheduler control. The registers have to be placed on the stack in + * the order that the port expects to find them. + * + */ +#if( portUSING_MPU_WRAPPERS == 1 ) + StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION; +#else + StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) PRIVILEGED_FUNCTION; +#endif + +/* + * Map to the memory management routines required for the port. + * + * Note that libc standard malloc/free are also available for + * non-FreeRTOS-specific code, and behave the same as + * pvPortMalloc()/vPortFree(). + */ +#define pvPortMalloc malloc +#define vPortFree free +#define xPortGetFreeHeapSize esp_get_free_heap_size +#define xPortGetMinimumEverFreeHeapSize esp_get_minimum_free_heap_size + +/* + * Setup the hardware ready for the scheduler to take control. This generally + * sets up a tick interrupt and sets timers for the correct tick frequency. + */ +BaseType_t xPortStartScheduler( void ) PRIVILEGED_FUNCTION; + +/* + * Undo any hardware/ISR setup that was performed by xPortStartScheduler() so + * the hardware is left in its original condition after the scheduler stops + * executing. + */ +void vPortEndScheduler( void ) PRIVILEGED_FUNCTION; + + +/* + * Send an interrupt to another core in order to make the task running + * on it yield for a higher-priority task. + */ + +void vPortYieldOtherCore( BaseType_t coreid) PRIVILEGED_FUNCTION; + + +/* + Callback to set a watchpoint on the end of the stack. Called every context switch to change the stack + watchpoint around. + */ +void vPortSetStackWatchpoint( void* pxStackStart ); + +/* + * Returns true if the current core is in ISR context; low prio ISR, med prio ISR or timer tick ISR. High prio ISRs + * aren't detected here, but they normally cannot call C code, so that should not be an issue anyway. + */ +BaseType_t xPortInIsrContext(void); + +/* + * This function will be called in High prio ISRs. Returns true if the current core was in ISR context + * before calling into high prio ISR context. + */ +BaseType_t xPortInterruptedFromISRContext(void); + +/* + * The structures and methods of manipulating the MPU are contained within the + * port layer. + * + * Fills the xMPUSettings structure with the memory region information + * contained in xRegions. + */ +#if( portUSING_MPU_WRAPPERS == 1 ) + struct xMEMORY_REGION; + void vPortStoreTaskMPUSettings( xMPU_SETTINGS *xMPUSettings, const struct xMEMORY_REGION * const xRegions, StackType_t *pxBottomOfStack, uint32_t usStackDepth ) PRIVILEGED_FUNCTION; + void vPortReleaseTaskMPUSettings( xMPU_SETTINGS *xMPUSettings ); +#endif + +/* Multi-core: get current core ID */ +static inline uint32_t IRAM_ATTR xPortGetCoreID(void) { + uint32_t id; + __asm__ __volatile__ ( + "rsr.prid %0\n" + " extui %0,%0,13,1" + :"=r"(id)); + return id; +} + +/* Get tick rate per second */ +uint32_t xPortGetTickRateHz(void); + + +static inline bool IRAM_ATTR xPortCanYield(void) +{ + uint32_t ps_reg = 0; + + //Get the current value of PS (processor status) register + RSR(PS, ps_reg); + + /* + * intlevel = (ps_reg & 0xf); + * excm = (ps_reg >> 4) & 0x1; + * CINTLEVEL is max(excm * EXCMLEVEL, INTLEVEL), where EXCMLEVEL is 3. + * However, just return true, only intlevel is zero. + */ + + return ((ps_reg & PS_INTLEVEL_MASK) == 0); +} + +#ifdef __cplusplus +} +#endif + +void uxPortCompareSetExtram(volatile uint32_t *addr, uint32_t compare, uint32_t *set); + +#endif /* PORTABLE_H */ + diff --git a/arch/xtensa/include/esp32/freertos/portbenchmark.h b/arch/xtensa/include/esp32/freertos/portbenchmark.h new file mode 100644 index 0000000000000..4ce41d3dad8b0 --- /dev/null +++ b/arch/xtensa/include/esp32/freertos/portbenchmark.h @@ -0,0 +1,46 @@ +/******************************************************************************* +// Copyright (c) 2003-2015 Cadence Design Systems, Inc. +// +// 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 the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 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. +-------------------------------------------------------------------------------- +*/ + +/* + * This utility helps benchmarking interrupt latency and context switches. + * In order to enable it, set configBENCHMARK to 1 in FreeRTOSConfig.h. + * You will also need to download the FreeRTOS_trace patch that contains + * portbenchmark.c and the complete version of portbenchmark.h + */ + +#ifndef PORTBENCHMARK_H +#define PORTBENCHMARK_H + +#if configBENCHMARK + #error "You need to download the FreeRTOS_trace patch that overwrites this file" +#endif + +#define portbenchmarkINTERRUPT_DISABLE() +#define portbenchmarkINTERRUPT_RESTORE(newstate) +#define portbenchmarkIntLatency() +#define portbenchmarkIntWait() +#define portbenchmarkReset() +#define portbenchmarkPrint() + +#endif /* PORTBENCHMARK */ diff --git a/arch/xtensa/include/esp32/freertos/portmacro.h b/arch/xtensa/include/esp32/freertos/portmacro.h new file mode 100644 index 0000000000000..139f53cf296ff --- /dev/null +++ b/arch/xtensa/include/esp32/freertos/portmacro.h @@ -0,0 +1,491 @@ +/* + FreeRTOS V8.2.0 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + 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 from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + 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.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and 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 PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef __ASSEMBLER__ + +#include +#include +#include + +#include "../xtensa/include/xtensa/hal.h" +#include "../xtensa/esp32/include/xtensa/config/core.h" +#include "../xtensa/esp32/include/xtensa/config/system.h" /* required for XSHAL_CLIB */ +#include "../xtensa/include/xtensa/xtruntime.h" +#include "../esp_common/esp_private/crosscore_int.h" +#include "../esp_common/esp_timer.h" /* required for FreeRTOS run time stats */ + + +#include "../heap/include/esp_heap_caps.h" + +#include + +#ifdef CONFIG_LEGACY_INCLUDE_COMMON_HEADERS +#include "../soc/include/soc/soc_memory_layout.h" +#endif + +//#include "xtensa_context.h" + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + +#define portCHAR int8_t +#define portFLOAT float +#define portDOUBLE double +#define portLONG int32_t +#define portSHORT int16_t +#define portSTACK_TYPE uint8_t +#define portBASE_TYPE int + +typedef portSTACK_TYPE StackType_t; +typedef portBASE_TYPE BaseType_t; +typedef unsigned portBASE_TYPE UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +// portbenchmark +#include "portbenchmark.h" + +#include +#include "../xtensa/include/esp_attr.h" + +/* "mux" data structure (spinlock) */ +typedef struct { + /* owner field values: + * 0 - Uninitialized (invalid) + * portMUX_FREE_VAL - Mux is free, can be locked by either CPU + * CORE_ID_REGVAL_PRO / CORE_ID_REGVAL_APP - Mux is locked to the particular core + * + * Note that for performance reasons we use the full Xtensa CORE ID values + * (CORE_ID_REGVAL_PRO, CORE_ID_REGVAL_APP) and not the 0,1 values which are used in most + * other FreeRTOS code. + * + * Any value other than portMUX_FREE_VAL, CORE_ID_REGVAL_PRO, CORE_ID_REGVAL_APP indicates corruption + */ + uint32_t owner; + /* count field: + * If mux is unlocked, count should be zero. + * If mux is locked, count is non-zero & represents the number of recursive locks on the mux. + */ + uint32_t count; +#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG + const char *lastLockedFn; + int lastLockedLine; +#endif +} portMUX_TYPE; + +#define portMUX_FREE_VAL 0xB33FFFFF + +/* Special constants for vPortCPUAcquireMutexTimeout() */ +#define portMUX_NO_TIMEOUT (-1) /* When passed for 'timeout_cycles', spin forever if necessary */ +#define portMUX_TRY_LOCK 0 /* Try to acquire the spinlock a single time only */ + +// Keep this in sync with the portMUX_TYPE struct definition please. +#ifndef CONFIG_FREERTOS_PORTMUX_DEBUG +#define portMUX_INITIALIZER_UNLOCKED { \ + .owner = portMUX_FREE_VAL, \ + .count = 0, \ + } +#else +#define portMUX_INITIALIZER_UNLOCKED { \ + .owner = portMUX_FREE_VAL, \ + .count = 0, \ + .lastLockedFn = "(never locked)", \ + .lastLockedLine = -1 \ + } +#endif + + +#define portASSERT_IF_IN_ISR() vPortAssertIfInISR() +void vPortAssertIfInISR(void); + +#define portCRITICAL_NESTING_IN_TCB 1 + +/* +Modifications to portENTER_CRITICAL. + +For an introduction, see "Critical Sections & Disabling Interrupts" in docs/api-guides/freertos-smp.rst + +The original portENTER_CRITICAL only disabled the ISRs. This is enough for single-CPU operation: by +disabling the interrupts, there is no task switch so no other tasks can meddle in the data, and because +interrupts are disabled, ISRs can't corrupt data structures either. + +For multiprocessing, things get a bit more hairy. First of all, disabling the interrupts doesn't stop +the tasks or ISRs on the other processors meddling with our CPU. For tasks, this is solved by adding +a spinlock to the portENTER_CRITICAL macro. A task running on the other CPU accessing the same data will +spinlock in the portENTER_CRITICAL code until the first CPU is done. + +For ISRs, we now also need muxes: while portENTER_CRITICAL disabling interrupts will stop ISRs on the same +CPU from meddling with the data, it does not stop interrupts on the other cores from interfering with the +data. For this, we also use a spinlock in the routines called by the ISR, but these spinlocks +do not disable the interrupts (because they already are). + +This all assumes that interrupts are either entirely disabled or enabled. Interrupt priority levels +will break this scheme. + +Remark: For the ESP32, portENTER_CRITICAL and portENTER_CRITICAL_ISR both alias vTaskEnterCritical, meaning +that either function can be called both from ISR as well as task context. This is not standard FreeRTOS +behaviour; please keep this in mind if you need any compatibility with other FreeRTOS implementations. +*/ +void vPortCPUInitializeMutex(portMUX_TYPE *mux); +#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG +void vPortCPUAcquireMutex(portMUX_TYPE *mux, const char *function, int line); +bool vPortCPUAcquireMutexTimeout(portMUX_TYPE *mux, int timeout_cycles, const char *function, int line); +void vPortCPUReleaseMutex(portMUX_TYPE *mux, const char *function, int line); + + +void vTaskEnterCritical( portMUX_TYPE *mux, const char *function, int line ); +void vTaskExitCritical( portMUX_TYPE *mux, const char *function, int line ); + +#ifdef CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE +/* Calling port*_CRITICAL from ISR context would cause an assert failure. + * If the parent function is called from both ISR and Non-ISR context then call port*_CRITICAL_SAFE + */ +#define portENTER_CRITICAL(mux) do { \ + if(!xPortInIsrContext()) { \ + vTaskEnterCritical(mux, __FUNCTION__, __LINE__); \ + } else { \ + ets_printf("%s:%d (%s)- port*_CRITICAL called from ISR context!\n", __FILE__, __LINE__, \ + __FUNCTION__); \ + abort(); \ + } \ + } while(0) + +#define portEXIT_CRITICAL(mux) do { \ + if(!xPortInIsrContext()) { \ + vTaskExitCritical(mux, __FUNCTION__, __LINE__); \ + } else { \ + ets_printf("%s:%d (%s)- port*_CRITICAL called from ISR context!\n", __FILE__, __LINE__, \ + __FUNCTION__); \ + abort(); \ + } \ + } while(0) +#else +#define portENTER_CRITICAL(mux) vTaskEnterCritical(mux, __FUNCTION__, __LINE__) +#define portEXIT_CRITICAL(mux) vTaskExitCritical(mux, __FUNCTION__, __LINE__) +#endif +#define portENTER_CRITICAL_ISR(mux) vTaskEnterCritical(mux, __FUNCTION__, __LINE__) +#define portEXIT_CRITICAL_ISR(mux) vTaskExitCritical(mux, __FUNCTION__, __LINE__) +#else +void vTaskExitCritical( portMUX_TYPE *mux ); +void vTaskEnterCritical( portMUX_TYPE *mux ); +void vPortCPUAcquireMutex(portMUX_TYPE *mux); + +/** @brief Acquire a portmux spinlock with a timeout + * + * @param mux Pointer to portmux to acquire. + * @param timeout_cycles Timeout to spin, in CPU cycles. Pass portMUX_NO_TIMEOUT to wait forever, + * portMUX_TRY_LOCK to try a single time to acquire the lock. + * + * @return true if mutex is successfully acquired, false on timeout. + */ +bool vPortCPUAcquireMutexTimeout(portMUX_TYPE *mux, int timeout_cycles); +void vPortCPUReleaseMutex(portMUX_TYPE *mux); + +#ifdef CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE +/* Calling port*_CRITICAL from ISR context would cause an assert failure. + * If the parent function is called from both ISR and Non-ISR context then call port*_CRITICAL_SAFE + */ +#define portENTER_CRITICAL(mux) do { \ + if(!xPortInIsrContext()) { \ + vTaskEnterCritical(mux); \ + } else { \ + ets_printf("%s:%d (%s)- port*_CRITICAL called from ISR context!\n", __FILE__, __LINE__, \ + __FUNCTION__); \ + abort(); \ + } \ + } while(0) + +#define portEXIT_CRITICAL(mux) do { \ + if(!xPortInIsrContext()) { \ + vTaskExitCritical(mux); \ + } else { \ + ets_printf("%s:%d (%s)- port*_CRITICAL called from ISR context!\n", __FILE__, __LINE__, \ + __FUNCTION__); \ + abort(); \ + } \ + } while(0) +#else +#define portENTER_CRITICAL(mux) vTaskEnterCritical(mux) +#define portEXIT_CRITICAL(mux) vTaskExitCritical(mux) +#endif +#define portENTER_CRITICAL_ISR(mux) vTaskEnterCritical(mux) +#define portEXIT_CRITICAL_ISR(mux) vTaskExitCritical(mux) +#endif + +#define portENTER_CRITICAL_SAFE(mux) do { \ + if (xPortInIsrContext()) { \ + portENTER_CRITICAL_ISR(mux); \ + } else { \ + portENTER_CRITICAL(mux); \ + } \ + } while(0) + +#define portEXIT_CRITICAL_SAFE(mux) do { \ + if (xPortInIsrContext()) { \ + portEXIT_CRITICAL_ISR(mux); \ + } else { \ + portEXIT_CRITICAL(mux); \ + } \ + } while(0) + + +// Critical section management. NW-TODO: replace XTOS_SET_INTLEVEL with more efficient version, if any? +// These cannot be nested. They should be used with a lot of care and cannot be called from interrupt level. +// +// Only applies to one CPU. See notes above & below for reasons not to use these. +#define portDISABLE_INTERRUPTS() do { XTOS_SET_INTLEVEL(XCHAL_EXCM_LEVEL); portbenchmarkINTERRUPT_DISABLE(); } while (0) +#define portENABLE_INTERRUPTS() do { portbenchmarkINTERRUPT_RESTORE(0); XTOS_SET_INTLEVEL(0); } while (0) + +// Cleaner solution allows nested interrupts disabling and restoring via local registers or stack. +// They can be called from interrupts too. +// WARNING: Only applies to current CPU. See notes above. +static inline unsigned portENTER_CRITICAL_NESTED(void) { + unsigned state = XTOS_SET_INTLEVEL(XCHAL_EXCM_LEVEL); + portbenchmarkINTERRUPT_DISABLE(); + return state; +} +#define portEXIT_CRITICAL_NESTED(state) do { portbenchmarkINTERRUPT_RESTORE(state); XTOS_RESTORE_JUST_INTLEVEL(state); } while (0) + +// These FreeRTOS versions are similar to the nested versions above +#define portSET_INTERRUPT_MASK_FROM_ISR() portENTER_CRITICAL_NESTED() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(state) portEXIT_CRITICAL_NESTED(state) + +//Because the ROM routines don't necessarily handle a stack in external RAM correctly, we force +//the stack memory to always be internal. +#define portTcbMemoryCaps (MALLOC_CAP_INTERNAL|MALLOC_CAP_8BIT) +#define portStackMemoryCaps (MALLOC_CAP_INTERNAL|MALLOC_CAP_8BIT) + +#define pvPortMallocTcbMem(size) heap_caps_malloc(size, portTcbMemoryCaps) +#define pvPortMallocStackMem(size) heap_caps_malloc(size, portStackMemoryCaps) + +/* + * Wrapper for the Xtensa compare-and-set instruction. This subroutine will atomically compare + * *addr to 'compare'. If *addr == compare, *addr is set to *set. *set is updated with the previous + * value of *addr (either 'compare' or some other value.) + * + * Warning: From the ISA docs: in some (unspecified) cases, the s32c1i instruction may return the + * *bitwise inverse* of the old mem if the mem wasn't written. This doesn't seem to happen on the + * ESP32 (portMUX assertions would fail). + */ +static inline void uxPortCompareSet(volatile uint32_t *addr, uint32_t compare, uint32_t *set) { +#if XCHAL_HAVE_S32C1I + __asm__ __volatile__ ( + "WSR %2,SCOMPARE1 \n" + "S32C1I %0, %1, 0 \n" + :"=r"(*set) + :"r"(addr), "r"(compare), "0"(*set) + ); +#else + // No S32C1I, so do this by disabling and re-enabling interrupts (slower) + uint32_t intlevel, old_value; + __asm__ __volatile__ ("rsil %0, " XTSTR(XCHAL_EXCM_LEVEL) "\n" + : "=r"(intlevel)); + + old_value = *addr; + if (old_value == compare) { + *addr = *set; + } + + __asm__ __volatile__ ("memw \n" + "wsr %0, ps\n" + :: "r"(intlevel)); + + *set = old_value; +#endif +} + + +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 4 +#define portNOP() XT_NOP() +/*-----------------------------------------------------------*/ + +/* Fine resolution time */ +#define portGET_RUN_TIME_COUNTER_VALUE() xthal_get_ccount() +//ccount or esp_timer are initialized elsewhere +#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() + +#ifdef CONFIG_FREERTOS_RUN_TIME_STATS_USING_ESP_TIMER +/* Coarse resolution time (us) */ +#define portALT_GET_RUN_TIME_COUNTER_VALUE(x) x = (uint32_t)esp_timer_get_time() +#endif + + + +/* Kernel utilities. */ +void vPortYield( void ); +void _frxt_setup_switch( void ); +#define portYIELD() vPortYield() +#define portYIELD_FROM_ISR() {traceISR_EXIT_TO_SCHEDULER(); _frxt_setup_switch();} + +static inline uint32_t xPortGetCoreID(void); + +/* Yielding within an API call (when interrupts are off), means the yield should be delayed + until interrupts are re-enabled. + + To do this, we use the "cross-core" interrupt as a trigger to yield on this core when interrupts are re-enabled.This + is the same interrupt & code path which is used to trigger a yield between CPUs, although in this case the yield is + happening on the same CPU. +*/ +#define portYIELD_WITHIN_API() esp_crosscore_int_send_yield(xPortGetCoreID()) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +// When coprocessors are defined, we to maintain a pointer to coprocessors area. +// We currently use a hack: redefine field xMPU_SETTINGS in TCB block as a structure that can hold: +// MPU wrappers, coprocessor area pointer, trace code structure, and more if needed. +// The field is normally used for memory protection. FreeRTOS should create another general purpose field. +typedef struct { + #if XCHAL_CP_NUM > 0 + volatile StackType_t* coproc_area; // Pointer to coprocessor save area; MUST BE FIRST + #endif + + #if portUSING_MPU_WRAPPERS + // Define here mpu_settings, which is port dependent + int mpu_setting; // Just a dummy example here; MPU not ported to Xtensa yet + #endif + + #if configUSE_TRACE_FACILITY_2 + struct { + // Cf. porttraceStamp() + int taskstamp; /* Stamp from inside task to see where we are */ + int taskstampcount; /* A counter usually incremented when we restart the task's loop */ + } porttrace; + #endif +} xMPU_SETTINGS; + +// Main hack to use MPU_wrappers even when no MPU is defined (warning: mpu_setting should not be accessed; otherwise move this above xMPU_SETTINGS) +#if (XCHAL_CP_NUM > 0 || configUSE_TRACE_FACILITY_2) && !portUSING_MPU_WRAPPERS // If MPU wrappers not used, we still need to allocate coproc area + #undef portUSING_MPU_WRAPPERS + #define portUSING_MPU_WRAPPERS 0 // Enable it to allocate coproc area + #define MPU_WRAPPERS_H // Override mpu_wrapper.h to disable unwanted code + #define PRIVILEGED_FUNCTION + #define PRIVILEGED_DATA +#endif + +extern void esp_vApplicationIdleHook( void ); +extern void esp_vApplicationTickHook( void ); + +#ifndef CONFIG_FREERTOS_LEGACY_HOOKS +#define vApplicationIdleHook esp_vApplicationIdleHook +#define vApplicationTickHook esp_vApplicationTickHook +#endif /* !CONFIG_FREERTOS_LEGACY_HOOKS */ + +void _xt_coproc_release(volatile void * coproc_sa_base); +void vApplicationSleep( TickType_t xExpectedIdleTime ); + +#define portSUPPRESS_TICKS_AND_SLEEP( idleTime ) vApplicationSleep( idleTime ) + +// porttrace +#if configUSE_TRACE_FACILITY_2 +#include "porttrace.h" +#endif + +// configASSERT_2 if requested +#if configASSERT_2 +#include +void exit(int); +#define configASSERT( x ) if (!(x)) { porttracePrint(-1); printf("\nAssertion failed in %s:%d\n", __FILE__, __LINE__); exit(-1); } +#endif + +#endif // __ASSEMBLER__ + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/arch/xtensa/include/esp32/freertos/porttrace.h b/arch/xtensa/include/esp32/freertos/porttrace.h new file mode 100644 index 0000000000000..bf2fb41252579 --- /dev/null +++ b/arch/xtensa/include/esp32/freertos/porttrace.h @@ -0,0 +1,42 @@ +/******************************************************************************* +// Copyright (c) 2003-2015 Cadence Design Systems, Inc. +// +// 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 the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 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. +-------------------------------------------------------------------------------- + +/* + * This utility helps tracing the entering and exiting from tasks. It maintains a circular buffer + * of tasks in the order they execute, and their execution time. + * In order to enable it, set configUSE_TRACE_FACILITY_2 to 1 in FreeRTOSConfig.h. + * You will also need to download the FreeRTOS_trace patch that contains + * porttrace.c and the complete version of porttrace.h + */ + +#ifndef PORTTRACE_H +#define PORTTRACE_H + +#if configUSE_TRACE_FACILITY_2 + #error "You need to download the FreeRTOS_trace patch that overwrites this file" +#endif + +#define porttracePrint(nelements) +#define porttraceStamp(stamp, count_incr) + +#endif /* PORTTRACE_H */ diff --git a/arch/xtensa/include/esp32/freertos/projdefs.h b/arch/xtensa/include/esp32/freertos/projdefs.h new file mode 100644 index 0000000000000..edb5007303673 --- /dev/null +++ b/arch/xtensa/include/esp32/freertos/projdefs.h @@ -0,0 +1,110 @@ +/* + FreeRTOS V8.2.0 - Copyright (C) 2015 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 PROJDEFS_H +#define PROJDEFS_H + +/* + * 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 * ); + +/* Converts a time in milliseconds to a time in ticks. */ +#define pdMS_TO_TICKS( xTimeInMs ) ( ( ( TickType_t ) ( xTimeInMs ) * configTICK_RATE_HZ ) / ( TickType_t ) 1000 ) +#define pdTICKS_TO_MS( xTicks ) ( ( uint32_t ) ( xTicks ) * 1000 / configTICK_RATE_HZ ) + +#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 ) + +/* Error definitions. */ +#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 +#endif + +#if( configUSE_16_BIT_TICKS == 1 ) + #define pdINTEGRITY_CHECK_VALUE 0x5a5a +#else + #define pdINTEGRITY_CHECK_VALUE 0x5a5a5a5aUL +#endif + +#endif /* PROJDEFS_H */ + + + diff --git a/arch/xtensa/include/esp32/freertos/queue.h b/arch/xtensa/include/esp32/freertos/queue.h new file mode 100644 index 0000000000000..e15152ee975a1 --- /dev/null +++ b/arch/xtensa/include/esp32/freertos/queue.h @@ -0,0 +1,1648 @@ +/* + FreeRTOS V8.2.0 - Copyright (C) 2015 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 QUEUE_H +#define QUEUE_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h" must appear in source files before "include queue.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + + +/** + * Type by which queues are referenced. For example, a call to xQueueCreate() + * returns an QueueHandle_t variable that can then be used as a parameter to + * xQueueSend(), xQueueReceive(), etc. + */ +typedef void * 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 void * 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 void * 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 ) + +/* 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 ) + +/** @endcond */ + +/** + * Creates a new queue instance. This allocates the storage required by the + * new queue and returns a handle for the queue. + * + * @param uxQueueLength The maximum number of items that the queue can contain. + * + * @param uxItemSize The number of bytes each item in the queue will require. + * Items are queued by copy, not by reference, so this is the number of bytes + * that will be copied for each posted item. Each item on the queue must be + * the same size. + * + * @return If the queue is successfully create then a handle to the newly + * created queue is returned. If the queue cannot be created then 0 is + * returned. + * + * Example usage: + * @code{c} + * struct AMessage + * { + * char ucMessageID; + * char ucData[ 20 ]; + * }; + * + * void vATask( void *pvParameters ) + * { + * QueueHandle_t xQueue1, xQueue2; + * + * // Create a queue capable of containing 10 uint32_t values. + * xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) ); + * if( xQueue1 == 0 ) + * { + * // Queue was not created and must not be used. + * } + * + * // Create a queue capable of containing 10 pointers to AMessage structures. + * // These should be passed by pointer as they contain a lot of data. + * xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) ); + * if( xQueue2 == 0 ) + * { + * // Queue was not created and must not be used. + * } + * + * // ... Rest of task code. + * } + * @endcode + * \ingroup QueueManagement + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xQueueCreate( uxQueueLength, uxItemSize ) xQueueGenericCreate( ( uxQueueLength ), ( uxItemSize ), ( queueQUEUE_TYPE_BASE ) ) +#endif + +/** + * Creates a new queue instance, and returns a handle by which the new queue + * can be referenced. + * + * Internally, within the FreeRTOS implementation, queues use two blocks of + * memory. The first block is used to hold the queue's data structures. The + * 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 + * 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 + * + * @param uxQueueLength The maximum number of items that the queue can contain. + * + * @param uxItemSize The number of bytes each item in the queue will require. + * Items are queued by copy, not by reference, so this is the number of bytes + * that will be copied for each posted item. Each item on the queue must be + * the same size. + * + * @param pucQueueStorage If uxItemSize is not zero then + * pucQueueStorageBuffer must point to a uint8_t array that is at least large + * enough to hold the maximum number of items that can be in the queue at any + * one time - which is ( uxQueueLength * uxItemsSize ) bytes. If uxItemSize is + * zero then pucQueueStorageBuffer can be NULL. + * + * @param pxQueueBuffer Must point to a variable of type StaticQueue_t, which + * will be used to hold the queue's data structure. + * + * @return If the queue is created then a handle to the created queue is + * returned. If pxQueueBuffer is NULL then NULL is returned. + * + * Example usage: + * @code{c} + * struct AMessage + * { + * char ucMessageID; + * char ucData[ 20 ]; + * }; + * + * #define QUEUE_LENGTH 10 + * #define ITEM_SIZE sizeof( uint32_t ) + * + * // xQueueBuffer will hold the queue structure. + * StaticQueue_t xQueueBuffer; + * + * // ucQueueStorage will hold the items posted to the queue. Must be at least + * // [(queue length) * ( queue item size)] bytes long. + * uint8_t ucQueueStorage[ QUEUE_LENGTH * ITEM_SIZE ]; + * + * void vATask( void *pvParameters ) + * { + * 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. + * ITEM_SIZE // The size of each item in the queue + * &( ucQueueStorage[ 0 ] ), // The buffer that will hold the items in the queue. + * &xQueueBuffer ); // The buffer that will hold the queue structure. + * + * // The queue is guaranteed to be created successfully as no dynamic memory + * // allocation is used. Therefore xQueue1 is now a handle to a valid queue. + * + * // ... Rest of task code. + * } + * @endcode + * \ingroup QueueManagement + */ +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xQueueCreateStatic( uxQueueLength, uxItemSize, pucQueueStorage, pxQueueBuffer ) xQueueGenericCreateStatic( ( uxQueueLength ), ( uxItemSize ), ( pucQueueStorage ), ( pxQueueBuffer ), ( queueQUEUE_TYPE_BASE ) ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * This is a macro that calls xQueueGenericSend(). + * + * 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 + * in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the + * queue is full. 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. + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: + * @code{c} + * struct AMessage + * { + * char ucMessageID; + * char ucData[ 20 ]; + * } xMessage; + * + * uint32_t ulVar = 10UL; + * + * 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 ) ); + * + * // Create a queue capable of containing 10 pointers to AMessage structures. + * // These should be passed by pointer as they contain a lot of data. + * xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) ); + * + * // ... + * + * if( xQueue1 != 0 ) + * { + * // Send an uint32_t. Wait for 10 ticks for space to become + * // available if necessary. + * if( xQueueSendToFront( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS ) + * { + * // Failed to post the message, even after 10 ticks. + * } + * } + * + * if( xQueue2 != 0 ) + * { + * // Send a pointer to a struct AMessage object. Don't block if the + * // queue is already full. + * pxMessage = & xMessage; + * xQueueSendToFront( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 ); + * } + * + * // ... Rest of task code. + * } + * @endcode + * \ingroup QueueManagement + */ +#define xQueueSendToFront( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_FRONT ) + +/** + * This is a macro that calls xQueueGenericSend(). + * + * Post an item to the back 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 + * in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the queue + * is full. 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. + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: + * @code{c} + * struct AMessage + * { + * char ucMessageID; + * char ucData[ 20 ]; + * } xMessage; + * + * uint32_t ulVar = 10UL; + * + * 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 ) ); + * + * // Create a queue capable of containing 10 pointers to AMessage structures. + * // These should be passed by pointer as they contain a lot of data. + * xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) ); + * + * // ... + * + * if( xQueue1 != 0 ) + * { + * // Send an uint32_t. Wait for 10 ticks for space to become + * // available if necessary. + * if( xQueueSendToBack( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS ) + * { + * // Failed to post the message, even after 10 ticks. + * } + * } + * + * if( xQueue2 != 0 ) + * { + * // Send a pointer to a struct AMessage object. Don't block if the + * // queue is already full. + * pxMessage = & xMessage; + * xQueueSendToBack( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 ); + * } + * + * // ... Rest of task code. + * } + * @endcode + * \ingroup QueueManagement + */ +#define xQueueSendToBack( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) + +/** + * 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 + * equivalent to xQueueSendToBack(). + * + * Post an item on 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 in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the + * queue is full. 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. + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: + * @code{c} + * struct AMessage + * { + * char ucMessageID; + * char ucData[ 20 ]; + * } xMessage; + * + * uint32_t ulVar = 10UL; + * + * 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 ) ); + * + * // Create a queue capable of containing 10 pointers to AMessage structures. + * // These should be passed by pointer as they contain a lot of data. + * xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) ); + * + * // ... + * + * if( xQueue1 != 0 ) + * { + * // Send an uint32_t. Wait for 10 ticks for space to become + * // available if necessary. + * if( xQueueSend( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS ) + * { + * // Failed to post the message, even after 10 ticks. + * } + * } + * + * if( xQueue2 != 0 ) + * { + * // Send a pointer to a struct AMessage object. Don't block if the + * // queue is already full. + * pxMessage = & xMessage; + * xQueueSend( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 ); + * } + * + * // ... Rest of task code. + * } + * @endcode + * \ingroup QueueManagement + */ +#define xQueueSend( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) + +/** + * Only for use with queues that have a length of one - so the queue is either + * empty or full. + * + * Post an item on a queue. If the queue is already full then overwrite the + * value held in the queue. The item is queued by copy, not by reference. + * + * This function must not be called from an interrupt service routine. + * See xQueueOverwriteFromISR () for an alternative which may be used in an ISR. + * + * @param xQueue The handle of the queue to which the data is being sent. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @return xQueueOverwrite() is a macro that calls xQueueGenericSend(), and + * therefore has the same return values as xQueueSendToFront(). However, pdPASS + * is the only value that can be returned because xQueueOverwrite() will write + * to the queue even when the queue is already full. + * + * Example usage: + * @code{c} + * + * 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 + * // contain more than one value, and doing so will trigger an assertion + * // if configASSERT() is defined. + * xQueue = xQueueCreate( 1, sizeof( uint32_t ) ); + * + * // Write the value 10 to the queue using xQueueOverwrite(). + * ulVarToSend = 10; + * xQueueOverwrite( xQueue, &ulVarToSend ); + * + * // Peeking the queue should now return 10, but leave the value 10 in + * // the queue. A block time of zero is used as it is known that the + * // queue holds a value. + * ulValReceived = 0; + * xQueuePeek( xQueue, &ulValReceived, 0 ); + * + * if( ulValReceived != 10 ) + * { + * // Error unless the item was removed by a different task. + * } + * + * // The queue is still full. Use xQueueOverwrite() to overwrite the + * // value held in the queue with 100. + * ulVarToSend = 100; + * xQueueOverwrite( xQueue, &ulVarToSend ); + * + * // This time read from the queue, leaving the queue empty once more. + * // A block time of 0 is used again. + * xQueueReceive( xQueue, &ulValReceived, 0 ); + * + * // The value read should be the last value written, even though the + * // queue was already full when the value was written. + * if( ulValReceived != 100 ) + * { + * // Error! + * } + * + * // ... + * } + * @endcode + * \ingroup QueueManagement + */ +#define xQueueOverwrite( xQueue, pvItemToQueue ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), 0, queueOVERWRITE ) + + +/** + * It is preferred that the macros xQueueSend(), xQueueSendToFront() and + * xQueueSendToBack() are used in place of calling this function directly. + * + * Post an item on 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 in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the + * queue is full. 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. + * + * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the + * item at the back of the queue, or queueSEND_TO_FRONT to place the item + * at the front of the queue (for high priority messages). + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: + * @code{c} + * struct AMessage + * { + * char ucMessageID; + * char ucData[ 20 ]; + * } xMessage; + * + * uint32_t ulVar = 10UL; + * + * 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 ) ); + * + * // Create a queue capable of containing 10 pointers to AMessage structures. + * // These should be passed by pointer as they contain a lot of data. + * xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) ); + * + * // ... + * + * if( xQueue1 != 0 ) + * { + * // Send an uint32_t. Wait for 10 ticks for space to become + * // available if necessary. + * if( xQueueGenericSend( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10, queueSEND_TO_BACK ) != pdPASS ) + * { + * // Failed to post the message, even after 10 ticks. + * } + * } + * + * if( xQueue2 != 0 ) + * { + * // Send a pointer to a struct AMessage object. Don't block if the + * // queue is already full. + * pxMessage = & xMessage; + * xQueueGenericSend( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0, queueSEND_TO_BACK ); + * } + * + * // ... Rest of task code. + * } + * @endcode + * \ingroup QueueManagement + */ +BaseType_t xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION; + +/** + * This is a macro that calls the xQueueGenericReceive() function. + * + * 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 + * the queue was created. + * + * Successfully received items remain on the queue so will be returned again + * by the next call, or a call to xQueueReceive(). + * + * This macro must not be used in an interrupt service routine. See + * xQueuePeekFromISR() for an alternative that can be called from an interrupt + * service routine. + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @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 + * 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. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: + * @code{c} + * 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 ) + * { + * // 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. + * } + * + * // Task to peek the data from the queue. + * void vADifferentTask( void *pvParameters ) + * { + * struct AMessage *pxRxedMessage; + * + * if( xQueue != 0 ) + * { + * // Peek a message on the created queue. Block for 10 ticks if a + * // message is not immediately available. + * if( xQueuePeek( xQueue, &( pxRxedMessage ), ( TickType_t ) 10 ) ) + * { + * // pcRxedMessage now points to the struct AMessage variable posted + * // by vATask, but the item still remains on the queue. + * } + * } + * + * // ... Rest of task code. + * } + * @endcode + * \ingroup QueueManagement + */ +#define xQueuePeek( xQueue, pvBuffer, xTicksToWait ) xQueueGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdTRUE ) + +/** + * A version of xQueuePeek() that can be called from an interrupt service + * routine (ISR). + * + * 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 + * the queue was created. + * + * Successfully received items remain on the queue so will be returned again + * by the next call, or a call to xQueueReceive(). + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * \ingroup QueueManagement + */ +BaseType_t xQueuePeekFromISR( QueueHandle_t xQueue, void * const pvBuffer ) PRIVILEGED_FUNCTION; + +/** + * queue. h + *
+ BaseType_t xQueueReceive(
+								 QueueHandle_t xQueue,
+								 void *pvBuffer,
+								 TickType_t xTicksToWait
+							);
+ * + * This is a macro that calls the xQueueGenericReceive() function. + * + * 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. + * + * Successfully received items are removed from the queue. + * + * This function must not be used in an interrupt service routine. See + * xQueueReceiveFromISR for an alternative that can. + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @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 + * 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. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: + * @code{c} + * 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 ) + * { + * // 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. + * } + * + * // Task to receive from the queue. + * void vADifferentTask( void *pvParameters ) + * { + * 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. + * } + * @endcode + * \ingroup QueueManagement + */ +#define xQueueReceive( xQueue, pvBuffer, xTicksToWait ) xQueueGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdFALSE ) + + +/** + * It is preferred that the macro xQueueReceive() be used rather than calling + * this function directly. + * + * 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. + * + * This function must not be used in an interrupt service routine. See + * xQueueReceiveFromISR for an alternative that can. + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @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 + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * xQueueGenericReceive() will return immediately if the queue is empty and + * xTicksToWait is 0. + * + * @param xJustPeek When set to true, the item received from the queue is not + * actually removed from the queue - meaning a subsequent call to + * xQueueReceive() will return the same item. When set to false, the item + * being received from the queue is also removed from the queue. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: + * @code{c} + * 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 ) + * { + * // 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. + * } + * + * // Task to receive from the queue. + * void vADifferentTask( void *pvParameters ) + * { + * 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( xQueueGenericReceive( xQueue, &( pxRxedMessage ), ( TickType_t ) 10 ) ) + * { + * // pcRxedMessage now points to the struct AMessage variable posted + * // by vATask. + * } + * } + * + * // ... Rest of task code. + * } + * @endcode + * \ingroup QueueManagement + */ +BaseType_t xQueueGenericReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait, const BaseType_t xJustPeek ) PRIVILEGED_FUNCTION; + +/** + * 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. + * + * \ingroup QueueManagement + */ +UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + +/** + * 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. + * + * @param xQueue A handle to the queue being queried. + * + * @return The number of spaces available in the queue. + * + * \ingroup QueueManagement + */ +UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + +/** + * 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. + * + * \ingroup QueueManagement + */ +void vQueueDelete( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + +/** + * This is a macro that calls xQueueGenericSendFromISR(). + * + * Post an item to the front of a queue. It is safe to use this macro from + * within an interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param[out] pxHigherPriorityTaskWoken xQueueSendToFrontFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueSendToFromFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): + * @code{c} + * 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 + * { + * // Obtain a byte from the buffer. + * cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); + * + * // 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 (); + * } + * } + * @endcode + * \ingroup QueueManagement + */ +#define xQueueSendToFrontFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_FRONT ) + + +/** + * This is a macro that calls xQueueGenericSendFromISR(). + * + * Post an item to the back of a queue. It is safe to use this macro from + * within an interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param[out] pxHigherPriorityTaskWoken xQueueSendToBackFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueSendToBackFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): + * @code{c} + * 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 + * { + * // Obtain a byte from the buffer. + * cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); + * + * // 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 (); + * } + * } + * @endcode + * \ingroup QueueManagement + */ +#define xQueueSendToBackFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK ) + +/** + * A version of xQueueOverwrite() that can be used in an interrupt service + * routine (ISR). + * + * Only for use with queues that can hold a single item - so the queue is either + * empty or full. + * + * Post an item on a queue. If the queue is already full then overwrite the + * value held in the queue. The item is queued by copy, not by reference. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param[out] pxHigherPriorityTaskWoken xQueueOverwriteFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueOverwriteFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return xQueueOverwriteFromISR() is a macro that calls + * xQueueGenericSendFromISR(), and therefore has the same return values as + * xQueueSendToFrontFromISR(). However, pdPASS is the only value that can be + * returned because xQueueOverwriteFromISR() will write to the queue even when + * the queue is already full. + * + * 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 ) ); + * } + * + * void vAnInterruptHandler( void ) + * { + * // xHigherPriorityTaskWoken must be set to pdFALSE before it is used. + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; + * uint32_t ulVarToSend, ulValReceived; + * + * // 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 ); + * + * // 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. + * } + * } + * @endcode + * \ingroup QueueManagement + */ +#define xQueueOverwriteFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueOVERWRITE ) + +/** + * 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() + * macros. + * + * Post an item to the back of a queue. It is safe to use this function from + * within an interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param[out] pxHigherPriorityTaskWoken xQueueSendFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueSendFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): + * @code{c} + * 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 + * { + * // Obtain a byte from the buffer. + * cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); + * + * // 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 (); + * } + * } + * @endcode + * + * \ingroup QueueManagement + */ +#define xQueueSendFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK ) + +/**@{*/ +/** + * It is preferred that the macros xQueueSendFromISR(), + * xQueueSendToFrontFromISR() and xQueueSendToBackFromISR() be used in place + * of calling this function directly. xQueueGiveFromISR() is an + * equivalent for use by semaphores that don't actually copy any data. + * + * Post an item on a queue. It is safe to use this function from within an + * interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param[out] pxHigherPriorityTaskWoken xQueueGenericSendFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueGenericSendFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the + * item at the back of the queue, or queueSEND_TO_FRONT to place the item + * at the front of the queue (for high priority messages). + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): + * @code{c} + * 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 + * { + * // Obtain a byte from the buffer. + * cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); + * + * // 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(); + * } + * } + * @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; +/**@}*/ + +/** + * Receive an item from a queue. It is safe to use this function from within an + * interrupt service routine. + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param[out] pxHigherPriorityTaskWoken A task may be blocked waiting for space to become + * available on the queue. If xQueueReceiveFromISR causes such a task to + * unblock *pxTaskWoken will get set to pdTRUE, otherwise *pxTaskWoken will + * remain unchanged. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: + * @code{c} + * 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 ) + * { + * // 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 ); + * } + * + * // 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) ) + * { + * // 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 (); + * } + * } + * @endcode + * \ingroup QueueManagement + */ +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 + * should be used only from witin an ISR, or within a critical section. + */ +BaseType_t xQueueIsQueueEmptyFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +UBaseType_t uxQueueMessagesWaitingFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +/**@}*/ + +/** @cond */ +/** + * xQueueAltGenericSend() is an alternative version of xQueueGenericSend(). + * Likewise xQueueAltGenericReceive() is an alternative version of + * xQueueGenericReceive(). + * + * 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 + * preferred fully featured API too. The fully featured API has more + * 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. + */ +BaseType_t xQueueAltGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, BaseType_t xCopyPosition ); +BaseType_t xQueueAltGenericReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait, BaseType_t xJustPeeking ); +#define xQueueAltSendToFront( xQueue, pvItemToQueue, xTicksToWait ) xQueueAltGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_FRONT ) +#define xQueueAltSendToBack( xQueue, pvItemToQueue, xTicksToWait ) xQueueAltGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) +#define xQueueAltReceive( xQueue, pvBuffer, xTicksToWait ) xQueueAltGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdFALSE ) +#define xQueueAltPeek( xQueue, pvBuffer, xTicksToWait ) xQueueAltGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdTRUE ) + +/* + * 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. + * + * These functions are called from the co-routine macro implementation and + * 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 ); + +/* + * For internal use only. Use xSemaphoreCreateMutex(), + * xSemaphoreCreateCounting() or xSemaphoreGetMutexHolder() instead of calling + * 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; +void* xQueueGetMutexHolder( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION; + +/* + * 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 xQueueGiveMutexRecursive( QueueHandle_t pxMutex ) PRIVILEGED_FUNCTION; +/** @endcond */ + +/** + * Reset a queue back to its original empty state. pdPASS is returned if the + * queue is successfully reset. pdFAIL is returned if the queue could not be + * reset because there are tasks blocked on the queue waiting to either + * receive from the queue or send to the queue. + * + * @param xQueue The queue to reset + * @return always returns pdPASS + */ +#define xQueueReset( xQueue ) xQueueGenericReset( xQueue, pdFALSE ) + +/** + * The registry is provided as a means for kernel aware debuggers to + * locate queues, semaphores and mutexes. Call vQueueAddToRegistry() add + * a queue, semaphore or mutex handle to the registry if you want the handle + * to be available to a kernel aware debugger. If you are not using a kernel + * aware debugger then this function can be ignored. + * + * configQUEUE_REGISTRY_SIZE defines the maximum number of handles the + * registry can hold. configQUEUE_REGISTRY_SIZE must be greater than 0 + * within FreeRTOSConfig.h for the registry to be available. Its value + * does not effect the number of queues, semaphores and mutexes that can be + * created - just the number that the registry can hold. + * + * @param xQueue The handle of the queue being added to the registry. This + * is the handle returned by a call to xQueueCreate(). Semaphore and mutex + * handles can also be passed in here. + * + * @param pcName The name to be associated with the handle. This is the + * name that the kernel aware debugger will display. The queue registry only + * 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 *pcName ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +#endif + +/** + * The registry is provided as a means for kernel aware debuggers to + * locate queues, semaphores and mutexes. Call vQueueAddToRegistry() add + * a queue, semaphore or mutex handle to the registry if you want the handle + * to be available to a kernel aware debugger, and vQueueUnregisterQueue() to + * remove the queue, semaphore or mutex from the register. If you are not using + * a kernel aware debugger then this function can be ignored. + * + * @param xQueue The handle of the queue being removed from the registry. + */ +#if configQUEUE_REGISTRY_SIZE > 0 + void vQueueUnregisterQueue( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +#endif + +/** + * @note This function has been back ported from FreeRTOS v9.0.0 + * + * The queue registry is provided as a means for kernel aware debuggers to + * locate queues, semaphores and mutexes. Call pcQueueGetName() to look + * up and return the name of a queue in the queue registry from the queue's + * handle. + * + * @param xQueue The handle of the queue the name of which will be returned. + * @return If the queue is in the registry then a pointer to the name of the + * 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. */ +#endif + +/** + * Generic version of the function used to creaet 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; +#endif + +/** + * Generic version of the function used to creaet 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; +#endif + +/** + * Queue sets provide a mechanism to allow a task to block (pend) on a read + * operation from multiple queues or semaphores simultaneously. + * + * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this + * function. + * + * A queue set must be explicitly created using a call to xQueueCreateSet() + * before it can be used. Once created, standard FreeRTOS queues and semaphores + * can be added to the set using calls to xQueueAddToSet(). + * xQueueSelectFromSet() is then used to determine which, if any, of the queues + * 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 + * for reasons why queue sets are very rarely needed in practice as there are + * simpler methods of blocking on multiple objects. + * + * Note 2: Blocking on a queue set that contains a mutex will not cause the + * mutex holder to inherit the priority of the blocked task. + * + * Note 3: An additional 4 bytes of RAM is required for each space in a every + * queue added to a queue set. Therefore counting semaphores that have a high + * maximum count value should not be added to a queue set. + * + * Note 4: A receive (in the case of a queue) or take (in the case of a + * semaphore) operation must not be performed on a member of a queue set unless + * a call to xQueueSelectFromSet() has first returned a handle to that set member. + * + * @param uxEventQueueLength Queue sets store events that occur on + * the queues and semaphores contained in the set. uxEventQueueLength specifies + * the maximum number of events that can be queued at once. To be absolutely + * certain that events are not lost uxEventQueueLength should be set to the + * total sum of the length of the queues added to the set, where binary + * semaphores and mutexes have a length of 1, and counting semaphores have a + * length set by their maximum count value. Examples: + * + If a queue set is to hold a queue of length 5, another queue of length 12, + * and a binary semaphore, then uxEventQueueLength should be set to + * (5 + 12 + 1), or 18. + * + If a queue set is to hold three binary semaphores then uxEventQueueLength + * should be set to (1 + 1 + 1 ), or 3. + * + If a queue set is to hold a counting semaphore that has a maximum count of + * 5, and a counting semaphore that has a maximum count of 3, then + * uxEventQueueLength should be set to (5 + 3), or 8. + * + * @return If the queue set is created successfully then a handle to the created + * queue set is returned. Otherwise NULL is returned. + */ +QueueSetHandle_t xQueueCreateSet( const UBaseType_t uxEventQueueLength ) PRIVILEGED_FUNCTION; + +/** + * Adds a queue or semaphore to a queue set that was previously created by a + * call to xQueueCreateSet(). + * + * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this + * function. + * + * Note 1: A receive (in the case of a queue) or take (in the case of a + * semaphore) operation must not be performed on a member of a queue set unless + * a call to xQueueSelectFromSet() has first returned a handle to that set member. + * + * @param xQueueOrSemaphore The handle of the queue or semaphore being added to + * the queue set (cast to an QueueSetMemberHandle_t type). + * + * @param xQueueSet The handle of the queue set to which the queue or semaphore + * is being added. + * + * @return If the queue or semaphore was successfully added to the queue set + * then pdPASS is returned. If the queue could not be successfully added to the + * 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; + +/** + * Removes a queue or semaphore from a queue set. A queue or semaphore can only + * be removed from a set if the queue or semaphore is empty. + * + * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this + * function. + * + * @param xQueueOrSemaphore The handle of the queue or semaphore being removed + * from the queue set (cast to an QueueSetMemberHandle_t type). + * + * @param xQueueSet The handle of the queue set in which the queue or semaphore + * is included. + * + * @return If the queue or semaphore was successfully removed from the queue set + * 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; + +/** + * xQueueSelectFromSet() selects from the members of a queue set a queue or + * semaphore that either contains data (in the case of a queue) or is available + * to take (in the case of a semaphore). xQueueSelectFromSet() effectively + * allows a task to block (pend) on a read operation on all the queues and + * semaphores in a queue set simultaneously. + * + * 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 + * for reasons why queue sets are very rarely needed in practice as there are + * simpler methods of blocking on multiple objects. + * + * Note 2: Blocking on a queue set that contains a mutex will not cause the + * mutex holder to inherit the priority of the blocked task. + * + * Note 3: A receive (in the case of a queue) or take (in the case of a + * semaphore) operation must not be performed on a member of a queue set unless + * a call to xQueueSelectFromSet() has first returned a handle to that set member. + * + * @param xQueueSet The queue set on which the task will (potentially) block. + * + * @param xTicksToWait The maximum time, in ticks, that the calling task will + * remain in the Blocked state (with other tasks executing) to wait for a member + * of the queue set to be ready for a successful queue read or semaphore take + * operation. + * + * @return xQueueSelectFromSet() will return the handle of a queue (cast to + * a QueueSetMemberHandle_t type) contained in the queue set that contains data, + * or the handle of a semaphore (cast to a QueueSetMemberHandle_t type) contained + * 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; + +/** + * A version of xQueueSelectFromSet() that can be used from an ISR. + */ +QueueSetMemberHandle_t xQueueSelectFromSetFromISR( QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; + +/** @cond */ +/* Not public API functions. */ +void vQueueWaitForMessageRestricted( QueueHandle_t xQueue, TickType_t xTicksToWait ) 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 */ + +#ifdef __cplusplus +} +#endif + +#endif /* QUEUE_H */ + diff --git a/arch/xtensa/include/esp32/freertos/semphr.h b/arch/xtensa/include/esp32/freertos/semphr.h new file mode 100644 index 0000000000000..abe3819f8f33e --- /dev/null +++ b/arch/xtensa/include/esp32/freertos/semphr.h @@ -0,0 +1,1118 @@ +/* + FreeRTOS V8.2.0 - Copyright (C) 2015 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 SEMAPHORE_H +#define SEMAPHORE_H + +#ifndef INC_FREERTOS_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 ) + +/** @cond */ +/** + * This old vSemaphoreCreateBinary() macro is now deprecated in favour of the + * xSemaphoreCreateBinary() function. Note that binary semaphores created using + * the vSemaphoreCreateBinary() macro are created in a state such that the + * first call to 'take' the semaphore would pass, whereas binary semaphores + * created using xSemaphoreCreateBinary() are created in a state such that the + * the semaphore must first be 'given' before it can be 'taken'. + * + * Macro that implements a semaphore by using the existing queue mechanism. + * The queue length is 1 as this is a binary semaphore. The data size is 0 + * as we don't want to actually store any data - we just want to know if the + * queue is empty or full. + * + * This type of semaphore can be used for pure synchronisation between tasks or + * between an interrupt and a task. The semaphore need not be given back once + * obtained, so one task/interrupt can continuously 'give' the semaphore while + * another continuously 'takes' the semaphore. For this reason this type of + * semaphore does not use a priority inheritance mechanism. For an alternative + * that does use priority inheritance see xSemaphoreCreateMutex(). + * + * @param xSemaphore Handle to the created semaphore. Should be of type SemaphoreHandle_t. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore = NULL; + * + * 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 ) + * { + * // The semaphore was created successfully. + * // The semaphore can now be used. + * } + * } + * @endcode + * \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 ) ); \ + } \ + } +#endif +/** @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 + * + * 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 + * 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. + * + * The old vSemaphoreCreateBinary() macro is now deprecated in favour of this + * xSemaphoreCreateBinary() function. Note that binary semaphores created using + * the vSemaphoreCreateBinary() macro are created in a state such that the + * first call to 'take' the semaphore would pass, whereas binary semaphores + * created using xSemaphoreCreateBinary() are created in a state such that the + * the semaphore must first be 'given' before it can be 'taken'. + * + * Function that creates a semaphore by using the existing queue mechanism. + * The queue length is 1 as this is a binary semaphore. The data size is 0 + * as nothing is actually stored - all that is important is whether the queue is + * empty or full (the binary semaphore is available or not). + * + * This type of semaphore can be used for pure synchronisation between tasks or + * between an interrupt and a task. The semaphore need not be given back once + * obtained, so one task/interrupt can continuously 'give' the semaphore while + * another continuously 'takes' the semaphore. For this reason this type of + * semaphore does not use a priority inheritance mechanism. For an alternative + * that does use priority inheritance see xSemaphoreCreateMutex(). + * + * @return Handle to the created semaphore. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore = NULL; + * + * 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 ) + * { + * // The semaphore was created successfully. + * // The semaphore can now be used. + * } + * } + * @endcode + * \ingroup Semaphores + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xSemaphoreCreateBinary() xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ) +#endif + +/** + * 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 + * + * 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 + * 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. + * + * This type of semaphore can be used for pure synchronisation between tasks or + * between an interrupt and a task. The semaphore need not be given back once + * obtained, so one task/interrupt can continuously 'give' the semaphore while + * another continuously 'takes' the semaphore. For this reason this type of + * semaphore does not use a priority inheritance mechanism. For an alternative + * that does use priority inheritance see xSemaphoreCreateMutex(). + * + * @param pxStaticSemaphore Must point to a variable of type StaticSemaphore_t, + * which will then be used to hold the semaphore's data structure, removing the + * need for the memory to be allocated dynamically. + * + * @return If the semaphore is created then a handle to the created semaphore is + * returned. If pxSemaphoreBuffer is NULL then NULL is returned. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore = NULL; + * StaticSemaphore_t xSemaphoreBuffer; + * + * void vATask( void * pvParameters ) + * { + * // Semaphore cannot be used before a call to xSemaphoreCreateBinary(). + * // 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 = xSemaphoreCreateBinary( &xSemaphoreBuffer ); + * + * // Rest of task code goes here. + * } + * @endcode + * \ingroup Semaphores + */ +#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 */ + +/** + * Macro to obtain a semaphore. The semaphore must have previously been + * created with a call to vSemaphoreCreateBinary(), xSemaphoreCreateMutex() or + * xSemaphoreCreateCounting(). + * + * @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 + * 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 + * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h). + * + * @return pdTRUE if the semaphore was obtained. pdFALSE + * if xBlockTime expired without the semaphore becoming available. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore = NULL; + * + * // 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 ) + * { + * // 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 + * \ingroup Semaphores + */ +#define xSemaphoreTake( xSemaphore, xBlockTime ) xQueueGenericReceive( ( QueueHandle_t ) ( xSemaphore ), NULL, ( xBlockTime ), pdFALSE ) + +/** + * Macro to recursively obtain, or 'take', a mutex type semaphore. + * The mutex must have previously been created using a call to + * xSemaphoreCreateRecursiveMutex(); + * + * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this + * macro to be available. + * + * This macro must not be used on mutexes created using xSemaphoreCreateMutex(). + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * @param xMutex A handle to the mutex being obtained. This is the + * handle returned by xSemaphoreCreateRecursiveMutex(); + * + * @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. If + * the task already owns the semaphore then xSemaphoreTakeRecursive() will + * return immediately no matter what the value of xBlockTime. + * + * @return pdTRUE if the semaphore was obtained. pdFALSE if xBlockTime + * expired without the semaphore becoming available. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xMutex = NULL; + * + * // 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 ) + * { + * // 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 + * \ingroup Semaphores + */ +#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 + * preferred fully featured API too. The fully featured API has more + * 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 ) +/** @endcond */ + +/** + * Macro to release a semaphore. The semaphore must have previously been + * created with a call to vSemaphoreCreateBinary(), xSemaphoreCreateMutex() or + * xSemaphoreCreateCounting(). and obtained using sSemaphoreTake(). + * + * This macro must not be used from an ISR. See xSemaphoreGiveFromISR () for + * an alternative which can be used from an ISR. + * + * This macro must also not be used on semaphores created using + * xSemaphoreCreateRecursiveMutex(). + * + * @param xSemaphore A handle to the semaphore being released. This is the + * handle returned when the semaphore was created. + * + * @return pdTRUE if the semaphore was released. pdFALSE if an error occurred. + * Semaphores are implemented using queues. An error can occur if there is + * no space on the queue to post a message - indicating that the + * semaphore was not first obtained correctly. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore = NULL; + * + * void vATask( void * pvParameters ) + * { + * // Create the semaphore to guard a shared resource. + * vSemaphoreCreateBinary( xSemaphore ); + * + * 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. + * + * // ... + * + * // 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 + * \ingroup Semaphores + */ +#define xSemaphoreGive( xSemaphore ) xQueueGenericSend( ( QueueHandle_t ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK ) + +/** + * Macro to recursively release, or 'give', a mutex type semaphore. + * The mutex must have previously been created using a call to + * xSemaphoreCreateRecursiveMutex(); + * + * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this + * macro to be available. + * + * This macro must not be used on mutexes created using xSemaphoreCreateMutex(). + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * @param xMutex A handle to the mutex being released, or 'given'. This is the + * handle returned by xSemaphoreCreateMutex(); + * + * @return pdTRUE if the semaphore was given. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xMutex = NULL; + * + * // 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 ) + * { + * // 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 + * \ingroup Semaphores + */ +#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 + * preferred fully featured API too. The fully featured API has more + * 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 ) + +/** @endcond */ + +/** + * Macro to release a semaphore. The semaphore must have previously been + * created with a call to vSemaphoreCreateBinary() or xSemaphoreCreateCounting(). + * + * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex()) + * must not be used with this macro. + * + * This macro can be used from an ISR. + * + * @param xSemaphore A handle to the semaphore being released. This is the + * handle returned when the semaphore was created. + * + * @param[out] pxHigherPriorityTaskWoken xSemaphoreGiveFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if giving the semaphore caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xSemaphoreGiveFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the semaphore was successfully given, otherwise errQUEUE_FULL. + * + * Example usage: + * @code{c} + * \#define LONG_TIME 0xffff + * \#define TICKS_TO_WAIT 10 + * SemaphoreHandle_t xSemaphore = NULL; + * + * // Repetitive task. + * void vATask( void * pvParameters ) + * { + * for( ;; ) + * { + * // 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. + * + * // ... + * + * // 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; + * } + * + * 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. + * } + * } + * @endcode + * \ingroup Semaphores + */ +#define xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueGiveFromISR( ( QueueHandle_t ) ( xSemaphore ), ( pxHigherPriorityTaskWoken ) ) + +/** + * Macro to take a semaphore from an ISR. The semaphore must have + * previously been created with a call to vSemaphoreCreateBinary() or + * xSemaphoreCreateCounting(). + * + * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex()) + * must not be used with this macro. + * + * This macro can be used from an ISR, however taking a semaphore from an ISR + * is not a common operation. It is likely to only be useful when taking a + * counting semaphore when an interrupt is obtaining an object from a resource + * pool (when the semaphore count indicates the number of resources available). + * + * @param xSemaphore A handle to the semaphore being taken. This is the + * handle returned when the semaphore was created. + * + * @param[out] pxHigherPriorityTaskWoken xSemaphoreTakeFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if taking the semaphore caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xSemaphoreTakeFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the semaphore was successfully taken, otherwise + * pdFALSE + */ +#define xSemaphoreTakeFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueReceiveFromISR( ( QueueHandle_t ) ( xSemaphore ), NULL, ( pxHigherPriorityTaskWoken ) ) + +/** + * Macro that implements a mutex semaphore by using the existing queue + * mechanism. + * + * 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 + * xSemaphoreCreateMutexStatic() then the application writer must provided the + * memory. xSemaphoreCreateMutexStatic() therefore allows a mutex to be created + * without using any dynamic memory allocation. + * + * Mutexes created using this function can be accessed using the xSemaphoreTake() + * and xSemaphoreGive() macros. The xSemaphoreTakeRecursive() and + * xSemaphoreGiveRecursive() macros must not be used. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See vSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @return If the mutex was successfully created then a handle to the created + * semaphore is returned. If there was not enough heap to allocate the mutex + * data structures then NULL is returned. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore; + * + * 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 ) + * { + * // The semaphore was created successfully. + * // The semaphore can now be used. + * } + * } + * @endcode + * \ingroup Semaphores + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xSemaphoreCreateMutex() xQueueCreateMutex( queueQUEUE_TYPE_MUTEX ) +#endif + +/** + * 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 + * xSemaphoreCreateMutexStatic() then the application writer must provided the + * memory. xSemaphoreCreateMutexStatic() therefore allows a mutex to be created + * without using any dynamic memory allocation. + * + * Mutexes created using this function can be accessed using the xSemaphoreTake() + * and xSemaphoreGive() macros. The xSemaphoreTakeRecursive() and + * xSemaphoreGiveRecursive() macros must not be used. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See xSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @param pxMutexBuffer Must point to a variable of type StaticSemaphore_t, + * which will be used to hold the mutex's data structure, removing the need for + * the memory to be allocated dynamically. + * + * @return If the mutex was successfully created then a handle to the created + * mutex is returned. If pxMutexBuffer was NULL then NULL is returned. + * + * Example usage: + * @code + * 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 ); + * + * // As no dynamic memory allocation was performed, xSemaphore cannot be NULL, + * // so there is no need to check it. + * } + * @endcode + * \ingroup Semaphores + */ + #if( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xSemaphoreCreateMutexStatic( pxMutexBuffer ) xQueueCreateMutexStatic( queueQUEUE_TYPE_MUTEX, ( pxMutexBuffer ) ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + + +/** + * Creates a new recursive mutex type semaphore instance, and returns a handle + * by which the new recursive mutex can be referenced. + * + * Internally, within the FreeRTOS implementation, recursive mutexs use a block + * of memory, in which the mutex structure is stored. If a recursive mutex is + * 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 + * xSemaphoreCreateRecursiveMutexStatic() then the application writer must + * provide the memory that will get used by the mutex. + * xSemaphoreCreateRecursiveMutexStatic() therefore allows a recursive mutex to + * be created without using any dynamic memory allocation. + * + * Mutexes created using this macro can be accessed using the + * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros. The + * xSemaphoreTake() and xSemaphoreGive() macros must not be used. + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See vSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @return xSemaphore Handle to the created mutex semaphore. Should be of type + * SemaphoreHandle_t. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore; + * + * void vATask( void * pvParameters ) + * { + * // Semaphore cannot be used before a call to xSemaphoreCreateMutex(). + * // This is a macro so pass the variable in directly. + * xSemaphore = xSemaphoreCreateRecursiveMutex(); + * + * if( xSemaphore != NULL ) + * { + * // The semaphore was created successfully. + * // The semaphore can now be used. + * } + * } + * @endcode + * \ingroup Semaphores + */ +#if( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configUSE_RECURSIVE_MUTEXES == 1 ) ) + #define xSemaphoreCreateRecursiveMutex() xQueueCreateMutex( queueQUEUE_TYPE_RECURSIVE_MUTEX ) +#endif + +/** + * Creates a new recursive mutex type semaphore instance, and returns a handle + * by which the new recursive mutex can be referenced. + * + * Internally, within the FreeRTOS implementation, recursive mutexs use a block + * of memory, in which the mutex structure is stored. If a recursive mutex is + * 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 + * xSemaphoreCreateRecursiveMutexStatic() then the application writer must + * provide the memory that will get used by the mutex. + * xSemaphoreCreateRecursiveMutexStatic() therefore allows a recursive mutex to + * be created without using any dynamic memory allocation. + * + * Mutexes created using this macro can be accessed using the + * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros. The + * xSemaphoreTake() and xSemaphoreGive() macros must not be used. + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See xSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @param pxStaticSemaphore Must point to a variable of type StaticSemaphore_t, + * which will then be used to hold the recursive mutex's data structure, + * removing the need for the memory to be allocated dynamically. + * + * @return If the recursive mutex was successfully created then a handle to the + * created recursive mutex is returned. If pxMutexBuffer was NULL then NULL is + * returned. + * + * Example usage: + * @code + * SemaphoreHandle_t xSemaphore; + * StaticSemaphore_t xMutexBuffer; + * + * void vATask( void * pvParameters ) + * { + * // A recursive semaphore cannot be used before it is created. Here a + * // recursive mutex is created using xSemaphoreCreateRecursiveMutexStatic(). + * // The address of xMutexBuffer is passed into the function, and will hold + * // the mutexes data structures - so no dynamic memory allocation will be + * // attempted. + * xSemaphore = xSemaphoreCreateRecursiveMutexStatic( &xMutexBuffer ); + * + * // As no dynamic memory allocation was performed, xSemaphore cannot be NULL, + * // so there is no need to check it. + * } + * @endcode + * \ingroup Semaphores + */ +#if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configUSE_RECURSIVE_MUTEXES == 1 ) ) + #define xSemaphoreCreateRecursiveMutexStatic( pxStaticSemaphore ) xQueueCreateMutexStatic( queueQUEUE_TYPE_RECURSIVE_MUTEX, pxStaticSemaphore ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * 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 + * + * 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 + * 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 + * semaphore to be created without using any dynamic memory allocation. + * + * Counting semaphores are typically used for two things: + * + * 1) Counting events. + * + * In this usage scenario an event handler will 'give' a semaphore each time + * an event occurs (incrementing the semaphore count value), and a handler + * task will 'take' a semaphore each time it processes an event + * (decrementing the semaphore count value). The count value is therefore + * the difference between the number of events that have occurred and the + * number that have been processed. In this case it is desirable for the + * initial count value to be zero. + * + * 2) Resource management. + * + * In this usage scenario the count value indicates the number of resources + * available. To obtain control of a resource a task must first obtain a + * semaphore - decrementing the semaphore count value. When the count value + * reaches zero there are no free resources. When a task finishes with the + * resource it 'gives' the semaphore back - incrementing the semaphore count + * value. In this case it is desirable for the initial count value to be + * equal to the maximum count value, indicating that all resources are free. + * + * @param uxMaxCount The maximum count value that can be reached. When the + * semaphore reaches this value it can no longer be 'given'. + * + * @param uxInitialCount The count value assigned to the semaphore when it is + * created. + * + * @return Handle to the created semaphore. Null if the semaphore could not be + * created. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore; + * + * 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 ) + * { + * // The semaphore was created successfully. + * // The semaphore can now be used. + * } + * } + * @endcode + * \ingroup Semaphores + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xSemaphoreCreateCounting( uxMaxCount, uxInitialCount ) xQueueCreateCountingSemaphore( ( uxMaxCount ), ( uxInitialCount ) ) +#endif + +/** + * 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 + * + * 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 + * 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. + * + * Counting semaphores are typically used for two things: + * + * 1) Counting events. + * + * In this usage scenario an event handler will 'give' a semaphore each time + * an event occurs (incrementing the semaphore count value), and a handler + * task will 'take' a semaphore each time it processes an event + * (decrementing the semaphore count value). The count value is therefore + * the difference between the number of events that have occurred and the + * number that have been processed. In this case it is desirable for the + * initial count value to be zero. + * + * 2) Resource management. + * + * In this usage scenario the count value indicates the number of resources + * available. To obtain control of a resource a task must first obtain a + * semaphore - decrementing the semaphore count value. When the count value + * reaches zero there are no free resources. When a task finishes with the + * resource it 'gives' the semaphore back - incrementing the semaphore count + * value. In this case it is desirable for the initial count value to be + * equal to the maximum count value, indicating that all resources are free. + * + * @param uxMaxCount The maximum count value that can be reached. When the + * semaphore reaches this value it can no longer be 'given'. + * + * @param uxInitialCount The count value assigned to the semaphore when it is + * created. + * + * @param pxSemaphoreBuffer Must point to a variable of type StaticSemaphore_t, + * which will then be used to hold the semaphore's data structure, removing the + * need for the memory to be allocated dynamically. + * + * @return If the counting semaphore was successfully created then a handle to + * the created counting semaphore is returned. If pxSemaphoreBuffer was NULL + * then NULL is returned. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore; + * StaticSemaphore_t xSemaphoreBuffer; + * + * 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 ); + * + * // No memory allocation was attempted so xSemaphore cannot be NULL, so there + * // is no need to check its value. + * } + * @endcode + * \ingroup Semaphores + */ +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xSemaphoreCreateCountingStatic( uxMaxCount, uxInitialCount, pxSemaphoreBuffer ) xQueueCreateCountingSemaphoreStatic( ( uxMaxCount ), ( uxInitialCount ), ( pxSemaphoreBuffer ) ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * 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. + * + * \ingroup Semaphores + */ +#define vSemaphoreDelete( xSemaphore ) vQueueDelete( ( QueueHandle_t ) ( xSemaphore ) ) + +/** + * 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. + * + * 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 function exiting and the returned value + * being tested. + */ +#define xSemaphoreGetMutexHolder( xSemaphore ) xQueueGetMutexHolder( ( xSemaphore ) ) + +/** + * If the semaphore is a counting semaphore then uxSemaphoreGetCount() returns + * its current count value. If the semaphore is a binary semaphore then + * uxSemaphoreGetCount() returns 1 if the semaphore is available, and 0 if the + * semaphore is not available. + * + */ +#define uxSemaphoreGetCount( xSemaphore ) uxQueueMessagesWaiting( ( QueueHandle_t ) ( xSemaphore ) ) + +#endif /* SEMAPHORE_H */ + + diff --git a/arch/xtensa/include/esp32/freertos/task.h b/arch/xtensa/include/esp32/freertos/task.h new file mode 100644 index 0000000000000..d7836c664d74b --- /dev/null +++ b/arch/xtensa/include/esp32/freertos/task.h @@ -0,0 +1,2317 @@ +/* + FreeRTOS V8.2.0 - Copyright (C) 2015 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 INC_TASK_H +#define INC_TASK_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include task.h" +#endif + +#include + +#include "list.h" +#include "portmacro.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * MACROS AND DEFINITIONS + *----------------------------------------------------------*/ + +#define tskKERNEL_VERSION_NUMBER "V8.2.0" +#define tskKERNEL_VERSION_MAJOR 8 +#define tskKERNEL_VERSION_MINOR 2 +#define tskKERNEL_VERSION_BUILD 0 + +/** + * @brief Argument of xTaskCreatePinnedToCore indicating that task has no affinity + */ +#define tskNO_AFFINITY INT_MAX + +/** + * 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. + * + * \ingroup Tasks + */ +typedef void * TaskHandle_t; + +/** + * Defines the prototype to which the application task hook function must + * conform. + */ +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. */ +} 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. */ +} eNotifyAction; + +/** @cond */ +/** + * Used internally only. + */ +typedef struct xTIME_OUT +{ + BaseType_t xOverflowCount; + TickType_t xTimeOnEntering; +} TimeOut_t; + +/** + * Defines the memory ranges allocated to the task when an MPU is used. + */ +typedef struct xMEMORY_REGION +{ + void *pvBaseAddress; + uint32_t ulLengthInBytes; + uint32_t ulParameters; +} MemoryRegion_t; + +/** + * Parameters required to create an MPU protected task. + */ +typedef struct xTASK_PARAMETERS +{ + TaskFunction_t pvTaskCode; + const char * const pcName; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + uint32_t usStackDepth; + void *pvParameters; + UBaseType_t uxPriority; + StackType_t *puxStackBuffer; + MemoryRegion_t xRegions[ portNUM_CONFIGURABLE_REGIONS ]; +} TaskParameters_t; +/** @endcond */ + +/** + * Used with the uxTaskGetSystemState() function to return the state of each task in the system. +*/ +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. */ + uint32_t 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. */ +#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; + +/** + * Possible return values for eTaskConfirmSleepModeStatus(). + */ +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. */ +} eSleepModeStatus; + + +/** + * Defines the priority used by the idle task. This must not be modified. + * + * \ingroup TaskUtils + */ +#define tskIDLE_PRIORITY ( ( UBaseType_t ) 0U ) + +/** + * task. h + * + * Macro for forcing a context switch. + * + * \ingroup SchedulerControl + */ +#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! + * + * \ingroup SchedulerControl + */ +#ifdef _ESP_FREERTOS_INTERNAL +#define taskENTER_CRITICAL(mux) portENTER_CRITICAL(mux) +#else +#define taskENTER_CRITICAL(mux) _Pragma("GCC warning \"'taskENTER_CRITICAL(mux)' is deprecated in ESP-IDF, consider using 'portENTER_CRITICAL(mux)'\"") portENTER_CRITICAL(mux) +#endif +#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! + * + * \ingroup SchedulerControl + */ +#ifdef _ESP_FREERTOS_INTERNAL +#define taskEXIT_CRITICAL(mux) portEXIT_CRITICAL(mux) +#else +#define taskEXIT_CRITICAL(mux) _Pragma("GCC warning \"'taskEXIT_CRITICAL(mux)' is deprecated in ESP-IDF, consider using 'portEXIT_CRITICAL(mux)'\"") portEXIT_CRITICAL(mux) +#endif +#define taskEXIT_CRITICAL_ISR(mux) portEXIT_CRITICAL_ISR(mux) + +/** + * task. h + * + * Macro to disable all maskable interrupts. + * + * \ingroup SchedulerControl + */ +#define taskDISABLE_INTERRUPTS() portDISABLE_INTERRUPTS() + +/** + * task. h + * + * Macro to enable microcontroller interrupts. + * + * \ingroup SchedulerControl + */ +#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 ) + + +/*----------------------------------------------------------- + * TASK CREATION API + *----------------------------------------------------------*/ + +/** + * Create a new task with a specified affinity. + * + * This function is similar to xTaskCreate, but allows setting task affinity + * in SMP system. + * + * @param pvTaskCode Pointer to the task entry function. Tasks + * must be implemented to never return (i.e. continuous loop). + * + * @param pcName A descriptive name for the task. This is mainly used to + * facilitate debugging. Max length defined by configMAX_TASK_NAME_LEN - default + * is 16. + * + * @param usStackDepth The size of the task stack specified as the number of + * bytes. Note that this differs from vanilla FreeRTOS. + * + * @param pvParameters Pointer that will be used as the parameter for the task + * being created. + * + * @param uxPriority The priority at which the task should run. Systems that + * include MPU support can optionally create tasks in a privileged (system) + * mode by setting bit portPRIVILEGE_BIT of the priority parameter. For + * example, to create a privileged task at priority 2 the uxPriority parameter + * should be set to ( 2 | portPRIVILEGE_BIT ). + * + * @param pvCreatedTask Used to pass back a handle by which the created task + * can be referenced. + * + * @param xCoreID If the value is tskNO_AFFINITY, the created task is not + * pinned to any CPU, and the scheduler can run it on any core available. + * Values 0 or 1 indicate the index number of the CPU which the task should + * be pinned to. Specifying values larger than (portNUM_PROCESSORS - 1) will + * cause the function to fail. + * + * @return pdPASS if the task was successfully created and added to a ready + * list, otherwise an error code defined in the file projdefs.h + * + * \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); + +#endif + +/** + * Create a new task and add it to the list of tasks that are ready to run. + * + * Internally, within the FreeRTOS implementation, tasks use two blocks of + * memory. The first block is used to hold the task's data structures. The + * 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 + * xTaskCreateStatic() then the application writer must provide the required + * memory. xTaskCreateStatic() therefore allows a task to be created without + * using any dynamic memory allocation. + * + * See xTaskCreateStatic() for a version that does not use any dynamic memory + * allocation. + * + * xTaskCreate() can only be used to create a task that has unrestricted + * access to the entire microcontroller memory map. Systems that include MPU + * support can alternatively create an MPU constrained task using + * xTaskCreateRestricted(). + * + * @param pvTaskCode Pointer to the task entry function. Tasks + * must be implemented to never return (i.e. continuous loop). + * + * @param pcName A descriptive name for the task. This is mainly used to + * facilitate debugging. Max length defined by configMAX_TASK_NAME_LEN - default + * is 16. + * + * @param usStackDepth The size of the task stack specified as the number of + * bytes. Note that this differs from vanilla FreeRTOS. + * + * @param pvParameters Pointer that will be used as the parameter for the task + * being created. + * + * @param uxPriority The priority at which the task should run. Systems that + * include MPU support can optionally create tasks in a privileged (system) + * mode by setting bit portPRIVILEGE_BIT of the priority parameter. For + * example, to create a privileged task at priority 2 the uxPriority parameter + * should be set to ( 2 | portPRIVILEGE_BIT ). + * + * @param pvCreatedTask 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 + * list, otherwise an error code defined in the file projdefs.h + * + * @note If program uses thread local variables (ones specified with "__thread" keyword) + * then storage for them will be allocated on the task's stack. + * + * Example usage: + * @code{c} + * // 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; + * + * // 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 ); + * + * // Use the handle to delete the task. + * if( xHandle != NULL ) + * { + * vTaskDelete( xHandle ); + * } + * } + * @endcode + * \ingroup Tasks + */ + +#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 ); + } + +#endif + + + + +/** + * Create a new task with a specified affinity. + * + * This function is similar to xTaskCreateStatic, but allows specifying + * task affinity in an SMP system. + * + * @param pvTaskCode Pointer to the task entry function. Tasks + * must be implemented to never return (i.e. continuous loop). + * + * @param pcName A descriptive name for the task. This is mainly used to + * facilitate debugging. The maximum length of the string is defined by + * configMAX_TASK_NAME_LEN in FreeRTOSConfig.h. + * + * @param ulStackDepth The size of the task stack specified as the number of + * bytes. Note that this differs from vanilla FreeRTOS. + * + * @param pvParameters Pointer that will be used as the parameter for the task + * being created. + * + * @param uxPriority The priority at which the task will run. + * + * @param pxStackBuffer Must point to a StackType_t array that has at least + * ulStackDepth indexes - the array will then be used as the task's stack, + * removing the need for the stack to be allocated dynamically. + * + * @param pxTaskBuffer Must point to a variable of type StaticTask_t, which will + * then be used to hold the task's data structures, removing the need for the + * memory to be allocated dynamically. + * + * @param xCoreID If the value is tskNO_AFFINITY, the created task is not + * pinned to any CPU, and the scheduler can run it on any core available. + * Values 0 or 1 indicate the index number of the CPU which the task should + * be pinned to. Specifying values larger than (portNUM_PROCESSORS - 1) will + * cause the function to fail. + * + * @return If neither pxStackBuffer or pxTaskBuffer are NULL, then the task will + * be created and a task handle will be returned by which the created task + * can be referenced. If either pxStackBuffer or pxTaskBuffer + * are NULL then the task will not be created and NULL is returned. + * + * \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 ); +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * Create a new task and add it to the list of tasks that are ready to run. + * + * Internally, within the FreeRTOS implementation, tasks use two blocks of + * memory. The first block is used to hold the task's data structures. The + * 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 + * xTaskCreateStatic() then the application writer must provide the required + * memory. xTaskCreateStatic() therefore allows a task to be created without + * using any dynamic memory allocation. + * + * @param pvTaskCode Pointer to the task entry function. Tasks + * must be implemented to never return (i.e. continuous loop). + * + * @param pcName A descriptive name for the task. This is mainly used to + * facilitate debugging. The maximum length of the string is defined by + * configMAX_TASK_NAME_LEN in FreeRTOSConfig.h. + * + * @param ulStackDepth The size of the task stack specified as the number of + * bytes. Note that this differs from vanilla FreeRTOS. + * + * @param pvParameters Pointer that will be used as the parameter for the task + * being created. + * + * @param uxPriority The priority at which the task will run. + * + * @param pxStackBuffer Must point to a StackType_t array that has at least + * ulStackDepth indexes - the array will then be used as the task's stack, + * removing the need for the stack to be allocated dynamically. + * + * @param pxTaskBuffer Must point to a variable of type StaticTask_t, which will + * then be used to hold the task's data structures, removing the need for the + * memory to be allocated dynamically. + * + * @return If neither pxStackBuffer or pxTaskBuffer are NULL, then the task will + * be created and a task handle will be returned by which the created task + * can be referenced. If either pxStackBuffer or pxTaskBuffer + * are NULL then the task will not be created and NULL is returned. + * + * @note If program uses thread local variables (ones specified with "__thread" keyword) + * then storage for them will be allocated on the task's stack. + * + * 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 + * + * // 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 ]; + * + * // 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. + * } + * } + * + * // 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. + * + * // 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 ); + } +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** @cond */ +/** + * xTaskCreateRestricted() should only be used in systems that include an MPU + * implementation. + * + * Create a new task and add it to the list of tasks that are ready to run. + * The function parameters define the memory regions and associated access + * permissions allocated to the task. + * + * @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 + * can be referenced. + * + * @return pdPASS if the task was successfully created and added to a ready + * list, otherwise an error code defined in the file projdefs.h + * + * Example usage: + * @code{c} + * // 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 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 } + * } + * }; + * + * 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 ); + * + * // Start the scheduler. + * vTaskStartScheduler(); + * + * // Will only get here if there was insufficient memory to create the idle + * // and/or timer task. + * for( ;; ); + * } + * @endcode + * \ingroup Tasks + */ +#if( portUSING_MPU_WRAPPERS == 1 ) + BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ) PRIVILEGED_FUNCTION; +#endif + + +/** + * 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 xRegions 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 + * // ucOneKByte array. The other two of the maximum 3 definable regions are + * // 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 } + * }; + * + * 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 ); + * + * // 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 + * \ingroup Tasks + */ +void vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const pxRegions ) PRIVILEGED_FUNCTION; + +/** @endcond */ + +/** + * 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. + * + * INCLUDE_vTaskDelete must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * @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 + * application makes any calls to vTaskDelete (). Memory allocated by the + * task code is not automatically freed, and should be freed before the task + * is deleted. + * + * See the demo application file death.c for sample code that utilises + * vTaskDelete (). + * + * @param xTaskToDelete The handle of the task to be deleted. Passing NULL will + * cause the calling task to be deleted. + * + * Example usage: + * @code{c} + * void vOtherFunction( void ) + * { + * TaskHandle_t 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 ); + * } + * @endcode + * \ingroup Tasks + */ +void vTaskDelete( TaskHandle_t xTaskToDelete ) PRIVILEGED_FUNCTION; + +/*----------------------------------------------------------- + * TASK CONTROL API + *----------------------------------------------------------*/ + +/** + * Delay a task for a given number of ticks. + * + * The actual time that the task remains blocked depends on the tick rate. + * The constant portTICK_PERIOD_MS can be used to calculate real time from + * the tick rate - with the resolution of one tick period. + * + * 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 + * vTaskDelay() is called. vTaskDelay() does not therefore provide a good method + * of controlling the frequency of a periodic task as the path taken through the + * code, as well as other task and interrupt activity, will effect the frequency + * at which vTaskDelay() gets called and therefore the time at which the task + * next executes. See vTaskDelayUntil() for an alternative API function designed + * to facilitate fixed frequency execution. It does this by specifying an + * absolute time (rather than a relative time) at which the calling task should + * unblock. + * + * @param xTicksToDelay The amount of time, in tick periods, that + * the calling task should block. + * + * Example usage: + * @code{c} + * 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 ); + * } + * } + * @endcode + * \ingroup TaskCtrl + */ +void vTaskDelay( const TickType_t xTicksToDelay ) PRIVILEGED_FUNCTION; + +/** + * Delay a task until a specified time. + * + * INCLUDE_vTaskDelayUntil must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * This function can be used by periodic tasks to ensure a constant execution frequency. + * + * This function differs from vTaskDelay () in one important aspect: vTaskDelay () will + * cause a task to block for the specified number of ticks from the time vTaskDelay () is + * called. It is therefore difficult to use vTaskDelay () by itself to generate a fixed + * execution frequency as the time between a task starting to execute and that task + * calling vTaskDelay () may not be fixed [the task may take a different path though the + * code between calls, or may get interrupted or preempted a different number of times + * each time it executes]. + * + * Whereas vTaskDelay () specifies a wake time relative to the time at which the function + * is called, vTaskDelayUntil () specifies the absolute (exact) time at which it wishes to + * unblock. + * + * The constant portTICK_PERIOD_MS can be used to calculate real time from the tick + * rate - with the resolution of one tick period. + * + * @param pxPreviousWakeTime Pointer to a variable that holds the time at which the + * task was last unblocked. The variable must be initialised with the current time + * prior to its first use (see the example below). Following this the variable is + * automatically updated within vTaskDelayUntil (). + * + * @param xTimeIncrement The cycle time period. The task will be unblocked at + * time *pxPreviousWakeTime + xTimeIncrement. Calling vTaskDelayUntil with the + * same xTimeIncrement parameter value will cause the task to execute with + * a fixed interface period. + * + * Example usage: + * @code{c} + * // 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 ); + * + * // Perform action here. + * } + * } + * @endcode + * \ingroup TaskCtrl + */ +void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement ) PRIVILEGED_FUNCTION; + +/** + * Obtain the priority of any task. + * + * INCLUDE_uxTaskPriorityGet must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * @param xTask Handle of the task to be queried. Passing a NULL + * handle results in the priority of the calling task being returned. + * + * @return The priority of xTask. + * + * Example usage: + * @code{c} + * void vAFunction( void ) + * { + * TaskHandle_t xHandle; + * + * // Create a task, storing the handle. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); + * + * // ... + * + * // Use the handle to obtain the priority of the created task. + * // It was created with tskIDLE_PRIORITY, but may have changed + * // it itself. + * if( uxTaskPriorityGet( xHandle ) != tskIDLE_PRIORITY ) + * { + * // The task has changed it's priority. + * } + * + * // ... + * + * // Is our priority higher than the created task? + * if( uxTaskPriorityGet( xHandle ) < uxTaskPriorityGet( NULL ) ) + * { + * // Our priority (obtained using NULL handle) is higher. + * } + * } + * @endcode + * \ingroup TaskCtrl + */ +UBaseType_t uxTaskPriorityGet( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * A version of uxTaskPriorityGet() that can be used from an ISR. + * + * @param xTask Handle of the task to be queried. Passing a NULL + * handle results in the priority of the calling task being returned. + * + * @return The priority of xTask. + * + */ +UBaseType_t uxTaskPriorityGetFromISR( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * Obtain the state of any task. + * + * States are encoded by the eTaskState enumerated type. + * + * INCLUDE_eTaskGetState must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * @param xTask Handle of the task to be queried. + * + * @return The state of xTask at the time the function was called. Note the + * state of the task might change between the function being called, and the + * functions return value being tested by the calling task. + */ +eTaskState eTaskGetState( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * Set the priority of any task. + * + * INCLUDE_vTaskPrioritySet must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * A context switch will occur before the function returns if the priority + * being set is higher than the currently executing task. + * + * @param xTask Handle to the task for which the priority is being set. + * Passing a NULL handle results in the priority of the calling task being set. + * + * @param uxNewPriority The priority to which the task will be set. + * + * Example usage: + * @code{c} + * void vAFunction( void ) + * { + * TaskHandle_t xHandle; + * + * // Create a task, storing the handle. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); + * + * // ... + * + * // Use the handle to raise the priority of the created task. + * vTaskPrioritySet( xHandle, tskIDLE_PRIORITY + 1 ); + * + * // ... + * + * // Use a NULL handle to raise our priority to the same value. + * vTaskPrioritySet( NULL, tskIDLE_PRIORITY + 1 ); + * } + * @endcode + * \ingroup TaskCtrl + */ +void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority ) PRIVILEGED_FUNCTION; + +/** + * Suspend a task. + * + * INCLUDE_vTaskSuspend must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * When suspended, a task will never get any microcontroller processing time, + * no matter what its priority. + * + * Calls to vTaskSuspend are not accumulative - + * i.e. calling vTaskSuspend () twice on the same task still only requires one + * call to vTaskResume () to ready the suspended task. + * + * @param xTaskToSuspend Handle to the task being suspended. Passing a NULL + * handle will cause the calling task to be suspended. + * + * Example usage: + * @code{c} + * void vAFunction( void ) + * { + * TaskHandle_t xHandle; + * + * // Create a task, storing the handle. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); + * + * // ... + * + * // Use the handle to suspend the created task. + * vTaskSuspend( xHandle ); + * + * // ... + * + * // The created task will not run during this period, unless + * // another task calls vTaskResume( xHandle ). + * + * //... + * + * + * // Suspend ourselves. + * vTaskSuspend( NULL ); + * + * // We cannot get here unless another task calls vTaskResume + * // with our handle as the parameter. + * } + * @endcode + * \ingroup TaskCtrl + */ +void vTaskSuspend( TaskHandle_t xTaskToSuspend ) PRIVILEGED_FUNCTION; + +/** + * Resumes a suspended task. + * + * INCLUDE_vTaskSuspend must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * 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 (). + * + * @param xTaskToResume Handle to the task being readied. + * + * Example usage: + * @code{c} + * void vAFunction( void ) + * { + * TaskHandle_t xHandle; + * + * // Create a task, storing the handle. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); + * + * // ... + * + * // Use the handle to suspend the created task. + * vTaskSuspend( xHandle ); + * + * // ... + * + * // The created task will not run during this period, unless + * // another task calls vTaskResume( xHandle ). + * + * //... + * + * + * // Resume the suspended task ourselves. + * vTaskResume( xHandle ); + * + * // The created task will once again get microcontroller processing + * // time in accordance with its priority within the system. + * } + * @endcode + * \ingroup TaskCtrl + */ +void vTaskResume( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION; + +/** + * An implementation of vTaskResume() that can be called from within an ISR. + * + * INCLUDE_xTaskResumeFromISR must be defined as 1 for this function to be + * available. See the configuration section for more information. + * + * 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 + * xTaskResumeFromISR (). + * + * xTaskResumeFromISR() should not be used to synchronise a task with an + * interrupt if there is a chance that the interrupt could arrive prior to the + * task being suspended - as this can lead to interrupts being missed. Use of a + * semaphore as a synchronisation mechanism would avoid this eventuality. + * + * @param xTaskToResume Handle to the task being readied. + * + * @return pdTRUE if resuming the task should result in a context switch, + * otherwise pdFALSE. This is used by the ISR to determine if a context switch + * may be required following the ISR. + * + * \ingroup TaskCtrl + */ +BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION; + +/*----------------------------------------------------------- + * SCHEDULER CONTROL + *----------------------------------------------------------*/ +/** @cond */ +/** + * Starts the real time kernel tick processing. + * + * After calling the kernel has control over which tasks are executed and when. + * + * See the demo application file main.c for an example of creating + * tasks and starting the kernel. + * + * Example usage: + * @code{c} + * void vAFunction( void ) + * { + * // Create at least one task before starting the kernel. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL ); + * + * // Start the real time kernel with preemption. + * vTaskStartScheduler (); + * + * // Will not get here unless a task calls vTaskEndScheduler () + * } + * @endcode + * + * \ingroup SchedulerControl + */ +void vTaskStartScheduler( void ) PRIVILEGED_FUNCTION; + +/** + * Stops the real time kernel tick. + * + * @note At the time of writing only the x86 real mode port, which runs on a PC + * in place of DOS, implements this function. + * + * All created tasks will be automatically deleted and multitasking + * (either preemptive or cooperative) will stop. + * Execution then resumes from the point where vTaskStartScheduler () + * was called, as if vTaskStartScheduler () had just returned. + * + * See the demo application file main. c in the demo/PC directory for an + * example that uses vTaskEndScheduler (). + * + * vTaskEndScheduler () requires an exit function to be defined within the + * portable layer (see vPortEndScheduler () in port. c for the PC port). This + * performs hardware specific operations such as stopping the kernel tick. + * + * vTaskEndScheduler () will cause all of the resources allocated by the + * kernel to be freed - but will not free resources allocated by application + * tasks. + * + * Example usage: + * @code{c} + * void vTaskCode( void * pvParameters ) + * { + * for( ;; ) + * { + * // Task code goes here. + * + * // At some point we want to end the real time kernel processing + * // so call ... + * vTaskEndScheduler (); + * } + * } + * + * void vAFunction( void ) + * { + * // Create at least one task before starting the kernel. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL ); + * + * // Start the real time kernel with preemption. + * vTaskStartScheduler (); + * + * // Will only get here when the vTaskCode () task has called + * // vTaskEndScheduler (). When we get here we are back to single task + * // execution. + * } + * @endcode + * \ingroup SchedulerControl + */ +void vTaskEndScheduler( void ) PRIVILEGED_FUNCTION; + +/** @endcond */ + +/** + * Suspends the scheduler without disabling interrupts. + * + * Context switches will not occur while the scheduler is suspended. + * + * After calling vTaskSuspendAll () the calling task will continue to execute + * without risk of being swapped out until a call to xTaskResumeAll () has been + * made. + * + * API functions that have the potential to cause a context switch (for example, + * vTaskDelayUntil(), xQueueSend(), etc.) must not be called while the scheduler + * is suspended. + * + * Example usage: + * @code{c} + * void vTask1( void * pvParameters ) + * { + * for( ;; ) + * { + * // Task code goes here. + * + * // ... + * + * // At some point the task wants to perform a long operation during + * // which it does not want to get swapped out. It cannot use + * // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the + * // operation may cause interrupts to be missed - including the + * // ticks. + * + * // Prevent the real time kernel swapping out the task. + * vTaskSuspendAll (); + * + * // Perform the operation here. There is no need to use critical + * // sections as we have all the microcontroller processing time. + * // During this time interrupts will still operate and the kernel + * // tick count will be maintained. + * + * // ... + * + * // The operation is complete. Restart the kernel. + * xTaskResumeAll (); + * } + * } + * @endcode + * \ingroup SchedulerControl + */ +void vTaskSuspendAll( void ) PRIVILEGED_FUNCTION; + +/** + * Resumes scheduler activity after it was suspended by a call to + * vTaskSuspendAll(). + * + * xTaskResumeAll() only resumes the scheduler. It does not unsuspend tasks + * 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. + * + * Example usage: + * @code{c} + * void vTask1( void * pvParameters ) + * { + * for( ;; ) + * { + * // Task code goes here. + * + * // ... + * + * // At some point the task wants to perform a long operation during + * // which it does not want to get swapped out. It cannot use + * // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the + * // operation may cause interrupts to be missed - including the + * // ticks. + * + * // Prevent the real time kernel swapping out the task. + * vTaskSuspendAll (); + * + * // Perform the operation here. There is no need to use critical + * // sections as we have all the microcontroller processing time. + * // During this time interrupts will still operate and the real + * // time kernel tick count will be maintained. + * + * // ... + * + * // The operation is complete. Restart the kernel. We want to force + * // a context switch - but there is no point if resuming the scheduler + * // caused a context switch already. + * if( !xTaskResumeAll () ) + * { + * taskYIELD (); + * } + * } + * } + * @endcode + * \ingroup SchedulerControl + */ +BaseType_t xTaskResumeAll( void ) PRIVILEGED_FUNCTION; + +/*----------------------------------------------------------- + * TASK UTILITIES + *----------------------------------------------------------*/ + +/** + * Get tick count + * + * @return The count of ticks since vTaskStartScheduler was called. + * + * \ingroup TaskUtils + */ +TickType_t xTaskGetTickCount( void ) PRIVILEGED_FUNCTION; + +/** + * Get tick count from ISR + * + * @return The count of ticks since vTaskStartScheduler was called. + * + * This is a version of xTaskGetTickCount() that is safe to be called from an + * ISR - provided that TickType_t is the natural word size of the + * microcontroller being used or interrupt nesting is either not supported or + * not being used. + * + * \ingroup TaskUtils + */ +TickType_t xTaskGetTickCountFromISR( void ) PRIVILEGED_FUNCTION; + +/** + * Get current number of tasks + * + * @return The number of tasks that the real time kernel is currently managing. + * This includes all ready, blocked and suspended tasks. A task that + * has been deleted but not yet freed by the idle task will also be + * included in the count. + * + * \ingroup TaskUtils + */ +UBaseType_t uxTaskGetNumberOfTasks( void ) PRIVILEGED_FUNCTION; + +/** + * Get task name + * + * @return The text (human readable) name of the task referenced by the handle + * xTaskToQuery. A task can query its own name by either passing in its own + * handle, or by setting xTaskToQuery to NULL. INCLUDE_pcTaskGetTaskName must be + * set to 1 in FreeRTOSConfig.h for pcTaskGetTaskName() to be available. + * + * \ingroup TaskUtils + */ +char *pcTaskGetTaskName( TaskHandle_t xTaskToQuery ) 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. + * + * INCLUDE_uxTaskGetStackHighWaterMark must be set to 1 in FreeRTOSConfig.h for + * this function to be available. + * + * High water mark is the minimum free stack space there has been (in bytes + * rather than words as found in vanilla FreeRTOS) since the task started. + * The smaller the returned number the closer the task has come to overflowing its stack. + * + * @param xTask Handle of the task associated with the stack to be checked. + * Set xTask to NULL to check the stack of the calling task. + * + * @return The smallest amount of free stack space there has been (in bytes + * rather than words as found in vanilla FreeRTOS) since the task referenced by + * xTask was created. + */ +UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * Returns the start of the stack associated with xTask. + * + * INCLUDE_pxTaskGetStackStart must be set to 1 in FreeRTOSConfig.h for + * this function to be available. + * + * Returns the highest stack memory address on architectures where the stack grows down + * from high memory, and the lowest memory address on architectures where the + * stack grows up from low memory. + * + * @param xTask Handle of the task associated with the stack returned. + * Set xTask to NULL to return the stack of the calling task. + * + * @return A pointer to the start of the stack. + */ +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. */ +#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; + + /** + * Get the hook function assigned to given task. + * @param xTask Handle of the task to get the hook function for + * Passing xTask as NULL has the effect of getting the calling + * tasks hook function. + * @return The pxHookFunction value assigned to the task xTask. + */ + TaskHookFunction_t xTaskGetApplicationTaskTag( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + #endif /* configUSE_APPLICATION_TASK_TAG ==1 */ +#endif /* ifdef configUSE_APPLICATION_TASK_TAG */ +#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; + + + /** + * 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 ) + + /** + * 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 + +#endif + +/** + * 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. + * @param pvParameter Parameter passed to the hook function for the task to interpret as it + * 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; + +/** + * Get the handle of idle task for the current CPU. + * + * xTaskGetIdleTaskHandle() is only available if + * INCLUDE_xTaskGetIdleTaskHandle is set to 1 in FreeRTOSConfig.h. + * + * @return The handle of the idle task. It is not valid to call + * xTaskGetIdleTaskHandle() before the scheduler has been started. + */ +TaskHandle_t xTaskGetIdleTaskHandle( void ); + +/** + * Get the handle of idle task for the given CPU. + * + * xTaskGetIdleTaskHandleForCPU() is only available if + * INCLUDE_xTaskGetIdleTaskHandle is set to 1 in FreeRTOSConfig.h. + * + * @param cpuid The CPU to get the handle for + * + * @return Idle task handle of a given cpu. It is not valid to call + * xTaskGetIdleTaskHandleForCPU() before the scheduler has been started. + */ +TaskHandle_t xTaskGetIdleTaskHandleForCPU( UBaseType_t cpuid ); + +/** + * Get the state of tasks in the system. + * + * configUSE_TRACE_FACILITY must be defined as 1 in FreeRTOSConfig.h for + * uxTaskGetSystemState() to be available. + * + * uxTaskGetSystemState() populates an TaskStatus_t structure for each task in + * the system. TaskStatus_t structures contain, among other things, members + * for the task handle, task name, task priority, task state, and total amount + * 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 + * the scheduler remaining suspended for an extended period. + * + * @param pxTaskStatusArray A pointer to an array of TaskStatus_t structures. + * The array must contain at least one TaskStatus_t structure for each task + * that is under the control of the RTOS. The number of tasks under the control + * of the RTOS can be determined using the uxTaskGetNumberOfTasks() API function. + * + * @param uxArraySize The size of the array pointed to by the pxTaskStatusArray + * parameter. The size is specified as the number of indexes in the array, or + * the number of TaskStatus_t structures contained in the array, not by the + * number of bytes in the array. + * + * @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. + * pulTotalRunTime can be set to NULL to omit the total run time information. + * + * @return The number of TaskStatus_t structures that were populated by + * uxTaskGetSystemState(). This should equal the number returned by the + * uxTaskGetNumberOfTasks() API function, but will be zero if the value passed + * in the uxArraySize parameter was too small. + * + * 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 ) + * { + * // 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 ) + * { + * // For each populated position in the pxTaskStatusArray array, + * // format the raw data as human readable ASCII 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 / ulTotalRunTime; + * + * 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 ); + * } + * } + * @endcode + */ +UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, const UBaseType_t uxArraySize, uint32_t * const pulTotalRunTime ); + +/** + * List all the current tasks. + * + * configUSE_TRACE_FACILITY and configUSE_STATS_FORMATTING_FUNCTIONS must + * 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 + * not intended for normal application runtime use but as a debug aid. + * + * Lists all the current tasks, along with their current state and stack + * usage high water mark. + * + * 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 + * 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(). + * + * @param pcWriteBuffer A buffer into which the above mentioned details + * will be written, in ASCII form. This buffer is assumed to be large + * enough to contain the generated report. Approximately 40 bytes per + * task should be sufficient. + * + * \ingroup TaskUtils + */ +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 + * + * 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. + * + * @note 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 + * 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. + * Calling vTaskGetRunTimeStats() writes the total execution time of each + * 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 + * 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(). + * + * @param pcWriteBuffer A buffer into which the execution times will be + * written, in ASCII form. This buffer is assumed to be large enough to + * contain the generated report. Approximately 40 bytes per task should + * be sufficient. + * + * \ingroup TaskUtils + */ +void vTaskGetRunTimeStats( char *pcWriteBuffer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + +/** + * Send task notification. + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this + * function to be available. + * + * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private + * "notification value", which is a 32-bit unsigned integer (uint32_t). + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment the task's notification value. In that way + * task notifications can be used to send data to a task, or be used as light + * weight and fast binary or counting semaphores. + * + * A notification sent to a task will remain pending until it is cleared by the + * task calling xTaskNotifyWait() or ulTaskNotifyTake(). If the task was + * already in the Blocked state to wait for a notification when the notification + * arrives then the task will automatically be removed from the Blocked state + * (unblocked) and the notification cleared. + * + * A task can use xTaskNotifyWait() to [optionally] block to wait for a + * notification to be pending, or ulTaskNotifyTake() to [optionally] block + * to wait for its notification value to have a non-zero value. The task does + * not consume any CPU time while it is in the Blocked state. + * + * See http://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * @param xTaskToNotify The handle of the task being notified. The handle to a + * task can be returned from the xTaskCreate() API function used to create the + * task, and the handle of the currently running task can be obtained by calling + * xTaskGetCurrentTaskHandle(). + * + * @param ulValue Data that can be sent with the notification. How the data is + * used depends on the value of the eAction parameter. + * + * @param eAction Specifies how the notification updates the task's notification + * value, if at all. Valid values for eAction are as follows: + * - eSetBits: + * The task's notification value is bitwise ORed with ulValue. xTaskNofify() + * always returns pdPASS in this case. + * + * - eIncrement: + * The task's notification value is incremented. ulValue is not used and + * xTaskNotify() always returns pdPASS in this case. + * + * - eSetValueWithOverwrite: + * The task's notification value is set to the value of ulValue, even if the + * task being notified had not yet processed the previous notification (the + * task already had a notification pending). xTaskNotify() always returns + * pdPASS in this case. + * + * - eSetValueWithoutOverwrite: + * If the task being notified did not already have a notification pending then + * the task's notification value is set to ulValue and xTaskNotify() will + * return pdPASS. If the task being notified already had a notification + * pending then no action is performed and pdFAIL is returned. + * + * - eNoAction: + * The task receives a notification without its notification value being + *   updated. ulValue is not used and xTaskNotify() always returns pdPASS in + * this case. + * + * @return Dependent on the value of eAction. See the description of the + * eAction parameter. + * + * \ingroup TaskNotifications + */ +BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction ); + +/** + * Send task notification from an ISR. + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this + * function to be available. + * + * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private + * "notification value", which is a 32-bit unsigned integer (uint32_t). + * + * A version of xTaskNotify() that can be used from an interrupt service routine + * (ISR). + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment the task's notification value. In that way + * task notifications can be used to send data to a task, or be used as light + * weight and fast binary or counting semaphores. + * + * A notification sent to a task will remain pending until it is cleared by the + * task calling xTaskNotifyWait() or ulTaskNotifyTake(). If the task was + * already in the Blocked state to wait for a notification when the notification + * arrives then the task will automatically be removed from the Blocked state + * (unblocked) and the notification cleared. + * + * A task can use xTaskNotifyWait() to [optionally] block to wait for a + * notification to be pending, or ulTaskNotifyTake() to [optionally] block + * to wait for its notification value to have a non-zero value. The task does + * not consume any CPU time while it is in the Blocked state. + * + * See http://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * @param xTaskToNotify The handle of the task being notified. The handle to a + * task can be returned from the xTaskCreate() API function used to create the + * task, and the handle of the currently running task can be obtained by calling + * xTaskGetCurrentTaskHandle(). + * + * @param ulValue Data that can be sent with the notification. How the data is + * used depends on the value of the eAction parameter. + * + * @param eAction Specifies how the notification updates the task's notification + * value, if at all. Valid values for eAction are as follows: + * - eSetBits: + * The task's notification value is bitwise ORed with ulValue. xTaskNofify() + * always returns pdPASS in this case. + * + * - eIncrement: + * The task's notification value is incremented. ulValue is not used and + * xTaskNotify() always returns pdPASS in this case. + * + * - eSetValueWithOverwrite: + * The task's notification value is set to the value of ulValue, even if the + * task being notified had not yet processed the previous notification (the + * task already had a notification pending). xTaskNotify() always returns + * pdPASS in this case. + * + * - eSetValueWithoutOverwrite: + * If the task being notified did not already have a notification pending then + * the task's notification value is set to ulValue and xTaskNotify() will + * return pdPASS. If the task being notified already had a notification + * pending then no action is performed and pdFAIL is returned. + * + * - eNoAction: + * The task receives a notification without its notification value being + * updated. ulValue is not used and xTaskNotify() always returns pdPASS in + * this case. + * + * @param pxHigherPriorityTaskWoken xTaskNotifyFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending the notification caused the + * task to which the notification was sent to leave the Blocked state, and the + * unblocked task has a priority higher than the currently running task. If + * xTaskNotifyFromISR() sets this value to pdTRUE then a context switch should + * be requested before the interrupt is exited. How a context switch is + * requested from an ISR is dependent on the port - see the documentation page + * for the port in use. + * + * @return Dependent on the value of eAction. See the description of the + * eAction parameter. + * + * \ingroup TaskNotifications + */ +BaseType_t xTaskNotifyFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, BaseType_t *pxHigherPriorityTaskWoken ); + +/** + * Wait for task notification + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this + * function to be available. + * + * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private + * "notification value", which is a 32-bit unsigned integer (uint32_t). + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment the task's notification value. In that way + * task notifications can be used to send data to a task, or be used as light + * weight and fast binary or counting semaphores. + * + * A notification sent to a task will remain pending until it is cleared by the + * task calling xTaskNotifyWait() or ulTaskNotifyTake(). If the task was + * already in the Blocked state to wait for a notification when the notification + * arrives then the task will automatically be removed from the Blocked state + * (unblocked) and the notification cleared. + * + * A task can use xTaskNotifyWait() to [optionally] block to wait for a + * notification to be pending, or ulTaskNotifyTake() to [optionally] block + * to wait for its notification value to have a non-zero value. The task does + * not consume any CPU time while it is in the Blocked state. + * + * See http://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * @param ulBitsToClearOnEntry Bits that are set in ulBitsToClearOnEntry value + * will be cleared in the calling task's notification value before the task + * checks to see if any notifications are pending, and optionally blocks if no + * notifications are pending. Setting ulBitsToClearOnEntry to ULONG_MAX (if + * limits.h is included) or 0xffffffffUL (if limits.h is not included) will have + * the effect of resetting the task's notification value to 0. Setting + * ulBitsToClearOnEntry to 0 will leave the task's notification value unchanged. + * + * @param ulBitsToClearOnExit If a notification is pending or received before + * the calling task exits the xTaskNotifyWait() function then the task's + * notification value (see the xTaskNotify() API function) is passed out using + * the pulNotificationValue parameter. Then any bits that are set in + * ulBitsToClearOnExit will be cleared in the task's notification value (note + * *pulNotificationValue is set before any bits are cleared). Setting + * ulBitsToClearOnExit to ULONG_MAX (if limits.h is included) or 0xffffffffUL + * (if limits.h is not included) will have the effect of resetting the task's + * notification value to 0 before the function exits. Setting + * ulBitsToClearOnExit to 0 will leave the task's notification value unchanged + * when the function exits (in which case the value passed out in + * pulNotificationValue will match the task's notification value). + * + * @param pulNotificationValue Used to pass the task's notification value out + * of the function. Note the value passed out will not be effected by the + * clearing of any bits caused by ulBitsToClearOnExit being non-zero. + * + * @param xTicksToWait The maximum amount of time that the task should wait in + * the Blocked state for a notification to be received, should a notification + * not already be pending when xTaskNotifyWait() was called. The task + * will not consume any processing time while it is in the Blocked state. This + * is specified in kernel ticks, the macro pdMS_TO_TICSK( value_in_ms ) can be + * used to convert a time specified in milliseconds to a time specified in + * ticks. + * + * @return If a notification was received (including notifications that were + * already pending when xTaskNotifyWait was called) then pdPASS is + * returned. Otherwise pdFAIL is returned. + * + * \ingroup TaskNotifications + */ +BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait ); + +/** + * Simplified macro for sending task notification. + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this macro + * to be available. + * + * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private + * "notification value", which is a 32-bit unsigned integer (uint32_t). + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment the task's notification value. In that way + * task notifications can be used to send data to a task, or be used as light + * weight and fast binary or counting semaphores. + * + * xTaskNotifyGive() is a helper macro intended for use when task notifications + * are used as light weight and faster binary or counting semaphore equivalents. + * Actual FreeRTOS semaphores are given using the xSemaphoreGive() API function, + * the equivalent action that instead uses a task notification is + * xTaskNotifyGive(). + * + * When task notifications are being used as a binary or counting semaphore + * equivalent then the task being notified should wait for the notification + * using the ulTaskNotificationTake() API function rather than the + * xTaskNotifyWait() API function. + * + * See http://www.FreeRTOS.org/RTOS-task-notifications.html for more details. + * + * @param xTaskToNotify The handle of the task being notified. The handle to a + * task can be returned from the xTaskCreate() API function used to create the + * task, and the handle of the currently running task can be obtained by calling + * xTaskGetCurrentTaskHandle(). + * + * @return xTaskNotifyGive() is a macro that calls xTaskNotify() with the + * eAction parameter set to eIncrement - so pdPASS is always returned. + * + * \ingroup TaskNotifications + */ +#define xTaskNotifyGive( xTaskToNotify ) xTaskNotify( ( xTaskToNotify ), 0, eIncrement ) + +/** + * Simplified macro for sending task notification from ISR. + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this macro + * to be available. + * + * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private + * "notification value", which is a 32-bit unsigned integer (uint32_t). + * + * A version of xTaskNotifyGive() that can be called from an interrupt service + * routine (ISR). + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment the task's notification value. In that way + * task notifications can be used to send data to a task, or be used as light + * weight and fast binary or counting semaphores. + * + * vTaskNotifyGiveFromISR() is intended for use when task notifications are + * used as light weight and faster binary or counting semaphore equivalents. + * Actual FreeRTOS semaphores are given from an ISR using the + * xSemaphoreGiveFromISR() API function, the equivalent action that instead uses + * a task notification is vTaskNotifyGiveFromISR(). + * + * When task notifications are being used as a binary or counting semaphore + * equivalent then the task being notified should wait for the notification + * using the ulTaskNotificationTake() API function rather than the + * xTaskNotifyWait() API function. + * + * See http://www.FreeRTOS.org/RTOS-task-notifications.html for more details. + * + * @param xTaskToNotify The handle of the task being notified. The handle to a + * task can be returned from the xTaskCreate() API function used to create the + * task, and the handle of the currently running task can be obtained by calling + * xTaskGetCurrentTaskHandle(). + * + * @param pxHigherPriorityTaskWoken vTaskNotifyGiveFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending the notification caused the + * task to which the notification was sent to leave the Blocked state, and the + * unblocked task has a priority higher than the currently running task. If + * vTaskNotifyGiveFromISR() sets this value to pdTRUE then a context switch + * should be requested before the interrupt is exited. How a context switch is + * requested from an ISR is dependent on the port - see the documentation page + * for the port in use. + * + * \ingroup TaskNotifications + */ +void vTaskNotifyGiveFromISR( TaskHandle_t xTaskToNotify, BaseType_t *pxHigherPriorityTaskWoken ); + +/** + * Simplified macro for receiving task notification. + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this + * function to be available. + * + * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private + * "notification value", which is a 32-bit unsigned integer (uint32_t). + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment the task's notification value. In that way + * task notifications can be used to send data to a task, or be used as light + * weight and fast binary or counting semaphores. + * + * ulTaskNotifyTake() is intended for use when a task notification is used as a + * faster and lighter weight binary or counting semaphore alternative. Actual + * FreeRTOS semaphores are taken using the xSemaphoreTake() API function, the + * equivalent action that instead uses a task notification is + * ulTaskNotifyTake(). + * + * When a task is using its notification value as a binary or counting semaphore + * other tasks should send notifications to it using the xTaskNotifyGive() + * macro, or xTaskNotify() function with the eAction parameter set to + * eIncrement. + * + * ulTaskNotifyTake() can either clear the task's notification value to + * zero on exit, in which case the notification value acts like a binary + * semaphore, or decrement the task's notification value on exit, in which case + * the notification value acts like a counting semaphore. + * + * A task can use ulTaskNotifyTake() to [optionally] block to wait for a + * the task's notification value to be non-zero. The task does not consume any + * CPU time while it is in the Blocked state. + * + * Where as xTaskNotifyWait() will return when a notification is pending, + * ulTaskNotifyTake() will return when the task's notification value is + * not zero. + * + * See http://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * @param xClearCountOnExit if xClearCountOnExit is pdFALSE then the task's + * notification value is decremented when the function exits. In this way the + * notification value acts like a counting semaphore. If xClearCountOnExit is + * not pdFALSE then the task's notification value is cleared to zero when the + * function exits. In this way the notification value acts like a binary + * semaphore. + * + * @param xTicksToWait The maximum amount of time that the task should wait in + * the Blocked state for the task's notification value to be greater than zero, + * should the count not already be greater than zero when + * ulTaskNotifyTake() was called. The task will not consume any processing + * time while it is in the Blocked state. This is specified in kernel ticks, + * the macro pdMS_TO_TICSK( value_in_ms ) can be used to convert a time + * specified in milliseconds to a time specified in ticks. + * + * @return The task's notification count before it is either cleared to zero or + * decremented (see the xClearCountOnExit parameter). + * + * \ingroup TaskNotifications + */ +uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait ); + +/*----------------------------------------------------------- + * SCHEDULER INTERNALS AVAILABLE FOR PORTING PURPOSES + *----------------------------------------------------------*/ +/** @cond */ +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS ONLY + * INTENDED FOR USE WHEN IMPLEMENTING A PORT OF THE SCHEDULER AND IS + * AN INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * Called from the real time kernel tick (either preemptive or cooperative), + * this increments the tick count and checks if any tasks that are blocked + * for a finite period required removing from a blocked list and placing on + * a ready list. If a non-zero value is returned then a context switch is + * required because either: + * + A task was removed from a blocked list because its timeout had expired, + * or + * + Time slicing is in use and there is a task of equal priority to the + * currently running task. + */ +BaseType_t xTaskIncrementTick( void ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN + * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. + * + * Removes the calling task from the ready list and places it both + * on the list of tasks waiting for a particular event, and the + * list of delayed tasks. The task will be removed from both lists + * and replaced on the ready list should either the event occur (and + * there be no higher priority tasks waiting on the same event) or + * the delay period expires. + * + * The 'unordered' version replaces the event list item value with the + * xItemValue value, and inserts the list item at the end of the list. + * + * The 'ordered' version uses the existing event list item value (which is the + * owning tasks priority) to insert the list item into the event list is task + * priority order. + * + * @param pxEventList The list containing tasks that are blocked waiting + * for the event to occur. + * + * @param xItemValue The item value to use for the event list item when the + * event list is not ordered by task priority. + * + * @param xTicksToWait The maximum amount of time that the task should wait + * for the event to occur. This is specified in kernel ticks,the constant + * 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; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN + * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. + * + * This function performs nearly the same function as vTaskPlaceOnEventList(). + * The difference being that this function does not permit tasks to block + * indefinitely, whereas vTaskPlaceOnEventList() does. + * + */ +void vTaskPlaceOnEventListRestricted( List_t * const pxEventList, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN + * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. + * + * Removes a task from both the specified event list and the list of blocked + * tasks, and places it on a ready queue. + * + * xTaskRemoveFromEventList()/xTaskRemoveFromUnorderedEventList() will be called + * if either an event occurs to unblock a task, or the block timeout period + * expires. + * + * xTaskRemoveFromEventList() is used when the event list is in task priority + * order. It removes the list item from the head of the event list as that will + * have the highest priority owning task of all the tasks on the event list. + * xTaskRemoveFromUnorderedEventList() is used when the event list is not + * ordered and the event list items hold something other than the owning tasks + * priority. In this case the event list item value is updated to the value + * passed in the xItemValue parameter. + * + * @return pdTRUE if the task being removed has a higher priority than the task + * 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; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS ONLY + * INTENDED FOR USE WHEN IMPLEMENTING A PORT OF THE SCHEDULER AND IS + * AN INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * Sets the pointer to the current TCB to the TCB of the highest priority task + * that is ready to run. + */ +void vTaskSwitchContext( void ) PRIVILEGED_FUNCTION; + +/* + * THESE FUNCTIONS MUST NOT BE USED FROM APPLICATION CODE. THEY ARE USED BY + * THE EVENT BITS MODULE. + */ +TickType_t uxTaskResetEventItemValue( void ) PRIVILEGED_FUNCTION; + +/* + * Return the handle of the calling task. + */ +TaskHandle_t xTaskGetCurrentTaskHandle( void ) PRIVILEGED_FUNCTION; + + + +/* + * Return the handle of the task running on a certain CPU. Because of + * the nature of SMP processing, there is no guarantee that this + * value will still be valid on return and should only be used for + * debugging purposes. + */ +TaskHandle_t xTaskGetCurrentTaskHandleForCPU( BaseType_t cpuid ); + + +/* + * Capture the current time status for future reference. + */ +void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) PRIVILEGED_FUNCTION; + +/* + * Compare the time status now with that previously captured to see if the + * timeout has expired. + */ +BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait ) PRIVILEGED_FUNCTION; + +/* + * Shortcut used by the queue implementation to prevent unnecessary call to + * taskYIELD(); + */ +void vTaskMissedYield( void ) PRIVILEGED_FUNCTION; + +/* + * Returns the scheduler state as taskSCHEDULER_RUNNING, + * taskSCHEDULER_NOT_STARTED or taskSCHEDULER_SUSPENDED. + */ +BaseType_t xTaskGetSchedulerState( void ) PRIVILEGED_FUNCTION; + +/* + * Raises the priority of the mutex holder to that of the calling task should + * the mutex holder have a priority less than the calling task. + */ +void vTaskPriorityInherit( TaskHandle_t const pxMutexHolder ) PRIVILEGED_FUNCTION; + +/* + * Set the priority of a task back to its proper priority in the case that it + * inherited a higher priority while it was holding a semaphore. + */ +BaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder ) PRIVILEGED_FUNCTION; + +/* + * Get the uxTCBNumber assigned to the task referenced by the xTask parameter. + */ +UBaseType_t uxTaskGetTaskNumber( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + + +/* + * Get the current core affinity of a task + */ +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; + +/* + * Only available when configUSE_TICKLESS_IDLE is set to 1. + * If tickless mode is being used, or a low power mode is implemented, then + * the tick interrupt will not execute during idle periods. When this is the + * case, the tick count value maintained by the scheduler needs to be kept up + * to date with the actual execution time by being skipped forward by a time + * equal to the idle period. + */ +void vTaskStepTick( const TickType_t xTicksToJump ) PRIVILEGED_FUNCTION; + +/* + * Only avilable when configUSE_TICKLESS_IDLE is set to 1. + * Provided for use within portSUPPRESS_TICKS_AND_SLEEP() to allow the port + * specific sleep function to determine if it is ok to proceed with the sleep, + * and if it is ok to proceed, if it is ok to sleep indefinitely. + * + * This function is necessary because portSUPPRESS_TICKS_AND_SLEEP() is only + * called with the scheduler suspended, not from within a critical section. It + * is therefore possible for an interrupt to request a context switch between + * portSUPPRESS_TICKS_AND_SLEEP() and the low power mode actually being + * entered. eTaskConfirmSleepModeStatus() should be called from a short + * critical section between the timer being stopped and the sleep mode being + * entered to ensure it is ok to proceed into the sleep mode. + */ +eSleepModeStatus eTaskConfirmSleepModeStatus( void ) PRIVILEGED_FUNCTION; + +/* + * For internal use only. Increment the mutex held count when a mutex is + * taken and return the handle of the task that has taken the mutex. + */ +void *pvTaskIncrementMutexHeldCount( void ); + +/* + * This function fills array with TaskSnapshot_t structures for every task in the system. + * Used by core dump facility 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 ); + +/** @endcond */ + +#ifdef __cplusplus +} +#endif +#endif /* INC_TASK_H */ + + + diff --git a/arch/xtensa/include/esp32/freertos/timers.h b/arch/xtensa/include/esp32/freertos/timers.h new file mode 100644 index 0000000000000..17492e64c66eb --- /dev/null +++ b/arch/xtensa/include/esp32/freertos/timers.h @@ -0,0 +1,1258 @@ +/* + FreeRTOS V8.2.0 - Copyright (C) 2015 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 TIMERS_H +#define TIMERS_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include timers.h" +#endif + +/*lint -e537 This headers are only multiply included if the application code +happens to also be including task.h. */ +#include "task.h" +/*lint +e537 */ + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * 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 ) + +#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 ) + + +/** + * Type by which software timers are referenced. For example, a call to + * xTimerCreate() returns an TimerHandle_t variable that can then be used to + * reference the subject timer in calls to other software timer API functions + * (for example, xTimerStart(), xTimerReset(), etc.). + */ +typedef void * TimerHandle_t; + +/** + * Defines the prototype to which timer callback functions must conform. + */ +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 ); + +/** + * 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 );". + * + * @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 + * there is insufficient FreeRTOS heap remaining to allocate the timer + * structures, or the timer period was set to 0) then NULL is returned. + * + * Example usage: + * @code{c} + * #define NUM_TIMERS 5 + * + * // An array to hold handles to the created timers. + * TimerHandle_t xTimers[ NUM_TIMERS ]; + * + * // An array to hold a count of the number of times each timer expires. + * int32_t lExpireCounters[ NUM_TIMERS ] = { 0 }; + * + * // Define a callback function that will be used by multiple timer instances. + * // The callback function does nothing but count the number of times the + * // associated timer expires, and stop the timer once the timer has expired + * // 10 times. + * void vTimerCallback( TimerHandle_t pxTimer ) + * { + * int32_t lArrayIndex; + * const int32_t xMaxExpiryCountBeforeStopping = 10; + * + * // Optionally do something if the pxTimer parameter is NULL. + * configASSERT( pxTimer ); + * + * // Which timer expired? + * lArrayIndex = ( int32_t ) pvTimerGetTimerID( pxTimer ); + * + * // Increment the number of times that pxTimer has expired. + * lExpireCounters[ lArrayIndex ] += 1; + * + * // If the timer has expired 10 times then stop it from running. + * if( lExpireCounters[ lArrayIndex ] == xMaxExpiryCountBeforeStopping ) + * { + * // Do not use a block time if calling a timer API function from a + * // timer callback function, as doing so could cause a deadlock! + * xTimerStop( pxTimer, 0 ); + * } + * } + * + * void main( void ) + * { + * int32_t x; + * + * // Create then start some timers. Starting the timers before the scheduler + * // has been started means the timers will start running immediately that + * // the scheduler starts. + * for( x = 0; x < NUM_TIMERS; x++ ) + * { + * xTimers[ x ] = xTimerCreate( "Timer", // Just a text name, not used by the kernel. + * ( 100 * x ), // The timer period in ticks. + * pdTRUE, // The timers will auto-reload themselves when they expire. + * ( void * ) x, // Assign each timer a unique id equal to its array index. + * vTimerCallback // Each timer calls the same callback when it expires. + * ); + * + * if( xTimers[ x ] == NULL ) + * { + * // The timer was not created. + * } + * else + * { + * // Start the timer. No block time is specified, and even if one was + * // it would be ignored because the scheduler has not yet been + * // started. + * if( xTimerStart( xTimers[ x ], 0 ) != pdPASS ) + * { + * // The timer could not be set into the Active state. + * } + * } + * } + * + * // ... + * // 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_DYNAMIC_ALLOCATION == 1 ) + TimerHandle_t xTimerCreate( const char * const pcTimerName, + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +#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; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + #endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * Returns the ID assigned to the timer. + * + * IDs are assigned to timers using the pvTimerID parameter of the call to + * xTimerCreated() that was used to create the timer. + * + * If the same callback function is assigned to multiple timers then the timer + * ID can be used within the callback function to identify which timer actually + * expired. + * + * @param xTimer The timer being queried. + * + * @return The ID assigned to the timer being queried. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + */ +void *pvTimerGetTimerID( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/** + * Sets the ID assigned to the timer. + * + * IDs are assigned to timers using the pvTimerID parameter of the call to + * xTimerCreated() that was used to create the timer. + * + * If the same callback function is assigned to multiple timers then the timer + * ID can be used as time specific (timer local) storage. + * + * @param xTimer The timer being updated. + * + * @param pvNewID The ID to assign to the timer. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + */ +void vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ) PRIVILEGED_FUNCTION; + +/** + * Queries a timer to see if it is active or dormant. + * + * A timer will be dormant if: + * + * 1) It has been created but not started, or + * + * 2) It is an expired one-shot timer that has not been restarted. + * + * 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 xTimer The timer being queried. + * + * @return pdFALSE will be returned if the timer is dormant. A value other than + * pdFALSE will be returned if the timer is active. + * + * Example usage: + * @code{c} + * // This function assumes xTimer has already been created. + * void vAFunction( TimerHandle_t xTimer ) + * { + * if( xTimerIsTimerActive( xTimer ) != pdFALSE ) // or more simply and equivalently "if( xTimerIsTimerActive( xTimer ) )" + * { + * // xTimer is active, do something. + * } + * else + * { + * // xTimer is not active, do something else. + * } + * } + * @endcode + */ +BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/** + * xTimerGetTimerDaemonTaskHandle() is only available if + * INCLUDE_xTimerGetTimerDaemonTaskHandle is set to 1 in FreeRTOSConfig.h. + * + * Simply returns the handle of the timer service/daemon task. It it not valid + * to call xTimerGetTimerDaemonTaskHandle() before the scheduler has been started. + */ +TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ); + +/** + * Returns the period of a timer. + * + * @param xTimer The handle of the timer being queried. + * + * @return The period of the timer in ticks. + */ +TickType_t xTimerGetPeriod( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/** + * 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; + +/** + * 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 + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerStart() starts a timer that was previously created using the + * xTimerCreate() API function. If the timer had already been started and was + * already in the active state, then xTimerStart() has equivalent functionality + * to the xTimerReset() API function. + * + * Starting a timer ensures the timer is in the active state. If the timer + * is not stopped, deleted, or reset in the mean time, the callback function + * associated with the timer will get called 'n' ticks after xTimerStart() was + * called, where 'n' is the timers defined period. + * + * It is valid to call xTimerStart() before the scheduler has been started, but + * when this is done the timer will not actually start until the scheduler is + * started, and the timers expiry time will be relative to when the scheduler is + * started, not relative to when xTimerStart() was called. + * + * The configUSE_TIMERS configuration constant must be set to 1 for xTimerStart() + * to be available. + * + * @param xTimer The handle of the timer being started/restarted. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the start command to be successfully + * sent to the timer command queue, should the queue already be full when + * xTimerStart() was called. xTicksToWait is ignored if xTimerStart() is called + * before the scheduler is started. + * + * @return pdFAIL will be returned if the start command could not be sent to + * the timer command queue even after xTicksToWait ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system, although the + * timers expiry time is relative to when xTimerStart() is actually called. The + * timer service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + * + */ +#define xTimerStart( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCount() ), NULL, ( 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 + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerStop() stops a timer that was previously started using either of the + * The xTimerStart(), xTimerReset(), xTimerStartFromISR(), xTimerResetFromISR(), + * xTimerChangePeriod() or xTimerChangePeriodFromISR() API functions. + * + * Stopping a timer ensures the timer is not in the active state. + * + * The configUSE_TIMERS configuration constant must be set to 1 for xTimerStop() + * to be available. + * + * @param xTimer The handle of the timer being stopped. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the stop command to be successfully + * sent to the timer command queue, should the queue already be full when + * xTimerStop() was called. xTicksToWait is ignored if xTimerStop() is called + * before the scheduler is started. + * + * @return pdFAIL will be returned if the stop command could not be sent to + * the timer command queue even after xTicksToWait ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system. The timer + * service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + * + */ +#define xTimerStop( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP, 0U, NULL, ( 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 + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerChangePeriod() changes the period of a timer that was previously + * created using the xTimerCreate() API function. + * + * xTimerChangePeriod() can be called to change the period of an active or + * dormant state timer. + * + * The configUSE_TIMERS configuration constant must be set to 1 for + * xTimerChangePeriod() to be available. + * + * @param xTimer The handle of the timer that is having its period changed. + * + * @param xNewPeriod The new period for xTimer. Timer periods are specified 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 xNewPeriod should be set to 100. Alternatively, + * if the timer must expire after 500ms, then xNewPeriod can be set to + * ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than + * or equal to 1000. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the change period command to be + * successfully sent to the timer command queue, should the queue already be + * full when xTimerChangePeriod() was called. xTicksToWait is ignored if + * xTimerChangePeriod() is called before the scheduler is started. + * + * @return pdFAIL will be returned if the change period command could not be + * sent to the timer command queue even after xTicksToWait ticks had passed. + * pdPASS will be returned if the command was successfully sent to the timer + * command queue. When the command is actually processed will depend on the + * priority of the timer service/daemon task relative to other tasks in the + * system. The timer service/daemon task priority is set by the + * configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @code{c} + * // 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 + * // called, then the period of the timer is set to 500ms and the timer is + * // started. + * void vAFunction( TimerHandle_t xTimer ) + * { + * if( xTimerIsTimerActive( xTimer ) != pdFALSE ) // or more simply and equivalently "if( xTimerIsTimerActive( xTimer ) )" + * { + * // xTimer is already active - delete it. + * xTimerDelete( xTimer ); + * } + * else + * { + * // xTimer is not active, change its period to 500ms. This will also + * // cause the timer to start. Block for a maximum of 100 ticks if the + * // change period command cannot immediately be sent to the timer + * // command queue. + * if( xTimerChangePeriod( xTimer, 500 / portTICK_PERIOD_MS, 100 ) == pdPASS ) + * { + * // The command was successfully sent. + * } + * else + * { + * // The command could not be sent, even after waiting for 100 ticks + * // to pass. Take appropriate action here. + * } + * } + * } + * @endcode + */ + #define xTimerChangePeriod( xTimer, xNewPeriod, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD, ( xNewPeriod ), NULL, ( 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 + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerDelete() deletes a timer that was previously created using the + * xTimerCreate() API function. + * + * The configUSE_TIMERS configuration constant must be set to 1 for + * xTimerDelete() to be available. + * + * @param xTimer The handle of the timer being deleted. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the delete command to be + * successfully sent to the timer command queue, should the queue already be + * full when xTimerDelete() was called. xTicksToWait is ignored if xTimerDelete() + * is called before the scheduler is started. + * + * @return pdFAIL will be returned if the delete command could not be sent to + * the timer command queue even after xTicksToWait ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system. The timer + * service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * + * See the xTimerChangePeriod() API function example usage scenario. + */ +#define xTimerDelete( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_DELETE, 0U, NULL, ( 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 + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerReset() re-starts a timer that was previously created using the + * xTimerCreate() API function. If the timer had already been started and was + * already in the active state, then xTimerReset() will cause the timer to + * re-evaluate its expiry time so that it is relative to when xTimerReset() was + * called. If the timer was in the dormant state then xTimerReset() has + * equivalent functionality to the xTimerStart() API function. + * + * Resetting a timer ensures the timer is in the active state. If the timer + * is not stopped, deleted, or reset in the mean time, the callback function + * associated with the timer will get called 'n' ticks after xTimerReset() was + * called, where 'n' is the timers defined period. + * + * It is valid to call xTimerReset() before the scheduler has been started, but + * when this is done the timer will not actually start until the scheduler is + * started, and the timers expiry time will be relative to when the scheduler is + * started, not relative to when xTimerReset() was called. + * + * The configUSE_TIMERS configuration constant must be set to 1 for xTimerReset() + * to be available. + * + * @param xTimer The handle of the timer being reset/started/restarted. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the reset command to be successfully + * sent to the timer command queue, should the queue already be full when + * xTimerReset() was called. xTicksToWait is ignored if xTimerReset() is called + * before the scheduler is started. + * + * @return pdFAIL will be returned if the reset command could not be sent to + * the timer command queue even after xTicksToWait ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system, although the + * timers expiry time is relative to when xTimerStart() is actually called. The + * timer service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * @code{c} + * // 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. + * + * TimerHandle_t xBacklightTimer = NULL; + * + * // The callback function assigned to the one-shot timer. In this case the + * // parameter is not used. + * void vBacklightTimerCallback( TimerHandle_t pxTimer ) + * { + * // The timer expired, therefore 5 seconds must have passed since a key + * // was pressed. Switch off the LCD back-light. + * vSetBacklightState( BACKLIGHT_OFF ); + * } + * + * // The key press event handler. + * void vKeyPressEventHandler( char cKey ) + * { + * // Ensure the LCD back-light is on, then reset the timer that is + * // responsible for turning the back-light off after 5 seconds of + * // key inactivity. Wait 10 ticks for the command to be successfully sent + * // if it cannot be sent immediately. + * vSetBacklightState( BACKLIGHT_ON ); + * if( xTimerReset( xBacklightTimer, 100 ) != pdPASS ) + * { + * // The reset command was not executed successfully. Take appropriate + * // action here. + * } + * + * // Perform the rest of the key processing here. + * } + * + * void main( void ) + * { + * int32_t x; + * + * // Create then start the one-shot timer that is responsible for turning + * // the back-light off if no keys are pressed within a 5 second period. + * xBacklightTimer = xTimerCreate( "BacklightTimer", // Just a text name, not used by the kernel. + * ( 5000 / portTICK_PERIOD_MS), // The timer period in ticks. + * pdFALSE, // The timer is a one-shot timer. + * 0, // The id is not used by the callback so can take any value. + * vBacklightTimerCallback // The callback function that switches the LCD back-light off. + * ); + * + * if( xBacklightTimer == NULL ) + * { + * // The timer was not created. + * } + * else + * { + * // Start the timer. No block time is specified, and even if one was + * // it would be ignored because the scheduler has not yet been + * // started. + * if( xTimerStart( xBacklightTimer, 0 ) != pdPASS ) + * { + * // The timer could not be set into the Active state. + * } + * } + * + * // ... + * // Create tasks here. + * // ... + * + * // Starting the scheduler will start the timer running as it has already + * // been set into the active state. + * xTaskStartScheduler(); + * + * // Should not reach here. + * for( ;; ); + * } + * @endcode + */ +#define xTimerReset( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_RESET, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) ) + +/** + * A version of xTimerStart() that can be called from an interrupt service + * routine. + * + * @param xTimer The handle of the timer being started/restarted. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerStartFromISR() writes a message to the timer + * command queue, so has the potential to transition the timer service/daemon + * task out of the Blocked state. If calling xTimerStartFromISR() causes the + * timer service/daemon task to leave the Blocked state, and the timer service/ + * daemon task has a priority equal to or greater than the currently executing + * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will + * get set to pdTRUE internally within the xTimerStartFromISR() function. If + * xTimerStartFromISR() sets this value to pdTRUE then a context switch should + * be performed before the interrupt exits. + * + * @return pdFAIL will be returned if the start command could not be sent to + * the timer command queue. pdPASS will be returned if the command was + * successfully sent to the timer command queue. When the command is actually + * processed will depend on the priority of the timer service/daemon task + * relative to other tasks in the system, although the timers expiry time is + * relative to when xTimerStartFromISR() is actually called. The timer + * service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * @code{c} + * // 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 + * // this case, the timer is a one-shot timer, and unlike the example given for + * // the xTimerReset() function, the key press event handler is an interrupt + * // service routine. + * + * // The callback function assigned to the one-shot timer. In this case the + * // parameter is not used. + * void vBacklightTimerCallback( TimerHandle_t pxTimer ) + * { + * // The timer expired, therefore 5 seconds must have passed since a key + * // was pressed. Switch off the LCD back-light. + * vSetBacklightState( BACKLIGHT_OFF ); + * } + * + * // The key press interrupt service routine. + * void vKeyPressEventInterruptHandler( void ) + * { + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; + * + * // Ensure the LCD back-light is on, then restart the timer that is + * // responsible for turning the back-light off after 5 seconds of + * // key inactivity. This is an interrupt service routine so can only + * // call FreeRTOS API functions that end in "FromISR". + * vSetBacklightState( BACKLIGHT_ON ); + * + * // xTimerStartFromISR() or xTimerResetFromISR() could be called here + * // as both cause the timer to re-calculate its expiry time. + * // xHigherPriorityTaskWoken was initialised to pdFALSE when it was + * // declared (in this function). + * if( xTimerStartFromISR( xBacklightTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The start command was not executed successfully. Take appropriate + * // action here. + * } + * + * // Perform the rest of the key processing here. + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used). + * } + * } + * @endcode + */ +#define xTimerStartFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START_FROM_ISR, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U ) + +/** + * A version of xTimerStop() that can be called from an interrupt service + * routine. + * + * @param xTimer The handle of the timer being stopped. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerStopFromISR() writes a message to the timer + * command queue, so has the potential to transition the timer service/daemon + * task out of the Blocked state. If calling xTimerStopFromISR() causes the + * timer service/daemon task to leave the Blocked state, and the timer service/ + * daemon task has a priority equal to or greater than the currently executing + * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will + * get set to pdTRUE internally within the xTimerStopFromISR() function. If + * xTimerStopFromISR() sets this value to pdTRUE then a context switch should + * be performed before the interrupt exits. + * + * @return pdFAIL will be returned if the stop command could not be sent to + * the timer command queue. pdPASS will be returned if the command was + * successfully sent to the timer command queue. When the command is actually + * processed will depend on the priority of the timer service/daemon task + * relative to other tasks in the system. The timer service/daemon task + * priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @code{c} + * // This scenario assumes xTimer has already been created and started. When + * // an interrupt occurs, the timer should be simply stopped. + * + * // The interrupt service routine that stops the timer. + * void vAnExampleInterruptServiceRoutine( void ) + * { + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; + * + * // The interrupt has occurred - simply stop the timer. + * // xHigherPriorityTaskWoken was set to pdFALSE where it was defined + * // (within this function). As this is an interrupt service routine, only + * // FreeRTOS API functions that end in "FromISR" can be used. + * if( xTimerStopFromISR( xTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The stop command was not executed successfully. Take appropriate + * // action here. + * } + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used). + * } + * } + * @endcode + */ +#define xTimerStopFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP_FROM_ISR, 0, ( pxHigherPriorityTaskWoken ), 0U ) + +/** + * A version of xTimerChangePeriod() that can be called from an interrupt + * service routine. + * + * @param xTimer The handle of the timer that is having its period changed. + * + * @param xNewPeriod The new period for xTimer. Timer periods are specified 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 xNewPeriod should be set to 100. Alternatively, + * if the timer must expire after 500ms, then xNewPeriod can be set to + * ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than + * or equal to 1000. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerChangePeriodFromISR() writes a message to the + * timer command queue, so has the potential to transition the timer service/ + * daemon task out of the Blocked state. If calling xTimerChangePeriodFromISR() + * causes the timer service/daemon task to leave the Blocked state, and the + * timer service/daemon task has a priority equal to or greater than the + * currently executing task (the task that was interrupted), then + * *pxHigherPriorityTaskWoken will get set to pdTRUE internally within the + * xTimerChangePeriodFromISR() function. If xTimerChangePeriodFromISR() sets + * this value to pdTRUE then a context switch should be performed before the + * interrupt exits. + * + * @return pdFAIL will be returned if the command to change the timers period + * could not be sent to the timer command queue. pdPASS will be returned if the + * command was successfully sent to the timer command queue. When the command + * is actually processed will depend on the priority of the timer service/daemon + * task relative to other tasks in the system. The timer service/daemon task + * priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @code{c} + * // This scenario assumes xTimer has already been created and started. When + * // an interrupt occurs, the period of xTimer should be changed to 500ms. + * + * // The interrupt service routine that changes the period of xTimer. + * void vAnExampleInterruptServiceRoutine( void ) + * { + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; + * + * // The interrupt has occurred - change the period of xTimer to 500ms. + * // xHigherPriorityTaskWoken was set to pdFALSE where it was defined + * // (within this function). As this is an interrupt service routine, only + * // FreeRTOS API functions that end in "FromISR" can be used. + * if( xTimerChangePeriodFromISR( xTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The command to change the timers period was not executed + * // successfully. Take appropriate action here. + * } + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used). + * } + * } + * @endcode + */ +#define xTimerChangePeriodFromISR( xTimer, xNewPeriod, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD_FROM_ISR, ( xNewPeriod ), ( pxHigherPriorityTaskWoken ), 0U ) + +/** + * A version of xTimerReset() that can be called from an interrupt service + * routine. + * + * @param xTimer The handle of the timer that is to be started, reset, or + * restarted. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerResetFromISR() writes a message to the timer + * command queue, so has the potential to transition the timer service/daemon + * task out of the Blocked state. If calling xTimerResetFromISR() causes the + * timer service/daemon task to leave the Blocked state, and the timer service/ + * daemon task has a priority equal to or greater than the currently executing + * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will + * get set to pdTRUE internally within the xTimerResetFromISR() function. If + * xTimerResetFromISR() sets this value to pdTRUE then a context switch should + * be performed before the interrupt exits. + * + * @return pdFAIL will be returned if the reset command could not be sent to + * the timer command queue. pdPASS will be returned if the command was + * successfully sent to the timer command queue. When the command is actually + * processed will depend on the priority of the timer service/daemon task + * relative to other tasks in the system, although the timers expiry time is + * relative to when xTimerResetFromISR() is actually called. The timer service/daemon + * task priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @code{c} + * // 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 + * // this case, the timer is a one-shot timer, and unlike the example given for + * // the xTimerReset() function, the key press event handler is an interrupt + * // service routine. + * + * // The callback function assigned to the one-shot timer. In this case the + * // parameter is not used. + * void vBacklightTimerCallback( TimerHandle_t pxTimer ) + * { + * // The timer expired, therefore 5 seconds must have passed since a key + * // was pressed. Switch off the LCD back-light. + * vSetBacklightState( BACKLIGHT_OFF ); + * } + * + * // The key press interrupt service routine. + * void vKeyPressEventInterruptHandler( void ) + * { + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; + * + * // Ensure the LCD back-light is on, then reset the timer that is + * // responsible for turning the back-light off after 5 seconds of + * // key inactivity. This is an interrupt service routine so can only + * // call FreeRTOS API functions that end in "FromISR". + * vSetBacklightState( BACKLIGHT_ON ); + * + * // xTimerStartFromISR() or xTimerResetFromISR() could be called here + * // as both cause the timer to re-calculate its expiry time. + * // xHigherPriorityTaskWoken was initialised to pdFALSE when it was + * // declared (in this function). + * if( xTimerResetFromISR( xBacklightTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The reset command was not executed successfully. Take appropriate + * // action here. + * } + * + * // Perform the rest of the key processing here. + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used). + * } + * } + * @endcode + */ +#define xTimerResetFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_RESET_FROM_ISR, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U ) + + +/** + * 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'). + * + * Ideally an interrupt service routine (ISR) is kept as short as possible, but + * sometimes an ISR either has a lot of processing to do, or needs to perform + * processing that is not deterministic. In these cases + * xTimerPendFunctionCallFromISR() can be used to defer processing of a function + * to the RTOS daemon task. + * + * A mechanism is provided that allows the interrupt to return directly to the + * task that will subsequently execute the pended callback function. This + * allows the callback function to execute contiguously in time with the + * interrupt - just as if the callback had executed in the interrupt itself. + * + * @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 pxHigherPriorityTaskWoken As mentioned above, calling this function + * will result in a message being sent to the timer daemon task. If the + * priority of the timer daemon task (which is set using + * configTIMER_TASK_PRIORITY in FreeRTOSConfig.h) is higher than the priority of + * the currently running task (the task the interrupt interrupted) then + * *pxHigherPriorityTaskWoken will be set to pdTRUE within + * xTimerPendFunctionCallFromISR(), indicating that a context switch should be + * requested before the interrupt exits. For that reason + * *pxHigherPriorityTaskWoken must be initialised to pdFALSE. See the + * example code below. + * + * @return pdPASS is returned if the message was successfully sent to the + * timer daemon task, otherwise pdFALSE is returned. + * + * Example usage: + * @code{c} + * + * // 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; + * + * // The interface that requires servicing is passed in the second + * // parameter. The first parameter is not used in this case. + * xInterfaceToService = ( BaseType_t ) ulParameter2; + * + * // ...Perform the processing here... + * } + * + * // An ISR that receives data packets from multiple interfaces + * void vAnISR( void ) + * { + * BaseType_t xInterfaceToService, xHigherPriorityTaskWoken; + * + * // 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 ); + * + * // 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 + */ +BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, BaseType_t *pxHigherPriorityTaskWoken ); + + /** + * 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 ); + +/** + * Returns the name that was assigned to a timer when the timer was created. + * + * @param xTimer The handle of the timer being queried. + * + * @return The name assigned to the timer specified by the xTimer parameter. + */ +const char * pcTimerGetTimerName( TimerHandle_t xTimer ); /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + +/** @cond */ +/* + * Functions beyond this part are not part of the public API and are intended + * 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; + +/** @endcond */ + +#ifdef __cplusplus +} +#endif +#endif /* TIMERS_H */ + + + diff --git a/arch/xtensa/include/esp32/freertos/xtensa_api.h b/arch/xtensa/include/esp32/freertos/xtensa_api.h new file mode 100644 index 0000000000000..ccd12aa55587c --- /dev/null +++ b/arch/xtensa/include/esp32/freertos/xtensa_api.h @@ -0,0 +1,128 @@ +/******************************************************************************* +Copyright (c) 2006-2015 Cadence Design Systems Inc. + +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 the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 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. +******************************************************************************/ + +/****************************************************************************** + Xtensa-specific API for RTOS ports. +******************************************************************************/ + +#ifndef __XTENSA_API_H__ +#define __XTENSA_API_H__ + +#include "../xtensa/include/xtensa/hal.h" + +#include "xtensa_context.h" +/* Typedef for C-callable interrupt handler function */ +typedef void (*xt_handler)(void *); + +/* Typedef for C-callable exception handler function */ +typedef void (*xt_exc_handler)(XtExcFrame *); + + +/* +------------------------------------------------------------------------------- + Call this function to set a handler for the specified exception. The handler + will be installed on the core that calls this function. + + n - Exception number (type) + f - Handler function address, NULL to uninstall handler. + + The handler will be passed a pointer to the exception frame, which is created + on the stack of the thread that caused the exception. + + If the handler returns, the thread context will be restored and the faulting + instruction will be retried. Any values in the exception frame that are + modified by the handler will be restored as part of the context. For details + of the exception frame structure see xtensa_context.h. +------------------------------------------------------------------------------- +*/ +extern xt_exc_handler xt_set_exception_handler(int n, xt_exc_handler f); + + +/* +------------------------------------------------------------------------------- + Call this function to set a handler for the specified interrupt. The handler + will be installed on the core that calls this function. + + n - Interrupt number. + f - Handler function address, NULL to uninstall handler. + arg - Argument to be passed to handler. +------------------------------------------------------------------------------- +*/ +extern xt_handler xt_set_interrupt_handler(int n, xt_handler f, void * arg); + + +/* +------------------------------------------------------------------------------- + Call this function to enable the specified interrupts on the core that runs + this code. + + mask - Bit mask of interrupts to be enabled. +------------------------------------------------------------------------------- +*/ +extern void xt_ints_on(unsigned int mask); + + +/* +------------------------------------------------------------------------------- + Call this function to disable the specified interrupts on the core that runs + this code. + + mask - Bit mask of interrupts to be disabled. +------------------------------------------------------------------------------- +*/ +extern void xt_ints_off(unsigned int mask); + + +/* +------------------------------------------------------------------------------- + Call this function to set the specified (s/w) interrupt. +------------------------------------------------------------------------------- +*/ +static inline void xt_set_intset(unsigned int arg) +{ + xthal_set_intset(arg); +} + + +/* +------------------------------------------------------------------------------- + Call this function to clear the specified (s/w or edge-triggered) + interrupt. +------------------------------------------------------------------------------- +*/ +static inline void xt_set_intclear(unsigned int arg) +{ + xthal_set_intclear(arg); +} + +/* +------------------------------------------------------------------------------- + Call this function to get handler's argument for the specified interrupt. + + n - Interrupt number. +------------------------------------------------------------------------------- +*/ +extern void * xt_get_interrupt_handler_arg(int n); + +#endif /* __XTENSA_API_H__ */ + diff --git a/arch/xtensa/include/esp32/freertos/xtensa_config.h b/arch/xtensa/include/esp32/freertos/xtensa_config.h new file mode 100644 index 0000000000000..122326fd4b473 --- /dev/null +++ b/arch/xtensa/include/esp32/freertos/xtensa_config.h @@ -0,0 +1,146 @@ +/******************************************************************************* +// Copyright (c) 2003-2015 Cadence Design Systems, Inc. +// +// 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 the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 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. +-------------------------------------------------------------------------------- + + Configuration-specific information for Xtensa build. This file must be + included in FreeRTOSConfig.h to properly set up the config-dependent + parameters correctly. + + NOTE: To enable thread-safe C library support, XT_USE_THREAD_SAFE_CLIB must + be defined to be > 0 somewhere above or on the command line. + +*******************************************************************************/ + +#ifndef XTENSA_CONFIG_H +#define XTENSA_CONFIG_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "../xtensa/include/xtensa/hal.h" +#include "../xtensa/esp32/include/xtensa/config/core.h" +#include "../xtensa/esp32/include/xtensa/config/system.h" /* required for XSHAL_CLIB */ + +#include "xtensa_context.h" + + +/*----------------------------------------------------------------------------- +* STACK REQUIREMENTS +* +* This section defines the minimum stack size, and the extra space required to +* be allocated for saving coprocessor state and/or C library state information +* (if thread safety is enabled for the C library). The sizes are in bytes. +* +* Stack sizes for individual tasks should be derived from these minima based on +* the maximum call depth of the task and the maximum level of interrupt nesting. +* A minimum stack size is defined by XT_STACK_MIN_SIZE. This minimum is based +* on the requirement for a task that calls nothing else but can be interrupted. +* This assumes that interrupt handlers do not call more than a few levels deep. +* If this is not true, i.e. one or more interrupt handlers make deep calls then +* the minimum must be increased. +* +* If the Xtensa processor configuration includes coprocessors, then space is +* allocated to save the coprocessor state on the stack. +* +* If thread safety is enabled for the C runtime library, (XT_USE_THREAD_SAFE_CLIB +* is defined) then space is allocated to save the C library context in the TCB. +* +* Allocating insufficient stack space is a common source of hard-to-find errors. +* During development, it is best to enable the FreeRTOS stack checking features. +* +* Usage: +* +* XT_USE_THREAD_SAFE_CLIB -- Define this to a nonzero value to enable thread-safe +* use of the C library. This will require extra stack +* space to be allocated for tasks that use the C library +* reentrant functions. See below for more information. +* +* NOTE: The Xtensa toolchain supports multiple C libraries and not all of them +* support thread safety. Check your core configuration to see which C library +* was chosen for your system. +* +* XT_STACK_MIN_SIZE -- The minimum stack size for any task. It is recommended +* that you do not use a stack smaller than this for any +* task. In case you want to use stacks smaller than this +* size, you must verify that the smaller size(s) will work +* under all operating conditions. +* +* XT_STACK_EXTRA -- The amount of extra stack space to allocate for a task +* that does not make C library reentrant calls. Add this +* to the amount of stack space required by the task itself. +* +* XT_STACK_EXTRA_CLIB -- The amount of space to allocate for C library state. +* +-----------------------------------------------------------------------------*/ + +/* Extra space required for interrupt/exception hooks. */ +#ifdef XT_INTEXC_HOOKS + #ifdef __XTENSA_CALL0_ABI__ + #define STK_INTEXC_EXTRA 0x200 + #else + #define STK_INTEXC_EXTRA 0x180 + #endif +#else + #define STK_INTEXC_EXTRA 0 +#endif + +#define XT_CLIB_CONTEXT_AREA_SIZE 0 + +/*------------------------------------------------------------------------------ + Extra size -- interrupt frame plus coprocessor save area plus hook space. + NOTE: Make sure XT_INTEXC_HOOKS is undefined unless you really need the hooks. +------------------------------------------------------------------------------*/ +#ifdef __XTENSA_CALL0_ABI__ + #define XT_XTRA_SIZE (XT_STK_FRMSZ + STK_INTEXC_EXTRA + 0x10 + XT_CP_SIZE) +#else + #define XT_XTRA_SIZE (XT_STK_FRMSZ + STK_INTEXC_EXTRA + 0x20 + XT_CP_SIZE) +#endif + +/*------------------------------------------------------------------------------ + Space allocated for user code -- function calls and local variables. + NOTE: This number can be adjusted to suit your needs. You must verify that the + amount of space you reserve is adequate for the worst-case conditions in your + application. + NOTE: The windowed ABI requires more stack, since space has to be reserved + for spilling register windows. +------------------------------------------------------------------------------*/ +#ifdef __XTENSA_CALL0_ABI__ + #define XT_USER_SIZE 0x200 +#else + #define XT_USER_SIZE 0x400 +#endif + +/* Minimum recommended stack size. */ +#define XT_STACK_MIN_SIZE ((XT_XTRA_SIZE + XT_USER_SIZE) / sizeof(unsigned char)) + +/* OS overhead with and without C library thread context. */ +#define XT_STACK_EXTRA (XT_XTRA_SIZE) +#define XT_STACK_EXTRA_CLIB (XT_XTRA_SIZE + XT_CLIB_CONTEXT_AREA_SIZE) + + +#ifdef __cplusplus +} +#endif + +#endif /* XTENSA_CONFIG_H */ + diff --git a/arch/xtensa/include/esp32/freertos/xtensa_context.h b/arch/xtensa/include/esp32/freertos/xtensa_context.h new file mode 100644 index 0000000000000..f52427cbab9d1 --- /dev/null +++ b/arch/xtensa/include/esp32/freertos/xtensa_context.h @@ -0,0 +1,387 @@ +/******************************************************************************* +Copyright (c) 2006-2015 Cadence Design Systems Inc. + +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 the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 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. +-------------------------------------------------------------------------------- + + XTENSA CONTEXT FRAMES AND MACROS FOR RTOS ASSEMBLER SOURCES + +This header contains definitions and macros for use primarily by Xtensa +RTOS assembly coded source files. It includes and uses the Xtensa hardware +abstraction layer (HAL) to deal with config specifics. It may also be +included in C source files. + +!! Supports only Xtensa Exception Architecture 2 (XEA2). XEA1 not supported. !! + +NOTE: The Xtensa architecture requires stack pointer alignment to 16 bytes. + +*******************************************************************************/ + +#ifndef XTENSA_CONTEXT_H +#define XTENSA_CONTEXT_H + +#ifdef __ASSEMBLER__ +#include +#endif + +#include "../xtensa/esp32/include/xtensa/config/tie.h" +#include "../xtensa/include/xtensa/corebits.h" +#include "../xtensa/esp32/include/xtensa/config/system.h" +#include "../xtensa/include/xtensa/xtruntime-frames.h" + + +/* Align a value up to nearest n-byte boundary, where n is a power of 2. */ +#define ALIGNUP(n, val) (((val) + (n)-1) & -(n)) + + +/* +------------------------------------------------------------------------------- + Macros that help define structures for both C and assembler. +------------------------------------------------------------------------------- +*/ + +#ifdef STRUCT_BEGIN +#undef STRUCT_BEGIN +#undef STRUCT_FIELD +#undef STRUCT_AFIELD +#undef STRUCT_END +#endif + +#if defined(_ASMLANGUAGE) || defined(__ASSEMBLER__) + +#define STRUCT_BEGIN .pushsection .text; .struct 0 +#define STRUCT_FIELD(ctype,size,asname,name) asname: .space size +#define STRUCT_AFIELD(ctype,size,asname,name,n) asname: .space (size)*(n) +#define STRUCT_END(sname) sname##Size:; .popsection + +#else + +#define STRUCT_BEGIN typedef struct { +#define STRUCT_FIELD(ctype,size,asname,name) ctype name; +#define STRUCT_AFIELD(ctype,size,asname,name,n) ctype name[n]; +#define STRUCT_END(sname) } sname; + +#endif //_ASMLANGUAGE || __ASSEMBLER__ + + +/* +------------------------------------------------------------------------------- + INTERRUPT/EXCEPTION STACK FRAME FOR A THREAD OR NESTED INTERRUPT + + A stack frame of this structure is allocated for any interrupt or exception. + It goes on the current stack. If the RTOS has a system stack for handling + interrupts, every thread stack must allow space for just one interrupt stack + frame, then nested interrupt stack frames go on the system stack. + + The frame includes basic registers (explicit) and "extra" registers introduced + by user TIE or the use of the MAC16 option in the user's Xtensa config. + The frame size is minimized by omitting regs not applicable to user's config. + + For Windowed ABI, this stack frame includes the interruptee's base save area, + another base save area to manage gcc nested functions, and a little temporary + space to help manage the spilling of the register windows. +------------------------------------------------------------------------------- +*/ + +STRUCT_BEGIN +STRUCT_FIELD (long, 4, XT_STK_EXIT, exit) /* exit point for dispatch */ +STRUCT_FIELD (long, 4, XT_STK_PC, pc) /* return PC */ +STRUCT_FIELD (long, 4, XT_STK_PS, ps) /* return PS */ +STRUCT_FIELD (long, 4, XT_STK_A0, a0) +STRUCT_FIELD (long, 4, XT_STK_A1, a1) /* stack pointer before interrupt */ +STRUCT_FIELD (long, 4, XT_STK_A2, a2) +STRUCT_FIELD (long, 4, XT_STK_A3, a3) +STRUCT_FIELD (long, 4, XT_STK_A4, a4) +STRUCT_FIELD (long, 4, XT_STK_A5, a5) +STRUCT_FIELD (long, 4, XT_STK_A6, a6) +STRUCT_FIELD (long, 4, XT_STK_A7, a7) +STRUCT_FIELD (long, 4, XT_STK_A8, a8) +STRUCT_FIELD (long, 4, XT_STK_A9, a9) +STRUCT_FIELD (long, 4, XT_STK_A10, a10) +STRUCT_FIELD (long, 4, XT_STK_A11, a11) +STRUCT_FIELD (long, 4, XT_STK_A12, a12) +STRUCT_FIELD (long, 4, XT_STK_A13, a13) +STRUCT_FIELD (long, 4, XT_STK_A14, a14) +STRUCT_FIELD (long, 4, XT_STK_A15, a15) +STRUCT_FIELD (long, 4, XT_STK_SAR, sar) +STRUCT_FIELD (long, 4, XT_STK_EXCCAUSE, exccause) +STRUCT_FIELD (long, 4, XT_STK_EXCVADDR, excvaddr) +#if XCHAL_HAVE_LOOPS +STRUCT_FIELD (long, 4, XT_STK_LBEG, lbeg) +STRUCT_FIELD (long, 4, XT_STK_LEND, lend) +STRUCT_FIELD (long, 4, XT_STK_LCOUNT, lcount) +#endif +#ifndef __XTENSA_CALL0_ABI__ +/* Temporary space for saving stuff during window spill */ +STRUCT_FIELD (long, 4, XT_STK_TMP0, tmp0) +STRUCT_FIELD (long, 4, XT_STK_TMP1, tmp1) +STRUCT_FIELD (long, 4, XT_STK_TMP2, tmp2) +#endif +#ifdef XT_USE_SWPRI +/* Storage for virtual priority mask */ +STRUCT_FIELD (long, 4, XT_STK_VPRI, vpri) +#endif +#ifdef XT_USE_OVLY +/* Storage for overlay state */ +STRUCT_FIELD (long, 4, XT_STK_OVLY, ovly) +#endif +STRUCT_END(XtExcFrame) + +#if defined(_ASMLANGUAGE) || defined(__ASSEMBLER__) +#define XT_STK_NEXT1 XtExcFrameSize +#else +#define XT_STK_NEXT1 sizeof(XtExcFrame) +#endif + +/* Allocate extra storage if needed */ +#if XCHAL_EXTRA_SA_SIZE != 0 + +#if XCHAL_EXTRA_SA_ALIGN <= 16 +#define XT_STK_EXTRA ALIGNUP(XCHAL_EXTRA_SA_ALIGN, XT_STK_NEXT1) +#else +/* If need more alignment than stack, add space for dynamic alignment */ +#define XT_STK_EXTRA (ALIGNUP(XCHAL_EXTRA_SA_ALIGN, XT_STK_NEXT1) + XCHAL_EXTRA_SA_ALIGN) +#endif +#define XT_STK_NEXT2 (XT_STK_EXTRA + XCHAL_EXTRA_SA_SIZE) + +#else + +#define XT_STK_NEXT2 XT_STK_NEXT1 + +#endif + +/* +------------------------------------------------------------------------------- + This is the frame size. Add space for 4 registers (interruptee's base save + area) and some space for gcc nested functions if any. +------------------------------------------------------------------------------- +*/ +#define XT_STK_FRMSZ (ALIGNUP(0x10, XT_STK_NEXT2) + 0x20) + + +/* +------------------------------------------------------------------------------- + SOLICITED STACK FRAME FOR A THREAD + + A stack frame of this structure is allocated whenever a thread enters the + RTOS kernel intentionally (and synchronously) to submit to thread scheduling. + It goes on the current thread's stack. + + The solicited frame only includes registers that are required to be preserved + by the callee according to the compiler's ABI conventions, some space to save + the return address for returning to the caller, and the caller's PS register. + + For Windowed ABI, this stack frame includes the caller's base save area. + + Note on XT_SOL_EXIT field: + It is necessary to distinguish a solicited from an interrupt stack frame. + This field corresponds to XT_STK_EXIT in the interrupt stack frame and is + always at the same offset (0). It can be written with a code (usually 0) + to distinguish a solicted frame from an interrupt frame. An RTOS port may + opt to ignore this field if it has another way of distinguishing frames. +------------------------------------------------------------------------------- +*/ + +STRUCT_BEGIN +#ifdef __XTENSA_CALL0_ABI__ +STRUCT_FIELD (long, 4, XT_SOL_EXIT, exit) +STRUCT_FIELD (long, 4, XT_SOL_PC, pc) +STRUCT_FIELD (long, 4, XT_SOL_PS, ps) +STRUCT_FIELD (long, 4, XT_SOL_NEXT, next) +STRUCT_FIELD (long, 4, XT_SOL_A12, a12) /* should be on 16-byte alignment */ +STRUCT_FIELD (long, 4, XT_SOL_A13, a13) +STRUCT_FIELD (long, 4, XT_SOL_A14, a14) +STRUCT_FIELD (long, 4, XT_SOL_A15, a15) +#else +STRUCT_FIELD (long, 4, XT_SOL_EXIT, exit) +STRUCT_FIELD (long, 4, XT_SOL_PC, pc) +STRUCT_FIELD (long, 4, XT_SOL_PS, ps) +STRUCT_FIELD (long, 4, XT_SOL_NEXT, next) +STRUCT_FIELD (long, 4, XT_SOL_A0, a0) /* should be on 16-byte alignment */ +STRUCT_FIELD (long, 4, XT_SOL_A1, a1) +STRUCT_FIELD (long, 4, XT_SOL_A2, a2) +STRUCT_FIELD (long, 4, XT_SOL_A3, a3) +#endif +STRUCT_END(XtSolFrame) + +/* Size of solicited stack frame */ +#define XT_SOL_FRMSZ ALIGNUP(0x10, XtSolFrameSize) + + +/* +------------------------------------------------------------------------------- + CO-PROCESSOR STATE SAVE AREA FOR A THREAD + + The RTOS must provide an area per thread to save the state of co-processors + when that thread does not have control. Co-processors are context-switched + lazily (on demand) only when a new thread uses a co-processor instruction, + otherwise a thread retains ownership of the co-processor even when it loses + control of the processor. An Xtensa co-processor exception is triggered when + any co-processor instruction is executed by a thread that is not the owner, + and the context switch of that co-processor is then peformed by the handler. + Ownership represents which thread's state is currently in the co-processor. + + Co-processors may not be used by interrupt or exception handlers. If an + co-processor instruction is executed by an interrupt or exception handler, + the co-processor exception handler will trigger a kernel panic and freeze. + This restriction is introduced to reduce the overhead of saving and restoring + co-processor state (which can be quite large) and in particular remove that + overhead from interrupt handlers. + + The co-processor state save area may be in any convenient per-thread location + such as in the thread control block or above the thread stack area. It need + not be in the interrupt stack frame since interrupts don't use co-processors. + + Along with the save area for each co-processor, two bitmasks with flags per + co-processor (laid out as in the CPENABLE reg) help manage context-switching + co-processors as efficiently as possible: + + XT_CPENABLE + The contents of a non-running thread's CPENABLE register. + It represents the co-processors owned (and whose state is still needed) + by the thread. When a thread is preempted, its CPENABLE is saved here. + When a thread solicits a context-swtich, its CPENABLE is cleared - the + compiler has saved the (caller-saved) co-proc state if it needs to. + When a non-running thread loses ownership of a CP, its bit is cleared. + When a thread runs, it's XT_CPENABLE is loaded into the CPENABLE reg. + Avoids co-processor exceptions when no change of ownership is needed. + + XT_CPSTORED + A bitmask with the same layout as CPENABLE, a bit per co-processor. + Indicates whether the state of each co-processor is saved in the state + save area. When a thread enters the kernel, only the state of co-procs + still enabled in CPENABLE is saved. When the co-processor exception + handler assigns ownership of a co-processor to a thread, it restores + the saved state only if this bit is set, and clears this bit. + + XT_CP_CS_ST + A bitmask with the same layout as CPENABLE, a bit per co-processor. + Indicates whether callee-saved state is saved in the state save area. + Callee-saved state is saved by itself on a solicited context switch, + and restored when needed by the coprocessor exception handler. + Unsolicited switches will cause the entire coprocessor to be saved + when necessary. + + XT_CP_ASA + Pointer to the aligned save area. Allows it to be aligned more than + the overall save area (which might only be stack-aligned or TCB-aligned). + Especially relevant for Xtensa cores configured with a very large data + path that requires alignment greater than 16 bytes (ABI stack alignment). +------------------------------------------------------------------------------- +*/ + +#if XCHAL_CP_NUM > 0 + +/* Offsets of each coprocessor save area within the 'aligned save area': */ +#define XT_CP0_SA 0 +#define XT_CP1_SA ALIGNUP(XCHAL_CP1_SA_ALIGN, XT_CP0_SA + XCHAL_CP0_SA_SIZE) +#define XT_CP2_SA ALIGNUP(XCHAL_CP2_SA_ALIGN, XT_CP1_SA + XCHAL_CP1_SA_SIZE) +#define XT_CP3_SA ALIGNUP(XCHAL_CP3_SA_ALIGN, XT_CP2_SA + XCHAL_CP2_SA_SIZE) +#define XT_CP4_SA ALIGNUP(XCHAL_CP4_SA_ALIGN, XT_CP3_SA + XCHAL_CP3_SA_SIZE) +#define XT_CP5_SA ALIGNUP(XCHAL_CP5_SA_ALIGN, XT_CP4_SA + XCHAL_CP4_SA_SIZE) +#define XT_CP6_SA ALIGNUP(XCHAL_CP6_SA_ALIGN, XT_CP5_SA + XCHAL_CP5_SA_SIZE) +#define XT_CP7_SA ALIGNUP(XCHAL_CP7_SA_ALIGN, XT_CP6_SA + XCHAL_CP6_SA_SIZE) +#define XT_CP_SA_SIZE ALIGNUP(16, XT_CP7_SA + XCHAL_CP7_SA_SIZE) + +/* Offsets within the overall save area: */ +#define XT_CPENABLE 0 /* (2 bytes) coprocessors active for this thread */ +#define XT_CPSTORED 2 /* (2 bytes) coprocessors saved for this thread */ +#define XT_CP_CS_ST 4 /* (2 bytes) coprocessor callee-saved regs stored for this thread */ +#define XT_CP_ASA 8 /* (4 bytes) ptr to aligned save area */ +/* Overall size allows for dynamic alignment: */ +#define XT_CP_SIZE (12 + XT_CP_SA_SIZE + XCHAL_TOTAL_SA_ALIGN) +#else +#define XT_CP_SIZE 0 +#endif + + +/* + Macro to get the current core ID. Only uses the reg given as an argument. + Reading PRID on the ESP32 gives us 0xCDCD on the PRO processor (0) + and 0xABAB on the APP CPU (1). We can distinguish between the two by checking + bit 13: it's 1 on the APP and 0 on the PRO processor. +*/ +#ifdef __ASSEMBLER__ + .macro getcoreid reg + rsr.prid \reg + extui \reg,\reg,13,1 + .endm +#endif + +/* Note: These are different to xCoreID used in ESP-IDF FreeRTOS, most places use + 0 and 1 which are determined by checking bit 13 (see previous comment) +*/ +#define CORE_ID_REGVAL_PRO 0xCDCD +#define CORE_ID_REGVAL_APP 0xABAB + +/* Included for compatibility, recommend using CORE_ID_REGVAL_PRO instead */ +#define CORE_ID_PRO CORE_ID_REGVAL_PRO + +/* Included for compatibility, recommend using CORE_ID_REGVAL_APP instead */ +#define CORE_ID_APP CORE_ID_REGVAL_APP + +/* +------------------------------------------------------------------------------- + MACROS TO HANDLE ABI SPECIFICS OF FUNCTION ENTRY AND RETURN + + Convenient where the frame size requirements are the same for both ABIs. + ENTRY(sz), RET(sz) are for framed functions (have locals or make calls). + ENTRY0, RET0 are for frameless functions (no locals, no calls). + + where size = size of stack frame in bytes (must be >0 and aligned to 16). + For framed functions the frame is created and the return address saved at + base of frame (Call0 ABI) or as determined by hardware (Windowed ABI). + For frameless functions, there is no frame and return address remains in a0. + Note: Because CPP macros expand to a single line, macros requiring multi-line + expansions are implemented as assembler macros. +------------------------------------------------------------------------------- +*/ + +#ifdef __ASSEMBLER__ +#ifdef __XTENSA_CALL0_ABI__ + /* Call0 */ + #define ENTRY(sz) entry1 sz + .macro entry1 size=0x10 + addi sp, sp, -\size + s32i a0, sp, 0 + .endm + #define ENTRY0 + #define RET(sz) ret1 sz + .macro ret1 size=0x10 + l32i a0, sp, 0 + addi sp, sp, \size + ret + .endm + #define RET0 ret +#else + /* Windowed */ + #define ENTRY(sz) entry sp, sz + #define ENTRY0 entry sp, 0x10 + #define RET(sz) retw + #define RET0 retw +#endif +#endif + + + + + +#endif /* XTENSA_CONTEXT_H */ + diff --git a/arch/xtensa/include/esp32/freertos/xtensa_rtos.h b/arch/xtensa/include/esp32/freertos/xtensa_rtos.h new file mode 100644 index 0000000000000..c3aaf3ba84f06 --- /dev/null +++ b/arch/xtensa/include/esp32/freertos/xtensa_rtos.h @@ -0,0 +1,232 @@ +/******************************************************************************* +// Copyright (c) 2003-2015 Cadence Design Systems, Inc. +// +// 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 the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 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. +-------------------------------------------------------------------------------- + + RTOS-SPECIFIC INFORMATION FOR XTENSA RTOS ASSEMBLER SOURCES + (FreeRTOS Port) + +This header is the primary glue between generic Xtensa RTOS support +sources and a specific RTOS port for Xtensa. It contains definitions +and macros for use primarily by Xtensa assembly coded source files. + +Macros in this header map callouts from generic Xtensa files to specific +RTOS functions. It may also be included in C source files. + +Xtensa RTOS ports support all RTOS-compatible configurations of the Xtensa +architecture, using the Xtensa hardware abstraction layer (HAL) to deal +with configuration specifics. + +Should be included by all Xtensa generic and RTOS port-specific sources. + +*******************************************************************************/ + +#ifndef XTENSA_RTOS_H +#define XTENSA_RTOS_H + +#ifdef __ASSEMBLER__ +#include +#else +#include "../xtensa/esp32/include/xtensa/config/core.h" +#endif + +#include "../xtensa/include/xtensa/corebits.h" +#include "../xtensa/esp32/include/xtensa/config/system.h" + +/* +Include any RTOS specific definitions that are needed by this header. +*/ +#include "FreeRTOSConfig.h" + +/* +Convert FreeRTOSConfig definitions to XTENSA definitions. +However these can still be overridden from the command line. +*/ + +#ifndef XT_SIMULATOR + #if configXT_SIMULATOR + #define XT_SIMULATOR 1 /* Simulator mode */ + #endif +#endif + +#ifndef XT_BOARD + #if configXT_BOARD + #define XT_BOARD 1 /* Board mode */ + #endif +#endif + +#ifndef XT_TIMER_INDEX + #if defined configXT_TIMER_INDEX + #define XT_TIMER_INDEX configXT_TIMER_INDEX /* Index of hardware timer to be used */ + #endif +#endif + +#ifndef XT_INTEXC_HOOKS + #if configXT_INTEXC_HOOKS + #define XT_INTEXC_HOOKS 1 /* Enables exception hooks */ + #endif +#endif + +#if !defined(XT_SIMULATOR) && !defined(XT_BOARD) + #error Either XT_SIMULATOR or XT_BOARD must be defined. +#endif + + +/* +Name of RTOS (for messages). +*/ +#define XT_RTOS_NAME FreeRTOS + +/* +Check some Xtensa configuration requirements and report error if not met. +Error messages can be customize to the RTOS port. +*/ + +#if !XCHAL_HAVE_XEA2 +#error "FreeRTOS/Xtensa requires XEA2 (exception architecture 2)." +#endif + + +/******************************************************************************* + +RTOS CALLOUT MACROS MAPPED TO RTOS PORT-SPECIFIC FUNCTIONS. + +Define callout macros used in generic Xtensa code to interact with the RTOS. +The macros are simply the function names for use in calls from assembler code. +Some of these functions may call back to generic functions in xtensa_context.h . + +*******************************************************************************/ + +/* +Inform RTOS of entry into an interrupt handler that will affect it. +Allows RTOS to manage switch to any system stack and count nesting level. +Called after minimal context has been saved, with interrupts disabled. +RTOS port can call0 _xt_context_save to save the rest of the context. +May only be called from assembly code by the 'call0' instruction. +*/ +// void XT_RTOS_INT_ENTER(void) +#define XT_RTOS_INT_ENTER _frxt_int_enter + +/* +Inform RTOS of completion of an interrupt handler, and give control to +RTOS to perform thread/task scheduling, switch back from any system stack +and restore the context, and return to the exit dispatcher saved in the +stack frame at XT_STK_EXIT. RTOS port can call0 _xt_context_restore +to save the context saved in XT_RTOS_INT_ENTER via _xt_context_save, +leaving only a minimal part of the context to be restored by the exit +dispatcher. This function does not return to the place it was called from. +May only be called from assembly code by the 'call0' instruction. +*/ +// void XT_RTOS_INT_EXIT(void) +#define XT_RTOS_INT_EXIT _frxt_int_exit + +/* +Inform RTOS of the occurrence of a tick timer interrupt. +If RTOS has no tick timer, leave XT_RTOS_TIMER_INT undefined. +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) +#define XT_RTOS_TIMER_INT _frxt_timer_int +#define XT_TICK_PER_SEC configTICK_RATE_HZ + +/* +Return in a15 the base address of the co-processor state save area for the +thread that triggered a co-processor exception, or 0 if no thread was running. +The state save area is structured as defined in xtensa_context.h and has size +XT_CP_SIZE. Co-processor instructions should only be used in thread code, never +in interrupt handlers or the RTOS kernel. May only be called from assembly code +and by the 'call0' instruction. A result of 0 indicates an unrecoverable error. +The implementation may use only a2-4, a15 (all other regs must be preserved). +*/ +// void* XT_RTOS_CP_STATE(void) +#define XT_RTOS_CP_STATE _frxt_task_coproc_state + + +/******************************************************************************* + +HOOKS TO DYNAMICALLY INSTALL INTERRUPT AND EXCEPTION HANDLERS PER LEVEL. + +This Xtensa RTOS port provides hooks for dynamically installing exception +and interrupt handlers to facilitate automated testing where each test +case can install its own handler for user exceptions and each interrupt +priority (level). This consists of an array of function pointers indexed +by interrupt priority, with index 0 being the user exception handler hook. +Each entry in the array is initially 0, and may be replaced by a function +pointer of type XT_INTEXC_HOOK. A handler may be uninstalled by installing 0. + +The handler for low and medium priority obeys ABI conventions so may be coded +in C. For the exception handler, the cause is the contents of the EXCCAUSE +reg, and the result is -1 if handled, else the cause (still needs handling). +For interrupt handlers, the cause is a mask of pending enabled interrupts at +that level, and the result is the same mask with the bits for the handled +interrupts cleared (those not cleared still need handling). This allows a test +case to either pre-handle or override the default handling for the exception +or interrupt level (see xtensa_vectors.S). + +High priority handlers (including NMI) must be coded in assembly, are always +called by 'call0' regardless of ABI, must preserve all registers except a0, +and must not use or modify the interrupted stack. The hook argument 'cause' +is not passed and the result is ignored, so as not to burden the caller with +saving and restoring a2 (it assumes only one interrupt per level - see the +discussion in high priority interrupts in xtensa_vectors.S). The handler +therefore should be coded to prototype 'void h(void)' even though it plugs +into an array of handlers of prototype 'unsigned h(unsigned)'. + +To enable interrupt/exception hooks, compile the RTOS with '-DXT_INTEXC_HOOKS'. + +*******************************************************************************/ + +#define XT_INTEXC_HOOK_NUM (1 + XCHAL_NUM_INTLEVELS + XCHAL_HAVE_NMI) + +#ifndef __ASSEMBLER__ +typedef unsigned (*XT_INTEXC_HOOK)(unsigned cause); +extern volatile XT_INTEXC_HOOK _xt_intexc_hooks[XT_INTEXC_HOOK_NUM]; +#endif + + +/******************************************************************************* + +CONVENIENCE INCLUSIONS. + +Ensures RTOS specific files need only include this one Xtensa-generic header. +These headers are included last so they can use the RTOS definitions above. + +*******************************************************************************/ + +#include "xtensa_context.h" + +#ifdef XT_RTOS_TIMER_INT +#include "xtensa_timer.h" +#endif + + +/******************************************************************************* + +Xtensa Port Version. + +*******************************************************************************/ + +#define XTENSA_PORT_VERSION 1.4.2 +#define XTENSA_PORT_VERSION_STRING "1.4.2" + +#endif /* XTENSA_RTOS_H */ + diff --git a/arch/xtensa/include/esp32/freertos/xtensa_timer.h b/arch/xtensa/include/esp32/freertos/xtensa_timer.h new file mode 100644 index 0000000000000..bb22e8b5c760a --- /dev/null +++ b/arch/xtensa/include/esp32/freertos/xtensa_timer.h @@ -0,0 +1,159 @@ +/******************************************************************************* +// Copyright (c) 2003-2015 Cadence Design Systems, Inc. +// +// 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 the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 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. +-------------------------------------------------------------------------------- + + XTENSA INFORMATION FOR RTOS TICK TIMER AND CLOCK FREQUENCY + +This header contains definitions and macros for use primarily by Xtensa +RTOS assembly coded source files. It includes and uses the Xtensa hardware +abstraction layer (HAL) to deal with config specifics. It may also be +included in C source files. + +User may edit to modify timer selection and to specify clock frequency and +tick duration to match timer interrupt to the real-time tick duration. + +If the RTOS has no timer interrupt, then there is no tick timer and the +clock frequency is irrelevant, so all of these macros are left undefined +and the Xtensa core configuration need not have a timer. + +*******************************************************************************/ + +#ifndef XTENSA_TIMER_H +#define XTENSA_TIMER_H + +#ifdef __ASSEMBLER__ +#include +#endif + +#include "../xtensa/include/xtensa/corebits.h" +#include "../xtensa/esp32/include/xtensa/config/system.h" + +#include "xtensa_rtos.h" /* in case this wasn't included directly */ + +#include "FreeRTOSConfig.h" + +/* +Select timer to use for periodic tick, and determine its interrupt number +and priority. User may specify a timer by defining XT_TIMER_INDEX with -D, +in which case its validity is checked (it must exist in this core and must +not be on a high priority interrupt - an error will be reported in invalid). +Otherwise select the first low or medium priority interrupt timer available. +*/ +#if XCHAL_NUM_TIMERS == 0 + + #error "This Xtensa configuration is unsupported, it has no timers." + +#else + +#ifndef XT_TIMER_INDEX + #if XCHAL_TIMER3_INTERRUPT != XTHAL_TIMER_UNCONFIGURED + #if XCHAL_INT_LEVEL(XCHAL_TIMER3_INTERRUPT) <= XCHAL_EXCM_LEVEL + #undef XT_TIMER_INDEX + #define XT_TIMER_INDEX 3 + #endif + #endif + #if XCHAL_TIMER2_INTERRUPT != XTHAL_TIMER_UNCONFIGURED + #if XCHAL_INT_LEVEL(XCHAL_TIMER2_INTERRUPT) <= XCHAL_EXCM_LEVEL + #undef XT_TIMER_INDEX + #define XT_TIMER_INDEX 2 + #endif + #endif + #if XCHAL_TIMER1_INTERRUPT != XTHAL_TIMER_UNCONFIGURED + #if XCHAL_INT_LEVEL(XCHAL_TIMER1_INTERRUPT) <= XCHAL_EXCM_LEVEL + #undef XT_TIMER_INDEX + #define XT_TIMER_INDEX 1 + #endif + #endif + #if XCHAL_TIMER0_INTERRUPT != XTHAL_TIMER_UNCONFIGURED + #if XCHAL_INT_LEVEL(XCHAL_TIMER0_INTERRUPT) <= XCHAL_EXCM_LEVEL + #undef XT_TIMER_INDEX + #define XT_TIMER_INDEX 0 + #endif + #endif +#endif +#ifndef XT_TIMER_INDEX + #error "There is no suitable timer in this Xtensa configuration." +#endif + +#define XT_CCOMPARE (CCOMPARE + XT_TIMER_INDEX) +#define XT_TIMER_INTNUM XCHAL_TIMER_INTERRUPT(XT_TIMER_INDEX) +#define XT_TIMER_INTPRI XCHAL_INT_LEVEL(XT_TIMER_INTNUM) +#define XT_TIMER_INTEN (1 << XT_TIMER_INTNUM) + +#if XT_TIMER_INTNUM == XTHAL_TIMER_UNCONFIGURED + #error "The timer selected by XT_TIMER_INDEX does not exist in this core." +#elif XT_TIMER_INTPRI > XCHAL_EXCM_LEVEL + #error "The timer interrupt cannot be high priority (use medium or low)." +#endif + +#endif /* XCHAL_NUM_TIMERS */ + +/* +Set processor clock frequency, used to determine clock divisor for timer tick. +User should BE SURE TO ADJUST THIS for the Xtensa platform being used. +If using a supported board via the board-independent API defined in xtbsp.h, +this may be left undefined and frequency and tick divisor will be computed +and cached during run-time initialization. + +NOTE ON SIMULATOR: +Under the Xtensa instruction set simulator, the frequency can only be estimated +because it depends on the speed of the host and the version of the simulator. +Also because it runs much slower than hardware, it is not possible to achieve +real-time performance for most applications under the simulator. A frequency +too low does not allow enough time between timer interrupts, starving threads. +To obtain a more convenient but non-real-time tick duration on the simulator, +compile with xt-xcc option "-DXT_SIMULATOR". +Adjust this frequency to taste (it's not real-time anyway!). +*/ +#if defined(XT_SIMULATOR) && !defined(XT_CLOCK_FREQ) +#define XT_CLOCK_FREQ configCPU_CLOCK_HZ +#endif + +#if !defined(XT_CLOCK_FREQ) && !defined(XT_BOARD) + #error "XT_CLOCK_FREQ must be defined for the target platform." +#endif + +/* +Default number of timer "ticks" per second (default 100 for 10ms tick). +RTOS may define this in its own way (if applicable) in xtensa_rtos.h. +User may redefine this to an optimal value for the application, either by +editing this here or in xtensa_rtos.h, or compiling with xt-xcc option +"-DXT_TICK_PER_SEC=" where is a suitable number. +*/ +#ifndef XT_TICK_PER_SEC +#define XT_TICK_PER_SEC configTICK_RATE_HZ /* 10 ms tick = 100 ticks per second */ +#endif + +/* +Derivation of clock divisor for timer tick and interrupt (one per tick). +*/ +#ifdef XT_CLOCK_FREQ +#define XT_TICK_DIVISOR (XT_CLOCK_FREQ / XT_TICK_PER_SEC) +#endif + +#ifndef __ASSEMBLER__ +extern unsigned _xt_tick_divisor; +extern void _xt_tick_divisor_init(void); +#endif + +#endif /* XTENSA_TIMER_H */ + diff --git a/arch/xtensa/include/esp32/heap/include/esp_heap_caps.h b/arch/xtensa/include/esp32/heap/include/esp_heap_caps.h new file mode 100644 index 0000000000000..61db74e1ce9a1 --- /dev/null +++ b/arch/xtensa/include/esp32/heap/include/esp_heap_caps.h @@ -0,0 +1,387 @@ +// 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. +#pragma once + +#include +#include +#include "multi_heap.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Flags to indicate the capabilities of the various memory systems + */ +#define MALLOC_CAP_EXEC (1<<0) ///< Memory must be able to run executable code +#define MALLOC_CAP_32BIT (1<<1) ///< Memory must allow for aligned 32-bit data accesses +#define MALLOC_CAP_8BIT (1<<2) ///< Memory must allow for 8/16/...-bit data accesses +#define MALLOC_CAP_DMA (1<<3) ///< Memory must be able to accessed by DMA +#define MALLOC_CAP_PID2 (1<<4) ///< Memory must be mapped to PID2 memory space (PIDs are not currently used) +#define MALLOC_CAP_PID3 (1<<5) ///< Memory must be mapped to PID3 memory space (PIDs are not currently used) +#define MALLOC_CAP_PID4 (1<<6) ///< Memory must be mapped to PID4 memory space (PIDs are not currently used) +#define MALLOC_CAP_PID5 (1<<7) ///< Memory must be mapped to PID5 memory space (PIDs are not currently used) +#define MALLOC_CAP_PID6 (1<<8) ///< Memory must be mapped to PID6 memory space (PIDs are not currently used) +#define MALLOC_CAP_PID7 (1<<9) ///< Memory must be mapped to PID7 memory space (PIDs are not currently used) +#define MALLOC_CAP_SPIRAM (1<<10) ///< Memory must be in SPI RAM +#define MALLOC_CAP_INTERNAL (1<<11) ///< Memory must be internal; specifically it should not disappear when flash/spiram cache is switched off +#define MALLOC_CAP_DEFAULT (1<<12) ///< Memory can be returned in a non-capability-specific memory allocation (e.g. malloc(), calloc()) call +#define MALLOC_CAP_INVALID (1<<31) ///< Memory can't be used / list end marker + +/** + * @brief Allocate a chunk of memory which has the given capabilities + * + * Equivalent semantics to libc malloc(), for capability-aware memory. + * + * In IDF, ``malloc(p)`` is equivalent to ``heap_caps_malloc(p, MALLOC_CAP_8BIT)``. + * + * @param size Size, in bytes, of the amount of memory to allocate + * @param caps Bitwise OR of MALLOC_CAP_* flags indicating the type + * of memory to be returned + * + * @return A pointer to the memory allocated on success, NULL on failure + */ +void *heap_caps_malloc(size_t size, uint32_t caps); + + +/** + * @brief Free memory previously allocated via heap_caps_malloc() or heap_caps_realloc(). + * + * Equivalent semantics to libc free(), for capability-aware memory. + * + * In IDF, ``free(p)`` is equivalent to ``heap_caps_free(p)``. + * + * @param ptr Pointer to memory previously returned from heap_caps_malloc() or heap_caps_realloc(). Can be NULL. + */ +void heap_caps_free( void *ptr); + +/** + * @brief Reallocate memory previously allocated via heap_caps_malloc() or heap_caps_realloc(). + * + * Equivalent semantics to libc realloc(), for capability-aware memory. + * + * In IDF, ``realloc(p, s)`` is equivalent to ``heap_caps_realloc(p, s, MALLOC_CAP_8BIT)``. + * + * 'caps' parameter can be different to the capabilities that any original 'ptr' was allocated with. In this way, + * realloc can be used to "move" a buffer if necessary to ensure it meets a new set of capabilities. + * + * @param ptr Pointer to previously allocated memory, or NULL for a new allocation. + * @param size Size of the new buffer requested, or 0 to free the buffer. + * @param caps Bitwise OR of MALLOC_CAP_* flags indicating the type + * of memory desired for the new allocation. + * + * @return Pointer to a new buffer of size 'size' with capabilities 'caps', or NULL if allocation failed. + */ +void *heap_caps_realloc( void *ptr, size_t size, int caps); + +/** + * @brief Allocate a aligned chunk of memory which has the given capabilities + * + * Equivalent semantics to libc aligned_alloc(), for capability-aware memory. + * @param alignment How the pointer received needs to be aligned + * must be a power of two + * @param size Size, in bytes, of the amount of memory to allocate + * @param caps Bitwise OR of MALLOC_CAP_* flags indicating the type + * of memory to be returned + * + * @return A pointer to the memory allocated on success, NULL on failure + * + * @note Any memory allocated with heaps_caps_aligned_alloc() MUST + * be freed with heap_caps_aligned_free() and CANNOT be passed to free() + * + */ +void *heap_caps_aligned_alloc(size_t alignment, size_t size, int caps); + +/** + * @brief Allocate a aligned chunk of memory which has the given capabilities. The initialized value in the memory is set to zero. + * + * @param alignment How the pointer received needs to be aligned + * must be a power of two + * @param n Number of continuing chunks of memory to allocate + * @param size Size, in bytes, of a chunk of memory to allocate + * @param caps Bitwise OR of MALLOC_CAP_* flags indicating the type + * of memory to be returned + * + * @return A pointer to the memory allocated on success, NULL on failure + * + * @note Any memory allocated with heap_caps_aligned_calloc() MUST + * be freed with heap_caps_aligned_free() and CANNOT be passed to free() + */ +void *heap_caps_aligned_calloc(size_t alignment, size_t n, size_t size, uint32_t caps); + +/** + * @brief Used to deallocate memory previously allocated with heap_caps_aligned_alloc + * + * @param ptr Pointer to the memory allocated + * @note This function is aimed to deallocate only memory allocated with + * heap_caps_aligned_alloc, memory allocated with heap_caps_malloc + * MUST not be passed to this function + */ +void heap_caps_aligned_free(void *ptr); + +/** + * @brief Allocate a chunk of memory which has the given capabilities. The initialized value in the memory is set to zero. + * + * Equivalent semantics to libc calloc(), for capability-aware memory. + * + * In IDF, ``calloc(p)`` is equivalent to ``heap_caps_calloc(p, MALLOC_CAP_8BIT)``. + * + * @param n Number of continuing chunks of memory to allocate + * @param size Size, in bytes, of a chunk of memory to allocate + * @param caps Bitwise OR of MALLOC_CAP_* flags indicating the type + * of memory to be returned + * + * @return A pointer to the memory allocated on success, NULL on failure + */ +void *heap_caps_calloc(size_t n, size_t size, uint32_t caps); + +/** + * @brief Get the total size of all the regions that have the given capabilities + * + * This function takes all regions capable of having the given capabilities allocated in them + * and adds up the total space they have. + * + * @param caps Bitwise OR of MALLOC_CAP_* flags indicating the type + * of memory + * + * @return total size in bytes + */ + +size_t heap_caps_get_total_size(uint32_t caps); + +/** + * @brief Get the total free size of all the regions that have the given capabilities + * + * This function takes all regions capable of having the given capabilities allocated in them + * and adds up the free space they have. + * + * Note that because of heap fragmentation it is probably not possible to allocate a single block of memory + * of this size. Use heap_caps_get_largest_free_block() for this purpose. + + * @param caps Bitwise OR of MALLOC_CAP_* flags indicating the type + * of memory + * + * @return Amount of free bytes in the regions + */ +size_t heap_caps_get_free_size( uint32_t caps ); + + +/** + * @brief Get the total minimum free memory of all regions with the given capabilities + * + * This adds all the low water marks of the regions capable of delivering the memory + * with the given capabilities. + * + * Note the result may be less than the global all-time minimum available heap of this kind, as "low water marks" are + * tracked per-region. Individual regions' heaps may have reached their "low water marks" at different points in time. However + * this result still gives a "worst case" indication for all-time minimum free heap. + * + * @param caps Bitwise OR of MALLOC_CAP_* flags indicating the type + * of memory + * + * @return Amount of free bytes in the regions + */ +size_t heap_caps_get_minimum_free_size( uint32_t caps ); + +/** + * @brief Get the largest free block of memory able to be allocated with the given capabilities. + * + * Returns the largest value of ``s`` for which ``heap_caps_malloc(s, caps)`` will succeed. + * + * @param caps Bitwise OR of MALLOC_CAP_* flags indicating the type + * of memory + * + * @return Size of largest free block in bytes. + */ +size_t heap_caps_get_largest_free_block( uint32_t caps ); + + +/** + * @brief Get heap info for all regions with the given capabilities. + * + * Calls multi_heap_info() on all heaps which share the given capabilities. The information returned is an aggregate + * across all matching heaps. The meanings of fields are the same as defined for multi_heap_info_t, except that + * ``minimum_free_bytes`` has the same caveats described in heap_caps_get_minimum_free_size(). + * + * @param info Pointer to a structure which will be filled with relevant + * heap metadata. + * @param caps Bitwise OR of MALLOC_CAP_* flags indicating the type + * of memory + * + */ +void heap_caps_get_info( multi_heap_info_t *info, uint32_t caps ); + + +/** + * @brief Print a summary of all memory with the given capabilities. + * + * Calls multi_heap_info on all heaps which share the given capabilities, and + * prints a two-line summary for each, then a total summary. + * + * @param caps Bitwise OR of MALLOC_CAP_* flags indicating the type + * of memory + * + */ +void heap_caps_print_heap_info( uint32_t caps ); + +/** + * @brief Check integrity of all heap memory in the system. + * + * Calls multi_heap_check on all heaps. Optionally print errors if heaps are corrupt. + * + * Calling this function is equivalent to calling heap_caps_check_integrity + * with the caps argument set to MALLOC_CAP_INVALID. + * + * @param print_errors Print specific errors if heap corruption is found. + * + * @return True if all heaps are valid, False if at least one heap is corrupt. + */ +bool heap_caps_check_integrity_all(bool print_errors); + +/** + * @brief Check integrity of all heaps with the given capabilities. + * + * Calls multi_heap_check on all heaps which share the given capabilities. Optionally + * print errors if the heaps are corrupt. + * + * See also heap_caps_check_integrity_all to check all heap memory + * in the system and heap_caps_check_integrity_addr to check memory + * around a single address. + * + * @param caps Bitwise OR of MALLOC_CAP_* flags indicating the type + * of memory + * @param print_errors Print specific errors if heap corruption is found. + * + * @return True if all heaps are valid, False if at least one heap is corrupt. + */ +bool heap_caps_check_integrity(uint32_t caps, bool print_errors); + +/** + * @brief Check integrity of heap memory around a given address. + * + * This function can be used to check the integrity of a single region of heap memory, + * which contains the given address. + * + * This can be useful if debugging heap integrity for corruption at a known address, + * as it has a lower overhead than checking all heap regions. Note that if the corrupt + * address moves around between runs (due to timing or other factors) then this approach + * won't work and you should call heap_caps_check_integrity or + * heap_caps_check_integrity_all instead. + * + * @note The entire heap region around the address is checked, not only the adjacent + * heap blocks. + * + * @param addr Address in memory. Check for corruption in region containing this address. + * @param print_errors Print specific errors if heap corruption is found. + * + * @return True if the heap containing the specified address is valid, + * False if at least one heap is corrupt or the address doesn't belong to a heap region. + */ +bool heap_caps_check_integrity_addr(intptr_t addr, bool print_errors); + +/** + * @brief Enable malloc() in external memory and set limit below which + * malloc() attempts are placed in internal memory. + * + * When external memory is in use, the allocation strategy is to initially try to + * satisfy smaller allocation requests with internal memory and larger requests + * with external memory. This sets the limit between the two, as well as generally + * enabling allocation in external memory. + * + * @param limit Limit, in bytes. + */ +void heap_caps_malloc_extmem_enable(size_t limit); + +/** + * @brief Allocate a chunk of memory as preference in decreasing order. + * + * @attention The variable parameters are bitwise OR of MALLOC_CAP_* flags indicating the type of memory. + * This API prefers to allocate memory with the first parameter. If failed, allocate memory with + * the next parameter. It will try in this order until allocating a chunk of memory successfully + * or fail to allocate memories with any of the parameters. + * + * @param size Size, in bytes, of the amount of memory to allocate + * @param num Number of variable paramters + * + * @return A pointer to the memory allocated on success, NULL on failure + */ +void *heap_caps_malloc_prefer( size_t size, size_t num, ... ); + +/** + * @brief Allocate a chunk of memory as preference in decreasing order. + * + * @param ptr Pointer to previously allocated memory, or NULL for a new allocation. + * @param size Size of the new buffer requested, or 0 to free the buffer. + * @param num Number of variable paramters + * + * @return Pointer to a new buffer of size 'size', or NULL if allocation failed. + */ +void *heap_caps_realloc_prefer( void *ptr, size_t size, size_t num, ... ); + +/** + * @brief Allocate a chunk of memory as preference in decreasing order. + * + * @param n Number of continuing chunks of memory to allocate + * @param size Size, in bytes, of a chunk of memory to allocate + * @param num Number of variable paramters + * + * @return A pointer to the memory allocated on success, NULL on failure + */ +void *heap_caps_calloc_prefer( size_t n, size_t size, size_t num, ... ); + +/** + * @brief Dump the full structure of all heaps with matching capabilities. + * + * Prints a large amount of output to serial (because of locking limitations, + * the output bypasses stdout/stderr). For each (variable sized) block + * in each matching heap, the following output is printed on a single line: + * + * - Block address (the data buffer returned by malloc is 4 bytes after this + * if heap debugging is set to Basic, or 8 bytes otherwise). + * - Data size (the data size may be larger than the size requested by malloc, + * either due to heap fragmentation or because of heap debugging level). + * - Address of next block in the heap. + * - If the block is free, the address of the next free block is also printed. + * + * @param caps Bitwise OR of MALLOC_CAP_* flags indicating the type + * of memory + */ +void heap_caps_dump(uint32_t caps); + +/** + * @brief Dump the full structure of all heaps. + * + * Covers all registered heaps. Prints a large amount of output to serial. + * + * Output is the same as for heap_caps_dump. + * + */ +void heap_caps_dump_all(void); + +/** + * @brief Return the size that a particular pointer was allocated with. + * + * @param ptr Pointer to currently allocated heap memory. Must be a pointer value previously + * returned by heap_caps_malloc,malloc,calloc, etc. and not yet freed. + * + * @note The app will crash with an assertion failure if the pointer is not valid. + * + * @return Size of the memory allocated at this block. + * + */ +size_t heap_caps_get_allocated_size( void *ptr ); + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/heap/include/esp_heap_caps_init.h b/arch/xtensa/include/esp32/heap/include/esp_heap_caps_init.h new file mode 100644 index 0000000000000..1d16c490c8ee9 --- /dev/null +++ b/arch/xtensa/include/esp32/heap/include/esp_heap_caps_init.h @@ -0,0 +1,92 @@ +// 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. +#pragma once + +#include "esp_err.h" +#include "esp_heap_caps.h" +#include "soc/soc_memory_layout.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Initialize the capability-aware heap allocator. + * + * This is called once in the IDF startup code. Do not call it + * at other times. + */ +void heap_caps_init(void); + +/** + * @brief Enable heap(s) in memory regions where the startup stacks are located. + * + * On startup, the pro/app CPUs have a certain memory region they use as stack, so we + * cannot do allocations in the regions these stack frames are. When FreeRTOS is + * completely started, they do not use that memory anymore and heap(s) there can + * be enabled. + */ +void heap_caps_enable_nonos_stack_heaps(void); + +/** + * @brief Add a region of memory to the collection of heaps at runtime. + * + * Most memory regions are defined in soc_memory_layout.c for the SoC, + * and are registered via heap_caps_init(). Some regions can't be used + * immediately and are later enabled via heap_caps_enable_nonos_stack_heaps(). + * + * Call this function to add a region of memory to the heap at some later time. + * + * This function does not consider any of the "reserved" regions or other data in soc_memory_layout, caller needs to + * consider this themselves. + * + * All memory within the region specified by start & end parameters must be otherwise unused. + * + * The capabilities of the newly registered memory will be determined by the start address, as looked up in the regions + * specified in soc_memory_layout.c. + * + * Use heap_caps_add_region_with_caps() to register a region with custom capabilities. + * + * @param start Start address of new region. + * @param end End address of new region. + * + * @return ESP_OK on success, ESP_ERR_INVALID_ARG if a parameter is invalid, ESP_ERR_NOT_FOUND if the + * specified start address doesn't reside in a known region, or any error returned by heap_caps_add_region_with_caps(). + */ +esp_err_t heap_caps_add_region(intptr_t start, intptr_t end); + + +/** + * @brief Add a region of memory to the collection of heaps at runtime, with custom capabilities. + * + * Similar to heap_caps_add_region(), only custom memory capabilities are specified by the caller. + * + * @param caps Ordered array of capability masks for the new region, in order of priority. Must have length + * SOC_MEMORY_TYPE_NO_PRIOS. Does not need to remain valid after the call returns. + * @param start Start address of new region. + * @param end End address of new region. + * + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG if a parameter is invalid + * - ESP_ERR_NO_MEM if no memory to register new heap. + * - ESP_ERR_INVALID_SIZE if the memory region is too small to fit a heap + * - ESP_FAIL if region overlaps the start and/or end of an existing region + */ +esp_err_t heap_caps_add_region_with_caps(const uint32_t caps[], intptr_t start, intptr_t end); + + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/heap/include/esp_heap_task_info.h b/arch/xtensa/include/esp32/heap/include/esp_heap_task_info.h new file mode 100644 index 0000000000000..fca9a43ba6669 --- /dev/null +++ b/arch/xtensa/include/esp32/heap/include/esp_heap_task_info.h @@ -0,0 +1,98 @@ +// 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. +#pragma once + +#ifdef CONFIG_HEAP_TASK_TRACKING + +#ifdef __cplusplus +extern "C" { +#endif + +// This macro controls how much space is provided for partitioning the per-task +// heap allocation info according to one or more sets of heap capabilities. +#define NUM_HEAP_TASK_CAPS 4 + +/** @brief Structure to collect per-task heap allocation totals partitioned by selected caps */ +typedef struct { + TaskHandle_t task; ///< Task to which these totals belong + size_t size[NUM_HEAP_TASK_CAPS]; ///< Total allocations partitioned by selected caps + size_t count[NUM_HEAP_TASK_CAPS]; ///< Number of blocks partitioned by selected caps +} heap_task_totals_t; + +/** @brief Structure providing details about a block allocated by a task */ +typedef struct { + TaskHandle_t task; ///< Task that allocated the block + void *address; ///< User address of allocated block + uint32_t size; ///< Size of the allocated block +} heap_task_block_t; + +/** @brief Structure to provide parameters to heap_caps_get_per_task_info + * + * The 'caps' and 'mask' arrays allow partitioning the per-task heap allocation + * totals by selected sets of heap region capabilities so that totals for + * multiple regions can be accumulated in one scan. The capabilities flags for + * each region ANDed with mask[i] are compared to caps[i] in order; the + * allocations in that region are added to totals->size[i] and totals->count[i] + * for the first i that matches. To collect the totals without any + * partitioning, set mask[0] and caps[0] both to zero. The allocation totals + * are returned in the 'totals' array of heap_task_totals_t structs. To allow + * easily comparing the totals array between consecutive calls, that array can + * be left populated from one call to the next so the order of tasks is the + * same even if some tasks have freed their blocks or have been deleted. The + * number of blocks prepopulated is given by num_totals, which is updated upon + * return. If there are more tasks with allocations than the capacity of the + * totals array (given by max_totals), information for the excess tasks will be + * not be collected. The totals array pointer can be NULL if the totals are + * not desired. + * + * The 'tasks' array holds a list of handles for tasks whose block details are + * to be returned in the 'blocks' array of heap_task_block_t structs. If the + * tasks array pointer is NULL, block details for all tasks will be returned up + * to the capacity of the buffer array, given by max_blocks. The function + * return value tells the number of blocks filled into the array. The blocks + * array pointer can be NULL if block details are not desired, or max_blocks + * can be set to zero. + */ +typedef struct { + int32_t caps[NUM_HEAP_TASK_CAPS]; ///< Array of caps for partitioning task totals + int32_t mask[NUM_HEAP_TASK_CAPS]; ///< Array of masks under which caps must match + TaskHandle_t *tasks; ///< Array of tasks whose block info is returned + size_t num_tasks; ///< Length of tasks array + heap_task_totals_t *totals; ///< Array of structs to collect task totals + size_t *num_totals; ///< Number of task structs currently in array + size_t max_totals; ///< Capacity of array of task totals structs + heap_task_block_t *blocks; ///< Array of task block details structs + size_t max_blocks; ///< Capacity of array of task block info structs +} heap_task_info_params_t; + +/** + * @brief Return per-task heap allocation totals and lists of blocks. + * + * For each task that has allocated memory from the heap, return totals for + * allocations within regions matching one or more sets of capabilities. + * + * Optionally also return an array of structs providing details about each + * block allocated by one or more requested tasks, or by all tasks. + * + * @param params Structure to hold all the parameters for the function + * (@see heap_task_info_params_t). + * @return Number of block detail structs returned (@see heap_task_block_t). + */ +extern size_t heap_caps_get_per_task_info(heap_task_info_params_t *params); + +#ifdef __cplusplus +} +#endif + +#endif // CONFIG_HEAP_TASK_TRACKING diff --git a/arch/xtensa/include/esp32/heap/include/esp_heap_trace.h b/arch/xtensa/include/esp32/heap/include/esp_heap_trace.h new file mode 100644 index 0000000000000..cb81618f11f60 --- /dev/null +++ b/arch/xtensa/include/esp32/heap/include/esp_heap_trace.h @@ -0,0 +1,154 @@ +// 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. +#pragma once + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(CONFIG_HEAP_TRACING) && !defined(HEAP_TRACE_SRCFILE) +#warning "esp_heap_trace.h is included but heap tracing is disabled in menuconfig, functions are no-ops" +#endif + +#ifndef CONFIG_HEAP_TRACING_STACK_DEPTH +#define CONFIG_HEAP_TRACING_STACK_DEPTH 0 +#endif + +typedef enum { + HEAP_TRACE_ALL, + HEAP_TRACE_LEAKS, +} heap_trace_mode_t; + +/** + * @brief Trace record data type. Stores information about an allocated region of memory. + */ +typedef struct { + uint32_t ccount; ///< CCOUNT of the CPU when the allocation was made. LSB (bit value 1) is the CPU number (0 or 1). + void *address; ///< Address which was allocated + size_t size; ///< Size of the allocation + void *alloced_by[CONFIG_HEAP_TRACING_STACK_DEPTH]; ///< Call stack of the caller which allocated the memory. + void *freed_by[CONFIG_HEAP_TRACING_STACK_DEPTH]; ///< Call stack of the caller which freed the memory (all zero if not freed.) +} heap_trace_record_t; + +/** + * @brief Initialise heap tracing in standalone mode. + * + * This function must be called before any other heap tracing functions. + * + * To disable heap tracing and allow the buffer to be freed, stop tracing and then call heap_trace_init_standalone(NULL, 0); + * + * @param record_buffer Provide a buffer to use for heap trace data. Must remain valid any time heap tracing is enabled, meaning + * it must be allocated from internal memory not in PSRAM. + * @param num_records Size of the heap trace buffer, as number of record structures. + * @return + * - ESP_ERR_NOT_SUPPORTED Project was compiled without heap tracing enabled in menuconfig. + * - ESP_ERR_INVALID_STATE Heap tracing is currently in progress. + * - ESP_OK Heap tracing initialised successfully. + */ +esp_err_t heap_trace_init_standalone(heap_trace_record_t *record_buffer, size_t num_records); + +/** + * @brief Initialise heap tracing in host-based mode. + * + * This function must be called before any other heap tracing functions. + * + * @return + * - ESP_ERR_INVALID_STATE Heap tracing is currently in progress. + * - ESP_OK Heap tracing initialised successfully. + */ +esp_err_t heap_trace_init_tohost(void); + +/** + * @brief Start heap tracing. All heap allocations & frees will be traced, until heap_trace_stop() is called. + * + * @note heap_trace_init_standalone() must be called to provide a valid buffer, before this function is called. + * + * @note Calling this function while heap tracing is running will reset the heap trace state and continue tracing. + * + * @param mode Mode for tracing. + * - HEAP_TRACE_ALL means all heap allocations and frees are traced. + * - HEAP_TRACE_LEAKS means only suspected memory leaks are traced. (When memory is freed, the record is removed from the trace buffer.) + * @return + * - ESP_ERR_NOT_SUPPORTED Project was compiled without heap tracing enabled in menuconfig. + * - ESP_ERR_INVALID_STATE A non-zero-length buffer has not been set via heap_trace_init_standalone(). + * - ESP_OK Tracing is started. + */ +esp_err_t heap_trace_start(heap_trace_mode_t mode); + +/** + * @brief Stop heap tracing. + * + * @return + * - ESP_ERR_NOT_SUPPORTED Project was compiled without heap tracing enabled in menuconfig. + * - ESP_ERR_INVALID_STATE Heap tracing was not in progress. + * - ESP_OK Heap tracing stopped.. + */ +esp_err_t heap_trace_stop(void); + +/** + * @brief Resume heap tracing which was previously stopped. + * + * Unlike heap_trace_start(), this function does not clear the + * buffer of any pre-existing trace records. + * + * The heap trace mode is the same as when heap_trace_start() was + * last called (or HEAP_TRACE_ALL if heap_trace_start() was never called). + * + * @return + * - ESP_ERR_NOT_SUPPORTED Project was compiled without heap tracing enabled in menuconfig. + * - ESP_ERR_INVALID_STATE Heap tracing was already started. + * - ESP_OK Heap tracing resumed. + */ +esp_err_t heap_trace_resume(void); + +/** + * @brief Return number of records in the heap trace buffer + * + * It is safe to call this function while heap tracing is running. + */ +size_t heap_trace_get_count(void); + +/** + * @brief Return a raw record from the heap trace buffer + * + * @note It is safe to call this function while heap tracing is running, however in HEAP_TRACE_LEAK mode record indexing may + * skip entries unless heap tracing is stopped first. + * + * @param index Index (zero-based) of the record to return. + * @param[out] record Record where the heap trace record will be copied. + * @return + * - ESP_ERR_NOT_SUPPORTED Project was compiled without heap tracing enabled in menuconfig. + * - ESP_ERR_INVALID_STATE Heap tracing was not initialised. + * - ESP_ERR_INVALID_ARG Index is out of bounds for current heap trace record count. + * - ESP_OK Record returned successfully. + */ +esp_err_t heap_trace_get(size_t index, heap_trace_record_t *record); + +/** + * @brief Dump heap trace record data to stdout + * + * @note It is safe to call this function while heap tracing is running, however in HEAP_TRACE_LEAK mode the dump may skip + * entries unless heap tracing is stopped first. + * + * + */ +void heap_trace_dump(void); + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/heap/include/heap_trace.inc b/arch/xtensa/include/esp32/heap/include/heap_trace.inc new file mode 100644 index 0000000000000..1148c887bebed --- /dev/null +++ b/arch/xtensa/include/esp32/heap/include/heap_trace.inc @@ -0,0 +1,200 @@ +// 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 +#include "soc/soc_memory_layout.h" +#include "esp_attr.h" + +/* Encode the CPU ID in the LSB of the ccount value */ +inline static uint32_t get_ccount(void) +{ + uint32_t ccount = xthal_get_ccount() & ~3; +#ifndef CONFIG_FREERTOS_UNICORE + ccount |= xPortGetCoreID(); +#endif + return ccount; +} + +/* Architecture-specific return value of __builtin_return_address which + * should be interpreted as an invalid address. + */ +#ifdef __XTENSA__ +#define HEAP_ARCH_INVALID_PC 0x40000000 +#else +#define HEAP_ARCH_INVALID_PC 0x00000000 +#endif + +// Caller is 2 stack frames deeper than we care about +#define STACK_OFFSET 2 + +#define TEST_STACK(N) do { \ + if (STACK_DEPTH == N) { \ + return; \ + } \ + callers[N] = __builtin_return_address(N+STACK_OFFSET); \ + if (!esp_ptr_executable(callers[N]) \ + || callers[N] == (void*) HEAP_ARCH_INVALID_PC) { \ + callers[N] = 0; \ + return; \ + } \ + } while(0) + +/* Static function to read the call stack for a traced heap call. + + Calls to __builtin_return_address are "unrolled" via TEST_STACK macro as gcc requires the + argument to be a compile-time constant. +*/ +static IRAM_ATTR __attribute__((noinline)) void get_call_stack(void **callers) +{ + bzero(callers, sizeof(void *) * STACK_DEPTH); + TEST_STACK(0); + TEST_STACK(1); + TEST_STACK(2); + TEST_STACK(3); + TEST_STACK(4); + TEST_STACK(5); + TEST_STACK(6); + TEST_STACK(7); + TEST_STACK(8); + TEST_STACK(9); +} + +_Static_assert(STACK_DEPTH >= 0 && STACK_DEPTH <= 10, "CONFIG_HEAP_TRACING_STACK_DEPTH must be in range 0-10"); + + +typedef enum { + TRACE_MALLOC_CAPS, + TRACE_MALLOC_DEFAULT +} trace_malloc_mode_t; + + +void *__real_heap_caps_malloc(size_t size, uint32_t caps); +void *__real_heap_caps_malloc_default( size_t size ); +void *__real_heap_caps_realloc_default( void *ptr, size_t size ); + +/* trace any 'malloc' event */ +static IRAM_ATTR __attribute__((noinline)) void *trace_malloc(size_t size, uint32_t caps, trace_malloc_mode_t mode) +{ + uint32_t ccount = get_ccount(); + void *p; + + if ( mode == TRACE_MALLOC_CAPS ) { + p = __real_heap_caps_malloc(size, caps); + } else { //TRACE_MALLOC_DEFAULT + p = __real_heap_caps_malloc_default(size); + } + + heap_trace_record_t rec = { + .address = p, + .ccount = ccount, + .size = size, + }; + get_call_stack(rec.alloced_by); + record_allocation(&rec); + return p; +} + +void __real_heap_caps_free(void *p); + +/* trace any 'free' event */ +static IRAM_ATTR __attribute__((noinline)) void trace_free(void *p) +{ + void *callers[STACK_DEPTH]; + get_call_stack(callers); + record_free(p, callers); + + __real_heap_caps_free(p); +} + +void * __real_heap_caps_realloc(void *p, size_t size, uint32_t caps); + +/* trace any 'realloc' event */ +static IRAM_ATTR __attribute__((noinline)) void *trace_realloc(void *p, size_t size, uint32_t caps, trace_malloc_mode_t mode) +{ + void *callers[STACK_DEPTH]; + uint32_t ccount = get_ccount(); + void *r; + + /* trace realloc as free-then-alloc */ + get_call_stack(callers); + record_free(p, callers); + + if (mode == TRACE_MALLOC_CAPS ) { + r = __real_heap_caps_realloc(p, size, caps); + } else { //TRACE_MALLOC_DEFAULT + r = __real_heap_caps_realloc_default(p, size); + } + /* realloc with zero size is a free */ + if (size != 0) { + heap_trace_record_t rec = { + .address = r, + .ccount = ccount, + .size = size, + }; + memcpy(rec.alloced_by, callers, sizeof(void *) * STACK_DEPTH); + record_allocation(&rec); + } + return r; +} + +/* Note: this changes the behaviour of libc malloc/realloc/free a bit, + as they no longer go via the libc functions in ROM. But more or less + the same in the end. */ + +IRAM_ATTR void *__wrap_malloc(size_t size) +{ + return trace_malloc(size, 0, TRACE_MALLOC_DEFAULT); +} + +IRAM_ATTR void __wrap_free(void *p) +{ + trace_free(p); +} + +IRAM_ATTR void *__wrap_realloc(void *p, size_t size) +{ + return trace_realloc(p, size, 0, TRACE_MALLOC_DEFAULT); +} + +IRAM_ATTR void *__wrap_calloc(size_t nmemb, size_t size) +{ + size = size * nmemb; + void *result = trace_malloc(size, 0, TRACE_MALLOC_DEFAULT); + if (result != NULL) { + memset(result, 0, size); + } + return result; +} + +IRAM_ATTR void *__wrap_heap_caps_malloc(size_t size, uint32_t caps) +{ + return trace_malloc(size, caps, TRACE_MALLOC_CAPS); +} + +void __wrap_heap_caps_free(void *p) __attribute__((alias("__wrap_free"))); + +IRAM_ATTR void *__wrap_heap_caps_realloc(void *p, size_t size, uint32_t caps) +{ + return trace_realloc(p, size, caps, TRACE_MALLOC_CAPS); +} + +IRAM_ATTR void *__wrap_heap_caps_malloc_default( size_t size ) +{ + return trace_malloc(size, 0, TRACE_MALLOC_DEFAULT); +} + +IRAM_ATTR void *__wrap_heap_caps_realloc_default( void *ptr, size_t size ) +{ + return trace_realloc(ptr, size, 0, TRACE_MALLOC_DEFAULT); +} diff --git a/arch/xtensa/include/esp32/heap/include/multi_heap.h b/arch/xtensa/include/esp32/heap/include/multi_heap.h new file mode 100644 index 0000000000000..d07d418023f93 --- /dev/null +++ b/arch/xtensa/include/esp32/heap/include/multi_heap.h @@ -0,0 +1,190 @@ +// 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. +#pragma once +#include +#include +#include + +/* multi_heap is a heap implementation for handling multiple + heterogenous heaps in a single program. + + Any contiguous block of memory can be registered as a heap. +*/ + +#ifdef __cplusplus +extern "C" { +#endif + +/** @brief Opaque handle to a registered heap */ +typedef struct multi_heap_info *multi_heap_handle_t; + +/** + * @brief allocate a chunk of memory with specific alignment + * + * @param heap Handle to a registered heap. + * @param size size in bytes of memory chunk + * @param alignment how the memory must be aligned + * + * @return pointer to the memory allocated, NULL on failure + */ +void *multi_heap_aligned_alloc(multi_heap_handle_t heap, size_t size, size_t alignment); + +/** @brief malloc() a buffer in a given heap + * + * Semantics are the same as standard malloc(), only the returned buffer will be allocated in the specified heap. + * + * @param heap Handle to a registered heap. + * @param size Size of desired buffer. + * + * @return Pointer to new memory, or NULL if allocation fails. + */ +void *multi_heap_malloc(multi_heap_handle_t heap, size_t size); + +/** @brief free() a buffer aligned in a given heap. + * + * @param heap Handle to a registered heap. + * @param p NULL, or a pointer previously returned from multi_heap_aligned_alloc() for the same heap. + */ +void multi_heap_aligned_free(multi_heap_handle_t heap, void *p); + + +/** @brief free() a buffer in a given heap. + * + * Semantics are the same as standard free(), only the argument 'p' must be NULL or have been allocated in the specified heap. + * + * @param heap Handle to a registered heap. + * @param p NULL, or a pointer previously returned from multi_heap_malloc() or multi_heap_realloc() for the same heap. + */ +void multi_heap_free(multi_heap_handle_t heap, void *p); + +/** @brief realloc() a buffer in a given heap. + * + * Semantics are the same as standard realloc(), only the argument 'p' must be NULL or have been allocated in the specified heap. + * + * @param heap Handle to a registered heap. + * @param p NULL, or a pointer previously returned from multi_heap_malloc() or multi_heap_realloc() for the same heap. + * @param size Desired new size for buffer. + * + * @return New buffer of 'size' containing contents of 'p', or NULL if reallocation failed. + */ +void *multi_heap_realloc(multi_heap_handle_t heap, void *p, size_t size); + + +/** @brief Return the size that a particular pointer was allocated with. + * + * @param heap Handle to a registered heap. + * @param p Pointer, must have been previously returned from multi_heap_malloc() or multi_heap_realloc() for the same heap. + * + * @return Size of the memory allocated at this block. May be more than the original size argument, due + * to padding and minimum block sizes. + */ +size_t multi_heap_get_allocated_size(multi_heap_handle_t heap, void *p); + + +/** @brief Register a new heap for use + * + * This function initialises a heap at the specified address, and returns a handle for future heap operations. + * + * There is no equivalent function for deregistering a heap - if all blocks in the heap are free, you can immediately start using the memory for other purposes. + * + * @param start Start address of the memory to use for a new heap. + * @param size Size (in bytes) of the new heap. + * + * @return Handle of a new heap ready for use, or NULL if the heap region was too small to be initialised. + */ +multi_heap_handle_t multi_heap_register(void *start, size_t size); + + +/** @brief Associate a private lock pointer with a heap + * + * The lock argument is supplied to the MULTI_HEAP_LOCK() and MULTI_HEAP_UNLOCK() macros, defined in multi_heap_platform.h. + * + * The lock in question must be recursive. + * + * When the heap is first registered, the associated lock is NULL. + * + * @param heap Handle to a registered heap. + * @param lock Optional pointer to a locking structure to associate with this heap. + */ +void multi_heap_set_lock(multi_heap_handle_t heap, void* lock); + +/** @brief Dump heap information to stdout + * + * For debugging purposes, this function dumps information about every block in the heap to stdout. + * + * @param heap Handle to a registered heap. + */ +void multi_heap_dump(multi_heap_handle_t heap); + +/** @brief Check heap integrity + * + * Walks the heap and checks all heap data structures are valid. If any errors are detected, an error-specific message + * can be optionally printed to stderr. Print behaviour can be overriden at compile time by defining + * MULTI_CHECK_FAIL_PRINTF in multi_heap_platform.h. + * + * @param heap Handle to a registered heap. + * @param print_errors If true, errors will be printed to stderr. + * @return true if heap is valid, false otherwise. + */ +bool multi_heap_check(multi_heap_handle_t heap, bool print_errors); + +/** @brief Return free heap size + * + * Returns the number of bytes available in the heap. + * + * Equivalent to the total_free_bytes member returned by multi_heap_get_heap_info(). + * + * Note that the heap may be fragmented, so the actual maximum size for a single malloc() may be lower. To know this + * size, see the largest_free_block member returned by multi_heap_get_heap_info(). + * + * @param heap Handle to a registered heap. + * @return Number of free bytes. + */ +size_t multi_heap_free_size(multi_heap_handle_t heap); + +/** @brief Return the lifetime minimum free heap size + * + * Equivalent to the minimum_free_bytes member returned by multi_heap_get_info(). + * + * Returns the lifetime "low water mark" of possible values returned from multi_free_heap_size(), for the specified + * heap. + * + * @param heap Handle to a registered heap. + * @return Number of free bytes. + */ +size_t multi_heap_minimum_free_size(multi_heap_handle_t heap); + +/** @brief Structure to access heap metadata via multi_heap_get_info */ +typedef struct { + size_t total_free_bytes; ///< Total free bytes in the heap. Equivalent to multi_free_heap_size(). + size_t total_allocated_bytes; ///< Total bytes allocated to data in the heap. + size_t largest_free_block; ///< Size of largest free block in the heap. This is the largest malloc-able size. + size_t minimum_free_bytes; ///< Lifetime minimum free heap size. Equivalent to multi_minimum_free_heap_size(). + size_t allocated_blocks; ///< Number of (variable size) blocks allocated in the heap. + size_t free_blocks; ///< Number of (variable size) free blocks in the heap. + size_t total_blocks; ///< Total number of (variable size) blocks in the heap. +} multi_heap_info_t; + +/** @brief Return metadata about a given heap + * + * Fills a multi_heap_info_t structure with information about the specified heap. + * + * @param heap Handle to a registered heap. + * @param info Pointer to a structure to fill with heap metadata. + */ +void multi_heap_get_info(multi_heap_handle_t heap, multi_heap_info_t *info); + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/log/esp_log_private.h b/arch/xtensa/include/esp32/log/esp_log_private.h new file mode 100644 index 0000000000000..68b6c852b0d83 --- /dev/null +++ b/arch/xtensa/include/esp32/log/esp_log_private.h @@ -0,0 +1,6 @@ +#pragma once +#include + +void esp_log_impl_lock(void); +bool esp_log_impl_lock_timeout(void); +void esp_log_impl_unlock(void); diff --git a/arch/xtensa/include/esp32/log/include/esp_log.h b/arch/xtensa/include/esp32/log/include/esp_log.h new file mode 100644 index 0000000000000..bb9544227eaee --- /dev/null +++ b/arch/xtensa/include/esp32/log/include/esp_log.h @@ -0,0 +1,358 @@ +// 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. + +#ifndef __ESP_LOG_H__ +#define __ESP_LOG_H__ + +#include +#include +#include +#if CONFIG_IDF_TARGET_ESP32 +#include "../../esp_rom/include/esp32/rom/ets_sys.h" +#elif CONFIG_IDF_TARGET_ESP32S2BETA +#include "esp32s2beta/rom/ets_sys.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Log level + * + */ +typedef enum { + ESP_LOG_NONE, /*!< No log output */ + ESP_LOG_ERROR, /*!< Critical errors, software module can not recover on its own */ + ESP_LOG_WARN, /*!< Error conditions from which recovery measures have been taken */ + ESP_LOG_INFO, /*!< Information messages which describe normal flow of events */ + ESP_LOG_DEBUG, /*!< Extra information which is not necessary for normal use (values, pointers, sizes, etc). */ + ESP_LOG_VERBOSE /*!< Bigger chunks of debugging information, or frequent messages which can potentially flood the output. */ +} esp_log_level_t; + +typedef int (*vprintf_like_t)(const char *, va_list); + +/** + * @brief Set log level for given tag + * + * If logging for given component has already been enabled, changes previous setting. + * + * Note that this function can not raise log level above the level set using + * CONFIG_LOG_DEFAULT_LEVEL setting in menuconfig. + * + * To raise log level above the default one for a given file, define + * LOG_LOCAL_LEVEL to one of the ESP_LOG_* values, before including + * esp_log.h in this file. + * + * @param tag Tag of the log entries to enable. Must be a non-NULL zero terminated string. + * Value "*" resets log level for all tags to the given value. + * + * @param level Selects log level to enable. Only logs at this and lower verbosity + * levels will be shown. + */ +void esp_log_level_set(const char* tag, esp_log_level_t level); + +/** + * @brief Set function used to output log entries + * + * By default, log output goes to UART0. This function can be used to redirect log + * output to some other destination, such as file or network. Returns the original + * log handler, which may be necessary to return output to the previous destination. + * + * @param func new Function used for output. Must have same signature as vprintf. + * + * @return func old Function used for output. + */ +vprintf_like_t esp_log_set_vprintf(vprintf_like_t func); + +/** + * @brief Function which returns timestamp to be used in log output + * + * This function is used in expansion of ESP_LOGx macros. + * In the 2nd stage bootloader, and at early application startup stage + * this function uses CPU cycle counter as time source. Later when + * FreeRTOS scheduler start running, it switches to FreeRTOS tick count. + * + * For now, we ignore millisecond counter overflow. + * + * @return timestamp, in milliseconds + */ +uint32_t esp_log_timestamp(void); + +/** + * @brief Function which returns system timestamp to be used in log output + * + * This function is used in expansion of ESP_LOGx macros to print + * the system time as "HH:MM:SS.sss". The system time is initialized to + * 0 on startup, this can be set to the correct time with an SNTP sync, + * or manually with standard POSIX time functions. + * + * Currently this will not get used in logging from binary blobs + * (i.e WiFi & Bluetooth libraries), these will still print the RTOS tick time. + * + * @return timestamp, in "HH:MM:SS.sss" + */ +char* esp_log_system_timestamp(void); + +/** + * @brief Function which returns timestamp to be used in log output + * + * This function uses HW cycle counter and does not depend on OS, + * so it can be safely used after application crash. + * + * @return timestamp, in milliseconds + */ +uint32_t esp_log_early_timestamp(void); + +/** + * @brief Write message into the log + * + * This function is not intended to be used directly. Instead, use one of + * ESP_LOGE, ESP_LOGW, ESP_LOGI, ESP_LOGD, ESP_LOGV macros. + * + * This function or these macros should not be used from an interrupt. + */ +void esp_log_write(esp_log_level_t level, const char* tag, const char* format, ...) __attribute__ ((format (printf, 3, 4))); + +/** + * @brief Write message into the log, va_list variant + * @see esp_log_write() + * + * This function is provided to ease integration toward other logging framework, + * so that esp_log can be used as a log sink. + */ +void esp_log_writev(esp_log_level_t level, const char* tag, const char* format, va_list args); + +/** @cond */ + +#include "esp_log_internal.h" + +#ifndef LOG_LOCAL_LEVEL +#ifndef BOOTLOADER_BUILD +#define LOG_LOCAL_LEVEL CONFIG_LOG_DEFAULT_LEVEL +#else +#define LOG_LOCAL_LEVEL CONFIG_BOOTLOADER_LOG_LEVEL +#endif +#endif + +/** @endcond */ + +/** + * @brief Log a buffer of hex bytes at specified level, separated into 16 bytes each line. + * + * @param tag description tag + * @param buffer Pointer to the buffer array + * @param buff_len length of buffer in bytes + * @param level level of the log + * + */ +#define ESP_LOG_BUFFER_HEX_LEVEL( tag, buffer, buff_len, level ) \ + do {\ + if ( LOG_LOCAL_LEVEL >= (level) ) { \ + esp_log_buffer_hex_internal( tag, buffer, buff_len, level ); \ + } \ + } while(0) + +/** + * @brief Log a buffer of characters at specified level, separated into 16 bytes each line. Buffer should contain only printable characters. + * + * @param tag description tag + * @param buffer Pointer to the buffer array + * @param buff_len length of buffer in bytes + * @param level level of the log + * + */ +#define ESP_LOG_BUFFER_CHAR_LEVEL( tag, buffer, buff_len, level ) \ + do {\ + if ( LOG_LOCAL_LEVEL >= (level) ) { \ + esp_log_buffer_char_internal( tag, buffer, buff_len, level ); \ + } \ + } while(0) + +/** + * @brief Dump a buffer to the log at specified level. + * + * The dump log shows just like the one below: + * + * W (195) log_example: 0x3ffb4280 45 53 50 33 32 20 69 73 20 67 72 65 61 74 2c 20 |ESP32 is great, | + * W (195) log_example: 0x3ffb4290 77 6f 72 6b 69 6e 67 20 61 6c 6f 6e 67 20 77 69 |working along wi| + * W (205) log_example: 0x3ffb42a0 74 68 20 74 68 65 20 49 44 46 2e 00 |th the IDF..| + * + * It is highly recommend to use terminals with over 102 text width. + * + * @param tag description tag + * @param buffer Pointer to the buffer array + * @param buff_len length of buffer in bytes + * @param level level of the log + */ +#define ESP_LOG_BUFFER_HEXDUMP( tag, buffer, buff_len, level ) \ + do { \ + if ( LOG_LOCAL_LEVEL >= (level) ) { \ + esp_log_buffer_hexdump_internal( tag, buffer, buff_len, level); \ + } \ + } while(0) + +/** + * @brief Log a buffer of hex bytes at Info level + * + * @param tag description tag + * @param buffer Pointer to the buffer array + * @param buff_len length of buffer in bytes + * + * @see ``esp_log_buffer_hex_level`` + * + */ +#define ESP_LOG_BUFFER_HEX(tag, buffer, buff_len) \ + do { \ + if (LOG_LOCAL_LEVEL >= ESP_LOG_INFO) { \ + ESP_LOG_BUFFER_HEX_LEVEL( tag, buffer, buff_len, ESP_LOG_INFO ); \ + }\ + } while(0) + +/** + * @brief Log a buffer of characters at Info level. Buffer should contain only printable characters. + * + * @param tag description tag + * @param buffer Pointer to the buffer array + * @param buff_len length of buffer in bytes + * + * @see ``esp_log_buffer_char_level`` + * + */ +#define ESP_LOG_BUFFER_CHAR(tag, buffer, buff_len) \ + do { \ + if (LOG_LOCAL_LEVEL >= ESP_LOG_INFO) { \ + ESP_LOG_BUFFER_CHAR_LEVEL( tag, buffer, buff_len, ESP_LOG_INFO ); \ + }\ + } while(0) + +/** @cond */ + +//to be back compatible +#define esp_log_buffer_hex ESP_LOG_BUFFER_HEX +#define esp_log_buffer_char ESP_LOG_BUFFER_CHAR + + +#if CONFIG_LOG_COLORS +#define LOG_COLOR_BLACK "30" +#define LOG_COLOR_RED "31" +#define LOG_COLOR_GREEN "32" +#define LOG_COLOR_BROWN "33" +#define LOG_COLOR_BLUE "34" +#define LOG_COLOR_PURPLE "35" +#define LOG_COLOR_CYAN "36" +#define LOG_COLOR(COLOR) "\033[0;" COLOR "m" +#define LOG_BOLD(COLOR) "\033[1;" COLOR "m" +#define LOG_RESET_COLOR "\033[0m" +#define LOG_COLOR_E LOG_COLOR(LOG_COLOR_RED) +#define LOG_COLOR_W LOG_COLOR(LOG_COLOR_BROWN) +#define LOG_COLOR_I LOG_COLOR(LOG_COLOR_GREEN) +#define LOG_COLOR_D +#define LOG_COLOR_V +#else //CONFIG_LOG_COLORS +#define LOG_COLOR_E +#define LOG_COLOR_W +#define LOG_COLOR_I +#define LOG_COLOR_D +#define LOG_COLOR_V +#define LOG_RESET_COLOR +#endif //CONFIG_LOG_COLORS + +#define LOG_FORMAT(letter, format) LOG_COLOR_ ## letter #letter " (%d) %s: " format LOG_RESET_COLOR "\n" +#define LOG_SYSTEM_TIME_FORMAT(letter, format) LOG_COLOR_ ## letter #letter " (%s) %s: " format LOG_RESET_COLOR "\n" + +/** @endcond */ + +/// macro to output logs in startup code, before heap allocator and syscalls have been initialized. log at ``ESP_LOG_ERROR`` level. @see ``printf``,``ESP_LOGE`` +#define ESP_EARLY_LOGE( tag, format, ... ) ESP_LOG_EARLY_IMPL(tag, format, ESP_LOG_ERROR, E, ##__VA_ARGS__) +/// macro to output logs in startup code at ``ESP_LOG_WARN`` level. @see ``ESP_EARLY_LOGE``,``ESP_LOGE``, ``printf`` +#define ESP_EARLY_LOGW( tag, format, ... ) ESP_LOG_EARLY_IMPL(tag, format, ESP_LOG_WARN, W, ##__VA_ARGS__) +/// macro to output logs in startup code at ``ESP_LOG_INFO`` level. @see ``ESP_EARLY_LOGE``,``ESP_LOGE``, ``printf`` +#define ESP_EARLY_LOGI( tag, format, ... ) ESP_LOG_EARLY_IMPL(tag, format, ESP_LOG_INFO, I, ##__VA_ARGS__) +/// macro to output logs in startup code at ``ESP_LOG_DEBUG`` level. @see ``ESP_EARLY_LOGE``,``ESP_LOGE``, ``printf`` +#define ESP_EARLY_LOGD( tag, format, ... ) ESP_LOG_EARLY_IMPL(tag, format, ESP_LOG_DEBUG, D, ##__VA_ARGS__) +/// macro to output logs in startup code at ``ESP_LOG_VERBOSE`` level. @see ``ESP_EARLY_LOGE``,``ESP_LOGE``, ``printf`` +#define ESP_EARLY_LOGV( tag, format, ... ) ESP_LOG_EARLY_IMPL(tag, format, ESP_LOG_VERBOSE, V, ##__VA_ARGS__) + +#define ESP_LOG_EARLY_IMPL(tag, format, log_level, log_tag_letter, ...) do { \ + if (LOG_LOCAL_LEVEL >= log_level) { \ + ets_printf(LOG_FORMAT(log_tag_letter, format), esp_log_timestamp(), tag, ##__VA_ARGS__); \ + }} while(0) + +#ifndef BOOTLOADER_BUILD +#define ESP_LOGE( tag, format, ... ) ESP_LOG_LEVEL_LOCAL(ESP_LOG_ERROR, tag, format, ##__VA_ARGS__) +#define ESP_LOGW( tag, format, ... ) ESP_LOG_LEVEL_LOCAL(ESP_LOG_WARN, tag, format, ##__VA_ARGS__) +#define ESP_LOGI( tag, format, ... ) ESP_LOG_LEVEL_LOCAL(ESP_LOG_INFO, tag, format, ##__VA_ARGS__) +#define ESP_LOGD( tag, format, ... ) ESP_LOG_LEVEL_LOCAL(ESP_LOG_DEBUG, tag, format, ##__VA_ARGS__) +#define ESP_LOGV( tag, format, ... ) ESP_LOG_LEVEL_LOCAL(ESP_LOG_VERBOSE, tag, format, ##__VA_ARGS__) +#else +/** + * macro to output logs at ESP_LOG_ERROR level. + * + * @param tag tag of the log, which can be used to change the log level by ``esp_log_level_set`` at runtime. + * + * @see ``printf`` + */ +#define ESP_LOGE( tag, format, ... ) ESP_EARLY_LOGE(tag, format, ##__VA_ARGS__) +/// macro to output logs at ``ESP_LOG_WARN`` level. @see ``ESP_LOGE`` +#define ESP_LOGW( tag, format, ... ) ESP_EARLY_LOGW(tag, format, ##__VA_ARGS__) +/// macro to output logs at ``ESP_LOG_INFO`` level. @see ``ESP_LOGE`` +#define ESP_LOGI( tag, format, ... ) ESP_EARLY_LOGI(tag, format, ##__VA_ARGS__) +/// macro to output logs at ``ESP_LOG_DEBUG`` level. @see ``ESP_LOGE`` +#define ESP_LOGD( tag, format, ... ) ESP_EARLY_LOGD(tag, format, ##__VA_ARGS__) +/// macro to output logs at ``ESP_LOG_VERBOSE`` level. @see ``ESP_LOGE`` +#define ESP_LOGV( tag, format, ... ) ESP_EARLY_LOGV(tag, format, ##__VA_ARGS__) +#endif // BOOTLOADER_BUILD + +/** runtime macro to output logs at a specified level. + * + * @param tag tag of the log, which can be used to change the log level by ``esp_log_level_set`` at runtime. + * @param level level of the output log. + * @param format format of the output log. see ``printf`` + * @param ... variables to be replaced into the log. see ``printf`` + * + * @see ``printf`` + */ +#if CONFIG_LOG_TIMESTAMP_SOURCE_RTOS +#define ESP_LOG_LEVEL(level, tag, format, ...) do { \ + if (level==ESP_LOG_ERROR ) { esp_log_write(ESP_LOG_ERROR, tag, LOG_FORMAT(E, format), esp_log_timestamp(), tag, ##__VA_ARGS__); } \ + else if (level==ESP_LOG_WARN ) { esp_log_write(ESP_LOG_WARN, tag, LOG_FORMAT(W, format), esp_log_timestamp(), tag, ##__VA_ARGS__); } \ + else if (level==ESP_LOG_DEBUG ) { esp_log_write(ESP_LOG_DEBUG, tag, LOG_FORMAT(D, format), esp_log_timestamp(), tag, ##__VA_ARGS__); } \ + else if (level==ESP_LOG_VERBOSE ) { esp_log_write(ESP_LOG_VERBOSE, tag, LOG_FORMAT(V, format), esp_log_timestamp(), tag, ##__VA_ARGS__); } \ + else { esp_log_write(ESP_LOG_INFO, tag, LOG_FORMAT(I, format), esp_log_timestamp(), tag, ##__VA_ARGS__); } \ + } while(0) +#elif CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM +#define ESP_LOG_LEVEL(level, tag, format, ...) do { \ + if (level==ESP_LOG_ERROR ) { esp_log_write(ESP_LOG_ERROR, tag, LOG_SYSTEM_TIME_FORMAT(E, format), esp_log_system_timestamp(), tag, ##__VA_ARGS__); } \ + else if (level==ESP_LOG_WARN ) { esp_log_write(ESP_LOG_WARN, tag, LOG_SYSTEM_TIME_FORMAT(W, format), esp_log_system_timestamp(), tag, ##__VA_ARGS__); } \ + else if (level==ESP_LOG_DEBUG ) { esp_log_write(ESP_LOG_DEBUG, tag, LOG_SYSTEM_TIME_FORMAT(D, format), esp_log_system_timestamp(), tag, ##__VA_ARGS__); } \ + else if (level==ESP_LOG_VERBOSE ) { esp_log_write(ESP_LOG_VERBOSE, tag, LOG_SYSTEM_TIME_FORMAT(V, format), esp_log_system_timestamp(), tag, ##__VA_ARGS__); } \ + else { esp_log_write(ESP_LOG_INFO, tag, LOG_SYSTEM_TIME_FORMAT(I, format), esp_log_system_timestamp(), tag, ##__VA_ARGS__); } \ + } while(0) +#endif //CONFIG_LOG_TIMESTAMP_SOURCE_xxx + +/** runtime macro to output logs at a specified level. Also check the level with ``LOG_LOCAL_LEVEL``. + * + * @see ``printf``, ``ESP_LOG_LEVEL`` + */ +#define ESP_LOG_LEVEL_LOCAL(level, tag, format, ...) do { \ + if ( LOG_LOCAL_LEVEL >= level ) ESP_LOG_LEVEL(level, tag, format, ##__VA_ARGS__); \ + } while(0) + +#ifdef __cplusplus +} +#endif + + +#endif /* __ESP_LOG_H__ */ diff --git a/arch/xtensa/include/esp32/log/include/esp_log_internal.h b/arch/xtensa/include/esp32/log/include/esp_log_internal.h new file mode 100644 index 0000000000000..94ec346322767 --- /dev/null +++ b/arch/xtensa/include/esp32/log/include/esp_log_internal.h @@ -0,0 +1,24 @@ +// 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. + +#ifndef __ESP_LOG_INTERNAL_H__ +#define __ESP_LOG_INTERNAL_H__ + +//these functions do not check level versus ESP_LOCAL_LEVEL, this should be done in esp_log.h +void esp_log_buffer_hex_internal(const char *tag, const void *buffer, uint16_t buff_len, esp_log_level_t level); +void esp_log_buffer_char_internal(const char *tag, const void *buffer, uint16_t buff_len, esp_log_level_t level); +void esp_log_buffer_hexdump_internal( const char *tag, const void *buffer, uint16_t buff_len, esp_log_level_t log_level); + +#endif + diff --git a/arch/xtensa/include/esp32/newlib/platform_include/assert.h b/arch/xtensa/include/esp32/newlib/platform_include/assert.h new file mode 100644 index 0000000000000..4550435a21ba6 --- /dev/null +++ b/arch/xtensa/include/esp32/newlib/platform_include/assert.h @@ -0,0 +1,41 @@ +// 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. + + +/* This header file wraps newlib's own unmodified assert.h and adds + support for silent assertion failure. +*/ +#pragma once +#include +#include +#include "esp_compiler.h" + +#include_next + +#if defined(CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT) && !defined(NDEBUG) + #undef assert + #define assert(__e) (likely(__e)) ? (void)0 : abort() +#else + /* moved part of toolchain provided assert to there then + * we can tweak the original assert macro to perform likely + * before deliver it to original toolchain implementation + */ + #undef assert + #ifdef NDEBUG + # define assert(__e) ((void)0) + #else + # define assert(__e) (likely(__e) ? (void)0 : __assert_func (__FILE__, __LINE__, \ + __ASSERT_FUNC, #__e)) + #endif +#endif diff --git a/arch/xtensa/include/esp32/newlib/platform_include/errno.h b/arch/xtensa/include/esp32/newlib/platform_include/errno.h new file mode 100644 index 0000000000000..85fb2e15b850f --- /dev/null +++ b/arch/xtensa/include/esp32/newlib/platform_include/errno.h @@ -0,0 +1,39 @@ + +// 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. +#ifndef _ESP_PLATFORM_ERRNO_H_ +#define _ESP_PLATFORM_ERRNO_H_ + +#include_next "errno.h" + +// +// Possibly define some missing errors +// +#ifndef ESHUTDOWN +#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */ +#endif + +#ifndef EAI_SOCKTYPE +#define EAI_SOCKTYPE 10 /* ai_socktype not supported */ +#endif + +#ifndef EAI_AGAIN +#define EAI_AGAIN 2 /* temporary failure in name resolution */ +#endif + +#ifndef EAI_BADFLAGS +#define EAI_BADFLAGS 3 /* invalid value for ai_flags */ +#endif + +#endif // _ESP_PLATFORM_ERRNO_H_ diff --git a/arch/xtensa/include/esp32/newlib/platform_include/esp_newlib.h b/arch/xtensa/include/esp32/newlib/platform_include/esp_newlib.h new file mode 100644 index 0000000000000..11658776a6bca --- /dev/null +++ b/arch/xtensa/include/esp32/newlib/platform_include/esp_newlib.h @@ -0,0 +1,51 @@ +// 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. + +#ifndef __ESP_NEWLIB_H__ +#define __ESP_NEWLIB_H__ + +#include + +/** + * Replacement for newlib's _REENT_INIT_PTR and __sinit. + * + * Called from startup code and FreeRTOS, not intended to be called from + * application code. + */ +void esp_reent_init(struct _reent* r); + +/** + * Clean up some of lazily allocated buffers in REENT structures. + */ +void esp_reent_cleanup(void); + +/** + * Function which sets up syscall table used by newlib functions in ROM. + * + * Called from the startup code, not intended to be called from application + * code. + */ +void esp_setup_syscall_table(void); + +/** + * Update current microsecond time from RTC + */ +void esp_set_time_from_rtc(void); + +/* + * Sync counters RTC and FRC. Update boot_time. + */ +void esp_sync_counters_rtc_and_frc(void); + +#endif //__ESP_NEWLIB_H__ diff --git a/arch/xtensa/include/esp32/newlib/platform_include/net/if.h b/arch/xtensa/include/esp32/newlib/platform_include/net/if.h new file mode 100644 index 0000000000000..4a60be47724b3 --- /dev/null +++ b/arch/xtensa/include/esp32/newlib/platform_include/net/if.h @@ -0,0 +1,40 @@ +// 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. +#ifndef _ESP_PLATFORM_NET_IF_H_ +#define _ESP_PLATFORM_NET_IF_H_ + +#include "lwip/sockets.h" +#include "lwip/if_api.h" + +#define MSG_DONTROUTE 0x4 /* send without using routing tables */ +#define SOCK_SEQPACKET 5 /* sequenced packet stream */ +#define MSG_EOR 0x8 /* data completes record */ +#define SOCK_SEQPACKET 5 /* sequenced packet stream */ +#define SOMAXCONN 128 + +#define IPV6_UNICAST_HOPS 4 /* int; IP6 hops */ + +#define NI_MAXHOST 1025 +#define NI_MAXSERV 32 +#define NI_NUMERICSERV 0x00000008 +#define NI_DGRAM 0x00000010 + +typedef u32_t socklen_t; + + +unsigned int if_nametoindex(const char *ifname); + +char *if_indextoname(unsigned int ifindex, char *ifname); + +#endif // _ESP_PLATFORM_NET_IF_H_ diff --git a/arch/xtensa/include/esp32/newlib/platform_include/pthread.h b/arch/xtensa/include/esp32/newlib/platform_include/pthread.h new file mode 100644 index 0000000000000..66d0cee39bb96 --- /dev/null +++ b/arch/xtensa/include/esp32/newlib/platform_include/pthread.h @@ -0,0 +1,35 @@ +// 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. +#ifndef __ESP_PLATFORM_PTHREAD_H__ +#define __ESP_PLATFORM_PTHREAD_H__ + +#include +#include +#include + +#include_next + +#ifdef __cplusplus +extern "C" { +#endif + +int pthread_condattr_getclock(const pthread_condattr_t * attr, clockid_t * clock_id); + +int pthread_condattr_setclock(pthread_condattr_t *attr, clockid_t clock_id); + +#ifdef __cplusplus +} +#endif + +#endif // __ESP_PLATFORM_PTHREAD_H__ diff --git a/arch/xtensa/include/esp32/newlib/platform_include/sys/poll.h b/arch/xtensa/include/esp32/newlib/platform_include/sys/poll.h new file mode 100644 index 0000000000000..030da6bf4801b --- /dev/null +++ b/arch/xtensa/include/esp32/newlib/platform_include/sys/poll.h @@ -0,0 +1,48 @@ +// 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. + +#ifndef _ESP_PLATFORM_SYS_POLL_H_ +#define _ESP_PLATFORM_SYS_POLL_H_ + +#define POLLIN (1u << 0) /* data other than high-priority may be read without blocking */ +#define POLLRDNORM (1u << 1) /* normal data may be read without blocking */ +#define POLLRDBAND (1u << 2) /* priority data may be read without blocking */ +#define POLLPRI (POLLRDBAND) /* high-priority data may be read without blocking */ +// Note: POLLPRI is made equivalent to POLLRDBAND in order to fit all these events into one byte +#define POLLOUT (1u << 3) /* normal data may be written without blocking */ +#define POLLWRNORM (POLLOUT) /* equivalent to POLLOUT */ +#define POLLWRBAND (1u << 4) /* priority data my be written */ +#define POLLERR (1u << 5) /* some poll error occurred */ +#define POLLHUP (1u << 6) /* file descriptor was "hung up" */ +#define POLLNVAL (1u << 7) /* the specified file descriptor is invalid */ + +#ifdef __cplusplus +extern "C" { +#endif + +struct pollfd { + int fd; /* The descriptor. */ + short events; /* The event(s) is/are specified here. */ + short revents; /* Events found are returned here. */ +}; + +typedef unsigned int nfds_t; + +int poll(struct pollfd *fds, nfds_t nfds, int timeout); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // _ESP_PLATFORM_SYS_POLL_H_ diff --git a/arch/xtensa/include/esp32/newlib/platform_include/sys/random.h b/arch/xtensa/include/esp32/newlib/platform_include/sys/random.h new file mode 100644 index 0000000000000..afbf4dfd03604 --- /dev/null +++ b/arch/xtensa/include/esp32/newlib/platform_include/sys/random.h @@ -0,0 +1,30 @@ +// 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. + +#ifndef __SYS_RANDOM__ +#define __SYS_RANDOM__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +ssize_t getrandom(void *buf, size_t buflen, unsigned int flags); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif //__SYS_RANDOM__ diff --git a/arch/xtensa/include/esp32/newlib/platform_include/sys/select.h b/arch/xtensa/include/esp32/newlib/platform_include/sys/select.h new file mode 100644 index 0000000000000..ca7e4a4a28fe6 --- /dev/null +++ b/arch/xtensa/include/esp32/newlib/platform_include/sys/select.h @@ -0,0 +1,37 @@ +// 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. + +#ifndef __ESP_SYS_SELECT_H__ +#define __ESP_SYS_SELECT_H__ + +/* Newlib 2.2.0 does not provide sys/select.h, and fd_set is defined in sys/types.h */ +#include +#ifndef fd_set +#include_next +#else // fd_set +#include + +#ifdef __cplusplus +extern "C" { +#endif + +int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval *timeout); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // fd_set + +#endif //__ESP_SYS_SELECT_H__ diff --git a/arch/xtensa/include/esp32/newlib/platform_include/sys/termios.h b/arch/xtensa/include/esp32/newlib/platform_include/sys/termios.h new file mode 100644 index 0000000000000..e184f97f52efd --- /dev/null +++ b/arch/xtensa/include/esp32/newlib/platform_include/sys/termios.h @@ -0,0 +1,296 @@ +// 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. +// +// This header file is based on the termios header of +// "The Single UNIX (r) Specification, Version 2, Copyright (c) 1997 The Open Group". + +#ifndef __ESP_SYS_TERMIOS_H__ +#define __ESP_SYS_TERMIOS_H__ + +// ESP-IDF NOTE: This header provides only a compatibility layer for macros and functions defined in sys/termios.h. +// Not everything has a defined meaning for ESP-IDF (e.g. process leader IDs) and therefore are likely to be stubbed +// in actual implementations. + + +#include +#include +#include + +#ifdef CONFIG_VFS_SUPPORT_TERMIOS + +// subscripts for the array c_cc: +#define VEOF 0 /** EOF character */ +#define VEOL 1 /** EOL character */ +#define VERASE 2 /** ERASE character */ +#define VINTR 3 /** INTR character */ +#define VKILL 4 /** KILL character */ +#define VMIN 5 /** MIN value */ +#define VQUIT 6 /** QUIT character */ +#define VSTART 7 /** START character */ +#define VSTOP 8 /** STOP character */ +#define VSUSP 9 /** SUSP character */ +#define VTIME 10 /** TIME value */ +#define NCCS (VTIME + 1) /** Size of the array c_cc for control characters */ + +// input modes for use as flags in the c_iflag field +#define BRKINT (1u << 0) /** Signal interrupt on break. */ +#define ICRNL (1u << 1) /** Map CR to NL on input. */ +#define IGNBRK (1u << 2) /** Ignore break condition. */ +#define IGNCR (1u << 3) /** Ignore CR. */ +#define IGNPAR (1u << 4) /** Ignore characters with parity errors. */ +#define INLCR (1u << 5) /** Map NL to CR on input. */ +#define INPCK (1u << 6) /** Enable input parity check. */ +#define ISTRIP (1u << 7) /** Strip character. */ +#define IUCLC (1u << 8) /** Map upper-case to lower-case on input (LEGACY). */ +#define IXANY (1u << 9) /** Enable any character to restart output. */ +#define IXOFF (1u << 10) /** Enable start/stop input control. */ +#define IXON (1u << 11) /** Enable start/stop output control. */ +#define PARMRK (1u << 12) /** Mark parity errors. */ + +// output Modes for use as flags in the c_oflag field +#define OPOST (1u << 0) /** Post-process output */ +#define OLCUC (1u << 1) /** Map lower-case to upper-case on output (LEGACY). */ +#define ONLCR (1u << 2) /** Map NL to CR-NL on output. */ +#define OCRNL (1u << 3) /** Map CR to NL on output. */ +#define ONOCR (1u << 4) /** No CR output at column 0. */ +#define ONLRET (1u << 5) /** NL performs CR function. */ +#define OFILL (1u << 6) /** Use fill characters for delay. */ +#define NLDLY (1u << 7) /** Select newline delays: */ +#define NL0 (0u << 7) /** Newline character type 0. */ +#define NL1 (1u << 7) /** Newline character type 1. */ +#define CRDLY (3u << 8) /** Select carriage-return delays: */ +#define CR0 (0u << 8) /** Carriage-return delay type 0. */ +#define CR1 (1u << 8) /** Carriage-return delay type 1. */ +#define CR2 (2u << 8) /** Carriage-return delay type 2. */ +#define CR3 (3u << 8) /** Carriage-return delay type 3. */ +#define TABDLY (3u << 10) /** Select horizontal-tab delays: */ +#define TAB0 (0u << 10) /** Horizontal-tab delay type 0. */ +#define TAB1 (1u << 10) /** Horizontal-tab delay type 1. */ +#define TAB2 (2u << 10) /** Horizontal-tab delay type 2. */ +#define TAB3 (3u << 10) /** Expand tabs to spaces. */ +#define BSDLY (1u << 12) /** Select backspace delays: */ +#define BS0 (0u << 12) /** Backspace-delay type 0. */ +#define BS1 (1u << 12) /** Backspace-delay type 1. */ +#define VTDLY (1u << 13) /** Select vertical-tab delays: */ +#define VT0 (0u << 13) /** Vertical-tab delay type 0. */ +#define VT1 (1u << 13) /** Vertical-tab delay type 1. */ +#define FFDLY (1u << 14) /** Select form-feed delays: */ +#define FF0 (0u << 14) /** Form-feed delay type 0. */ +#define FF1 (1u << 14) /** Form-feed delay type 1. */ + +// Baud Rate Selection. Valid values for objects of type speed_t: +// CBAUD range B0 - B38400 +#define B0 0 /** Hang up */ +#define B50 1 +#define B75 2 +#define B110 3 +#define B134 4 +#define B150 5 +#define B200 6 +#define B300 7 +#define B600 8 +#define B1200 9 +#define B1800 10 +#define B2400 11 +#define B4800 12 +#define B9600 13 +#define B19200 14 +#define B38400 15 +// CBAUDEX range B57600 - B4000000 +#define B57600 16 +#define B115200 17 +#define B230400 18 +#define B460800 19 +#define B500000 20 +#define B576000 21 +#define B921600 22 +#define B1000000 23 +#define B1152000 24 +#define B1500000 25 +#define B2000000 26 +#define B2500000 27 +#define B3000000 28 +#define B3500000 29 +#define B4000000 30 + +// Control Modes for the c_cflag field: +#define CSIZE (3u << 0) /* Character size: */ +#define CS5 (0u << 0) /** 5 bits. */ +#define CS6 (1u << 0) /** 6 bits. */ +#define CS7 (2u << 0) /** 7 bits. */ +#define CS8 (3u << 0) /** 8 bits. */ +#define CSTOPB (1u << 2) /** Send two stop bits, else one. */ +#define CREAD (1u << 3) /** Enable receiver. */ +#define PARENB (1u << 4) /** Parity enable. */ +#define PARODD (1u << 5) /** Odd parity, else even. */ +#define HUPCL (1u << 6) /** Hang up on last close. */ +#define CLOCAL (1u << 7) /** Ignore modem status lines. */ +#define CBAUD (1u << 8) /** Use baud rates defined by B0-B38400 macros. */ +#define CBAUDEX (1u << 9) /** Use baud rates defined by B57600-B4000000 macros. */ +#define BOTHER (1u << 10) /** Use custom baud rates */ + +// Local Modes for c_lflag field: +#define ECHO (1u << 0) /** Enable echo. */ +#define ECHOE (1u << 1) /** Echo erase character as error-correcting backspace. */ +#define ECHOK (1u << 2) /** Echo KILL. */ +#define ECHONL (1u << 3) /** Echo NL. */ +#define ICANON (1u << 4) /** Canonical input (erase and kill processing). */ +#define IEXTEN (1u << 5) /** Enable extended input character processing. */ +#define ISIG (1u << 6) /** Enable signals. */ +#define NOFLSH (1u << 7) /** Disable flush after interrupt or quit. */ +#define TOSTOP (1u << 8) /** Send SIGTTOU for background output. */ +#define XCASE (1u << 9) /** Canonical upper/lower presentation (LEGACY). */ + +// Attribute Selection constants for use with tcsetattr(): +#define TCSANOW 0 /** Change attributes immediately. */ +#define TCSADRAIN 1 /** Change attributes when output has drained. */ +#define TCSAFLUSH 2 /** Change attributes when output has drained; also flush pending input. */ + +// Line Control constants for use with tcflush(): +#define TCIFLUSH 0 /** Flush pending input. Flush untransmitted output. */ +#define TCIOFLUSH 1 /** Flush both pending input and untransmitted output. */ +#define TCOFLUSH 2 /** Flush untransmitted output. */ + +// constants for use with tcflow(): +#define TCIOFF 0 /** Transmit a STOP character, intended to suspend input data. */ +#define TCION 1 /** Transmit a START character, intended to restart input data. */ +#define TCOOFF 2 /** Suspend output. */ +#define TCOON 3 /** Restart output. */ + +typedef uint8_t cc_t; +typedef uint32_t speed_t; +typedef uint16_t tcflag_t; + +struct termios +{ + tcflag_t c_iflag; /** Input modes */ + tcflag_t c_oflag; /** Output modes */ + tcflag_t c_cflag; /** Control modes */ + tcflag_t c_lflag; /** Local modes */ + cc_t c_cc[NCCS]; /** Control characters */ + speed_t c_ispeed; /** input baud rate */ + speed_t c_ospeed; /** output baud rate */ +}; + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Extracts the input baud rate from the input structure exactly (without interpretation). + * + * @param p input termios structure + * @return input baud rate + */ +speed_t cfgetispeed(const struct termios *p); + +/** + * @brief Extracts the output baud rate from the input structure exactly (without interpretation). + * + * @param p input termios structure + * @return output baud rate + */ +speed_t cfgetospeed(const struct termios *p); + +/** + * @brief Set input baud rate in the termios structure + * + * There is no effect in hardware until a subsequent call of tcsetattr(). + * + * @param p input termios structure + * @param sp input baud rate + * @return 0 when successful, -1 otherwise with errno set + */ +int cfsetispeed(struct termios *p, speed_t sp); + +/** + * @brief Set output baud rate in the termios structure + * + * There is no effect in hardware until a subsequent call of tcsetattr(). + * + * @param p input termios structure + * @param sp output baud rate + * @return 0 when successful, -1 otherwise with errno set + */ +int cfsetospeed(struct termios *p, speed_t sp); + +/** + * @brief Wait for transmission of output + * + * @param fd file descriptor of the terminal + * @return 0 when successful, -1 otherwise with errno set + */ +int tcdrain(int fd); + +/** + * @brief Suspend or restart the transmission or reception of data + * + * @param fd file descriptor of the terminal + * @param action selects actions to do + * @return 0 when successful, -1 otherwise with errno set + */ +int tcflow(int fd, int action); + +/** + * @brief Flush non-transmitted output data and non-read input data + * + * @param fd file descriptor of the terminal + * @param select selects what should be flushed + * @return 0 when successful, -1 otherwise with errno set + */ +int tcflush(int fd, int select); + +/** + * @brief Gets the parameters of the terminal + * + * @param fd file descriptor of the terminal + * @param p output termios structure + * @return 0 when successful, -1 otherwise with errno set + */ +int tcgetattr(int fd, struct termios *p); + +/** + * @brief Get process group ID for session leader for controlling terminal + * + * @param fd file descriptor of the terminal + * @return process group ID when successful, -1 otherwise with errno set + */ +pid_t tcgetsid(int fd); + +/** + * @brief Send a break for a specific duration + * + * @param fd file descriptor of the terminal + * @param duration duration of break + * @return 0 when successful, -1 otherwise with errno set + */ +int tcsendbreak(int fd, int duration); + +/** + * @brief Sets the parameters of the terminal + * + * @param fd file descriptor of the terminal + * @param optional_actions optional actions + * @param p input termios structure + * @return 0 when successful, -1 otherwise with errno set + */ +int tcsetattr(int fd, int optional_actions, const struct termios *p); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // CONFIG_VFS_SUPPORT_TERMIOS + +#endif //__ESP_SYS_TERMIOS_H__ diff --git a/arch/xtensa/include/esp32/newlib/platform_include/sys/time.h b/arch/xtensa/include/esp32/newlib/platform_include/sys/time.h new file mode 100644 index 0000000000000..ecf3f70e74ef7 --- /dev/null +++ b/arch/xtensa/include/esp32/newlib/platform_include/sys/time.h @@ -0,0 +1,17 @@ +#pragma once +/* Newlib sys/time.h defines timerisset, timerclear, timercmp, timeradd, timersub macros + for __CYGWIN__ and __rtems__. We want to define these macros in IDF as well. + Since we wish to use un-modified newlib headers until a patched newlib version is + available, temporarily define __rtems__ here before including sys/time.h. + __rtems__ is chosen instead of __CYGWIN__ since there are no other checks in sys/time.h + which depend on __rtems__. + + Also, so that __rtems__ define does not affect other headers included from sys/time.h, + we include them here in advance (_ansi.h and sys/types.h). + */ + +#include <_ansi.h> +#include +#define __rtems__ +#include_next +#undef __rtems__ diff --git a/arch/xtensa/include/esp32/newlib/platform_include/sys/uio.h b/arch/xtensa/include/esp32/newlib/platform_include/sys/uio.h new file mode 100644 index 0000000000000..ede27b23513e9 --- /dev/null +++ b/arch/xtensa/include/esp32/newlib/platform_include/sys/uio.h @@ -0,0 +1,21 @@ +// 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. +#ifndef _ESP_PLATFORM_SYS_UIO_H_ +#define _ESP_PLATFORM_SYS_UIO_H_ + +int writev(int s, const struct iovec *iov, int iovcnt); + +ssize_t readv(int fd, const struct iovec *iov, int iovcnt); + +#endif // _ESP_PLATFORM_SYS_UIO_H_ diff --git a/arch/xtensa/include/esp32/newlib/platform_include/sys/un.h b/arch/xtensa/include/esp32/newlib/platform_include/sys/un.h new file mode 100644 index 0000000000000..a99b1832593f4 --- /dev/null +++ b/arch/xtensa/include/esp32/newlib/platform_include/sys/un.h @@ -0,0 +1,24 @@ +// 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. +#ifndef _ESP_PLATFORM_SYS_UN_H_ +#define _ESP_PLATFORM_SYS_UN_H_ + +#define AF_UNIX 1 /* local to host (pipes) */ + +struct sockaddr_un { + short sun_family; /*AF_UNIX*/ + char sun_path[108]; /*path name */ +}; + +#endif // _ESP_PLATFORM_SYS_UN_H_ diff --git a/arch/xtensa/include/esp32/newlib/platform_include/sys/unistd.h b/arch/xtensa/include/esp32/newlib/platform_include/sys/unistd.h new file mode 100644 index 0000000000000..c3149486a2205 --- /dev/null +++ b/arch/xtensa/include/esp32/newlib/platform_include/sys/unistd.h @@ -0,0 +1,31 @@ +// 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. + + +#ifndef _ESP_SYS_UNISTD_H +#define _ESP_SYS_UNISTD_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include_next + +int truncate(const char *, off_t __length); +int gethostname(char *__name, size_t __len); + +#ifdef __cplusplus +} +#endif +#endif /* _SYS_UNISTD_H */ diff --git a/arch/xtensa/include/esp32/newlib/platform_include/sys/utime.h b/arch/xtensa/include/esp32/newlib/platform_include/sys/utime.h new file mode 100644 index 0000000000000..3251d3ce432de --- /dev/null +++ b/arch/xtensa/include/esp32/newlib/platform_include/sys/utime.h @@ -0,0 +1,35 @@ +// 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. + +#ifndef _UTIME_H_ +#define _UTIME_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct utimbuf { + time_t actime; // access time + time_t modtime; // modification time +}; + +int utime(const char *path, const struct utimbuf *times); + +#ifdef __cplusplus +}; +#endif + +#endif /* _UTIME_H_ */ diff --git a/arch/xtensa/include/esp32/newlib/platform_include/time.h b/arch/xtensa/include/esp32/newlib/platform_include/time.h new file mode 100644 index 0000000000000..e633bd4ec05bd --- /dev/null +++ b/arch/xtensa/include/esp32/newlib/platform_include/time.h @@ -0,0 +1,35 @@ +// 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. + + +#ifndef _ESP_TIME_H +#define _ESP_TIME_H + +#ifdef __cplusplus +extern "C" { +#endif +#include_next + +#define _POSIX_TIMERS 1 +#define CLOCK_MONOTONIC (clockid_t)4 +#define CLOCK_BOOTTIME (clockid_t)4 + +int clock_settime(clockid_t clock_id, const struct timespec *tp); +int clock_gettime(clockid_t clock_id, struct timespec *tp); +int clock_getres(clockid_t clock_id, struct timespec *res); + +#ifdef __cplusplus +} +#endif +#endif /* _ESP_TIME_H */ diff --git a/arch/xtensa/include/esp32/nvs_flash/include/nvs.h b/arch/xtensa/include/esp32/nvs_flash/include/nvs.h new file mode 100644 index 0000000000000..2ef5e75fc8cd6 --- /dev/null +++ b/arch/xtensa/include/esp32/nvs_flash/include/nvs.h @@ -0,0 +1,568 @@ +// 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. +#ifndef ESP_NVS_H +#define ESP_NVS_H + +#include +#include +#include +#include "../../xtensa/include/esp_attr.h" +#include "../../esp_common/esp_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Opaque pointer type representing non-volatile storage handle + */ +typedef uint32_t nvs_handle_t; + +/* + * Pre-IDF V4.0 uses nvs_handle, so leaving the original typedef here for compatibility. + */ +typedef nvs_handle_t nvs_handle IDF_DEPRECATED("Replace with nvs_handle_t"); + +#define ESP_ERR_NVS_BASE 0x1100 /*!< Starting number of error codes */ +#define ESP_ERR_NVS_NOT_INITIALIZED (ESP_ERR_NVS_BASE + 0x01) /*!< The storage driver is not initialized */ +#define ESP_ERR_NVS_NOT_FOUND (ESP_ERR_NVS_BASE + 0x02) /*!< Id namespace doesn’t exist yet and mode is NVS_READONLY */ +#define ESP_ERR_NVS_TYPE_MISMATCH (ESP_ERR_NVS_BASE + 0x03) /*!< The type of set or get operation doesn't match the type of value stored in NVS */ +#define ESP_ERR_NVS_READ_ONLY (ESP_ERR_NVS_BASE + 0x04) /*!< Storage handle was opened as read only */ +#define ESP_ERR_NVS_NOT_ENOUGH_SPACE (ESP_ERR_NVS_BASE + 0x05) /*!< There is not enough space in the underlying storage to save the value */ +#define ESP_ERR_NVS_INVALID_NAME (ESP_ERR_NVS_BASE + 0x06) /*!< Namespace name doesn’t satisfy constraints */ +#define ESP_ERR_NVS_INVALID_HANDLE (ESP_ERR_NVS_BASE + 0x07) /*!< Handle has been closed or is NULL */ +#define ESP_ERR_NVS_REMOVE_FAILED (ESP_ERR_NVS_BASE + 0x08) /*!< The value wasn’t updated because flash write operation has failed. The value was written however, and update will be finished after re-initialization of nvs, provided that flash operation doesn’t fail again. */ +#define ESP_ERR_NVS_KEY_TOO_LONG (ESP_ERR_NVS_BASE + 0x09) /*!< Key name is too long */ +#define ESP_ERR_NVS_PAGE_FULL (ESP_ERR_NVS_BASE + 0x0a) /*!< Internal error; never returned by nvs API functions */ +#define ESP_ERR_NVS_INVALID_STATE (ESP_ERR_NVS_BASE + 0x0b) /*!< NVS is in an inconsistent state due to a previous error. Call nvs_flash_init and nvs_open again, then retry. */ +#define ESP_ERR_NVS_INVALID_LENGTH (ESP_ERR_NVS_BASE + 0x0c) /*!< String or blob length is not sufficient to store data */ +#define ESP_ERR_NVS_NO_FREE_PAGES (ESP_ERR_NVS_BASE + 0x0d) /*!< NVS partition doesn't contain any empty pages. This may happen if NVS partition was truncated. Erase the whole partition and call nvs_flash_init again. */ +#define ESP_ERR_NVS_VALUE_TOO_LONG (ESP_ERR_NVS_BASE + 0x0e) /*!< String or blob length is longer than supported by the implementation */ +#define ESP_ERR_NVS_PART_NOT_FOUND (ESP_ERR_NVS_BASE + 0x0f) /*!< Partition with specified name is not found in the partition table */ + +#define ESP_ERR_NVS_NEW_VERSION_FOUND (ESP_ERR_NVS_BASE + 0x10) /*!< NVS partition contains data in new format and cannot be recognized by this version of code */ +#define ESP_ERR_NVS_XTS_ENCR_FAILED (ESP_ERR_NVS_BASE + 0x11) /*!< XTS encryption failed while writing NVS entry */ +#define ESP_ERR_NVS_XTS_DECR_FAILED (ESP_ERR_NVS_BASE + 0x12) /*!< XTS decryption failed while reading NVS entry */ +#define ESP_ERR_NVS_XTS_CFG_FAILED (ESP_ERR_NVS_BASE + 0x13) /*!< XTS configuration setting failed */ +#define ESP_ERR_NVS_XTS_CFG_NOT_FOUND (ESP_ERR_NVS_BASE + 0x14) /*!< XTS configuration not found */ +#define ESP_ERR_NVS_ENCR_NOT_SUPPORTED (ESP_ERR_NVS_BASE + 0x15) /*!< NVS encryption is not supported in this version */ +#define ESP_ERR_NVS_KEYS_NOT_INITIALIZED (ESP_ERR_NVS_BASE + 0x16) /*!< NVS key partition is uninitialized */ +#define ESP_ERR_NVS_CORRUPT_KEY_PART (ESP_ERR_NVS_BASE + 0x17) /*!< NVS key partition is corrupt */ + +#define ESP_ERR_NVS_CONTENT_DIFFERS (ESP_ERR_NVS_BASE + 0x18) /*!< Internal error; never returned by nvs API functions. NVS key is different in comparison */ + +#define NVS_DEFAULT_PART_NAME "nvs" /*!< Default partition name of the NVS partition in the partition table */ + +#define NVS_PART_NAME_MAX_SIZE 16 /*!< maximum length of partition name (excluding null terminator) */ + +/** + * @brief Mode of opening the non-volatile storage + */ +typedef enum { + NVS_READONLY, /*!< Read only */ + NVS_READWRITE /*!< Read and write */ +} nvs_open_mode_t; + +/* + * Pre-IDF V4.0 uses nvs_open_mode, so leaving the original typedef here for compatibility. + */ +typedef nvs_open_mode_t nvs_open_mode IDF_DEPRECATED("Replace with nvs_open_mode_t"); + + +/** + * @brief Types of variables + * + */ +typedef enum { + NVS_TYPE_U8 = 0x01, /*!< Type uint8_t */ + NVS_TYPE_I8 = 0x11, /*!< Type int8_t */ + NVS_TYPE_U16 = 0x02, /*!< Type uint16_t */ + NVS_TYPE_I16 = 0x12, /*!< Type int16_t */ + NVS_TYPE_U32 = 0x04, /*!< Type uint32_t */ + NVS_TYPE_I32 = 0x14, /*!< Type int32_t */ + NVS_TYPE_U64 = 0x08, /*!< Type uint64_t */ + NVS_TYPE_I64 = 0x18, /*!< Type int64_t */ + NVS_TYPE_STR = 0x21, /*!< Type string */ + NVS_TYPE_BLOB = 0x42, /*!< Type blob */ + NVS_TYPE_ANY = 0xff /*!< Must be last */ +} nvs_type_t; + +/** + * @brief information about entry obtained from nvs_entry_info function + */ +typedef struct { + char namespace_name[16]; /*!< Namespace to which key-value belong */ + char key[16]; /*!< Key of stored key-value pair */ + nvs_type_t type; /*!< Type of stored key-value pair */ +} nvs_entry_info_t; + +/** + * Opaque pointer type representing iterator to nvs entries + */ +typedef struct nvs_opaque_iterator_t *nvs_iterator_t; + +/** + * @brief Open non-volatile storage with a given namespace from the default NVS partition + * + * Multiple internal ESP-IDF and third party application modules can store + * their key-value pairs in the NVS module. In order to reduce possible + * conflicts on key names, each module can use its own namespace. + * The default NVS partition is the one that is labelled "nvs" in the partition + * table. + * + * @param[in] name Namespace name. Maximal length is determined by the + * underlying implementation, but is guaranteed to be + * at least 15 characters. Shouldn't be empty. + * @param[in] open_mode NVS_READWRITE or NVS_READONLY. If NVS_READONLY, will + * open a handle for reading only. All write requests will + * be rejected for this handle. + * @param[out] out_handle If successful (return code is zero), handle will be + * returned in this argument. + * + * @return + * - ESP_OK if storage handle was opened successfully + * - ESP_ERR_NVS_NOT_INITIALIZED if the storage driver is not initialized + * - ESP_ERR_NVS_PART_NOT_FOUND if the partition with label "nvs" is not found + * - ESP_ERR_NVS_NOT_FOUND id namespace doesn't exist yet and + * mode is NVS_READONLY + * - ESP_ERR_NVS_INVALID_NAME if namespace name doesn't satisfy constraints + * - other error codes from the underlying storage driver + */ +esp_err_t nvs_open(const char* name, nvs_open_mode_t open_mode, nvs_handle_t *out_handle); + +/** + * @brief Open non-volatile storage with a given namespace from specified partition + * + * The behaviour is same as nvs_open() API. However this API can operate on a specified NVS + * partition instead of default NVS partition. Note that the specified partition must be registered + * with NVS using nvs_flash_init_partition() API. + * + * @param[in] part_name Label (name) of the partition of interest for object read/write/erase + * @param[in] name Namespace name. Maximal length is determined by the + * underlying implementation, but is guaranteed to be + * at least 15 characters. Shouldn't be empty. + * @param[in] open_mode NVS_READWRITE or NVS_READONLY. If NVS_READONLY, will + * open a handle for reading only. All write requests will + * be rejected for this handle. + * @param[out] out_handle If successful (return code is zero), handle will be + * returned in this argument. + * + * @return + * - ESP_OK if storage handle was opened successfully + * - ESP_ERR_NVS_NOT_INITIALIZED if the storage driver is not initialized + * - ESP_ERR_NVS_PART_NOT_FOUND if the partition with specified name is not found + * - ESP_ERR_NVS_NOT_FOUND id namespace doesn't exist yet and + * mode is NVS_READONLY + * - ESP_ERR_NVS_INVALID_NAME if namespace name doesn't satisfy constraints + * - other error codes from the underlying storage driver + */ +esp_err_t nvs_open_from_partition(const char *part_name, const char* name, nvs_open_mode_t open_mode, nvs_handle_t *out_handle); + +/**@{*/ +/** + * @brief set value for given key + * + * This family of functions set value for the key, given its name. Note that + * actual storage will not be updated until nvs_commit function is called. + * + * @param[in] handle Handle obtained from nvs_open function. + * Handles that were opened read only cannot be used. + * @param[in] key Key name. Maximal length is determined by the underlying + * implementation, but is guaranteed to be at least + * 15 characters. Shouldn't be empty. + * @param[in] value The value to set. + * For strings, the maximum length (including null character) is + * 4000 bytes. + * + * @return + * - ESP_OK if value was set successfully + * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL + * - ESP_ERR_NVS_READ_ONLY if storage handle was opened as read only + * - ESP_ERR_NVS_INVALID_NAME if key name doesn't satisfy constraints + * - ESP_ERR_NVS_NOT_ENOUGH_SPACE if there is not enough space in the + * underlying storage to save the value + * - ESP_ERR_NVS_REMOVE_FAILED if the value wasn't updated because flash + * write operation has failed. The value was written however, and + * update will be finished after re-initialization of nvs, provided that + * flash operation doesn't fail again. + * - ESP_ERR_NVS_VALUE_TOO_LONG if the string value is too long + */ +esp_err_t nvs_set_i8 (nvs_handle_t handle, const char* key, int8_t value); +esp_err_t nvs_set_u8 (nvs_handle_t handle, const char* key, uint8_t value); +esp_err_t nvs_set_i16 (nvs_handle_t handle, const char* key, int16_t value); +esp_err_t nvs_set_u16 (nvs_handle_t handle, const char* key, uint16_t value); +esp_err_t nvs_set_i32 (nvs_handle_t handle, const char* key, int32_t value); +esp_err_t nvs_set_u32 (nvs_handle_t handle, const char* key, uint32_t value); +esp_err_t nvs_set_i64 (nvs_handle_t handle, const char* key, int64_t value); +esp_err_t nvs_set_u64 (nvs_handle_t handle, const char* key, uint64_t value); +esp_err_t nvs_set_str (nvs_handle_t handle, const char* key, const char* value); +/**@}*/ + +/** + * @brief set variable length binary value for given key + * + * This family of functions set value for the key, given its name. Note that + * actual storage will not be updated until nvs_commit function is called. + * + * @param[in] handle Handle obtained from nvs_open function. + * Handles that were opened read only cannot be used. + * @param[in] key Key name. Maximal length is 15 characters. Shouldn't be empty. + * @param[in] value The value to set. + * @param[in] length length of binary value to set, in bytes; Maximum length is + * 508000 bytes or (97.6% of the partition size - 4000) bytes + * whichever is lower. + * + * @return + * - ESP_OK if value was set successfully + * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL + * - ESP_ERR_NVS_READ_ONLY if storage handle was opened as read only + * - ESP_ERR_NVS_INVALID_NAME if key name doesn't satisfy constraints + * - ESP_ERR_NVS_NOT_ENOUGH_SPACE if there is not enough space in the + * underlying storage to save the value + * - ESP_ERR_NVS_REMOVE_FAILED if the value wasn't updated because flash + * write operation has failed. The value was written however, and + * update will be finished after re-initialization of nvs, provided that + * flash operation doesn't fail again. + * - ESP_ERR_NVS_VALUE_TOO_LONG if the value is too long + */ +esp_err_t nvs_set_blob(nvs_handle_t handle, const char* key, const void* value, size_t length); + +/**@{*/ +/** + * @brief get value for given key + * + * These functions retrieve value for the key, given its name. If key does not + * exist, or the requested variable type doesn't match the type which was used + * when setting a value, an error is returned. + * + * In case of any error, out_value is not modified. + * + * All functions expect out_value to be a pointer to an already allocated variable + * of the given type. + * + * \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 + * + * @param[in] handle Handle obtained from nvs_open function. + * @param[in] key Key name. Maximal length is determined by the underlying + * implementation, but is guaranteed to be at least + * 15 characters. Shouldn't be empty. + * @param out_value Pointer to the output value. + * May be NULL for nvs_get_str and nvs_get_blob, in this + * case required length will be returned in length argument. + * + * @return + * - ESP_OK if the value was retrieved successfully + * - ESP_ERR_NVS_NOT_FOUND if the requested key doesn't exist + * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL + * - ESP_ERR_NVS_INVALID_NAME if key name doesn't satisfy constraints + * - ESP_ERR_NVS_INVALID_LENGTH if length is not sufficient to store data + */ +esp_err_t nvs_get_i8 (nvs_handle_t handle, const char* key, int8_t* out_value); +esp_err_t nvs_get_u8 (nvs_handle_t handle, const char* key, uint8_t* out_value); +esp_err_t nvs_get_i16 (nvs_handle_t handle, const char* key, int16_t* out_value); +esp_err_t nvs_get_u16 (nvs_handle_t handle, const char* key, uint16_t* out_value); +esp_err_t nvs_get_i32 (nvs_handle_t handle, const char* key, int32_t* out_value); +esp_err_t nvs_get_u32 (nvs_handle_t handle, const char* key, uint32_t* out_value); +esp_err_t nvs_get_i64 (nvs_handle_t handle, const char* key, int64_t* out_value); +esp_err_t nvs_get_u64 (nvs_handle_t handle, const char* key, uint64_t* out_value); +/**@}*/ + +/** + * @brief get value for given key + * + * These functions retrieve the data of an entry, given its key. If key does not + * exist, or the requested variable type doesn't match the type which was used + * when setting a value, an error is returned. + * + * In case of any error, out_value is not modified. + * + * All functions expect out_value to be a pointer to an already allocated variable + * of the given type. + * + * nvs_get_str and nvs_get_blob functions support WinAPI-style length queries. + * To get the size necessary to store the value, call nvs_get_str or nvs_get_blob + * with zero out_value and non-zero pointer to length. Variable pointed to + * by length argument will be set to the required length. For nvs_get_str, + * this length includes the zero terminator. When calling nvs_get_str and + * nvs_get_blob with non-zero out_value, length has to be non-zero and has to + * point to the length available in out_value. + * It is suggested that nvs_get/set_str is used for zero-terminated C strings, and + * nvs_get/set_blob used for arbitrary data structures. + * + * \code{c} + * // Example (without error checking) of using nvs_get_str to get a string into dynamic array: + * size_t required_size; + * nvs_get_str(my_handle, "server_name", NULL, &required_size); + * char* server_name = malloc(required_size); + * nvs_get_str(my_handle, "server_name", server_name, &required_size); + * + * // Example (without error checking) of using nvs_get_blob to get a binary data + * into a static array: + * uint8_t mac_addr[6]; + * size_t size = sizeof(mac_addr); + * nvs_get_blob(my_handle, "dst_mac_addr", mac_addr, &size); + * \endcode + * + * @param[in] handle Handle obtained from nvs_open function. + * @param[in] key Key name. Maximal length is determined by the underlying + * implementation, but is guaranteed to be at least + * 15 characters. Shouldn't be empty. + * @param out_value Pointer to the output value. + * May be NULL for nvs_get_str and nvs_get_blob, in this + * case required length will be returned in length argument. + * @param[inout] length A non-zero pointer to the variable holding the length of out_value. + * In case out_value a zero, will be set to the length + * required to hold the value. In case out_value is not + * zero, will be set to the actual length of the value + * written. For nvs_get_str this includes zero terminator. + * + * @return + * - ESP_OK if the value was retrieved successfully + * - ESP_ERR_NVS_NOT_FOUND if the requested key doesn't exist + * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL + * - ESP_ERR_NVS_INVALID_NAME if key name doesn't satisfy constraints + * - ESP_ERR_NVS_INVALID_LENGTH if length is not sufficient to store data + */ +/**@{*/ +esp_err_t nvs_get_str (nvs_handle_t handle, const char* key, char* out_value, size_t* length); +esp_err_t nvs_get_blob(nvs_handle_t handle, const char* key, void* out_value, size_t* length); +/**@}*/ + +/** + * @brief Erase key-value pair with given key name. + * + * Note that actual storage may not be updated until nvs_commit function is called. + * + * @param[in] handle Storage handle obtained with nvs_open. + * Handles that were opened read only cannot be used. + * + * @param[in] key Key name. Maximal length is determined by the underlying + * implementation, but is guaranteed to be at least + * 15 characters. Shouldn't be empty. + * + * @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 + */ +esp_err_t nvs_erase_key(nvs_handle_t handle, const char* key); + +/** + * @brief Erase all key-value pairs in a namespace + * + * Note that actual storage may not be updated until nvs_commit function is called. + * + * @param[in] handle Storage handle obtained with nvs_open. + * Handles that were opened read only cannot be used. + * + * @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 + * - other error codes from the underlying storage driver + */ +esp_err_t nvs_erase_all(nvs_handle_t handle); + +/** + * @brief Write any pending changes to non-volatile storage + * + * After setting any values, nvs_commit() must be called to ensure changes are written + * to non-volatile storage. Individual implementations may write to storage at other times, + * but this is not guaranteed. + * + * @param[in] handle Storage handle obtained with nvs_open. + * Handles that were opened read only cannot be used. + * + * @return + * - ESP_OK if the changes have been written successfully + * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL + * - other error codes from the underlying storage driver + */ +esp_err_t nvs_commit(nvs_handle_t handle); + +/** + * @brief Close the storage handle and free any allocated resources + * + * This function should be called for each handle opened with nvs_open once + * the handle is not in use any more. Closing the handle may not automatically + * write the changes to nonvolatile storage. This has to be done explicitly using + * nvs_commit function. + * Once this function is called on a handle, the handle should no longer be used. + * + * @param[in] handle Storage handle to close + */ +void nvs_close(nvs_handle_t handle); + +/** + * @note Info about storage space NVS. + */ +typedef struct { + size_t used_entries; /**< Amount of used entries. */ + size_t free_entries; /**< Amount of free entries. */ + size_t total_entries; /**< Amount all available entries. */ + size_t namespace_count; /**< Amount name space. */ +} nvs_stats_t; + +/** + * @brief Fill structure nvs_stats_t. It provides info about used memory the partition. + * + * This function calculates to runtime the number of used entries, free entries, total entries, + * and amount namespace in partition. + * + * \code{c} + * // Example of nvs_get_stats() to get the number of used entries and free entries: + * nvs_stats_t nvs_stats; + * nvs_get_stats(NULL, &nvs_stats); + * printf("Count: UsedEntries = (%d), FreeEntries = (%d), AllEntries = (%d)\n", + nvs_stats.used_entries, nvs_stats.free_entries, nvs_stats.total_entries); + * \endcode + * + * @param[in] part_name Partition name NVS in the partition table. + * If pass a NULL than will use NVS_DEFAULT_PART_NAME ("nvs"). + * + * @param[out] nvs_stats Returns filled structure nvs_states_t. + * It provides info about used memory the partition. + * + * + * @return + * - ESP_OK if the changes have been written successfully. + * Return param nvs_stats will be filled. + * - ESP_ERR_NVS_PART_NOT_FOUND if the partition with label "name" is not found. + * Return param nvs_stats will be filled 0. + * - ESP_ERR_NVS_NOT_INITIALIZED if the storage driver is not initialized. + * Return param nvs_stats will be filled 0. + * - ESP_ERR_INVALID_ARG if nvs_stats equal to NULL. + * - ESP_ERR_INVALID_STATE if there is page with the status of INVALID. + * Return param nvs_stats will be filled not with correct values because + * not all pages will be counted. Counting will be interrupted at the first INVALID page. + */ +esp_err_t nvs_get_stats(const char *part_name, nvs_stats_t *nvs_stats); + +/** + * @brief Calculate all entries in a namespace. + * + * Note that to find out the total number of records occupied by the namespace, + * add one to the returned value used_entries (if err is equal to ESP_OK). + * Because the name space entry takes one entry. + * + * \code{c} + * // Example of nvs_get_used_entry_count() to get amount of all key-value pairs in one namespace: + * nvs_handle_t handle; + * nvs_open("namespace1", NVS_READWRITE, &handle); + * ... + * size_t used_entries; + * size_t total_entries_namespace; + * if(nvs_get_used_entry_count(handle, &used_entries) == ESP_OK){ + * // the total number of records occupied by the namespace + * total_entries_namespace = used_entries + 1; + * } + * \endcode + * + * @param[in] handle Handle obtained from nvs_open function. + * + * @param[out] used_entries Returns amount of used entries from a namespace. + * + * + * @return + * - ESP_OK if the changes have been written successfully. + * Return param used_entries will be filled valid value. + * - ESP_ERR_NVS_NOT_INITIALIZED if the storage driver is not initialized. + * Return param used_entries will be filled 0. + * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL. + * Return param used_entries will be filled 0. + * - ESP_ERR_INVALID_ARG if used_entries equal to NULL. + * - Other error codes from the underlying storage driver. + * Return param used_entries will be filled 0. + */ +esp_err_t nvs_get_used_entry_count(nvs_handle_t handle, size_t* used_entries); + +/** + * @brief Create an iterator to enumerate NVS entries based on one or more parameters + * + * \code{c} + * // Example of listing all the key-value pairs of any type under specified partition and namespace + * nvs_iterator_t it = nvs_entry_find(partition, namespace, NVS_TYPE_ANY); + * while (it != NULL) { + * nvs_entry_info_t info; + * nvs_entry_info(it, &info); + * it = nvs_entry_next(it); + * printf("key '%s', type '%d' \n", info.key, info.type); + * }; + * // Note: no need to release iterator obtained from nvs_entry_find function when + * // nvs_entry_find or nvs_entry_next function return NULL, indicating no other + * // element for specified criteria was found. + * } + * \endcode + * + * @param[in] part_name Partition name + * + * @param[in] namespace_name Set this value if looking for entries with + * a specific namespace. Pass NULL otherwise. + * + * @param[in] type One of nvs_type_t values. + * + * @return + * Iterator used to enumerate all the entries found, + * or NULL if no entry satisfying criteria was found. + * Iterator obtained through this function has to be released + * using nvs_release_iterator when not used any more. + */ +nvs_iterator_t nvs_entry_find(const char *part_name, const char *namespace_name, nvs_type_t type); + +/** + * @brief Returns next item matching the iterator criteria, NULL if no such item exists. + * + * Note that any copies of the iterator will be invalid after this call. + * + * @param[in] iterator Iterator obtained from nvs_entry_find function. Must be non-NULL. + * + * @return + * NULL if no entry was found, valid nvs_iterator_t otherwise. + */ +nvs_iterator_t nvs_entry_next(nvs_iterator_t iterator); + +/** + * @brief Fills nvs_entry_info_t structure with information about entry pointed to by the iterator. + * + * @param[in] iterator Iterator obtained from nvs_entry_find or nvs_entry_next function. Must be non-NULL. + * + * @param[out] out_info Structure to which entry information is copied. + */ +void nvs_entry_info(nvs_iterator_t iterator, nvs_entry_info_t *out_info); + +/** + * @brief Release iterator + * + * @param[in] iterator Release iterator obtained from nvs_entry_find function. NULL argument is allowed. + * + */ +void nvs_release_iterator(nvs_iterator_t iterator); + + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif //ESP_NVS_H + diff --git a/arch/xtensa/include/esp32/nvs_flash/include/nvs_flash.h b/arch/xtensa/include/esp32/nvs_flash/include/nvs_flash.h new file mode 100644 index 0000000000000..0f25e95ad8a6b --- /dev/null +++ b/arch/xtensa/include/esp32/nvs_flash/include/nvs_flash.h @@ -0,0 +1,193 @@ +// 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. +#ifndef nvs_flash_h +#define nvs_flash_h + +#ifdef __cplusplus +extern "C" { +#endif + +#include "nvs.h" +#include "esp_partition.h" + + +#define NVS_KEY_SIZE 32 // AES-256 + +/** + * @brief Key for encryption and decryption + */ +typedef struct { + uint8_t eky[NVS_KEY_SIZE]; /*!< XTS encryption and decryption key*/ + uint8_t tky[NVS_KEY_SIZE]; /*!< XTS tweak key */ +} nvs_sec_cfg_t; + +/** + * @brief Initialize the default NVS partition. + * + * This API initialises the default NVS partition. The default NVS partition + * is the one that is labeled "nvs" in the partition table. + * + * @return + * - ESP_OK if storage was successfully initialized. + * - ESP_ERR_NVS_NO_FREE_PAGES if the NVS storage contains no empty pages + * (which may happen if NVS partition was truncated) + * - ESP_ERR_NOT_FOUND if no partition with label "nvs" is found in the partition table + * - one of the error codes from the underlying flash storage driver + */ +esp_err_t nvs_flash_init(void); + +/** + * @brief Initialize NVS flash storage for the specified partition. + * + * @param[in] partition_label Label of the partition. Must be no longer than 16 characters. + * + * @return + * - ESP_OK if storage was successfully initialized. + * - ESP_ERR_NVS_NO_FREE_PAGES if the NVS storage contains no empty pages + * (which may happen if NVS partition was truncated) + * - ESP_ERR_NOT_FOUND if specified partition is not found in the partition table + * - one of the error codes from the underlying flash storage driver + */ +esp_err_t nvs_flash_init_partition(const char *partition_label); + +/** + * @brief Deinitialize NVS storage for the default NVS partition + * + * Default NVS partition is the partition with "nvs" label in the partition table. + * + * @return + * - ESP_OK on success (storage was deinitialized) + * - ESP_ERR_NVS_NOT_INITIALIZED if the storage was not initialized prior to this call + */ +esp_err_t nvs_flash_deinit(void); + +/** + * @brief Deinitialize NVS storage for the given NVS partition + * + * @param[in] partition_label Label of the partition + * + * @return + * - ESP_OK on success + * - ESP_ERR_NVS_NOT_INITIALIZED if the storage for given partition was not + * initialized prior to this call + */ +esp_err_t nvs_flash_deinit_partition(const char* partition_label); + +/** + * @brief Erase the default NVS partition + * + * This function erases all contents of the default NVS partition (one with label "nvs") + * + * @return + * - ESP_OK on success + * - ESP_ERR_NOT_FOUND if there is no NVS partition labeled "nvs" in the + * partition table + */ +esp_err_t nvs_flash_erase(void); + +/** + * @brief Erase specified NVS partition + * + * This function erases all contents of specified NVS partition + * + * @param[in] part_name Name (label) of the partition to be erased + * + * @return + * - ESP_OK on success + * - ESP_ERR_NOT_FOUND if there is no NVS partition with the specified name + * in the partition table + */ +esp_err_t nvs_flash_erase_partition(const char *part_name); + + +/** + * @brief Initialize the default NVS partition. + * + * This API initialises the default NVS partition. The default NVS partition + * is the one that is labeled "nvs" in the partition table. + * + * @param[in] cfg Security configuration (keys) to be used for NVS encryption/decryption. + * If cfg is NULL, no encryption is used. + * + * @return + * - ESP_OK if storage was successfully initialized. + * - ESP_ERR_NVS_NO_FREE_PAGES if the NVS storage contains no empty pages + * (which may happen if NVS partition was truncated) + * - ESP_ERR_NOT_FOUND if no partition with label "nvs" is found in the partition table + * - one of the error codes from the underlying flash storage driver + */ +esp_err_t nvs_flash_secure_init(nvs_sec_cfg_t* cfg); + +/** + * @brief Initialize NVS flash storage for the specified partition. + * + * @param[in] partition_label Label of the partition. Note that internally a reference to + * passed value is kept and it should be accessible for future operations + * + * @param[in] cfg Security configuration (keys) to be used for NVS encryption/decryption. + * If cfg is null, no encryption/decryption is used. + * @return + * - ESP_OK if storage was successfully initialized. + * - ESP_ERR_NVS_NO_FREE_PAGES if the NVS storage contains no empty pages + * (which may happen if NVS partition was truncated) + * - ESP_ERR_NOT_FOUND if specified partition is not found in the partition table + * - one of the error codes from the underlying flash storage driver + */ +esp_err_t nvs_flash_secure_init_partition(const char *partition_label, nvs_sec_cfg_t* cfg); + +/** + * @brief Generate and store NVS keys in the provided esp partition + * + * @param[in] partition Pointer to partition structure obtained using + * esp_partition_find_first or esp_partition_get. + * Must be non-NULL. + * @param[out] cfg Pointer to nvs security configuration structure. + * Pointer must be non-NULL. + * Generated keys will be populated in this structure. + * + * + * @return + * -ESP_OK, if cfg was read successfully; + * -or error codes from esp_partition_write/erase APIs. + */ + +esp_err_t nvs_flash_generate_keys(const esp_partition_t* partition, nvs_sec_cfg_t* cfg); + + +/** + * @brief Read NVS security configuration from a partition. + * + * @param[in] partition Pointer to partition structure obtained using + * esp_partition_find_first or esp_partition_get. + * Must be non-NULL. + * @param[out] cfg Pointer to nvs security configuration structure. + * Pointer must be non-NULL. + * + * @note Provided parition is assumed to be marked 'encrypted'. + * + * @return + * -ESP_OK, if cfg was read successfully; + * -ESP_ERR_NVS_KEYS_NOT_INITIALIZED, if the partition is not yet written with keys. + * -ESP_ERR_NVS_CORRUPT_KEY_PART, if the partition containing keys is found to be corrupt + * -or error codes from esp_partition_read API. + */ + +esp_err_t nvs_flash_read_security_cfg(const esp_partition_t* partition, nvs_sec_cfg_t* cfg); + +#ifdef __cplusplus +} +#endif + + +#endif /* nvs_flash_h */ diff --git a/arch/xtensa/include/esp32/nvs_flash/include/nvs_handle.hpp b/arch/xtensa/include/esp32/nvs_flash/include/nvs_handle.hpp new file mode 100644 index 0000000000000..8699974a0045e --- /dev/null +++ b/arch/xtensa/include/esp32/nvs_flash/include/nvs_handle.hpp @@ -0,0 +1,262 @@ +#ifndef NVS_HANDLE_HPP_ +#define NVS_HANDLE_HPP_ + +#include +#include +#include + +#include "nvs.h" + +namespace nvs { + +/** + * The possible blob types. This is a helper definition for template functions. + */ +enum class ItemType : uint8_t { + U8 = NVS_TYPE_U8, + I8 = NVS_TYPE_I8, + U16 = NVS_TYPE_U16, + I16 = NVS_TYPE_I16, + U32 = NVS_TYPE_U32, + I32 = NVS_TYPE_I32, + U64 = NVS_TYPE_U64, + I64 = NVS_TYPE_I64, + SZ = NVS_TYPE_STR, + BLOB = 0x41, + BLOB_DATA = NVS_TYPE_BLOB, + BLOB_IDX = 0x48, + ANY = NVS_TYPE_ANY +}; + + +/** + * @brief A handle allowing nvs-entry related operations on the NVS. + * + * @note The scope of this handle may vary depending on the implementation, but normally would be the namespace of + * a particular partition. Outside that scope, nvs entries can't be accessed/altered. + */ +class NVSHandle { +public: + virtual ~NVSHandle() { } + + /** + * @brief set value for given key + * + * Sets value for key. Note that physical storage will not be updated until nvs_commit function is called. + * + * @param[in] key Key name. Maximal length is determined by the underlying + * implementation, but is guaranteed to be at least + * 15 characters. Shouldn't be empty. + * @param[in] value The value to set. Allowed types are the ones declared in ItemType. + * For strings, the maximum length (including null character) is + * 4000 bytes. + * + * @return + * - ESP_OK if value was set successfully + * - ESP_ERR_NVS_READ_ONLY if storage handle was opened as read only + * - ESP_ERR_NVS_INVALID_NAME if key name doesn't satisfy constraints + * - ESP_ERR_NVS_NOT_ENOUGH_SPACE if there is not enough space in the + * underlying storage to save the value + * - ESP_ERR_NVS_REMOVE_FAILED if the value wasn't updated because flash + * write operation has failed. The value was written however, and + * update will be finished after re-initialization of nvs, provided that + * flash operation doesn't fail again. + * - ESP_ERR_NVS_VALUE_TOO_LONG if the string value is too long + */ + template + esp_err_t set_item(const char *key, T value); + virtual + esp_err_t set_string(const char *key, const char* value) = 0; + + /** + * @brief get value for given key + * + * These functions retrieve value for the key, given its name. If key does not + * exist, or the requested variable type doesn't match the type which was used + * when setting a value, an error is returned. + * + * In case of any error, out_value is not modified. + * + * @param[in] key Key name. Maximal length is determined by the underlying + * implementation, but is guaranteed to be at least + * 15 characters. Shouldn't be empty. + * @param value The output value. + * + * @return + * - ESP_OK if the value was retrieved successfully + * - ESP_ERR_NVS_NOT_FOUND if the requested key doesn't exist + * - ESP_ERR_NVS_INVALID_NAME if key name doesn't satisfy constraints + * - ESP_ERR_NVS_INVALID_LENGTH if length is not sufficient to store data + */ + template + esp_err_t get_item(const char *key, T &value); + + /** + * @brief set variable length binary value for given key + * + * This family of functions set value for the key, given its name. Note that + * actual storage will not be updated until nvs_commit function is called. + * + * @param[in] key Key name. Maximal length is 15 characters. Shouldn't be empty. + * @param[in] blob The blob value to set. + * @param[in] len length of binary value to set, in bytes; Maximum length is + * 508000 bytes or (97.6% of the partition size - 4000) bytes + * whichever is lower. + * + * @return + * - ESP_OK if value was set successfully + * - ESP_ERR_NVS_READ_ONLY if storage handle was opened as read only + * - ESP_ERR_NVS_INVALID_NAME if key name doesn't satisfy constraints + * - ESP_ERR_NVS_NOT_ENOUGH_SPACE if there is not enough space in the + * underlying storage to save the value + * - ESP_ERR_NVS_REMOVE_FAILED if the value wasn't updated because flash + * write operation has failed. The value was written however, and + * update will be finished after re-initialization of nvs, provided that + * flash operation doesn't fail again. + * - ESP_ERR_NVS_VALUE_TOO_LONG if the value is too long + * + * @note compare to \ref nvs_set_blob in nvs.h + */ + virtual esp_err_t set_blob(const char *key, const void* blob, size_t len) = 0; + + /** + * @brief get value for given key + * + * These functions retrieve the data of an entry, given its key. If key does not + * exist, or the requested variable type doesn't match the type which was used + * when setting a value, an error is returned. + * + * In case of any error, out_value is not modified. + * + * Both functions expect out_value to be a pointer to an already allocated variable + * of the given type. + * + * It is suggested that nvs_get/set_str is used for zero-terminated C strings, and + * nvs_get/set_blob used for arbitrary data structures. + * + * @param[in] key Key name. Maximal length is determined by the underlying + * implementation, but is guaranteed to be at least + * 15 characters. Shouldn't be empty. + * @param out_str/ Pointer to the output value. + * out_blob + * @param[inout] length A non-zero pointer to the variable holding the length of out_value. + * It will be set to the actual length of the value + * written. For nvs_get_str this includes the zero terminator. + * + * @return + * - ESP_OK if the value was retrieved successfully + * - ESP_ERR_NVS_NOT_FOUND if the requested key doesn't exist + * - ESP_ERR_NVS_INVALID_NAME if key name doesn't satisfy constraints + * - ESP_ERR_NVS_INVALID_LENGTH if length is not sufficient to store data + */ + virtual esp_err_t get_string(const char *key, char* out_str, size_t len) = 0; + virtual esp_err_t get_blob(const char *key, void* out_blob, size_t len) = 0; + + /** + * @brief Looks up the size of an entry's data. + * + * For strings, this size includes the zero terminator. + */ + virtual esp_err_t get_item_size(ItemType datatype, const char *key, size_t &size) = 0; + + /** + * @brief Erases an entry. + */ + virtual esp_err_t erase_item(const char* key) = 0; + + /** + * Erases all entries in the scope of this handle. The scope may vary, depending on the implementation. + * + * @not If you want to erase the whole nvs flash (partition), refer to \ref + */ + virtual esp_err_t erase_all() = 0; + + /** + * Commits all changes done through this handle so far. + */ + virtual esp_err_t commit() = 0; + + /** + * @brief Calculate all entries in the scope of the handle. + * + * @param[out] used_entries Returns amount of used entries from a namespace on success. + * + * + * @return + * - ESP_OK if the changes have been written successfully. + * Return param used_entries will be filled valid value. + * - ESP_ERR_NVS_NOT_INITIALIZED if the storage driver is not initialized. + * Return param used_entries will be filled 0. + * - ESP_ERR_INVALID_ARG if nvs_stats equal to NULL. + * - Other error codes from the underlying storage driver. + * Return param used_entries will be filled 0. + */ + virtual esp_err_t get_used_entry_count(size_t& usedEntries) = 0; + +protected: + virtual esp_err_t set_typed_item(ItemType datatype, const char *key, const void* data, size_t dataSize) = 0; + + virtual esp_err_t get_typed_item(ItemType datatype, const char *key, void* data, size_t dataSize) = 0; +}; + +/** + * @brief Opens non-volatile storage and returns a handle object. + * + * The handle is automatically closed on desctruction. The scope of the handle is the namespace ns_name + * in a particular partition partition_name. + * The parameters partition_name, ns_name and open_mode have the same meaning and restrictions as the parameters + * part_name, name and open_mode in \ref nvs_open_from_partition, respectively. + * + * @param err an optional pointer to an esp_err_t result of the open operation, having the same meaning as the return + * value in \ref nvs_open_from_partition: + * - ESP_OK if storage handle was opened successfully + * - ESP_ERR_NVS_NOT_INITIALIZED if the storage driver is not initialized + * - ESP_ERR_NVS_PART_NOT_FOUND if the partition with label "nvs" is not found + * - ESP_ERR_NVS_NOT_FOUND id namespace doesn't exist yet and + * mode is NVS_READONLY + * - ESP_ERR_NVS_INVALID_NAME if namespace name doesn't satisfy constraints + * - other error codes from the underlying storage driver + * + * @return shared pointer of an nvs handle on success, an empty shared pointer otherwise + */ +std::unique_ptr open_nvs_handle_from_partition(const char *partition_name, + const char *ns_name, + nvs_open_mode_t open_mode, + esp_err_t *err = nullptr); + +/** + * @brief This function does the same as \ref open_nvs_handle_from_partition but uses the default nvs partition + * instead of a partition_name parameter. + */ +std::unique_ptr open_nvs_handle(const char *ns_name, + nvs_open_mode_t open_mode, + esp_err_t *err = nullptr); + +// Helper functions for template usage +template::value, void*>::type = nullptr> +constexpr ItemType itemTypeOf() +{ + return static_cast(((std::is_signed::value)?0x10:0x00) | sizeof(T)); +} + +template +constexpr ItemType itemTypeOf(const T&) +{ + return itemTypeOf(); +} + +// Template Implementations +template +esp_err_t NVSHandle::set_item(const char *key, T value) { + return set_typed_item(itemTypeOf(value), key, &value, sizeof(value)); +} + +template +esp_err_t NVSHandle::get_item(const char *key, T &value) { + return get_typed_item(itemTypeOf(value), key, &value, sizeof(value)); +} + +} // nvs + +#endif // NVS_HANDLE_HPP_ + diff --git a/arch/xtensa/include/esp32/soc/esp32/include/hal/adc_ll.h b/arch/xtensa/include/esp32/soc/esp32/include/hal/adc_ll.h new file mode 100644 index 0000000000000..d08ec0a843308 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/hal/adc_ll.h @@ -0,0 +1,622 @@ +#pragma once + +#include "soc/adc_periph.h" +#include "hal/adc_types.h" +#include + +typedef enum { + ADC_DIG_FORMAT_12BIT, /*!< ADC to I2S data format, [15:12]-channel [11:0]-12 bits ADC data. + Note: In single convert mode. */ + ADC_DIG_FORMAT_11BIT, /*!< ADC to I2S data format, [15]-1 [14:11]-channel [10:0]-11 bits ADC data. + Note: In multi convert mode. */ + ADC_DIG_FORMAT_MAX, +} adc_ll_dig_output_format_t; + +typedef enum { + ADC_CONV_SINGLE_UNIT_1 = 1, /*!< SAR ADC 1*/ + ADC_CONV_SINGLE_UNIT_2 = 2, /*!< SAR ADC 2, not supported yet*/ + ADC_CONV_BOTH_UNIT = 3, /*!< SAR ADC 1 and 2, not supported yet */ + ADC_CONV_ALTER_UNIT = 7, /*!< SAR ADC 1 and 2 alternative mode, not supported yet */ + ADC_CONV_UNIT_MAX, +} adc_ll_convert_mode_t; + +typedef enum { + ADC_NUM_1 = 0, /*!< SAR ADC 1 */ + ADC_NUM_2 = 1, /*!< SAR ADC 2 */ + ADC_NUM_MAX, +} adc_ll_num_t; + +typedef struct { + union { + struct { + uint8_t atten: 2; /*!< ADC sampling voltage attenuation configuration. + 0: input voltage * 1; + 1: input voltage * 1/1.34; + 2: input voltage * 1/2; + 3: input voltage * 1/3.6. */ + uint8_t bit_width: 2; /*!< ADC resolution. + 0: 9 bit; + 1: 10 bit; + 2: 11 bit; + 3: 12 bit. */ + uint8_t channel: 4; /*!< ADC channel index. */ + }; + uint8_t val; + }; +} adc_ll_pattern_table_t; + +typedef enum { + ADC_POWER_BY_FSM, /*!< ADC XPD controled by FSM. Used for polling mode */ + ADC_POWER_SW_ON, /*!< ADC XPD controled by SW. power on. Used for DMA mode */ + ADC_POWER_SW_OFF, /*!< ADC XPD controled by SW. power off. */ + ADC_POWER_MAX, /*!< For parameter check. */ +} adc_ll_power_t; + +typedef enum { + ADC_HALL_CTRL_ULP = 0x0,/*!< Hall sensor controled by ULP */ + ADC_HALL_CTRL_RTC = 0x1 /*!< Hall sensor controled by RTC */ +} adc_ll_hall_controller_t ; + +typedef enum { + ADC_CTRL_RTC = 0, + ADC_CTRL_ULP = 1, + ADC_CTRL_DIG = 2, + ADC2_CTRL_PWDET = 3, +} adc_ll_controller_t ; + +/*--------------------------------------------------------------- + Digital controller setting +---------------------------------------------------------------*/ + +/** + * Set adc fsm interval parameter for digital controller. These values are fixed for same platforms. + * + * @param rst_wait cycles between DIG ADC controller reset ADC sensor and start ADC sensor. + * @param start_wait Delay time after open xpd. + * @param standby_wait Delay time to close xpd. + */ +static inline void adc_ll_dig_set_fsm_time(uint32_t rst_wait, uint32_t start_wait, uint32_t standby_wait) +{ + // Internal FSM reset wait time + SYSCON.saradc_fsm.rstb_wait = rst_wait; + // Internal FSM start wait time + SYSCON.saradc_fsm.start_wait = start_wait; + // Internal FSM standby wait time + SYSCON.saradc_fsm.standby_wait = standby_wait; +} + +/** + * Set adc sample cycle for digital controller. + * + * @note Normally, please use default value. + * @param sample_cycle Cycles between DIG ADC controller start ADC sensor and beginning to receive data from sensor. + * Range: 2 ~ 0xFF. + */ +static inline void adc_ll_dig_set_sample_cycle(uint32_t sample_cycle) +{ + SYSCON.saradc_fsm.sample_cycle = sample_cycle; +} + +/** + * Set adc output data format for digital controller. + * + * @param format Output data format. + */ +static inline void adc_ll_dig_set_output_format(adc_ll_dig_output_format_t format) +{ + SYSCON.saradc_ctrl.data_sar_sel = format; +} + +/** + * Set adc max conversion number for digital controller. + * If the number of ADC conversion is equal to the maximum, the conversion is stopped. + * + * @param meas_num Max conversion number. Range: 0 ~ 255. + */ +static inline void adc_ll_dig_set_convert_limit_num(uint32_t meas_num) +{ + SYSCON.saradc_ctrl2.max_meas_num = meas_num; +} + +/** + * Enable max conversion number detection for digital controller. + * If the number of ADC conversion is equal to the maximum, the conversion is stopped. + */ +static inline void adc_ll_dig_convert_limit_enable(void) +{ + SYSCON.saradc_ctrl2.meas_num_limit = 1; +} + +/** + * Disable max conversion number detection for digital controller. + * If the number of ADC conversion is equal to the maximum, the conversion is stopped. + */ +static inline void adc_ll_dig_convert_limit_disable(void) +{ + SYSCON.saradc_ctrl2.meas_num_limit = 0; +} + +/** + * Set adc conversion mode for digital controller. + * + * @note ESP32 only support ADC1 single mode. + * + * @param mode Conversion mode select. + */ +static inline void adc_ll_dig_set_convert_mode(adc_ll_convert_mode_t mode) +{ + if (mode == ADC_CONV_SINGLE_UNIT_1) { + SYSCON.saradc_ctrl.work_mode = 0; + SYSCON.saradc_ctrl.sar_sel = 0; + } else if (mode == ADC_CONV_SINGLE_UNIT_2) { + SYSCON.saradc_ctrl.work_mode = 0; + SYSCON.saradc_ctrl.sar_sel = 1; + } else if (mode == ADC_CONV_BOTH_UNIT) { + SYSCON.saradc_ctrl.work_mode = 1; + } else if (mode == ADC_CONV_ALTER_UNIT) { + SYSCON.saradc_ctrl.work_mode = 2; + } +} + +/** + * Set I2S DMA data source for digital controller. + * + * @param src i2s data source. + */ +static inline void adc_ll_dig_set_data_source(adc_i2s_source_t src) +{ + /* 1: I2S input data is from SAR ADC (for DMA) 0: I2S input data is from GPIO matrix */ + SYSCON.saradc_ctrl.data_to_i2s = src; +} + +/** + * Set pattern table lenth for digital controller. + * The pattern table that defines the conversion rules for each SAR ADC. Each table has 16 items, in which channel selection, + * resolution and attenuation are stored. When the conversion is started, the controller reads conversion rules from the + * pattern table one by one. For each controller the scan sequence has at most 16 different rules before repeating itself. + * + * @prarm adc_n ADC unit. + * @param patt_len Items range: 1 ~ 16. + */ +static inline void adc_ll_set_pattern_table_len(adc_ll_num_t adc_n, uint32_t patt_len) +{ + if (adc_n == ADC_NUM_1) { + SYSCON.saradc_ctrl.sar1_patt_len = patt_len - 1; + } else { // adc_n == ADC_NUM_2 + SYSCON.saradc_ctrl.sar2_patt_len = patt_len - 1; + } +} + +/** + * Set pattern table lenth for digital controller. + * The pattern table that defines the conversion rules for each SAR ADC. Each table has 16 items, in which channel selection, + * resolution and attenuation are stored. When the conversion is started, the controller reads conversion rules from the + * pattern table one by one. For each controller the scan sequence has at most 16 different rules before repeating itself. + * + * @prarm adc_n ADC unit. + * @param pattern_index Items index. Range: 1 ~ 16. + * @param pattern Stored conversion rules. + */ +static inline void adc_ll_set_pattern_table(adc_ll_num_t adc_n, uint32_t pattern_index, adc_ll_pattern_table_t pattern) +{ + uint32_t tab; + uint8_t *arg; + if (adc_n == ADC_NUM_1) { + tab = SYSCON.saradc_sar1_patt_tab[pattern_index / 4]; + arg = (uint8_t *)&tab; + arg[pattern_index % 4] = pattern.val; + SYSCON.saradc_sar1_patt_tab[pattern_index / 4] = tab; + } else { // adc_n == ADC_NUM_2 + tab = SYSCON.saradc_sar2_patt_tab[pattern_index / 4]; + arg = (uint8_t *)&tab; + arg[pattern_index % 4] = pattern.val; + SYSCON.saradc_sar2_patt_tab[pattern_index / 4] = tab; + } +} + +/*--------------------------------------------------------------- + PWDET(Power detect) controller setting +---------------------------------------------------------------*/ +/** + * Set adc cct for PWDET controller. + * + * @note Capacitor tuning of the PA power monitor. cct set to the same value with PHY. + * @prarm cct Range: 0 ~ 7. + */ +static inline void adc_ll_pwdet_set_cct(uint32_t cct) +{ + /* Capacitor tuning of the PA power monitor. cct set to the same value with PHY. */ + SENS.sar_start_force.sar2_pwdet_cct = cct; +} + +/** + * Get adc cct for PWDET controller. + * + * @note Capacitor tuning of the PA power monitor. cct set to the same value with PHY. + * @return cct Range: 0 ~ 7. + */ +static inline uint32_t adc_ll_pwdet_get_cct(void) +{ + /* Capacitor tuning of the PA power monitor. cct set to the same value with PHY. */ + return SENS.sar_start_force.sar2_pwdet_cct; +} + +/*--------------------------------------------------------------- + RTC controller setting +---------------------------------------------------------------*/ +/** + * Set adc output data format for RTC controller. + * + * @prarm adc_n ADC unit. + * @prarm bits Output data bits width option. + */ +static inline void adc_ll_rtc_set_output_format(adc_ll_num_t adc_n, adc_bits_width_t bits) +{ + if (adc_n == ADC_NUM_1) { + SENS.sar_start_force.sar1_bit_width = bits; + SENS.sar_read_ctrl.sar1_sample_bit = bits; + } else { // adc_n == ADC_NUM_2 + SENS.sar_start_force.sar2_bit_width = bits; + SENS.sar_read_ctrl2.sar2_sample_bit = bits; + } +} + +/** + * Enable adc channel to start convert. + * + * @note Only one channel can be selected for once measurement. + * + * @prarm adc_n ADC unit. + * @param channel ADC channel number for each ADCn. + */ +static inline void adc_ll_rtc_enable_channel(adc_ll_num_t adc_n, int channel) +{ + if (adc_n == ADC_NUM_1) { + SENS.sar_meas_start1.sar1_en_pad = (1 << channel); //only one channel is selected. + } else { // adc_n == ADC_NUM_2 + SENS.sar_meas_start2.sar2_en_pad = (1 << channel); //only one channel is selected. + } +} + +/** + * Start conversion once by software for RTC controller. + * + * @note It may be block to wait conversion idle for ADC1. + * + * @prarm adc_n ADC unit. + * @param channel ADC channel number for each ADCn. + */ +static inline void adc_ll_rtc_start_convert(adc_ll_num_t adc_n, int channel) +{ + if (adc_n == ADC_NUM_1) { + while (SENS.sar_slave_addr1.meas_status != 0); + SENS.sar_meas_start1.meas1_start_sar = 0; + SENS.sar_meas_start1.meas1_start_sar = 1; + } else { // adc_n == ADC_NUM_2 + SENS.sar_meas_start2.meas2_start_sar = 0; //start force 0 + SENS.sar_meas_start2.meas2_start_sar = 1; //start force 1 + } +} + +/** + * Check the conversion done flag for each ADCn for RTC controller. + * + * @prarm adc_n ADC unit. + * @return + * -true : The conversion process is finish. + * -false : The conversion process is not finish. + */ +static inline bool adc_ll_rtc_convert_is_done(adc_ll_num_t adc_n) +{ + bool ret = true; + if (adc_n == ADC_NUM_1) { + ret = (bool)SENS.sar_meas_start1.meas1_done_sar; + } else { // adc_n == ADC_NUM_2 + ret = (bool)SENS.sar_meas_start2.meas2_done_sar; + } + return ret; +} + +/** + * Get the converted value for each ADCn for RTC controller. + * + * @prarm adc_n ADC unit. + * @return + * - Converted value. + */ +static inline int adc_ll_rtc_get_convert_value(adc_ll_num_t adc_n) +{ + int ret_val = 0; + if (adc_n == ADC_NUM_1) { + ret_val = SENS.sar_meas_start1.meas1_data_sar; + } else { // adc_n == ADC_NUM_2 + ret_val = SENS.sar_meas_start2.meas2_data_sar; + } + return ret_val; +} + +/*--------------------------------------------------------------- + Common setting +---------------------------------------------------------------*/ +/** + * Set ADC module power management. + * + * @prarm manage Set ADC power status. + */ +static inline void adc_ll_set_power_manage(adc_ll_power_t manage) +{ + /* Bit1 0:Fsm 1: SW mode + Bit0 0:SW mode power down 1: SW mode power on */ + if (manage == ADC_POWER_SW_ON) { + SENS.sar_meas_wait2.force_xpd_sar = SENS_FORCE_XPD_SAR_PU; + } else if (manage == ADC_POWER_BY_FSM) { + SENS.sar_meas_wait2.force_xpd_sar = SENS_FORCE_XPD_SAR_FSM; + } else if (manage == ADC_POWER_SW_OFF) { + SENS.sar_meas_wait2.force_xpd_sar = SENS_FORCE_XPD_SAR_PD; + } +} + +/** + * Get ADC module power management. + * + * @return + * - ADC power status. + */ +static inline adc_ll_power_t adc_ll_get_power_manage(void) +{ + /* Bit1 0:Fsm 1: SW mode + Bit0 0:SW mode power down 1: SW mode power on */ + adc_ll_power_t manage; + if (SENS.sar_meas_wait2.force_xpd_sar == SENS_FORCE_XPD_SAR_PU) { + manage = ADC_POWER_SW_ON; + } else if (SENS.sar_meas_wait2.force_xpd_sar == SENS_FORCE_XPD_SAR_PD) { + manage = ADC_POWER_SW_OFF; + } else { + manage = ADC_POWER_BY_FSM; + } + return manage; +} + +/** + * ADC module clock division factor setting. ADC clock devided from APB clock. + * + * @prarm div Division factor. + */ +static inline void adc_ll_set_clk_div(uint32_t div) +{ + /* ADC clock devided from APB clk, e.g. 80 / 2 = 40Mhz, */ + SYSCON.saradc_ctrl.sar_clk_div = div; +} + +/** + * Set the attenuation of a particular channel on ADCn. + * + * @note For any given channel, this function must be called before the first time conversion. + * + * The default ADC full-scale voltage is 1.1V. To read higher voltages (up to the pin maximum voltage, + * usually 3.3V) requires setting >0dB signal attenuation for that ADC channel. + * + * When VDD_A is 3.3V: + * + * - 0dB attenuaton (ADC_ATTEN_DB_0) gives full-scale voltage 1.1V + * - 2.5dB attenuation (ADC_ATTEN_DB_2_5) gives full-scale voltage 1.5V + * - 6dB attenuation (ADC_ATTEN_DB_6) gives full-scale voltage 2.2V + * - 11dB attenuation (ADC_ATTEN_DB_11) gives full-scale voltage 3.9V (see note below) + * + * @note The full-scale voltage is the voltage corresponding to a maximum reading (depending on ADC1 configured + * bit width, this value is: 4095 for 12-bits, 2047 for 11-bits, 1023 for 10-bits, 511 for 9 bits.) + * + * @note At 11dB attenuation the maximum voltage is limited by VDD_A, not the full scale voltage. + * + * Due to ADC characteristics, most accurate results are obtained within the following approximate voltage ranges: + * + * - 0dB attenuaton (ADC_ATTEN_DB_0) between 100 and 950mV + * - 2.5dB attenuation (ADC_ATTEN_DB_2_5) between 100 and 1250mV + * - 6dB attenuation (ADC_ATTEN_DB_6) between 150 to 1750mV + * - 11dB attenuation (ADC_ATTEN_DB_11) between 150 to 2450mV + * + * For maximum accuracy, use the ADC calibration APIs and measure voltages within these recommended ranges. + * + * @prarm adc_n ADC unit. + * @prarm channel ADCn channel number. + * @prarm atten The attenuation option. + */ +static inline void adc_ll_set_atten(adc_ll_num_t adc_n, adc_channel_t channel, adc_atten_t atten) +{ + if (adc_n == ADC_NUM_1) { + SENS.sar_atten1 = ( SENS.sar_atten1 & ~(0x3 << (channel * 2)) ) | ((atten & 0x3) << (channel * 2)); + } else { // adc_n == ADC_NUM_2 + SENS.sar_atten2 = ( SENS.sar_atten2 & ~(0x3 << (channel * 2)) ) | ((atten & 0x3) << (channel * 2)); + } +} + +/** + * ADC module output data invert or not. + * + * @prarm adc_n ADC unit. + */ +static inline void adc_ll_output_invert(adc_ll_num_t adc_n, bool inv_en) +{ + if (adc_n == ADC_NUM_1) { + SENS.sar_read_ctrl.sar1_data_inv = inv_en; // Enable / Disable ADC data invert + } else { // adc_n == ADC_NUM_2 + SENS.sar_read_ctrl2.sar2_data_inv = inv_en; // Enable / Disable ADC data invert + } +} + +/** + * Set ADC module controller. + * There are five SAR ADC controllers: + * Two digital controller: Continuous conversion mode (DMA). High performance with multiple channel scan modes; + * Two RTC controller: Single conversion modes (Polling). For low power purpose working during deep sleep; + * the other is dedicated for Power detect (PWDET / PKDET), Only support ADC2. + * + * @prarm adc_n ADC unit. + * @prarm ctrl ADC controller. + */ +static inline void adc_ll_set_controller(adc_ll_num_t adc_n, adc_ll_controller_t ctrl) +{ + if (adc_n == ADC_NUM_1) { + switch ( ctrl ) { + case ADC_CTRL_RTC: + SENS.sar_read_ctrl.sar1_dig_force = 0; // 1: Select digital control; 0: Select RTC control. + SENS.sar_meas_start1.meas1_start_force = 1; // 1: SW control RTC ADC start; 0: ULP control RTC ADC start. + SENS.sar_meas_start1.sar1_en_pad_force = 1; // 1: SW control RTC ADC bit map; 0: ULP control RTC ADC bit map; + SENS.sar_touch_ctrl1.xpd_hall_force = 1; // 1: SW control HALL power; 0: ULP FSM control HALL power. + SENS.sar_touch_ctrl1.hall_phase_force = 1; // 1: SW control HALL phase; 0: ULP FSM control HALL phase. + break; + case ADC_CTRL_ULP: + SENS.sar_read_ctrl.sar1_dig_force = 0; // 1: Select digital control; 0: Select RTC control. + SENS.sar_meas_start1.meas1_start_force = 0; // 1: SW control RTC ADC start; 0: ULP control RTC ADC start. + SENS.sar_meas_start1.sar1_en_pad_force = 0; // 1: SW control RTC ADC bit map; 0: ULP control RTC ADC bit map; + SENS.sar_touch_ctrl1.xpd_hall_force = 0; // 1: SW control HALL power; 0: ULP FSM control HALL power. + SENS.sar_touch_ctrl1.hall_phase_force = 0; // 1: SW control HALL phase; 0: ULP FSM control HALL phase. + break; + case ADC_CTRL_DIG: + SENS.sar_read_ctrl.sar1_dig_force = 1; // 1: Select digital control; 0: Select RTC control. + SENS.sar_meas_start1.meas1_start_force = 1; // 1: SW control RTC ADC start; 0: ULP control RTC ADC start. + SENS.sar_meas_start1.sar1_en_pad_force = 1; // 1: SW control RTC ADC bit map; 0: ULP control RTC ADC bit map; + SENS.sar_touch_ctrl1.xpd_hall_force = 1; // 1: SW control HALL power; 0: ULP FSM control HALL power. + SENS.sar_touch_ctrl1.hall_phase_force = 1; // 1: SW control HALL phase; 0: ULP FSM control HALL phase. + break; + default: + break; + } + } else { // adc_n == ADC_NUM_2 + switch ( ctrl ) { + case ADC_CTRL_RTC: + SENS.sar_meas_start2.meas2_start_force = 1; // 1: SW control RTC ADC start; 0: ULP control RTC ADC start. + SENS.sar_meas_start2.sar2_en_pad_force = 1; // 1: SW control RTC ADC bit map; 0: ULP control RTC ADC bit map; + SENS.sar_read_ctrl2.sar2_dig_force = 0; // 1: Select digital control; 0: Select RTC control. + SENS.sar_read_ctrl2.sar2_pwdet_force = 0; // 1: Select power detect control; 0: Select RTC control. + SYSCON.saradc_ctrl.sar2_mux = 1; // 1: Select digital control; 0: Select power detect control. + break; + case ADC_CTRL_ULP: + SENS.sar_meas_start2.meas2_start_force = 0; // 1: SW control RTC ADC start; 0: ULP control RTC ADC start. + SENS.sar_meas_start2.sar2_en_pad_force = 0; // 1: SW control RTC ADC bit map; 0: ULP control RTC ADC bit map; + SENS.sar_read_ctrl2.sar2_dig_force = 0; // 1: Select digital control; 0: Select RTC control. + SENS.sar_read_ctrl2.sar2_pwdet_force = 0; // 1: Select power detect control; 0: Select RTC control. + SYSCON.saradc_ctrl.sar2_mux = 1; // 1: Select digital control; 0: Select power detect control. + break; + case ADC_CTRL_DIG: + SENS.sar_meas_start2.meas2_start_force = 1; // 1: SW control RTC ADC start; 0: ULP control RTC ADC start. + SENS.sar_meas_start2.sar2_en_pad_force = 1; // 1: SW control RTC ADC bit map; 0: ULP control RTC ADC bit map; + SENS.sar_read_ctrl2.sar2_dig_force = 1; // 1: Select digital control; 0: Select RTC control. + SENS.sar_read_ctrl2.sar2_pwdet_force = 0; // 1: Select power detect control; 0: Select RTC control. + SYSCON.saradc_ctrl.sar2_mux = 1; // 1: Select digital control; 0: Select power detect control. + break; + case ADC2_CTRL_PWDET: // currently only used by Wi-Fi + SENS.sar_meas_start2.meas2_start_force = 1; // 1: SW control RTC ADC start; 0: ULP control RTC ADC start. + SENS.sar_meas_start2.sar2_en_pad_force = 1; // 1: SW control RTC ADC bit map; 0: ULP control RTC ADC bit map; + SENS.sar_read_ctrl2.sar2_dig_force = 0; // 1: Select digital control; 0: Select RTC control. + SENS.sar_read_ctrl2.sar2_pwdet_force = 1; // 1: Select power detect control; 0: Select RTC control. + SYSCON.saradc_ctrl.sar2_mux = 0; // 1: Select digital control; 0: Select power detect control. + break; + default: + break; + } + } +} + +/** + * Close ADC AMP module if don't use it for power save. + */ +static inline void adc_ll_amp_disable(void) +{ + //channel is set in the convert function + SENS.sar_meas_wait2.force_xpd_amp = SENS_FORCE_XPD_AMP_PD; + //disable FSM, it's only used by the LNA. + SENS.sar_meas_ctrl.amp_rst_fb_fsm = 0; + SENS.sar_meas_ctrl.amp_short_ref_fsm = 0; + SENS.sar_meas_ctrl.amp_short_ref_gnd_fsm = 0; + SENS.sar_meas_wait1.sar_amp_wait1 = 1; + SENS.sar_meas_wait1.sar_amp_wait2 = 1; + SENS.sar_meas_wait2.sar_amp_wait3 = 1; +} + +/*--------------------------------------------------------------- + Hall sensor setting +---------------------------------------------------------------*/ + +/** + * Enable hall sensor. + */ +static inline void adc_ll_hall_enable(void) +{ + RTCIO.hall_sens.xpd_hall = 1; +} + +/** + * Disable hall sensor. + */ +static inline void adc_ll_hall_disable(void) +{ + RTCIO.hall_sens.xpd_hall = 0; +} + +/** + * Reverse phase of hall sensor. + */ +static inline void adc_ll_hall_phase_enable(void) +{ + RTCIO.hall_sens.hall_phase = 1; +} + +/** + * Don't reverse phase of hall sensor. + */ +static inline void adc_ll_hall_phase_disable(void) +{ + RTCIO.hall_sens.hall_phase = 0; +} + +/** + * Set hall sensor controller. + * + * @param hall_ctrl Hall controller. + */ +static inline void adc_ll_set_hall_controller(adc_ll_hall_controller_t hall_ctrl) +{ + SENS.sar_touch_ctrl1.xpd_hall_force = hall_ctrl; // 1: SW control HALL power; 0: ULP FSM control HALL power. + SENS.sar_touch_ctrl1.hall_phase_force = hall_ctrl; // 1: SW control HALL phase; 0: ULP FSM control HALL phase. +} + +/** + * Output ADC2 reference voltage to gpio 25 or 26 or 27 + * + * This function utilizes the testing mux exclusive to ADC 2 to route the + * reference voltage one of ADC2's channels. Supported gpios are gpios + * 25, 26, and 27. This refernce voltage can be manually read from the pin + * and used in the esp_adc_cal component. + * + * @param[in] io GPIO number (gpios 25,26,27 supported) + * + * @return + * - true: v_ref successfully routed to selected gpio + * - false: Unsupported gpio + */ +static inline bool adc_ll_vref_output(int io) +{ + int channel; + if (io == 25) { + channel = 8; //Channel 8 bit + } else if (io == 26) { + channel = 9; //Channel 9 bit + } else if (io == 27) { + channel = 7; //Channel 7 bit + } else { + return false; + } + RTCCNTL.bias_conf.dbg_atten = 0; //Check DBG effect outside sleep mode + //set dtest (MUX_SEL : 0 -> RTC; 1-> vdd_sar2) + RTCCNTL.test_mux.dtest_rtc = 1; //Config test mux to route v_ref to ADC2 Channels + //set ent + RTCCNTL.test_mux.ent_rtc = 1; + //set sar2_en_test + SENS.sar_start_force.sar2_en_test = 1; + //set sar2 en force + SENS.sar_meas_start2.sar2_en_pad_force = 1; //Pad bitmap controlled by SW + //set en_pad for channels 7,8,9 (bits 0x380) + SENS.sar_meas_start2.sar2_en_pad = 1 << channel; + return true; +} diff --git a/arch/xtensa/include/esp32/soc/esp32/include/hal/can_ll.h b/arch/xtensa/include/esp32/soc/esp32/include/hal/can_ll.h new file mode 100644 index 0000000000000..c498ed59a5f59 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/hal/can_ll.h @@ -0,0 +1,703 @@ +// 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. + +/******************************************************************************* + * NOTICE + * The ll is not public api, don't use in application code. + * See readme.md in soc/include/hal/readme.md + ******************************************************************************/ + +// The Lowlevel layer for CAN + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include "hal/can_types.h" +#include "soc/can_periph.h" + +/* ------------------------- Defines and Typedefs --------------------------- */ + +#define CAN_LL_STATUS_RBS (0x1 << 0) +#define CAN_LL_STATUS_DOS (0x1 << 1) +#define CAN_LL_STATUS_TBS (0x1 << 2) +#define CAN_LL_STATUS_TCS (0x1 << 3) +#define CAN_LL_STATUS_RS (0x1 << 4) +#define CAN_LL_STATUS_TS (0x1 << 5) +#define CAN_LL_STATUS_ES (0x1 << 6) +#define CAN_LL_STATUS_BS (0x1 << 7) + +#define CAN_LL_INTR_RI (0x1 << 0) +#define CAN_LL_INTR_TI (0x1 << 1) +#define CAN_LL_INTR_EI (0x1 << 2) +//Data overrun interrupt not supported in SW due to HW peculiarities +#define CAN_LL_INTR_EPI (0x1 << 5) +#define CAN_LL_INTR_ALI (0x1 << 6) +#define CAN_LL_INTR_BEI (0x1 << 7) + +/* + * The following frame structure has an NEARLY identical bit field layout to + * each byte of the TX buffer. This allows for formatting and parsing frames to + * be done outside of time critical regions (i.e., ISRs). All the ISR needs to + * do is to copy byte by byte to/from the TX/RX buffer. The two reserved bits in + * TX buffer are used in the frame structure to store the self_reception and + * single_shot flags which in turn indicate the type of transmission to execute. + */ +typedef union { + struct { + struct { + uint8_t dlc: 4; //Data length code (0 to 8) of the frame + uint8_t self_reception: 1; //This frame should be transmitted using self reception command + uint8_t single_shot: 1; //This frame should be transmitted using single shot command + uint8_t rtr: 1; //This frame is a remote transmission request + uint8_t frame_format: 1; //Format of the frame (1 = extended, 0 = standard) + }; + union { + struct { + uint8_t id[2]; //11 bit standard frame identifier + uint8_t data[8]; //Data bytes (0 to 8) + uint8_t reserved8[2]; + } standard; + struct { + uint8_t id[4]; //29 bit extended frame identifier + uint8_t data[8]; //Data bytes (0 to 8) + } extended; + }; + }; + uint8_t bytes[13]; +} __attribute__((packed)) can_ll_frame_buffer_t; + +/* ---------------------------- Mode Register ------------------------------- */ + +/** + * @brief Enter reset mode + * + * When in reset mode, the CAN controller is effectively disconnected from the + * CAN bus and will not participate in any bus activates. Reset mode is required + * in order to write the majority of configuration registers. + * + * @param hw Start address of the CAN registers + * @return true if reset mode was entered successfully + * + * @note Reset mode is automatically entered on BUS OFF condition + */ +static inline bool can_ll_enter_reset_mode(can_dev_t *hw) +{ + hw->mode_reg.rm = 1; + return hw->mode_reg.rm; +} + +/** + * @brief Exit reset mode + * + * When not in reset mode, the CAN controller will take part in bus activities + * (e.g., send/receive/acknowledge messages and error frames) depending on the + * operating mode. + * + * @param hw Start address of the CAN registers + * @return true if reset mode was exit successfully + * + * @note Reset mode must be exit to initiate BUS OFF recovery + */ +static inline bool can_ll_exit_reset_mode(can_dev_t *hw) +{ + hw->mode_reg.rm = 0; + return !(hw->mode_reg.rm); +} + +/** + * @brief Check if in reset mode + * @param hw Start address of the CAN registers + * @return true if in reset mode + */ +static inline bool can_ll_is_in_reset_mode(can_dev_t *hw) +{ + return hw->mode_reg.rm; +} + +/** + * @brief Set operating mode of CAN controller + * + * @param hw Start address of the CAN registers + * @param mode Operating mode + * + * @note Must be called in reset mode + */ +static inline void can_ll_set_mode(can_dev_t *hw, can_mode_t mode) +{ + if (mode == CAN_MODE_NORMAL) { //Normal Operating mode + hw->mode_reg.lom = 0; + hw->mode_reg.stm = 0; + } else if (mode == CAN_MODE_NO_ACK) { //Self Test Mode (No Ack) + hw->mode_reg.lom = 0; + hw->mode_reg.stm = 1; + } else if (mode == CAN_MODE_LISTEN_ONLY) { //Listen Only Mode + hw->mode_reg.lom = 1; + hw->mode_reg.stm = 0; + } +} + +/* --------------------------- Command Register ----------------------------- */ + +/** + * @brief Set TX command + * + * Setting the TX command will cause the CAN controller to attempt to transmit + * the frame stored in the TX buffer. The TX buffer will be occupied (i.e., + * locked) until TX completes. + * + * @param hw Start address of the CAN registers + * + * @note Transmit commands should be called last (i.e., after handling buffer + * release and clear data overrun) in order to prevent the other commands + * overwriting this latched TX bit with 0. + */ +static inline void can_ll_set_cmd_tx(can_dev_t *hw) +{ + hw->command_reg.tr = 1; +} + +/** + * @brief Set single shot TX command + * + * Similar to setting TX command, but the CAN controller will not automatically + * retry transmission upon an error (e.g., due to an acknowledgement error). + * + * @param hw Start address of the CAN registers + * + * @note Transmit commands should be called last (i.e., after handling buffer + * release and clear data overrun) in order to prevent the other commands + * overwriting this latched TX bit with 0. + */ +static inline void can_ll_set_cmd_tx_single_shot(can_dev_t *hw) +{ + hw->command_reg.val = 0x03; //Writing to TR and AT simultaneously +} + +/** + * @brief Aborts TX + * + * Frames awaiting TX will be aborted. Frames already being TX are not aborted. + * Transmission Complete Status bit is automatically set to 1. + * Similar to setting TX command, but the CAN controller will not automatically + * retry transmission upon an error (e.g., due to acknowledge error). + * + * @param hw Start address of the CAN registers + * + * @note Transmit commands should be called last (i.e., after handling buffer + * release and clear data overrun) in order to prevent the other commands + * overwriting this latched TX bit with 0. + */ +static inline void can_ll_set_cmd_abort_tx(can_dev_t *hw) +{ + hw->command_reg.at = 1; +} + +/** + * @brief Release RX buffer + * + * Rotates RX buffer to the next frame in the RX FIFO. + * + * @param hw Start address of the CAN registers + */ +static inline void can_ll_set_cmd_release_rx_buffer(can_dev_t *hw) +{ + hw->command_reg.rrb = 1; +} + +/** + * @brief Clear data overrun + * + * Clears the data overrun status bit + * + * @param hw Start address of the CAN registers + */ +static inline void can_ll_set_cmd_clear_data_overrun(can_dev_t *hw) +{ + hw->command_reg.cdo = 1; +} + +/** + * @brief Set self reception single shot command + * + * Similar to setting TX command, but the CAN controller also simultaneously + * receive the transmitted frame and is generally used for self testing + * purposes. The CAN controller will not ACK the received message, so consider + * using the NO_ACK operating mode. + * + * @param hw Start address of the CAN registers + * + * @note Transmit commands should be called last (i.e., after handling buffer + * release and clear data overrun) in order to prevent the other commands + * overwriting this latched TX bit with 0. + */ +static inline void can_ll_set_cmd_self_rx_request(can_dev_t *hw) +{ + hw->command_reg.srr = 1; +} + +/** + * @brief Set self reception request command + * + * Similar to setting the self reception request, but the CAN controller will + * not automatically retry transmission upon an error (e.g., due to and + * acknowledgement error). + * + * @param hw Start address of the CAN registers + * + * @note Transmit commands should be called last (i.e., after handling buffer + * release and clear data overrun) in order to prevent the other commands + * overwriting this latched TX bit with 0. + */ +static inline void can_ll_set_cmd_self_rx_single_shot(can_dev_t *hw) +{ + hw->command_reg.val = 0x12; +} + +/* --------------------------- Status Register ------------------------------ */ + +/** + * @brief Get all status bits + * + * @param hw Start address of the CAN registers + * @return Status bits + */ +static inline uint32_t can_ll_get_status(can_dev_t *hw) +{ + return hw->status_reg.val; +} + +/** + * @brief Check if RX FIFO overrun status bit is set + * + * @param hw Start address of the CAN registers + * @return Overrun status bit + */ +static inline bool can_ll_is_fifo_overrun(can_dev_t *hw) +{ + return hw->status_reg.dos; +} + +/** + * @brief Check if previously TX was successful + * + * @param hw Start address of the CAN registers + * @return Whether previous TX was successful + */ +static inline bool can_ll_is_last_tx_successful(can_dev_t *hw) +{ + return hw->status_reg.tcs; +} + +//Todo: Add stand alone status bit check functions when necessary + +/* -------------------------- Interrupt Register ---------------------------- */ + +/** + * @brief Get currently set interrupts + * + * Reading the interrupt registers will automatically clear all interrupts + * except for the Receive Interrupt. + * + * @param hw Start address of the CAN registers + * @return Bit mask of set interrupts + */ +static inline uint32_t can_ll_get_and_clear_intrs(can_dev_t *hw) +{ + return hw->interrupt_reg.val; +} + +/* ----------------------- Interrupt Enable Register ------------------------ */ + +/** + * @brief Set which interrupts are enabled + * + * @param hw Start address of the CAN registers + * @param Bit mask of interrupts to enable + * + * @note Must be called in reset mode + */ +static inline void can_ll_set_enabled_intrs(can_dev_t *hw, uint32_t intr_mask) +{ +#ifdef CAN_BRP_DIV_SUPPORTED + //ESP32 Rev 2 has brp div. Need to mask when setting + hw->interrupt_enable_reg.val = (hw->interrupt_enable_reg.val & 0x10) | intr_mask; +#else + hw->interrupt_enable_reg.val = intr_mask; +#endif +} + +/* ------------------------ Bus Timing Registers --------------------------- */ + +/** + * @brief Set bus timing + * + * @param hw Start address of the CAN registers + * @param brp Baud Rate Prescaler + * @param sjw Synchronization Jump Width + * @param tseg1 Timing Segment 1 + * @param tseg2 Timing Segment 2 + * @param triple_sampling Triple Sampling enable/disable + * + * @note Must be called in reset mode + * @note ESP32 rev 2 or later can support a x2 brp by setting a brp_div bit, + * allowing the brp to go from a maximum of 128 to 256. + */ +static inline void can_ll_set_bus_timing(can_dev_t *hw, uint32_t brp, uint32_t sjw, uint32_t tseg1, uint32_t tseg2, bool triple_sampling) +{ +#ifdef CAN_BRP_DIV_SUPPORTED + if (brp > CAN_BRP_DIV_THRESH) { + //Need to set brp_div bit + hw->interrupt_enable_reg.brp_div = 1; + brp /= 2; + } +#endif + hw->bus_timing_0_reg.brp = (brp / 2) - 1; + hw->bus_timing_0_reg.sjw = sjw - 1; + hw->bus_timing_1_reg.tseg1 = tseg1 - 1; + hw->bus_timing_1_reg.tseg2 = tseg2 - 1; + hw->bus_timing_1_reg.sam = triple_sampling; +} + +/* ----------------------------- ALC Register ------------------------------- */ + +/** + * @brief Clear Arbitration Lost Capture Register + * + * Reading the ALC register rearms the Arbitration Lost Interrupt + * + * @param hw Start address of the CAN registers + */ +static inline void can_ll_clear_arb_lost_cap(can_dev_t *hw) +{ + (void)hw->arbitration_lost_captue_reg.val; + //Todo: Decode ALC register +} + +/* ----------------------------- ECC Register ------------------------------- */ + +/** + * @brief Clear Error Code Capture register + * + * Reading the ECC register rearms the Bus Error Interrupt + * + * @param hw Start address of the CAN registers + */ +static inline void can_ll_clear_err_code_cap(can_dev_t *hw) +{ + (void)hw->error_code_capture_reg.val; + //Todo: Decode error code capture +} + +/* ----------------------------- EWL Register ------------------------------- */ + +/** + * @brief Set Error Warning Limit + * + * @param hw Start address of the CAN registers + * @param ewl Error Warning Limit + * + * @note Must be called in reset mode + */ +static inline void can_ll_set_err_warn_lim(can_dev_t *hw, uint32_t ewl) +{ + hw->error_warning_limit_reg.ewl = ewl; +} + +/** + * @brief Get Error Warning Limit + * + * @param hw Start address of the CAN registers + * @return Error Warning Limit + */ +static inline uint32_t can_ll_get_err_warn_lim(can_dev_t *hw) +{ + return hw->error_warning_limit_reg.val; +} + +/* ------------------------ RX Error Count Register ------------------------- */ + +/** + * @brief Get RX Error Counter + * + * @param hw Start address of the CAN registers + * @return REC value + * + * @note REC is not frozen in reset mode. Listen only mode will freeze it. A BUS + * OFF condition automatically sets the REC to 0. + */ +static inline uint32_t can_ll_get_rec(can_dev_t *hw) +{ + return hw->rx_error_counter_reg.val; +} + +/** + * @brief Set RX Error Counter + * + * @param hw Start address of the CAN registers + * @param rec REC value + * + * @note Must be called in reset mode + */ +static inline void can_ll_set_rec(can_dev_t *hw, uint32_t rec) +{ + hw->rx_error_counter_reg.rxerr = rec; +} + +/* ------------------------ TX Error Count Register ------------------------- */ + +/** + * @brief Get TX Error Counter + * + * @param hw Start address of the CAN registers + * @return TEC value + * + * @note A BUS OFF condition will automatically set this to 128 + */ +static inline uint32_t can_ll_get_tec(can_dev_t *hw) +{ + return hw->tx_error_counter_reg.val; +} + +/** + * @brief Set TX Error Counter + * + * @param hw Start address of the CAN registers + * @param tec TEC value + * + * @note Must be called in reset mode + */ +static inline void can_ll_set_tec(can_dev_t *hw, uint32_t tec) +{ + hw->tx_error_counter_reg.txerr = tec; +} + +/* ---------------------- Acceptance Filter Registers ----------------------- */ + +/** + * @brief Set Acceptance Filter + * @param hw Start address of the CAN registers + * @param code Acceptance Code + * @param mask Acceptance Mask + * @param single_filter Whether to enable single filter mode + * + * @note Must be called in reset mode + */ +static inline void can_ll_set_acc_filter(can_dev_t* hw, uint32_t code, uint32_t mask, bool single_filter) +{ + uint32_t code_swapped = __builtin_bswap32(code); + uint32_t mask_swapped = __builtin_bswap32(mask); + for (int i = 0; i < 4; i++) { + hw->acceptance_filter.acr[i].byte = ((code_swapped >> (i * 8)) & 0xFF); + hw->acceptance_filter.amr[i].byte = ((mask_swapped >> (i * 8)) & 0xFF); + } + hw->mode_reg.afm = single_filter; +} + +/* ------------------------- TX/RX Buffer Registers ------------------------- */ + +/** + * @brief Copy a formatted CAN frame into TX buffer for transmission + * + * @param hw Start address of the CAN registers + * @param tx_frame Pointer to formatted frame + * + * @note Call can_ll_format_frame_buffer() to format a frame + */ +static inline void can_ll_set_tx_buffer(can_dev_t *hw, can_ll_frame_buffer_t *tx_frame) +{ + //Copy formatted frame into TX buffer + for (int i = 0; i < 13; i++) { + hw->tx_rx_buffer[i].val = tx_frame->bytes[i]; + } +} + +/** + * @brief Copy a received frame from the RX buffer for parsing + * + * @param hw Start address of the CAN registers + * @param rx_frame Pointer to store formatted frame + * + * @note Call can_ll_prase_frame_buffer() to parse the formatted frame + */ +static inline void can_ll_get_rx_buffer(can_dev_t *hw, can_ll_frame_buffer_t *rx_frame) +{ + //Copy RX buffer registers into frame + for (int i = 0; i < 13; i++) { + rx_frame->bytes[i] = hw->tx_rx_buffer[i].byte; + } +} + +/** + * @brief Format contents of a CAN frame into layout of TX Buffer + * + * @param[in] id 11 or 29bit ID + * @param[in] dlc Data length code + * @param[in] data Pointer to an 8 byte array containing data. NULL if no data + * @param[in] format Type of CAN frame + * @param[in] single_shot Frame will not be retransmitted on failure + * @param[in] self_rx Frame will also be simultaneously received + * @param[out] tx_frame Pointer to store formatted frame + */ +static inline void can_ll_format_frame_buffer(uint32_t id, uint8_t dlc, const uint8_t *data, + uint32_t flags, can_ll_frame_buffer_t *tx_frame) +{ + /* This function encodes a message into a frame structure. The frame structure has + an identical layout to the TX buffer, allowing the frame structure to be directly + copied into TX buffer. */ + bool is_extd = flags & CAN_MSG_FLAG_EXTD; + bool is_rtr = flags & CAN_MSG_FLAG_RTR; + + //Set frame information + tx_frame->dlc = dlc; + tx_frame->frame_format = is_extd; + tx_frame->rtr = is_rtr; + tx_frame->self_reception = (flags & CAN_MSG_FLAG_SELF) ? 1 : 0; + tx_frame->single_shot = (flags & CAN_MSG_FLAG_SS) ? 1 : 0; + + //Set ID + if (is_extd) { + uint32_t id_temp = __builtin_bswap32((id & CAN_EXTD_ID_MASK) << 3); //((id << 3) >> 8*(3-i)) + for (int i = 0; i < 4; i++) { + tx_frame->extended.id[i] = (id_temp >> (8 * i)) & 0xFF; + } + } else { + uint32_t id_temp = __builtin_bswap16((id & CAN_STD_ID_MASK) << 5); //((id << 5) >> 8*(1-i)) + for (int i = 0; i < 2; i++) { + tx_frame->standard.id[i] = (id_temp >> (8 * i)) & 0xFF; + } + } + + //Set Data + uint8_t *data_buffer = (is_extd) ? tx_frame->extended.data : tx_frame->standard.data; + if (!is_rtr) { + for (int i = 0; (i < dlc) && (i < CAN_FRAME_MAX_DLC); i++) { + data_buffer[i] = data[i]; + } + } +} + +/** + * @brief Parse formatted CAN frame (RX Buffer Layout) into its contents + * + * @param[in] rx_frame Pointer to formatted frame + * @param[out] id 11 or 29bit ID + * @param[out] dlc Data length code + * @param[out] data Data. Left over bytes set to 0. + * @param[out] format Type of CAN frame + */ +static inline void can_ll_prase_frame_buffer(can_ll_frame_buffer_t *rx_frame, uint32_t *id, uint8_t *dlc, + uint8_t *data, uint32_t *flags) +{ + //This function decodes a frame structure into it's constituent components. + + //Copy frame information + *dlc = rx_frame->dlc; + uint32_t flags_temp = 0; + flags_temp |= (rx_frame->frame_format) ? CAN_MSG_FLAG_EXTD : 0; + flags_temp |= (rx_frame->rtr) ? CAN_MSG_FLAG_RTR : 0; + flags_temp |= (rx_frame->dlc > CAN_FRAME_MAX_DLC) ? CAN_MSG_FLAG_DLC_NON_COMP : 0; + *flags = flags_temp; + + //Copy ID + if (rx_frame->frame_format) { + uint32_t id_temp = 0; + for (int i = 0; i < 4; i++) { + id_temp |= rx_frame->extended.id[i] << (8 * i); + } + id_temp = __builtin_bswap32(id_temp) >> 3; //((byte[i] << 8*(3-i)) >> 3) + *id = id_temp & CAN_EXTD_ID_MASK; + } else { + uint32_t id_temp = 0; + for (int i = 0; i < 2; i++) { + id_temp |= rx_frame->standard.id[i] << (8 * i); + } + id_temp = __builtin_bswap16(id_temp) >> 5; //((byte[i] << 8*(1-i)) >> 5) + *id = id_temp & CAN_STD_ID_MASK; + } + + //Copy data + uint8_t *data_buffer = (rx_frame->frame_format) ? rx_frame->extended.data : rx_frame->standard.data; + int data_length = (rx_frame->rtr) ? 0 : ((rx_frame->dlc > CAN_FRAME_MAX_DLC) ? CAN_FRAME_MAX_DLC : rx_frame->dlc); + for (int i = 0; i < data_length; i++) { + data[i] = data_buffer[i]; + } + //Set remaining bytes of data to 0 + for (int i = data_length; i < CAN_FRAME_MAX_DLC; i++) { + data[i] = 0; + } +} + +/* ----------------------- RX Message Count Register ------------------------ */ + +/** + * @brief Get RX Message Counter + * + * @param hw Start address of the CAN registers + * @return RX Message Counter + */ +static inline uint32_t can_ll_get_rx_msg_count(can_dev_t *hw) +{ + return hw->rx_message_counter_reg.val; +} + +/* ------------------------- Clock Divider Register ------------------------- */ + +/** + * @brief Set CLKOUT Divider and enable/disable + * + * @param hw Start address of the CAN registers + * @param divider Divider for CLKOUT. Set to 0 to disable CLKOUT + */ +static inline void can_ll_set_clkout(can_dev_t *hw, uint32_t divider) +{ + /* Configure CLKOUT. CLKOUT is a pre-scaled version of APB CLK. Divider can be + 1, or any even number from 2 to 14. Set to out of range value (0) to disable + CLKOUT. */ + + if (divider >= 2 && divider <= 14) { + CAN.clock_divider_reg.co = 0; + CAN.clock_divider_reg.cd = (divider / 2) - 1; + } else if (divider == 1) { + CAN.clock_divider_reg.co = 0; + CAN.clock_divider_reg.cd = 7; + } else { + CAN.clock_divider_reg.co = 1; + CAN.clock_divider_reg.cd = 0; + } +} + +/** + * @brief Set register address mapping to extended mode + * + * Extended mode register address mapping consists of more registers and extra + * features. + * + * @param hw Start address of the CAN registers + * + * @note Must be called before setting any configuration + * @note Must be called in reset mode + */ +static inline void can_ll_enable_extended_reg_layout(can_dev_t *hw) +{ + hw->clock_divider_reg.cm = 1; +} + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/esp32/include/hal/dac_ll.h b/arch/xtensa/include/esp32/soc/esp32/include/hal/dac_ll.h new file mode 100644 index 0000000000000..1f31c72833100 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/hal/dac_ll.h @@ -0,0 +1,185 @@ +// 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. + +/******************************************************************************* + * NOTICE + * The ll is not public api, don't use in application code. + * See readme.md in soc/include/hal/readme.md + ******************************************************************************/ + +#pragma once + +#include +#include "soc/dac_periph.h" +#include "hal/dac_types.h" + +/** + * Power on dac module and start output voltage. + * + * @note Before powering up, make sure the DAC PAD is set to RTC PAD and floating status. + * @param channel DAC channel num. + */ +static inline void dac_ll_power_on(dac_channel_t channel) +{ + RTCIO.pad_dac[channel].dac_xpd_force = 1; + RTCIO.pad_dac[channel].xpd_dac = 1; +} + +/** + * Power done dac module and stop output voltage. + * + * @param channel DAC channel num. + */ +static inline void dac_ll_power_down(dac_channel_t channel) +{ + RTCIO.pad_dac[channel].dac_xpd_force = 0; + RTCIO.pad_dac[channel].xpd_dac = 0; +} + +/** + * Output voltage with value (8 bit). + * + * @param channel DAC channel num. + * @param value Output value. Value range: 0 ~ 255. + * The corresponding range of voltage is 0v ~ VDD3P3_RTC. + */ +static inline void dac_ll_update_output_value(dac_channel_t channel, uint8_t value) +{ + if (channel == DAC_CHANNEL_1) { + SENS.sar_dac_ctrl2.dac_cw_en1 = 0; + RTCIO.pad_dac[channel].dac = value; + } else if (channel == DAC_CHANNEL_2) { + SENS.sar_dac_ctrl2.dac_cw_en2 = 0; + RTCIO.pad_dac[channel].dac = value; + } +} + +/************************************/ +/* DAC cosine wave generator API's */ +/************************************/ +/** + * Enable cosine wave generator output. + */ +static inline void dac_ll_cw_generator_enable(void) +{ + SENS.sar_dac_ctrl1.sw_tone_en = 1; +} + +/** + * Disable cosine wave generator output. + */ +static inline void dac_ll_cw_generator_disable(void) +{ + SENS.sar_dac_ctrl1.sw_tone_en = 0; +} + +/** + * Enable the cosine wave generator of DAC channel. + * + * @param channel DAC channel num. + * @param enable + */ +static inline void dac_ll_cw_set_channel(dac_channel_t channel, bool enable) +{ + if (channel == DAC_CHANNEL_1) { + SENS.sar_dac_ctrl2.dac_cw_en1 = enable; + } else if (channel == DAC_CHANNEL_2) { + SENS.sar_dac_ctrl2.dac_cw_en2 = enable; + } +} + +/** + * Set frequency of cosine wave generator output. + * + * @note We know that CLK8M is about 8M, but don't know the actual value. so this freq have limited error. + * @param freq_hz CW generator frequency. Range: 130(130Hz) ~ 55000(100KHz). + */ +static inline void dac_ll_cw_set_freq(uint32_t freq) +{ + uint32_t sw_freq = freq * 0xFFFF / RTC_FAST_CLK_FREQ_APPROX; + SENS.sar_dac_ctrl1.sw_fstep = (sw_freq > 0xFFFF) ? 0xFFFF : sw_freq; +} + +/** + * Set the amplitude of the cosine wave generator output. + * + * @param channel DAC channel num. + * @param scale The multiple of the amplitude. The max amplitude is VDD3P3_RTC. + */ +static inline void dac_ll_cw_set_scale(dac_channel_t channel, dac_cw_scale_t scale) +{ + if (channel == DAC_CHANNEL_1) { + SENS.sar_dac_ctrl2.dac_scale1 = scale; + } else if (channel == DAC_CHANNEL_2) { + SENS.sar_dac_ctrl2.dac_scale2 = scale; + } +} + +/** + * Set the phase of the cosine wave generator output. + * + * @param channel DAC channel num. + * @param scale Phase value. + */ +static inline void dac_ll_cw_set_phase(dac_channel_t channel, dac_cw_phase_t phase) +{ + if (channel == DAC_CHANNEL_1) { + SENS.sar_dac_ctrl2.dac_inv1 = phase; + } else if (channel == DAC_CHANNEL_2) { + SENS.sar_dac_ctrl2.dac_inv2 = phase; + } +} + +/** + * Set the voltage value of the DC component of the cosine wave generator output. + * + * @note The DC offset setting should be after phase setting. + * @note Unreasonable settings can cause the signal to be oversaturated. + * @param channel DAC channel num. + * @param offset DC value. Range: -128 ~ 127. + */ +static inline void dac_ll_cw_set_dc_offset(dac_channel_t channel, int8_t offset) +{ + if (channel == DAC_CHANNEL_1) { + if (SENS.sar_dac_ctrl2.dac_inv1 == DAC_CW_PHASE_180) { + offset = 0 - offset; + } + SENS.sar_dac_ctrl2.dac_dc1 = offset ? offset : (-128 - offset); + } else if (channel == DAC_CHANNEL_2) { + if (SENS.sar_dac_ctrl2.dac_inv2 == DAC_CW_PHASE_180) { + offset = 0 - offset; + } + SENS.sar_dac_ctrl2.dac_dc2 = offset ? offset : (-128 - offset); + } +} + +/************************************/ +/* DAC DMA API's */ +/************************************/ +/** + * Enable DAC output data from I2S DMA. + * I2S_CLK connect to DAC_CLK, I2S_DATA_OUT connect to DAC_DATA. + */ +static inline void dac_ll_dma_enable(void) +{ + SENS.sar_dac_ctrl1.dac_dig_force = 1; +} + +/** + * Disable DAC output data from I2S DMA. + */ +static inline void dac_ll_dma_disable(void) +{ + SENS.sar_dac_ctrl1.dac_dig_force = 0; +} \ No newline at end of file diff --git a/arch/xtensa/include/esp32/soc/esp32/include/hal/emac.h b/arch/xtensa/include/esp32/soc/esp32/include/hal/emac.h new file mode 100644 index 0000000000000..b55d88301e287 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/hal/emac.h @@ -0,0 +1,403 @@ +// 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 + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include "esp_err.h" +#include "soc/emac_dma_struct.h" +#include "soc/emac_mac_struct.h" +#include "soc/emac_ext_struct.h" + +#define EMAC_MEDIA_INTERFACE_MII (0) +#define EMAC_MEDIA_INTERFACE_RMII (1) + +#define EMAC_WATCHDOG_ENABLE (0) +#define EMAC_WATCHDOG_DISABLE (1) + +#define EMAC_JABBER_ENABLE (0) +#define EMAC_JABBER_DISABLE (1) + +#define EMAC_INTERFRAME_GAP_96BIT (0) +#define EMAC_INTERFRAME_GAP_88BIT (1) +#define EMAC_INTERFRAME_GAP_80BIT (2) +#define EMAC_INTERFRAME_GAP_72BIT (3) +#define EMAC_INTERFRAME_GAP_64BIT (4) +#define EMAC_INTERFRAME_GAP_56BIT (5) +#define EMAC_INTERFRAME_GAP_48BIT (6) +#define EMAC_INTERFRAME_GAP_40BIT (7) + +#define EMAC_CARRIERSENSE_ENABLE (0) +#define EMAC_CARRIERSENSE_DISABLE (1) + +#define EMAC_PORT_1000MBPS (0) +#define EMAC_PORT_10_100MBPS (1) + +#define EMAC_SPEED_10M (0) +#define EMAC_SPEED_100M (1) + +#define EMAC_RECEIVE_OWN_ENABLE (0) +#define EMAC_RECEIVE_OWN_DISABLE (1) + +#define EMAC_LOOPBACK_DISABLE (0) +#define EMAC_LOOPBACK_ENABLE (1) + +#define EMAC_DUPLEX_HALF (0) +#define EMAC_DUPLEX_FULL (1) + +#define EMAC_CHECKSUM_SW (0) +#define EMAC_CHECKSUM_HW (1) + +#define EMAC_RETRY_TRANSMISSION_ENABLE (0) +#define EMAC_RETRY_TRANSMISSION_DISABLE (1) + +#define EMAC_AUTO_PAD_CRC_STRIP_DISABLE (0) +#define EMAC_AUTO_PAD_CRC_STRIP_ENABLE (1) + +#define EMAC_BACKOFF_LIMIT_10 (0) +#define EMAC_BACKOFF_LIMIT_8 (1) +#define EMAC_BACKOFF_LIMIT_4 (2) +#define EMAC_BACKOFF_LIMIT_1 (3) + +#define EMAC_DEFERRAL_CHECK_DISABLE (0) +#define EMAC_DEFERRAL_CHECK_ENABLE (1) + +#define EMAC_PREAMBLE_LENGTH_7 (0) +#define EMAC_PREAMBLE_LENGTH_5 (1) +#define EMAC_PREAMBLE_LENGTH_3 (2) + +#define EMAC_RECEIVE_ALL_DISABLE (0) +#define EMAC_RECEIVE_ALL_ENABLE (1) + +#define EMAC_SOURCE_ADDR_FILTER_DISABLE (0) +#define EMAC_SOURCE_ADDR_FILTER_NORMAL (2) +#define EMAC_SOURCE_ADDR_FILTER_INVERSE (3) + +#define EMAC_CONTROL_FRAME_BLOCKALL (0) +#define EMAC_CONTROL_FRAME_FORWARDALL_PAUSE (1) +#define EMAC_CONTROL_FRAME_FORWARDALL (2) +#define EMAC_CONTROL_FRAME_FORWARDFILT (3) + +#define EMAC_RECEPT_BROADCAST_ENABLE (0) +#define EMAC_RECEPT_BROADCAST_DISABLE (1) + +#define EMAC_DEST_ADDR_FILTER_NORMAL (0) +#define EMAC_DEST_ADDR_FILTER_INVERSE (1) + +#define EMAC_PROMISCUOUS_DISABLE (0) +#define EMAC_PROMISCUOUS_ENABLE (1) + +#define EMAC_PAUSE_TIME 0x1648 + +#define EMAC_ZERO_QUANTA_PAUSE_ENABLE (0) +#define EMAC_ZERO_QUANTA_PAUSE_DISABLE (1) + +#define EMAC_PAUSE_LOW_THRESHOLD_MINUS_4 (0) +#define EMAC_PAUSE_LOW_THRESHOLD_MINUS_28 (1) +#define EMAC_PAUSE_LOW_THRESHOLD_MINUS_144 (2) +#define EMAC_PAUSE_LOW_THRESHOLD_MINUS_256 + +#define EMAC_UNICAST_PAUSE_DETECT_DISABLE (0) +#define EMAC_UNICAST_PAUSE_DETECT_ENABLE (1) + +#define EMAC_RECEIVE_FLOW_CONTROL_DISABLE (0) +#define EMAC_RECEIVE_FLOW_CONTROL_ENABLE (1) + +#define EMAC_TRANSMIT_FLOW_CONTROL_DISABLE (0) +#define EMAC_TRANSMIT_FLOW_CONTROL_ENABLE (1) + +#define EMAC_DROP_TCPIP_CHECKSUM_ERROR_ENABLE (0) +#define EMAC_DROP_TCPIP_CHECKSUM_ERROR_DISABLE (1) + +#define EMAC_RECEIVE_STORE_FORWARD_DISABLE (0) +#define EMAC_RECEIVE_STORE_FORWARD_ENABLE (1) + +#define EMAC_FLUSH_RECEIVED_FRAME_ENABLE (0) +#define EMAC_FLUSH_RECEIVED_FRAME_DISABLE (1) + +#define EMAC_TRANSMIT_STORE_FORWARD_DISABLE (0) +#define EMAC_TRANSMIT_STORE_FORWARD_ENABLE (1) + +#define EMAC_TRANSMIT_THRESHOLD_CONTROL_64 (0) +#define EMAC_TRANSMIT_THRESHOLD_CONTROL_128 (1) +#define EMAC_TRANSMIT_THRESHOLD_CONTROL_192 (2) +#define EMAC_TRANSMIT_THRESHOLD_CONTROL_256 (3) +#define EMAC_TRANSMIT_THRESHOLD_CONTROL_40 (4) +#define EMAC_TRANSMIT_THRESHOLD_CONTROL_32 (5) +#define EMAC_TRANSMIT_THRESHOLD_CONTROL_24 (6) +#define EMAC_TRANSMIT_THRESHOLD_CONTROL_16 (7) + +#define EMAC_FORWARD_ERROR_FRAME_DISABLE (0) +#define EMAC_FORWARD_ERROR_FRAME_ENABLE (1) + +#define EMAC_FORWARD_UNDERSIZED_GOOD_FRAME_DISABLE (0) +#define EMAC_FORWARD_UNDERSIZED_GOOD_FRAME_ENABLE (1) + +#define EMAC_RECEIVE_THRESHOLD_CONTROL_64 (0) +#define EMAC_RECEIVE_THRESHOLD_CONTROL_32 (1) +#define EMAC_RECEIVE_THRESHOLD_CONTROL_96 (2) +#define EMAC_RECEIVE_THRESHOLD_CONTROL_128 (3) + +#define EMAC_OPERATE_SECOND_FRAME_DISABLE (0) +#define EMAC_OPERATE_SECOND_FRAME_ENABLE (1) + +#define EMAC_MIXED_BURST_DISABLE (0) +#define EMAC_MIXED_BURST_ENABLE (1) + +#define EMAC_ADDR_ALIGN_BEATS_DISABLE (0) +#define EMAC_ADDR_ALIGN_BEATS_ENABLE (1) + +#define EMAC_UNUSE_SEPARATE_PBL (0) +#define EMAC_USE_SEPARATE_PBL (1) + +#define EMAC_DMA_BURST_LENGTH_1BEAT (1) +#define EMAC_DMA_BURST_LENGTH_2BEAT (2) +#define EMAC_DMA_BURST_LENGTH_4BEAT (4) +#define EMAC_DMA_BURST_LENGTH_8BEAT (8) +#define EMAC_DMA_BURST_LENGTH_16BEAT (16) +#define EMAC_DMA_BURST_LENGTH_32BEAT (32) + +#define EMAC_ENHANCED_DESCRIPTOR_DISABLE (0) +#define EMAC_ENHANCED_DESCRIPTOR_ENABLE (1) + +#define EMAC_DMA_ARBITRATION_SCHEME_ROUNDROBIN (0) +#define EMAC_DMA_ARBITRATION_SCHEME_FIXEDPRIO (1) + +#define EMAC_DMA_ARBITRATION_ROUNDROBIN_RXTX_1_1 (0) +#define EMAC_DMA_ARBITRATION_ROUNDROBIN_RXTX_2_1 (1) +#define EMAC_DMA_ARBITRATION_ROUNDROBIN_RXTX_3_1 (2) +#define EMAC_DMA_ARBITRATION_ROUNDROBIN_RXTX_4_1 (3) + +/** +* @brief Ethernet DMA TX Descriptor +* +*/ +typedef struct { + volatile union { + struct { + uint32_t Deferred : 1; /*!< MAC defers before transmission */ + uint32_t UnderflowErr : 1; /*!< DMA encountered an empty transmit buffer */ + uint32_t ExcessiveDeferral : 1; /*!< Excessive deferral of over 24,288 bit times */ + uint32_t CollisionCount : 4; /*!< Number of collisions occurred before transmitted */ + uint32_t VLanFrame : 1; /*!< Transmitted frame is a VLAN-type frame */ + uint32_t ExcessiveCollision : 1; /*!< Transmission aborted after 16 successive collisions */ + uint32_t LateCollision : 1; /*!< Collision occurred after the collision window */ + uint32_t NoCarrier : 1; /*!< Carrier Sense signal from the PHY was not asserted */ + uint32_t LossCarrier : 1; /*!< Loss of carrier occurred during transmission */ + uint32_t PayloadChecksumErr : 1; /*!< Checksum error in TCP/UDP/ICMP datagram payload */ + uint32_t FrameFlushed : 1; /*!< DMA or MTL flushed the frame */ + uint32_t JabberTimeout : 1; /*!< MAC transmitter has experienced a jabber timeout */ + uint32_t ErrSummary : 1; /*!< Error Summary */ + uint32_t IPHeadErr : 1; /*!< IP Header Error */ + uint32_t TxTimestampStatus : 1; /*!< Timestamp captured for the transmit frame */ + uint32_t VLANInsertControl : 2; /*!< VLAN tagging or untagging before transmitting */ + uint32_t SecondAddressChained : 1; /*!< Second address in the descriptor is Next Descriptor address */ + uint32_t TransmitEndRing : 1; /*!< Descriptor list reached its final descriptor */ + uint32_t ChecksumInsertControl : 2; /*!< Control checksum calculation and insertion */ + uint32_t CRCReplacementControl : 1; /*!< Control CRC replace */ + uint32_t TransmitTimestampEnable : 1; /*!< Enable IEEE1588 harware timestamping */ + uint32_t DisablePad : 1; /*!< Control add padding when frame short than 64 bytes */ + uint32_t DisableCRC : 1; /*!< Control append CRC to the end of frame */ + uint32_t FirstSegment : 1; /*!< Buffer contains the first segment of a frame */ + uint32_t LastSegment : 1; /*!< Buffer contains the last segment of a frame */ + uint32_t InterruptOnComplete : 1; /*!< Interrupt after frame transmitted */ + uint32_t Own : 1; /*!< Owner of this descriptor: DMA controller or host */ + }; + uint32_t Value; + } TDES0; + union { + struct { + uint32_t TransmitBuffer1Size : 13; /*!< First data buffer byte size */ + uint32_t Reserved : 3; /*!< Reserved */ + uint32_t TransmitBuffer2Size : 13; /*!< Second data buffer byte size */ + uint32_t SAInsertControl : 3; /*!< Control MAC add or replace Source Address field */ + }; + uint32_t Value; + } TDES1; + uint32_t Buffer1Addr; /*!< Buffer1 address pointer */ + uint32_t Buffer2NextDescAddr; /*!< Buffer2 or next descriptor address pointer */ + uint32_t Reserved1; /*!< Reserved */ + uint32_t Reserved2; /*!< Reserved */ + uint32_t TimeStampLow; /*!< Transmit Frame Timestamp Low */ + uint32_t TimeStampHigh; /*!< Transmit Frame Timestamp High */ +} eth_dma_tx_descriptor_t; +#define EMAC_DMATXDESC_CHECKSUM_BYPASS 0 /*!< Checksum engine bypass */ +#define EMAC_DMATXDESC_CHECKSUM_IPV4HEADER 1 /*!< IPv4 header checksum insertion */ +#define EMAC_DMATXDESC_CHECKSUM_TCPUDPICMPSEGMENT 2 /*!< TCP/UDP/ICMP Checksum Insertion calculated over segment only */ +#define EMAC_DMATXDESC_CHECKSUM_TCPUDPICMPFULL 3 /*!< TCP/UDP/ICMP Checksum Insertion fully calculated */ + +_Static_assert(sizeof(eth_dma_tx_descriptor_t) == 32, "eth_dma_tx_descriptor_t should occupy 32 bytes in memory"); + +/** +* @brief Ethernet DMA RX Descriptor +* +*/ +typedef struct { + volatile union { + struct { + uint32_t ExtendStatusAvailable : 1; /*!< Extended statsu is available in RDES4 */ + uint32_t CRCErr : 1; /*!< CRC error occurred on frame */ + uint32_t DribbleBitErr : 1; /*!< frame contains non int multiple of 8 bits */ + uint32_t ReceiveErr : 1; /*!< Receive error */ + uint32_t ReceiveWatchdogTimeout : 1; /*!< Receive Watchdog timeout */ + uint32_t FrameType : 1; /*!< Ethernet type or IEEE802.3 */ + uint32_t LateCollision : 1; /*!< Late collision occurred during reception */ + uint32_t TSAvailIPChecksumErrGiantFrame : 1; /*!< Timestamp available or IP Checksum error or Giant frame */ + uint32_t LastDescriptor : 1; /*!< Last buffer of the frame */ + uint32_t FirstDescriptor : 1; /*!< First buffer of the frame */ + uint32_t VLANTag : 1; /*!< VLAN Tag: received frame is a VLAN frame */ + uint32_t OverflowErr : 1; /*!< Frame was damaged due to buffer overflow */ + uint32_t LengthErr : 1; /*!< Frame size not matching with length field */ + uint32_t SourceAddrFilterFail : 1; /*!< SA field of frame failed the SA filter */ + uint32_t DescriptorErr : 1; /*!< Frame truncated and DMA doesn't own next descriptor */ + uint32_t ErrSummary : 1; /*!< Error Summary, OR of all errors in RDES */ + uint32_t FrameLength : 14; /*!< Byte length of received frame */ + uint32_t DestinationAddrFilterFail : 1; /*!< Frame failed in the DA Filter in the MAC */ + uint32_t Own : 1; /*!< Owner of this descriptor: DMA controller or host */ + }; + uint32_t Value; + } RDES0; + union { + struct { + uint32_t ReceiveBuffer1Size : 13; /*!< First data buffer size in bytes */ + uint32_t Reserved1 : 1; /*!< Reserved */ + uint32_t SecondAddressChained : 1; /*!< Seconde address is the Next Descriptor address */ + uint32_t ReceiveEndOfRing : 1; /*!< Descriptor reached its final descriptor */ + uint32_t ReceiveBuffer2Size : 13; /*!< Second data buffer size in bytes */ + uint32_t Reserved : 2; /*!< Reserved */ + uint32_t DisableInterruptOnComplete : 1; /*!< Disable the assertion of interrupt to host */ + }; + uint32_t Value; + } RDES1; + uint32_t Buffer1Addr; /*!< Buffer1 address pointer */ + uint32_t Buffer2NextDescAddr; /*!< Buffer2 or next descriptor address pointer */ + volatile union { + struct { + uint32_t IPPayloadType : 3; /*!< Type of payload in the IP datagram */ + uint32_t IPHeadErr : 1; /*!< IP header error */ + uint32_t IPPayloadErr : 1; /*!< IP payload error */ + uint32_t IPChecksumBypass : 1; /*!< Checksum offload engine is bypassed */ + uint32_t IPv4PacketReceived : 1; /*!< Received packet is an IPv4 packet */ + uint32_t IPv6PacketReceived : 1; /*!< Received packet is an IPv6 packet */ + uint32_t MessageType : 4; /*!< PTP Message Type */ + uint32_t PTPFrameType : 1; /*!< PTP message is over Ethernet or IPv4/IPv6 */ + uint32_t PTPVersion : 1; /*!< Version of PTP protocol */ + uint32_t TimestampDropped : 1; /*!< Timestamp dropped because of overflow */ + uint32_t Reserved1 : 1; /*!< Reserved */ + uint32_t AVPacketReceived : 1; /*!< AV packet is received */ + uint32_t AVTaggedPacketReceived : 1; /*!< AV tagged packet is received */ + uint32_t VLANTagPrioVal : 3; /*!< VLAN tag's user value in the received packekt */ + uint32_t Reserved2 : 3; /*!< Reserved */ + uint32_t Layer3FilterMatch : 1; /*!< Received frame matches one of the enabled Layer3 IP */ + uint32_t Layer4FilterMatch : 1; /*!< Received frame matches one of the enabled Layer4 IP */ + uint32_t Layer3Layer4FilterNumberMatch : 2; /*!< Number of Layer3 and Layer4 Filter that matches the received frame */ + uint32_t Reserved3 : 4; /*!< Reserved */ + }; + uint32_t Value; + } ExtendedStatus; + uint32_t Reserved; /*!< Reserved */ + uint32_t TimeStampLow; /*!< Receive frame timestamp low */ + uint32_t TimeStampHigh; /*!< Receive frame timestamp high */ +} eth_dma_rx_descriptor_t; +#define EMAC_DMAPTPRXDESC_PTPMT_SYNC 0x00000100U /* SYNC message (all clock types) */ +#define EMAC_DMAPTPRXDESC_PTPMT_FOLLOWUP 0x00000200U /* FollowUp message (all clock types) */ +#define EMAC_DMAPTPRXDESC_PTPMT_DELAYREQ 0x00000300U /* DelayReq message (all clock types) */ +#define EMAC_DMAPTPRXDESC_PTPMT_DELAYRESP 0x00000400U /* DelayResp message (all clock types) */ +#define EMAC_DMAPTPRXDESC_PTPMT_PDELAYREQ_ANNOUNCE 0x00000500U /* PdelayReq message (peer-to-peer transparent clock) or Announce message (Ordinary or Boundary clock) */ +#define EMAC_DMAPTPRXDESC_PTPMT_PDELAYRESP_MANAG 0x00000600U /* PdelayResp message (peer-to-peer transparent clock) or Management message (Ordinary or Boundary clock) */ +#define EMAC_DMAPTPRXDESC_PTPMT_PDELAYRESPFOLLOWUP_SIGNAL 0x00000700U /* PdelayRespFollowUp message (peer-to-peer transparent clock) or Signaling message (Ordinary or Boundary clock) */ + +#define EMAC_DMAPTPRXDESC_IPPT_UDP 0x00000001U /* UDP payload encapsulated in the IP datagram */ +#define EMAC_DMAPTPRXDESC_IPPT_TCP 0x00000002U /* TCP payload encapsulated in the IP datagram */ +#define EMAC_DMAPTPRXDESC_IPPT_ICMP 0x00000003U /* ICMP payload encapsulated in the IP datagram */ + +#define EMAC_DMADESC_OWNER_CPU (0) +#define EMAC_DMADESC_OWNER_DMA (1) + +_Static_assert(sizeof(eth_dma_rx_descriptor_t) == 32, "eth_dma_rx_descriptor_t should occupy 32 bytes in memory"); + +typedef struct { + emac_mac_dev_t *mac_regs; + emac_dma_dev_t *dma_regs; + emac_ext_dev_t *ext_regs; + uint8_t **rx_buf; + uint8_t **tx_buf; + void *descriptors; + eth_dma_rx_descriptor_t *rx_desc; + eth_dma_tx_descriptor_t *tx_desc; +} emac_hal_context_t; + +void emac_hal_init(emac_hal_context_t *hal, void *descriptors, + uint8_t **rx_buf, uint8_t **tx_buf); + +void emac_hal_reset_desc_chain(emac_hal_context_t *hal); + +void emac_hal_lowlevel_init(emac_hal_context_t *hal); + +void emac_hal_reset(emac_hal_context_t *hal); + +bool emac_hal_is_reset_done(emac_hal_context_t *hal); + +void emac_hal_set_csr_clock_range(emac_hal_context_t *hal); + +void emac_hal_init_mac_default(emac_hal_context_t *hal); + +void emac_hal_init_dma_default(emac_hal_context_t *hal); + +void emac_hal_set_speed(emac_hal_context_t *hal, uint32_t speed); + +void emac_hal_set_duplex(emac_hal_context_t *hal, uint32_t duplex); + +void emac_hal_set_promiscuous(emac_hal_context_t *hal, bool enable); + +bool emac_hal_is_mii_busy(emac_hal_context_t *hal); + +void emac_hal_set_phy_cmd(emac_hal_context_t *hal, uint32_t phy_addr, uint32_t phy_reg, bool write); + +void emac_hal_set_phy_data(emac_hal_context_t *hal, uint32_t reg_value); + +uint32_t emac_hal_get_phy_data(emac_hal_context_t *hal); + +void emac_hal_set_address(emac_hal_context_t *hal, uint8_t *mac_addr); + +void emac_hal_start(emac_hal_context_t *hal); + +void emac_hal_stop(emac_hal_context_t *hal); + +uint32_t emac_hal_get_tx_desc_owner(emac_hal_context_t *hal); + +uint32_t emac_hal_transmit_frame(emac_hal_context_t *hal, uint8_t *buf, uint32_t length); + +uint32_t emac_hal_receive_frame(emac_hal_context_t *hal, uint8_t *buf, uint32_t size, uint32_t *frames_remain); + +void emac_hal_isr(void *arg); + +void emac_hal_tx_complete_cb(void *arg); + +void emac_hal_tx_unavail_cb (void *arg); + +void emac_hal_rx_complete_cb (void *arg); + +void emac_hal_rx_early_cb(void *arg); + +void emac_hal_rx_unavail_cb(void *arg); + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/esp32/include/hal/gpio_ll.h b/arch/xtensa/include/esp32/soc/esp32/include/hal/gpio_ll.h new file mode 100644 index 0000000000000..5fa8f5e68053d --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/hal/gpio_ll.h @@ -0,0 +1,411 @@ +// 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. + +/******************************************************************************* + * NOTICE + * The hal is not public api, don't use in application code. + * See readme.md in soc/include/hal/readme.md + ******************************************************************************/ + +// The LL layer for ESP32 GPIO register operations + +#pragma once + +#include "soc/soc.h" +#include "soc/gpio_periph.h" +#include "soc/rtc_cntl_reg.h" +#include "soc/rtc_io_reg.h" +#include "hal/gpio_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Get GPIO hardware instance with giving gpio num +#define GPIO_LL_GET_HW(num) (((num) == 0) ? (&GPIO) : NULL) + +/** + * @brief Enable pull-up on GPIO. + * + * @param hw Peripheral GPIO hardware instance address. + * @param gpio_num GPIO number + */ +static inline void gpio_ll_pullup_en(gpio_dev_t *hw, gpio_num_t gpio_num) +{ + REG_SET_BIT(GPIO_PIN_MUX_REG[gpio_num], FUN_PU); +} + +/** + * @brief Disable pull-up on GPIO. + * + * @param hw Peripheral GPIO hardware instance address. + * @param gpio_num GPIO number + */ +static inline void gpio_ll_pullup_dis(gpio_dev_t *hw, gpio_num_t gpio_num) +{ + REG_CLR_BIT(GPIO_PIN_MUX_REG[gpio_num], FUN_PU); +} + +/** + * @brief Enable pull-down on GPIO. + * + * @param hw Peripheral GPIO hardware instance address. + * @param gpio_num GPIO number + */ +static inline void gpio_ll_pulldown_en(gpio_dev_t *hw, gpio_num_t gpio_num) +{ + REG_SET_BIT(GPIO_PIN_MUX_REG[gpio_num], FUN_PD); +} + +/** + * @brief Disable pull-down on GPIO. + * + * @param hw Peripheral GPIO hardware instance address. + * @param gpio_num GPIO number + */ +static inline void gpio_ll_pulldown_dis(gpio_dev_t *hw, gpio_num_t gpio_num) +{ + REG_CLR_BIT(GPIO_PIN_MUX_REG[gpio_num], FUN_PD); +} + +/** + * @brief GPIO set interrupt trigger type + * + * @param hw Peripheral GPIO hardware instance address. + * @param gpio_num GPIO number. If you want to set the trigger type of e.g. of GPIO16, gpio_num should be GPIO_NUM_16 (16); + * @param intr_type Interrupt type, select from gpio_int_type_t + */ +static inline void gpio_ll_set_intr_type(gpio_dev_t *hw, gpio_num_t gpio_num, gpio_int_type_t intr_type) +{ + hw->pin[gpio_num].int_type = intr_type; +} + +/** + * @brief Get GPIO interrupt status + * + * @param hw Peripheral GPIO hardware instance address. + * @param core_id interrupt core id + * @param status interrupt status + */ +static inline void gpio_ll_get_intr_status(gpio_dev_t *hw, uint32_t core_id, uint32_t *status) +{ + *status = (core_id == 0) ? hw->pcpu_int : hw->acpu_int; +} + +/** + * @brief Get GPIO interrupt status high + * + * @param hw Peripheral GPIO hardware instance address. + * @param core_id interrupt core id + * @param status interrupt status high + */ +static inline void gpio_ll_get_intr_status_high(gpio_dev_t *hw, uint32_t core_id, uint32_t *status) +{ + *status = (core_id == 0) ? hw->pcpu_int1.intr : hw->acpu_int1.intr; +} + +/** + * @brief Clear GPIO interrupt status + * + * @param hw Peripheral GPIO hardware instance address. + * @param mask interrupt status clear mask + */ +static inline void gpio_ll_clear_intr_status(gpio_dev_t *hw, uint32_t mask) +{ + hw->status_w1tc = mask; +} + +/** + * @brief Clear GPIO interrupt status high + * + * @param hw Peripheral GPIO hardware instance address. + * @param mask interrupt status high clear mask + */ +static inline void gpio_ll_clear_intr_status_high(gpio_dev_t *hw, uint32_t mask) +{ + hw->status1_w1tc.intr_st = mask; +} + +/** + * @brief Enable GPIO module interrupt signal + * + * @param hw Peripheral GPIO hardware instance address. + * @param core_id Interrupt enabled CPU to corresponding ID + * @param gpio_num GPIO number. If you want to enable the interrupt of e.g. GPIO16, gpio_num should be GPIO_NUM_16 (16); + */ +static inline void gpio_ll_intr_enable_on_core(gpio_dev_t *hw, uint32_t core_id, gpio_num_t gpio_num) +{ + if (core_id == 0) { + hw->pin[gpio_num].int_ena = GPIO_PRO_CPU_INTR_ENA; //enable pro cpu intr + } else { + hw->pin[gpio_num].int_ena = GPIO_APP_CPU_INTR_ENA; //enable pro cpu intr + } +} + +/** + * @brief Disable GPIO module interrupt signal + * + * @param hw Peripheral GPIO hardware instance address. + * @param gpio_num GPIO number. If you want to disable the interrupt of e.g. GPIO16, gpio_num should be GPIO_NUM_16 (16); + */ +static inline void gpio_ll_intr_disable(gpio_dev_t *hw, gpio_num_t gpio_num) +{ + hw->pin[gpio_num].int_ena = 0; //disable GPIO intr +} + +/** + * @brief Disable input mode on GPIO. + * + * @param hw Peripheral GPIO hardware instance address. + * @param gpio_num GPIO number + */ +static inline void gpio_ll_input_disable(gpio_dev_t *hw, gpio_num_t gpio_num) +{ + PIN_INPUT_DISABLE(GPIO_PIN_MUX_REG[gpio_num]); +} + +/** + * @brief Enable input mode on GPIO. + * + * @param hw Peripheral GPIO hardware instance address. + * @param gpio_num GPIO number + */ +static inline void gpio_ll_input_enable(gpio_dev_t *hw, gpio_num_t gpio_num) +{ + PIN_INPUT_ENABLE(GPIO_PIN_MUX_REG[gpio_num]); +} + +/** + * @brief Disable output mode on GPIO. + * + * @param hw Peripheral GPIO hardware instance address. + * @param gpio_num GPIO number + */ +static inline void gpio_ll_output_disable(gpio_dev_t *hw, gpio_num_t gpio_num) +{ + if (gpio_num < 32) { + hw->enable_w1tc = (0x1 << gpio_num); + } else { + hw->enable1_w1tc.data = (0x1 << (gpio_num - 32)); + } + + // Ensure no other output signal is routed via GPIO matrix to this pin + REG_WRITE(GPIO_FUNC0_OUT_SEL_CFG_REG + (gpio_num * 4), + SIG_GPIO_OUT_IDX); +} + +/** + * @brief Enable output mode on GPIO. + * + * @param hw Peripheral GPIO hardware instance address. + * @param gpio_num GPIO number + */ +static inline void gpio_ll_output_enable(gpio_dev_t *hw, gpio_num_t gpio_num) +{ + if (gpio_num < 32) { + hw->enable_w1ts = (0x1 << gpio_num); + } else { + hw->enable1_w1ts.data = (0x1 << (gpio_num - 32)); + } +} + +/** + * @brief Disable open-drain mode on GPIO. + * + * @param hw Peripheral GPIO hardware instance address. + * @param gpio_num GPIO number + */ +static inline void gpio_ll_od_disable(gpio_dev_t *hw, gpio_num_t gpio_num) +{ + hw->pin[gpio_num].pad_driver = 0; +} + +/** + * @brief Enable open-drain mode on GPIO. + * + * @param hw Peripheral GPIO hardware instance address. + * @param gpio_num GPIO number + */ +static inline void gpio_ll_od_enable(gpio_dev_t *hw, gpio_num_t gpio_num) +{ + hw->pin[gpio_num].pad_driver = 1; +} + +/** + * @brief GPIO set output level + * + * @param hw Peripheral GPIO hardware instance address. + * @param gpio_num GPIO number. If you want to set the output level of e.g. GPIO16, gpio_num should be GPIO_NUM_16 (16); + * @param level Output level. 0: low ; 1: high + */ +static inline void gpio_ll_set_level(gpio_dev_t *hw, gpio_num_t gpio_num, uint32_t level) +{ + if (level) { + if (gpio_num < 32) { + hw->out_w1ts = (1 << gpio_num); + } else { + hw->out1_w1ts.data = (1 << (gpio_num - 32)); + } + } else { + if (gpio_num < 32) { + hw->out_w1tc = (1 << gpio_num); + } else { + hw->out1_w1tc.data = (1 << (gpio_num - 32)); + } + } +} + +/** + * @brief GPIO get input level + * + * @warning If the pad is not configured for input (or input and output) the returned value is always 0. + * + * @param hw Peripheral GPIO hardware instance address. + * @param gpio_num GPIO number. If you want to get the logic level of e.g. pin GPIO16, gpio_num should be GPIO_NUM_16 (16); + * + * @return + * - 0 the GPIO input level is 0 + * - 1 the GPIO input level is 1 + */ +static inline int gpio_ll_get_level(gpio_dev_t *hw, gpio_num_t gpio_num) +{ + if (gpio_num < 32) { + return (hw->in >> gpio_num) & 0x1; + } else { + return (hw->in1.data >> (gpio_num - 32)) & 0x1; + } +} + +/** + * @brief Enable GPIO wake-up function. + * + * @param hw Peripheral GPIO hardware instance address. + * @param gpio_num GPIO number. + * @param intr_type GPIO wake-up type. Only GPIO_INTR_LOW_LEVEL or GPIO_INTR_HIGH_LEVEL can be used. + */ +static inline void gpio_ll_wakeup_enable(gpio_dev_t *hw, gpio_num_t gpio_num, gpio_int_type_t intr_type) +{ + hw->pin[gpio_num].int_type = intr_type; + hw->pin[gpio_num].wakeup_enable = 0x1; +} + +/** + * @brief Disable GPIO wake-up function. + * + * @param hw Peripheral GPIO hardware instance address. + * @param gpio_num GPIO number + */ +static inline void gpio_ll_wakeup_disable(gpio_dev_t *hw, gpio_num_t gpio_num) +{ + hw->pin[gpio_num].wakeup_enable = 0; +} + +/** + * @brief Set GPIO pad drive capability + * + * @param hw Peripheral GPIO hardware instance address. + * @param gpio_num GPIO number, only support output GPIOs + * @param strength Drive capability of the pad + */ +static inline void gpio_ll_set_drive_capability(gpio_dev_t *hw, gpio_num_t gpio_num, gpio_drive_cap_t strength) +{ + SET_PERI_REG_BITS(GPIO_PIN_MUX_REG[gpio_num], FUN_DRV_V, strength, FUN_DRV_S); +} + +/** + * @brief Get GPIO pad drive capability + * + * @param hw Peripheral GPIO hardware instance address. + * @param gpio_num GPIO number, only support output GPIOs + * @param strength Pointer to accept drive capability of the pad + */ +static inline void gpio_ll_get_drive_capability(gpio_dev_t *hw, gpio_num_t gpio_num, gpio_drive_cap_t *strength) +{ + *strength = GET_PERI_REG_BITS2(GPIO_PIN_MUX_REG[gpio_num], FUN_DRV_V, FUN_DRV_S); +} + +/** + * @brief Enable all digital gpio pad hold function during Deep-sleep. + * + * @param hw Peripheral GPIO hardware instance address. + */ +static inline void gpio_ll_deep_sleep_hold_en(gpio_dev_t *hw) +{ + SET_PERI_REG_MASK(RTC_CNTL_DIG_ISO_REG, RTC_CNTL_DG_PAD_AUTOHOLD_EN_M); +} + +/** + * @brief Disable all digital gpio pad hold function during Deep-sleep. + * + * @param hw Peripheral GPIO hardware instance address. + */ +static inline void gpio_ll_deep_sleep_hold_dis(gpio_dev_t *hw) +{ + CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_ISO_REG, RTC_CNTL_DG_PAD_AUTOHOLD_EN_M); +} + +/** + * @brief Enable gpio pad hold function. + * + * @param hw Peripheral GPIO hardware instance address. + * @param gpio_num GPIO number, only support output GPIOs + */ +static inline void gpio_ll_hold_en(gpio_dev_t *hw, gpio_num_t gpio_num) +{ + SET_PERI_REG_MASK(RTC_IO_DIG_PAD_HOLD_REG, GPIO_HOLD_MASK[gpio_num]); +} + +/** + * @brief Disable gpio pad hold function. + * + * @param hw Peripheral GPIO hardware instance address. + * @param gpio_num GPIO number, only support output GPIOs + */ +static inline void gpio_ll_hold_dis(gpio_dev_t *hw, gpio_num_t gpio_num) +{ + CLEAR_PERI_REG_MASK(RTC_IO_DIG_PAD_HOLD_REG, GPIO_HOLD_MASK[gpio_num]); +} + +/** + * @brief Set pad input to a peripheral signal through the IOMUX. + * + * @param hw Peripheral GPIO hardware instance address. + * @param gpio_num GPIO number of the pad. + * @param signal_idx Peripheral signal id to input. One of the ``*_IN_IDX`` signals in ``soc/gpio_sig_map.h``. + */ +static inline void gpio_ll_iomux_in(gpio_dev_t *hw, uint32_t gpio, uint32_t signal_idx) +{ + hw->func_in_sel_cfg[signal_idx].sig_in_sel = 0; + PIN_INPUT_ENABLE(GPIO_PIN_MUX_REG[gpio]); +} + +/** + * @brief Set peripheral output to an GPIO pad through the IOMUX. + * + * @param hw Peripheral GPIO hardware instance address. + * @param gpio_num gpio_num GPIO number of the pad. + * @param func The function number of the peripheral pin to output pin. + * One of the ``FUNC_X_*`` of specified pin (X) in ``soc/io_mux_reg.h``. + * @param oen_inv True if the output enable needs to be inverted, otherwise False. + */ +static inline void gpio_ll_iomux_out(gpio_dev_t *hw, uint8_t gpio_num, int func, uint32_t oen_inv) +{ + hw->func_out_sel_cfg[gpio_num].oen_sel = 0; + hw->func_out_sel_cfg[gpio_num].oen_inv_sel = oen_inv; + PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[gpio_num], func); +} + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/arch/xtensa/include/esp32/soc/esp32/include/hal/i2c_ll.h b/arch/xtensa/include/esp32/soc/esp32/include/hal/i2c_ll.h new file mode 100644 index 0000000000000..993af1e22a83b --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/hal/i2c_ll.h @@ -0,0 +1,851 @@ +// 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. + +// The LL layer for I2C register operations + +#pragma once +#include "soc/i2c_periph.h" +#include "hal/i2c_types.h" + +/** + * @brief I2C hardware cmd register filed. + */ +typedef union { + struct { + uint32_t byte_num: 8, + ack_en: 1, + ack_exp: 1, + ack_val: 1, + op_code: 3, + reserved14: 17, + done: 1; + }; + uint32_t val; +} i2c_hw_cmd_t; + +/** + * @brief I2C interrupt event + */ +typedef enum { + I2C_INTR_EVENT_ERR, + I2C_INTR_EVENT_ARBIT_LOST, /*!< I2C arbition lost event */ + I2C_INTR_EVENT_NACK, /*!< I2C NACK event */ + I2C_INTR_EVENT_TOUT, /*!< I2C time out event */ + I2C_INTR_EVENT_END_DET, /*!< I2C end detected event */ + I2C_INTR_EVENT_TRANS_DONE, /*!< I2C trans done event */ + I2C_INTR_EVENT_RXFIFO_FULL, /*!< I2C rxfifo full event */ + I2C_INTR_EVENT_TXFIFO_EMPTY, /*!< I2C txfifo empty event */ +} i2c_intr_event_t; + +/** + * @brief Data structure for calculating I2C bus timing. + */ +typedef struct { + uint16_t scl_low; /*!< I2C scl low period */ + uint16_t scl_high; /*!< I2C scl hight period */ + uint16_t sda_hold; /*!< I2C scl low period */ + uint16_t sda_sample; /*!< I2C sda sample time */ + uint16_t setup; /*!< I2C start and stop condition setup period */ + uint16_t hold; /*!< I2C start and stop condition hold period */ + uint16_t tout; /*!< I2C bus timeout period */ +} i2c_clk_cal_t; + +// Get the I2C hardware instance +#define I2C_LL_GET_HW(i2c_num) (((i2c_num) == 0) ? &I2C0 : &I2C1) +// Get the I2C hardware FIFO address +#define I2C_LL_GET_FIFO_ADDR(i2c_num) (I2C_DATA_APB_REG(i2c_num)) +// I2C master TX interrupt bitmap +#define I2C_LL_MASTER_TX_INT (I2C_ACK_ERR_INT_ENA_M|I2C_TIME_OUT_INT_ENA_M|I2C_TRANS_COMPLETE_INT_ENA_M|I2C_ARBITRATION_LOST_INT_ENA_M|I2C_END_DETECT_INT_ENA_M) +// I2C master RX interrupt bitmap +#define I2C_LL_MASTER_RX_INT (I2C_TIME_OUT_INT_ENA_M|I2C_TRANS_COMPLETE_INT_ENA_M|I2C_ARBITRATION_LOST_INT_ENA_M|I2C_END_DETECT_INT_ENA_M) +// I2C slave TX interrupt bitmap +#define I2C_LL_SLAVE_TX_INT (I2C_TXFIFO_EMPTY_INT_ENA_M) +// I2C slave RX interrupt bitmap +#define I2C_LL_SLAVE_RX_INT (I2C_RXFIFO_FULL_INT_ENA_M | I2C_TRANS_COMPLETE_INT_ENA_M) +//I2C base clock freq 80M +#define I2C_BASE_CLK_FREQ (80000000) + + +/** + * @brief Calculate I2C bus frequency + * + * @param source_clk I2C source clock + * @param bus_freq I2C bus frequency + * @param clk_cal Pointer to accept the clock configuration + * + * @return None + */ +static inline void i2c_ll_cal_bus_clk(uint32_t source_clk, uint32_t bus_freq, i2c_clk_cal_t *clk_cal) +{ + uint32_t half_cycle = source_clk / bus_freq / 2; + clk_cal->scl_low = half_cycle; + clk_cal->scl_high = half_cycle; + clk_cal->sda_hold = half_cycle / 2; + clk_cal->sda_sample = clk_cal->scl_high / 2; + clk_cal->setup = half_cycle; + clk_cal->hold = half_cycle; + clk_cal->tout = half_cycle * 20; //default we set the timeout value to 10 bus cycles. +} + +/** + * @brief Configure the I2C bus timing related register. + * + * @param hw Beginning address of the peripheral registers + * @param bus_cfg Pointer to the data structure holding the register configuration. + * + * @return None + */ +static inline void i2c_ll_set_bus_timing(i2c_dev_t *hw, i2c_clk_cal_t *bus_cfg) +{ + //scl period + hw->scl_low_period.period = bus_cfg->scl_low; + hw->scl_high_period.period = bus_cfg->scl_high; + //sda sample + hw->sda_hold.time = bus_cfg->sda_hold; + hw->sda_sample.time = bus_cfg->sda_sample; + //setup + hw->scl_rstart_setup.time = bus_cfg->setup; + hw->scl_stop_setup.time = bus_cfg->setup; + //hold + hw->scl_start_hold.time = bus_cfg->hold; + hw->scl_stop_hold.time = bus_cfg->hold; + hw->timeout.tout = bus_cfg->tout; +} + +/** + * @brief Reset I2C txFIFO + * + * @param hw Beginning address of the peripheral registers + * + * @return None + */ +static inline void i2c_ll_txfifo_rst(i2c_dev_t *hw) +{ + hw->fifo_conf.tx_fifo_rst = 1; + hw->fifo_conf.tx_fifo_rst = 0; +} + +/** + * @brief Reset I2C rxFIFO + * + * @param hw Beginning address of the peripheral registers + * + * @return None + */ +static inline void i2c_ll_rxfifo_rst(i2c_dev_t *hw) +{ + hw->fifo_conf.rx_fifo_rst = 1; + hw->fifo_conf.rx_fifo_rst = 0; +} + +/** + * @brief Configure I2C SCL timing + * + * @param hw Beginning address of the peripheral registers + * @param hight_period The I2C SCL hight period (in APB cycle) + * @param low_period The I2C SCL low period (in APB cycle) + * + * @return None. + */ +static inline void i2c_ll_set_scl_timing(i2c_dev_t *hw, int hight_period, int low_period) +{ + hw->scl_low_period.period = low_period; + hw->scl_high_period.period = hight_period; +} + +/** + * @brief Clear I2C interrupt status + * + * @param hw Beginning address of the peripheral registers + * @param mask Interrupt mask needs to be cleared + * + * @return None + */ +static inline void i2c_ll_clr_intsts_mask(i2c_dev_t *hw, uint32_t mask) +{ + hw->int_clr.val = mask; +} + +/** + * @brief Enable I2C interrupt + * + * @param hw Beginning address of the peripheral registers + * @param mask Interrupt mask needs to be enabled + * + * @return None + */ +static inline void i2c_ll_enable_intr_mask(i2c_dev_t *hw, uint32_t mask) +{ + hw->int_ena.val |= mask; +} + +/** + * @brief Disable I2C interrupt + * + * @param hw Beginning address of the peripheral registers + * @param mask Interrupt mask needs to be disabled + * + * @return None + */ +static inline void i2c_ll_disable_intr_mask(i2c_dev_t *hw, uint32_t mask) +{ + hw->int_ena.val &= (~mask); +} + +/** + * @brief Get I2C interrupt status + * + * @param hw Beginning address of the peripheral registers + * + * @return I2C interrupt status + */ +static inline uint32_t i2c_ll_get_intsts_mask(i2c_dev_t *hw) +{ + return hw->int_status.val; +} + +/** + * @brief Configure I2C memory access mode, FIFO mode or non-FIFO mode + * + * @param hw Beginning address of the peripheral registers + * @param fifo_mode_en Set true to enable FIFO access mode, else, set it false + * + * @return None + */ +static inline void i2c_ll_set_fifo_mode(i2c_dev_t *hw, bool fifo_mode_en) +{ + hw->fifo_conf.nonfifo_en = fifo_mode_en ? 0 : 1; +} + +/** + * @brief Configure I2C timeout + * + * @param hw Beginning address of the peripheral registers + * @param tout_num The I2C timeout value needs to be set (in APB cycle) + * + * @return None + */ +static inline void i2c_ll_set_tout(i2c_dev_t *hw, int tout) +{ + hw->timeout.tout = tout; +} + +/** + * @brief Configure I2C slave address + * + * @param hw Beginning address of the peripheral registers + * @param slave_addr I2C slave address needs to be set + * @param addr_10bit_en Set true to enable 10-bit slave address mode, set false to enable 7-bit address mode + * + * @return None + */ +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; +} + +/** + * @brief Write I2C hardware command register + * + * @param hw Beginning address of the peripheral registers + * @param cmd I2C hardware command + * @param cmd_idx The index of the command register, should be less than 16 + * + * @return None + */ +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; +} + +/** + * @brief Configure I2C start timing + * + * @param hw Beginning address of the peripheral registers + * @param start_setup The start condition setup period (in APB cycle) + * @param start_hold The start condition hold period (in APB cycle) + * + * @return None + */ +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; +} + +/** + * @brief Configure I2C stop timing + * + * @param hw Beginning address of the peripheral registers + * @param stop_setup The stop condition setup period (in APB cycle) + * @param stop_hold The stop condition hold period (in APB cycle) + * + * @return None + */ +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; +} + +/** + * @brief Configure I2C stop timing + * + * @param hw Beginning address of the peripheral registers + * @param sda_sample The SDA sample time (in APB cycle) + * @param sda_hold The SDA hold time (in APB cycle) + * + * @return None + */ +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; +} + +/** + * @brief Set I2C txFIFO empty threshold + * + * @param hw Beginning address of the peripheral registers + * @param empty_thr The txFIFO empty threshold + * + * @return None + */ +static inline void i2c_ll_set_txfifo_empty_thr(i2c_dev_t *hw, uint8_t empty_thr) +{ + hw->fifo_conf.tx_fifo_empty_thrhd = empty_thr; +} + +/** + * @brief Set I2C rxFIFO full threshold + * + * @param hw Beginning address of the peripheral registers + * @param full_thr The rxFIFO full threshold + * + * @return None + */ +static inline void i2c_ll_set_rxfifo_full_thr(i2c_dev_t *hw, uint8_t full_thr) +{ + hw->fifo_conf.rx_fifo_full_thrhd = full_thr; +} + +/** + * @brief Set the I2C data mode, LSB or MSB + * + * @param hw Beginning address of the peripheral registers + * @param tx_mode Tx data bit mode + * @param rx_mode Rx data bit mode + * + * @return None + */ +static inline void i2c_ll_set_data_mode(i2c_dev_t *hw, i2c_trans_mode_t tx_mode, i2c_trans_mode_t rx_mode) +{ + hw->ctr.tx_lsb_first = tx_mode; + hw->ctr.rx_lsb_first = rx_mode; +} + +/** + * @brief Get the I2C data mode + * + * @param hw Beginning address of the peripheral registers + * @param tx_mode Pointer to accept the received bytes mode + * @param rx_mode Pointer to accept the sended bytes mode + * + * @return None + */ +static inline void i2c_ll_get_data_mode(i2c_dev_t *hw, i2c_trans_mode_t *tx_mode, i2c_trans_mode_t *rx_mode) +{ + *tx_mode = hw->ctr.tx_lsb_first; + *rx_mode = hw->ctr.rx_lsb_first; +} + +/** + * @brief Get I2C sda timing configuration + * + * @param hw Beginning address of the peripheral registers + * @param sda_sample Pointer to accept the SDA sample timing configuration + * @param sda_hold Pointer to accept the SDA hold timing configuration + * + * @return None + */ +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; +} + +/** + * @brief Get the I2C hardware version + * + * @param hw Beginning address of the peripheral registers + * + * @return The I2C hardware version + */ +static inline uint32_t i2c_ll_get_hw_version(i2c_dev_t *hw) +{ + return hw->date; +} + +/** + * @brief Check if the I2C bus is busy + * + * @param hw Beginning address of the peripheral registers + * + * @return True if I2C state machine is busy, else false will be returned + */ +static inline bool i2c_ll_is_bus_busy(i2c_dev_t *hw) +{ + return hw->status_reg.bus_busy; +} + +/** + * @brief Check if I2C is master mode + * + * @param hw Beginning address of the peripheral registers + * + * @return True if I2C is master mode, else false will be returned + */ +static inline bool i2c_ll_is_master_mode(i2c_dev_t *hw) +{ + return hw->ctr.ms_mode; +} + +/** + * @brief Get the rxFIFO readable length + * + * @param hw Beginning address of the peripheral registers + * + * @return RxFIFO readable length + */ +static inline uint32_t i2c_ll_get_rxfifo_cnt(i2c_dev_t *hw) +{ + return hw->status_reg.rx_fifo_cnt; +} + +/** + * @brief Get I2C txFIFO writable length + * + * @param hw Beginning address of the peripheral registers + * + * @return TxFIFO writable length + */ +static inline uint32_t i2c_ll_get_txfifo_len(i2c_dev_t *hw) +{ + return SOC_I2C_FIFO_LEN - hw->status_reg.tx_fifo_cnt; +} + +/** + * @brief Get I2C timeout configuration + * + * @param hw Beginning address of the peripheral registers + * + * @return The I2C timeout value + */ +static inline uint32_t i2c_ll_get_tout(i2c_dev_t *hw) +{ + return hw->timeout.tout; +} + +/** + * @brief Start I2C transfer + * + * @param hw Beginning address of the peripheral registers + * + * @return None + */ +static inline void i2c_ll_trans_start(i2c_dev_t *hw) +{ + hw->ctr.trans_start = 1; +} + +/** + * @brief Get I2C start timing configuration + * + * @param hw Beginning address of the peripheral registers + * @param setup_time Pointer to accept the start condition setup period + * @param hold_time Pointer to accept the start condition hold period + * + * @return None + */ +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; +} + +/** + * @brief Get I2C stop timing configuration + * + * @param hw Beginning address of the peripheral registers + * @param setup_time Pointer to accept the stop condition setup period + * @param hold_time Pointer to accept the stop condition hold period + * + * @return None + */ +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; +} + +/** + * @brief Get I2C SCL timing configuration + * + * @param hw Beginning address of the peripheral registers + * @param high_period Pointer to accept the SCL high period + * @param low_period Pointer to accept the SCL low period + * + * @return None + */ +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; + *low_period = hw->scl_low_period.period; +} + +/** + * @brief Write the I2C hardware txFIFO + * + * @param hw Beginning address of the peripheral registers + * @param ptr Pointer to data buffer + * @param len Amount of data needs to be writen + * + * @return None. + */ +static inline void i2c_ll_write_txfifo(i2c_dev_t *hw, uint8_t *ptr, uint8_t len) +{ + uint32_t fifo_addr = (hw == &I2C0) ? 0x6001301c : 0x6002701c; + for(int i = 0; i < len; i++) { + WRITE_PERI_REG(fifo_addr, ptr[i]); + } +} + +/** + * @brief Read the I2C hardware rxFIFO + * + * @param hw Beginning address of the peripheral registers + * @param ptr Pointer to data buffer + * @param len Amount of data needs read + * + * @return None + */ +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; + } +} + +/** + * @brief Configure I2C hardware filter + * + * @param hw Beginning address of the peripheral registers + * @param filter_num If the glitch period on the line is less than this value, it can be filtered out + * If `filter_num == 0`, the filter will be disabled + * + * @return None + */ +static inline void i2c_ll_set_filter(i2c_dev_t *hw, uint8_t filter_num) +{ + if(filter_num > 0) { + hw->scl_filter_cfg.thres = filter_num; + hw->sda_filter_cfg.thres = filter_num; + hw->scl_filter_cfg.en = 1; + hw->sda_filter_cfg.en = 1; + } else { + hw->scl_filter_cfg.en = 0; + hw->sda_filter_cfg.en = 0; + } +} + +/** + * @brief Get I2C hardware filter configuration + * + * @param hw Beginning address of the peripheral registers + * + * @return The hardware filter configuration + */ +static inline uint8_t i2c_ll_get_filter(i2c_dev_t *hw) +{ + return hw->sda_filter_cfg.thres; +} + +/** + * @brief Enable I2C master TX interrupt + * + * @param hw Beginning address of the peripheral registers + * + * @return None + */ +static inline void i2c_ll_master_enable_tx_it(i2c_dev_t *hw) +{ + hw->int_clr.val = ~0; + hw->int_ena.val = I2C_LL_MASTER_TX_INT; +} + +/** + * @brief Enable I2C master RX interrupt + * + * @param hw Beginning address of the peripheral registers + * + * @return None + */ +static inline void i2c_ll_master_enable_rx_it(i2c_dev_t *hw) +{ + hw->int_clr.val = ~0; + hw->int_ena.val = I2C_LL_MASTER_RX_INT; +} + +/** + * @brief Disable I2C master TX interrupt + * + * @param hw Beginning address of the peripheral registers + * + * @return None + */ +static inline void i2c_ll_master_disable_tx_it(i2c_dev_t *hw) +{ + hw->int_ena.val &= (~I2C_LL_MASTER_TX_INT); +} + +/** + * @brief Disable I2C master RX interrupt + * + * @param hw Beginning address of the peripheral registers + * + * @return None + */ +static inline void i2c_ll_master_disable_rx_it(i2c_dev_t *hw) +{ + hw->int_ena.val &= (~I2C_LL_MASTER_RX_INT); +} + +/** + * @brief Clear I2C master TX interrupt status register + * + * @param hw Beginning address of the peripheral registers + * + * @return None + */ +static inline void i2c_ll_master_clr_tx_it(i2c_dev_t *hw) +{ + hw->int_clr.val = I2C_LL_MASTER_TX_INT; +} + +/** + * @brief Clear I2C master RX interrupt status register + * + * @param hw Beginning address of the peripheral registers + * + * @return None + */ +static inline void i2c_ll_master_clr_rx_it(i2c_dev_t *hw) +{ + hw->int_clr.val = I2C_LL_MASTER_RX_INT; +} + +/** + * @brief + * + * @param hw Beginning address of the peripheral registers + * + * @return None + */ +static inline void i2c_ll_slave_enable_tx_it(i2c_dev_t *hw) +{ + hw->int_ena.val |= I2C_LL_SLAVE_TX_INT; +} + +/** + * @brief Enable I2C slave RX interrupt + * + * @param hw Beginning address of the peripheral registers + * + * @return None + */ +static inline void i2c_ll_slave_enable_rx_it(i2c_dev_t *hw) +{ + hw->int_ena.val |= I2C_LL_SLAVE_RX_INT; +} + +/** + * @brief Disable I2C slave TX interrupt + * + * @param hw Beginning address of the peripheral registers + * + * @return None + */ +static inline void i2c_ll_slave_disable_tx_it(i2c_dev_t *hw) +{ + hw->int_ena.val &= (~I2C_LL_SLAVE_TX_INT); +} + +/** + * @brief Disable I2C slave RX interrupt + * + * @param hw Beginning address of the peripheral registers + * + * @return None + */ +static inline void i2c_ll_slave_disable_rx_it(i2c_dev_t *hw) +{ + hw->int_ena.val &= (~I2C_LL_SLAVE_RX_INT); +} + +/** + * @brief Clear I2C slave TX interrupt status register + * + * @param hw Beginning address of the peripheral registers + * + * @return None + */ +static inline void i2c_ll_slave_clr_tx_it(i2c_dev_t *hw) +{ + hw->int_clr.val = I2C_LL_SLAVE_TX_INT; +} + +/** + * @brief Clear I2C slave RX interrupt status register. + * + * @param hw Beginning address of the peripheral registers + * + * @return None + */ +static inline void i2c_ll_slave_clr_rx_it(i2c_dev_t *hw) +{ + hw->int_clr.val = I2C_LL_SLAVE_RX_INT; +} + +/** + * @brief Reste I2C master FSM. When the master FSM is stuck, call this function to reset the FSM + * + * @param hw Beginning address of the peripheral registers + * + * @return None + */ +static inline void i2c_ll_master_fsm_rst(i2c_dev_t *hw) +{ + ;//ESP32 do not support +} + +/** + * @brief Clear I2C bus, when the slave is stuck in a deadlock and keeps pulling the bus low, + * master can controls the SCL bus to generate 9 CLKs. + * + * Note: The master cannot detect if deadlock happens, but when the scl_st_to interrupt is generated, a deadlock may occur. + * + * @param hw Beginning address of the peripheral registers + * + * @return None + */ +static inline void i2c_ll_master_clr_bus(i2c_dev_t *hw) +{ + ;//ESP32 do not support +} + +/** + * @brief Set I2C source clock + * + * @param hw Beginning address of the peripheral registers + * @param src_clk Source clock of the I2C + * + * @return None + */ +static inline void i2c_ll_set_source_clk(i2c_dev_t *hw, i2c_sclk_t src_clk) +{ + ;//Not support on ESP32 +} + +/** + * @brief Get I2C master interrupt event + * + * @param hw Beginning address of the peripheral registers + * @param event Pointer to accept the interrupt event + * + * @return None + */ +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) { + *event = I2C_INTR_EVENT_ARBIT_LOST; + } else if (int_sts.ack_err) { + *event = I2C_INTR_EVENT_NACK; + } else if (int_sts.time_out) { + *event = I2C_INTR_EVENT_TOUT; + } else if (int_sts.end_detect) { + *event = I2C_INTR_EVENT_END_DET; + } else if (int_sts.trans_complete) { + *event = I2C_INTR_EVENT_TRANS_DONE; + } else { + *event = I2C_INTR_EVENT_ERR; + } +} + +/** + * @brief Get I2C slave interrupt event + * + * @param hw Beginning address of the peripheral registers + * @param event Pointer to accept the interrupt event + * + * @return None + */ +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_empty) { + *event = I2C_INTR_EVENT_TXFIFO_EMPTY; + } else if (int_sts.trans_complete) { + *event = I2C_INTR_EVENT_TRANS_DONE; + } else if (int_sts.rx_fifo_full) { + *event = I2C_INTR_EVENT_RXFIFO_FULL; + } else { + *event = I2C_INTR_EVENT_ERR; + } +} + +/** + * @brief Init I2C master + * + * @param hw Beginning address of the peripheral registers + * + * @return None + */ +static inline void i2c_ll_master_init(i2c_dev_t *hw) +{ + typeof(hw->ctr) ctrl_reg; + ctrl_reg.val = 0; + ctrl_reg.ms_mode = 1; + ctrl_reg.sda_force_out = 1; + ctrl_reg.scl_force_out = 1; + hw->ctr.val = ctrl_reg.val; +} + +/** + * @brief Init I2C slave + * + * @param hw Beginning address of the peripheral registers + * + * @return None + */ +static inline void i2c_ll_slave_init(i2c_dev_t *hw) +{ + typeof(hw->ctr) ctrl_reg; + ctrl_reg.val = 0; + ctrl_reg.sda_force_out = 1; + ctrl_reg.scl_force_out = 1; + hw->ctr.val = ctrl_reg.val; + hw->fifo_conf.fifo_addr_cfg_en = 0; +} \ No newline at end of file diff --git a/arch/xtensa/include/esp32/soc/esp32/include/hal/i2s_ll.h b/arch/xtensa/include/esp32/soc/esp32/include/hal/i2s_ll.h new file mode 100644 index 0000000000000..abf60be6956f5 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/hal/i2s_ll.h @@ -0,0 +1,824 @@ +// 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. + +/******************************************************************************* + * NOTICE + * The hal is not public api, don't use in application code. + * See readme.md in soc/include/hal/readme.md + ******************************************************************************/ + +// The LL layer for ESP32 I2S register operations + +#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" + +#ifdef __cplusplus +extern "C" { +#endif + +// 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) + +/** + * @brief Reset rx fifo + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_reset_rx_fifo(i2s_dev_t *hw) +{ + hw->conf.rx_fifo_reset = 1; + hw->conf.rx_fifo_reset = 0; +} + +/** + * @brief Reset tx fifo + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_reset_tx_fifo(i2s_dev_t *hw) +{ + hw->conf.tx_fifo_reset = 1; + hw->conf.tx_fifo_reset = 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 Disable tx interrupt + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_disable_tx_intr(i2s_dev_t *hw) +{ + hw->int_ena.out_eof = 0; + hw->int_ena.out_dscr_err = 0; +} + +/** + * @brief Enable tx interrupt + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_enable_tx_intr(i2s_dev_t *hw) +{ + hw->int_ena.out_eof = 1; + hw->int_ena.out_dscr_err = 1; +} + +/** + * @brief Reset dma in + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_reset_dma_in(i2s_dev_t *hw) +{ + hw->lc_conf.in_rst = 1; + hw->lc_conf.in_rst = 0; +} + +/** + * @brief Reset dma out + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_reset_dma_out(i2s_dev_t *hw) +{ + hw->lc_conf.out_rst = 1; + hw->lc_conf.out_rst = 0; +} + +/** + * @brief Reset tx + * + * @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 + * + * @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 + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_start_tx(i2s_dev_t *hw) +{ + hw->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) +{ + hw->in_link.start = 1; +} + +/** + * @brief Start rx + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_start_rx(i2s_dev_t *hw) +{ + hw->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) +{ + 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 + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_stop_in_link(i2s_dev_t *hw) +{ + hw->in_link.stop = 1; +} + +/** + * @brief Stop rx + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_stop_rx(i2s_dev_t *hw) +{ + hw->conf.rx_start = 0; +} + +/** + * @brief Enable dma + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_enable_dma(i2s_dev_t *hw) +{ + //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; +} + +/** + * @brief Get I2S interrupt status + * + * @param hw Peripheral I2S hardware instance address. + * @param val value to get interrupt status + */ +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) +{ + // On ESP32, the eof_num count in words. + hw->rx_eof_num = val / 4; +} + +/** + * @brief Get I2S tx pdm fp + * + * @param hw Peripheral I2S hardware instance address. + * @param val value to get tx pdm fp + */ +static inline void i2s_ll_get_tx_pdm_fp(i2s_dev_t *hw, uint32_t *val) +{ + *val = hw->pdm_freq_conf.tx_pdm_fp; +} + +/** + * @brief Get I2S tx pdm fs + * + * @param hw Peripheral I2S hardware instance address. + * @param val value to get tx pdm fs + */ +static inline void i2s_ll_get_tx_pdm_fs(i2s_dev_t *hw, uint32_t *val) +{ + *val = hw->pdm_freq_conf.tx_pdm_fs; +} + +/** + * @brief Set I2S tx pdm fp + * + * @param hw Peripheral I2S hardware instance address. + * @param val value to set tx pdm fp + */ +static inline void i2s_ll_set_tx_pdm_fp(i2s_dev_t *hw, uint32_t val) +{ + hw->pdm_freq_conf.tx_pdm_fp = val; +} + +/** + * @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) +{ + hw->pdm_freq_conf.tx_pdm_fs = 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) +{ + *val = hw->pdm_conf.rx_sinc_dsr_16_en; +} + +/** + * @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.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 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) +{ + hw->pdm_conf.rx_sinc_dsr_16_en = 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 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) +{ + hw->pdm_conf.pcm2pdm_conv_en = 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) +{ + hw->pdm_conf.pdm2pcm_conv_en = 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) +{ + hw->pdm_conf.rx_pdm_en = 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) +{ + hw->pdm_conf.tx_pdm_en = 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) +{ + hw->conf.tx_msb_shift = 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) +{ + hw->conf.rx_msb_shift = 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) +{ + hw->conf.tx_short_sync = 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) +{ + hw->conf.rx_short_sync = 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 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) +{ + hw->pdm_conf.tx_sinc_osr2 = 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; +} + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/esp32/include/hal/ledc_ll.h b/arch/xtensa/include/esp32/soc/esp32/include/hal/ledc_ll.h new file mode 100644 index 0000000000000..674b55cff8078 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/hal/ledc_ll.h @@ -0,0 +1,458 @@ +// 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. + +// The LL layer for LEDC register operations. +// Note that most of the register operations in this layer are non-atomic operations. + +#pragma once + +#include "hal/ledc_types.h" +#include "soc/ledc_periph.h" + +#define LEDC_LL_GET_HW() &LEDC + +/** + * @brief Set LEDC low speed timer clock + * + * @param hw Beginning address of the peripheral registers + * @param slow_clk_sel LEDC low speed timer clock source + * + * @return None + */ +static inline void ledc_ll_set_slow_clk_sel(ledc_dev_t *hw, ledc_slow_clk_sel_t slow_clk_sel){ + hw->conf.slow_clk_sel = slow_clk_sel; +} + +/** + * @brief Get LEDC low speed timer clock + * + * @param hw Beginning address of the peripheral registers + * @param slow_clk_sel LEDC low speed timer clock source + * + * @return None + */ +static inline void ledc_ll_get_slow_clk_sel(ledc_dev_t *hw, ledc_slow_clk_sel_t *slow_clk_sel){ + *slow_clk_sel = hw->conf.slow_clk_sel; +} + +/** + * @brief Update LEDC low speed timer + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, high-speed mode or low-speed mode + * @param timer_sel LEDC timer index (0-3), select from ledc_timer_t + * + * @return None + */ +static inline void ledc_ll_ls_timer_update(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_timer_t timer_sel){ + hw->timer_group[speed_mode].timer[timer_sel].conf.low_speed_update = 1; +} + +/** + * @brief Reset LEDC timer + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, high-speed mode or low-speed mode + * @param timer_sel LEDC timer index (0-3), select from ledc_timer_t + * + * @return None + */ +static inline void ledc_ll_timer_rst(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_timer_t timer_sel){ + hw->timer_group[speed_mode].timer[timer_sel].conf.rst = 1; + hw->timer_group[speed_mode].timer[timer_sel].conf.rst = 0; +} + +/** + * @brief Pause LEDC timer + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, high-speed mode or low-speed mode + * @param timer_sel LEDC timer index (0-3), select from ledc_timer_t + * + * @return None + */ +static inline void ledc_ll_timer_pause(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_timer_t timer_sel){ + hw->timer_group[speed_mode].timer[timer_sel].conf.pause = 1; +} + +/** + * @brief Resume LEDC timer + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, high-speed mode or low-speed mode + * @param timer_sel LEDC timer index (0-3), select from ledc_timer_t + * + * @return None + */ +static inline void ledc_ll_timer_resume(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_timer_t timer_sel){ + hw->timer_group[speed_mode].timer[timer_sel].conf.pause = 0; +} + +/** + * @brief Set LEDC timer clock divider + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, high-speed mode or low-speed mode + * @param timer_sel LEDC timer index (0-3), select from ledc_timer_t + * @param clock_divider Timer clock divide value, the timer clock is divided from the selected clock source + * + * @return None + */ +static inline void ledc_ll_set_clock_divider(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_timer_t timer_sel, uint32_t clock_divider){ + hw->timer_group[speed_mode].timer[timer_sel].conf.clock_divider = clock_divider; +} + +/** + * @brief Get LEDC timer clock divider + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, high-speed mode or low-speed mode + * @param timer_sel LEDC timer index (0-3), select from ledc_timer_t + * @param clock_divider Timer clock divide value, the timer clock is divided from the selected clock source + * + * @return None + */ +static inline void ledc_ll_get_clock_divider(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_timer_t timer_sel, uint32_t *clock_divider){ + *clock_divider = hw->timer_group[speed_mode].timer[timer_sel].conf.clock_divider; +} + +/** + * @brief Set LEDC timer clock source + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, high-speed mode or low-speed mode + * @param timer_sel LEDC timer index (0-3), select from ledc_timer_t + * @param clk_src Timer clock source + * + * @return None + */ +static inline void ledc_ll_set_clock_source(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_timer_t timer_sel, ledc_clk_src_t clk_src){ + hw->timer_group[speed_mode].timer[timer_sel].conf.tick_sel = (clk_src == LEDC_APB_CLK); +} + +/** + * @brief Get LEDC timer clock source + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, high-speed mode or low-speed mode + * @param timer_sel LEDC timer index (0-3), select from ledc_timer_t + * @param clk_src Pointer to accept the timer clock source + * + * @return None + */ +static inline void ledc_ll_get_clock_source(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_timer_t timer_sel, ledc_clk_src_t *clk_src){ + if (hw->timer_group[speed_mode].timer[timer_sel].conf.tick_sel) { + *clk_src = LEDC_APB_CLK; + } else { + *clk_src = LEDC_REF_TICK; + } +} + +/** + * @brief Set LEDC duty resolution + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, high-speed mode or low-speed mode + * @param timer_sel LEDC timer index (0-3), select from ledc_timer_t + * @param duty_resolution Resolution of duty setting in number of bits. The range of duty values is [0, (2**duty_resolution)] + * + * @return None + */ +static inline void ledc_ll_set_duty_resolution(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_timer_t timer_sel, uint32_t duty_resolution){ + hw->timer_group[speed_mode].timer[timer_sel].conf.duty_resolution = duty_resolution; +} + +/** + * @brief Get LEDC duty resolution + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, high-speed mode or low-speed mode + * @param timer_sel LEDC timer index (0-3), select from ledc_timer_t + * @param duty_resolution Pointer to accept the resolution of duty setting in number of bits. + * + * @return None + */ +static inline void ledc_ll_get_duty_resolution(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_timer_t timer_sel, uint32_t *duty_resolution){ + *duty_resolution = hw->timer_group[speed_mode].timer[timer_sel].conf.duty_resolution; +} + +/** + * @brief Update channel configure when select low speed mode + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, high-speed mode or low-speed mode + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * + * @return None + */ +static inline void ledc_ll_ls_channel_update(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel_num){ + hw->channel_group[speed_mode].channel[channel_num].conf0.low_speed_update = 1; +} + +/** + * @brief Get LEDC max duty + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, high-speed mode or low-speed mode + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param max_duty Pointer to accept the max duty + * + * @return None + */ +static inline void ledc_ll_get_max_duty(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel_num, uint32_t *max_duty){ + int timer_sel = hw->channel_group[speed_mode].channel[channel_num].conf0.timer_sel; + *max_duty = (1 << (LEDC.timer_group[speed_mode].timer[timer_sel].conf.duty_resolution)); +} + +/** + * @brief Set LEDC hpoint value + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, high-speed mode or low-speed mode + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param hpoint_val LEDC hpoint value(max: 0xfffff) + * + * @return None + */ +static inline void ledc_ll_set_hpoint(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel_num, uint32_t hpoint_val){ + hw->channel_group[speed_mode].channel[channel_num].hpoint.hpoint = hpoint_val; +} + +/** + * @brief Get LEDC hpoint value + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, high-speed mode or low-speed mode + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param hpoint_val Pointer to accept the LEDC hpoint value(max: 0xfffff) + * + * @return None + */ +static inline void ledc_ll_get_hpoint(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel_num, uint32_t *hpoint_val){ + *hpoint_val = hw->channel_group[speed_mode].channel[channel_num].hpoint.hpoint; +} + +/** + * @brief Set LEDC the integer part of duty value + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, high-speed mode or low-speed mode + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param duty_val LEDC duty value, the range of duty setting is [0, (2**duty_resolution)] + * + * @return None + */ +static inline void ledc_ll_set_duty_int_part(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel_num, uint32_t duty_val){ + hw->channel_group[speed_mode].channel[channel_num].duty.duty = duty_val << 4; +} + +/** + * @brief Get LEDC duty value + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, high-speed mode or low-speed mode + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param duty_val Pointer to accept the LEDC duty value + * + * @return None + */ +static inline void ledc_ll_get_duty(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel_num, uint32_t *duty_val){ + *duty_val = (hw->channel_group[speed_mode].channel[channel_num].duty_rd.duty_read >> 4); +} + +/** + * @brief Set LEDC duty change direction + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, high-speed mode or low-speed mode + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param duty_direction LEDC duty change direction, increase or decrease + * + * @return None + */ +static inline void ledc_ll_set_duty_direction(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel_num, ledc_duty_direction_t duty_direction){ + hw->channel_group[speed_mode].channel[channel_num].conf1.duty_inc = duty_direction; +} + +/** + * @brief Get LEDC duty change direction + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, high-speed mode or low-speed mode + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param duty_direction Pointer to accept the LEDC duty change direction, increase or decrease + * + * @return None + */ +static inline void ledc_ll_get_duty_direction(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel_num, ledc_duty_direction_t *duty_direction){ + *duty_direction = hw->channel_group[speed_mode].channel[channel_num].conf1.duty_inc; +} + +/** + * @brief Set the number of increased or decreased times + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, high-speed mode or low-speed mode + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param duty_num The number of increased or decreased times + * + * @return None + */ +static inline void ledc_ll_set_duty_num(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel_num, uint32_t duty_num){ + hw->channel_group[speed_mode].channel[channel_num].conf1.duty_num = duty_num; +} + +/** + * @brief Set the duty cycles of increase or decrease + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, high-speed mode or low-speed mode + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param duty_cycle The duty cycles + * + * @return None + */ +static inline void ledc_ll_set_duty_cycle(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel_num, uint32_t duty_cycle){ + hw->channel_group[speed_mode].channel[channel_num].conf1.duty_cycle = duty_cycle; +} + +/** + * @brief Set the step scale of increase or decrease + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, high-speed mode or low-speed mode + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param duty_scale The step scale + * + * @return None + */ +static inline void ledc_ll_set_duty_scale(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel_num, uint32_t duty_scale){ + hw->channel_group[speed_mode].channel[channel_num].conf1.duty_scale = duty_scale; +} + +/** + * @brief Set the output enable + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, high-speed mode or low-speed mode + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param sig_out_en The output enable status + * + * @return None + */ +static inline void ledc_ll_set_sig_out_en(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel_num, bool sig_out_en){ + hw->channel_group[speed_mode].channel[channel_num].conf0.sig_out_en = sig_out_en; +} + +/** + * @brief Set the duty start + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, high-speed mode or low-speed mode + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param duty_start The duty start + * + * @return None + */ +static inline void ledc_ll_set_duty_start(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel_num, bool duty_start){ + hw->channel_group[speed_mode].channel[channel_num].conf1.duty_start = duty_start; +} + +/** + * @brief Set output idle level + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, high-speed mode or low-speed mode + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param idle_level The output idle level + * + * @return None + */ +static inline void ledc_ll_set_idle_level(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel_num, uint32_t idle_level){ + hw->channel_group[speed_mode].channel[channel_num].conf0.idle_lv = idle_level & 0x1; +} + +/** + * @brief Set fade end interrupt enable + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, high-speed mode or low-speed mode + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param fade_end_intr_en The fade end interrupt enable status + * + * @return None + */ +static inline void ledc_ll_set_fade_end_intr(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel_num, bool fade_end_intr_en){ + uint32_t value = hw->int_ena.val; + uint32_t int_en_base = (speed_mode == LEDC_LOW_SPEED_MODE) ? LEDC_DUTY_CHNG_END_LSCH0_INT_ENA_S : LEDC_DUTY_CHNG_END_HSCH0_INT_ENA_S; + hw->int_ena.val = fade_end_intr_en ? (value | BIT(int_en_base + channel_num)) : (value & (~(BIT(int_en_base + channel_num)))); +} + +/** + * @brief Get fade end interrupt status + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, high-speed mode or low-speed mode + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param intr_status The fade end interrupt status + * + * @return None + */ +static inline void ledc_ll_get_fade_end_intr_status(ledc_dev_t *hw, ledc_mode_t speed_mode, uint32_t *intr_status){ + uint32_t value = hw->int_st.val; + uint32_t int_en_base = (speed_mode == LEDC_LOW_SPEED_MODE) ? LEDC_DUTY_CHNG_END_LSCH0_INT_ENA_S : LEDC_DUTY_CHNG_END_HSCH0_INT_ENA_S; + *intr_status = (value >> int_en_base) & 0xff; +} + +/** + * @brief Clear fade end interrupt status + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, high-speed mode or low-speed mode + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * + * @return None + */ +static inline void ledc_ll_clear_fade_end_intr_status(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel_num){ + uint32_t int_en_base = (speed_mode == LEDC_LOW_SPEED_MODE) ? LEDC_DUTY_CHNG_END_LSCH0_INT_ENA_S : LEDC_DUTY_CHNG_END_HSCH0_INT_ENA_S; + hw->int_clr.val = BIT(int_en_base + channel_num); +} + +/** + * @brief Set timer index of the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, high-speed mode or low-speed mode + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param timer_sel LEDC timer index (0-3), select from ledc_timer_t + * + * @return None + */ +static inline void ledc_ll_bind_channel_timer(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel_num, ledc_timer_t timer_sel){ + hw->channel_group[speed_mode].channel[channel_num].conf0.timer_sel = timer_sel; +} + +/** + * @brief Get timer index of the specified channel + * + * @param hw Beginning address of the peripheral registers + * @param speed_mode LEDC speed_mode, high-speed mode or low-speed mode + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param timer_sel Pointer to accept the LEDC timer index + * + * @return None + */ +static inline void ledc_ll_get_channel_timer(ledc_dev_t *hw, ledc_mode_t speed_mode, ledc_channel_t channel_num, ledc_timer_t *timer_sel){ + *timer_sel = hw->channel_group[speed_mode].channel[channel_num].conf0.timer_sel; +} diff --git a/arch/xtensa/include/esp32/soc/esp32/include/hal/mcpwm_ll.h b/arch/xtensa/include/esp32/soc/esp32/include/hal/mcpwm_ll.h new file mode 100644 index 0000000000000..6bb4bb0c7f3b9 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/hal/mcpwm_ll.h @@ -0,0 +1,727 @@ +// 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. + +/******************************************************************************* + * NOTICE + * The hal is not public api, don't use in application code. + * See readme.md in soc/include/hal/readme.md + ******************************************************************************/ + +// The LL layer for ESP32 MCPWM register operations + +#pragma once + +#include +#include "soc/mcpwm_periph.h" +#include "hal/mcpwm_types.h" +#include "soc/mcpwm_caps.h" +#include "hal/hal_defs.h" + +#include "esp_types.h" + +/// Get the address of peripheral registers +#define MCPWM_LL_GET_HW(ID) (((ID)==0)? &MCPWM0: &MCPWM1) + + +/********************* Global *******************/ +/** + * Initialize common registers. + * + * @param mcpwm Address of the MCPWM peripheral registers. + */ +static inline void mcpwm_ll_init(mcpwm_dev_t *mcpwm) +{ + mcpwm->update_cfg.global_up_en = 1; + mcpwm->update_cfg.global_force_up = 1; + mcpwm->update_cfg.global_force_up = 0; +} + +/** + * Set the prescale of the PWM main clock to the input clock. + * + * Input clock is 160MHz, PWM main clock cycle = 6.25ns*(prescale + 1). + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param prescale Prescale factor, 0-255. + */ +static inline void mcpwm_ll_set_clock_prescale(mcpwm_dev_t *mcpwm, int prescale) +{ + mcpwm->clk_cfg.prescale = prescale; +} + +STATIC_HAL_REG_CHECK(MCPWM, MCPWM_LL_INTR_CAP0, MCPWM_CAP0_INT_RAW); +STATIC_HAL_REG_CHECK(MCPWM, MCPWM_LL_INTR_CAP1, MCPWM_CAP1_INT_RAW); +STATIC_HAL_REG_CHECK(MCPWM, MCPWM_LL_INTR_CAP2, MCPWM_CAP2_INT_RAW); + +/** + * Get raw interrupt status. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @return The triggered interrupts, ORed by active interrupts. + */ +static inline mcpwm_intr_t mcpwm_ll_get_intr(mcpwm_dev_t *mcpwm) +{ + return mcpwm->int_raw.val; +} + +/** + * Clear the interrupts. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param intr Bitwise ORed interrupts to clear. + */ +static inline void mcpwm_ll_clear_intr(mcpwm_dev_t* mcpwm, mcpwm_intr_t intr) +{ + mcpwm->int_clr.val = intr; +} + +/********************* Timer *******************/ +/** + * Set the prescale of the Timer_x clock to the PWM main clock. + * + * Timer clock frequency = PWM main clock frequency/(prescale + 1). + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param timer The timer to set the prescale, 0-2. + * @param prescale Prescale factor, 0-255. + */ +static inline void mcpwm_ll_timer_set_prescale(mcpwm_dev_t* mcpwm, int timer, uint32_t prescale) +{ + mcpwm->timer[timer].period.prescale = prescale; +} + + +STATIC_HAL_REG_CHECK(MCPWM, MCPWM_UP_COUNTER, 1); +STATIC_HAL_REG_CHECK(MCPWM, MCPWM_DOWN_COUNTER, 2); +STATIC_HAL_REG_CHECK(MCPWM, MCPWM_UP_DOWN_COUNTER, 3); + +/** + * Set the counting mode for the PWM timer. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param timer The timer to change counting mode, 0-2. + * @param mode Counting mode to use. + */ +static inline void mcpwm_ll_timer_set_count_mode(mcpwm_dev_t *mcpwm, int timer, mcpwm_counter_type_t mode) +{ + mcpwm->timer[timer].mode.mode = mode; +} + +/** + * Start a timer. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param timer The timer to start, 0-2. + */ +static inline void mcpwm_ll_timer_start(mcpwm_dev_t *mcpwm, int timer) +{ + mcpwm->timer[timer].mode.start = 2; +} + +/** + * Stop a timer. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param timer The timer to stop, 0-2. + */ +static inline void mcpwm_ll_timer_stop(mcpwm_dev_t *mcpwm, int timer) +{ + mcpwm->timer[timer].mode.start = 0; +} + +/** + * Set the overflow period of a timer. + * + * The overflow rate will be Frequency of timer / period. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param timer The timer to set period, 0-2. + * @param period Total timer count of each period, 0-65535. + */ +static inline void mcpwm_ll_timer_set_period(mcpwm_dev_t *mcpwm, int timer, uint32_t period) +{ + + mcpwm->timer[timer].period.period = period; + mcpwm->timer[timer].period.upmethod = 0; +} + +/** + * Get the period setting of a timer. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param timer The timer to get the period, 0-2. + * @return Period setting value. + */ +static inline uint32_t mcpwm_ll_timer_get_period(mcpwm_dev_t *mcpwm, int timer) +{ + return mcpwm->timer[timer].period.period; +} + +/********************* Sync *******************/ +/** + * Enable the synchronization feature for a timer. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param timer Timer to set, 0-2. + * @param enable true to enable, otherwise false. + */ +static inline void mcpwm_ll_sync_enable(mcpwm_dev_t *mcpwm, int timer, bool enable) +{ + if (enable) { + mcpwm->timer[timer].sync.out_sel = 0; + mcpwm->timer[timer].sync.in_en = 1; + } else { + mcpwm->timer[timer].sync.in_en = 0; + } +} + +/** + * Set the phase (counter value) to reload when the sync signal triggers. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param timer Timer to set, 0-2. + * @param reload_val The reloaded value. + */ +static inline void mcpwm_ll_sync_set_phase(mcpwm_dev_t *mcpwm, int timer, uint32_t reload_val) +{ + mcpwm->timer[timer].sync.timer_phase = reload_val; +} + +STATIC_HAL_REG_CHECK(MCPWM, MCPWM_SELECT_SYNC0, 4); +STATIC_HAL_REG_CHECK(MCPWM, MCPWM_SELECT_SYNC1, 5); +STATIC_HAL_REG_CHECK(MCPWM, MCPWM_SELECT_SYNC2, 6); +/** + * Set the sync signal source for a timer. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param timer The timer to set, 0-2. + * @param sync_sig The synchronization signal to use. + */ +static inline void mcpwm_ll_sync_set_input(mcpwm_dev_t *mcpwm, int timer, mcpwm_sync_signal_t sync_sig) +{ + if (timer == 0) { + mcpwm->timer_synci_cfg.t0_in_sel = sync_sig; + } else if (timer == 1) { + mcpwm->timer_synci_cfg.t1_in_sel = sync_sig; + } else { //MCPWM_TIMER_2 + mcpwm->timer_synci_cfg.t2_in_sel = sync_sig; + } +} + +/********************* Comparator *******************/ +/** + * Select a timer for the specified operator to use. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param op The operator to choose timer, 0-2. + * @param timer The timer to use, 0-2. + */ +static inline void mcpwm_ll_operator_select_timer(mcpwm_dev_t *mcpwm, int op, int timer) +{ + if (op == 0) { + mcpwm->timer_sel.operator0_sel = timer; + } else if (op == 1) { + mcpwm->timer_sel.operator1_sel = timer; + } else { + mcpwm->timer_sel.operator2_sel = timer; + } +} + +/** + * Set the update method of the compare value of a timer + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param op Operator to set, 0-2. + */ +static inline void mcpwm_ll_operator_set_compare_upmethod(mcpwm_dev_t *mcpwm, int op) +{ + mcpwm->channel[op].cmpr_cfg.a_upmethod = BIT(0); + mcpwm->channel[op].cmpr_cfg.b_upmethod = BIT(0); +} + +/** + * Get one of the compare value of a timer. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param op The operator to get, 0-2. + * @param cmp_n Comparer id to get, 0-1. + * @return The set compare value. + */ +static inline uint32_t mcpwm_ll_operator_get_compare(mcpwm_dev_t *mcpwm, int op, int cmp_n) +{ + return (mcpwm->channel[op].cmpr_value[cmp_n].cmpr_val); +} + +/** + * Set one of the compare value of a timer. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param op The operator to set, 0-2. + * @param cmp_n The comparer to set value, 0-1. + * @param compare The compare value, 0-65535. + */ +static inline void mcpwm_ll_operator_set_compare(mcpwm_dev_t *mcpwm, int op, int cmp_n, uint32_t compare) +{ + mcpwm->channel[op].cmpr_value[cmp_n].cmpr_val = compare; +} + +/********************* Generator *******************/ + +STATIC_HAL_REG_CHECK(MCPWM, MCPWM_ACTION_NO_CHANGE, 0); +STATIC_HAL_REG_CHECK(MCPWM, MCPWM_ACTION_FORCE_LOW, 1); +STATIC_HAL_REG_CHECK(MCPWM, MCPWM_ACTION_FORCE_HIGH, 2); +STATIC_HAL_REG_CHECK(MCPWM, MCPWM_ACTION_TOGGLE, 3); +/** + * Set the action will be taken by a operator when its timer counts to zero. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param op The operator to set action, 0-2. + * @param gen One generator of the operator to take the action, 0-1. + * @param action Action to take. + */ +static inline void mcpwm_ll_gen_set_zero_action(mcpwm_dev_t *mcpwm, int op, int gen, mcpwm_output_action_t action) +{ + mcpwm->channel[op].generator[gen].utez = action; + mcpwm->channel[op].generator[gen].dtez = action; +} + +/** + * Set the action will be taken by a operator when its timer counts to the period value. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param op The operator to set action, 0-2. + * @param gen One generator of the operator to take the action, 0-1. + * @param action Action to take. + */ +static inline void mcpwm_ll_gen_set_period_action(mcpwm_dev_t *mcpwm, int op, int gen, mcpwm_output_action_t action) +{ + mcpwm->channel[op].generator[gen].utep = action; + mcpwm->channel[op].generator[gen].dtep = action; +} + +/** + * Set the action will be taken by a operator when its timer counts to the compare value. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param op The operator to set action, 0-2. + * @param gen One generator of the operator to take the action, 0-1. + * @param cmp_n The comparer to use. + * @param up_action The action to take when the counter is counting up. + * @param down_action The action to take when the counter is counting down. + */ +static inline void mcpwm_ll_gen_set_cmp_action(mcpwm_dev_t *mcpwm, int op, int gen, + int cmp_n, mcpwm_output_action_t up_action, mcpwm_output_action_t down_action) +{ + if (cmp_n == 0) { + mcpwm->channel[op].generator[gen].utea = up_action; + mcpwm->channel[op].generator[gen].dtea = down_action; + } else { + mcpwm->channel[op].generator[gen].uteb = up_action; + mcpwm->channel[op].generator[gen].dteb = down_action; + } +} + +/********************* Fault *******************/ +/** + * Enable the fault detection feature for an input signal. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param fault_sig One of the signals to select, 0-2. + * @param level The active level of the fault-detection signal. + */ +static inline void mcpwm_ll_fault_enable(mcpwm_dev_t *mcpwm, int fault_sig, bool level) +{ + if (fault_sig == 0) { + mcpwm->fault_detect.f0_en = 1; + mcpwm->fault_detect.f0_pole = level; + } else if (fault_sig == 1) { + mcpwm->fault_detect.f1_en = 1; + mcpwm->fault_detect.f1_pole = level; + } else { //MCPWM_SELECT_F2 + mcpwm->fault_detect.f2_en = 1; + mcpwm->fault_detect.f2_pole = level; + } +} + +/** + * Disable the fault detection of an input signal. + * @param mcpwm Address of the MCPWM peripheral registers. + * @param fault_sig The signal to disable, 0-2. + */ +static inline void mcpwm_ll_fault_disable(mcpwm_dev_t *mcpwm, int fault_sig) +{ + if (fault_sig == 0) { + mcpwm->fault_detect.f0_en = 0; + } else if (fault_sig == 1) { + mcpwm->fault_detect.f1_en = 0; + } else { //MCPWM_SELECT_F2 + mcpwm->fault_detect.f2_en = 0; + } +} + +/** + * Clear the oneshot fault status of an operator. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param op The operator to clear, 0-2. + */ +static inline void mcpwm_ll_fault_clear_ost(mcpwm_dev_t *mcpwm, int op) +{ + mcpwm->channel[op].tz_cfg1.clr_ost = 1; + mcpwm->channel[op].tz_cfg1.clr_ost = 0; +} + +/** + * Use the oneshot mode to handle the fault when it occurs + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param op The operator to handle the fault signal, 0-2. + * @param signal The fault signal to set, 0-2. + * @param enable true to enable oneshot, otherwise false. + */ +static inline void mcpwm_ll_fault_oneshot_enable_signal(mcpwm_dev_t *mcpwm, int op, int signal, bool enable) +{ + if (signal == 0) { + mcpwm->channel[op].tz_cfg0.f0_ost = enable; + } else if (signal == 1) { + mcpwm->channel[op].tz_cfg0.f1_ost = enable; + } else { //MCPWM_SELECT_F2 + mcpwm->channel[op].tz_cfg0.f2_ost = enable; + } +} + +/** + * @brief Get the oneshot enabled status of the operator + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param op The operator to check, 0-2. + * @param signal The fault signal to get, 0-2. + */ +static inline bool mcpwm_ll_fault_oneshot_signal_enabled(mcpwm_dev_t *mcpwm, int op, int signal) +{ + if (signal == 0) { + return mcpwm->channel[op].tz_cfg0.f0_ost; + } else if (signal == 1) { + return mcpwm->channel[op].tz_cfg0.f1_ost; + } else { //MCPWM_SELECT_F2 + return mcpwm->channel[op].tz_cfg0.f2_ost; + } +} + +/** + * Use the CBC (cycle-by-cycle) mode to handle the fault when it occurs. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param op The operator to handle the fault signal, 0-2. + * @param signal The fault signal to set, 0-2. + * @param enable true to enable cbc mode, otherwise false. + */ +static inline void mcpwm_ll_fault_cbc_enable_signal(mcpwm_dev_t *mcpwm, int op, int signal, bool enable) +{ + if (signal == 0) { + mcpwm->channel[op].tz_cfg0.f0_cbc = enable; + } else if (signal == 1) { + mcpwm->channel[op].tz_cfg0.f1_cbc = enable; + } else { //MCPWM_SELECT_F2 + mcpwm->channel[op].tz_cfg0.f2_cbc = enable; + } +} + +/** + * Set the action that will be taken when the fault is handled by oneshot. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param op The operator to handle the fault signal, 0-2. + * @param gen The generator to take the action, 0-1. + * @param up_action Action to take when fault happens when counting up. + * @param down_action Action to take when fault happens when counting down. + */ +static inline void mcpwm_ll_fault_set_oneshot_action(mcpwm_dev_t *mcpwm, int op, int gen, + mcpwm_output_action_t up_action, mcpwm_output_action_t down_action) +{ + if (gen == 0) { + mcpwm->channel[op].tz_cfg0.a_ost_u = up_action; + mcpwm->channel[op].tz_cfg0.a_ost_d = down_action; + } else { + mcpwm->channel[op].tz_cfg0.b_ost_u = up_action; + mcpwm->channel[op].tz_cfg0.b_ost_d = down_action; + } +} + +/** + * Set the action that will be taken when the fault is handled cycle by cycle. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param op The operator to handle the fault signal, 0-2. + * @param gen The generator to take the action, 0-1. + * @param up_action Action to take when fault happens when counting up. + * @param down_action Action to take when fault happens when counting down. + */ +static inline void mcpwm_ll_fault_set_cyc_action(mcpwm_dev_t *mcpwm, int op, int gen, + mcpwm_output_action_t up_action, mcpwm_output_action_t down_action) +{ + mcpwm->channel[op].tz_cfg1.cbcpulse = BIT(0); //immediately + if (gen == 0) { + mcpwm->channel[op].tz_cfg0.a_cbc_u = up_action; + mcpwm->channel[op].tz_cfg0.a_cbc_d = down_action; + } else { + mcpwm->channel[op].tz_cfg0.b_cbc_u = up_action; + mcpwm->channel[op].tz_cfg0.b_cbc_d = down_action; + } +} + +/********************* Dead Zone (deadtime) *******************/ +/** + * Initialize the dead zone feature. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param op The operator to initialize, 0-2. + */ +static inline void mcpwm_ll_deadtime_init(mcpwm_dev_t *mcpwm, int op) +{ + mcpwm->channel[op].db_cfg.fed_upmethod = BIT(0); + mcpwm->channel[op].db_cfg.red_upmethod = BIT(0); + mcpwm->channel[op].db_cfg.clk_sel = 0; +} + +/** + * Set the output dead zone mode applying to the outputs of a timer. + * + * If the desired internal connection is not provided, you can write your own inside this function. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param op The operator to set, 0-2. + * @param mode Dead zone mode to use. + */ +static inline void mcpwm_ll_set_deadtime_mode(mcpwm_dev_t *mcpwm, + int op, mcpwm_deadtime_type_t mode) +{ +#define MCPWM_LL_DEADTIME_REG_MASK (MCPWM_DT0_DEB_MODE_M | MCPWM_DT0_A_OUTSWAP_M | MCPWM_DT0_B_OUTSWAP_M | \ + MCPWM_DT0_RED_INSEL_M | MCPWM_DT0_FED_INSEL_M | MCPWM_DT0_RED_OUTINVERT_M | MCPWM_DT0_FED_OUTINVERT_M | \ + MCPWM_DT0_A_OUTBYPASS_M | MCPWM_DT0_B_OUTBYPASS_M) + + static uint32_t deadtime_mode_settings[MCPWM_DEADTIME_TYPE_MAX] = { + [MCPWM_BYPASS_RED] = 0b010010000 << MCPWM_DT0_DEB_MODE_S, + [MCPWM_BYPASS_FED] = 0b100000000 << MCPWM_DT0_DEB_MODE_S, + [MCPWM_ACTIVE_HIGH_MODE] = 0b000010000 << MCPWM_DT0_DEB_MODE_S, + [MCPWM_ACTIVE_LOW_MODE] = 0b001110000 << MCPWM_DT0_DEB_MODE_S, + [MCPWM_ACTIVE_HIGH_COMPLIMENT_MODE] = 0b001010000 << MCPWM_DT0_DEB_MODE_S, + [MCPWM_ACTIVE_LOW_COMPLIMENT_MODE] = 0b000101000 << MCPWM_DT0_DEB_MODE_S, + [MCPWM_ACTIVE_RED_FED_FROM_PWMXA] = 0b000000011 << MCPWM_DT0_DEB_MODE_S, + [MCPWM_ACTIVE_RED_FED_FROM_PWMXB] = 0b000001011 << MCPWM_DT0_DEB_MODE_S, + [MCPWM_DEADTIME_BYPASS] = 0b110000000 << MCPWM_DT0_DEB_MODE_S, + }; + mcpwm->channel[op].db_cfg.val = + (mcpwm->channel[op].db_cfg.val & (~MCPWM_LL_DEADTIME_REG_MASK)) | deadtime_mode_settings[mode]; + +#undef MCPWM_LL_DEADTIME_REG_MASK +} + +/** + * Set the delay of the falling edge on the output. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param op The operator to set, 0-2. + * @param fed Falling delay, by PWM main clock. + */ +static inline void mcpwm_ll_deadtime_set_falling_delay(mcpwm_dev_t *mcpwm, int op, uint32_t fed) +{ + mcpwm->channel[op].db_fed_cfg.fed = fed; +} + +/** + * Set the delay of the rising edge on the output. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param op The operator to set, 0-2. + * @param fed Rising delay, by PWM main clock. + */ +static inline void mcpwm_ll_deadtime_set_rising_delay(mcpwm_dev_t *mcpwm, int op, uint32_t red) +{ + mcpwm->channel[op].db_red_cfg.red = red; +} + +/** + * Disable (bypass) the dead zone feature. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param op The operator to set, 0-2. + */ +static inline void mcpwm_ll_deadtime_bypass(mcpwm_dev_t *mcpwm, int op) +{ + mcpwm_ll_set_deadtime_mode(mcpwm, op, MCPWM_DEADTIME_BYPASS); +} + +/********************* Carrier *******************/ +/** + * Initialize the carrier feature. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param op The operator to set, 0-2. + */ +static inline void mcpwm_ll_carrier_init(mcpwm_dev_t *mcpwm, int op) +{ + mcpwm->channel[op].carrier_cfg.in_invert = 0; +} + +/** + * Enable the carrier feature for a timer. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param op The operator to set, 0-2. + * @param enable true to enable, otherwise false. + */ +static inline void mcpwm_ll_carrier_enable(mcpwm_dev_t *mcpwm, int op, bool enable) +{ + mcpwm->channel[op].carrier_cfg.en = enable; +} + +/** + * Set the prescale of the carrier timer. + * + * The carrier period will be Frequency of PWM main clock/(carrier_period+1). + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param op The operator to set, 0-2. + * @param carrier_period The prescale of the carrier clock, 0-15. + */ +static inline void mcpwm_ll_carrier_set_prescale(mcpwm_dev_t *mcpwm, int op, uint8_t carrier_period) +{ + mcpwm->channel[op].carrier_cfg.prescale = carrier_period; +} + +/** + * Set the duty rate of the carrier. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param op The operator to set, 0-2. + * @param carrier_duty Duty rate will be (carrier_duty/8)*100%. 0-7. + */ +static inline void mcpwm_ll_carrier_set_duty(mcpwm_dev_t *mcpwm, int op, uint8_t carrier_duty) +{ + mcpwm->channel[op].carrier_cfg.duty = carrier_duty; +} + +/** + * Invert output of the carrier. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param op The operator to set, 0-2. + * @param invert true to invert, otherwise false. + */ +static inline void mcpwm_ll_carrier_out_invert(mcpwm_dev_t *mcpwm, int op, bool invert) +{ + mcpwm->channel[op].carrier_cfg.out_invert = invert; +} + +/** + * Set the oneshot pulse width of the carrier. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param op The operator to set, 0-2. + * @param pulse_width The width of the oneshot pulse, by carrier period. 0 to disable the oneshot pulse. + */ +static inline void mcpwm_ll_carrier_set_oneshot_width(mcpwm_dev_t *mcpwm, int op, uint8_t pulse_width) +{ + mcpwm->channel[op].carrier_cfg.oshtwth = pulse_width; +} + +/********************* Capture *******************/ +/** + * Enable the capture feature for a signal + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param cap_sig Signal to enable, 0-2. + * @param enable true to enable, otherwise false. + */ +static inline void mcpwm_ll_capture_enable(mcpwm_dev_t *mcpwm, int cap_sig, int enable) +{ + if (enable) { + mcpwm->cap_timer_cfg.timer_en = 1; + mcpwm->cap_cfg_ch[cap_sig].en = 1; + } else { + mcpwm->cap_cfg_ch[cap_sig].en = 0; + } +} + +/** + * Get the captured value. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param cap_sig Of which signal to get the captured value. + * @return The captured value + */ +static inline uint32_t mcpwm_ll_get_capture_val(mcpwm_dev_t *mcpwm, int cap_sig) +{ + return mcpwm->cap_val_ch[cap_sig]; +} + +/** + * Get the set capture edge. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param cap_sig Which signal the edge capture is applied. + * @return Capture signal edge: 1 - positive edge, 2 - negtive edge + */ +static inline mcpwm_capture_on_edge_t mcpwm_ll_get_captured_edge(mcpwm_dev_t *mcpwm, int cap_sig) +{ + bool edge; + if (cap_sig == 0) { + edge = mcpwm->cap_status.cap0_edge; + } else if (cap_sig == 1) { + edge = mcpwm->cap_status.cap0_edge; + } else { //2 + edge = mcpwm->cap_status.cap0_edge; + } + return (edge? MCPWM_NEG_EDGE: MCPWM_POS_EDGE); +} + +STATIC_HAL_REG_CHECK(MCPWM, MCPWM_NEG_EDGE, BIT(0)); +STATIC_HAL_REG_CHECK(MCPWM, MCPWM_POS_EDGE, BIT(1)); + +/** + * Select the edge to capture. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param cap_sig The signal to capture, 0-2. + * @param cap_edge The edge to capture, bitwise. + */ +static inline void mcpwm_ll_capture_select_edge(mcpwm_dev_t *mcpwm, int cap_sig, + mcpwm_capture_on_edge_t cap_edge) +{ + mcpwm->cap_cfg_ch[cap_sig].mode = cap_edge; +} + +/** + * Set the prescale of the input signal to capture. + * + * @param mcpwm Address of the MCPWM peripheral registers. + * @param cap_sig The prescaled signal to capture, 0-2. + * @param prescale Prescal value, 0 to disable. + */ +static inline void mcpwm_ll_capture_set_prescale(mcpwm_dev_t *mcpwm, int cap_sig, uint32_t prescale) +{ + mcpwm->cap_cfg_ch[cap_sig].prescale = prescale; +} + +/** + * Utility function, get the `mcpwm_intr_t` interrupt enum of a specific capture signal. + * + * @param bit x for CAPx. + * @return the corresponding `mcpwm_intr_t`. + */ +static inline mcpwm_intr_t mcpwm_ll_get_cap_intr_def(int bit) +{ + return BIT(bit+MCPWM_CAP0_INT_RAW_S); +} diff --git a/arch/xtensa/include/esp32/soc/esp32/include/hal/pcnt_ll.h b/arch/xtensa/include/esp32/soc/esp32/include/hal/pcnt_ll.h new file mode 100644 index 0000000000000..c1a2e55cb01de --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/hal/pcnt_ll.h @@ -0,0 +1,301 @@ +// 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. + +/******************************************************************************* + * NOTICE + * The hal is not public api, don't use in application code. + * See readme.md in soc/include/hal/readme.md + ******************************************************************************/ + +// The LL layer for ESP32 PCNT register operations + +#pragma once + +#include "soc/pcnt_periph.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) + +/** + * @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) +{ + 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; + conf0_reg.ch0_hctrl_mode = hctrl_mode; + conf0_reg.ch0_lctrl_mode = lctrl_mode; + } else { + conf0_reg.ch1_pos_mode = pos_mode; + conf0_reg.ch1_neg_mode = neg_mode; + conf0_reg.ch1_hctrl_mode = hctrl_mode; + conf0_reg.ch1_lctrl_mode = lctrl_mode; + } + hw->conf_unit[unit].conf0 = conf0_reg; +} + +/** + * @brief Get pulse counter value + * + * @param hw Peripheral PCNT hardware instance address. + * @param unit Pulse Counter unit number + * @param count Pointer to accept counter value + */ +static inline void pcnt_ll_get_counter_value(pcnt_dev_t *hw, pcnt_unit_t unit, int16_t *count) +{ + *count = (int16_t) hw->cnt_unit[unit].cnt_val; +} + +/** + * @brief Pause PCNT counter of PCNT unit + * + * @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) +{ + hw->ctrl.val |= BIT(PCNT_CNT_PAUSE_U0_S + (unit * 2)); +} + +/** + * @brief Resume counting for PCNT counter + * + * @param hw Peripheral PCNT hardware instance address. + * @param unit PCNT unit number, select from pcnt_unit_t + */ +static inline void pcnt_ll_counter_resume(pcnt_dev_t *hw, pcnt_unit_t unit) +{ + hw->ctrl.val &= (~(BIT(PCNT_CNT_PAUSE_U0_S + (unit * 2)))); +} + +/** + * @brief Clear and reset PCNT counter value to zero + * + * @param hw Peripheral PCNT hardware instance address. + * @param unit PCNT unit number, select from pcnt_unit_t + */ +static inline void pcnt_ll_counter_clear(pcnt_dev_t *hw, pcnt_unit_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; +} + +/** + * @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 hw Peripheral PCNT hardware instance address. + * @param unit PCNT unit number + */ +static inline void pcnt_ll_intr_enable(pcnt_dev_t *hw, pcnt_unit_t unit) +{ + 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))); +} + +/** + * @brief Get PCNT interrupt status + * + * @param hw Peripheral PCNT hardware instance address. + * @param status Pointer to accept value + */ +static inline void pcnt_ll_get_intr_status(pcnt_dev_t *hw, uint32_t *status) +{ + *status = hw->int_st.val; +} + +/** + * @brief Clear PCNT interrupt 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) +{ + hw->int_clr.val = status; +} + +/** + * @brief Enable PCNT event of PCNT unit + * + * @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). + */ +static inline void pcnt_ll_event_enable(pcnt_dev_t *hw, pcnt_unit_t unit, pcnt_evt_type_t evt_type) +{ + 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; + } +} + +/** + * @brief Disable PCNT event of PCNT unit + * + * @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). + */ +static inline void pcnt_ll_event_disable(pcnt_dev_t *hw, pcnt_unit_t unit, pcnt_evt_type_t evt_type) +{ + 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; + } +} + +/** + * @brief Set PCNT event value of PCNT unit + * + * @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 + */ +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) +{ + 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; + } +} + +/** + * @brief Get PCNT event value of PCNT unit + * + * @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 + */ +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) +{ + 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; + } else { + *value = 0; + } +} + +/** + * @brief Set PCNT filter value + * + * @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) +{ + hw->conf_unit[unit].conf0.filter_thres = filter_val; +} + +/** + * @brief Get PCNT filter value + * + * @param hw Peripheral PCNT hardware instance address. + * @param unit PCNT unit number + * @param filter_val Pointer to accept PCNT filter value. + */ +static inline void pcnt_ll_get_filter_value(pcnt_dev_t *hw, pcnt_unit_t unit, uint16_t *filter_val) +{ + *filter_val = hw->conf_unit[unit].conf0.filter_thres; +} + +/** + * @brief Enable PCNT input filter + * + * @param hw Peripheral PCNT hardware instance address. + * @param unit PCNT unit number + */ +static inline void pcnt_ll_filter_enable(pcnt_dev_t *hw, pcnt_unit_t unit) +{ + 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; +} + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/arch/xtensa/include/esp32/soc/esp32/include/hal/rmt_ll.h b/arch/xtensa/include/esp32/soc/esp32/include/hal/rmt_ll.h new file mode 100644 index 0000000000000..1749b2be37a30 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/hal/rmt_ll.h @@ -0,0 +1,297 @@ +// 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 + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "soc/rmt_struct.h" +#include "soc/rmt_caps.h" + +static inline void rmt_ll_reset_counter_clock_div(rmt_dev_t *dev, uint32_t channel) +{ + dev->conf_ch[channel].conf1.ref_cnt_rst = 1; + dev->conf_ch[channel].conf1.ref_cnt_rst = 0; +} + +static inline void rmt_ll_reset_tx_pointer(rmt_dev_t *dev, uint32_t channel) +{ + dev->conf_ch[channel].conf1.mem_rd_rst = 1; + dev->conf_ch[channel].conf1.mem_rd_rst = 0; +} + +static inline void rmt_ll_reset_rx_pointer(rmt_dev_t *dev, uint32_t channel) +{ + dev->conf_ch[channel].conf1.mem_wr_rst = 1; + dev->conf_ch[channel].conf1.mem_wr_rst = 0; +} + +static inline void rmt_ll_start_tx(rmt_dev_t *dev, uint32_t channel) +{ + dev->conf_ch[channel].conf1.tx_start = 1; +} + +static inline void rmt_ll_stop_tx(rmt_dev_t *dev, uint32_t channel) +{ + RMTMEM.chan[channel].data32[0].val = 0; + dev->conf_ch[channel].conf1.tx_start = 0; + dev->conf_ch[channel].conf1.mem_rd_rst = 1; + dev->conf_ch[channel].conf1.mem_rd_rst = 0; +} + +static inline void rmt_ll_enable_rx(rmt_dev_t *dev, uint32_t channel, bool enable) +{ + dev->conf_ch[channel].conf1.rx_en = enable; +} + +static inline void rmt_ll_power_down_mem(rmt_dev_t *dev, uint32_t channel, bool enable) +{ + dev->conf_ch[channel].conf0.mem_pd = enable; +} + +static inline bool rmt_ll_is_mem_power_down(rmt_dev_t *dev, uint32_t channel) +{ + return dev->conf_ch[channel].conf0.mem_pd; +} + +static inline void rmt_ll_set_mem_blocks(rmt_dev_t *dev, uint32_t channel, uint8_t block_num) +{ + dev->conf_ch[channel].conf0.mem_size = block_num; +} + +static inline uint32_t rmt_ll_get_mem_blocks(rmt_dev_t *dev, uint32_t channel) +{ + return dev->conf_ch[channel].conf0.mem_size; +} + +static inline void rmt_ll_set_counter_clock_div(rmt_dev_t *dev, uint32_t channel, uint32_t div) +{ + dev->conf_ch[channel].conf0.div_cnt = div; +} + +static inline uint32_t rmt_ll_get_counter_clock_div(rmt_dev_t *dev, uint32_t channel) +{ + return dev->conf_ch[channel].conf0.div_cnt; +} + +static inline void rmt_ll_enable_tx_pingpong(rmt_dev_t *dev, bool enable) +{ + dev->apb_conf.mem_tx_wrap_en = enable; +} + +static inline void rmt_ll_enable_mem_access(rmt_dev_t *dev, bool enable) +{ + dev->apb_conf.fifo_mask = enable; +} + +static inline void rmt_ll_set_rx_idle_thres(rmt_dev_t *dev, uint32_t channel, uint32_t thres) +{ + dev->conf_ch[channel].conf0.idle_thres = thres; +} + +static inline uint32_t rmt_ll_get_rx_idle_thres(rmt_dev_t *dev, uint32_t channel) +{ + return dev->conf_ch[channel].conf0.idle_thres; +} + +static inline void rmt_ll_set_mem_owner(rmt_dev_t *dev, uint32_t channel, uint8_t owner) +{ + dev->conf_ch[channel].conf1.mem_owner = owner; +} + +static inline uint32_t rmt_ll_get_mem_owner(rmt_dev_t *dev, uint32_t channel) +{ + return dev->conf_ch[channel].conf1.mem_owner; +} + +static inline void rmt_ll_enable_tx_cyclic(rmt_dev_t *dev, uint32_t channel, bool enable) +{ + dev->conf_ch[channel].conf1.tx_conti_mode = enable; +} + +static inline bool rmt_ll_is_tx_cyclic_enabled(rmt_dev_t *dev, uint32_t channel) +{ + return dev->conf_ch[channel].conf1.tx_conti_mode; +} + +static inline void rmt_ll_enable_rx_filter(rmt_dev_t *dev, uint32_t channel, bool enable) +{ + dev->conf_ch[channel].conf1.rx_filter_en = enable; +} + +static inline void rmt_ll_set_rx_filter_thres(rmt_dev_t *dev, uint32_t channel, uint32_t thres) +{ + dev->conf_ch[channel].conf1.rx_filter_thres = thres; +} + +static inline void rmt_ll_set_counter_clock_src(rmt_dev_t *dev, uint32_t channel, uint8_t src) +{ + dev->conf_ch[channel].conf1.ref_always_on = src; +} + +static inline uint32_t rmt_ll_get_counter_clock_src(rmt_dev_t *dev, uint32_t channel) +{ + return dev->conf_ch[channel].conf1.ref_always_on; +} + +static inline void rmt_ll_enable_tx_idle(rmt_dev_t *dev, uint32_t channel, bool enable) +{ + dev->conf_ch[channel].conf1.idle_out_en = enable; +} + +static inline bool rmt_ll_is_tx_idle_enabled(rmt_dev_t *dev, uint32_t channel) +{ + return dev->conf_ch[channel].conf1.idle_out_en; +} + +static inline void rmt_ll_set_tx_idle_level(rmt_dev_t *dev, uint32_t channel, uint8_t level) +{ + dev->conf_ch[channel].conf1.idle_out_lv = level; +} + +static inline uint32_t rmt_ll_get_tx_idle_level(rmt_dev_t *dev, uint32_t channel) +{ + return dev->conf_ch[channel].conf1.idle_out_lv; +} + +static inline uint32_t rmt_ll_get_channel_status(rmt_dev_t *dev, uint32_t channel) +{ + return dev->status_ch[channel]; +} + +static inline void rmt_ll_set_tx_limit(rmt_dev_t *dev, uint32_t channel, uint32_t limit) +{ + dev->tx_lim_ch[channel].limit = limit; +} + +static inline void rmt_ll_enable_tx_end_interrupt(rmt_dev_t *dev, uint32_t channel, bool enable) +{ + dev->int_ena.val &= ~(1 << (channel * 3)); + dev->int_ena.val |= (enable << (channel * 3)); +} + +static inline void rmt_ll_enable_rx_end_interrupt(rmt_dev_t *dev, uint32_t channel, bool enable) +{ + dev->int_ena.val &= ~(1 << (channel * 3 + 1)); + dev->int_ena.val |= (enable << (channel * 3 + 1)); +} + +static inline void rmt_ll_enable_err_interrupt(rmt_dev_t *dev, uint32_t channel, bool enable) +{ + dev->int_ena.val &= ~(1 << (channel * 3 + 2)); + dev->int_ena.val |= (enable << (channel * 3 + 2)); +} + +static inline void rmt_ll_enable_tx_thres_interrupt(rmt_dev_t *dev, uint32_t channel, bool enable) +{ + dev->int_ena.val &= ~(1 << (channel + 24)); + dev->int_ena.val |= (enable << (channel + 24)); +} + +static inline void rmt_ll_clear_tx_end_interrupt(rmt_dev_t *dev, uint32_t channel) +{ + dev->int_clr.val = (1 << (channel * 3)); +} + +static inline void rmt_ll_clear_rx_end_interrupt(rmt_dev_t *dev, uint32_t channel) +{ + dev->int_clr.val = (1 << (channel * 3 + 1)); +} + +static inline void rmt_ll_clear_err_interrupt(rmt_dev_t *dev, uint32_t channel) +{ + dev->int_clr.val = (1 << (channel * 3 + 2)); +} + +static inline void rmt_ll_clear_tx_thres_interrupt(rmt_dev_t *dev, uint32_t channel) +{ + dev->int_clr.val = (1 << (channel + 24)); +} + +static inline uint32_t rmt_ll_get_tx_end_interrupt_status(rmt_dev_t *dev) +{ + uint32_t status = dev->int_st.val; + return ((status & 0x01) >> 0) | ((status & 0x08) >> 2) | ((status & 0x40) >> 4) | ((status & 0x200) >> 6) | + ((status & 0x1000) >> 8) | ((status & 0x8000) >> 10) | ((status & 0x40000) >> 12) | ((status & 0x200000) >> 14); +} + +static inline uint32_t rmt_ll_get_rx_end_interrupt_status(rmt_dev_t *dev) +{ + uint32_t status = dev->int_st.val; + return ((status & 0x02) >> 1) | ((status & 0x10) >> 3) | ((status & 0x80) >> 5) | ((status & 0x400) >> 7) | + ((status & 0x2000) >> 9) | ((status & 0x10000) >> 11) | ((status & 0x80000) >> 13) | ((status & 0x400000) >> 15); +} + +static inline uint32_t rmt_ll_get_err_interrupt_status(rmt_dev_t *dev) +{ + uint32_t status = dev->int_st.val; + return ((status & 0x04) >> 2) | ((status & 0x20) >> 4) | ((status & 0x100) >> 6) | ((status & 0x800) >> 8) | + ((status & 0x4000) >> 10) | ((status & 0x20000) >> 12) | ((status & 0x100000) >> 14) | ((status & 0x800000) >> 16); +} + +static inline uint32_t rmt_ll_get_tx_thres_interrupt_status(rmt_dev_t *dev) +{ + uint32_t status = dev->int_st.val; + return (status & 0xFF000000) >> 24; +} + +static inline void rmt_ll_set_carrier_high_low_ticks(rmt_dev_t *dev, uint32_t channel, uint32_t high_ticks, uint32_t low_ticks) +{ + dev->carrier_duty_ch[channel].high = high_ticks; + dev->carrier_duty_ch[channel].low = low_ticks; +} + +static inline void rmt_ll_get_carrier_high_low_ticks(rmt_dev_t *dev, uint32_t channel, uint32_t *high_ticks, uint32_t *low_ticks) +{ + *high_ticks = dev->carrier_duty_ch[channel].high; + *low_ticks = dev->carrier_duty_ch[channel].low; +} + +static inline void rmt_ll_enable_tx_carrier(rmt_dev_t *dev, uint32_t channel, bool enable) +{ + dev->conf_ch[channel].conf0.carrier_en = enable; +} + +static inline void rmt_ll_set_carrier_to_level(rmt_dev_t *dev, uint32_t channel, uint8_t level) +{ + dev->conf_ch[channel].conf0.carrier_out_lv = level; +} + +static inline void rmt_ll_write_memory(rmt_mem_t *mem, uint32_t channel, const rmt_item32_t *data, uint32_t length, uint32_t off) +{ + length = (off + length) > RMT_CHANNEL_MEM_WORDS ? (RMT_CHANNEL_MEM_WORDS - off) : length; + for (uint32_t i = 0; i < length; i++) { + mem->chan[channel].data32[i + off].val = data[i].val; + } +} + +/************************************************************************************************ + * Following Low Level APIs only used for backward compatible, will be deprecated in the future! + ***********************************************************************************************/ + +static inline void rmt_ll_set_intr_enable_mask(uint32_t mask) +{ + RMT.int_ena.val |= mask; +} + +static inline void rmt_ll_clr_intr_enable_mask(uint32_t mask) +{ + RMT.int_ena.val &= (~mask); +} + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/esp32/include/hal/rtc_io_ll.h b/arch/xtensa/include/esp32/soc/esp32/include/hal/rtc_io_ll.h new file mode 100644 index 0000000000000..760c1d90c3a61 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/hal/rtc_io_ll.h @@ -0,0 +1,348 @@ +// 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. + +/******************************************************************************* + * NOTICE + * The ll is not public api, don't use in application code. + * See readme.md in soc/include/hal/readme.md + ******************************************************************************/ + +#pragma once + +#include +#include "soc/rtc_io_periph.h" +#include "hal/rtc_io_types.h" + +typedef enum { + RTCIO_FUNC_RTC = 0x0, /*!< The pin controled by RTC module. */ + RTCIO_FUNC_DIGITAL = 0x1, /*!< The pin controlled by DIGITAL module. */ +} rtcio_ll_func_t; + +typedef enum { + RTCIO_WAKEUP_DISABLE = 0, /*!< Disable GPIO interrupt */ + RTCIO_WAKEUP_LOW_LEVEL = 0x4, /*!< GPIO interrupt type : input low level trigger */ + RTCIO_WAKEUP_HIGH_LEVEL = 0x5, /*!< GPIO interrupt type : input high level trigger */ +} rtcio_ll_wake_type_t; + +typedef enum { + RTCIO_OUTPUT_NORMAL = 0, /*!< RTCIO output mode is normal. */ + RTCIO_OUTPUT_OD = 0x1, /*!< RTCIO output mode is open-drain. */ +} rtcio_ll_out_mode_t; + +/** + * @brief Select the rtcio function. + * + * @note The RTC function must be selected before the pad analog function is enabled. + * @param rtcio_num The index of rtcio. 0 ~ MAX(rtcio). + * @param func Select pin function. + */ +static inline void rtcio_ll_function_select(int rtcio_num, rtcio_ll_func_t func) +{ + if (func == RTCIO_FUNC_RTC) { + // 0: GPIO connected to digital GPIO module. 1: GPIO connected to analog RTC module. + SET_PERI_REG_MASK(rtc_io_desc[rtcio_num].reg, (rtc_io_desc[rtcio_num].mux)); + //0:RTC FUNCTION 1,2,3:Reserved + SET_PERI_REG_BITS(rtc_io_desc[rtcio_num].reg, RTC_IO_TOUCH_PAD1_FUN_SEL_V, SOC_PIN_FUNC_RTC_IO, rtc_io_desc[rtcio_num].func); + } else if (func == RTCIO_FUNC_DIGITAL) { + CLEAR_PERI_REG_MASK(rtc_io_desc[rtcio_num].reg, (rtc_io_desc[rtcio_num].mux)); + } +} + +/** + * Enable rtcio output. + * + * @param rtcio_num The index of rtcio. 0 ~ MAX(rtcio). + */ +static inline void rtcio_ll_output_enable(int rtcio_num) +{ + RTCIO.enable_w1ts.w1ts = (1U << rtcio_num); +} + +/** + * Disable rtcio output. + * + * @param rtcio_num The index of rtcio. 0 ~ MAX(rtcio). + */ +static inline void rtcio_ll_output_disable(int rtcio_num) +{ + RTCIO.enable_w1tc.w1tc = (1U << rtcio_num); +} + +/** + * Set RTCIO output level. + * + * @param rtcio_num The index of rtcio. 0 ~ MAX(rtcio). + * @param level 0: output low; ~0: output high. + */ +static inline void rtcio_ll_set_level(int rtcio_num, uint32_t level) +{ + if (level) { + RTCIO.out_w1ts.w1ts = (1U << rtcio_num); + } else { + RTCIO.out_w1tc.w1tc = (1U << rtcio_num); + } +} + +/** + * Enable rtcio input. + * + * @param rtcio_num The index of rtcio. 0 ~ MAX(rtcio). + */ +static inline void rtcio_ll_input_enable(int rtcio_num) +{ + SET_PERI_REG_MASK(rtc_io_desc[rtcio_num].reg, rtc_io_desc[rtcio_num].ie); +} + +/** + * Disable rtcio input. + * + * @param rtcio_num The index of rtcio. 0 ~ MAX(rtcio). + */ +static inline void rtcio_ll_input_disable(int rtcio_num) +{ + CLEAR_PERI_REG_MASK(rtc_io_desc[rtcio_num].reg, rtc_io_desc[rtcio_num].ie); +} + +/** + * Get RTCIO input level. + * + * @param rtcio_num The index of rtcio. 0 ~ MAX(rtcio). + * @return 0: input low; ~0: input high. + */ +static inline uint32_t rtcio_ll_get_level(int rtcio_num) +{ + return (uint32_t)(RTCIO.in_val.in >> rtcio_num) & 0x1; +} + +/** + * @brief Set RTC GPIO pad drive capability + * + * @param rtcio_num The index of rtcio. 0 ~ MAX(rtcio). + * @param strength Drive capability of the pad. Range: 0 ~ 3. + */ +static inline void rtcio_ll_set_drive_capability(int rtcio_num, uint32_t strength) +{ + if (rtc_io_desc[rtcio_num].drv_v) { + SET_PERI_REG_BITS(rtc_io_desc[rtcio_num].reg, rtc_io_desc[rtcio_num].drv_v, strength, rtc_io_desc[rtcio_num].drv_s); + } +} + +/** + * @brief Get RTC GPIO pad drive capability. + * + * @param rtcio_num The index of rtcio. 0 ~ MAX(rtcio). + * @return Drive capability of the pad. Range: 0 ~ 3. + */ +static inline uint32_t rtcio_ll_get_drive_capability(int rtcio_num) +{ + return GET_PERI_REG_BITS2(rtc_io_desc[rtcio_num].reg, rtc_io_desc[rtcio_num].drv_v, rtc_io_desc[rtcio_num].drv_s); +} + +/** + * @brief Set RTC GPIO pad output mode. + * + * @param rtcio_num The index of rtcio. 0 ~ MAX(rtcio). + * @return mode Output mode. + */ +static inline void rtcio_ll_output_mode_set(int rtcio_num, rtcio_ll_out_mode_t mode) +{ + RTCIO.pin[rtcio_num].pad_driver = mode; +} + +/** + * RTC GPIO pullup enable. + * + * @param rtcio_num The index of rtcio. 0 ~ MAX(rtcio). + */ +static inline void rtcio_ll_pullup_enable(int rtcio_num) +{ + if (rtc_io_desc[rtcio_num].pullup) { + SET_PERI_REG_MASK(rtc_io_desc[rtcio_num].reg, rtc_io_desc[rtcio_num].pullup); + } +} + +/** + * RTC GPIO pullup disable. + * + * @param rtcio_num The index of rtcio. 0 ~ MAX(rtcio). + */ +static inline void rtcio_ll_pullup_disable(int rtcio_num) +{ + if (rtc_io_desc[rtcio_num].pullup) { + CLEAR_PERI_REG_MASK(rtc_io_desc[rtcio_num].reg, rtc_io_desc[rtcio_num].pullup); + } +} + +/** + * RTC GPIO pulldown enable. + * + * @param rtcio_num The index of rtcio. 0 ~ MAX(rtcio). + */ +static inline void rtcio_ll_pulldown_enable(int rtcio_num) +{ + if (rtc_io_desc[rtcio_num].pulldown) { + SET_PERI_REG_MASK(rtc_io_desc[rtcio_num].reg, rtc_io_desc[rtcio_num].pulldown); + } +} + +/** + * RTC GPIO pulldown disable. + * + * @param rtcio_num The index of rtcio. 0 ~ MAX(rtcio). + */ +static inline void rtcio_ll_pulldown_disable(int rtcio_num) +{ + if (rtc_io_desc[rtcio_num].pulldown) { + CLEAR_PERI_REG_MASK(rtc_io_desc[rtcio_num].reg, rtc_io_desc[rtcio_num].pulldown); + } +} + +/** + * Enable force hold function for RTC IO pad. + * + * Enabling HOLD function will cause the pad to lock current status, such as, + * input/output enable, input/output value, function, drive strength values. + * This function is useful when going into light or deep sleep mode to prevent + * the pin configuration from changing. + * + * @param rtcio_num The index of rtcio. 0 ~ MAX(rtcio). + */ +static inline void rtcio_ll_force_hold_enable(int rtcio_num) +{ + REG_SET_BIT(RTC_CNTL_HOLD_FORCE_REG, rtc_io_desc[rtcio_num].hold_force); +} + +/** + * Disable hold function on an RTC IO pad + * + * @note If disable the pad hold, the status of pad maybe changed in sleep mode. + * @param rtcio_num The index of rtcio. 0 ~ MAX(rtcio). + */ +static inline void rtcio_ll_force_hold_disable(int rtcio_num) +{ + REG_CLR_BIT(RTC_CNTL_HOLD_FORCE_REG, rtc_io_desc[rtcio_num].hold_force); +} + +/** + * Enable force hold function for RTC IO pad. + * + * Enabling HOLD function will cause the pad to lock current status, such as, + * input/output enable, input/output value, function, drive strength values. + * This function is useful when going into light or deep sleep mode to prevent + * the pin configuration from changing. + * + * @param rtcio_num The index of rtcio. 0 ~ MAX(rtcio). + */ +static inline void rtcio_ll_force_hold_all(void) +{ + SET_PERI_REG_BITS(RTC_CNTL_HOLD_FORCE_REG, 0x3FFFF, 0x3FFFF, 0); +} + +/** + * Disable hold function on an RTC IO pad + * + * @note If disable the pad hold, the status of pad maybe changed in sleep mode. + * @param rtcio_num The index of rtcio. 0 ~ MAX(rtcio). + */ +static inline void rtcio_ll_force_unhold_all(void) +{ + SET_PERI_REG_BITS(RTC_CNTL_HOLD_FORCE_REG, 0x3FFFF, 0, 0); +} + +/** + * Enable wakeup function and set wakeup type from light sleep status for rtcio. + * + * @param rtcio_num The index of rtcio. 0 ~ MAX(rtcio). + * @param type Wakeup on high level or low level. + */ +static inline void rtcio_ll_wakeup_enable(int rtcio_num, rtcio_ll_wake_type_t type) +{ + RTCIO.pin[rtcio_num].wakeup_enable = 0x1; + RTCIO.pin[rtcio_num].int_type = type; +} + +/** + * Disable wakeup function from light sleep status for rtcio. + * + * @param rtcio_num The index of rtcio. 0 ~ MAX(rtcio). + */ +static inline void rtcio_ll_wakeup_disable(int rtcio_num) +{ + RTCIO.pin[rtcio_num].wakeup_enable = 0; + RTCIO.pin[rtcio_num].int_type = RTCIO_WAKEUP_DISABLE; +} + +/** + * Enable rtc io output in deep sleep. + * + * @param rtcio_num The index of rtcio. 0 ~ MAX(rtcio). + */ +static inline void rtcio_ll_enable_output_in_sleep(gpio_num_t gpio_num) +{ + if (rtc_io_desc[gpio_num].slpoe) { + SET_PERI_REG_MASK(rtc_io_desc[gpio_num].reg, rtc_io_desc[gpio_num].slpoe); + } +} + +/** + * Disable rtc io output in deep sleep. + * + * @param rtcio_num The index of rtcio. 0 ~ MAX(rtcio). + */ +static inline void rtcio_ll_in_sleep_disable_output(gpio_num_t gpio_num) +{ + if (rtc_io_desc[gpio_num].slpoe) { + CLEAR_PERI_REG_MASK(rtc_io_desc[gpio_num].reg, rtc_io_desc[gpio_num].slpoe); + } +} + +/** + * Enable rtc io input in deep sleep. + * + * @param rtcio_num The index of rtcio. 0 ~ MAX(rtcio). + */ +static inline void rtcio_ll_in_sleep_enable_input(gpio_num_t gpio_num) +{ + SET_PERI_REG_MASK(rtc_io_desc[gpio_num].reg, rtc_io_desc[gpio_num].slpie); +} + +/** + * Disable rtc io input in deep sleep. + * + * @param rtcio_num The index of rtcio. 0 ~ MAX(rtcio). + */ +static inline void rtcio_ll_in_sleep_disable_input(gpio_num_t gpio_num) +{ + CLEAR_PERI_REG_MASK(rtc_io_desc[gpio_num].reg, rtc_io_desc[gpio_num].slpie); +} + +/** + * Enable rtc io keep another setting in deep sleep. + * + * @param rtcio_num The index of rtcio. 0 ~ MAX(rtcio). + */ +static inline void rtcio_ll_enable_sleep_setting(gpio_num_t gpio_num) +{ + SET_PERI_REG_MASK(rtc_io_desc[gpio_num].reg, rtc_io_desc[gpio_num].slpsel); +} + +/** + * Disable rtc io keep another setting in deep sleep. (Default) + * + * @param rtcio_num The index of rtcio. 0 ~ MAX(rtcio). + */ +static inline void rtcio_ll_disable_sleep_setting(gpio_num_t gpio_num) +{ + CLEAR_PERI_REG_MASK(rtc_io_desc[gpio_num].reg, rtc_io_desc[gpio_num].slpsel); +} \ No newline at end of file diff --git a/arch/xtensa/include/esp32/soc/esp32/include/hal/sigmadelta_ll.h b/arch/xtensa/include/esp32/soc/esp32/include/hal/sigmadelta_ll.h new file mode 100644 index 0000000000000..922cbc85ee22c --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/hal/sigmadelta_ll.h @@ -0,0 +1,73 @@ +// 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. + +/******************************************************************************* + * NOTICE + * The hal is not public api, don't use in application code. + * See readme.md in soc/include/hal/readme.md + ******************************************************************************/ + +// The LL layer for ESP32 SIGMADELTA register operations + +#pragma once + +#include +#include "soc/sigmadelta_periph.h" +#include "hal/sigmadelta_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Get SIGMADELTA hardware instance with giving sigmadelta num +#define SIGMADELTA_LL_GET_HW(num) (((num) == 0) ? (&SIGMADELTA) : NULL) + +/** + * @brief Set Sigma-delta enable + * + * @param hw Peripheral SIGMADELTA hardware instance address. + * @param en Sigma-delta enable value + */ +static inline void sigmadelta_ll_set_en(gpio_sd_dev_t *hw, bool en) +{ + // The clk enable register does not exist on ESP32. +} + +/** + * @brief Set Sigma-delta channel duty. + * + * @param hw Peripheral SIGMADELTA hardware instance address. + * @param channel Sigma-delta channel number + * @param duty Sigma-delta duty of one channel, the value ranges from -128 to 127, recommended range is -90 ~ 90. + * The waveform is more like a random one in this range. + */ +static inline void sigmadelta_ll_set_duty(gpio_sd_dev_t *hw, sigmadelta_channel_t channel, int8_t duty) +{ + hw->channel[channel].duty = duty; +} + +/** + * @brief Set Sigma-delta channel's clock pre-scale value. + * + * @param hw Peripheral SIGMADELTA hardware instance address. + * @param channel Sigma-delta channel number + * @param val The divider of source clock, ranges from 0 to 255 + */ +static inline void sigmadelta_ll_set_prescale(gpio_sd_dev_t *hw, sigmadelta_channel_t channel, uint8_t prescale) +{ + hw->channel[channel].prescale = prescale; +} + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/arch/xtensa/include/esp32/soc/esp32/include/hal/spi_flash_ll.h b/arch/xtensa/include/esp32/soc/esp32/include/hal/spi_flash_ll.h new file mode 100644 index 0000000000000..d818f011ca48d --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/hal/spi_flash_ll.h @@ -0,0 +1,352 @@ +// 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. + +/******************************************************************************* + * NOTICE + * The ll is not public api, don't use in application code. + * See readme.md in soc/include/hal/readme.md + ******************************************************************************/ + +// The Lowlevel layer for SPI Flash + +#pragma once + +#include +#include "soc/spi_periph.h" +#include "hal/spi_types.h" +#include "hal/spi_flash_types.h" +#include // For MIN/MAX +#include +#include + + +//Supported clock register values +#define SPI_FLASH_LL_CLKREG_VAL_5MHZ ((spi_flash_ll_clock_reg_t){.val=0x0000F1CF}) ///< Clock set to 5 MHz +#define SPI_FLASH_LL_CLKREG_VAL_10MHZ ((spi_flash_ll_clock_reg_t){.val=0x000070C7}) ///< Clock set to 10 MHz +#define SPI_FLASH_LL_CLKREG_VAL_20MHZ ((spi_flash_ll_clock_reg_t){.val=0x00003043}) ///< Clock set to 20 MHz +#define SPI_FLASH_LL_CLKREG_VAL_26MHZ ((spi_flash_ll_clock_reg_t){.val=0x00002002}) ///< Clock set to 26 MHz +#define SPI_FLASH_LL_CLKREG_VAL_40MHZ ((spi_flash_ll_clock_reg_t){.val=0x00001001}) ///< Clock set to 40 MHz +#define SPI_FLASH_LL_CLKREG_VAL_80MHZ ((spi_flash_ll_clock_reg_t){.val=0x80000000}) ///< Clock set to 80 MHz + +/// Get the start address of SPI peripheral registers by the host ID +#define spi_flash_ll_get_hw(host_id) ((host_id)==SPI1_HOST? &SPI1:((host_id)==SPI2_HOST?&SPI2:((host_id)==SPI3_HOST?&SPI3:({abort();(spi_dev_t*)0;})))) + +/// type to store pre-calculated register value in above layers +typedef typeof(SPI1.clock) spi_flash_ll_clock_reg_t; + +/*------------------------------------------------------------------------------ + * Control + *----------------------------------------------------------------------------*/ +/** + * Reset peripheral registers before configuration and starting control + * + * @param dev Beginning address of the peripheral registers. + */ +static inline void spi_flash_ll_reset(spi_dev_t *dev) +{ + dev->user.val = 0; + dev->ctrl.val = 0; +} + +/** + * Check whether the previous operation is done. + * + * @param dev Beginning address of the peripheral registers. + * + * @return true if last command is done, otherwise false. + */ +static inline bool spi_flash_ll_cmd_is_done(const spi_dev_t *dev) +{ + return (dev->cmd.val == 0); +} + +/** + * Erase the flash chip. + * + * @param dev Beginning address of the peripheral registers. + */ +static inline void spi_flash_ll_erase_chip(spi_dev_t *dev) +{ + dev->cmd.flash_ce = 1; +} + +/** + * Erase the sector, the address should be set by spi_flash_ll_set_address. + * + * @param dev Beginning address of the peripheral registers. + */ +static inline void spi_flash_ll_erase_sector(spi_dev_t *dev) +{ + dev->ctrl.val = 0; + dev->cmd.flash_se = 1; +} + +/** + * Erase the block, the address should be set by spi_flash_ll_set_address. + * + * @param dev Beginning address of the peripheral registers. + */ +static inline void spi_flash_ll_erase_block(spi_dev_t *dev) +{ + dev->cmd.flash_be = 1; +} + +/** + * Enable/disable write protection for the flash chip. + * + * @param dev Beginning address of the peripheral registers. + * @param wp true to enable the protection, false to disable (write enable). + */ +static inline void spi_flash_ll_set_write_protect(spi_dev_t *dev, bool wp) +{ + if (wp) { + dev->cmd.flash_wrdi = 1; + } else { + dev->cmd.flash_wren = 1; + } +} + +/** + * Get the read data from the buffer after ``spi_flash_ll_read`` is done. + * + * @param dev Beginning address of the peripheral registers. + * @param buffer Buffer to hold the output data + * @param read_len Length to get out of the buffer + */ +static inline void spi_flash_ll_get_buffer_data(spi_dev_t *dev, void *buffer, uint32_t read_len) +{ + if (((intptr_t)buffer % 4 == 0) && (read_len % 4 == 0)) { + // If everything is word-aligned, do a faster memcpy + memcpy(buffer, (void *)dev->data_buf, read_len); + } else { + // Otherwise, slow(er) path copies word by word + int copy_len = read_len; + for (int i = 0; i < (read_len + 3) / 4; i++) { + int word_len = MIN(sizeof(uint32_t), copy_len); + uint32_t word = dev->data_buf[i]; + memcpy(buffer, &word, word_len); + buffer = (void *)((intptr_t)buffer + word_len); + copy_len -= word_len; + } + } +} + +/** + * Write a word to the data buffer. + * + * @param dev Beginning address of the peripheral registers. + * @param word Data to write at address 0. + */ +static inline void spi_flash_ll_write_word(spi_dev_t *dev, uint32_t word) +{ + dev->data_buf[0] = word; +} + +/** + * Set the data to be written in the data buffer. + * + * @param dev Beginning address of the peripheral registers. + * @param buffer Buffer holding the data + * @param length Length of data in bytes. + */ +static inline void spi_flash_ll_set_buffer_data(spi_dev_t *dev, const void *buffer, uint32_t length) +{ + // Load data registers, word at a time + int num_words = (length + 3) >> 2; + for (int i = 0; i < num_words; i++) { + uint32_t word = 0; + uint32_t word_len = MIN(length, sizeof(word)); + memcpy(&word, buffer, word_len); + dev->data_buf[i] = word; + length -= word_len; + buffer = (void *)((intptr_t)buffer + word_len); + } +} + +/** + * Program a page of the flash chip. Call ``spi_flash_ll_set_address`` before + * this to set the address to program. + * + * @param dev Beginning address of the peripheral registers. + * @param buffer Buffer holding the data to program + * @param length Length to program. + */ +static inline void spi_flash_ll_program_page(spi_dev_t *dev, const void *buffer, uint32_t length) +{ + dev->user.usr_dummy = 0; + spi_flash_ll_set_buffer_data(dev, buffer, length); + dev->cmd.flash_pp = 1; +} + +/** + * Trigger a user defined transaction. All phases, including command, address, dummy, and the data phases, + * should be configured before this is called. + * + * @param dev Beginning address of the peripheral registers. + */ +static inline void spi_flash_ll_user_start(spi_dev_t *dev) +{ + dev->cmd.usr = 1; +} + +/** + * Check whether the host is idle to perform new commands. + * + * @param dev Beginning address of the peripheral registers. + * + * @return true if the host is idle, otherwise false + */ +static inline bool spi_flash_ll_host_idle(const spi_dev_t *dev) +{ + return dev->ext2.st != 0; +} + +/*------------------------------------------------------------------------------ + * Configs + *----------------------------------------------------------------------------*/ +/** + * Select which pin to use for the flash + * + * @param dev Beginning address of the peripheral registers. + * @param pin Pin ID to use, 0-2. Set to other values to disable all the CS pins. + */ +static inline void spi_flash_ll_set_cs_pin(spi_dev_t *dev, int pin) +{ + dev->pin.cs0_dis = (pin == 0) ? 0 : 1; + dev->pin.cs1_dis = (pin == 1) ? 0 : 1; + dev->pin.cs2_dis = (pin == 2) ? 0 : 1; +} + +/** + * Set the read io mode. + * + * @param dev Beginning address of the peripheral registers. + * @param read_mode I/O mode to use in the following transactions. + */ +static inline void spi_flash_ll_set_read_mode(spi_dev_t *dev, esp_flash_io_mode_t read_mode) +{ + typeof (dev->ctrl) ctrl = dev->ctrl; + ctrl.val &= ~(SPI_FREAD_QIO_M | SPI_FREAD_QUAD_M | SPI_FREAD_DIO_M | SPI_FREAD_DUAL_M); + ctrl.val |= SPI_FASTRD_MODE_M; + switch (read_mode) { + case SPI_FLASH_FASTRD: + //the default option + break; + case SPI_FLASH_QIO: + ctrl.fread_qio = 1; + break; + case SPI_FLASH_QOUT: + ctrl.fread_quad = 1; + break; + case SPI_FLASH_DIO: + ctrl.fread_dio = 1; + break; + case SPI_FLASH_DOUT: + ctrl.fread_dual = 1; + break; + case SPI_FLASH_SLOWRD: + ctrl.fastrd_mode = 0; + break; + default: + abort(); + } + dev->ctrl = ctrl; +} + +/** + * Set clock frequency to work at. + * + * @param dev Beginning address of the peripheral registers. + * @param clock_val pointer to the clock value to set + */ +static inline void spi_flash_ll_set_clock(spi_dev_t *dev, spi_flash_ll_clock_reg_t *clock_val) +{ + dev->clock = *clock_val; +} + +/** + * Set the input length, in bits. + * + * @param dev Beginning address of the peripheral registers. + * @param bitlen Length of input, in bits. + */ +static inline void spi_flash_ll_set_miso_bitlen(spi_dev_t *dev, uint32_t bitlen) +{ + dev->user.usr_miso = bitlen > 0; + dev->miso_dlen.usr_miso_dbitlen = bitlen ? (bitlen - 1) : 0; +} + +/** + * Set the output length, in bits (not including command, address and dummy + * phases) + * + * @param dev Beginning address of the peripheral registers. + * @param bitlen Length of output, in bits. + */ +static inline void spi_flash_ll_set_mosi_bitlen(spi_dev_t *dev, uint32_t bitlen) +{ + dev->user.usr_mosi = bitlen > 0; + dev->mosi_dlen.usr_mosi_dbitlen = bitlen ? (bitlen - 1) : 0; +} + +/** + * Set the command with fixed length (8 bits). + * + * @param dev Beginning address of the peripheral registers. + * @param command Command to send + */ +static inline void spi_flash_ll_set_command8(spi_dev_t *dev, uint8_t command) +{ + dev->user.usr_command = 1; + typeof(dev->user2) user2 = { + .usr_command_value = command, + .usr_command_bitlen = (8 - 1), + }; + dev->user2 = user2; +} + +/** + * Set the address length to send, in bits. Should be called before commands that requires the address e.g. erase sector, read, write... + * + * @param dev Beginning address of the peripheral registers. + * @param bitlen Length of the address, in bits + */ +static inline void spi_flash_ll_set_addr_bitlen(spi_dev_t *dev, uint32_t bitlen) +{ + dev->user1.usr_addr_bitlen = (bitlen - 1); + dev->user.usr_addr = bitlen ? 1 : 0; +} + +/** + * Set the address to send. Should be called before commands that requires the address e.g. erase sector, read, write... + * + * @param dev Beginning address of the peripheral registers. + * @param addr Address to send + */ +static inline void spi_flash_ll_set_address(spi_dev_t *dev, uint32_t addr) +{ + dev->addr = addr; +} + +/** + * Set the length of dummy cycles. + * + * @param dev Beginning address of the peripheral registers. + * @param dummy_n Cycles of dummy phases + */ +static inline void spi_flash_ll_set_dummy(spi_dev_t *dev, uint32_t dummy_n) +{ + dev->user.usr_dummy = dummy_n ? 1 : 0; + dev->user1.usr_dummy_cyclelen = dummy_n - 1; +} diff --git a/arch/xtensa/include/esp32/soc/esp32/include/hal/spi_ll.h b/arch/xtensa/include/esp32/soc/esp32/include/hal/spi_ll.h new file mode 100644 index 0000000000000..aaa4fa7aba974 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/hal/spi_ll.h @@ -0,0 +1,876 @@ +// 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. + +/******************************************************************************* + * NOTICE + * The hal is not public api, don't use in application code. + * See readme.md in soc/include/hal/readme.md + ******************************************************************************/ + +// The LL layer for ESP32 SPI register operations + +#pragma once + +#include "hal/hal_defs.h" +#include "soc/spi_periph.h" +#include "esp32/rom/lldesc.h" +#include +#include +#include //for abs() + +/// Registers to reset during initialization. Don't use in app. +#define SPI_LL_RST_MASK (SPI_OUT_RST | SPI_IN_RST | 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) +/// 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)) + +#define SPI_LL_GET_HW(ID) ((ID)==0? &SPI1:((ID)==1? &SPI2 : &SPI3)) + +/** + * The data structure holding calculated clock configuration. Since the + * calculation needs long time, it should be calculated during initialization and + * stored somewhere to be quickly used. + */ +typedef uint32_t spi_ll_clock_val_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; + +/// Interrupt type for different working pattern +typedef enum { + SPI_LL_INT_TYPE_NORMAL = 0, ///< Typical pattern, only wait for trans done +} spi_ll_slave_intr_type; + + +/*------------------------------------------------------------------------------ + * Control + *----------------------------------------------------------------------------*/ +/** + * Initialize SPI peripheral (master). + * + * @param hw Beginning address of the peripheral registers. + */ +static inline void spi_ll_master_init(spi_dev_t *hw) +{ + //Reset DMA + hw->dma_conf.val |= SPI_LL_RST_MASK; + hw->dma_out_link.start = 0; + hw->dma_in_link.start = 0; + hw->dma_conf.val &= ~SPI_LL_RST_MASK; + //Reset timing + hw->ctrl2.val = 0; + + //use all 64 bytes of the buffer + hw->user.usr_miso_highpart = 0; + hw->user.usr_mosi_highpart = 0; + + //Disable unneeded ints + hw->slave.val &= ~SPI_LL_UNUSED_INT_MASK; +} + +/** + * Initialize SPI peripheral (slave). + * + * @param hw Beginning address of the peripheral registers. + */ +static inline void spi_ll_slave_init(spi_dev_t *hw) +{ + //Configure slave + hw->clock.val = 0; + hw->user.val = 0; + hw->ctrl.val = 0; + hw->slave.wr_rd_buf_en = 1; //no sure if needed + hw->user.doutdin = 1; //we only support full duplex + hw->user.sio = 0; + hw->slave.slave_mode = 1; + hw->dma_conf.val |= SPI_LL_RST_MASK; + hw->dma_out_link.start = 0; + hw->dma_in_link.start = 0; + hw->dma_conf.val &= ~SPI_LL_RST_MASK; + hw->slave.sync_reset = 1; + hw->slave.sync_reset = 0; + //use all 64 bytes of the buffer + hw->user.usr_miso_highpart = 0; + hw->user.usr_mosi_highpart = 0; + + //Disable unneeded ints + hw->slave.val &= ~SPI_LL_UNUSED_INT_MASK; +} + +/** + * Reset TX and RX DMAs. + * + * @param hw Beginning address of the peripheral registers. + */ +static inline void spi_ll_reset_dma(spi_dev_t *hw) +{ + //Reset DMA peripheral + hw->dma_conf.val |= SPI_LL_RST_MASK; + hw->dma_out_link.start = 0; + hw->dma_in_link.start = 0; + hw->dma_conf.val &= ~SPI_LL_RST_MASK; + hw->dma_conf.out_data_burst_en = 1; + hw->dma_conf.indscr_burst_en = 1; + hw->dma_conf.outdscr_burst_en = 1; +} + +/** + * Start RX DMA. + * + * @param hw Beginning address of the peripheral registers. + * @param addr Address of the beginning DMA descriptor. + */ +static inline void spi_ll_rxdma_start(spi_dev_t *hw, lldesc_t *addr) +{ + hw->dma_in_link.addr = (int) addr & 0xFFFFF; + hw->dma_in_link.start = 1; +} + +/** + * Start TX DMA. + * + * @param hw Beginning address of the peripheral registers. + * @param addr Address of the beginning DMA descriptor. + */ +static inline void spi_ll_txdma_start(spi_dev_t *hw, lldesc_t *addr) +{ + hw->dma_out_link.addr = (int) addr & 0xFFFFF; + hw->dma_out_link.start = 1; +} + +/** + * Write to SPI buffer. + * + * @param hw Beginning address of the peripheral registers. + * @param buffer_to_send Data address to copy to the buffer. + * @param bitlen Length to copy, in bits. + */ +static inline void spi_ll_write_buffer(spi_dev_t *hw, const uint8_t *buffer_to_send, size_t bitlen) +{ + for (int x = 0; x < bitlen; x += 32) { + //Use memcpy to get around alignment issues for txdata + uint32_t word; + memcpy(&word, &buffer_to_send[x / 8], 4); + hw->data_buf[(x / 32)] = word; + } +} + +/** + * Read from SPI buffer. + * + * @param hw Beginning address of the peripheral registers. + * @param buffer_to_rcv Address to copy buffer data to. + * @param bitlen Length to copy, in bits. + */ +static inline void spi_ll_read_buffer(spi_dev_t *hw, uint8_t *buffer_to_rcv, size_t bitlen) +{ + for (int x = 0; x < bitlen; x += 32) { + //Do a memcpy to get around possible alignment issues in rx_buffer + uint32_t word = hw->data_buf[x / 32]; + int len = bitlen - x; + if (len > 32) { + len = 32; + } + memcpy(&buffer_to_rcv[x / 8], &word, (len + 7) / 8); + } +} + +/** + * Check whether user-defined transaction is done. + * + * @param hw Beginning address of the peripheral registers. + * + * @return true if transaction is done, otherwise false. + */ +static inline bool spi_ll_usr_is_done(spi_dev_t *hw) +{ + return hw->slave.trans_done; +} + +/** + * Trigger start of user-defined transaction. + * + * @param hw Beginning address of the peripheral registers. + */ +static inline void spi_ll_user_start(spi_dev_t *hw) +{ + hw->cmd.usr = 1; +} + +/** + * Get current running command bit-mask. (Preview) + * + * @param hw Beginning address of the peripheral registers. + * + * @return Bitmask of running command, see ``SPI_CMD_REG``. 0 if no in-flight command. + */ +static inline uint32_t spi_ll_get_running_cmd(spi_dev_t *hw) +{ + return hw->cmd.val; +} + +/** + * Disable the trans_done interrupt. + * + * @param hw Beginning address of the peripheral registers. + */ +static inline void spi_ll_disable_int(spi_dev_t *hw) +{ + hw->slave.trans_inten = 0; +} + +/** + * Clear the trans_done interrupt. + * + * @param hw Beginning address of the peripheral registers. + */ +static inline void spi_ll_clear_int_stat(spi_dev_t *hw) +{ + hw->slave.trans_done = 0; +} + +/** + * Set the trans_done interrupt. + * + * @param hw Beginning address of the peripheral registers. + */ +static inline void spi_ll_set_int_stat(spi_dev_t *hw) +{ + hw->slave.trans_done = 1; +} + +/** + * Enable the trans_done interrupt. + * + * @param hw Beginning address of the peripheral registers. + */ +static inline void spi_ll_enable_int(spi_dev_t *hw) +{ + hw->slave.trans_inten = 1; +} + +static inline void spi_ll_slave_set_int_type(spi_dev_t *hw, spi_ll_slave_intr_type int_type) +{ + hw->slave.trans_inten = 1; +} + +/*------------------------------------------------------------------------------ + * Configs: mode + *----------------------------------------------------------------------------*/ +/** + * Enable/disable the postive-cs feature. + * + * @param hw Beginning address of the peripheral registers. + * @param cs One of the CS (0-2) to enable/disable the feature. + * @param pos_cs true to enable the feature, otherwise disable (default). + */ +static inline void spi_ll_master_set_pos_cs(spi_dev_t *hw, int cs, uint32_t pos_cs) +{ + if (pos_cs) { + hw->pin.master_cs_pol |= (1 << cs); + } else { + hw->pin.master_cs_pol &= (1 << cs); + } +} + +/** + * Enable/disable the LSBFIRST feature for TX data. + * + * @param hw Beginning address of the peripheral registers. + * @param lsbfirst true if LSB of TX data to be sent first, otherwise MSB is sent first (default). + */ +static inline void spi_ll_set_tx_lsbfirst(spi_dev_t *hw, bool lsbfirst) +{ + hw->ctrl.wr_bit_order = lsbfirst; +} + +/** + * Enable/disable the LSBFIRST feature for RX data. + * + * @param hw Beginning address of the peripheral registers. + * @param lsbfirst true if first bit received as LSB, otherwise as MSB (default). + */ +static inline void spi_ll_set_rx_lsbfirst(spi_dev_t *hw, bool lsbfirst) +{ + hw->ctrl.rd_bit_order = lsbfirst; +} + +/** + * Set SPI mode for the peripheral as master. + * + * @param hw Beginning address of the peripheral registers. + * @param mode SPI mode to work at, 0-3. + */ +static inline void spi_ll_master_set_mode(spi_dev_t *hw, uint8_t mode) +{ + //Configure polarity + if (mode == 0) { + hw->pin.ck_idle_edge = 0; + hw->user.ck_out_edge = 0; + } else if (mode == 1) { + hw->pin.ck_idle_edge = 0; + hw->user.ck_out_edge = 1; + } else if (mode == 2) { + hw->pin.ck_idle_edge = 1; + hw->user.ck_out_edge = 1; + } else if (mode == 3) { + hw->pin.ck_idle_edge = 1; + hw->user.ck_out_edge = 0; + } +} + +/** + * Set SPI mode for the peripheral as slave. + * + * @param hw Beginning address of the peripheral registers. + * @param mode SPI mode to work at, 0-3. + */ +static inline void spi_ll_slave_set_mode(spi_dev_t *hw, const int mode, bool dma_used) +{ + if (mode == 0) { + //The timing needs to be fixed to meet the requirements of DMA + hw->pin.ck_idle_edge = 1; + hw->user.ck_i_edge = 0; + hw->ctrl2.miso_delay_mode = 0; + hw->ctrl2.miso_delay_num = 0; + hw->ctrl2.mosi_delay_mode = 2; + hw->ctrl2.mosi_delay_num = 2; + } else if (mode == 1) { + hw->pin.ck_idle_edge = 1; + hw->user.ck_i_edge = 1; + hw->ctrl2.miso_delay_mode = 2; + hw->ctrl2.miso_delay_num = 0; + hw->ctrl2.mosi_delay_mode = 0; + hw->ctrl2.mosi_delay_num = 0; + } else if (mode == 2) { + //The timing needs to be fixed to meet the requirements of DMA + hw->pin.ck_idle_edge = 0; + hw->user.ck_i_edge = 1; + hw->ctrl2.miso_delay_mode = 0; + hw->ctrl2.miso_delay_num = 0; + hw->ctrl2.mosi_delay_mode = 1; + hw->ctrl2.mosi_delay_num = 2; + } else if (mode == 3) { + hw->pin.ck_idle_edge = 0; + hw->user.ck_i_edge = 0; + hw->ctrl2.miso_delay_mode = 1; + hw->ctrl2.miso_delay_num = 0; + hw->ctrl2.mosi_delay_mode = 0; + hw->ctrl2.mosi_delay_num = 0; + } + + /* Silicon issues exists in mode 0 and 2 with DMA, change clock phase to + * avoid dma issue. This will cause slave output to appear at most half a + * spi clock before + */ + if (dma_used) { + if (mode == 0) { + hw->pin.ck_idle_edge = 0; + hw->user.ck_i_edge = 1; + hw->ctrl2.miso_delay_mode = 0; + hw->ctrl2.miso_delay_num = 2; + hw->ctrl2.mosi_delay_mode = 0; + hw->ctrl2.mosi_delay_num = 3; + } else if (mode == 2) { + hw->pin.ck_idle_edge = 1; + hw->user.ck_i_edge = 0; + hw->ctrl2.miso_delay_mode = 0; + hw->ctrl2.miso_delay_num = 2; + hw->ctrl2.mosi_delay_mode = 0; + hw->ctrl2.mosi_delay_num = 3; + } + } +} + +/** + * Set SPI to work in full duplex or half duplex mode. + * + * @param hw Beginning address of the peripheral registers. + * @param half_duplex true to work in half duplex mode, otherwise in full duplex mode. + */ +static inline void spi_ll_set_half_duplex(spi_dev_t *hw, bool half_duplex) +{ + hw->user.doutdin = !half_duplex; +} + +/** + * Set SPI to work in SIO mode or not. + * + * SIO is a mode which MOSI and MISO share a line. The device MUST work in half-duplexmode. + * + * @param hw Beginning address of the peripheral registers. + * @param sio_mode true to work in SIO mode, otherwise false. + */ +static inline void spi_ll_set_sio_mode(spi_dev_t *hw, int sio_mode) +{ + hw->user.sio = sio_mode; +} + +/** + * Configure the io mode for the master to work at. + * + * @param hw Beginning address of the peripheral registers. + * @param io_mode IO mode to work at, see ``spi_ll_io_mode_t``. + */ +static inline void spi_ll_master_set_io_mode(spi_dev_t *hw, spi_ll_io_mode_t io_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; + } +} + +/** + * Select one of the CS to use in current transaction. + * + * @param hw Beginning address of the peripheral registers. + * @param cs_id The cs to use, 0-2, otherwise none of them is used. + */ +static inline void spi_ll_master_select_cs(spi_dev_t *hw, int cs_id) +{ + hw->pin.cs0_dis = (cs_id == 0) ? 0 : 1; + hw->pin.cs1_dis = (cs_id == 1) ? 0 : 1; + hw->pin.cs2_dis = (cs_id == 2) ? 0 : 1; +} + +/*------------------------------------------------------------------------------ + * Configs: parameters + *----------------------------------------------------------------------------*/ +/** + * Set the clock for master by stored value. + * + * @param hw Beginning address of the peripheral registers. + * @param val stored clock configuration calculated before (by ``spi_ll_cal_clock``). + */ +static inline void spi_ll_master_set_clock_by_reg(spi_dev_t *hw, spi_ll_clock_val_t *val) +{ + hw->clock.val = *(uint32_t *)val; +} + +/** + * Get the frequency of given dividers. Don't use in app. + * + * @param fapb APB clock of the system. + * @param pre Pre devider. + * @param n main divider. + * + * @return Frequency of given dividers. + */ +static inline int spi_ll_freq_for_pre_n(int fapb, int pre, int n) +{ + return (fapb / (pre * n)); +} + +/** + * Calculate the nearest frequency avaliable for master. + * + * @param fapb APB clock of the system. + * @param hz Frequncy desired. + * @param duty_cycle Duty cycle desired. + * @param out_reg Output address to store the calculated clock configurations for the return frequency. + * + * @return Actual (nearest) frequency. + */ +static inline int spi_ll_master_cal_clock(int fapb, int hz, int duty_cycle, spi_ll_clock_val_t *out_reg) +{ + typeof(SPI1.clock) reg; + int eff_clk; + + //In hw, n, h and l are 1-64, pre is 1-8K. Value written to register is one lower than used value. + if (hz > ((fapb / 4) * 3)) { + //Using Fapb directly will give us the best result here. + reg.clkcnt_l = 0; + reg.clkcnt_h = 0; + reg.clkcnt_n = 0; + reg.clkdiv_pre = 0; + reg.clk_equ_sysclk = 1; + eff_clk = fapb; + } else { + //For best duty cycle resolution, we want n to be as close to 32 as possible, but + //we also need a pre/n combo that gets us as close as possible to the intended freq. + //To do this, we bruteforce n and calculate the best pre to go along with that. + //If there's a choice between pre/n combos that give the same result, use the one + //with the higher n. + int pre, n, h, l; + int bestn = -1; + int bestpre = -1; + int besterr = 0; + int errval; + for (n = 2; n <= 64; n++) { //Start at 2: we need to be able to set h/l so we have at least one high and one low pulse. + //Effectively, this does pre=round((fapb/n)/hz). + pre = ((fapb / n) + (hz / 2)) / hz; + if (pre <= 0) { + pre = 1; + } + if (pre > 8192) { + pre = 8192; + } + errval = abs(spi_ll_freq_for_pre_n(fapb, pre, n) - hz); + if (bestn == -1 || errval <= besterr) { + besterr = errval; + bestn = n; + bestpre = pre; + } + } + + n = bestn; + pre = bestpre; + l = n; + //This effectively does round((duty_cycle*n)/256) + h = (duty_cycle * n + 127) / 256; + if (h <= 0) { + h = 1; + } + + reg.clk_equ_sysclk = 0; + reg.clkcnt_n = n - 1; + reg.clkdiv_pre = pre - 1; + reg.clkcnt_h = h - 1; + reg.clkcnt_l = l - 1; + eff_clk = spi_ll_freq_for_pre_n(fapb, pre, n); + } + if (out_reg != NULL) { + *(uint32_t *)out_reg = reg.val; + } + return eff_clk; +} + +/** + * Calculate and set clock for SPI master according to desired parameters. + * + * This takes long, suggest to calculate the configuration during + * initialization by ``spi_ll_master_cal_clock`` and store the result, then + * configure the clock by stored value when used by + * ``spi_ll_msater_set_clock_by_reg``. + * + * @param hw Beginning address of the peripheral registers. + * @param fapb APB clock of the system. + * @param hz Frequncy desired. + * @param duty_cycle Duty cycle desired. + * + * @return Actual frequency that is used. + */ +static inline int spi_ll_master_set_clock(spi_dev_t *hw, int fapb, int hz, int duty_cycle) +{ + spi_ll_clock_val_t reg_val; + int freq = spi_ll_master_cal_clock(fapb, hz, duty_cycle, ®_val); + spi_ll_master_set_clock_by_reg(hw, ®_val); + return freq; +} + +/** + * Enable/disable the CK sel feature for a CS pin. + * + * CK sel is a feature to toggle the CS line along with the clock. + * + * @param hw Beginning address of the peripheral registers. + * @param cs CS pin to enable/disable the feature, 0-2. + * @param cksel true to enable the feature, otherwise false. + */ +static inline void spi_ll_master_set_cksel(spi_dev_t *hw, int cs, uint32_t cksel) +{ + if (cksel) { + hw->pin.master_ck_sel |= (1 << cs); + } else { + hw->pin.master_ck_sel &= (1 << cs); + } +} + +/** + * Set the mosi delay after the output edge to the signal. (Preview) + * + * The delay mode/num is a Espressif conception, may change in the new chips. + * + * @param hw Beginning address of the peripheral registers. + * @param delay_mode Delay mode, see TRM. + * @param delay_num APB clocks to delay. + */ +static inline void spi_ll_set_mosi_delay(spi_dev_t *hw, int delay_mode, int delay_num) +{ + hw->ctrl2.mosi_delay_mode = delay_mode; + hw->ctrl2.mosi_delay_num = delay_num; +} + +/** + * Set the miso delay applied to the input signal before the internal peripheral. (Preview) + * + * The delay mode/num is a Espressif conception, may change in the new chips. + * + * @param hw Beginning address of the peripheral registers. + * @param delay_mode Delay mode, see TRM. + * @param delay_num APB clocks to delay. + */ +static inline void spi_ll_set_miso_delay(spi_dev_t *hw, int delay_mode, int delay_num) +{ + hw->ctrl2.miso_delay_mode = delay_mode; + hw->ctrl2.miso_delay_num = delay_num; +} + +/** + * Set dummy clocks to output before RX phase (master), or clocks to skip + * before the data phase and after the address phase (slave). + * + * Note this phase is also used to compensate RX timing in half duplex mode. + * + * @param hw Beginning address of the peripheral registers. + * @param dummy_n Dummy cycles used. 0 to disable the dummy phase. + */ +static inline void spi_ll_set_dummy(spi_dev_t *hw, int dummy_n) +{ + hw->user.usr_dummy = dummy_n ? 1 : 0; + hw->user1.usr_dummy_cyclelen = dummy_n - 1; +} + +/** + * Set the delay of SPI clocks before the CS inactive edge after the last SPI clock. + * + * @param hw Beginning address of the peripheral registers. + * @param hold Delay of SPI clocks after the last clock, 0 to disable the hold phase. + */ +static inline void spi_ll_master_set_cs_hold(spi_dev_t *hw, int hold) +{ + hw->ctrl2.hold_time = hold; + hw->user.cs_hold = hold ? 1 : 0; +} + +/** + * Set the delay of SPI clocks before the first SPI clock after the CS active edge. + * + * Note ESP32 doesn't support to use this feature when command/address phases + * are used in full duplex mode. + * + * @param hw Beginning address of the peripheral registers. + * @param setup Delay of SPI clocks after the CS active edge, 0 to disable the setup phase. + */ +static inline void spi_ll_master_set_cs_setup(spi_dev_t *hw, uint8_t setup) +{ + hw->ctrl2.setup_time = setup - 1; + hw->user.cs_setup = setup ? 1 : 0; +} + +/*------------------------------------------------------------------------------ + * Configs: data + *----------------------------------------------------------------------------*/ +/** + * Set the input length (master). + * + * @param hw Beginning address of the peripheral registers. + * @param bitlen input length, in bits. + */ +static inline void spi_ll_set_miso_bitlen(spi_dev_t *hw, size_t bitlen) +{ + hw->miso_dlen.usr_miso_dbitlen = bitlen - 1; +} + +/** + * Set the output length (master). + * + * @param hw Beginning address of the peripheral registers. + * @param bitlen output length, in bits. + */ +static inline void spi_ll_set_mosi_bitlen(spi_dev_t *hw, size_t bitlen) +{ + hw->mosi_dlen.usr_mosi_dbitlen = bitlen - 1; +} + +/** + * Set the maximum input length (slave). + * + * @param hw Beginning address of the peripheral registers. + * @param bitlen input length, in bits. + */ +static inline void spi_ll_slave_set_rx_bitlen(spi_dev_t *hw, size_t bitlen) +{ + hw->slv_wrbuf_dlen.bit_len = bitlen - 1; +} + +/** + * Set the maximum output length (slave). + * + * @param hw Beginning address of the peripheral registers. + * @param bitlen output length, in bits. + */ +static inline void spi_ll_slave_set_tx_bitlen(spi_dev_t *hw, size_t bitlen) +{ + hw->slv_rdbuf_dlen.bit_len = bitlen - 1; +} + +/** + * Set the length of command phase. + * + * When in 4-bit mode, the SPI cycles of the phase will be shorter. E.g. 16-bit + * command phases takes 4 cycles in 4-bit mode. + * + * @param hw Beginning address of the peripheral registers. + * @param bitlen Length of command phase, in bits. 0 to disable the command phase. + */ +static inline void spi_ll_set_command_bitlen(spi_dev_t *hw, int bitlen) +{ + hw->user2.usr_command_bitlen = bitlen - 1; + hw->user.usr_command = bitlen ? 1 : 0; +} + +/** + * Set the length of address phase. + * + * When in 4-bit mode, the SPI cycles of the phase will be shorter. E.g. 16-bit + * address phases takes 4 cycles in 4-bit mode. + * + * @param hw Beginning address of the peripheral registers. + * @param bitlen Length of address phase, in bits. 0 to disable the address phase. + */ +static inline void spi_ll_set_addr_bitlen(spi_dev_t *hw, int bitlen) +{ + hw->user1.usr_addr_bitlen = bitlen - 1; + hw->user.usr_addr = bitlen ? 1 : 0; +} + +/** + * Set the address value in an intuitive way. + * + * The length and lsbfirst is required to shift and swap the address to the right place. + * + * @param hw Beginning address of the peripheral registers. + * @param address Address to set + * @param addrlen Length of the address phase + * @param lsbfirst whether the LSB first feature is enabled. + */ +static inline void spi_ll_set_address(spi_dev_t *hw, uint64_t addr, int addrlen, uint32_t lsbfirst) +{ + if (lsbfirst) { + /* The output address start from the LSB of the highest byte, i.e. + * addr[24] -> addr[31] + * ... + * addr[0] -> addr[7] + * slv_wr_status[24] -> slv_wr_status[31] + * ... + * slv_wr_status[0] -> slv_wr_status[7] + * So swap the byte order to let the LSB sent first. + */ + addr = HAL_SWAP64(addr); + hw->addr = addr >> 32; + hw->slv_wr_status = addr; + } else { + // shift the address to MSB of addr (and maybe slv_wr_status) register. + // output address will be sent from MSB to LSB of addr register, then comes the MSB to LSB of slv_wr_status register. + if (addrlen > 32) { + hw->addr = addr >> (addrlen - 32); + hw->slv_wr_status = addr << (64 - addrlen); + } else { + hw->addr = addr << (32 - addrlen); + } + } +} + +/** + * Set the command value in an intuitive way. + * + * The length and lsbfirst is required to shift and swap the command to the right place. + * + * @param hw Beginning command of the peripheral registers. + * @param command Command to set + * @param addrlen Length of the command phase + * @param lsbfirst whether the LSB first feature is enabled. + */ +static inline void spi_ll_set_command(spi_dev_t *hw, uint16_t cmd, int cmdlen, bool lsbfirst) +{ + if (lsbfirst) { + // The output command start from bit0 to bit 15, kept as is. + hw->user2.usr_command_value = cmd; + } else { + /* Output command will be sent from bit 7 to 0 of command_value, and + * then bit 15 to 8 of the same register field. Shift and swap to send + * more straightly. + */ + hw->user2.usr_command_value = HAL_SPI_SWAP_DATA_TX(cmd, cmdlen); + + } +} + +/** + * Enable/disable the RX data phase. + * + * @param hw Beginning address of the peripheral registers. + * @param enable true if RX phase exist, otherwise false. + */ +static inline void spi_ll_enable_miso(spi_dev_t *hw, int enable) +{ + hw->user.usr_miso = enable; +} + +/** + * Enable/disable the TX data phase. + * + * @param hw Beginning address of the peripheral registers. + * @param enable true if TX phase exist, otherwise false. + */ +static inline void spi_ll_enable_mosi(spi_dev_t *hw, int enable) +{ + hw->user.usr_mosi = enable; +} + +/** + * Reset the slave peripheral before next transaction. + * + * @param hw Beginning address of the peripheral registers. + */ +static inline void spi_ll_slave_reset(spi_dev_t *hw) +{ + hw->slave.sync_reset = 1; + hw->slave.sync_reset = 0; +} + +/** + * Get the received bit length of the slave. + * + * @param hw Beginning address of the peripheral registers. + * + * @return Received bits of the slave. + */ +static inline uint32_t spi_ll_slave_get_rcv_bitlen(spi_dev_t *hw) +{ + return hw->slv_rd_bit.slv_rdata_bit; +} + + +#undef SPI_LL_RST_MASK +#undef SPI_LL_UNUSED_INT_MASK diff --git a/arch/xtensa/include/esp32/soc/esp32/include/hal/timer_ll.h b/arch/xtensa/include/esp32/soc/esp32/include/hal/timer_ll.h new file mode 100644 index 0000000000000..c6cff70f4e74b --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/hal/timer_ll.h @@ -0,0 +1,537 @@ +// 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. + +// The LL layer for Timer Group register operations. +// Note that most of the register operations in this layer are non-atomic operations. + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "hal/timer_types.h" +#include "soc/timer_periph.h" + +_Static_assert(TIMER_INTR_T0 == TIMG_T0_INT_CLR, "Add mapping to LL interrupt handling, since it's no longer naturally compatible with the timer_intr_t"); +_Static_assert(TIMER_INTR_T1 == TIMG_T1_INT_CLR, "Add mapping to LL interrupt handling, since it's no longer naturally compatible with the timer_intr_t"); +_Static_assert(TIMER_INTR_WDT == TIMG_WDT_INT_CLR, "Add mapping to LL interrupt handling, since it's no longer naturally compatible with the timer_intr_t"); + +typedef struct { + timg_dev_t *dev; + timer_idx_t idx; +} timer_ll_context_t; + +// Get timer group instance with giving group number +#define TIMER_LL_GET_HW(num) ((num == 0) ? (&TIMERG0) : (&TIMERG1)) + +/** + * @brief Set timer clock prescale value + * + * @param hw Beginning address of the peripheral registers. + * @param timer_num The timer number + * @param divider Prescale value + * + * @return None + */ +static inline void timer_ll_set_divider(timg_dev_t *hw, timer_idx_t timer_num, uint16_t divider) +{ + 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; +} + +/** + * @brief Get timer clock prescale value + * + * @param hw Beginning address of the peripheral registers. + * @param timer_num The timer number + * @param divider Pointer to accept the prescale value + * + * @return None + */ +static inline void timer_ll_get_divider(timg_dev_t *hw, timer_idx_t timer_num, uint16_t *divider) +{ + *divider = hw->hw_timer[timer_num].config.divider; +} + +/** + * @brief Load counter value into time-base counter + * + * @param hw Beginning address of the peripheral registers. + * @param timer_num The timer number + * @param load_val Counter value + * + * @return None + */ +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; +} + +/** + * @brief Get counter value from time-base counter + * + * @param hw Beginning address of the peripheral registers. + * @param timer_num The timer number + * @param timer_val Pointer to accept the counter value + * + * @return None + */ +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 = 1; + *timer_val = ((uint64_t) hw->hw_timer[timer_num].cnt_high << 32) | (hw->hw_timer[timer_num].cnt_low); +} + +/** + * @brief Set counter mode, include increment mode and decrement mode. + * + * @param hw Beginning address of the peripheral registers. + * @param timer_num The timer number + * @param increase_en True to increment mode, fasle to decrement mode + * + * @return None + */ +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; +} + +/** + * @brief Get counter mode, include increment mode and decrement mode. + * + * @param hw Beginning address of the peripheral registers. + * @param timer_num The timer number + * + * @return + * - true Increment mode + * - false Decrement mode + */ +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; +} + +/** + * @brief Set counter status, enable or disable counter. + * + * @param hw Beginning address of the peripheral registers. + * @param timer_num The timer number + * @param counter_en True to enable counter, false to disable counter + * + * @return None + */ +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; +} + +/** + * @brief Get counter status. + * + * @param hw Beginning address of the peripheral registers. + * @param timer_num The timer number + * + * @return + * - true Enable counter + * - false Disable conuter + */ +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; +} + +/** + * @brief Set auto reload mode. + * + * @param hw Beginning address of the peripheral registers. + * @param timer_num The timer number + * @param auto_reload_en True to enable auto reload mode, flase to disable auto reload mode + * + * @return None + */ +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; +} + +/** + * @brief Get auto reload mode. + * + * @param hw Beginning address of the peripheral registers. + * @param timer_num The timer number + * + * @return + * - true Enable auto reload mode + * - false Disable auto reload mode + */ +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; +} + +/** + * @brief Set the counter value to trigger the alarm. + * + * @param hw Beginning address of the peripheral registers. + * @param timer_num The timer number + * @param alarm_value Counter value to trigger the alarm + * + * @return None + */ +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; +} + +/** + * @brief Get the counter value to trigger the alarm. + * + * @param hw Beginning address of the peripheral registers. + * @param timer_num The timer number + * @param alarm_value Pointer to accept the counter value to trigger the alarm + * + * @return None + */ +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); +} + +/** + * @brief Set the alarm status, enable or disable the alarm. + * + * @param hw Beginning address of the peripheral registers. + * @param timer_num The timer number + * @param alarm_en True to enable alarm, false to disable alarm + * + * @return None + */ +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; +} + +/** + * @brief Get the alarm status. + * + * @param hw Beginning address of the peripheral registers. + * @param timer_num The timer number + * + * @return + * - true Enable alarm + * - false Disable alarm + */ +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; +} + +/** + * @brief Enable timer interrupt. + * + * @param hw Beginning address of the peripheral registers. + * @param timer_num The timer number + * + * @return None + */ +FORCE_INLINE_ATTR void timer_ll_intr_enable(timg_dev_t *hw, timer_idx_t timer_num) +{ + hw->int_ena.val |= BIT(timer_num); +} + +/** + * @brief Disable timer interrupt. + * + * @param hw Beginning address of the peripheral registers. + * @param timer_num The timer number + * + * @return None + */ +FORCE_INLINE_ATTR void timer_ll_intr_disable(timg_dev_t *hw, timer_idx_t timer_num) +{ + hw->int_ena.val &= (~BIT(timer_num)); +} + +/** + * @brief Disable timer interrupt. + * + * @param hw Beginning address of the peripheral registers. + * @param timer_num The timer number + * + * @return None + */ +FORCE_INLINE_ATTR void timer_ll_clear_intr_status(timg_dev_t *hw, timer_idx_t timer_num) +{ + hw->int_clr_timers.val |= BIT(timer_num); +} + +/** + * @brief Get interrupt status. + * + * @param hw Beginning address of the peripheral registers. + * @param intr_status Interrupt status + * + * @return None + */ +FORCE_INLINE_ATTR void timer_ll_get_intr_status(timg_dev_t *hw, uint32_t *intr_status) +{ + *intr_status = hw->int_st_timers.val; +} + +/** + * @brief Get interrupt raw status. + * + * @param group_num Timer group number, 0 for TIMERG0 or 1 for TIMERG1 + * @param intr_raw_status Interrupt raw status + * + * @return None + */ +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; +} + +/** + * @brief Set the level interrupt status, enable or disable the level interrupt. + * + * @param hw Beginning address of the peripheral registers. + * @param timer_num The timer number + * @param level_int_en True to enable level interrupt, false to disable level interrupt + * + * @return None + */ +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; +} + +/** + * @brief Get the level interrupt status. + * + * @param hw Beginning address of the peripheral registers. + * @param timer_num The timer number + * + * @return + * - true Enable level interrupt + * - false Disable level interrupt + */ +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; +} + +/** + * @brief Set the edge interrupt status, enable or disable the edge interrupt. + * + * @param hw Beginning address of the peripheral registers. + * @param timer_num The timer number + * @param edge_int_en True to enable edge interrupt, false to disable edge interrupt + * + * @return None + */ +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; +} + +/** + * @brief Get the edge interrupt status. + * + * @param hw Beginning address of the peripheral registers. + * @param timer_num The timer number + * + * @return + * - true Enable edge interrupt + * - false Disable edge interrupt + */ +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; +} + +/** + * @brief Get interrupt status register address. + * + * @param hw Beginning address of the peripheral registers. + * @param intr_status_reg Interrupt status register address + * + * @return None + */ +static inline void timer_ll_get_intr_status_reg(timg_dev_t *hw, uint32_t *intr_status_reg) +{ + *intr_status_reg = (uint32_t)&(hw->int_st_timers.val); +} + +/* WDT operations */ + +/** + * @brief Unlock/lock the WDT register in case of mis-operations. + * + * @param hw Beginning address of the peripheral registers. + * @param protect true to lock, false to unlock before operations. + */ +FORCE_INLINE_ATTR void timer_ll_wdt_set_protect(timg_dev_t* hw, bool protect) +{ + hw->wdt_wprotect=(protect? 0: TIMG_WDT_WKEY_VALUE); +} + +/** + * @brief Initialize WDT. + * + * @param hw Beginning address of the peripheral registers. + * + * @note Call `timer_ll_wdt_set_protect` first + */ +FORCE_INLINE_ATTR void timer_ll_wdt_init(timg_dev_t* hw) +{ + hw->wdt_config0.sys_reset_length=7; //3.2uS + hw->wdt_config0.cpu_reset_length=7; //3.2uS + //currently only level interrupt is supported + hw->wdt_config0.level_int_en = 1; + hw->wdt_config0.edge_int_en = 0; +} + +/** + * @brief Set the WDT tick time. + * + * @param hw Beginning address of the peripheral registers. + * @param tick_time_us Tick time. + */ +FORCE_INLINE_ATTR void timer_ll_wdt_set_tick(timg_dev_t* hw, int tick_time_us) +{ + hw->wdt_config1.clk_prescale=80*tick_time_us; +} + +/** + * @brief Feed the WDT. + * + * @param hw Beginning address of the peripheral registers. + */ +FORCE_INLINE_ATTR void timer_ll_wdt_feed(timg_dev_t* hw) +{ + hw->wdt_feed = 1; +} + +/** + * @brief Set the WDT timeout. + * + * @param hw Beginning address of the peripheral registers. + * @param stage Stage number of WDT. + * @param timeout_Tick tick threshold of timeout. + */ +FORCE_INLINE_ATTR void timer_ll_wdt_set_timeout(timg_dev_t* hw, int stage, uint32_t timeout_tick) +{ + switch (stage) { + case 0: + hw->wdt_config2=timeout_tick; + break; + case 1: + hw->wdt_config3=timeout_tick; + break; + case 2: + hw->wdt_config4=timeout_tick; + break; + case 3: + hw->wdt_config5=timeout_tick; + break; + default: + abort(); + } +} + +_Static_assert(TIMER_WDT_OFF == TIMG_WDT_STG_SEL_OFF, "Add mapping to LL watchdog timeout behavior, since it's no longer naturally compatible with the timer_wdt_behavior_t"); +_Static_assert(TIMER_WDT_INT == TIMG_WDT_STG_SEL_INT, "Add mapping to LL watchdog timeout behavior, since it's no longer naturally compatible with the timer_wdt_behavior_t"); +_Static_assert(TIMER_WDT_RESET_CPU == TIMG_WDT_STG_SEL_RESET_CPU, "Add mapping to LL watchdog timeout behavior, since it's no longer naturally compatible with the timer_wdt_behavior_t"); +_Static_assert(TIMER_WDT_RESET_SYSTEM == TIMG_WDT_STG_SEL_RESET_SYSTEM, "Add mapping to LL watchdog timeout behavior, since it's no longer naturally compatible with the timer_wdt_behavior_t"); + +/** + * @brief Set the WDT timeout behavior. + * + * @param hw Beginning address of the peripheral registers. + * @param stage Stage number of WDT. + * @param behavior Behavior of WDT, please see enum timer_wdt_behavior_t. + */ +FORCE_INLINE_ATTR void timer_ll_wdt_set_timeout_behavior(timg_dev_t* hw, int stage, timer_wdt_behavior_t behavior) +{ + switch (stage) { + case 0: + hw->wdt_config0.stg0 = behavior; + break; + case 1: + hw->wdt_config0.stg1 = behavior; + break; + case 2: + hw->wdt_config0.stg2 = behavior; + break; + case 3: + hw->wdt_config0.stg3 = behavior; + break; + default: + abort(); + } +} + +/** + * @brief Enable/Disable the WDT enable. + * + * @param hw Beginning address of the peripheral registers. + * @param enable True to enable WDT, false to disable WDT. + */ +FORCE_INLINE_ATTR void timer_ll_wdt_set_enable(timg_dev_t* hw, bool enable) +{ + hw->wdt_config0.en = enable; +} + +/** + * @brief Enable/Disable the WDT flashboot mode. + * + * @param hw Beginning address of the peripheral registers. + * @param enable True to enable WDT flashboot mode, false to disable WDT flashboot mode. + */ +FORCE_INLINE_ATTR void timer_ll_wdt_flashboot_en(timg_dev_t* hw, bool enable) +{ + hw->wdt_config0.flashboot_mod_en = enable; +} + +/** + * @brief Clear the WDT interrupt status. + * + * @param hw Beginning address of the peripheral registers. + */ +FORCE_INLINE_ATTR void timer_ll_wdt_clear_intr_status(timg_dev_t* hw) +{ + hw->int_clr_timers.wdt = 1; +} + +/** + * @brief Enable the WDT interrupt. + * + * @param hw Beginning address of the peripheral registers. + */ +FORCE_INLINE_ATTR void timer_ll_wdt_enable_intr(timg_dev_t* hw) +{ + hw->int_ena.wdt = 1; +} + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/esp32/include/hal/touch_sensor_hal_esp32.h b/arch/xtensa/include/esp32/soc/esp32/include/hal/touch_sensor_hal_esp32.h new file mode 100644 index 0000000000000..82f8b799ef301 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/hal/touch_sensor_hal_esp32.h @@ -0,0 +1,120 @@ +// 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. + +/******************************************************************************* + * NOTICE + * The hal is not public api, don't use in application code. + * See readme.md in soc/include/hal/readme.md + ******************************************************************************/ + +// The HAL layer for touch sensor (esp32 specific part) + +#pragma once + +#include "hal/touch_sensor_ll.h" +#include "hal/touch_sensor_types.h" + +/** + * Set touch sensor measurement time. + * + * @param meas_time The duration of the touch sensor measurement. + * t_meas = meas_time / (8MHz), the maximum measure time is 0xffff / 8M = 8.19 ms. + */ +#define touch_hal_set_meas_time(meas_time) touch_ll_set_meas_time(meas_time) + +/** + * Get touch sensor measurement time. + * + * @param meas_time Pointer to accept measurement cycle count. + */ +#define touch_hal_get_meas_time(meas_time) touch_ll_get_meas_time(meas_time) + +/** + * Set touch sensor interrupt trigger mode. + * Interrupt can be triggered either when touch value is less than + * threshold or when touch value is more than threshold. + * + * @param mode Touch sensor interrupt trigger mode. + */ +#define touch_hal_set_trigger_mode(mode) touch_ll_set_trigger_mode(mode) + +/** + * Get touch sensor interrupt trigger mode. + * Interrupt can be triggered either when touch value is less than + * threshold or when touch value is more than threshold. + * + * @param mode Touch sensor interrupt trigger mode. + */ +#define touch_hal_get_trigger_mode(mode) touch_ll_get_trigger_mode(mode) + +/** + * Set touch sensor interrupt trigger source. There are two sets of touch signals. + * Set1 and set2 can be mapped to several touch signals. Either set will be triggered + * if at least one of its touch signal is 'touched'. The interrupt can be configured to be generated + * if set1 is triggered, or only if both sets are triggered. + * + * @param src Touch sensor interrupt trigger source. + */ +#define touch_hal_set_trigger_source(src) touch_ll_set_trigger_source(src) + +/** + * Get touch sensor interrupt trigger source. + * + * @param src Pointer to accept touch sensor interrupt trigger source. + */ +#define touch_hal_get_trigger_source(src) touch_ll_get_trigger_source(src) + +/** + * Set touch sensor group mask. + * Touch pad module has two sets of signals, 'Touched' signal is triggered only if + * at least one of touch pad in this group is "touched". + * This function will set the register bits according to the given bitmask. + * + * @param set1_mask bitmask of touch sensor signal group1, it's a 10-bit value + * @param set2_mask bitmask of touch sensor signal group2, it's a 10-bit value + */ +#define touch_hal_set_group_mask(group1_mask, group2_mask) touch_ll_set_group_mask(group1_mask, group2_mask) + +/** + * Get touch sensor group mask. + * + * @param set1_mask pointer to accept bitmask of touch sensor signal group1, it's a 10-bit value + * @param set2_mask pointer to accept bitmask of touch sensor signal group2, it's a 10-bit value + */ +#define touch_hal_get_group_mask(group1_mask, group2_mask) touch_ll_get_group_mask(group1_mask, group2_mask) + +/** + * Clear touch sensor group mask. + * + * @param set1_mask pointer to accept bitmask of touch sensor signal group1, it's a 10-bit value + * @param set2_mask pointer to accept bitmask of touch sensor signal group2, it's a 10-bit value + */ +#define touch_hal_clear_group_mask(group1_mask, group2_mask) touch_ll_clear_group_mask(group1_mask, group2_mask) + +/** + * To enable touch pad interrupt. + */ +#define touch_hal_enable_interrupt() touch_ll_enable_interrupt() + +/** + * To disable touch pad interrupt. + */ +#define touch_hal_disable_interrupt() touch_ll_disable_interrupt() + +/** + * Get the touch pad which caused wakeup from deep sleep. + * + * @param pad_num pointer to touch pad which caused wakeup. + */ +void touch_hal_get_wakeup_status(touch_pad_t *pad_num); \ No newline at end of file diff --git a/arch/xtensa/include/esp32/soc/esp32/include/hal/touch_sensor_ll.h b/arch/xtensa/include/esp32/soc/esp32/include/hal/touch_sensor_ll.h new file mode 100644 index 0000000000000..6786fef4afccd --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/hal/touch_sensor_ll.h @@ -0,0 +1,490 @@ +// 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. + +/******************************************************************************* + * NOTICE + * The ll is not public api, don't use in application code. + * See readme.md in soc/include/hal/readme.md + ******************************************************************************/ + +// The Lowlevel layer for Touch Sensor + +#pragma once + +#include +#include +#include "soc/touch_sensor_periph.h" +#include "hal/touch_sensor_types.h" + +//Some register bits of touch sensor 8 and 9 are mismatched, we need to swap the bits. +#define TOUCH_LL_BIT_SWAP(data, n, m) (((data >> n) & 0x1) == ((data >> m) & 0x1) ? (data) : ((data) ^ ((0x1 < BIT(1) + * @return + * - ESP_OK on success + */ +static inline void touch_ll_set_channel_mask(uint16_t enable_mask) +{ + SENS.sar_touch_enable.touch_pad_worken |= TOUCH_LL_BITS_SWAP(enable_mask); +} + +/** + * Get touch sensor channel mask. + * + * @param enable_mask bitmask of touch sensor scan group. + * e.g. TOUCH_PAD_NUM1 -> BIT(1) + */ +static inline void touch_ll_get_channel_mask(uint16_t *enable_mask) +{ + *enable_mask = TOUCH_LL_BITS_SWAP(SENS.sar_touch_enable.touch_pad_worken); +} + +/** + * Disable touch sensor channel by bitmask. + * + * @param enable_mask bitmask of touch sensor scan group. + * e.g. TOUCH_PAD_NUM1 -> BIT(1) + */ +static inline void touch_ll_clear_channel_mask(uint16_t disable_mask) +{ + SENS.sar_touch_enable.touch_pad_worken &= TOUCH_LL_BITS_SWAP(~disable_mask); +} + +/** + * Set touch sensor group mask. + * Touch pad module has two sets of signals, 'Touched' signal is triggered only if + * at least one of touch pad in this group is "touched". + * This function will set the register bits according to the given bitmask. + * + * @param set1_mask bitmask of touch sensor signal group1, it's a 10-bit value + * @param set2_mask bitmask of touch sensor signal group2, it's a 10-bit value + */ +static inline void touch_ll_set_group_mask(uint16_t group1_mask, uint16_t group2_mask) +{ + SENS.sar_touch_enable.touch_pad_outen1 |= TOUCH_LL_BITS_SWAP(group1_mask); + SENS.sar_touch_enable.touch_pad_outen2 |= TOUCH_LL_BITS_SWAP(group2_mask); +} + +/** + * Get touch sensor group mask. + * + * @param set1_mask pointer to accept bitmask of touch sensor signal group1, it's a 10-bit value + * @param set2_mask pointer to accept bitmask of touch sensor signal group2, it's a 10-bit value + */ +static inline void touch_ll_get_group_mask(uint16_t *group1_mask, uint16_t *group2_mask) +{ + *group1_mask = TOUCH_LL_BITS_SWAP(SENS.sar_touch_enable.touch_pad_outen1); + *group2_mask = TOUCH_LL_BITS_SWAP(SENS.sar_touch_enable.touch_pad_outen2); +} + +/** + * Clear touch sensor group mask. + * + * @param set1_mask pointer to accept bitmask of touch sensor signal group1, it's a 10-bit value + * @param set2_mask pointer to accept bitmask of touch sensor signal group2, it's a 10-bit value + */ +static inline void touch_ll_clear_group_mask(uint16_t group1_mask, uint16_t group2_mask) +{ + SENS.sar_touch_enable.touch_pad_outen1 &= TOUCH_LL_BITS_SWAP(~group1_mask); + SENS.sar_touch_enable.touch_pad_outen2 &= TOUCH_LL_BITS_SWAP(~group2_mask); +} + +/** + * Get the touch sensor status, usually used in ISR to decide which pads are 'touched'. + * + * @param status_mask The touch sensor status. e.g. Touch1 trigger status is `status_mask & (BIT1)`. + */ +static inline void touch_ll_read_trigger_status_mask(uint32_t *status_mask) +{ + *status_mask = TOUCH_LL_BITS_SWAP(SENS.sar_touch_ctrl2.touch_meas_en); +} + +/** + * Clear all touch sensor status. + */ +static inline void touch_ll_clear_trigger_status_mask(void) +{ + SENS.sar_touch_ctrl2.touch_meas_en_clr = 1; +} + +/** + * To enable touch pad interrupt. + */ +static inline void touch_ll_enable_interrupt(void) +{ + RTCCNTL.int_ena.rtc_touch = 1; +} + +/** + * To disable touch pad interrupt. + */ +static inline void touch_ll_disable_interrupt(void) +{ + RTCCNTL.int_ena.rtc_touch = 0; +} + +/** + * Get touch sensor raw data (touch sensor counter value) from register. No block. + * + * @param touch_num touch pad index. + * @return touch_value pointer to accept touch sensor value. + */ +static inline uint32_t touch_ll_read_raw_data(touch_pad_t touch_num) +{ + touch_pad_t tp_wrap = touch_ll_num_wrap(touch_num); + return ((tp_wrap & 0x1) ? SENS.touch_meas[tp_wrap / 2].l_val : SENS.touch_meas[tp_wrap / 2].h_val); +} + +/** + * Get touch sensor measure status. No block. + * + * @return + * - If touch sensors measure done. + */ +static inline bool touch_ll_meas_is_done(void) +{ + return (bool)SENS.sar_touch_ctrl2.touch_meas_done; +} diff --git a/arch/xtensa/include/esp32/soc/esp32/include/hal/uart_ll.h b/arch/xtensa/include/esp32/soc/esp32/include/hal/uart_ll.h new file mode 100644 index 0000000000000..def1ad062bdcc --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/hal/uart_ll.h @@ -0,0 +1,805 @@ +// 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. + +// The LL layer for UART register operations. +// Note that most of the register operations in this layer are non-atomic operations. + + +#pragma once +#include "hal/uart_types.h" +#include "soc/uart_periph.h" + +// The default fifo depth +#define UART_LL_FIFO_DEF_LEN (UART_FIFO_LEN) +// Get UART hardware instance with giving uart num +#define UART_LL_GET_HW(num) (((num) == 0) ? (&UART0) : (((num) == 1) ? (&UART1) : (&UART2))) + +// The timeout calibration factor when using ref_tick +#define UART_LL_TOUT_REF_FACTOR_DEFAULT (8) + +// Define UART interrupts +typedef enum { + UART_INTR_RXFIFO_FULL = (0x1<<0), + UART_INTR_TXFIFO_EMPTY = (0x1<<1), + UART_INTR_PARITY_ERR = (0x1<<2), + UART_INTR_FRAM_ERR = (0x1<<3), + UART_INTR_RXFIFO_OVF = (0x1<<4), + UART_INTR_DSR_CHG = (0x1<<5), + UART_INTR_CTS_CHG = (0x1<<6), + UART_INTR_BRK_DET = (0x1<<7), + UART_INTR_RXFIFO_TOUT = (0x1<<8), + UART_INTR_SW_XON = (0x1<<9), + UART_INTR_SW_XOFF = (0x1<<10), + UART_INTR_GLITCH_DET = (0x1<<11), + UART_INTR_TX_BRK_DONE = (0x1<<12), + UART_INTR_TX_BRK_IDLE = (0x1<<13), + UART_INTR_TX_DONE = (0x1<<14), + UART_INTR_RS485_PARITY_ERR = (0x1<<15), + UART_INTR_RS485_FRM_ERR = (0x1<<16), + UART_INTR_RS485_CLASH = (0x1<<17), + UART_INTR_CMD_CHAR_DET = (0x1<<18), +} uart_intr_t; + + +/** + * @brief Configure the baud-rate. + * + * @param hw Beginning address of the peripheral registers. + * @param baud The baud-rate to be set. When the source clock is APB, the max baud-rate is `UART_LL_BITRATE_MAX` + * @param source_clk The UART source clock. The source clock can be APB clock or REF_TICK. + * If the source clock is REF_TICK, the UART can still work when the APB changes. + * + * @return None + */ +static inline void uart_ll_set_baudrate(uart_dev_t *hw, uart_sclk_t source_clk, uint32_t baud) +{ + uint32_t sclk_freq = (source_clk == UART_SCLK_APB) ? APB_CLK_FREQ : REF_CLK_FREQ; + uint32_t clk_div = ((sclk_freq) << 4) / baud; + // 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; + // Configure the UART source clock. + hw->conf0.tick_ref_always_on = (source_clk == UART_SCLK_APB); +} + +/** + * @brief Get the current baud-rate. + * + * @param hw Beginning address of the peripheral registers. + * + * @return The current baudrate + */ +static inline uint32_t uart_ll_get_baudrate(uart_dev_t *hw) +{ + uint32_t src_clk = hw->conf0.tick_ref_always_on ? APB_CLK_FREQ : REF_CLK_FREQ; + typeof(hw->clk_div) div_reg = hw->clk_div; + return ((src_clk << 4)) / ((div_reg.div_int << 4) | div_reg.div_frag); +} + +/** + * @brief Enable the UART interrupt based on the given mask. + * + * @param hw Beginning address of the peripheral registers. + * @param mask The bitmap of the interrupts need to be enabled. + * + * @return None + */ +static inline void uart_ll_ena_intr_mask(uart_dev_t *hw, uint32_t mask) +{ + hw->int_ena.val |= mask; +} + +/** + * @brief Disable the UART interrupt based on the given mask. + * + * @param hw Beginning address of the peripheral registers. + * @param mask The bitmap of the interrupts need to be disabled. + * + * @return None + */ +static inline void uart_ll_disable_intr_mask(uart_dev_t *hw, uint32_t mask) +{ + hw->int_ena.val &= (~mask); +} + +/** + * @brief Get the UART interrupt status. + * + * @param hw Beginning address of the peripheral registers. + * + * @return The UART interrupt status. + */ +static inline uint32_t uart_ll_get_intsts_mask(uart_dev_t *hw) +{ + return hw->int_st.val; +} + +/** + * @brief Clear the UART interrupt status based on the given mask. + * + * @param hw Beginning address of the peripheral registers. + * @param mask The bitmap of the interrupts need to be cleared. + * + * @return None + */ +static inline void uart_ll_clr_intsts_mask(uart_dev_t *hw, uint32_t mask) +{ + hw->int_clr.val = mask; +} + +/** + * @brief Get status of enabled interrupt. + * + * @param hw Beginning address of the peripheral registers. + * + * @return Interrupt enabled value + */ +static inline uint32_t uart_ll_get_intr_ena_status(uart_dev_t *hw) +{ + return hw->int_ena.val; +} + +/** + * @brief Read the UART rxfifo. + * + * @param hw Beginning address of the peripheral registers. + * @param buf The data buffer. The buffer size should be large than 128 byts. + * @param rd_len The data length needs to be read. + * + * @return None. + */ +static inline void uart_ll_read_rxfifo(uart_dev_t *hw, uint8_t *buf, uint32_t rd_len) +{ + //Get the UART APB fifo addr. Read fifo, we use APB address + uint32_t fifo_addr = (hw == &UART0) ? UART_FIFO_REG(0) : (hw == &UART1) ? UART_FIFO_REG(1) : UART_FIFO_REG(2); + for(int i = 0; i < rd_len; i++) { + buf[i] = READ_PERI_REG(fifo_addr); + } +} + +/** + * @brief Write byte to the UART txfifo. + * + * @param hw Beginning address of the peripheral registers. + * @param buf The data buffer. + * @param wr_len The data length needs to be writen. + * + * @return None + */ +static inline void uart_ll_write_txfifo(uart_dev_t *hw, const uint8_t *buf, uint32_t wr_len) +{ + //Get the UART AHB fifo addr, Write fifo, we use AHB address + uint32_t fifo_addr = (hw == &UART0) ? UART_FIFO_AHB_REG(0) : (hw == &UART1) ? UART_FIFO_AHB_REG(1) : UART_FIFO_AHB_REG(2); + for(int i = 0; i < wr_len; i++) { + WRITE_PERI_REG(fifo_addr, buf[i]); + } +} + +/** + * @brief Reset the UART hw rxfifo. + * + * @param hw Beginning address of the peripheral registers. + * + * @return None + */ +static inline void uart_ll_rxfifo_rst(uart_dev_t *hw) +{ + //Hardware issue: we can not use `rxfifo_rst` to reset the hw rxfifo. + uint16_t fifo_cnt; + typeof(hw->mem_rx_status) rxmem_sta; + //Get the UART APB fifo addr + uint32_t fifo_addr = (hw == &UART0) ? UART_FIFO_REG(0) : (hw == &UART1) ? UART_FIFO_REG(1) : UART_FIFO_REG(2); + do { + fifo_cnt = hw->status.rxfifo_cnt; + rxmem_sta.val = hw->mem_rx_status.val; + if(fifo_cnt != 0 || (rxmem_sta.rd_addr != rxmem_sta.wr_addr)) { + READ_PERI_REG(fifo_addr); + } else { + break; + } + } while(1); +} + +/** + * @brief Reset the UART hw txfifo. + * + * @param hw Beginning address of the peripheral registers. + * + * @return None + */ +static inline void uart_ll_txfifo_rst(uart_dev_t *hw) +{ + hw->conf0.txfifo_rst = 1; + hw->conf0.txfifo_rst = 0; +} + +/** + * @brief Get the length of readable data in UART rxfifo. + * + * @param hw Beginning address of the peripheral registers. + * + * @return The readable data length in rxfifo. + */ +static inline uint32_t uart_ll_get_rxfifo_len(uart_dev_t *hw) +{ + return hw->status.rxfifo_cnt; +} + +/** + * @brief Get the writable data length of UART txfifo. + * + * @param hw Beginning address of the peripheral registers. + * + * @return The data length of txfifo can be written. + */ +static inline uint32_t uart_ll_get_txfifo_len(uart_dev_t *hw) +{ + return UART_LL_FIFO_DEF_LEN - hw->status.txfifo_cnt; +} + +/** + * @brief Configure the UART stop bit. + * + * @param hw Beginning address of the peripheral registers. + * @param stop_bit The stop bit number to be set. + * + * @return None. + */ +static inline void uart_ll_set_stop_bits(uart_dev_t *hw, uart_stop_bits_t stop_bit) +{ + //workaround for hardware issue, when UART stop bit set as 2-bit mode. + if(stop_bit == UART_STOP_BITS_2) { + hw->rs485_conf.dl1_en = 1; + hw->conf0.stop_bit_num = 0x1; + } else { + hw->rs485_conf.dl1_en = 0; + hw->conf0.stop_bit_num = stop_bit; + } +} + +/** + * @brief Get the configuration of the UART stop bit. + * + * @param hw Beginning address of the peripheral registers. + * @param stop_bit The pointer to accept the stop bit configuration + * + * @return None. + */ +static inline void uart_ll_get_stop_bits(uart_dev_t *hw, uart_stop_bits_t *stop_bit) +{ + //workaround for hardware issue, when UART stop bit set as 2-bit mode. + if(hw->rs485_conf.dl1_en == 1 && hw->conf0.stop_bit_num == 0x1) { + *stop_bit = UART_STOP_BITS_2; + } else { + *stop_bit = hw->conf0.stop_bit_num; + } +} + +/** + * @brief Configure the UART parity check mode. + * + * @param hw Beginning address of the peripheral registers. + * @param parity_mode The parity check mode to be set. + * + * @return None. + */ +static inline void uart_ll_set_parity(uart_dev_t *hw, uart_parity_t parity_mode) +{ + if(parity_mode != UART_PARITY_DISABLE) { + hw->conf0.parity = parity_mode & 0x1; + } + hw->conf0.parity_en = (parity_mode >> 1) & 0x1; +} + +/** + * @brief Get the UART parity check mode configuration. + * + * @param hw Beginning address of the peripheral registers. + * @param parity_mode The pointer to accept the parity check mode configuration. + * + * @return None. + */ +static inline void uart_ll_get_parity(uart_dev_t *hw, uart_parity_t *parity_mode) +{ + if(hw->conf0.parity_en) { + *parity_mode = 0X2 | hw->conf0.parity; + } else { + *parity_mode = UART_PARITY_DISABLE; + } +} + +/** + * @brief Set the UART rxfifo full threshold value. When the data in rxfifo is more than the threshold value, + * it will produce rxfifo_full_int_raw interrupt. + * + * @param hw Beginning address of the peripheral registers. + * @param full_thrhd The full threshold value of the rxfifo. `full_thrhd` should be less than `UART_LL_FIFO_DEF_LEN`. + * + * @return None. + */ +static inline void uart_ll_set_rxfifo_full_thr(uart_dev_t *hw, uint16_t full_thrhd) +{ + hw->conf1.rxfifo_full_thrhd = full_thrhd; +} + +/** + * @brief Set the txfifo empty threshold. when the data length in txfifo is less than threshold value, + * it will produce txfifo_empty_int_raw interrupt. + * + * @param hw Beginning address of the peripheral registers. + * @param empty_thrhd The empty threshold of txfifo. + * + * @return None. + */ +static inline void uart_ll_set_txfifo_empty_thr(uart_dev_t *hw, uint16_t empty_thrhd) +{ + hw->conf1.txfifo_empty_thrhd = empty_thrhd; +} + +/** + * @brief Set the UART rx-idle threshold value. when receiver takes more time than rx_idle_thrhd to receive a byte data, + * it will produce frame end signal for uhci to stop receiving data. + * + * @param hw Beginning address of the peripheral registers. + * @param rx_idle_thr The rx-idle threshold to be set. + * + * @return None. + */ +static inline void uart_ll_set_rx_idle_thr(uart_dev_t *hw, uint32_t rx_idle_thr) +{ + hw->idle_conf.rx_idle_thrhd = rx_idle_thr; +} + +/** + * @brief Configure the duration time between transfers. + * + * @param hw Beginning address of the peripheral registers. + * @param idle_num the duration time between transfers. + * + * @return None. + */ +static inline void uart_ll_set_tx_idle_num(uart_dev_t *hw, uint32_t idle_num) +{ + hw->idle_conf.tx_idle_num = idle_num; +} + +/** + * @brief Configure the timeout value for receiver receiving a byte, and enable rx timeout function. + * + * @param hw Beginning address of the peripheral registers. + * @param tout_thr The timeout value. The rx timeout function will be disabled if `tout_thr == 0`. + * + * @return None. + */ +static inline void uart_ll_set_rx_tout(uart_dev_t *hw, uint8_t tout_thr) +{ + // The tout_thresh = 1, defines TOUT interrupt timeout equal to + // transmission time of one symbol (~11 bit) on current baudrate + if (hw->conf0.tick_ref_always_on == 0) { + //Hardware issue workaround: when using ref_tick, the rx timeout threshold needs increase to 10 times. + //T_ref = T_apb * APB_CLK/(REF_TICK << CLKDIV_FRAG_BIT_WIDTH) + tout_thr = tout_thr * UART_LL_TOUT_REF_FACTOR_DEFAULT; + } + if(tout_thr > 0) { + hw->conf1.rx_tout_thrhd = tout_thr; + hw->conf1.rx_tout_en = 1; + } else { + hw->conf1.rx_tout_en = 0; + } +} + +/** + * @brief Configure the transmiter to send break chars. + * + * @param hw Beginning address of the peripheral registers. + * @param break_num The number of the break chars need to be send. + * + * @return None. + */ +static inline void uart_ll_tx_break(uart_dev_t *hw, uint32_t break_num) +{ + if(break_num > 0) { + hw->idle_conf.tx_brk_num = break_num; + hw->conf0.txd_brk = 1; + } else { + hw->conf0.txd_brk = 0; + } +} + +/** + * @brief Configure the UART hardware flow control. + * + * @param hw Beginning address of the peripheral registers. + * @param flow_ctrl The hw flow control configuration. + * @param rx_thrs The rx flow control signal will be active if the data length in rxfifo is more than this value. + * + * @return None. + */ +static inline void uart_ll_set_hw_flow_ctrl(uart_dev_t *hw, uart_hw_flowcontrol_t flow_ctrl, uint32_t rx_thrs) +{ + //only when UART_HW_FLOWCTRL_RTS is set , will the rx_thresh value be set. + if(flow_ctrl & UART_HW_FLOWCTRL_RTS) { + hw->conf1.rx_flow_thrhd = rx_thrs; + hw->conf1.rx_flow_en = 1; + } else { + hw->conf1.rx_flow_en = 0; + } + if(flow_ctrl & UART_HW_FLOWCTRL_CTS) { + hw->conf0.tx_flow_en = 1; + } else { + hw->conf0.tx_flow_en = 0; + } +} + +/** + * @brief Configure the hardware flow control. + * + * @param hw Beginning address of the peripheral registers. + * @param flow_ctrl A pointer to accept the hw flow control configuration. + * + * @return None. + */ +static inline void uart_ll_get_hw_flow_ctrl(uart_dev_t *hw, uart_hw_flowcontrol_t *flow_ctrl) +{ + *flow_ctrl = UART_HW_FLOWCTRL_DISABLE; + if(hw->conf1.rx_flow_en) { + *flow_ctrl |= UART_HW_FLOWCTRL_RTS; + } + if(hw->conf0.tx_flow_en) { + *flow_ctrl |= UART_HW_FLOWCTRL_CTS; + } +} + +/** + * @brief Configure the software flow control. + * + * @param hw Beginning address of the peripheral registers. + * @param flow_ctrl The UART sofware flow control settings. + * @param sw_flow_ctrl_en Set true to enable software flow control, otherwise set it false. + * + * @return None. + */ +static inline void uart_ll_set_sw_flow_ctrl(uart_dev_t *hw, uart_sw_flowctrl_t *flow_ctrl, bool sw_flow_ctrl_en) +{ + if(sw_flow_ctrl_en) { + hw->flow_conf.xonoff_del = 1; + hw->flow_conf.sw_flow_con_en = 1; + hw->swfc_conf.xon_threshold = flow_ctrl->xon_thrd; + hw->swfc_conf.xoff_threshold = flow_ctrl->xoff_thrd; + hw->swfc_conf.xon_char = flow_ctrl->xon_char; + hw->swfc_conf.xoff_char = flow_ctrl->xoff_char; + } else { + hw->flow_conf.sw_flow_con_en = 0; + hw->flow_conf.xonoff_del = 0; + } +} + +/** + * @brief Configure the AT cmd char. When the receiver receives a continuous AT cmd char, it will produce at_cmd_char_det interrupt. + * + * @param hw Beginning address of the peripheral registers. + * @param cmd_char The AT cmd char configuration.The configuration member is: + * - cmd_char The AT cmd character + * - char_num The number of received AT cmd char must be equal to or greater than this value + * - gap_tout The interval between each AT cmd char, when the duration is less than this value, it will not take this data as AT cmd char + * - pre_idle The idle time before the first AT cmd char, when the duration is less than this value, it will not take the previous data as the last AT cmd char + * - post_idle The idle time after the last AT cmd char, when the duration is less than this value, it will not take this data as the first AT cmd char + * + * @return None. + */ +static inline 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.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; + hw->at_cmd_gaptout.rx_gap_tout = cmd_char->gap_tout; +} + +/** + * @brief Set the UART data bit mode. + * + * @param hw Beginning address of the peripheral registers. + * @param data_bit The data bit mode to be set. + * + * @return None. + */ +static inline void uart_ll_set_data_bit_num(uart_dev_t *hw, uart_word_length_t data_bit) +{ + hw->conf0.bit_num = data_bit; +} + +/** + * @brief Get the UART source clock. + * + * @param hw Beginning address of the peripheral registers. + * @param source_clk The pointer to accept the UART source clock configuration. + * + * @return None. + */ +static inline void uart_ll_get_sclk(uart_dev_t *hw, uart_sclk_t* source_clk) +{ + *source_clk = hw->conf0.tick_ref_always_on ? UART_SCLK_APB : UART_SCLK_REF_TICK; +} + +/** + * @brief Set the rts active level. + * + * @param hw Beginning address of the peripheral registers. + * @param level The rts active level, 0 or 1. + * + * @return None. + */ +static inline void uart_ll_set_rts_active_level(uart_dev_t *hw, int level) +{ + hw->conf0.sw_rts = level & 0x1; +} + +/** + * @brief Set the dtr active level. + * + * @param hw Beginning address of the peripheral registers. + * @param level The dtr active level, 0 or 1. + * + * @return None. + */ +static inline void uart_ll_set_dtr_active_level(uart_dev_t *hw, int level) +{ + hw->conf0.sw_dtr = level & 0x1; +} + +/** + * @brief Set the UART wakeup threshold. + * + * @param hw Beginning address of the peripheral registers. + * @param wakeup_thrd The wakeup threshold value to be set. When the input rx edge changes more than this value, + * the UART will active from light sleeping mode. + * + * @return None. + */ +static inline void uart_ll_set_wakeup_thrd(uart_dev_t *hw, uint32_t wakeup_thrd) +{ + hw->sleep_conf.active_threshold = wakeup_thrd - SOC_UART_MIN_WAKEUP_THRESH; +} + +/** + * @brief Configure the UART work in normal mode. + * + * @param hw Beginning address of the peripheral registers. + * + * @return None. + */ +static inline 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->conf0.irda_en = 0; +} + +/** + * @brief Configure the UART work in rs485_app_ctrl mode. + * + * @param hw Beginning address of the peripheral registers. + * + * @return None. + */ +static inline 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->conf0.irda_en = 0; + hw->conf0.sw_rts = 0; + hw->conf0.irda_en = 0; + hw->rs485_conf.en = 1; +} + +/** + * @brief Configure the UART work in rs485_half_duplex mode. + * + * @param hw Beginning address of the peripheral registers. + * + * @return None. + */ +static inline 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; + // This is to void collision + hw->rs485_conf.rx_busy_tx_en = 1; + hw->conf0.irda_en = 0; + hw->rs485_conf.en = 1; +} + +/** + * @brief Configure the UART work in collision_detect mode. + * + * @param hw Beginning address of the peripheral registers. + * + * @return None. + */ +static inline 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 ; + // Transmitter should send data when the receiver is busy + hw->rs485_conf.rx_busy_tx_en = 1; + hw->conf0.sw_rts = 0; + hw->rs485_conf.en = 1; +} + +/** + * @brief Configure the UART work in irda mode. + * + * @param hw Beginning address of the peripheral registers. + * + * @return None. + */ +static inline 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->conf0.sw_rts = 0; + hw->conf0.irda_en = 1; +} + +/** + * @brief Set uart mode. + * + * @param hw Beginning address of the peripheral registers. + * @param mode The UART mode to be set. + * + * @return None. + */ +static inline void uart_ll_set_mode(uart_dev_t *hw, uart_mode_t mode) +{ + switch (mode) { + default: + case UART_MODE_UART: + uart_ll_set_mode_normal(hw); + break; + case UART_MODE_RS485_COLLISION_DETECT: + uart_ll_set_mode_collision_detect(hw); + break; + case UART_MODE_RS485_APP_CTRL: + uart_ll_set_mode_rs485_app_ctrl(hw); + break; + case UART_MODE_RS485_HALF_DUPLEX: + uart_ll_set_mode_rs485_half_duplex(hw); + break; + case UART_MODE_IRDA: + uart_ll_set_mode_irda(hw); + break; + } +} + +/** + * @brief Get the UART AT cmd char configuration. + * + * @param hw Beginning address of the peripheral registers. + * @param cmd_char The Pointer to accept value of UART AT cmd char. + * @param char_num Pointer to accept the repeat number of UART AT cmd char. + * + * @return None. + */ +static inline 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; + *char_num = hw->at_cmd_char.char_num; +} + +/** + * @brief Get the UART wakeup threshold value. + * + * @param hw Beginning address of the peripheral registers. + * + * @return The UART wakeup threshold value. + */ +static inline uint32_t uart_ll_get_wakeup_thrd(uart_dev_t *hw) +{ + return hw->sleep_conf.active_threshold + SOC_UART_MIN_WAKEUP_THRESH; +} + +/** + * @brief Get the UART data bit configuration. + * + * @param hw Beginning address of the peripheral registers. + * @param data_bit The pointer to accept the UART data bit configuration. + * + * @return The bit mode. + */ +static inline void uart_ll_get_data_bit_num(uart_dev_t *hw, uart_word_length_t *data_bit) +{ + *data_bit = hw->conf0.bit_num; +} + +/** + * @brief Check if the UART sending state machine is in the IDLE state. + * + * @param hw Beginning address of the peripheral registers. + * + * @return True if the state machine is in the IDLE state, otherwise false is returned. + */ +static inline bool uart_ll_is_tx_idle(uart_dev_t *hw) +{ + typeof(hw->status) status = hw->status; + return ((status.txfifo_cnt == 0) && (status.st_utx_out == 0)); +} + +/** + * @brief Check if the UART rts flow control is enabled. + * + * @param hw Beginning address of the peripheral registers. + * + * @return True if hw rts flow control is enabled, otherwise false is returned. + */ +static inline bool uart_ll_is_hw_rts_en(uart_dev_t *hw) +{ + return hw->conf1.rx_flow_en; +} + +/** + * @brief Check if the UART cts flow control is enabled. + * + * @param hw Beginning address of the peripheral registers. + * + * @return True if hw cts flow control is enabled, otherwise false is returned. + */ +static inline bool uart_ll_is_hw_cts_en(uart_dev_t *hw) +{ + return hw->conf0.tx_flow_en; +} + +/** + * @brief Configure TX signal loop back to RX module, just for the testing purposes + * + * @param hw Beginning address of the peripheral registers. + * @param loop_back_en Set ture to enable the loop back function, else set it false. + * + * @return None + */ +static inline void uart_ll_set_loop_back(uart_dev_t *hw, bool loop_back_en) +{ + hw->conf0.loopback = loop_back_en; +} + +/** + * @brief Inverse the UART signal with the given mask. + * + * @param hw Beginning address of the peripheral registers. + * @param inv_mask The UART signal bitmap needs to be inversed. + * Use the ORred mask of `uart_signal_inv_t`; + * + * @return None. + */ +static inline void uart_ll_inverse_signal(uart_dev_t *hw, uint32_t inv_mask) +{ + typeof(hw->conf0) 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; + conf0_reg.cts_inv |= (inv_mask & UART_SIGNAL_CTS_INV) ? 1 : 0; + conf0_reg.dsr_inv |= (inv_mask & UART_SIGNAL_DSR_INV) ? 1 : 0; + conf0_reg.txd_inv |= (inv_mask & UART_SIGNAL_TXD_INV) ? 1 : 0; + conf0_reg.rts_inv |= (inv_mask & UART_SIGNAL_RTS_INV) ? 1 : 0; + conf0_reg.dtr_inv |= (inv_mask & UART_SIGNAL_DTR_INV) ? 1 : 0; + hw->conf0.val = conf0_reg.val; +} + +#undef UART_LL_TOUT_REF_FACTOR_DEFAULT diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/adc_caps.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/adc_caps.h new file mode 100644 index 0000000000000..b4405d61da0bd --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/adc_caps.h @@ -0,0 +1,25 @@ +#pragma once + +#define SOC_ADC_PERIPH_NUM (2) +#define SOC_ADC_PATT_LEN_MAX (16) + +#define SOC_ADC_CHANNEL_NUM(PERIPH_NUM) ((PERIPH_NUM==0)? 8: 10) +#define SOC_ADC_MAX_CHANNEL_NUM (10) + +#define SOC_ADC1_DATA_INVERT_DEFAULT (1) +#define SOC_ADC2_DATA_INVERT_DEFAULT (0) + +#define SOC_ADC_FSM_RSTB_WAIT_DEFAULT (8) +#define SOC_ADC_FSM_START_WAIT_DEFAULT (5) +#define SOC_ADC_FSM_STANDBY_WAIT_DEFAULT (100) +#define ADC_FSM_SAMPLE_CYCLE_DEFAULT (2) + +/** + * Check if adc support digital controller (DMA) mode. + * @value + * - 1 : support; + * - 0 : not support; + */ +#define SOC_ADC_SUPPORT_DMA_MODE(PERIPH_NUM) ((PERIPH_NUM==0)? 1: 0) + +#define SOC_ADC_PWDET_CCT_DEFAULT (4) \ No newline at end of file diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/adc_channel.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/adc_channel.h new file mode 100644 index 0000000000000..fa6fdce6deb80 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/adc_channel.h @@ -0,0 +1,72 @@ +// 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. + +#ifndef _SOC_ADC_CHANNEL_H +#define _SOC_ADC_CHANNEL_H + +#define ADC1_GPIO36_CHANNEL ADC1_CHANNEL_0 +#define ADC1_CHANNEL_0_GPIO_NUM 36 + +#define ADC1_GPIO37_CHANNEL ADC1_CHANNEL_1 +#define ADC1_CHANNEL_1_GPIO_NUM 37 + +#define ADC1_GPIO38_CHANNEL ADC1_CHANNEL_2 +#define ADC1_CHANNEL_2_GPIO_NUM 38 + +#define ADC1_GPIO39_CHANNEL ADC1_CHANNEL_3 +#define ADC1_CHANNEL_3_GPIO_NUM 39 + +#define ADC1_GPIO32_CHANNEL ADC1_CHANNEL_4 +#define ADC1_CHANNEL_4_GPIO_NUM 32 + +#define ADC1_GPIO33_CHANNEL ADC1_CHANNEL_5 +#define ADC1_CHANNEL_5_GPIO_NUM 33 + +#define ADC1_GPIO34_CHANNEL ADC1_CHANNEL_6 +#define ADC1_CHANNEL_6_GPIO_NUM 34 + +#define ADC1_GPIO35_CHANNEL ADC1_CHANNEL_7 +#define ADC1_CHANNEL_7_GPIO_NUM 35 + +#define ADC2_GPIO4_CHANNEL ADC2_CHANNEL_0 +#define ADC2_CHANNEL_0_GPIO_NUM 4 + +#define ADC2_GPIO0_CHANNEL ADC2_CHANNEL_1 +#define ADC2_CHANNEL_1_GPIO_NUM 0 + +#define ADC2_GPIO2_CHANNEL ADC2_CHANNEL_2 +#define ADC2_CHANNEL_2_GPIO_NUM 2 + +#define ADC2_GPIO15_CHANNEL ADC2_CHANNEL_3 +#define ADC2_CHANNEL_3_GPIO_NUM 15 + +#define ADC2_GPIO13_CHANNEL ADC2_CHANNEL_4 +#define ADC2_CHANNEL_4_GPIO_NUM 13 + +#define ADC2_GPIO12_CHANNEL ADC2_CHANNEL_5 +#define ADC2_CHANNEL_5_GPIO_NUM 12 + +#define ADC2_GPIO14_CHANNEL ADC2_CHANNEL_6 +#define ADC2_CHANNEL_6_GPIO_NUM 14 + +#define ADC2_GPIO27_CHANNEL ADC2_CHANNEL_7 +#define ADC2_CHANNEL_7_GPIO_NUM 27 + +#define ADC2_GPIO25_CHANNEL ADC2_CHANNEL_8 +#define ADC2_CHANNEL_8_GPIO_NUM 25 + +#define ADC2_GPIO26_CHANNEL ADC2_CHANNEL_9 +#define ADC2_CHANNEL_9_GPIO_NUM 26 + +#endif /* _SOC_ADC_CHANNEL_H_ */ diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/apb_ctrl_reg.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/apb_ctrl_reg.h new file mode 100644 index 0000000000000..2e5ea54c4c7a6 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/apb_ctrl_reg.h @@ -0,0 +1,294 @@ +// 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. +#ifndef _SOC_APB_CTRL_REG_H_ +#define _SOC_APB_CTRL_REG_H_ + +#include "soc.h" +#define APB_CTRL_SYSCLK_CONF_REG (DR_REG_APB_CTRL_BASE + 0x0) +/* APB_CTRL_QUICK_CLK_CHNG : R/W ;bitpos:[13] ;default: 1'b1 ; */ +/*description: */ +#define APB_CTRL_QUICK_CLK_CHNG (BIT(13)) +#define APB_CTRL_QUICK_CLK_CHNG_M (BIT(13)) +#define APB_CTRL_QUICK_CLK_CHNG_V 0x1 +#define APB_CTRL_QUICK_CLK_CHNG_S 13 +/* APB_CTRL_RST_TICK_CNT : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define APB_CTRL_RST_TICK_CNT (BIT(12)) +#define APB_CTRL_RST_TICK_CNT_M (BIT(12)) +#define APB_CTRL_RST_TICK_CNT_V 0x1 +#define APB_CTRL_RST_TICK_CNT_S 12 +/* APB_CTRL_CLK_EN : R/W ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define APB_CTRL_CLK_EN (BIT(11)) +#define APB_CTRL_CLK_EN_M (BIT(11)) +#define APB_CTRL_CLK_EN_V 0x1 +#define APB_CTRL_CLK_EN_S 11 +/* APB_CTRL_CLK_320M_EN : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define APB_CTRL_CLK_320M_EN (BIT(10)) +#define APB_CTRL_CLK_320M_EN_M (BIT(10)) +#define APB_CTRL_CLK_320M_EN_V 0x1 +#define APB_CTRL_CLK_320M_EN_S 10 +/* APB_CTRL_PRE_DIV_CNT : R/W ;bitpos:[9:0] ;default: 10'h0 ; */ +/*description: */ +#define APB_CTRL_PRE_DIV_CNT 0x000003FF +#define APB_CTRL_PRE_DIV_CNT_M ((APB_CTRL_PRE_DIV_CNT_V)<<(APB_CTRL_PRE_DIV_CNT_S)) +#define APB_CTRL_PRE_DIV_CNT_V 0x3FF +#define APB_CTRL_PRE_DIV_CNT_S 0 + +#define APB_CTRL_XTAL_TICK_CONF_REG (DR_REG_APB_CTRL_BASE + 0x4) +/* APB_CTRL_XTAL_TICK_NUM : R/W ;bitpos:[7:0] ;default: 8'd39 ; */ +/*description: */ +#define APB_CTRL_XTAL_TICK_NUM 0x000000FF +#define APB_CTRL_XTAL_TICK_NUM_M ((APB_CTRL_XTAL_TICK_NUM_V)<<(APB_CTRL_XTAL_TICK_NUM_S)) +#define APB_CTRL_XTAL_TICK_NUM_V 0xFF +#define APB_CTRL_XTAL_TICK_NUM_S 0 + +#define APB_CTRL_PLL_TICK_CONF_REG (DR_REG_APB_CTRL_BASE + 0x8) +/* APB_CTRL_PLL_TICK_NUM : R/W ;bitpos:[7:0] ;default: 8'd79 ; */ +/*description: */ +#define APB_CTRL_PLL_TICK_NUM 0x000000FF +#define APB_CTRL_PLL_TICK_NUM_M ((APB_CTRL_PLL_TICK_NUM_V)<<(APB_CTRL_PLL_TICK_NUM_S)) +#define APB_CTRL_PLL_TICK_NUM_V 0xFF +#define APB_CTRL_PLL_TICK_NUM_S 0 + +#define APB_CTRL_CK8M_TICK_CONF_REG (DR_REG_APB_CTRL_BASE + 0xC) +/* APB_CTRL_CK8M_TICK_NUM : R/W ;bitpos:[7:0] ;default: 8'd11 ; */ +/*description: */ +#define APB_CTRL_CK8M_TICK_NUM 0x000000FF +#define APB_CTRL_CK8M_TICK_NUM_M ((APB_CTRL_CK8M_TICK_NUM_V)<<(APB_CTRL_CK8M_TICK_NUM_S)) +#define APB_CTRL_CK8M_TICK_NUM_V 0xFF +#define APB_CTRL_CK8M_TICK_NUM_S 0 + +#define APB_CTRL_APB_SARADC_CTRL_REG (DR_REG_APB_CTRL_BASE + 0x10) +/* APB_CTRL_SARADC_DATA_TO_I2S : R/W ;bitpos:[26] ;default: 1'b0 ; */ +/*description: 1: I2S input data is from SAR ADC (for DMA) 0: I2S input data + is from GPIO matrix*/ +#define APB_CTRL_SARADC_DATA_TO_I2S (BIT(26)) +#define APB_CTRL_SARADC_DATA_TO_I2S_M (BIT(26)) +#define APB_CTRL_SARADC_DATA_TO_I2S_V 0x1 +#define APB_CTRL_SARADC_DATA_TO_I2S_S 26 +/* APB_CTRL_SARADC_DATA_SAR_SEL : R/W ;bitpos:[25] ;default: 1'b0 ; */ +/*description: 1: sar_sel will be coded by the MSB of the 16-bit output data + in this case the resolution should not be larger than 11 bits.*/ +#define APB_CTRL_SARADC_DATA_SAR_SEL (BIT(25)) +#define APB_CTRL_SARADC_DATA_SAR_SEL_M (BIT(25)) +#define APB_CTRL_SARADC_DATA_SAR_SEL_V 0x1 +#define APB_CTRL_SARADC_DATA_SAR_SEL_S 25 +/* APB_CTRL_SARADC_SAR2_PATT_P_CLEAR : R/W ;bitpos:[24] ;default: 1'd0 ; */ +/*description: clear the pointer of pattern table for DIG ADC2 CTRL*/ +#define APB_CTRL_SARADC_SAR2_PATT_P_CLEAR (BIT(24)) +#define APB_CTRL_SARADC_SAR2_PATT_P_CLEAR_M (BIT(24)) +#define APB_CTRL_SARADC_SAR2_PATT_P_CLEAR_V 0x1 +#define APB_CTRL_SARADC_SAR2_PATT_P_CLEAR_S 24 +/* APB_CTRL_SARADC_SAR1_PATT_P_CLEAR : R/W ;bitpos:[23] ;default: 1'd0 ; */ +/*description: clear the pointer of pattern table for DIG ADC1 CTRL*/ +#define APB_CTRL_SARADC_SAR1_PATT_P_CLEAR (BIT(23)) +#define APB_CTRL_SARADC_SAR1_PATT_P_CLEAR_M (BIT(23)) +#define APB_CTRL_SARADC_SAR1_PATT_P_CLEAR_V 0x1 +#define APB_CTRL_SARADC_SAR1_PATT_P_CLEAR_S 23 +/* APB_CTRL_SARADC_SAR2_PATT_LEN : R/W ;bitpos:[22:19] ;default: 4'd15 ; */ +/*description: 0 ~ 15 means length 1 ~ 16*/ +#define APB_CTRL_SARADC_SAR2_PATT_LEN 0x0000000F +#define APB_CTRL_SARADC_SAR2_PATT_LEN_M ((APB_CTRL_SARADC_SAR2_PATT_LEN_V)<<(APB_CTRL_SARADC_SAR2_PATT_LEN_S)) +#define APB_CTRL_SARADC_SAR2_PATT_LEN_V 0xF +#define APB_CTRL_SARADC_SAR2_PATT_LEN_S 19 +/* APB_CTRL_SARADC_SAR1_PATT_LEN : R/W ;bitpos:[18:15] ;default: 4'd15 ; */ +/*description: 0 ~ 15 means length 1 ~ 16*/ +#define APB_CTRL_SARADC_SAR1_PATT_LEN 0x0000000F +#define APB_CTRL_SARADC_SAR1_PATT_LEN_M ((APB_CTRL_SARADC_SAR1_PATT_LEN_V)<<(APB_CTRL_SARADC_SAR1_PATT_LEN_S)) +#define APB_CTRL_SARADC_SAR1_PATT_LEN_V 0xF +#define APB_CTRL_SARADC_SAR1_PATT_LEN_S 15 +/* APB_CTRL_SARADC_SAR_CLK_DIV : R/W ;bitpos:[14:7] ;default: 8'd4 ; */ +/*description: SAR clock divider*/ +#define APB_CTRL_SARADC_SAR_CLK_DIV 0x000000FF +#define APB_CTRL_SARADC_SAR_CLK_DIV_M ((APB_CTRL_SARADC_SAR_CLK_DIV_V)<<(APB_CTRL_SARADC_SAR_CLK_DIV_S)) +#define APB_CTRL_SARADC_SAR_CLK_DIV_V 0xFF +#define APB_CTRL_SARADC_SAR_CLK_DIV_S 7 +/* APB_CTRL_SARADC_SAR_CLK_GATED : R/W ;bitpos:[6] ;default: 1'b1 ; */ +/*description: */ +#define APB_CTRL_SARADC_SAR_CLK_GATED (BIT(6)) +#define APB_CTRL_SARADC_SAR_CLK_GATED_M (BIT(6)) +#define APB_CTRL_SARADC_SAR_CLK_GATED_V 0x1 +#define APB_CTRL_SARADC_SAR_CLK_GATED_S 6 +/* APB_CTRL_SARADC_SAR_SEL : R/W ;bitpos:[5] ;default: 1'd0 ; */ +/*description: 0: SAR1 1: SAR2 only work for single SAR mode*/ +#define APB_CTRL_SARADC_SAR_SEL (BIT(5)) +#define APB_CTRL_SARADC_SAR_SEL_M (BIT(5)) +#define APB_CTRL_SARADC_SAR_SEL_V 0x1 +#define APB_CTRL_SARADC_SAR_SEL_S 5 +/* APB_CTRL_SARADC_WORK_MODE : R/W ;bitpos:[4:3] ;default: 2'd0 ; */ +/*description: 0: single mode 1: double mode 2: alternate mode*/ +#define APB_CTRL_SARADC_WORK_MODE 0x00000003 +#define APB_CTRL_SARADC_WORK_MODE_M ((APB_CTRL_SARADC_WORK_MODE_V)<<(APB_CTRL_SARADC_WORK_MODE_S)) +#define APB_CTRL_SARADC_WORK_MODE_V 0x3 +#define APB_CTRL_SARADC_WORK_MODE_S 3 +/* APB_CTRL_SARADC_SAR2_MUX : R/W ;bitpos:[2] ;default: 1'd0 ; */ +/*description: 1: SAR ADC2 is controlled by DIG ADC2 CTRL 0: SAR ADC2 is controlled + by PWDET CTRL*/ +#define APB_CTRL_SARADC_SAR2_MUX (BIT(2)) +#define APB_CTRL_SARADC_SAR2_MUX_M (BIT(2)) +#define APB_CTRL_SARADC_SAR2_MUX_V 0x1 +#define APB_CTRL_SARADC_SAR2_MUX_S 2 +/* APB_CTRL_SARADC_START : R/W ;bitpos:[1] ;default: 1'd0 ; */ +/*description: */ +#define APB_CTRL_SARADC_START (BIT(1)) +#define APB_CTRL_SARADC_START_M (BIT(1)) +#define APB_CTRL_SARADC_START_V 0x1 +#define APB_CTRL_SARADC_START_S 1 +/* APB_CTRL_SARADC_START_FORCE : R/W ;bitpos:[0] ;default: 1'd0 ; */ +/*description: */ +#define APB_CTRL_SARADC_START_FORCE (BIT(0)) +#define APB_CTRL_SARADC_START_FORCE_M (BIT(0)) +#define APB_CTRL_SARADC_START_FORCE_V 0x1 +#define APB_CTRL_SARADC_START_FORCE_S 0 + +#define APB_CTRL_APB_SARADC_CTRL2_REG (DR_REG_APB_CTRL_BASE + 0x14) +/* APB_CTRL_SARADC_SAR2_INV : R/W ;bitpos:[10] ;default: 1'd0 ; */ +/*description: 1: data to DIG ADC2 CTRL is inverted otherwise not*/ +#define APB_CTRL_SARADC_SAR2_INV (BIT(10)) +#define APB_CTRL_SARADC_SAR2_INV_M (BIT(10)) +#define APB_CTRL_SARADC_SAR2_INV_V 0x1 +#define APB_CTRL_SARADC_SAR2_INV_S 10 +/* APB_CTRL_SARADC_SAR1_INV : R/W ;bitpos:[9] ;default: 1'd0 ; */ +/*description: 1: data to DIG ADC1 CTRL is inverted otherwise not*/ +#define APB_CTRL_SARADC_SAR1_INV (BIT(9)) +#define APB_CTRL_SARADC_SAR1_INV_M (BIT(9)) +#define APB_CTRL_SARADC_SAR1_INV_V 0x1 +#define APB_CTRL_SARADC_SAR1_INV_S 9 +/* APB_CTRL_SARADC_MAX_MEAS_NUM : R/W ;bitpos:[8:1] ;default: 8'd255 ; */ +/*description: max conversion number*/ +#define APB_CTRL_SARADC_MAX_MEAS_NUM 0x000000FF +#define APB_CTRL_SARADC_MAX_MEAS_NUM_M ((APB_CTRL_SARADC_MAX_MEAS_NUM_V)<<(APB_CTRL_SARADC_MAX_MEAS_NUM_S)) +#define APB_CTRL_SARADC_MAX_MEAS_NUM_V 0xFF +#define APB_CTRL_SARADC_MAX_MEAS_NUM_S 1 +/* APB_CTRL_SARADC_MEAS_NUM_LIMIT : R/W ;bitpos:[0] ;default: 1'd0 ; */ +/*description: */ +#define APB_CTRL_SARADC_MEAS_NUM_LIMIT (BIT(0)) +#define APB_CTRL_SARADC_MEAS_NUM_LIMIT_M (BIT(0)) +#define APB_CTRL_SARADC_MEAS_NUM_LIMIT_V 0x1 +#define APB_CTRL_SARADC_MEAS_NUM_LIMIT_S 0 + +#define APB_CTRL_APB_SARADC_FSM_REG (DR_REG_APB_CTRL_BASE + 0x18) +/* APB_CTRL_SARADC_SAMPLE_CYCLE : R/W ;bitpos:[31:24] ;default: 8'd2 ; */ +/*description: sample cycles*/ +#define APB_CTRL_SARADC_SAMPLE_CYCLE 0x000000FF +#define APB_CTRL_SARADC_SAMPLE_CYCLE_M ((APB_CTRL_SARADC_SAMPLE_CYCLE_V)<<(APB_CTRL_SARADC_SAMPLE_CYCLE_S)) +#define APB_CTRL_SARADC_SAMPLE_CYCLE_V 0xFF +#define APB_CTRL_SARADC_SAMPLE_CYCLE_S 24 +/* APB_CTRL_SARADC_START_WAIT : R/W ;bitpos:[23:16] ;default: 8'd8 ; */ +/*description: */ +#define APB_CTRL_SARADC_START_WAIT 0x000000FF +#define APB_CTRL_SARADC_START_WAIT_M ((APB_CTRL_SARADC_START_WAIT_V)<<(APB_CTRL_SARADC_START_WAIT_S)) +#define APB_CTRL_SARADC_START_WAIT_V 0xFF +#define APB_CTRL_SARADC_START_WAIT_S 16 +/* APB_CTRL_SARADC_STANDBY_WAIT : R/W ;bitpos:[15:8] ;default: 8'd255 ; */ +/*description: */ +#define APB_CTRL_SARADC_STANDBY_WAIT 0x000000FF +#define APB_CTRL_SARADC_STANDBY_WAIT_M ((APB_CTRL_SARADC_STANDBY_WAIT_V)<<(APB_CTRL_SARADC_STANDBY_WAIT_S)) +#define APB_CTRL_SARADC_STANDBY_WAIT_V 0xFF +#define APB_CTRL_SARADC_STANDBY_WAIT_S 8 +/* APB_CTRL_SARADC_RSTB_WAIT : R/W ;bitpos:[7:0] ;default: 8'd8 ; */ +/*description: */ +#define APB_CTRL_SARADC_RSTB_WAIT 0x000000FF +#define APB_CTRL_SARADC_RSTB_WAIT_M ((APB_CTRL_SARADC_RSTB_WAIT_V)<<(APB_CTRL_SARADC_RSTB_WAIT_S)) +#define APB_CTRL_SARADC_RSTB_WAIT_V 0xFF +#define APB_CTRL_SARADC_RSTB_WAIT_S 0 + +#define APB_CTRL_APB_SARADC_SAR1_PATT_TAB1_REG (DR_REG_APB_CTRL_BASE + 0x1C) +/* APB_CTRL_SARADC_SAR1_PATT_TAB1 : R/W ;bitpos:[31:0] ;default: 32'hf0f0f0f ; */ +/*description: item 0 ~ 3 for pattern table 1 (each item one byte)*/ +#define APB_CTRL_SARADC_SAR1_PATT_TAB1 0xFFFFFFFF +#define APB_CTRL_SARADC_SAR1_PATT_TAB1_M ((APB_CTRL_SARADC_SAR1_PATT_TAB1_V)<<(APB_CTRL_SARADC_SAR1_PATT_TAB1_S)) +#define APB_CTRL_SARADC_SAR1_PATT_TAB1_V 0xFFFFFFFF +#define APB_CTRL_SARADC_SAR1_PATT_TAB1_S 0 + +#define APB_CTRL_APB_SARADC_SAR1_PATT_TAB2_REG (DR_REG_APB_CTRL_BASE + 0x20) +/* APB_CTRL_SARADC_SAR1_PATT_TAB2 : R/W ;bitpos:[31:0] ;default: 32'hf0f0f0f ; */ +/*description: Item 4 ~ 7 for pattern table 1 (each item one byte)*/ +#define APB_CTRL_SARADC_SAR1_PATT_TAB2 0xFFFFFFFF +#define APB_CTRL_SARADC_SAR1_PATT_TAB2_M ((APB_CTRL_SARADC_SAR1_PATT_TAB2_V)<<(APB_CTRL_SARADC_SAR1_PATT_TAB2_S)) +#define APB_CTRL_SARADC_SAR1_PATT_TAB2_V 0xFFFFFFFF +#define APB_CTRL_SARADC_SAR1_PATT_TAB2_S 0 + +#define APB_CTRL_APB_SARADC_SAR1_PATT_TAB3_REG (DR_REG_APB_CTRL_BASE + 0x24) +/* APB_CTRL_SARADC_SAR1_PATT_TAB3 : R/W ;bitpos:[31:0] ;default: 32'hf0f0f0f ; */ +/*description: Item 8 ~ 11 for pattern table 1 (each item one byte)*/ +#define APB_CTRL_SARADC_SAR1_PATT_TAB3 0xFFFFFFFF +#define APB_CTRL_SARADC_SAR1_PATT_TAB3_M ((APB_CTRL_SARADC_SAR1_PATT_TAB3_V)<<(APB_CTRL_SARADC_SAR1_PATT_TAB3_S)) +#define APB_CTRL_SARADC_SAR1_PATT_TAB3_V 0xFFFFFFFF +#define APB_CTRL_SARADC_SAR1_PATT_TAB3_S 0 + +#define APB_CTRL_APB_SARADC_SAR1_PATT_TAB4_REG (DR_REG_APB_CTRL_BASE + 0x28) +/* APB_CTRL_SARADC_SAR1_PATT_TAB4 : R/W ;bitpos:[31:0] ;default: 32'hf0f0f0f ; */ +/*description: Item 12 ~ 15 for pattern table 1 (each item one byte)*/ +#define APB_CTRL_SARADC_SAR1_PATT_TAB4 0xFFFFFFFF +#define APB_CTRL_SARADC_SAR1_PATT_TAB4_M ((APB_CTRL_SARADC_SAR1_PATT_TAB4_V)<<(APB_CTRL_SARADC_SAR1_PATT_TAB4_S)) +#define APB_CTRL_SARADC_SAR1_PATT_TAB4_V 0xFFFFFFFF +#define APB_CTRL_SARADC_SAR1_PATT_TAB4_S 0 + +#define APB_CTRL_APB_SARADC_SAR2_PATT_TAB1_REG (DR_REG_APB_CTRL_BASE + 0x2C) +/* APB_CTRL_SARADC_SAR2_PATT_TAB1 : R/W ;bitpos:[31:0] ;default: 32'hf0f0f0f ; */ +/*description: item 0 ~ 3 for pattern table 2 (each item one byte)*/ +#define APB_CTRL_SARADC_SAR2_PATT_TAB1 0xFFFFFFFF +#define APB_CTRL_SARADC_SAR2_PATT_TAB1_M ((APB_CTRL_SARADC_SAR2_PATT_TAB1_V)<<(APB_CTRL_SARADC_SAR2_PATT_TAB1_S)) +#define APB_CTRL_SARADC_SAR2_PATT_TAB1_V 0xFFFFFFFF +#define APB_CTRL_SARADC_SAR2_PATT_TAB1_S 0 + +#define APB_CTRL_APB_SARADC_SAR2_PATT_TAB2_REG (DR_REG_APB_CTRL_BASE + 0x30) +/* APB_CTRL_SARADC_SAR2_PATT_TAB2 : R/W ;bitpos:[31:0] ;default: 32'hf0f0f0f ; */ +/*description: Item 4 ~ 7 for pattern table 2 (each item one byte)*/ +#define APB_CTRL_SARADC_SAR2_PATT_TAB2 0xFFFFFFFF +#define APB_CTRL_SARADC_SAR2_PATT_TAB2_M ((APB_CTRL_SARADC_SAR2_PATT_TAB2_V)<<(APB_CTRL_SARADC_SAR2_PATT_TAB2_S)) +#define APB_CTRL_SARADC_SAR2_PATT_TAB2_V 0xFFFFFFFF +#define APB_CTRL_SARADC_SAR2_PATT_TAB2_S 0 + +#define APB_CTRL_APB_SARADC_SAR2_PATT_TAB3_REG (DR_REG_APB_CTRL_BASE + 0x34) +/* APB_CTRL_SARADC_SAR2_PATT_TAB3 : R/W ;bitpos:[31:0] ;default: 32'hf0f0f0f ; */ +/*description: Item 8 ~ 11 for pattern table 2 (each item one byte)*/ +#define APB_CTRL_SARADC_SAR2_PATT_TAB3 0xFFFFFFFF +#define APB_CTRL_SARADC_SAR2_PATT_TAB3_M ((APB_CTRL_SARADC_SAR2_PATT_TAB3_V)<<(APB_CTRL_SARADC_SAR2_PATT_TAB3_S)) +#define APB_CTRL_SARADC_SAR2_PATT_TAB3_V 0xFFFFFFFF +#define APB_CTRL_SARADC_SAR2_PATT_TAB3_S 0 + +#define APB_CTRL_APB_SARADC_SAR2_PATT_TAB4_REG (DR_REG_APB_CTRL_BASE + 0x38) +/* APB_CTRL_SARADC_SAR2_PATT_TAB4 : R/W ;bitpos:[31:0] ;default: 32'hf0f0f0f ; */ +/*description: Item 12 ~ 15 for pattern table 2 (each item one byte)*/ +#define APB_CTRL_SARADC_SAR2_PATT_TAB4 0xFFFFFFFF +#define APB_CTRL_SARADC_SAR2_PATT_TAB4_M ((APB_CTRL_SARADC_SAR2_PATT_TAB4_V)<<(APB_CTRL_SARADC_SAR2_PATT_TAB4_S)) +#define APB_CTRL_SARADC_SAR2_PATT_TAB4_V 0xFFFFFFFF +#define APB_CTRL_SARADC_SAR2_PATT_TAB4_S 0 + +#define APB_CTRL_APLL_TICK_CONF_REG (DR_REG_APB_CTRL_BASE + 0x3C) +/* APB_CTRL_APLL_TICK_NUM : R/W ;bitpos:[7:0] ;default: 8'd99 ; */ +/*description: */ +#define APB_CTRL_APLL_TICK_NUM 0x000000FF +#define APB_CTRL_APLL_TICK_NUM_M ((APB_CTRL_APLL_TICK_NUM_V)<<(APB_CTRL_APLL_TICK_NUM_S)) +#define APB_CTRL_APLL_TICK_NUM_V 0xFF +#define APB_CTRL_APLL_TICK_NUM_S 0 + +#define APB_CTRL_DATE_REG (DR_REG_APB_CTRL_BASE + 0x7C) +/* APB_CTRL_DATE : R/W ;bitpos:[31:0] ;default: 32'h16042000 ; */ +/*description: */ +#define APB_CTRL_DATE 0xFFFFFFFF +#define APB_CTRL_DATE_M ((APB_CTRL_DATE_V)<<(APB_CTRL_DATE_S)) +#define APB_CTRL_DATE_V 0xFFFFFFFF +#define APB_CTRL_DATE_S 0 + + + + +#endif /*_SOC_APB_CTRL_REG_H_ */ + + diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/apb_ctrl_struct.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/apb_ctrl_struct.h new file mode 100644 index 0000000000000..c0cb8711b2a78 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/apb_ctrl_struct.h @@ -0,0 +1,132 @@ +// 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. +#ifndef _SOC_APB_CTRL_STRUCT_H_ +#define _SOC_APB_CTRL_STRUCT_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct apb_ctrl_dev_s { + union { + struct { + volatile uint32_t pre_div: 10; + volatile uint32_t clk_320m_en: 1; + volatile uint32_t clk_en: 1; + volatile uint32_t rst_tick: 1; + volatile uint32_t quick_clk_chng: 1; + volatile uint32_t reserved14: 18; + }; + volatile uint32_t val; + }clk_conf; + union { + struct { + volatile uint32_t xtal_tick: 8; + volatile uint32_t reserved8: 24; + }; + volatile uint32_t val; + }xtal_tick_conf; + union { + struct { + volatile uint32_t pll_tick: 8; + volatile uint32_t reserved8: 24; + }; + volatile uint32_t val; + }pll_tick_conf; + union { + struct { + volatile uint32_t ck8m_tick: 8; + volatile uint32_t reserved8: 24; + }; + volatile uint32_t val; + }ck8m_tick_conf; + union { + struct { + volatile uint32_t start_force: 1; + volatile uint32_t start: 1; + volatile uint32_t sar2_mux: 1; /*1: SAR ADC2 is controlled by DIG ADC2 CTRL 0: SAR ADC2 is controlled by PWDET CTRL*/ + volatile uint32_t work_mode: 2; /*0: single mode 1: double mode 2: alternate mode*/ + volatile uint32_t sar_sel: 1; /*0: SAR1 1: SAR2 only work for single SAR mode*/ + volatile uint32_t sar_clk_gated: 1; + volatile uint32_t sar_clk_div: 8; /*SAR clock divider*/ + volatile uint32_t sar1_patt_len: 4; /*0 ~ 15 means length 1 ~ 16*/ + volatile uint32_t sar2_patt_len: 4; /*0 ~ 15 means length 1 ~ 16*/ + volatile uint32_t sar1_patt_p_clear: 1; /*clear the pointer of pattern table for DIG ADC1 CTRL*/ + volatile uint32_t sar2_patt_p_clear: 1; /*clear the pointer of pattern table for DIG ADC2 CTRL*/ + volatile uint32_t data_sar_sel: 1; /*1: sar_sel will be coded by the MSB of the 16-bit output data in this case the resolution should not be larger than 11 bits.*/ + volatile uint32_t data_to_i2s: 1; /*1: I2S input data is from SAR ADC (for DMA) 0: I2S input data is from GPIO matrix*/ + volatile uint32_t reserved27: 5; + }; + volatile uint32_t val; + }saradc_ctrl; + union { + struct { + volatile uint32_t meas_num_limit: 1; + volatile uint32_t max_meas_num: 8; /*max conversion number*/ + volatile uint32_t sar1_inv: 1; /*1: data to DIG ADC1 CTRL is inverted otherwise not*/ + volatile uint32_t sar2_inv: 1; /*1: data to DIG ADC2 CTRL is inverted otherwise not*/ + volatile uint32_t reserved11: 21; + }; + volatile uint32_t val; + }saradc_ctrl2; + union { + struct { + volatile uint32_t rstb_wait: 8; + volatile uint32_t standby_wait: 8; + volatile uint32_t start_wait: 8; + volatile uint32_t sample_cycle: 8; /*sample cycles*/ + }; + volatile uint32_t val; + }saradc_fsm; + volatile uint32_t saradc_sar1_patt_tab1; /*item 0 ~ 3 for pattern table 1 (each item one byte)*/ + volatile uint32_t saradc_sar1_patt_tab2; /*Item 4 ~ 7 for pattern table 1 (each item one byte)*/ + volatile uint32_t saradc_sar1_patt_tab3; /*Item 8 ~ 11 for pattern table 1 (each item one byte)*/ + volatile uint32_t saradc_sar1_patt_tab4; /*Item 12 ~ 15 for pattern table 1 (each item one byte)*/ + volatile uint32_t saradc_sar2_patt_tab1; /*item 0 ~ 3 for pattern table 2 (each item one byte)*/ + volatile uint32_t saradc_sar2_patt_tab2; /*Item 4 ~ 7 for pattern table 2 (each item one byte)*/ + volatile uint32_t saradc_sar2_patt_tab3; /*Item 8 ~ 11 for pattern table 2 (each item one byte)*/ + volatile uint32_t saradc_sar2_patt_tab4; /*Item 12 ~ 15 for pattern table 2 (each item one byte)*/ + union { + struct { + volatile uint32_t apll_tick: 8; + volatile uint32_t reserved8: 24; + }; + volatile uint32_t val; + }apll_tick_conf; + volatile uint32_t reserved_40; + volatile uint32_t reserved_44; + volatile uint32_t reserved_48; + volatile uint32_t reserved_4c; + volatile uint32_t reserved_50; + volatile uint32_t reserved_54; + volatile uint32_t reserved_58; + volatile uint32_t reserved_5c; + volatile uint32_t reserved_60; + volatile uint32_t reserved_64; + volatile uint32_t reserved_68; + volatile uint32_t reserved_6c; + volatile uint32_t reserved_70; + volatile uint32_t reserved_74; + volatile uint32_t reserved_78; + volatile uint32_t date; /**/ +} apb_ctrl_dev_t; + + +#ifdef __cplusplus +} +#endif + +#endif /* _SOC_APB_CTRL_STRUCT_H_ */ diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/bb_reg.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/bb_reg.h new file mode 100644 index 0000000000000..69d2f43d20695 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/bb_reg.h @@ -0,0 +1,42 @@ +// 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. + +#ifndef _SOC_BB_REG_H_ +#define _SOC_BB_REG_H_ + +/* Some of the baseband control registers. + * PU/PD fields defined here are used in sleep related functions. + */ + +#define BBPD_CTRL (DR_REG_BB_BASE + 0x0054) +#define BB_FFT_FORCE_PU (BIT(3)) +#define BB_FFT_FORCE_PU_M (BIT(3)) +#define BB_FFT_FORCE_PU_V 1 +#define BB_FFT_FORCE_PU_S 3 +#define BB_FFT_FORCE_PD (BIT(2)) +#define BB_FFT_FORCE_PD_M (BIT(2)) +#define BB_FFT_FORCE_PD_V 1 +#define BB_FFT_FORCE_PD_S 2 +#define BB_DC_EST_FORCE_PU (BIT(1)) +#define BB_DC_EST_FORCE_PU_M (BIT(1)) +#define BB_DC_EST_FORCE_PU_V 1 +#define BB_DC_EST_FORCE_PU_S 1 +#define BB_DC_EST_FORCE_PD (BIT(0)) +#define BB_DC_EST_FORCE_PD_M (BIT(0)) +#define BB_DC_EST_FORCE_PD_V 1 +#define BB_DC_EST_FORCE_PD_S 0 + + +#endif /* _SOC_BB_REG_H_ */ + diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/boot_mode.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/boot_mode.h new file mode 100644 index 0000000000000..5106e10cfbd9d --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/boot_mode.h @@ -0,0 +1,104 @@ +// 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. + +#ifndef _SOC_BOOT_MODE_H_ +#define _SOC_BOOT_MODE_H_ + +#include "soc.h" + +/*SPI Boot*/ +#define IS_1XXXX(v) (((v)&0x10)==0x10) + +/*HSPI Boot*/ +#define IS_010XX(v) (((v)&0x1c)==0x08) + +/*Download Boot, SDIO/UART0/UART1*/ +#define IS_00XXX(v) (((v)&0x18)==0x00) + +/*Download Boot, SDIO/UART0/UART1,FEI_FEO V2*/ +#define IS_00X00(v) (((v)&0x1b)==0x00) + +/*Download Boot, SDIO/UART0/UART1,FEI_REO V2*/ +#define IS_00X01(v) (((v)&0x1b)==0x01) + +/*Download Boot, SDIO/UART0/UART1,REI_FEO V2*/ +#define IS_00X10(v) (((v)&0x1b)==0x02) + +/*Download Boot, SDIO/UART0/UART1,REI_FEO V2*/ +#define IS_00X11(v) (((v)&0x1b)==0x03) + +/*ATE/ANALOG Mode*/ +#define IS_01110(v) (((v)&0x1f)==0x0e) + +/*Diagnostic Mode+UART0 download Mode*/ +#define IS_01111(v) (((v)&0x1f)==0x0f) + +/*legacy SPI Boot*/ +#define IS_01100(v) (((v)&0x1f)==0x0c) + +/*SDIO_Slave download Mode V1.1*/ +#define IS_01101(v) (((v)&0x1f)==0x0d) + + + +#define BOOT_MODE_GET() (GPIO_REG_READ(GPIO_STRAP)) + +/*do not include download mode*/ +#define ETS_IS_UART_BOOT() IS_01111(BOOT_MODE_GET()) + +/*all spi boot including spi/hspi/legacy*/ +#define ETS_IS_FLASH_BOOT() (IS_1XXXX(BOOT_MODE_GET()) || IS_010XX(BOOT_MODE_GET()) || IS_01100(BOOT_MODE_GET())) + +/*all faster spi boot including spi/hspi*/ +#define ETS_IS_FAST_FLASH_BOOT() (IS_1XXXX(BOOT_MODE_GET()) || IS_010XX(BOOT_MODE_GET())) + +/*all spi boot including spi/legacy*/ +#define ETS_IS_SPI_FLASH_BOOT() (IS_1XXXX(BOOT_MODE_GET()) || IS_01100(BOOT_MODE_GET())) + +/*all spi boot including hspi/legacy*/ +#define ETS_IS_HSPI_FLASH_BOOT() IS_010XX(BOOT_MODE_GET()) + +/*all sdio V2 of failing edge input, failing edge output*/ +#define ETS_IS_SDIO_FEI_FEO_V2_BOOT() IS_00X00(BOOT_MODE_GET()) + +/*all sdio V2 of failing edge input, raising edge output*/ +#define ETS_IS_SDIO_FEI_REO_V2_BOOT() IS_00X01(BOOT_MODE_GET()) + +/*all sdio V2 of raising edge input, failing edge output*/ +#define ETS_IS_SDIO_REI_FEO_V2_BOOT() IS_00X10(BOOT_MODE_GET()) + +/*all sdio V2 of raising edge input, raising edge output*/ +#define ETS_IS_SDIO_REI_REO_V2_BOOT() IS_00X11(BOOT_MODE_GET()) + +/*all sdio V1 of raising edge input, failing edge output*/ +#define ETS_IS_SDIO_REI_FEO_V1_BOOT() IS_01101(BOOT_MODE_GET()) + +/*do not include download mode*/ +#define ETS_IS_SDIO_BOOT() IS_01101(BOOT_MODE_GET()) + +/*joint download boot*/ +#define ETS_IS_SDIO_UART_BOOT() IS_00XXX(BOOT_MODE_GET()) + +/*ATE mode*/ +#define ETS_IS_ATE_BOOT() IS_01110(BOOT_MODE_GET()) + +/*A bit to control flash boot print*/ +#define ETS_IS_PRINT_BOOT() (BOOT_MODE_GET() & 0x2) + +/*used by ETS_IS_SDIO_UART_BOOT*/ +#define SEL_NO_BOOT 0 +#define SEL_SDIO_BOOT BIT0 +#define SEL_UART_BOOT BIT1 + +#endif /* _SOC_BOOT_MODE_H_ */ diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/can_caps.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/can_caps.h new file mode 100644 index 0000000000000..68073a33633eb --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/can_caps.h @@ -0,0 +1,37 @@ +// 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 + +#ifdef __cplusplus +extern "C" { +#endif + +#if (CONFIG_ESP32_REV_MIN >= 2) +#define CAN_BRP_DIV_SUPPORTED 1 +#define CAN_BRP_DIV_THRESH 128 +//Any even number from 2 to 128, or multiples of 4 from 132 to 256 +#define CAN_BRP_IS_VALID(brp) (((brp) >= 2 && (brp) <= 128 && ((brp) & 0x1) == 0) || ((brp) >= 132 && (brp) <= 256 && ((brp) & 0x3) == 0)) +#else +//Any even number from 2 to 128 +#define CAN_BRP_IS_VALID(brp) ((brp) >= 2 && (brp) <= 128 && ((brp) & 0x1) == 0) +#endif + +//Todo: Add FIFO overrun errata workaround +//Todo: Add ECC decode capabilities +//Todo: Add ALC decode capability + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/can_struct.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/can_struct.h new file mode 100644 index 0000000000000..7325cd5a32627 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/can_struct.h @@ -0,0 +1,210 @@ +// 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. + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/* ---------------------------- Register Layout ------------------------------ */ + +/* The CAN peripheral's registers are 8bits, however the ESP32 can only access + * peripheral registers every 32bits. Therefore each CAN register is mapped to + * the least significant byte of every 32bits. + */ + +typedef volatile struct can_dev_s { + //Configuration and Control Registers + union { + struct { + uint32_t rm: 1; /* MOD.0 Reset Mode */ + uint32_t lom: 1; /* MOD.1 Listen Only Mode */ + uint32_t stm: 1; /* MOD.2 Self Test Mode */ + uint32_t afm: 1; /* MOD.3 Acceptance Filter Mode */ + uint32_t reserved28: 28; /* Internal Reserved. MOD.4 Sleep Mode not supported */ + }; + uint32_t val; + } mode_reg; /* Address 0 */ + union { + struct { + uint32_t tr: 1; /* CMR.0 Transmission Request */ + uint32_t at: 1; /* CMR.1 Abort Transmission */ + uint32_t rrb: 1; /* CMR.2 Release Receive Buffer */ + uint32_t cdo: 1; /* CMR.3 Clear Data Overrun */ + uint32_t srr: 1; /* CMR.4 Self Reception Request */ + uint32_t reserved27: 27; /* Internal Reserved */ + }; + uint32_t val; + } command_reg; /* Address 1 */ + union { + struct { + uint32_t rbs: 1; /* SR.0 Receive Buffer Status */ + uint32_t dos: 1; /* SR.1 Data Overrun Status */ + uint32_t tbs: 1; /* SR.2 Transmit Buffer Status */ + uint32_t tcs: 1; /* SR.3 Transmission Complete Status */ + uint32_t rs: 1; /* SR.4 Receive Status */ + uint32_t ts: 1; /* SR.5 Transmit Status */ + uint32_t es: 1; /* SR.6 Error Status */ + uint32_t bs: 1; /* SR.7 Bus Status */ + uint32_t reserved24: 24; /* Internal Reserved */ + }; + uint32_t val; + } status_reg; /* Address 2 */ + union { + struct { + uint32_t ri: 1; /* IR.0 Receive Interrupt */ + uint32_t ti: 1; /* IR.1 Transmit Interrupt */ + uint32_t ei: 1; /* IR.2 Error Interrupt */ + uint32_t reserved2: 2; /* Internal Reserved (Data Overrun interrupt and Wake-up not supported) */ + uint32_t epi: 1; /* IR.5 Error Passive Interrupt */ + uint32_t ali: 1; /* IR.6 Arbitration Lost Interrupt */ + uint32_t bei: 1; /* IR.7 Bus Error Interrupt */ + uint32_t reserved24: 24; /* Internal Reserved */ + }; + uint32_t val; + } interrupt_reg; /* Address 3 */ + union { + struct { + uint32_t rie: 1; /* IER.0 Receive Interrupt Enable */ + uint32_t tie: 1; /* IER.1 Transmit Interrupt Enable */ + uint32_t eie: 1; /* IER.2 Error Interrupt Enable */ + uint32_t doie: 1; /* IER.3 Data Overrun Interrupt Enable */ + uint32_t brp_div: 1; /* THIS IS NOT AN INTERRUPT. brp_div will prescale BRP by 2. Only available on ESP32 Revision 2 or later. Reserved otherwise */ + uint32_t epie: 1; /* IER.5 Error Passive Interrupt Enable */ + uint32_t alie: 1; /* IER.6 Arbitration Lost Interrupt Enable */ + uint32_t beie: 1; /* IER.7 Bus Error Interrupt Enable */ + uint32_t reserved24: 24; /* Internal Reserved */ + }; + uint32_t val; + } interrupt_enable_reg; /* Address 4 */ + uint32_t reserved_05; /* Address 5 */ + union { + struct { + uint32_t brp: 6; /* BTR0[5:0] Baud Rate Prescaler */ + uint32_t sjw: 2; /* BTR0[7:6] Synchronization Jump Width*/ + uint32_t reserved24: 24; /* Internal Reserved */ + }; + uint32_t val; + } bus_timing_0_reg; /* Address 6 */ + union { + struct { + uint32_t tseg1: 4; /* BTR1[3:0] Timing Segment 1 */ + uint32_t tseg2: 3; /* BTR1[6:4] Timing Segment 2 */ + uint32_t sam: 1; /* BTR1.7 Sampling*/ + uint32_t reserved24: 24; /* Internal Reserved */ + }; + uint32_t val; + } bus_timing_1_reg; /* Address 7 */ + uint32_t reserved_08; /* Address 8 (Output control not supported) */ + uint32_t reserved_09; /* Address 9 (Test Register not supported) */ + uint32_t reserved_10; /* Address 10 */ + + //Capture and Counter Registers + union { + struct { + uint32_t alc: 5; /* ALC[4:0] Arbitration lost capture */ + uint32_t reserved27: 27; /* Internal Reserved */ + }; + uint32_t val; + } arbitration_lost_captue_reg; /* Address 11 */ + union { + struct { + uint32_t seg: 5; /* ECC[4:0] Error Code Segment 0 to 5 */ + uint32_t dir: 1; /* ECC.5 Error Direction (TX/RX) */ + uint32_t errc: 2; /* ECC[7:6] Error Code */ + uint32_t reserved24: 24; /* Internal Reserved */ + }; + uint32_t val; + } error_code_capture_reg; /* Address 12 */ + union { + struct { + uint32_t ewl: 8; /* EWL[7:0] Error Warning Limit */ + uint32_t reserved24: 24; /* Internal Reserved */ + }; + uint32_t val; + } error_warning_limit_reg; /* EWLR[7:0] Error Warning Limit: Address 13 */ + union { + struct { + uint32_t rxerr: 8; /* RXERR[7:0] Receive Error Counter */ + uint32_t reserved24: 24; /* Internal Reserved */ + }; + uint32_t val; + } rx_error_counter_reg; /* Address 12 */ + union { + struct { + uint32_t txerr: 8; /* TXERR[7:0] Receive Error Counter */ + uint32_t reserved24: 24; /* Internal Reserved */ + }; + uint32_t val; + } tx_error_counter_reg; /* Address 15 */ + + //Shared Registers (TX Buff/RX Buff/Acc Filter) + union { + struct { + union { + struct { + uint32_t byte: 8; /* ACRx[7:0] Acceptance Code */ + uint32_t reserved24: 24; /* Internal Reserved */ + }; + uint32_t val; + } acr[4]; + union { + struct { + uint32_t byte: 8; /* AMRx[7:0] Acceptance Mask */ + uint32_t reserved24: 24; /* Internal Reserved */ + }; + uint32_t val; + } amr[4]; + uint32_t reserved32[5]; + } acceptance_filter; + union { + struct { + uint32_t byte: 8; + uint32_t reserved24: 24; + }; + uint32_t val; + } tx_rx_buffer[13]; + }; /* Address 16-28 TX/RX Buffer and Acc Filter*/; + + //Misc Registers + union { + struct { + uint32_t rmc: 5; /* RMC[4:0] RX Message Counter */ + uint32_t reserved27: 27; /* Internal Reserved */ + }; + uint32_t val; + } rx_message_counter_reg; /* Address 29 */ + uint32_t reserved_30; /* Address 30 (RX Buffer Start Address not supported) */ + union { + struct { + uint32_t cd: 3; /* CDR[2:0] CLKOUT frequency selector based of fOSC */ + uint32_t co: 1; /* CDR.3 CLKOUT enable/disable */ + uint32_t reserved3: 3; /* Internal Reserved. RXINTEN and CBP not supported */ + uint32_t cm: 1; /* CDR.7 BasicCAN:0 PeliCAN:1 */ + uint32_t reserved24: 24; /* Internal Reserved */ + }; + uint32_t val; + } clock_divider_reg; /* Address 31 */ +} can_dev_t; + +_Static_assert(sizeof(can_dev_t) == 128, "CAN registers should be 32 * 4 bytes"); + +extern can_dev_t CAN; + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/clkout_channel.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/clkout_channel.h new file mode 100644 index 0000000000000..5161e3f0b658a --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/clkout_channel.h @@ -0,0 +1,26 @@ +// 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. + +#ifndef _SOC_CLKOUT_CHANNEL_H +#define _SOC_CLKOUT_CHANNEL_H + +//CLKOUT channels +#define CLKOUT_GPIO0_DIRECT_CHANNEL CLKOUT_CHANNEL_1 +#define CLKOUT_CHANNEL_1_DIRECT_GPIO_NUM 0 +#define CLKOUT_GPIO3_DIRECT_CHANNEL CLKOUT_CHANNEL_2 +#define CLKOUT_CHANNEL_2_DIRECT_GPIO_NUM 3 +#define CLKOUT_GPIO1_DIRECT_CHANNEL CLKOUT_CHANNEL_3 +#define CLKOUT_CHANNEL_3_DIRECT_GPIO_NUM 1 + +#endif diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/cpu.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/cpu.h new file mode 100644 index 0000000000000..06f961567dee6 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/cpu.h @@ -0,0 +1,143 @@ +// 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. + +#ifndef _SOC_CPU_H +#define _SOC_CPU_H + +#include +#include +#include +#include "../../../../xtensa/include/xtensa/corebits.h" +#include "../../../../xtensa/esp32/include/xtensa/config/core.h" + +/* C macros for xtensa special register read/write/exchange */ + +#define RSR(reg, curval) asm volatile ("rsr %0, " #reg : "=r" (curval)); +#define WSR(reg, newval) asm volatile ("wsr %0, " #reg : : "r" (newval)); +#define XSR(reg, swapval) asm volatile ("xsr %0, " #reg : "+r" (swapval)); + +/** @brief Read current stack pointer address + * + */ +static inline void *get_sp(void) +{ + void *sp; + asm volatile ("mov %0, sp;" : "=r" (sp)); + return sp; +} + +/* Functions to set page attributes for Region Protection option in the CPU. + * See Xtensa ISA Reference manual for explanation of arguments (section 4.6.3.2). + */ + +static inline void cpu_write_dtlb(uint32_t vpn, unsigned attr) +{ + asm volatile ("wdtlb %1, %0; dsync\n" :: "r" (vpn), "r" (attr)); +} + + +static inline void cpu_write_itlb(unsigned vpn, unsigned attr) +{ + asm volatile ("witlb %1, %0; isync\n" :: "r" (vpn), "r" (attr)); +} + +static inline void cpu_init_memctl(void) +{ +#if XCHAL_ERRATUM_572 + uint32_t memctl = XCHAL_CACHE_MEMCTL_DEFAULT; + WSR(MEMCTL, memctl); +#endif // XCHAL_ERRATUM_572 +} + +/** + * @brief Configure memory region protection + * + * Make page 0 access raise an exception. + * Also protect some other unused pages so we can catch weirdness. + * Useful attribute values: + * 0 — cached, RW + * 2 — bypass cache, RWX (default value after CPU reset) + * 15 — no access, raise exception + */ + +static inline void cpu_configure_region_protection(void) +{ + const uint32_t pages_to_protect[] = {0x00000000, 0x80000000, 0xa0000000, 0xc0000000, 0xe0000000}; + for (int i = 0; i < sizeof(pages_to_protect)/sizeof(pages_to_protect[0]); ++i) { + cpu_write_dtlb(pages_to_protect[i], 0xf); + cpu_write_itlb(pages_to_protect[i], 0xf); + } + cpu_write_dtlb(0x20000000, 0); + cpu_write_itlb(0x20000000, 0); +} + +/** + * @brief Stall CPU using RTC controller + * @param cpu_id ID of the CPU to stall (0 = PRO, 1 = APP) + */ +void esp_cpu_stall(int cpu_id); + +/** + * @brief Un-stall CPU using RTC controller + * @param cpu_id ID of the CPU to un-stall (0 = PRO, 1 = APP) + */ +void esp_cpu_unstall(int cpu_id); + +/** + * @brief Reset CPU using RTC controller + * @param cpu_id ID of the CPU to reset (0 = PRO, 1 = APP) + */ +void esp_cpu_reset(int cpu_id); + + +/** + * @brief Returns true if a JTAG debugger is attached to CPU + * OCD (on chip debug) port. + * + * @note If "Make exception and panic handlers JTAG/OCD aware" + * is disabled, this function always returns false. + */ +bool esp_cpu_in_ocd_debug_mode(void); + +/** + * @brief Convert the PC register value to its true address + * + * The address of the current instruction is not stored as an exact uint32_t + * representation in PC register. This function will convert the value stored in + * the PC register to a uint32_t address. + * + * @param pc_raw The PC as stored in register format. + * + * @return Address in uint32_t format + */ +static inline uint32_t esp_cpu_process_stack_pc(uint32_t pc) +{ + if (pc & 0x80000000) { + //Top two bits of a0 (return address) specify window increment. Overwrite to map to address space. + pc = (pc & 0x3fffffff) | 0x40000000; + } + //Minus 3 to get PC of previous instruction (i.e. instruction executed before return address) + return pc - 3; +} + +typedef uint32_t esp_cpu_ccount_t; + +static inline esp_cpu_ccount_t esp_cpu_get_ccount(void) +{ + uint32_t result; + RSR(CCOUNT, result); + return result; +} + +#endif diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/dac_caps.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/dac_caps.h new file mode 100644 index 0000000000000..8f3fc02fda47e --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/dac_caps.h @@ -0,0 +1,22 @@ +// 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. + +#ifndef _SOC_RTC_DAC_CAPS_H_ +#define _SOC_RTC_DAC_CAPS_H_ + +#define SOC_DAC_PERIPH_NUM 2 + +#define SOC_DAC_RESOLUTION 8 // DAC resolution ratio 8 bit + +#endif \ No newline at end of file diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/dac_channel.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/dac_channel.h new file mode 100644 index 0000000000000..241a067bb2436 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/dac_channel.h @@ -0,0 +1,24 @@ +// 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. + +#ifndef _SOC_DAC_CHANNEL_H +#define _SOC_DAC_CHANNEL_H + +#define DAC_GPIO25_CHANNEL DAC_CHANNEL_1 +#define DAC_CHANNEL_1_GPIO_NUM 25 + +#define DAC_GPIO26_CHANNEL DAC_CHANNEL_2 +#define DAC_CHANNEL_2_GPIO_NUM 26 + +#endif diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/dport_access.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/dport_access.h new file mode 100644 index 0000000000000..fe7e70ebc00ed --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/dport_access.h @@ -0,0 +1,202 @@ +// 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. + +#ifndef _DPORT_ACCESS_H_ +#define _DPORT_ACCESS_H_ + +#include +#include "esp_attr.h" +#include "esp32/dport_access.h" +#include "soc.h" +#include "uart_reg.h" +#include "xtensa/xtruntime.h" + +#ifdef __cplusplus +extern "C" { +#endif + +//Registers Operation {{ + +// The _DPORT_xxx register read macros access DPORT memory directly (as opposed to +// DPORT_REG_READ which applies SMP-safe protections). +// +// There are several ways to read the DPORT registers: +// 1) Use DPORT_REG_READ versions to be SMP-safe in IDF apps. +// This method uses the pre-read APB implementation(*) without stall other CPU. +// This is beneficial for single readings. +// 2) If you want to make a sequence of DPORT reads to buffer, +// use dport_read_buffer(buff_out, address, num_words), +// it is the faster method and it doesn't stop other CPU. +// 3) If you want to make a sequence of DPORT reads, but you don't want to stop other CPU +// and you want to do it faster then you need use DPORT_SEQUENCE_REG_READ(). +// The difference from the first is that the user himself must disable interrupts while DPORT reading. +// Note that disable interrupt need only if the chip has two cores. +// 4) If you want to make a sequence of DPORT reads, +// use DPORT_STALL_OTHER_CPU_START() macro explicitly +// and then use _DPORT_REG_READ macro while other CPU is stalled. +// After completing read operations, use DPORT_STALL_OTHER_CPU_END(). +// This method uses stall other CPU while reading DPORT registers. +// Useful for compatibility, as well as for large consecutive readings. +// This method is slower, but must be used if ROM functions or +// other code is called which accesses DPORT without any other workaround. +// *) The pre-readable APB register before reading the DPORT register +// helps synchronize the operation of the two CPUs, +// so that reading on different CPUs no longer causes random errors APB register. + +// _DPORT_REG_WRITE & DPORT_REG_WRITE are equivalent. +#define _DPORT_REG_READ(_r) (*(volatile uint32_t *)(_r)) +#define _DPORT_REG_WRITE(_r, _v) (*(volatile uint32_t *)(_r)) = (_v) + +// Write value to DPORT register (does not require protecting) +#define DPORT_REG_WRITE(_r, _v) _DPORT_REG_WRITE((_r), (_v)) + +/** + * @brief Read value from register, SMP-safe version. + * + * This method uses the pre-reading of the APB register before reading the register of the DPORT. + * This implementation is useful for reading DORT registers for single reading without stall other CPU. + * There is disable/enable interrupt. + * + * @param reg Register address + * @return Value + */ +static inline uint32_t IRAM_ATTR DPORT_REG_READ(uint32_t reg) +{ +#if defined(BOOTLOADER_BUILD) || !defined(CONFIG_ESP32_DPORT_WORKAROUND) || !defined(ESP_PLATFORM) + return _DPORT_REG_READ(reg); +#else + return esp_dport_access_reg_read(reg); +#endif +} + +/** + * @brief Read value from register, NOT SMP-safe version. + * + * This method uses the pre-reading of the APB register before reading the register of the DPORT. + * There is not disable/enable interrupt. + * The difference from DPORT_REG_READ() is that the user himself must disable interrupts while DPORT reading. + * This implementation is useful for reading DORT registers in loop without stall other CPU. Note the usage example. + * The recommended way to read registers sequentially without stall other CPU + * is to use the method esp_dport_read_buffer(buff_out, address, num_words). It allows you to read registers in the buffer. + * + * \code{c} + * // This example shows how to use it. + * { // Use curly brackets to limit the visibility of variables in macros DPORT_INTERRUPT_DISABLE/RESTORE. + * DPORT_INTERRUPT_DISABLE(); // Disable interrupt only on current CPU. + * for (i = 0; i < max; ++i) { + * array[i] = DPORT_SEQUENCE_REG_READ(Address + i * 4); // reading DPORT registers + * } + * DPORT_INTERRUPT_RESTORE(); // restore the previous interrupt level + * } + * \endcode + * + * @param reg Register address + * @return Value + */ +static inline uint32_t IRAM_ATTR DPORT_SEQUENCE_REG_READ(uint32_t reg) +{ +#if defined(BOOTLOADER_BUILD) || !defined(CONFIG_ESP32_DPORT_WORKAROUND) || !defined(ESP_PLATFORM) + return _DPORT_REG_READ(reg); +#else + return esp_dport_access_sequence_reg_read(reg); +#endif +} + +//get bit or get bits from register +#define DPORT_REG_GET_BIT(_r, _b) (DPORT_REG_READ(_r) & (_b)) + +//set bit or set bits to register +#define DPORT_REG_SET_BIT(_r, _b) DPORT_REG_WRITE((_r), (DPORT_REG_READ(_r)|(_b))) + +//clear bit or clear bits of register +#define DPORT_REG_CLR_BIT(_r, _b) DPORT_REG_WRITE((_r), (DPORT_REG_READ(_r) & (~(_b)))) + +//set bits of register controlled by mask +#define DPORT_REG_SET_BITS(_r, _b, _m) DPORT_REG_WRITE((_r), ((DPORT_REG_READ(_r) & (~(_m))) | ((_b) & (_m)))) + +//get field from register, uses field _S & _V to determine mask +#define DPORT_REG_GET_FIELD(_r, _f) ((DPORT_REG_READ(_r) >> (_f##_S)) & (_f##_V)) + +//set field to register, used when _f is not left shifted by _f##_S +#define DPORT_REG_SET_FIELD(_r, _f, _v) DPORT_REG_WRITE((_r), ((DPORT_REG_READ(_r) & (~((_f##_V) << (_f##_S))))|(((_v) & (_f##_V))<<(_f##_S)))) + +//get field value from a variable, used when _f is not left shifted by _f##_S +#define DPORT_VALUE_GET_FIELD(_r, _f) (((_r) >> (_f##_S)) & (_f)) + +//get field value from a variable, used when _f is left shifted by _f##_S +#define DPORT_VALUE_GET_FIELD2(_r, _f) (((_r) & (_f))>> (_f##_S)) + +//set field value to a variable, used when _f is not left shifted by _f##_S +#define DPORT_VALUE_SET_FIELD(_r, _f, _v) ((_r)=(((_r) & ~((_f) << (_f##_S)))|((_v)<<(_f##_S)))) + +//set field value to a variable, used when _f is left shifted by _f##_S +#define DPORT_VALUE_SET_FIELD2(_r, _f, _v) ((_r)=(((_r) & ~(_f))|((_v)<<(_f##_S)))) + +//generate a value from a field value, used when _f is not left shifted by _f##_S +#define DPORT_FIELD_TO_VALUE(_f, _v) (((_v)&(_f))<<_f##_S) + +//generate a value from a field value, used when _f is left shifted by _f##_S +#define DPORT_FIELD_TO_VALUE2(_f, _v) (((_v)<<_f##_S) & (_f)) + +//Register read macros with an underscore prefix access DPORT memory directly. In IDF apps, use the non-underscore versions to be SMP-safe. +#define _DPORT_READ_PERI_REG(addr) (*((volatile uint32_t *)(addr))) +#define _DPORT_WRITE_PERI_REG(addr, val) (*((volatile uint32_t *)(addr))) = (uint32_t)(val) +#define _DPORT_REG_SET_BIT(_r, _b) _DPORT_REG_WRITE((_r), (_DPORT_REG_READ(_r)|(_b))) +#define _DPORT_REG_CLR_BIT(_r, _b) _DPORT_REG_WRITE((_r), (_DPORT_REG_READ(_r) & (~(_b)))) + +/** + * @brief Read value from register, SMP-safe version. + * + * This method uses the pre-reading of the APB register before reading the register of the DPORT. + * This implementation is useful for reading DORT registers for single reading without stall other CPU. + * + * @param reg Register address + * @return Value + */ +static inline uint32_t IRAM_ATTR DPORT_READ_PERI_REG(uint32_t reg) +{ +#if defined(BOOTLOADER_BUILD) || !defined(CONFIG_ESP32_DPORT_WORKAROUND) || !defined(ESP_PLATFORM) + return _DPORT_REG_READ(reg); +#else + return esp_dport_access_reg_read(reg); +#endif +} + +//write value to register +#define DPORT_WRITE_PERI_REG(addr, val) _DPORT_WRITE_PERI_REG((addr), (val)) + +//clear bits of register controlled by mask +#define DPORT_CLEAR_PERI_REG_MASK(reg, mask) DPORT_WRITE_PERI_REG((reg), (DPORT_READ_PERI_REG(reg)&(~(mask)))) + +//set bits of register controlled by mask +#define DPORT_SET_PERI_REG_MASK(reg, mask) DPORT_WRITE_PERI_REG((reg), (DPORT_READ_PERI_REG(reg)|(mask))) + +//get bits of register controlled by mask +#define DPORT_GET_PERI_REG_MASK(reg, mask) (DPORT_READ_PERI_REG(reg) & (mask)) + +//get bits of register controlled by highest bit and lowest bit +#define DPORT_GET_PERI_REG_BITS(reg, hipos,lowpos) ((DPORT_READ_PERI_REG(reg)>>(lowpos))&((1<<((hipos)-(lowpos)+1))-1)) + +//set bits of register controlled by mask and shift +#define DPORT_SET_PERI_REG_BITS(reg,bit_map,value,shift) DPORT_WRITE_PERI_REG((reg), ((DPORT_READ_PERI_REG(reg)&(~((bit_map)<<(shift))))|(((value) & bit_map)<<(shift)))) + +//get field of register +#define DPORT_GET_PERI_REG_BITS2(reg, mask,shift) ((DPORT_READ_PERI_REG(reg)>>(shift))&(mask)) +//}} + +#ifdef __cplusplus +} +#endif + +#endif /* _DPORT_ACCESS_H_ */ diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/dport_reg.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/dport_reg.h new file mode 100644 index 0000000000000..b9f2c31e20da3 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/dport_reg.h @@ -0,0 +1,4284 @@ +// 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. +#ifndef _SOC_DPORT_REG_H_ +#define _SOC_DPORT_REG_H_ + +#include "soc.h" + +#ifndef __ASSEMBLER__ +#include "dport_access.h" +#endif + +/* Registers defined in this header file must be accessed using special macros, + * prefixed with DPORT_. See soc/dport_access.h file for details. + */ + +#define DPORT_PRO_BOOT_REMAP_CTRL_REG (DR_REG_DPORT_BASE + 0x000) +/* DPORT_PRO_BOOT_REMAP : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_PRO_BOOT_REMAP (BIT(0)) +#define DPORT_PRO_BOOT_REMAP_M (BIT(0)) +#define DPORT_PRO_BOOT_REMAP_V 0x1 +#define DPORT_PRO_BOOT_REMAP_S 0 + +#define DPORT_APP_BOOT_REMAP_CTRL_REG (DR_REG_DPORT_BASE + 0x004) +/* DPORT_APP_BOOT_REMAP : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_APP_BOOT_REMAP (BIT(0)) +#define DPORT_APP_BOOT_REMAP_M (BIT(0)) +#define DPORT_APP_BOOT_REMAP_V 0x1 +#define DPORT_APP_BOOT_REMAP_S 0 + +#define DPORT_ACCESS_CHECK_REG (DR_REG_DPORT_BASE + 0x008) +/* DPORT_ACCESS_CHECK_APP : RO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_ACCESS_CHECK_APP (BIT(8)) +#define DPORT_ACCESS_CHECK_APP_M (BIT(8)) +#define DPORT_ACCESS_CHECK_APP_V 0x1 +#define DPORT_ACCESS_CHECK_APP_S 8 +/* DPORT_ACCESS_CHECK_PRO : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_ACCESS_CHECK_PRO (BIT(0)) +#define DPORT_ACCESS_CHECK_PRO_M (BIT(0)) +#define DPORT_ACCESS_CHECK_PRO_V 0x1 +#define DPORT_ACCESS_CHECK_PRO_S 0 + +#define DPORT_PRO_DPORT_APB_MASK0_REG (DR_REG_DPORT_BASE + 0x00C) +/* DPORT_PRODPORT_APB_MASK0 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define DPORT_PRODPORT_APB_MASK0 0xFFFFFFFF +#define DPORT_PRODPORT_APB_MASK0_M ((DPORT_PRODPORT_APB_MASK0_V)<<(DPORT_PRODPORT_APB_MASK0_S)) +#define DPORT_PRODPORT_APB_MASK0_V 0xFFFFFFFF +#define DPORT_PRODPORT_APB_MASK0_S 0 + +#define DPORT_PRO_DPORT_APB_MASK1_REG (DR_REG_DPORT_BASE + 0x010) +/* DPORT_PRODPORT_APB_MASK1 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define DPORT_PRODPORT_APB_MASK1 0xFFFFFFFF +#define DPORT_PRODPORT_APB_MASK1_M ((DPORT_PRODPORT_APB_MASK1_V)<<(DPORT_PRODPORT_APB_MASK1_S)) +#define DPORT_PRODPORT_APB_MASK1_V 0xFFFFFFFF +#define DPORT_PRODPORT_APB_MASK1_S 0 + +#define DPORT_APP_DPORT_APB_MASK0_REG (DR_REG_DPORT_BASE + 0x014) +/* DPORT_APPDPORT_APB_MASK0 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define DPORT_APPDPORT_APB_MASK0 0xFFFFFFFF +#define DPORT_APPDPORT_APB_MASK0_M ((DPORT_APPDPORT_APB_MASK0_V)<<(DPORT_APPDPORT_APB_MASK0_S)) +#define DPORT_APPDPORT_APB_MASK0_V 0xFFFFFFFF +#define DPORT_APPDPORT_APB_MASK0_S 0 + +#define DPORT_APP_DPORT_APB_MASK1_REG (DR_REG_DPORT_BASE + 0x018) +/* DPORT_APPDPORT_APB_MASK1 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define DPORT_APPDPORT_APB_MASK1 0xFFFFFFFF +#define DPORT_APPDPORT_APB_MASK1_M ((DPORT_APPDPORT_APB_MASK1_V)<<(DPORT_APPDPORT_APB_MASK1_S)) +#define DPORT_APPDPORT_APB_MASK1_V 0xFFFFFFFF +#define DPORT_APPDPORT_APB_MASK1_S 0 + +#define DPORT_PERI_CLK_EN_REG (DR_REG_DPORT_BASE + 0x01C) +/* DPORT_PERI_CLK_EN : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define DPORT_PERI_CLK_EN 0xFFFFFFFF +#define DPORT_PERI_CLK_EN_M ((DPORT_PERI_CLK_EN_V)<<(DPORT_PERI_CLK_EN_S)) +#define DPORT_PERI_CLK_EN_V 0xFFFFFFFF +#define DPORT_PERI_CLK_EN_S 0 + +#define DPORT_PERI_RST_EN_REG (DR_REG_DPORT_BASE + 0x020) +/* DPORT_PERI_RST_EN : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define DPORT_PERI_RST_EN 0xFFFFFFFF +#define DPORT_PERI_RST_EN_M ((DPORT_PERI_RST_EN_V)<<(DPORT_PERI_RST_EN_S)) +#define DPORT_PERI_RST_EN_V 0xFFFFFFFF +#define DPORT_PERI_RST_EN_S 0 + +/* The following bits apply to DPORT_PERI_CLK_EN_REG, DPORT_PERI_RST_EN_REG + */ +#define DPORT_PERI_EN_AES (1<<0) +#define DPORT_PERI_EN_SHA (1<<1) +#define DPORT_PERI_EN_RSA (1<<2) +/* NB: Secure boot reset will hold SHA & AES in reset */ +#define DPORT_PERI_EN_SECUREBOOT (1<<3) +/* NB: Digital signature reset will hold AES & RSA in reset */ +#define DPORT_PERI_EN_DIGITAL_SIGNATURE (1<<4) + +#define DPORT_WIFI_BB_CFG_REG (DR_REG_DPORT_BASE + 0x024) +/* DPORT_WIFI_BB_CFG : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define DPORT_WIFI_BB_CFG 0xFFFFFFFF +#define DPORT_WIFI_BB_CFG_M ((DPORT_WIFI_BB_CFG_V)<<(DPORT_WIFI_BB_CFG_S)) +#define DPORT_WIFI_BB_CFG_V 0xFFFFFFFF +#define DPORT_WIFI_BB_CFG_S 0 + +#define DPORT_WIFI_BB_CFG_2_REG (DR_REG_DPORT_BASE + 0x028) +/* DPORT_WIFI_BB_CFG_2 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define DPORT_WIFI_BB_CFG_2 0xFFFFFFFF +#define DPORT_WIFI_BB_CFG_2_M ((DPORT_WIFI_BB_CFG_2_V)<<(DPORT_WIFI_BB_CFG_2_S)) +#define DPORT_WIFI_BB_CFG_2_V 0xFFFFFFFF +#define DPORT_WIFI_BB_CFG_2_S 0 + +#define DPORT_APPCPU_CTRL_A_REG (DR_REG_DPORT_BASE + 0x02C) +/* DPORT_APPCPU_RESETTING : R/W ;bitpos:[0] ;default: 1'b1 ; */ +/*description: */ +#define DPORT_APPCPU_RESETTING (BIT(0)) +#define DPORT_APPCPU_RESETTING_M (BIT(0)) +#define DPORT_APPCPU_RESETTING_V 0x1 +#define DPORT_APPCPU_RESETTING_S 0 + +#define DPORT_APPCPU_CTRL_B_REG (DR_REG_DPORT_BASE + 0x030) +/* DPORT_APPCPU_CLKGATE_EN : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_APPCPU_CLKGATE_EN (BIT(0)) +#define DPORT_APPCPU_CLKGATE_EN_M (BIT(0)) +#define DPORT_APPCPU_CLKGATE_EN_V 0x1 +#define DPORT_APPCPU_CLKGATE_EN_S 0 + +#define DPORT_APPCPU_CTRL_C_REG (DR_REG_DPORT_BASE + 0x034) +/* DPORT_APPCPU_RUNSTALL : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_APPCPU_RUNSTALL (BIT(0)) +#define DPORT_APPCPU_RUNSTALL_M (BIT(0)) +#define DPORT_APPCPU_RUNSTALL_V 0x1 +#define DPORT_APPCPU_RUNSTALL_S 0 + +#define DPORT_APPCPU_CTRL_D_REG (DR_REG_DPORT_BASE + 0x038) +/* DPORT_APPCPU_BOOT_ADDR : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define DPORT_APPCPU_BOOT_ADDR 0xFFFFFFFF +#define DPORT_APPCPU_BOOT_ADDR_M ((DPORT_APPCPU_BOOT_ADDR_V)<<(DPORT_APPCPU_BOOT_ADDR_S)) +#define DPORT_APPCPU_BOOT_ADDR_V 0xFFFFFFFF +#define DPORT_APPCPU_BOOT_ADDR_S 0 + +#define DPORT_CPU_PER_CONF_REG (DR_REG_DPORT_BASE + 0x03C) +/* DPORT_FAST_CLK_RTC_SEL : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_FAST_CLK_RTC_SEL (BIT(3)) +#define DPORT_FAST_CLK_RTC_SEL_M (BIT(3)) +#define DPORT_FAST_CLK_RTC_SEL_V 0x1 +#define DPORT_FAST_CLK_RTC_SEL_S 3 +/* DPORT_LOWSPEED_CLK_SEL : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_LOWSPEED_CLK_SEL (BIT(2)) +#define DPORT_LOWSPEED_CLK_SEL_M (BIT(2)) +#define DPORT_LOWSPEED_CLK_SEL_V 0x1 +#define DPORT_LOWSPEED_CLK_SEL_S 2 +/* DPORT_CPUPERIOD_SEL : R/W ;bitpos:[1:0] ;default: 2'b0 ; */ +/*description: */ +#define DPORT_CPUPERIOD_SEL 0x00000003 +#define DPORT_CPUPERIOD_SEL_M ((DPORT_CPUPERIOD_SEL_V)<<(DPORT_CPUPERIOD_SEL_S)) +#define DPORT_CPUPERIOD_SEL_V 0x3 +#define DPORT_CPUPERIOD_SEL_S 0 +#define DPORT_CPUPERIOD_SEL_80 0 +#define DPORT_CPUPERIOD_SEL_160 1 +#define DPORT_CPUPERIOD_SEL_240 2 + +#define DPORT_PRO_CACHE_CTRL_REG (DR_REG_DPORT_BASE + 0x040) +/* DPORT_PRO_DRAM_HL : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_PRO_DRAM_HL (BIT(16)) +#define DPORT_PRO_DRAM_HL_M (BIT(16)) +#define DPORT_PRO_DRAM_HL_V 0x1 +#define DPORT_PRO_DRAM_HL_S 16 +/* DPORT_SLAVE_REQ : RO ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_SLAVE_REQ (BIT(15)) +#define DPORT_SLAVE_REQ_M (BIT(15)) +#define DPORT_SLAVE_REQ_V 0x1 +#define DPORT_SLAVE_REQ_S 15 +/* DPORT_AHB_SPI_REQ : RO ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_AHB_SPI_REQ (BIT(14)) +#define DPORT_AHB_SPI_REQ_M (BIT(14)) +#define DPORT_AHB_SPI_REQ_V 0x1 +#define DPORT_AHB_SPI_REQ_S 14 +/* DPORT_PRO_SLAVE_REQ : RO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_PRO_SLAVE_REQ (BIT(13)) +#define DPORT_PRO_SLAVE_REQ_M (BIT(13)) +#define DPORT_PRO_SLAVE_REQ_V 0x1 +#define DPORT_PRO_SLAVE_REQ_S 13 +/* DPORT_PRO_AHB_SPI_REQ : RO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_PRO_AHB_SPI_REQ (BIT(12)) +#define DPORT_PRO_AHB_SPI_REQ_M (BIT(12)) +#define DPORT_PRO_AHB_SPI_REQ_V 0x1 +#define DPORT_PRO_AHB_SPI_REQ_S 12 +/* DPORT_PRO_DRAM_SPLIT : R/W ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_PRO_DRAM_SPLIT (BIT(11)) +#define DPORT_PRO_DRAM_SPLIT_M (BIT(11)) +#define DPORT_PRO_DRAM_SPLIT_V 0x1 +#define DPORT_PRO_DRAM_SPLIT_S 11 +/* DPORT_PRO_SINGLE_IRAM_ENA : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_PRO_SINGLE_IRAM_ENA (BIT(10)) +#define DPORT_PRO_SINGLE_IRAM_ENA_M (BIT(10)) +#define DPORT_PRO_SINGLE_IRAM_ENA_V 0x1 +#define DPORT_PRO_SINGLE_IRAM_ENA_S 10 +/* DPORT_PRO_CACHE_LOCK_3_EN : R/W ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_PRO_CACHE_LOCK_3_EN (BIT(9)) +#define DPORT_PRO_CACHE_LOCK_3_EN_M (BIT(9)) +#define DPORT_PRO_CACHE_LOCK_3_EN_V 0x1 +#define DPORT_PRO_CACHE_LOCK_3_EN_S 9 +/* DPORT_PRO_CACHE_LOCK_2_EN : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_PRO_CACHE_LOCK_2_EN (BIT(8)) +#define DPORT_PRO_CACHE_LOCK_2_EN_M (BIT(8)) +#define DPORT_PRO_CACHE_LOCK_2_EN_V 0x1 +#define DPORT_PRO_CACHE_LOCK_2_EN_S 8 +/* DPORT_PRO_CACHE_LOCK_1_EN : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_PRO_CACHE_LOCK_1_EN (BIT(7)) +#define DPORT_PRO_CACHE_LOCK_1_EN_M (BIT(7)) +#define DPORT_PRO_CACHE_LOCK_1_EN_V 0x1 +#define DPORT_PRO_CACHE_LOCK_1_EN_S 7 +/* DPORT_PRO_CACHE_LOCK_0_EN : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_PRO_CACHE_LOCK_0_EN (BIT(6)) +#define DPORT_PRO_CACHE_LOCK_0_EN_M (BIT(6)) +#define DPORT_PRO_CACHE_LOCK_0_EN_V 0x1 +#define DPORT_PRO_CACHE_LOCK_0_EN_S 6 +/* DPORT_PRO_CACHE_FLUSH_DONE : RO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_PRO_CACHE_FLUSH_DONE (BIT(5)) +#define DPORT_PRO_CACHE_FLUSH_DONE_M (BIT(5)) +#define DPORT_PRO_CACHE_FLUSH_DONE_V 0x1 +#define DPORT_PRO_CACHE_FLUSH_DONE_S 5 +/* DPORT_PRO_CACHE_FLUSH_ENA : R/W ;bitpos:[4] ;default: 1'b1 ; */ +/*description: */ +#define DPORT_PRO_CACHE_FLUSH_ENA (BIT(4)) +#define DPORT_PRO_CACHE_FLUSH_ENA_M (BIT(4)) +#define DPORT_PRO_CACHE_FLUSH_ENA_V 0x1 +#define DPORT_PRO_CACHE_FLUSH_ENA_S 4 +/* DPORT_PRO_CACHE_ENABLE : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_PRO_CACHE_ENABLE (BIT(3)) +#define DPORT_PRO_CACHE_ENABLE_M (BIT(3)) +#define DPORT_PRO_CACHE_ENABLE_V 0x1 +#define DPORT_PRO_CACHE_ENABLE_S 3 +/* DPORT_PRO_CACHE_MODE : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_PRO_CACHE_MODE (BIT(2)) +#define DPORT_PRO_CACHE_MODE_M (BIT(2)) +#define DPORT_PRO_CACHE_MODE_V 0x1 +#define DPORT_PRO_CACHE_MODE_S 2 + +#define DPORT_PRO_CACHE_CTRL1_REG (DR_REG_DPORT_BASE + 0x044) +/* DPORT_PRO_CACHE_MMU_IA_CLR : R/W ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_PRO_CACHE_MMU_IA_CLR (BIT(13)) +#define DPORT_PRO_CACHE_MMU_IA_CLR_M (BIT(13)) +#define DPORT_PRO_CACHE_MMU_IA_CLR_V 0x1 +#define DPORT_PRO_CACHE_MMU_IA_CLR_S 13 +/* DPORT_PRO_CMMU_PD : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_PRO_CMMU_PD (BIT(12)) +#define DPORT_PRO_CMMU_PD_M (BIT(12)) +#define DPORT_PRO_CMMU_PD_V 0x1 +#define DPORT_PRO_CMMU_PD_S 12 +/* DPORT_PRO_CMMU_FORCE_ON : R/W ;bitpos:[11] ;default: 1'b1 ; */ +/*description: */ +#define DPORT_PRO_CMMU_FORCE_ON (BIT(11)) +#define DPORT_PRO_CMMU_FORCE_ON_M (BIT(11)) +#define DPORT_PRO_CMMU_FORCE_ON_V 0x1 +#define DPORT_PRO_CMMU_FORCE_ON_S 11 +/* DPORT_PRO_CMMU_FLASH_PAGE_MODE : R/W ;bitpos:[10:9] ;default: 2'b0 ; */ +/*description: */ +#define DPORT_PRO_CMMU_FLASH_PAGE_MODE 0x00000003 +#define DPORT_PRO_CMMU_FLASH_PAGE_MODE_M ((DPORT_PRO_CMMU_FLASH_PAGE_MODE_V)<<(DPORT_PRO_CMMU_FLASH_PAGE_MODE_S)) +#define DPORT_PRO_CMMU_FLASH_PAGE_MODE_V 0x3 +#define DPORT_PRO_CMMU_FLASH_PAGE_MODE_S 9 +/* DPORT_PRO_CMMU_SRAM_PAGE_MODE : R/W ;bitpos:[8:6] ;default: 3'd3 ; */ +/*description: */ +#define DPORT_PRO_CMMU_SRAM_PAGE_MODE 0x00000007 +#define DPORT_PRO_CMMU_SRAM_PAGE_MODE_M ((DPORT_PRO_CMMU_SRAM_PAGE_MODE_V)<<(DPORT_PRO_CMMU_SRAM_PAGE_MODE_S)) +#define DPORT_PRO_CMMU_SRAM_PAGE_MODE_V 0x7 +#define DPORT_PRO_CMMU_SRAM_PAGE_MODE_S 6 +/* DPORT_PRO_CACHE_MASK_OPSDRAM : R/W ;bitpos:[5] ;default: 1'b1 ; */ +/*description: */ +#define DPORT_PRO_CACHE_MASK_OPSDRAM (BIT(5)) +#define DPORT_PRO_CACHE_MASK_OPSDRAM_M (BIT(5)) +#define DPORT_PRO_CACHE_MASK_OPSDRAM_V 0x1 +#define DPORT_PRO_CACHE_MASK_OPSDRAM_S 5 +/* DPORT_PRO_CACHE_MASK_DROM0 : R/W ;bitpos:[4] ;default: 1'b1 ; */ +/*description: */ +#define DPORT_PRO_CACHE_MASK_DROM0 (BIT(4)) +#define DPORT_PRO_CACHE_MASK_DROM0_M (BIT(4)) +#define DPORT_PRO_CACHE_MASK_DROM0_V 0x1 +#define DPORT_PRO_CACHE_MASK_DROM0_S 4 +/* DPORT_PRO_CACHE_MASK_DRAM1 : R/W ;bitpos:[3] ;default: 1'b1 ; */ +/*description: */ +#define DPORT_PRO_CACHE_MASK_DRAM1 (BIT(3)) +#define DPORT_PRO_CACHE_MASK_DRAM1_M (BIT(3)) +#define DPORT_PRO_CACHE_MASK_DRAM1_V 0x1 +#define DPORT_PRO_CACHE_MASK_DRAM1_S 3 +/* DPORT_PRO_CACHE_MASK_IROM0 : R/W ;bitpos:[2] ;default: 1'b1 ; */ +/*description: */ +#define DPORT_PRO_CACHE_MASK_IROM0 (BIT(2)) +#define DPORT_PRO_CACHE_MASK_IROM0_M (BIT(2)) +#define DPORT_PRO_CACHE_MASK_IROM0_V 0x1 +#define DPORT_PRO_CACHE_MASK_IROM0_S 2 +/* DPORT_PRO_CACHE_MASK_IRAM1 : R/W ;bitpos:[1] ;default: 1'b1 ; */ +/*description: */ +#define DPORT_PRO_CACHE_MASK_IRAM1 (BIT(1)) +#define DPORT_PRO_CACHE_MASK_IRAM1_M (BIT(1)) +#define DPORT_PRO_CACHE_MASK_IRAM1_V 0x1 +#define DPORT_PRO_CACHE_MASK_IRAM1_S 1 +/* DPORT_PRO_CACHE_MASK_IRAM0 : R/W ;bitpos:[0] ;default: 1'b1 ; */ +/*description: */ +#define DPORT_PRO_CACHE_MASK_IRAM0 (BIT(0)) +#define DPORT_PRO_CACHE_MASK_IRAM0_M (BIT(0)) +#define DPORT_PRO_CACHE_MASK_IRAM0_V 0x1 +#define DPORT_PRO_CACHE_MASK_IRAM0_S 0 + +#define DPORT_PRO_CACHE_LOCK_0_ADDR_REG (DR_REG_DPORT_BASE + 0x048) +/* DPORT_PRO_CACHE_LOCK_0_ADDR_MAX : R/W ;bitpos:[21:18] ;default: 4'h0 ; */ +/*description: */ +#define DPORT_PRO_CACHE_LOCK_0_ADDR_MAX 0x0000000F +#define DPORT_PRO_CACHE_LOCK_0_ADDR_MAX_M ((DPORT_PRO_CACHE_LOCK_0_ADDR_MAX_V)<<(DPORT_PRO_CACHE_LOCK_0_ADDR_MAX_S)) +#define DPORT_PRO_CACHE_LOCK_0_ADDR_MAX_V 0xF +#define DPORT_PRO_CACHE_LOCK_0_ADDR_MAX_S 18 +/* DPORT_PRO_CACHE_LOCK_0_ADDR_MIN : R/W ;bitpos:[17:14] ;default: 4'h0 ; */ +/*description: */ +#define DPORT_PRO_CACHE_LOCK_0_ADDR_MIN 0x0000000F +#define DPORT_PRO_CACHE_LOCK_0_ADDR_MIN_M ((DPORT_PRO_CACHE_LOCK_0_ADDR_MIN_V)<<(DPORT_PRO_CACHE_LOCK_0_ADDR_MIN_S)) +#define DPORT_PRO_CACHE_LOCK_0_ADDR_MIN_V 0xF +#define DPORT_PRO_CACHE_LOCK_0_ADDR_MIN_S 14 +/* DPORT_PRO_CACHE_LOCK_0_ADDR_PRE : R/W ;bitpos:[13:0] ;default: 14'h0 ; */ +/*description: */ +#define DPORT_PRO_CACHE_LOCK_0_ADDR_PRE 0x00003FFF +#define DPORT_PRO_CACHE_LOCK_0_ADDR_PRE_M ((DPORT_PRO_CACHE_LOCK_0_ADDR_PRE_V)<<(DPORT_PRO_CACHE_LOCK_0_ADDR_PRE_S)) +#define DPORT_PRO_CACHE_LOCK_0_ADDR_PRE_V 0x3FFF +#define DPORT_PRO_CACHE_LOCK_0_ADDR_PRE_S 0 + +#define DPORT_PRO_CACHE_LOCK_1_ADDR_REG (DR_REG_DPORT_BASE + 0x04C) +/* DPORT_PRO_CACHE_LOCK_1_ADDR_MAX : R/W ;bitpos:[21:18] ;default: 4'h0 ; */ +/*description: */ +#define DPORT_PRO_CACHE_LOCK_1_ADDR_MAX 0x0000000F +#define DPORT_PRO_CACHE_LOCK_1_ADDR_MAX_M ((DPORT_PRO_CACHE_LOCK_1_ADDR_MAX_V)<<(DPORT_PRO_CACHE_LOCK_1_ADDR_MAX_S)) +#define DPORT_PRO_CACHE_LOCK_1_ADDR_MAX_V 0xF +#define DPORT_PRO_CACHE_LOCK_1_ADDR_MAX_S 18 +/* DPORT_PRO_CACHE_LOCK_1_ADDR_MIN : R/W ;bitpos:[17:14] ;default: 4'h0 ; */ +/*description: */ +#define DPORT_PRO_CACHE_LOCK_1_ADDR_MIN 0x0000000F +#define DPORT_PRO_CACHE_LOCK_1_ADDR_MIN_M ((DPORT_PRO_CACHE_LOCK_1_ADDR_MIN_V)<<(DPORT_PRO_CACHE_LOCK_1_ADDR_MIN_S)) +#define DPORT_PRO_CACHE_LOCK_1_ADDR_MIN_V 0xF +#define DPORT_PRO_CACHE_LOCK_1_ADDR_MIN_S 14 +/* DPORT_PRO_CACHE_LOCK_1_ADDR_PRE : R/W ;bitpos:[13:0] ;default: 14'h0 ; */ +/*description: */ +#define DPORT_PRO_CACHE_LOCK_1_ADDR_PRE 0x00003FFF +#define DPORT_PRO_CACHE_LOCK_1_ADDR_PRE_M ((DPORT_PRO_CACHE_LOCK_1_ADDR_PRE_V)<<(DPORT_PRO_CACHE_LOCK_1_ADDR_PRE_S)) +#define DPORT_PRO_CACHE_LOCK_1_ADDR_PRE_V 0x3FFF +#define DPORT_PRO_CACHE_LOCK_1_ADDR_PRE_S 0 + +#define DPORT_PRO_CACHE_LOCK_2_ADDR_REG (DR_REG_DPORT_BASE + 0x050) +/* DPORT_PRO_CACHE_LOCK_2_ADDR_MAX : R/W ;bitpos:[21:18] ;default: 4'h0 ; */ +/*description: */ +#define DPORT_PRO_CACHE_LOCK_2_ADDR_MAX 0x0000000F +#define DPORT_PRO_CACHE_LOCK_2_ADDR_MAX_M ((DPORT_PRO_CACHE_LOCK_2_ADDR_MAX_V)<<(DPORT_PRO_CACHE_LOCK_2_ADDR_MAX_S)) +#define DPORT_PRO_CACHE_LOCK_2_ADDR_MAX_V 0xF +#define DPORT_PRO_CACHE_LOCK_2_ADDR_MAX_S 18 +/* DPORT_PRO_CACHE_LOCK_2_ADDR_MIN : R/W ;bitpos:[17:14] ;default: 4'h0 ; */ +/*description: */ +#define DPORT_PRO_CACHE_LOCK_2_ADDR_MIN 0x0000000F +#define DPORT_PRO_CACHE_LOCK_2_ADDR_MIN_M ((DPORT_PRO_CACHE_LOCK_2_ADDR_MIN_V)<<(DPORT_PRO_CACHE_LOCK_2_ADDR_MIN_S)) +#define DPORT_PRO_CACHE_LOCK_2_ADDR_MIN_V 0xF +#define DPORT_PRO_CACHE_LOCK_2_ADDR_MIN_S 14 +/* DPORT_PRO_CACHE_LOCK_2_ADDR_PRE : R/W ;bitpos:[13:0] ;default: 14'h0 ; */ +/*description: */ +#define DPORT_PRO_CACHE_LOCK_2_ADDR_PRE 0x00003FFF +#define DPORT_PRO_CACHE_LOCK_2_ADDR_PRE_M ((DPORT_PRO_CACHE_LOCK_2_ADDR_PRE_V)<<(DPORT_PRO_CACHE_LOCK_2_ADDR_PRE_S)) +#define DPORT_PRO_CACHE_LOCK_2_ADDR_PRE_V 0x3FFF +#define DPORT_PRO_CACHE_LOCK_2_ADDR_PRE_S 0 + +#define DPORT_PRO_CACHE_LOCK_3_ADDR_REG (DR_REG_DPORT_BASE + 0x054) +/* DPORT_PRO_CACHE_LOCK_3_ADDR_MAX : R/W ;bitpos:[21:18] ;default: 4'h0 ; */ +/*description: */ +#define DPORT_PRO_CACHE_LOCK_3_ADDR_MAX 0x0000000F +#define DPORT_PRO_CACHE_LOCK_3_ADDR_MAX_M ((DPORT_PRO_CACHE_LOCK_3_ADDR_MAX_V)<<(DPORT_PRO_CACHE_LOCK_3_ADDR_MAX_S)) +#define DPORT_PRO_CACHE_LOCK_3_ADDR_MAX_V 0xF +#define DPORT_PRO_CACHE_LOCK_3_ADDR_MAX_S 18 +/* DPORT_PRO_CACHE_LOCK_3_ADDR_MIN : R/W ;bitpos:[17:14] ;default: 4'h0 ; */ +/*description: */ +#define DPORT_PRO_CACHE_LOCK_3_ADDR_MIN 0x0000000F +#define DPORT_PRO_CACHE_LOCK_3_ADDR_MIN_M ((DPORT_PRO_CACHE_LOCK_3_ADDR_MIN_V)<<(DPORT_PRO_CACHE_LOCK_3_ADDR_MIN_S)) +#define DPORT_PRO_CACHE_LOCK_3_ADDR_MIN_V 0xF +#define DPORT_PRO_CACHE_LOCK_3_ADDR_MIN_S 14 +/* DPORT_PRO_CACHE_LOCK_3_ADDR_PRE : R/W ;bitpos:[13:0] ;default: 14'h0 ; */ +/*description: */ +#define DPORT_PRO_CACHE_LOCK_3_ADDR_PRE 0x00003FFF +#define DPORT_PRO_CACHE_LOCK_3_ADDR_PRE_M ((DPORT_PRO_CACHE_LOCK_3_ADDR_PRE_V)<<(DPORT_PRO_CACHE_LOCK_3_ADDR_PRE_S)) +#define DPORT_PRO_CACHE_LOCK_3_ADDR_PRE_V 0x3FFF +#define DPORT_PRO_CACHE_LOCK_3_ADDR_PRE_S 0 + +#define DPORT_APP_CACHE_CTRL_REG (DR_REG_DPORT_BASE + 0x058) +/* DPORT_APP_DRAM_HL : R/W ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_APP_DRAM_HL (BIT(14)) +#define DPORT_APP_DRAM_HL_M (BIT(14)) +#define DPORT_APP_DRAM_HL_V 0x1 +#define DPORT_APP_DRAM_HL_S 14 +/* DPORT_APP_SLAVE_REQ : RO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_APP_SLAVE_REQ (BIT(13)) +#define DPORT_APP_SLAVE_REQ_M (BIT(13)) +#define DPORT_APP_SLAVE_REQ_V 0x1 +#define DPORT_APP_SLAVE_REQ_S 13 +/* DPORT_APP_AHB_SPI_REQ : RO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_APP_AHB_SPI_REQ (BIT(12)) +#define DPORT_APP_AHB_SPI_REQ_M (BIT(12)) +#define DPORT_APP_AHB_SPI_REQ_V 0x1 +#define DPORT_APP_AHB_SPI_REQ_S 12 +/* DPORT_APP_DRAM_SPLIT : R/W ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_APP_DRAM_SPLIT (BIT(11)) +#define DPORT_APP_DRAM_SPLIT_M (BIT(11)) +#define DPORT_APP_DRAM_SPLIT_V 0x1 +#define DPORT_APP_DRAM_SPLIT_S 11 +/* DPORT_APP_SINGLE_IRAM_ENA : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_APP_SINGLE_IRAM_ENA (BIT(10)) +#define DPORT_APP_SINGLE_IRAM_ENA_M (BIT(10)) +#define DPORT_APP_SINGLE_IRAM_ENA_V 0x1 +#define DPORT_APP_SINGLE_IRAM_ENA_S 10 +/* DPORT_APP_CACHE_LOCK_3_EN : R/W ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_APP_CACHE_LOCK_3_EN (BIT(9)) +#define DPORT_APP_CACHE_LOCK_3_EN_M (BIT(9)) +#define DPORT_APP_CACHE_LOCK_3_EN_V 0x1 +#define DPORT_APP_CACHE_LOCK_3_EN_S 9 +/* DPORT_APP_CACHE_LOCK_2_EN : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_APP_CACHE_LOCK_2_EN (BIT(8)) +#define DPORT_APP_CACHE_LOCK_2_EN_M (BIT(8)) +#define DPORT_APP_CACHE_LOCK_2_EN_V 0x1 +#define DPORT_APP_CACHE_LOCK_2_EN_S 8 +/* DPORT_APP_CACHE_LOCK_1_EN : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_APP_CACHE_LOCK_1_EN (BIT(7)) +#define DPORT_APP_CACHE_LOCK_1_EN_M (BIT(7)) +#define DPORT_APP_CACHE_LOCK_1_EN_V 0x1 +#define DPORT_APP_CACHE_LOCK_1_EN_S 7 +/* DPORT_APP_CACHE_LOCK_0_EN : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_APP_CACHE_LOCK_0_EN (BIT(6)) +#define DPORT_APP_CACHE_LOCK_0_EN_M (BIT(6)) +#define DPORT_APP_CACHE_LOCK_0_EN_V 0x1 +#define DPORT_APP_CACHE_LOCK_0_EN_S 6 +/* DPORT_APP_CACHE_FLUSH_DONE : RO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_APP_CACHE_FLUSH_DONE (BIT(5)) +#define DPORT_APP_CACHE_FLUSH_DONE_M (BIT(5)) +#define DPORT_APP_CACHE_FLUSH_DONE_V 0x1 +#define DPORT_APP_CACHE_FLUSH_DONE_S 5 +/* DPORT_APP_CACHE_FLUSH_ENA : R/W ;bitpos:[4] ;default: 1'b1 ; */ +/*description: */ +#define DPORT_APP_CACHE_FLUSH_ENA (BIT(4)) +#define DPORT_APP_CACHE_FLUSH_ENA_M (BIT(4)) +#define DPORT_APP_CACHE_FLUSH_ENA_V 0x1 +#define DPORT_APP_CACHE_FLUSH_ENA_S 4 +/* DPORT_APP_CACHE_ENABLE : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_APP_CACHE_ENABLE (BIT(3)) +#define DPORT_APP_CACHE_ENABLE_M (BIT(3)) +#define DPORT_APP_CACHE_ENABLE_V 0x1 +#define DPORT_APP_CACHE_ENABLE_S 3 +/* DPORT_APP_CACHE_MODE : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_APP_CACHE_MODE (BIT(2)) +#define DPORT_APP_CACHE_MODE_M (BIT(2)) +#define DPORT_APP_CACHE_MODE_V 0x1 +#define DPORT_APP_CACHE_MODE_S 2 + +#define DPORT_APP_CACHE_CTRL1_REG (DR_REG_DPORT_BASE + 0x05C) +/* DPORT_APP_CACHE_MMU_IA_CLR : R/W ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_APP_CACHE_MMU_IA_CLR (BIT(13)) +#define DPORT_APP_CACHE_MMU_IA_CLR_M (BIT(13)) +#define DPORT_APP_CACHE_MMU_IA_CLR_V 0x1 +#define DPORT_APP_CACHE_MMU_IA_CLR_S 13 +/* DPORT_APP_CMMU_PD : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_APP_CMMU_PD (BIT(12)) +#define DPORT_APP_CMMU_PD_M (BIT(12)) +#define DPORT_APP_CMMU_PD_V 0x1 +#define DPORT_APP_CMMU_PD_S 12 +/* DPORT_APP_CMMU_FORCE_ON : R/W ;bitpos:[11] ;default: 1'b1 ; */ +/*description: */ +#define DPORT_APP_CMMU_FORCE_ON (BIT(11)) +#define DPORT_APP_CMMU_FORCE_ON_M (BIT(11)) +#define DPORT_APP_CMMU_FORCE_ON_V 0x1 +#define DPORT_APP_CMMU_FORCE_ON_S 11 +/* DPORT_APP_CMMU_FLASH_PAGE_MODE : R/W ;bitpos:[10:9] ;default: 2'b0 ; */ +/*description: */ +#define DPORT_APP_CMMU_FLASH_PAGE_MODE 0x00000003 +#define DPORT_APP_CMMU_FLASH_PAGE_MODE_M ((DPORT_APP_CMMU_FLASH_PAGE_MODE_V)<<(DPORT_APP_CMMU_FLASH_PAGE_MODE_S)) +#define DPORT_APP_CMMU_FLASH_PAGE_MODE_V 0x3 +#define DPORT_APP_CMMU_FLASH_PAGE_MODE_S 9 +/* DPORT_APP_CMMU_SRAM_PAGE_MODE : R/W ;bitpos:[8:6] ;default: 3'd3 ; */ +/*description: */ +#define DPORT_APP_CMMU_SRAM_PAGE_MODE 0x00000007 +#define DPORT_APP_CMMU_SRAM_PAGE_MODE_M ((DPORT_APP_CMMU_SRAM_PAGE_MODE_V)<<(DPORT_APP_CMMU_SRAM_PAGE_MODE_S)) +#define DPORT_APP_CMMU_SRAM_PAGE_MODE_V 0x7 +#define DPORT_APP_CMMU_SRAM_PAGE_MODE_S 6 +/* DPORT_APP_CACHE_MASK_OPSDRAM : R/W ;bitpos:[5] ;default: 1'b1 ; */ +/*description: */ +#define DPORT_APP_CACHE_MASK_OPSDRAM (BIT(5)) +#define DPORT_APP_CACHE_MASK_OPSDRAM_M (BIT(5)) +#define DPORT_APP_CACHE_MASK_OPSDRAM_V 0x1 +#define DPORT_APP_CACHE_MASK_OPSDRAM_S 5 +/* DPORT_APP_CACHE_MASK_DROM0 : R/W ;bitpos:[4] ;default: 1'b1 ; */ +/*description: */ +#define DPORT_APP_CACHE_MASK_DROM0 (BIT(4)) +#define DPORT_APP_CACHE_MASK_DROM0_M (BIT(4)) +#define DPORT_APP_CACHE_MASK_DROM0_V 0x1 +#define DPORT_APP_CACHE_MASK_DROM0_S 4 +/* DPORT_APP_CACHE_MASK_DRAM1 : R/W ;bitpos:[3] ;default: 1'b1 ; */ +/*description: */ +#define DPORT_APP_CACHE_MASK_DRAM1 (BIT(3)) +#define DPORT_APP_CACHE_MASK_DRAM1_M (BIT(3)) +#define DPORT_APP_CACHE_MASK_DRAM1_V 0x1 +#define DPORT_APP_CACHE_MASK_DRAM1_S 3 +/* DPORT_APP_CACHE_MASK_IROM0 : R/W ;bitpos:[2] ;default: 1'b1 ; */ +/*description: */ +#define DPORT_APP_CACHE_MASK_IROM0 (BIT(2)) +#define DPORT_APP_CACHE_MASK_IROM0_M (BIT(2)) +#define DPORT_APP_CACHE_MASK_IROM0_V 0x1 +#define DPORT_APP_CACHE_MASK_IROM0_S 2 +/* DPORT_APP_CACHE_MASK_IRAM1 : R/W ;bitpos:[1] ;default: 1'b1 ; */ +/*description: */ +#define DPORT_APP_CACHE_MASK_IRAM1 (BIT(1)) +#define DPORT_APP_CACHE_MASK_IRAM1_M (BIT(1)) +#define DPORT_APP_CACHE_MASK_IRAM1_V 0x1 +#define DPORT_APP_CACHE_MASK_IRAM1_S 1 +/* DPORT_APP_CACHE_MASK_IRAM0 : R/W ;bitpos:[0] ;default: 1'b1 ; */ +/*description: */ +#define DPORT_APP_CACHE_MASK_IRAM0 (BIT(0)) +#define DPORT_APP_CACHE_MASK_IRAM0_M (BIT(0)) +#define DPORT_APP_CACHE_MASK_IRAM0_V 0x1 +#define DPORT_APP_CACHE_MASK_IRAM0_S 0 + +#define DPORT_APP_CACHE_LOCK_0_ADDR_REG (DR_REG_DPORT_BASE + 0x060) +/* DPORT_APP_CACHE_LOCK_0_ADDR_MAX : R/W ;bitpos:[21:18] ;default: 4'h0 ; */ +/*description: */ +#define DPORT_APP_CACHE_LOCK_0_ADDR_MAX 0x0000000F +#define DPORT_APP_CACHE_LOCK_0_ADDR_MAX_M ((DPORT_APP_CACHE_LOCK_0_ADDR_MAX_V)<<(DPORT_APP_CACHE_LOCK_0_ADDR_MAX_S)) +#define DPORT_APP_CACHE_LOCK_0_ADDR_MAX_V 0xF +#define DPORT_APP_CACHE_LOCK_0_ADDR_MAX_S 18 +/* DPORT_APP_CACHE_LOCK_0_ADDR_MIN : R/W ;bitpos:[17:14] ;default: 4'h0 ; */ +/*description: */ +#define DPORT_APP_CACHE_LOCK_0_ADDR_MIN 0x0000000F +#define DPORT_APP_CACHE_LOCK_0_ADDR_MIN_M ((DPORT_APP_CACHE_LOCK_0_ADDR_MIN_V)<<(DPORT_APP_CACHE_LOCK_0_ADDR_MIN_S)) +#define DPORT_APP_CACHE_LOCK_0_ADDR_MIN_V 0xF +#define DPORT_APP_CACHE_LOCK_0_ADDR_MIN_S 14 +/* DPORT_APP_CACHE_LOCK_0_ADDR_PRE : R/W ;bitpos:[13:0] ;default: 14'h0 ; */ +/*description: */ +#define DPORT_APP_CACHE_LOCK_0_ADDR_PRE 0x00003FFF +#define DPORT_APP_CACHE_LOCK_0_ADDR_PRE_M ((DPORT_APP_CACHE_LOCK_0_ADDR_PRE_V)<<(DPORT_APP_CACHE_LOCK_0_ADDR_PRE_S)) +#define DPORT_APP_CACHE_LOCK_0_ADDR_PRE_V 0x3FFF +#define DPORT_APP_CACHE_LOCK_0_ADDR_PRE_S 0 + +#define DPORT_APP_CACHE_LOCK_1_ADDR_REG (DR_REG_DPORT_BASE + 0x064) +/* DPORT_APP_CACHE_LOCK_1_ADDR_MAX : R/W ;bitpos:[21:18] ;default: 4'h0 ; */ +/*description: */ +#define DPORT_APP_CACHE_LOCK_1_ADDR_MAX 0x0000000F +#define DPORT_APP_CACHE_LOCK_1_ADDR_MAX_M ((DPORT_APP_CACHE_LOCK_1_ADDR_MAX_V)<<(DPORT_APP_CACHE_LOCK_1_ADDR_MAX_S)) +#define DPORT_APP_CACHE_LOCK_1_ADDR_MAX_V 0xF +#define DPORT_APP_CACHE_LOCK_1_ADDR_MAX_S 18 +/* DPORT_APP_CACHE_LOCK_1_ADDR_MIN : R/W ;bitpos:[17:14] ;default: 4'h0 ; */ +/*description: */ +#define DPORT_APP_CACHE_LOCK_1_ADDR_MIN 0x0000000F +#define DPORT_APP_CACHE_LOCK_1_ADDR_MIN_M ((DPORT_APP_CACHE_LOCK_1_ADDR_MIN_V)<<(DPORT_APP_CACHE_LOCK_1_ADDR_MIN_S)) +#define DPORT_APP_CACHE_LOCK_1_ADDR_MIN_V 0xF +#define DPORT_APP_CACHE_LOCK_1_ADDR_MIN_S 14 +/* DPORT_APP_CACHE_LOCK_1_ADDR_PRE : R/W ;bitpos:[13:0] ;default: 14'h0 ; */ +/*description: */ +#define DPORT_APP_CACHE_LOCK_1_ADDR_PRE 0x00003FFF +#define DPORT_APP_CACHE_LOCK_1_ADDR_PRE_M ((DPORT_APP_CACHE_LOCK_1_ADDR_PRE_V)<<(DPORT_APP_CACHE_LOCK_1_ADDR_PRE_S)) +#define DPORT_APP_CACHE_LOCK_1_ADDR_PRE_V 0x3FFF +#define DPORT_APP_CACHE_LOCK_1_ADDR_PRE_S 0 + +#define DPORT_APP_CACHE_LOCK_2_ADDR_REG (DR_REG_DPORT_BASE + 0x068) +/* DPORT_APP_CACHE_LOCK_2_ADDR_MAX : R/W ;bitpos:[21:18] ;default: 4'h0 ; */ +/*description: */ +#define DPORT_APP_CACHE_LOCK_2_ADDR_MAX 0x0000000F +#define DPORT_APP_CACHE_LOCK_2_ADDR_MAX_M ((DPORT_APP_CACHE_LOCK_2_ADDR_MAX_V)<<(DPORT_APP_CACHE_LOCK_2_ADDR_MAX_S)) +#define DPORT_APP_CACHE_LOCK_2_ADDR_MAX_V 0xF +#define DPORT_APP_CACHE_LOCK_2_ADDR_MAX_S 18 +/* DPORT_APP_CACHE_LOCK_2_ADDR_MIN : R/W ;bitpos:[17:14] ;default: 4'h0 ; */ +/*description: */ +#define DPORT_APP_CACHE_LOCK_2_ADDR_MIN 0x0000000F +#define DPORT_APP_CACHE_LOCK_2_ADDR_MIN_M ((DPORT_APP_CACHE_LOCK_2_ADDR_MIN_V)<<(DPORT_APP_CACHE_LOCK_2_ADDR_MIN_S)) +#define DPORT_APP_CACHE_LOCK_2_ADDR_MIN_V 0xF +#define DPORT_APP_CACHE_LOCK_2_ADDR_MIN_S 14 +/* DPORT_APP_CACHE_LOCK_2_ADDR_PRE : R/W ;bitpos:[13:0] ;default: 14'h0 ; */ +/*description: */ +#define DPORT_APP_CACHE_LOCK_2_ADDR_PRE 0x00003FFF +#define DPORT_APP_CACHE_LOCK_2_ADDR_PRE_M ((DPORT_APP_CACHE_LOCK_2_ADDR_PRE_V)<<(DPORT_APP_CACHE_LOCK_2_ADDR_PRE_S)) +#define DPORT_APP_CACHE_LOCK_2_ADDR_PRE_V 0x3FFF +#define DPORT_APP_CACHE_LOCK_2_ADDR_PRE_S 0 + +#define DPORT_APP_CACHE_LOCK_3_ADDR_REG (DR_REG_DPORT_BASE + 0x06C) +/* DPORT_APP_CACHE_LOCK_3_ADDR_MAX : R/W ;bitpos:[21:18] ;default: 4'h0 ; */ +/*description: */ +#define DPORT_APP_CACHE_LOCK_3_ADDR_MAX 0x0000000F +#define DPORT_APP_CACHE_LOCK_3_ADDR_MAX_M ((DPORT_APP_CACHE_LOCK_3_ADDR_MAX_V)<<(DPORT_APP_CACHE_LOCK_3_ADDR_MAX_S)) +#define DPORT_APP_CACHE_LOCK_3_ADDR_MAX_V 0xF +#define DPORT_APP_CACHE_LOCK_3_ADDR_MAX_S 18 +/* DPORT_APP_CACHE_LOCK_3_ADDR_MIN : R/W ;bitpos:[17:14] ;default: 4'h0 ; */ +/*description: */ +#define DPORT_APP_CACHE_LOCK_3_ADDR_MIN 0x0000000F +#define DPORT_APP_CACHE_LOCK_3_ADDR_MIN_M ((DPORT_APP_CACHE_LOCK_3_ADDR_MIN_V)<<(DPORT_APP_CACHE_LOCK_3_ADDR_MIN_S)) +#define DPORT_APP_CACHE_LOCK_3_ADDR_MIN_V 0xF +#define DPORT_APP_CACHE_LOCK_3_ADDR_MIN_S 14 +/* DPORT_APP_CACHE_LOCK_3_ADDR_PRE : R/W ;bitpos:[13:0] ;default: 14'h0 ; */ +/*description: */ +#define DPORT_APP_CACHE_LOCK_3_ADDR_PRE 0x00003FFF +#define DPORT_APP_CACHE_LOCK_3_ADDR_PRE_M ((DPORT_APP_CACHE_LOCK_3_ADDR_PRE_V)<<(DPORT_APP_CACHE_LOCK_3_ADDR_PRE_S)) +#define DPORT_APP_CACHE_LOCK_3_ADDR_PRE_V 0x3FFF +#define DPORT_APP_CACHE_LOCK_3_ADDR_PRE_S 0 + +#define DPORT_TRACEMEM_MUX_MODE_REG (DR_REG_DPORT_BASE + 0x070) +/* DPORT_TRACEMEM_MUX_MODE : R/W ;bitpos:[1:0] ;default: 2'b0 ; */ +/*description: */ +#define DPORT_TRACEMEM_MUX_MODE 0x00000003 +#define DPORT_TRACEMEM_MUX_MODE_M ((DPORT_TRACEMEM_MUX_MODE_V)<<(DPORT_TRACEMEM_MUX_MODE_S)) +#define DPORT_TRACEMEM_MUX_MODE_V 0x3 +#define DPORT_TRACEMEM_MUX_MODE_S 0 + +#define DPORT_PRO_TRACEMEM_ENA_REG (DR_REG_DPORT_BASE + 0x074) +/* DPORT_PRO_TRACEMEM_ENA : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_PRO_TRACEMEM_ENA (BIT(0)) +#define DPORT_PRO_TRACEMEM_ENA_M (BIT(0)) +#define DPORT_PRO_TRACEMEM_ENA_V 0x1 +#define DPORT_PRO_TRACEMEM_ENA_S 0 + +#define DPORT_APP_TRACEMEM_ENA_REG (DR_REG_DPORT_BASE + 0x078) +/* DPORT_APP_TRACEMEM_ENA : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_APP_TRACEMEM_ENA (BIT(0)) +#define DPORT_APP_TRACEMEM_ENA_M (BIT(0)) +#define DPORT_APP_TRACEMEM_ENA_V 0x1 +#define DPORT_APP_TRACEMEM_ENA_S 0 + +#define DPORT_CACHE_MUX_MODE_REG (DR_REG_DPORT_BASE + 0x07C) +/* DPORT_CACHE_MUX_MODE : R/W ;bitpos:[1:0] ;default: 2'b0 ; */ +/*description: */ +#define DPORT_CACHE_MUX_MODE 0x00000003 +#define DPORT_CACHE_MUX_MODE_M ((DPORT_CACHE_MUX_MODE_V)<<(DPORT_CACHE_MUX_MODE_S)) +#define DPORT_CACHE_MUX_MODE_V 0x3 +#define DPORT_CACHE_MUX_MODE_S 0 + +#define DPORT_IMMU_PAGE_MODE_REG (DR_REG_DPORT_BASE + 0x080) +/* DPORT_IMMU_PAGE_MODE : R/W ;bitpos:[2:1] ;default: 2'b0 ; */ +/*description: */ +#define DPORT_IMMU_PAGE_MODE 0x00000003 +#define DPORT_IMMU_PAGE_MODE_M ((DPORT_IMMU_PAGE_MODE_V)<<(DPORT_IMMU_PAGE_MODE_S)) +#define DPORT_IMMU_PAGE_MODE_V 0x3 +#define DPORT_IMMU_PAGE_MODE_S 1 +/* DPORT_INTERNAL_SRAM_IMMU_ENA : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_INTERNAL_SRAM_IMMU_ENA (BIT(0)) +#define DPORT_INTERNAL_SRAM_IMMU_ENA_M (BIT(0)) +#define DPORT_INTERNAL_SRAM_IMMU_ENA_V 0x1 +#define DPORT_INTERNAL_SRAM_IMMU_ENA_S 0 + +#define DPORT_DMMU_PAGE_MODE_REG (DR_REG_DPORT_BASE + 0x084) +/* DPORT_DMMU_PAGE_MODE : R/W ;bitpos:[2:1] ;default: 2'b0 ; */ +/*description: */ +#define DPORT_DMMU_PAGE_MODE 0x00000003 +#define DPORT_DMMU_PAGE_MODE_M ((DPORT_DMMU_PAGE_MODE_V)<<(DPORT_DMMU_PAGE_MODE_S)) +#define DPORT_DMMU_PAGE_MODE_V 0x3 +#define DPORT_DMMU_PAGE_MODE_S 1 +/* DPORT_INTERNAL_SRAM_DMMU_ENA : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_INTERNAL_SRAM_DMMU_ENA (BIT(0)) +#define DPORT_INTERNAL_SRAM_DMMU_ENA_M (BIT(0)) +#define DPORT_INTERNAL_SRAM_DMMU_ENA_V 0x1 +#define DPORT_INTERNAL_SRAM_DMMU_ENA_S 0 + +#define DPORT_ROM_MPU_ENA_REG (DR_REG_DPORT_BASE + 0x088) +/* DPORT_APP_ROM_MPU_ENA : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_APP_ROM_MPU_ENA (BIT(2)) +#define DPORT_APP_ROM_MPU_ENA_M (BIT(2)) +#define DPORT_APP_ROM_MPU_ENA_V 0x1 +#define DPORT_APP_ROM_MPU_ENA_S 2 +/* DPORT_PRO_ROM_MPU_ENA : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_PRO_ROM_MPU_ENA (BIT(1)) +#define DPORT_PRO_ROM_MPU_ENA_M (BIT(1)) +#define DPORT_PRO_ROM_MPU_ENA_V 0x1 +#define DPORT_PRO_ROM_MPU_ENA_S 1 +/* DPORT_SHARE_ROM_MPU_ENA : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_SHARE_ROM_MPU_ENA (BIT(0)) +#define DPORT_SHARE_ROM_MPU_ENA_M (BIT(0)) +#define DPORT_SHARE_ROM_MPU_ENA_V 0x1 +#define DPORT_SHARE_ROM_MPU_ENA_S 0 + +#define DPORT_MEM_PD_MASK_REG (DR_REG_DPORT_BASE + 0x08C) +/* DPORT_LSLP_MEM_PD_MASK : R/W ;bitpos:[0] ;default: 1'b1 ; */ +/*description: */ +#define DPORT_LSLP_MEM_PD_MASK (BIT(0)) +#define DPORT_LSLP_MEM_PD_MASK_M (BIT(0)) +#define DPORT_LSLP_MEM_PD_MASK_V 0x1 +#define DPORT_LSLP_MEM_PD_MASK_S 0 + +#define DPORT_ROM_PD_CTRL_REG (DR_REG_DPORT_BASE + 0x090) +/* DPORT_SHARE_ROM_PD : R/W ;bitpos:[7:2] ;default: 6'h0 ; */ +/*description: */ +#define DPORT_SHARE_ROM_PD 0x0000003F +#define DPORT_SHARE_ROM_PD_M ((DPORT_SHARE_ROM_PD_V)<<(DPORT_SHARE_ROM_PD_S)) +#define DPORT_SHARE_ROM_PD_V 0x3F +#define DPORT_SHARE_ROM_PD_S 2 +/* DPORT_APP_ROM_PD : R/W ;bitpos:[1] ;default: 1'h0 ; */ +/*description: */ +#define DPORT_APP_ROM_PD (BIT(1)) +#define DPORT_APP_ROM_PD_M (BIT(1)) +#define DPORT_APP_ROM_PD_V 0x1 +#define DPORT_APP_ROM_PD_S 1 +/* DPORT_PRO_ROM_PD : R/W ;bitpos:[0] ;default: 1'h0 ; */ +/*description: */ +#define DPORT_PRO_ROM_PD (BIT(0)) +#define DPORT_PRO_ROM_PD_M (BIT(0)) +#define DPORT_PRO_ROM_PD_V 0x1 +#define DPORT_PRO_ROM_PD_S 0 + +#define DPORT_ROM_FO_CTRL_REG (DR_REG_DPORT_BASE + 0x094) +/* DPORT_SHARE_ROM_FO : R/W ;bitpos:[7:2] ;default: 6'h0 ; */ +/*description: */ +#define DPORT_SHARE_ROM_FO 0x0000003F +#define DPORT_SHARE_ROM_FO_M ((DPORT_SHARE_ROM_FO_V)<<(DPORT_SHARE_ROM_FO_S)) +#define DPORT_SHARE_ROM_FO_V 0x3F +#define DPORT_SHARE_ROM_FO_S 2 +/* DPORT_APP_ROM_FO : R/W ;bitpos:[1] ;default: 1'h1 ; */ +/*description: */ +#define DPORT_APP_ROM_FO (BIT(1)) +#define DPORT_APP_ROM_FO_M (BIT(1)) +#define DPORT_APP_ROM_FO_V 0x1 +#define DPORT_APP_ROM_FO_S 1 +/* DPORT_PRO_ROM_FO : R/W ;bitpos:[0] ;default: 1'h1 ; */ +/*description: */ +#define DPORT_PRO_ROM_FO (BIT(0)) +#define DPORT_PRO_ROM_FO_M (BIT(0)) +#define DPORT_PRO_ROM_FO_V 0x1 +#define DPORT_PRO_ROM_FO_S 0 + +#define DPORT_SRAM_PD_CTRL_0_REG (DR_REG_DPORT_BASE + 0x098) +/* DPORT_SRAM_PD_0 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define DPORT_SRAM_PD_0 0xFFFFFFFF +#define DPORT_SRAM_PD_0_M ((DPORT_SRAM_PD_0_V)<<(DPORT_SRAM_PD_0_S)) +#define DPORT_SRAM_PD_0_V 0xFFFFFFFF +#define DPORT_SRAM_PD_0_S 0 + +#define DPORT_SRAM_PD_CTRL_1_REG (DR_REG_DPORT_BASE + 0x09C) +/* DPORT_SRAM_PD_1 : R/W ;bitpos:[0] ;default: 1'h0 ; */ +/*description: */ +#define DPORT_SRAM_PD_1 (BIT(0)) +#define DPORT_SRAM_PD_1_M (BIT(0)) +#define DPORT_SRAM_PD_1_V 0x1 +#define DPORT_SRAM_PD_1_S 0 + +#define DPORT_SRAM_FO_CTRL_0_REG (DR_REG_DPORT_BASE + 0x0A0) +/* DPORT_SRAM_FO_0 : R/W ;bitpos:[31:0] ;default: 32'hffffffff ; */ +/*description: */ +#define DPORT_SRAM_FO_0 0xFFFFFFFF +#define DPORT_SRAM_FO_0_M ((DPORT_SRAM_FO_0_V)<<(DPORT_SRAM_FO_0_S)) +#define DPORT_SRAM_FO_0_V 0xFFFFFFFF +#define DPORT_SRAM_FO_0_S 0 + +#define DPORT_SRAM_FO_CTRL_1_REG (DR_REG_DPORT_BASE + 0x0A4) +/* DPORT_SRAM_FO_1 : R/W ;bitpos:[0] ;default: 1'h1 ; */ +/*description: */ +#define DPORT_SRAM_FO_1 (BIT(0)) +#define DPORT_SRAM_FO_1_M (BIT(0)) +#define DPORT_SRAM_FO_1_V 0x1 +#define DPORT_SRAM_FO_1_S 0 + +#define DPORT_IRAM_DRAM_AHB_SEL_REG (DR_REG_DPORT_BASE + 0x0A8) +/* DPORT_MAC_DUMP_MODE : R/W ;bitpos:[6:5] ;default: 2'h0 ; */ +/*description: */ +#define DPORT_MAC_DUMP_MODE 0x00000003 +#define DPORT_MAC_DUMP_MODE_M ((DPORT_MAC_DUMP_MODE_V)<<(DPORT_MAC_DUMP_MODE_S)) +#define DPORT_MAC_DUMP_MODE_V 0x3 +#define DPORT_MAC_DUMP_MODE_S 5 +/* DPORT_MASK_AHB : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_MASK_AHB (BIT(4)) +#define DPORT_MASK_AHB_M (BIT(4)) +#define DPORT_MASK_AHB_V 0x1 +#define DPORT_MASK_AHB_S 4 +/* DPORT_MASK_APP_DRAM : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_MASK_APP_DRAM (BIT(3)) +#define DPORT_MASK_APP_DRAM_M (BIT(3)) +#define DPORT_MASK_APP_DRAM_V 0x1 +#define DPORT_MASK_APP_DRAM_S 3 +/* DPORT_MASK_PRO_DRAM : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_MASK_PRO_DRAM (BIT(2)) +#define DPORT_MASK_PRO_DRAM_M (BIT(2)) +#define DPORT_MASK_PRO_DRAM_V 0x1 +#define DPORT_MASK_PRO_DRAM_S 2 +/* DPORT_MASK_APP_IRAM : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_MASK_APP_IRAM (BIT(1)) +#define DPORT_MASK_APP_IRAM_M (BIT(1)) +#define DPORT_MASK_APP_IRAM_V 0x1 +#define DPORT_MASK_APP_IRAM_S 1 +/* DPORT_MASK_PRO_IRAM : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_MASK_PRO_IRAM (BIT(0)) +#define DPORT_MASK_PRO_IRAM_M (BIT(0)) +#define DPORT_MASK_PRO_IRAM_V 0x1 +#define DPORT_MASK_PRO_IRAM_S 0 + +#define DPORT_TAG_FO_CTRL_REG (DR_REG_DPORT_BASE + 0x0AC) +/* DPORT_APP_CACHE_TAG_PD : R/W ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_APP_CACHE_TAG_PD (BIT(9)) +#define DPORT_APP_CACHE_TAG_PD_M (BIT(9)) +#define DPORT_APP_CACHE_TAG_PD_V 0x1 +#define DPORT_APP_CACHE_TAG_PD_S 9 +/* DPORT_APP_CACHE_TAG_FORCE_ON : R/W ;bitpos:[8] ;default: 1'b1 ; */ +/*description: */ +#define DPORT_APP_CACHE_TAG_FORCE_ON (BIT(8)) +#define DPORT_APP_CACHE_TAG_FORCE_ON_M (BIT(8)) +#define DPORT_APP_CACHE_TAG_FORCE_ON_V 0x1 +#define DPORT_APP_CACHE_TAG_FORCE_ON_S 8 +/* DPORT_PRO_CACHE_TAG_PD : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_PRO_CACHE_TAG_PD (BIT(1)) +#define DPORT_PRO_CACHE_TAG_PD_M (BIT(1)) +#define DPORT_PRO_CACHE_TAG_PD_V 0x1 +#define DPORT_PRO_CACHE_TAG_PD_S 1 +/* DPORT_PRO_CACHE_TAG_FORCE_ON : R/W ;bitpos:[0] ;default: 1'b1 ; */ +/*description: */ +#define DPORT_PRO_CACHE_TAG_FORCE_ON (BIT(0)) +#define DPORT_PRO_CACHE_TAG_FORCE_ON_M (BIT(0)) +#define DPORT_PRO_CACHE_TAG_FORCE_ON_V 0x1 +#define DPORT_PRO_CACHE_TAG_FORCE_ON_S 0 + +#define DPORT_AHB_LITE_MASK_REG (DR_REG_DPORT_BASE + 0x0B0) +/* DPORT_AHB_LITE_SDHOST_PID_REG : R/W ;bitpos:[13:11] ;default: 3'b0 ; */ +/*description: */ +#define DPORT_AHB_LITE_SDHOST_PID_REG 0x00000007 +#define DPORT_AHB_LITE_SDHOST_PID_REG_M ((DPORT_AHB_LITE_SDHOST_PID_REG_V)<<(DPORT_AHB_LITE_SDHOST_PID_REG_S)) +#define DPORT_AHB_LITE_SDHOST_PID_REG_V 0x7 +#define DPORT_AHB_LITE_SDHOST_PID_REG_S 11 +/* DPORT_AHB_LITE_MASK_APPDPORT : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_AHB_LITE_MASK_APPDPORT (BIT(10)) +#define DPORT_AHB_LITE_MASK_APPDPORT_M (BIT(10)) +#define DPORT_AHB_LITE_MASK_APPDPORT_V 0x1 +#define DPORT_AHB_LITE_MASK_APPDPORT_S 10 +/* DPORT_AHB_LITE_MASK_PRODPORT : R/W ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_AHB_LITE_MASK_PRODPORT (BIT(9)) +#define DPORT_AHB_LITE_MASK_PRODPORT_M (BIT(9)) +#define DPORT_AHB_LITE_MASK_PRODPORT_V 0x1 +#define DPORT_AHB_LITE_MASK_PRODPORT_S 9 +/* DPORT_AHB_LITE_MASK_SDIO : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_AHB_LITE_MASK_SDIO (BIT(8)) +#define DPORT_AHB_LITE_MASK_SDIO_M (BIT(8)) +#define DPORT_AHB_LITE_MASK_SDIO_V 0x1 +#define DPORT_AHB_LITE_MASK_SDIO_S 8 +/* DPORT_AHB_LITE_MASK_APP : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_AHB_LITE_MASK_APP (BIT(4)) +#define DPORT_AHB_LITE_MASK_APP_M (BIT(4)) +#define DPORT_AHB_LITE_MASK_APP_V 0x1 +#define DPORT_AHB_LITE_MASK_APP_S 4 +/* DPORT_AHB_LITE_MASK_PRO : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_AHB_LITE_MASK_PRO (BIT(0)) +#define DPORT_AHB_LITE_MASK_PRO_M (BIT(0)) +#define DPORT_AHB_LITE_MASK_PRO_V 0x1 +#define DPORT_AHB_LITE_MASK_PRO_S 0 + +#define DPORT_AHB_MPU_TABLE_0_REG (DR_REG_DPORT_BASE + 0x0B4) +/* DPORT_AHB_ACCESS_GRANT_0 : R/W ;bitpos:[31:0] ;default: 32'hffffffff ; */ +/*description: */ +#define DPORT_AHB_ACCESS_GRANT_0 0xFFFFFFFF +#define DPORT_AHB_ACCESS_GRANT_0_M ((DPORT_AHB_ACCESS_GRANT_0_V)<<(DPORT_AHB_ACCESS_GRANT_0_S)) +#define DPORT_AHB_ACCESS_GRANT_0_V 0xFFFFFFFF +#define DPORT_AHB_ACCESS_GRANT_0_S 0 + +#define DPORT_AHB_MPU_TABLE_1_REG (DR_REG_DPORT_BASE + 0x0B8) +/* DPORT_AHB_ACCESS_GRANT_1 : R/W ;bitpos:[8:0] ;default: 9'h1ff ; */ +/*description: */ +#define DPORT_AHB_ACCESS_GRANT_1 0x000001FF +#define DPORT_AHB_ACCESS_GRANT_1_M ((DPORT_AHB_ACCESS_GRANT_1_V)<<(DPORT_AHB_ACCESS_GRANT_1_S)) +#define DPORT_AHB_ACCESS_GRANT_1_V 0x1FF +#define DPORT_AHB_ACCESS_GRANT_1_S 0 + +#define DPORT_HOST_INF_SEL_REG (DR_REG_DPORT_BASE + 0x0BC) +/* DPORT_LINK_DEVICE_SEL : R/W ;bitpos:[15:8] ;default: 8'h0 ; */ +/*description: */ +#define DPORT_LINK_DEVICE_SEL 0x000000FF +#define DPORT_LINK_DEVICE_SEL_M ((DPORT_LINK_DEVICE_SEL_V)<<(DPORT_LINK_DEVICE_SEL_S)) +#define DPORT_LINK_DEVICE_SEL_V 0xFF +#define DPORT_LINK_DEVICE_SEL_S 8 +/* DPORT_PERI_IO_SWAP : R/W ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: */ +#define DPORT_PERI_IO_SWAP 0x000000FF +#define DPORT_PERI_IO_SWAP_M ((DPORT_PERI_IO_SWAP_V)<<(DPORT_PERI_IO_SWAP_S)) +#define DPORT_PERI_IO_SWAP_V 0xFF +#define DPORT_PERI_IO_SWAP_S 0 + +#define DPORT_PERIP_CLK_EN_REG (DR_REG_DPORT_BASE + 0x0C0) +/* DPORT_PERIP_CLK_EN : R/W ;bitpos:[31:0] ;default: 32'hf9c1e06f ; */ +/*description: */ +#define DPORT_PERIP_CLK_EN 0xFFFFFFFF +#define DPORT_PERIP_CLK_EN_M ((DPORT_PERIP_CLK_EN_V)<<(DPORT_PERIP_CLK_EN_S)) +#define DPORT_PERIP_CLK_EN_V 0xFFFFFFFF +#define DPORT_PERIP_CLK_EN_S 0 + +#define DPORT_PWM3_CLK_EN (BIT(26)) +#define DPORT_PWM2_CLK_EN (BIT(25)) +#define DPORT_UART_MEM_CLK_EN (BIT(24)) +#define DPORT_UART2_CLK_EN (BIT(23)) +#define DPORT_SPI_DMA_CLK_EN (BIT(22)) +#define DPORT_I2S1_CLK_EN (BIT(21)) +#define DPORT_PWM1_CLK_EN (BIT(20)) +#define DPORT_CAN_CLK_EN (BIT(19)) +#define DPORT_I2C_EXT1_CLK_EN (BIT(18)) +#define DPORT_PWM0_CLK_EN (BIT(17)) +#define DPORT_SPI3_CLK_EN (BIT(16)) +#define DPORT_TIMERGROUP1_CLK_EN (BIT(15)) +#define DPORT_EFUSE_CLK_EN (BIT(14)) +#define DPORT_TIMERGROUP_CLK_EN (BIT(13)) +#define DPORT_UHCI1_CLK_EN (BIT(12)) +#define DPORT_LEDC_CLK_EN (BIT(11)) +#define DPORT_PCNT_CLK_EN (BIT(10)) +#define DPORT_RMT_CLK_EN (BIT(9)) +#define DPORT_UHCI0_CLK_EN (BIT(8)) +#define DPORT_I2C_EXT0_CLK_EN (BIT(7)) +#define DPORT_SPI2_CLK_EN (BIT(6)) +#define DPORT_UART1_CLK_EN (BIT(5)) +#define DPORT_I2S0_CLK_EN (BIT(4)) +#define DPORT_WDG_CLK_EN (BIT(3)) +#define DPORT_UART_CLK_EN (BIT(2)) +#define DPORT_SPI01_CLK_EN (BIT(1)) +#define DPORT_TIMERS_CLK_EN (BIT(0)) +#define DPORT_PERIP_RST_EN_REG (DR_REG_DPORT_BASE + 0x0C4) +/* DPORT_PERIP_RST : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define DPORT_PERIP_RST 0xFFFFFFFF +#define DPORT_PERIP_RST_M ((DPORT_PERIP_RST_V)<<(DPORT_PERIP_RST_S)) +#define DPORT_PERIP_RST_V 0xFFFFFFFF +#define DPORT_PERIP_RST_S 0 +#define DPORT_PWM3_RST (BIT(26)) +#define DPORT_PWM2_RST (BIT(25)) +#define DPORT_UART_MEM_RST (BIT(24)) +#define DPORT_UART2_RST (BIT(23)) +#define DPORT_SPI_DMA_RST (BIT(22)) +#define DPORT_I2S1_RST (BIT(21)) +#define DPORT_PWM1_RST (BIT(20)) +#define DPORT_CAN_RST (BIT(19)) +#define DPORT_I2C_EXT1_RST (BIT(18)) +#define DPORT_PWM0_RST (BIT(17)) +#define DPORT_SPI3_RST (BIT(16)) +#define DPORT_TIMERGROUP1_RST (BIT(15)) +#define DPORT_EFUSE_RST (BIT(14)) +#define DPORT_TIMERGROUP_RST (BIT(13)) +#define DPORT_UHCI1_RST (BIT(12)) +#define DPORT_LEDC_RST (BIT(11)) +#define DPORT_PCNT_RST (BIT(10)) +#define DPORT_RMT_RST (BIT(9)) +#define DPORT_UHCI0_RST (BIT(8)) +#define DPORT_I2C_EXT0_RST (BIT(7)) +#define DPORT_SPI2_RST (BIT(6)) +#define DPORT_UART1_RST (BIT(5)) +#define DPORT_I2S0_RST (BIT(4)) +#define DPORT_WDG_RST (BIT(3)) +#define DPORT_UART_RST (BIT(2)) +#define DPORT_SPI01_RST (BIT(1)) +#define DPORT_TIMERS_RST (BIT(0)) +#define DPORT_SLAVE_SPI_CONFIG_REG (DR_REG_DPORT_BASE + 0x0C8) +/* DPORT_SPI_DECRYPT_ENABLE : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_SPI_DECRYPT_ENABLE (BIT(12)) +#define DPORT_SPI_DECRYPT_ENABLE_M (BIT(12)) +#define DPORT_SPI_DECRYPT_ENABLE_V 0x1 +#define DPORT_SPI_DECRYPT_ENABLE_S 12 +/* DPORT_SPI_ENCRYPT_ENABLE : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_SPI_ENCRYPT_ENABLE (BIT(8)) +#define DPORT_SPI_ENCRYPT_ENABLE_M (BIT(8)) +#define DPORT_SPI_ENCRYPT_ENABLE_V 0x1 +#define DPORT_SPI_ENCRYPT_ENABLE_S 8 +/* DPORT_SLAVE_SPI_MASK_APP : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_SLAVE_SPI_MASK_APP (BIT(4)) +#define DPORT_SLAVE_SPI_MASK_APP_M (BIT(4)) +#define DPORT_SLAVE_SPI_MASK_APP_V 0x1 +#define DPORT_SLAVE_SPI_MASK_APP_S 4 +/* DPORT_SLAVE_SPI_MASK_PRO : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_SLAVE_SPI_MASK_PRO (BIT(0)) +#define DPORT_SLAVE_SPI_MASK_PRO_M (BIT(0)) +#define DPORT_SLAVE_SPI_MASK_PRO_V 0x1 +#define DPORT_SLAVE_SPI_MASK_PRO_S 0 + +#define DPORT_WIFI_CLK_EN_REG (DR_REG_DPORT_BASE + 0x0CC) +/* DPORT_WIFI_CLK_EN : R/W ;bitpos:[31:0] ;default: 32'hfffce030 ; */ +/*description: */ +#define DPORT_WIFI_CLK_EN 0xFFFFFFFF +#define DPORT_WIFI_CLK_EN_M ((DPORT_WIFI_CLK_EN_V)<<(DPORT_WIFI_CLK_EN_S)) +#define DPORT_WIFI_CLK_EN_V 0xFFFFFFFF +#define DPORT_WIFI_CLK_EN_S 0 + +/* Mask for all Wifi clock bits - 1, 2, 10 */ +#define DPORT_WIFI_CLK_WIFI_EN 0x00000406 +#define DPORT_WIFI_CLK_WIFI_EN_M ((DPORT_WIFI_CLK_WIFI_EN_V)<<(DPORT_WIFI_CLK_WIFI_EN_S)) +#define DPORT_WIFI_CLK_WIFI_EN_V 0x406 +#define DPORT_WIFI_CLK_WIFI_EN_S 0 +/* Mask for all Bluetooth clock bits - 11, 16, 17 */ +#define DPORT_WIFI_CLK_BT_EN 0x61 +#define DPORT_WIFI_CLK_BT_EN_M ((DPORT_WIFI_CLK_BT_EN_V)<<(DPORT_WIFI_CLK_BT_EN_S)) +#define DPORT_WIFI_CLK_BT_EN_V 0x61 +#define DPORT_WIFI_CLK_BT_EN_S 11 +/* Mask for clock bits used by both WIFI and Bluetooth, bit 0, 3, 6, 7, 8, 9 */ +#define DPORT_WIFI_CLK_WIFI_BT_COMMON_M 0x000003c9 +//bluetooth baseband bit11 +#define DPORT_BT_BASEBAND_EN BIT(11) +//bluetooth LC bit16 and bit17 +#define DPORT_BT_LC_EN (BIT(16)|BIT(17)) + +/* Remaining single bit clock masks */ +#define DPORT_WIFI_CLK_SDIOSLAVE_EN BIT(4) +#define DPORT_WIFI_CLK_UNUSED_BIT5 BIT(5) +#define DPORT_WIFI_CLK_UNUSED_BIT12 BIT(12) +#define DPORT_WIFI_CLK_SDIO_HOST_EN BIT(13) +#define DPORT_WIFI_CLK_EMAC_EN BIT(14) +#define DPORT_WIFI_CLK_RNG_EN BIT(15) + +#define DPORT_CORE_RST_EN_REG (DR_REG_DPORT_BASE + 0x0D0) +/* DPORT_CORE_RST : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define DPORT_RW_BTLP_RST (BIT(10)) +#define DPORT_RW_BTMAC_RST (BIT(9)) +#define DPORT_MACPWR_RST (BIT(8)) +#define DPORT_EMAC_RST (BIT(7)) +#define DPORT_SDIO_HOST_RST (BIT(6)) +#define DPORT_SDIO_RST (BIT(5)) +#define DPORT_BTMAC_RST (BIT(4)) +#define DPORT_BT_RST (BIT(3)) +#define DPORT_MAC_RST (BIT(2)) +#define DPORT_FE_RST (BIT(1)) +#define DPORT_BB_RST (BIT(0)) + +#define DPORT_BT_LPCK_DIV_INT_REG (DR_REG_DPORT_BASE + 0x0D4) +/* DPORT_BTEXTWAKEUP_REQ : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_BTEXTWAKEUP_REQ (BIT(12)) +#define DPORT_BTEXTWAKEUP_REQ_M (BIT(12)) +#define DPORT_BTEXTWAKEUP_REQ_V 0x1 +#define DPORT_BTEXTWAKEUP_REQ_S 12 +/* DPORT_BT_LPCK_DIV_NUM : R/W ;bitpos:[11:0] ;default: 12'd255 ; */ +/*description: */ +#define DPORT_BT_LPCK_DIV_NUM 0x00000FFF +#define DPORT_BT_LPCK_DIV_NUM_M ((DPORT_BT_LPCK_DIV_NUM_V)<<(DPORT_BT_LPCK_DIV_NUM_S)) +#define DPORT_BT_LPCK_DIV_NUM_V 0xFFF +#define DPORT_BT_LPCK_DIV_NUM_S 0 + +#define DPORT_BT_LPCK_DIV_FRAC_REG (DR_REG_DPORT_BASE + 0x0D8) +/* DPORT_LPCLK_SEL_XTAL32K : R/W ;bitpos:[27] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_LPCLK_SEL_XTAL32K (BIT(27)) +#define DPORT_LPCLK_SEL_XTAL32K_M (BIT(27)) +#define DPORT_LPCLK_SEL_XTAL32K_V 0x1 +#define DPORT_LPCLK_SEL_XTAL32K_S 27 +/* DPORT_LPCLK_SEL_XTAL : R/W ;bitpos:[26] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_LPCLK_SEL_XTAL (BIT(26)) +#define DPORT_LPCLK_SEL_XTAL_M (BIT(26)) +#define DPORT_LPCLK_SEL_XTAL_V 0x1 +#define DPORT_LPCLK_SEL_XTAL_S 26 +/* DPORT_LPCLK_SEL_8M : R/W ;bitpos:[25] ;default: 1'b1 ; */ +/*description: */ +#define DPORT_LPCLK_SEL_8M (BIT(25)) +#define DPORT_LPCLK_SEL_8M_M (BIT(25)) +#define DPORT_LPCLK_SEL_8M_V 0x1 +#define DPORT_LPCLK_SEL_8M_S 25 +/* DPORT_LPCLK_SEL_RTC_SLOW : R/W ;bitpos:[24] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_LPCLK_SEL_RTC_SLOW (BIT(24)) +#define DPORT_LPCLK_SEL_RTC_SLOW_M (BIT(24)) +#define DPORT_LPCLK_SEL_RTC_SLOW_V 0x1 +#define DPORT_LPCLK_SEL_RTC_SLOW_S 24 +/* DPORT_BT_LPCK_DIV_A : R/W ;bitpos:[23:12] ;default: 12'd1 ; */ +/*description: */ +#define DPORT_BT_LPCK_DIV_A 0x00000FFF +#define DPORT_BT_LPCK_DIV_A_M ((DPORT_BT_LPCK_DIV_A_V)<<(DPORT_BT_LPCK_DIV_A_S)) +#define DPORT_BT_LPCK_DIV_A_V 0xFFF +#define DPORT_BT_LPCK_DIV_A_S 12 +/* DPORT_BT_LPCK_DIV_B : R/W ;bitpos:[11:0] ;default: 12'd1 ; */ +/*description: */ +#define DPORT_BT_LPCK_DIV_B 0x00000FFF +#define DPORT_BT_LPCK_DIV_B_M ((DPORT_BT_LPCK_DIV_B_V)<<(DPORT_BT_LPCK_DIV_B_S)) +#define DPORT_BT_LPCK_DIV_B_V 0xFFF +#define DPORT_BT_LPCK_DIV_B_S 0 + +#define DPORT_CPU_INTR_FROM_CPU_0_REG (DR_REG_DPORT_BASE + 0x0DC) +/* DPORT_CPU_INTR_FROM_CPU_0 : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_CPU_INTR_FROM_CPU_0 (BIT(0)) +#define DPORT_CPU_INTR_FROM_CPU_0_M (BIT(0)) +#define DPORT_CPU_INTR_FROM_CPU_0_V 0x1 +#define DPORT_CPU_INTR_FROM_CPU_0_S 0 + +#define DPORT_CPU_INTR_FROM_CPU_1_REG (DR_REG_DPORT_BASE + 0x0E0) +/* DPORT_CPU_INTR_FROM_CPU_1 : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_CPU_INTR_FROM_CPU_1 (BIT(0)) +#define DPORT_CPU_INTR_FROM_CPU_1_M (BIT(0)) +#define DPORT_CPU_INTR_FROM_CPU_1_V 0x1 +#define DPORT_CPU_INTR_FROM_CPU_1_S 0 + +#define DPORT_CPU_INTR_FROM_CPU_2_REG (DR_REG_DPORT_BASE + 0x0E4) +/* DPORT_CPU_INTR_FROM_CPU_2 : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_CPU_INTR_FROM_CPU_2 (BIT(0)) +#define DPORT_CPU_INTR_FROM_CPU_2_M (BIT(0)) +#define DPORT_CPU_INTR_FROM_CPU_2_V 0x1 +#define DPORT_CPU_INTR_FROM_CPU_2_S 0 + +#define DPORT_CPU_INTR_FROM_CPU_3_REG (DR_REG_DPORT_BASE + 0x0E8) +/* DPORT_CPU_INTR_FROM_CPU_3 : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_CPU_INTR_FROM_CPU_3 (BIT(0)) +#define DPORT_CPU_INTR_FROM_CPU_3_M (BIT(0)) +#define DPORT_CPU_INTR_FROM_CPU_3_V 0x1 +#define DPORT_CPU_INTR_FROM_CPU_3_S 0 + +#define DPORT_PRO_INTR_STATUS_0_REG (DR_REG_DPORT_BASE + 0x0EC) +/* DPORT_PRO_INTR_STATUS_0 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define DPORT_PRO_INTR_STATUS_0 0xFFFFFFFF +#define DPORT_PRO_INTR_STATUS_0_M ((DPORT_PRO_INTR_STATUS_0_V)<<(DPORT_PRO_INTR_STATUS_0_S)) +#define DPORT_PRO_INTR_STATUS_0_V 0xFFFFFFFF +#define DPORT_PRO_INTR_STATUS_0_S 0 + +#define DPORT_PRO_INTR_STATUS_1_REG (DR_REG_DPORT_BASE + 0x0F0) +/* DPORT_PRO_INTR_STATUS_1 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define DPORT_PRO_INTR_STATUS_1 0xFFFFFFFF +#define DPORT_PRO_INTR_STATUS_1_M ((DPORT_PRO_INTR_STATUS_1_V)<<(DPORT_PRO_INTR_STATUS_1_S)) +#define DPORT_PRO_INTR_STATUS_1_V 0xFFFFFFFF +#define DPORT_PRO_INTR_STATUS_1_S 0 + +#define DPORT_PRO_INTR_STATUS_2_REG (DR_REG_DPORT_BASE + 0x0F4) +/* DPORT_PRO_INTR_STATUS_2 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define DPORT_PRO_INTR_STATUS_2 0xFFFFFFFF +#define DPORT_PRO_INTR_STATUS_2_M ((DPORT_PRO_INTR_STATUS_2_V)<<(DPORT_PRO_INTR_STATUS_2_S)) +#define DPORT_PRO_INTR_STATUS_2_V 0xFFFFFFFF +#define DPORT_PRO_INTR_STATUS_2_S 0 + +#define DPORT_APP_INTR_STATUS_0_REG (DR_REG_DPORT_BASE + 0x0F8) +/* DPORT_APP_INTR_STATUS_0 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define DPORT_APP_INTR_STATUS_0 0xFFFFFFFF +#define DPORT_APP_INTR_STATUS_0_M ((DPORT_APP_INTR_STATUS_0_V)<<(DPORT_APP_INTR_STATUS_0_S)) +#define DPORT_APP_INTR_STATUS_0_V 0xFFFFFFFF +#define DPORT_APP_INTR_STATUS_0_S 0 + +#define DPORT_APP_INTR_STATUS_1_REG (DR_REG_DPORT_BASE + 0x0FC) +/* DPORT_APP_INTR_STATUS_1 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define DPORT_APP_INTR_STATUS_1 0xFFFFFFFF +#define DPORT_APP_INTR_STATUS_1_M ((DPORT_APP_INTR_STATUS_1_V)<<(DPORT_APP_INTR_STATUS_1_S)) +#define DPORT_APP_INTR_STATUS_1_V 0xFFFFFFFF +#define DPORT_APP_INTR_STATUS_1_S 0 + +#define DPORT_APP_INTR_STATUS_2_REG (DR_REG_DPORT_BASE + 0x100) +/* DPORT_APP_INTR_STATUS_2 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define DPORT_APP_INTR_STATUS_2 0xFFFFFFFF +#define DPORT_APP_INTR_STATUS_2_M ((DPORT_APP_INTR_STATUS_2_V)<<(DPORT_APP_INTR_STATUS_2_S)) +#define DPORT_APP_INTR_STATUS_2_V 0xFFFFFFFF +#define DPORT_APP_INTR_STATUS_2_S 0 + +#define DPORT_PRO_MAC_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x104) +/* DPORT_PRO_MAC_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_MAC_INTR_MAP 0x0000001F +#define DPORT_PRO_MAC_INTR_MAP_M ((DPORT_PRO_MAC_INTR_MAP_V)<<(DPORT_PRO_MAC_INTR_MAP_S)) +#define DPORT_PRO_MAC_INTR_MAP_V 0x1F +#define DPORT_PRO_MAC_INTR_MAP_S 0 + +#define DPORT_PRO_MAC_NMI_MAP_REG (DR_REG_DPORT_BASE + 0x108) +/* DPORT_PRO_MAC_NMI_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_MAC_NMI_MAP 0x0000001F +#define DPORT_PRO_MAC_NMI_MAP_M ((DPORT_PRO_MAC_NMI_MAP_V)<<(DPORT_PRO_MAC_NMI_MAP_S)) +#define DPORT_PRO_MAC_NMI_MAP_V 0x1F +#define DPORT_PRO_MAC_NMI_MAP_S 0 + +#define DPORT_PRO_BB_INT_MAP_REG (DR_REG_DPORT_BASE + 0x10C) +/* DPORT_PRO_BB_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_BB_INT_MAP 0x0000001F +#define DPORT_PRO_BB_INT_MAP_M ((DPORT_PRO_BB_INT_MAP_V)<<(DPORT_PRO_BB_INT_MAP_S)) +#define DPORT_PRO_BB_INT_MAP_V 0x1F +#define DPORT_PRO_BB_INT_MAP_S 0 + +#define DPORT_PRO_BT_MAC_INT_MAP_REG (DR_REG_DPORT_BASE + 0x110) +/* DPORT_PRO_BT_MAC_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_BT_MAC_INT_MAP 0x0000001F +#define DPORT_PRO_BT_MAC_INT_MAP_M ((DPORT_PRO_BT_MAC_INT_MAP_V)<<(DPORT_PRO_BT_MAC_INT_MAP_S)) +#define DPORT_PRO_BT_MAC_INT_MAP_V 0x1F +#define DPORT_PRO_BT_MAC_INT_MAP_S 0 + +#define DPORT_PRO_BT_BB_INT_MAP_REG (DR_REG_DPORT_BASE + 0x114) +/* DPORT_PRO_BT_BB_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_BT_BB_INT_MAP 0x0000001F +#define DPORT_PRO_BT_BB_INT_MAP_M ((DPORT_PRO_BT_BB_INT_MAP_V)<<(DPORT_PRO_BT_BB_INT_MAP_S)) +#define DPORT_PRO_BT_BB_INT_MAP_V 0x1F +#define DPORT_PRO_BT_BB_INT_MAP_S 0 + +#define DPORT_PRO_BT_BB_NMI_MAP_REG (DR_REG_DPORT_BASE + 0x118) +/* DPORT_PRO_BT_BB_NMI_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_BT_BB_NMI_MAP 0x0000001F +#define DPORT_PRO_BT_BB_NMI_MAP_M ((DPORT_PRO_BT_BB_NMI_MAP_V)<<(DPORT_PRO_BT_BB_NMI_MAP_S)) +#define DPORT_PRO_BT_BB_NMI_MAP_V 0x1F +#define DPORT_PRO_BT_BB_NMI_MAP_S 0 + +#define DPORT_PRO_RWBT_IRQ_MAP_REG (DR_REG_DPORT_BASE + 0x11C) +/* DPORT_PRO_RWBT_IRQ_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_RWBT_IRQ_MAP 0x0000001F +#define DPORT_PRO_RWBT_IRQ_MAP_M ((DPORT_PRO_RWBT_IRQ_MAP_V)<<(DPORT_PRO_RWBT_IRQ_MAP_S)) +#define DPORT_PRO_RWBT_IRQ_MAP_V 0x1F +#define DPORT_PRO_RWBT_IRQ_MAP_S 0 + +#define DPORT_PRO_RWBLE_IRQ_MAP_REG (DR_REG_DPORT_BASE + 0x120) +/* DPORT_PRO_RWBLE_IRQ_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_RWBLE_IRQ_MAP 0x0000001F +#define DPORT_PRO_RWBLE_IRQ_MAP_M ((DPORT_PRO_RWBLE_IRQ_MAP_V)<<(DPORT_PRO_RWBLE_IRQ_MAP_S)) +#define DPORT_PRO_RWBLE_IRQ_MAP_V 0x1F +#define DPORT_PRO_RWBLE_IRQ_MAP_S 0 + +#define DPORT_PRO_RWBT_NMI_MAP_REG (DR_REG_DPORT_BASE + 0x124) +/* DPORT_PRO_RWBT_NMI_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_RWBT_NMI_MAP 0x0000001F +#define DPORT_PRO_RWBT_NMI_MAP_M ((DPORT_PRO_RWBT_NMI_MAP_V)<<(DPORT_PRO_RWBT_NMI_MAP_S)) +#define DPORT_PRO_RWBT_NMI_MAP_V 0x1F +#define DPORT_PRO_RWBT_NMI_MAP_S 0 + +#define DPORT_PRO_RWBLE_NMI_MAP_REG (DR_REG_DPORT_BASE + 0x128) +/* DPORT_PRO_RWBLE_NMI_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_RWBLE_NMI_MAP 0x0000001F +#define DPORT_PRO_RWBLE_NMI_MAP_M ((DPORT_PRO_RWBLE_NMI_MAP_V)<<(DPORT_PRO_RWBLE_NMI_MAP_S)) +#define DPORT_PRO_RWBLE_NMI_MAP_V 0x1F +#define DPORT_PRO_RWBLE_NMI_MAP_S 0 + +#define DPORT_PRO_SLC0_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x12C) +/* DPORT_PRO_SLC0_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_SLC0_INTR_MAP 0x0000001F +#define DPORT_PRO_SLC0_INTR_MAP_M ((DPORT_PRO_SLC0_INTR_MAP_V)<<(DPORT_PRO_SLC0_INTR_MAP_S)) +#define DPORT_PRO_SLC0_INTR_MAP_V 0x1F +#define DPORT_PRO_SLC0_INTR_MAP_S 0 + +#define DPORT_PRO_SLC1_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x130) +/* DPORT_PRO_SLC1_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_SLC1_INTR_MAP 0x0000001F +#define DPORT_PRO_SLC1_INTR_MAP_M ((DPORT_PRO_SLC1_INTR_MAP_V)<<(DPORT_PRO_SLC1_INTR_MAP_S)) +#define DPORT_PRO_SLC1_INTR_MAP_V 0x1F +#define DPORT_PRO_SLC1_INTR_MAP_S 0 + +#define DPORT_PRO_UHCI0_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x134) +/* DPORT_PRO_UHCI0_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_UHCI0_INTR_MAP 0x0000001F +#define DPORT_PRO_UHCI0_INTR_MAP_M ((DPORT_PRO_UHCI0_INTR_MAP_V)<<(DPORT_PRO_UHCI0_INTR_MAP_S)) +#define DPORT_PRO_UHCI0_INTR_MAP_V 0x1F +#define DPORT_PRO_UHCI0_INTR_MAP_S 0 + +#define DPORT_PRO_UHCI1_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x138) +/* DPORT_PRO_UHCI1_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_UHCI1_INTR_MAP 0x0000001F +#define DPORT_PRO_UHCI1_INTR_MAP_M ((DPORT_PRO_UHCI1_INTR_MAP_V)<<(DPORT_PRO_UHCI1_INTR_MAP_S)) +#define DPORT_PRO_UHCI1_INTR_MAP_V 0x1F +#define DPORT_PRO_UHCI1_INTR_MAP_S 0 + +#define DPORT_PRO_TG_T0_LEVEL_INT_MAP_REG (DR_REG_DPORT_BASE + 0x13C) +/* DPORT_PRO_TG_T0_LEVEL_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_TG_T0_LEVEL_INT_MAP 0x0000001F +#define DPORT_PRO_TG_T0_LEVEL_INT_MAP_M ((DPORT_PRO_TG_T0_LEVEL_INT_MAP_V)<<(DPORT_PRO_TG_T0_LEVEL_INT_MAP_S)) +#define DPORT_PRO_TG_T0_LEVEL_INT_MAP_V 0x1F +#define DPORT_PRO_TG_T0_LEVEL_INT_MAP_S 0 + +#define DPORT_PRO_TG_T1_LEVEL_INT_MAP_REG (DR_REG_DPORT_BASE + 0x140) +/* DPORT_PRO_TG_T1_LEVEL_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_TG_T1_LEVEL_INT_MAP 0x0000001F +#define DPORT_PRO_TG_T1_LEVEL_INT_MAP_M ((DPORT_PRO_TG_T1_LEVEL_INT_MAP_V)<<(DPORT_PRO_TG_T1_LEVEL_INT_MAP_S)) +#define DPORT_PRO_TG_T1_LEVEL_INT_MAP_V 0x1F +#define DPORT_PRO_TG_T1_LEVEL_INT_MAP_S 0 + +#define DPORT_PRO_TG_WDT_LEVEL_INT_MAP_REG (DR_REG_DPORT_BASE + 0x144) +/* DPORT_PRO_TG_WDT_LEVEL_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_TG_WDT_LEVEL_INT_MAP 0x0000001F +#define DPORT_PRO_TG_WDT_LEVEL_INT_MAP_M ((DPORT_PRO_TG_WDT_LEVEL_INT_MAP_V)<<(DPORT_PRO_TG_WDT_LEVEL_INT_MAP_S)) +#define DPORT_PRO_TG_WDT_LEVEL_INT_MAP_V 0x1F +#define DPORT_PRO_TG_WDT_LEVEL_INT_MAP_S 0 + +#define DPORT_PRO_TG_LACT_LEVEL_INT_MAP_REG (DR_REG_DPORT_BASE + 0x148) +/* DPORT_PRO_TG_LACT_LEVEL_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_TG_LACT_LEVEL_INT_MAP 0x0000001F +#define DPORT_PRO_TG_LACT_LEVEL_INT_MAP_M ((DPORT_PRO_TG_LACT_LEVEL_INT_MAP_V)<<(DPORT_PRO_TG_LACT_LEVEL_INT_MAP_S)) +#define DPORT_PRO_TG_LACT_LEVEL_INT_MAP_V 0x1F +#define DPORT_PRO_TG_LACT_LEVEL_INT_MAP_S 0 + +#define DPORT_PRO_TG1_T0_LEVEL_INT_MAP_REG (DR_REG_DPORT_BASE + 0x14C) +/* DPORT_PRO_TG1_T0_LEVEL_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_TG1_T0_LEVEL_INT_MAP 0x0000001F +#define DPORT_PRO_TG1_T0_LEVEL_INT_MAP_M ((DPORT_PRO_TG1_T0_LEVEL_INT_MAP_V)<<(DPORT_PRO_TG1_T0_LEVEL_INT_MAP_S)) +#define DPORT_PRO_TG1_T0_LEVEL_INT_MAP_V 0x1F +#define DPORT_PRO_TG1_T0_LEVEL_INT_MAP_S 0 + +#define DPORT_PRO_TG1_T1_LEVEL_INT_MAP_REG (DR_REG_DPORT_BASE + 0x150) +/* DPORT_PRO_TG1_T1_LEVEL_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_TG1_T1_LEVEL_INT_MAP 0x0000001F +#define DPORT_PRO_TG1_T1_LEVEL_INT_MAP_M ((DPORT_PRO_TG1_T1_LEVEL_INT_MAP_V)<<(DPORT_PRO_TG1_T1_LEVEL_INT_MAP_S)) +#define DPORT_PRO_TG1_T1_LEVEL_INT_MAP_V 0x1F +#define DPORT_PRO_TG1_T1_LEVEL_INT_MAP_S 0 + +#define DPORT_PRO_TG1_WDT_LEVEL_INT_MAP_REG (DR_REG_DPORT_BASE + 0x154) +/* DPORT_PRO_TG1_WDT_LEVEL_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_TG1_WDT_LEVEL_INT_MAP 0x0000001F +#define DPORT_PRO_TG1_WDT_LEVEL_INT_MAP_M ((DPORT_PRO_TG1_WDT_LEVEL_INT_MAP_V)<<(DPORT_PRO_TG1_WDT_LEVEL_INT_MAP_S)) +#define DPORT_PRO_TG1_WDT_LEVEL_INT_MAP_V 0x1F +#define DPORT_PRO_TG1_WDT_LEVEL_INT_MAP_S 0 + +#define DPORT_PRO_TG1_LACT_LEVEL_INT_MAP_REG (DR_REG_DPORT_BASE + 0x158) +/* DPORT_PRO_TG1_LACT_LEVEL_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_TG1_LACT_LEVEL_INT_MAP 0x0000001F +#define DPORT_PRO_TG1_LACT_LEVEL_INT_MAP_M ((DPORT_PRO_TG1_LACT_LEVEL_INT_MAP_V)<<(DPORT_PRO_TG1_LACT_LEVEL_INT_MAP_S)) +#define DPORT_PRO_TG1_LACT_LEVEL_INT_MAP_V 0x1F +#define DPORT_PRO_TG1_LACT_LEVEL_INT_MAP_S 0 + +#define DPORT_PRO_GPIO_INTERRUPT_MAP_REG (DR_REG_DPORT_BASE + 0x15C) +/* DPORT_PRO_GPIO_INTERRUPT_PRO_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_GPIO_INTERRUPT_PRO_MAP 0x0000001F +#define DPORT_PRO_GPIO_INTERRUPT_PRO_MAP_M ((DPORT_PRO_GPIO_INTERRUPT_PRO_MAP_V)<<(DPORT_PRO_GPIO_INTERRUPT_PRO_MAP_S)) +#define DPORT_PRO_GPIO_INTERRUPT_PRO_MAP_V 0x1F +#define DPORT_PRO_GPIO_INTERRUPT_PRO_MAP_S 0 + +#define DPORT_PRO_GPIO_INTERRUPT_NMI_MAP_REG (DR_REG_DPORT_BASE + 0x160) +/* DPORT_PRO_GPIO_INTERRUPT_PRO_NMI_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_GPIO_INTERRUPT_PRO_NMI_MAP 0x0000001F +#define DPORT_PRO_GPIO_INTERRUPT_PRO_NMI_MAP_M ((DPORT_PRO_GPIO_INTERRUPT_PRO_NMI_MAP_V)<<(DPORT_PRO_GPIO_INTERRUPT_PRO_NMI_MAP_S)) +#define DPORT_PRO_GPIO_INTERRUPT_PRO_NMI_MAP_V 0x1F +#define DPORT_PRO_GPIO_INTERRUPT_PRO_NMI_MAP_S 0 + +#define DPORT_PRO_CPU_INTR_FROM_CPU_0_MAP_REG (DR_REG_DPORT_BASE + 0x164) +/* DPORT_PRO_CPU_INTR_FROM_CPU_0_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_CPU_INTR_FROM_CPU_0_MAP 0x0000001F +#define DPORT_PRO_CPU_INTR_FROM_CPU_0_MAP_M ((DPORT_PRO_CPU_INTR_FROM_CPU_0_MAP_V)<<(DPORT_PRO_CPU_INTR_FROM_CPU_0_MAP_S)) +#define DPORT_PRO_CPU_INTR_FROM_CPU_0_MAP_V 0x1F +#define DPORT_PRO_CPU_INTR_FROM_CPU_0_MAP_S 0 + +#define DPORT_PRO_CPU_INTR_FROM_CPU_1_MAP_REG (DR_REG_DPORT_BASE + 0x168) +/* DPORT_PRO_CPU_INTR_FROM_CPU_1_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_CPU_INTR_FROM_CPU_1_MAP 0x0000001F +#define DPORT_PRO_CPU_INTR_FROM_CPU_1_MAP_M ((DPORT_PRO_CPU_INTR_FROM_CPU_1_MAP_V)<<(DPORT_PRO_CPU_INTR_FROM_CPU_1_MAP_S)) +#define DPORT_PRO_CPU_INTR_FROM_CPU_1_MAP_V 0x1F +#define DPORT_PRO_CPU_INTR_FROM_CPU_1_MAP_S 0 + +#define DPORT_PRO_CPU_INTR_FROM_CPU_2_MAP_REG (DR_REG_DPORT_BASE + 0x16C) +/* DPORT_PRO_CPU_INTR_FROM_CPU_2_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_CPU_INTR_FROM_CPU_2_MAP 0x0000001F +#define DPORT_PRO_CPU_INTR_FROM_CPU_2_MAP_M ((DPORT_PRO_CPU_INTR_FROM_CPU_2_MAP_V)<<(DPORT_PRO_CPU_INTR_FROM_CPU_2_MAP_S)) +#define DPORT_PRO_CPU_INTR_FROM_CPU_2_MAP_V 0x1F +#define DPORT_PRO_CPU_INTR_FROM_CPU_2_MAP_S 0 + +#define DPORT_PRO_CPU_INTR_FROM_CPU_3_MAP_REG (DR_REG_DPORT_BASE + 0x170) +/* DPORT_PRO_CPU_INTR_FROM_CPU_3_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_CPU_INTR_FROM_CPU_3_MAP 0x0000001F +#define DPORT_PRO_CPU_INTR_FROM_CPU_3_MAP_M ((DPORT_PRO_CPU_INTR_FROM_CPU_3_MAP_V)<<(DPORT_PRO_CPU_INTR_FROM_CPU_3_MAP_S)) +#define DPORT_PRO_CPU_INTR_FROM_CPU_3_MAP_V 0x1F +#define DPORT_PRO_CPU_INTR_FROM_CPU_3_MAP_S 0 + +#define DPORT_PRO_SPI_INTR_0_MAP_REG (DR_REG_DPORT_BASE + 0x174) +/* DPORT_PRO_SPI_INTR_0_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_SPI_INTR_0_MAP 0x0000001F +#define DPORT_PRO_SPI_INTR_0_MAP_M ((DPORT_PRO_SPI_INTR_0_MAP_V)<<(DPORT_PRO_SPI_INTR_0_MAP_S)) +#define DPORT_PRO_SPI_INTR_0_MAP_V 0x1F +#define DPORT_PRO_SPI_INTR_0_MAP_S 0 + +#define DPORT_PRO_SPI_INTR_1_MAP_REG (DR_REG_DPORT_BASE + 0x178) +/* DPORT_PRO_SPI_INTR_1_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_SPI_INTR_1_MAP 0x0000001F +#define DPORT_PRO_SPI_INTR_1_MAP_M ((DPORT_PRO_SPI_INTR_1_MAP_V)<<(DPORT_PRO_SPI_INTR_1_MAP_S)) +#define DPORT_PRO_SPI_INTR_1_MAP_V 0x1F +#define DPORT_PRO_SPI_INTR_1_MAP_S 0 + +#define DPORT_PRO_SPI_INTR_2_MAP_REG (DR_REG_DPORT_BASE + 0x17C) +/* DPORT_PRO_SPI_INTR_2_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_SPI_INTR_2_MAP 0x0000001F +#define DPORT_PRO_SPI_INTR_2_MAP_M ((DPORT_PRO_SPI_INTR_2_MAP_V)<<(DPORT_PRO_SPI_INTR_2_MAP_S)) +#define DPORT_PRO_SPI_INTR_2_MAP_V 0x1F +#define DPORT_PRO_SPI_INTR_2_MAP_S 0 + +#define DPORT_PRO_SPI_INTR_3_MAP_REG (DR_REG_DPORT_BASE + 0x180) +/* DPORT_PRO_SPI_INTR_3_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_SPI_INTR_3_MAP 0x0000001F +#define DPORT_PRO_SPI_INTR_3_MAP_M ((DPORT_PRO_SPI_INTR_3_MAP_V)<<(DPORT_PRO_SPI_INTR_3_MAP_S)) +#define DPORT_PRO_SPI_INTR_3_MAP_V 0x1F +#define DPORT_PRO_SPI_INTR_3_MAP_S 0 + +#define DPORT_PRO_I2S0_INT_MAP_REG (DR_REG_DPORT_BASE + 0x184) +/* DPORT_PRO_I2S0_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_I2S0_INT_MAP 0x0000001F +#define DPORT_PRO_I2S0_INT_MAP_M ((DPORT_PRO_I2S0_INT_MAP_V)<<(DPORT_PRO_I2S0_INT_MAP_S)) +#define DPORT_PRO_I2S0_INT_MAP_V 0x1F +#define DPORT_PRO_I2S0_INT_MAP_S 0 + +#define DPORT_PRO_I2S1_INT_MAP_REG (DR_REG_DPORT_BASE + 0x188) +/* DPORT_PRO_I2S1_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_I2S1_INT_MAP 0x0000001F +#define DPORT_PRO_I2S1_INT_MAP_M ((DPORT_PRO_I2S1_INT_MAP_V)<<(DPORT_PRO_I2S1_INT_MAP_S)) +#define DPORT_PRO_I2S1_INT_MAP_V 0x1F +#define DPORT_PRO_I2S1_INT_MAP_S 0 + +#define DPORT_PRO_UART_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x18C) +/* DPORT_PRO_UART_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_UART_INTR_MAP 0x0000001F +#define DPORT_PRO_UART_INTR_MAP_M ((DPORT_PRO_UART_INTR_MAP_V)<<(DPORT_PRO_UART_INTR_MAP_S)) +#define DPORT_PRO_UART_INTR_MAP_V 0x1F +#define DPORT_PRO_UART_INTR_MAP_S 0 + +#define DPORT_PRO_UART1_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x190) +/* DPORT_PRO_UART1_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_UART1_INTR_MAP 0x0000001F +#define DPORT_PRO_UART1_INTR_MAP_M ((DPORT_PRO_UART1_INTR_MAP_V)<<(DPORT_PRO_UART1_INTR_MAP_S)) +#define DPORT_PRO_UART1_INTR_MAP_V 0x1F +#define DPORT_PRO_UART1_INTR_MAP_S 0 + +#define DPORT_PRO_UART2_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x194) +/* DPORT_PRO_UART2_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_UART2_INTR_MAP 0x0000001F +#define DPORT_PRO_UART2_INTR_MAP_M ((DPORT_PRO_UART2_INTR_MAP_V)<<(DPORT_PRO_UART2_INTR_MAP_S)) +#define DPORT_PRO_UART2_INTR_MAP_V 0x1F +#define DPORT_PRO_UART2_INTR_MAP_S 0 + +#define DPORT_PRO_SDIO_HOST_INTERRUPT_MAP_REG (DR_REG_DPORT_BASE + 0x198) +/* DPORT_PRO_SDIO_HOST_INTERRUPT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_SDIO_HOST_INTERRUPT_MAP 0x0000001F +#define DPORT_PRO_SDIO_HOST_INTERRUPT_MAP_M ((DPORT_PRO_SDIO_HOST_INTERRUPT_MAP_V)<<(DPORT_PRO_SDIO_HOST_INTERRUPT_MAP_S)) +#define DPORT_PRO_SDIO_HOST_INTERRUPT_MAP_V 0x1F +#define DPORT_PRO_SDIO_HOST_INTERRUPT_MAP_S 0 + +#define DPORT_PRO_EMAC_INT_MAP_REG (DR_REG_DPORT_BASE + 0x19C) +/* DPORT_PRO_EMAC_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_EMAC_INT_MAP 0x0000001F +#define DPORT_PRO_EMAC_INT_MAP_M ((DPORT_PRO_EMAC_INT_MAP_V)<<(DPORT_PRO_EMAC_INT_MAP_S)) +#define DPORT_PRO_EMAC_INT_MAP_V 0x1F +#define DPORT_PRO_EMAC_INT_MAP_S 0 + +#define DPORT_PRO_PWM0_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x1A0) +/* DPORT_PRO_PWM0_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_PWM0_INTR_MAP 0x0000001F +#define DPORT_PRO_PWM0_INTR_MAP_M ((DPORT_PRO_PWM0_INTR_MAP_V)<<(DPORT_PRO_PWM0_INTR_MAP_S)) +#define DPORT_PRO_PWM0_INTR_MAP_V 0x1F +#define DPORT_PRO_PWM0_INTR_MAP_S 0 + +#define DPORT_PRO_PWM1_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x1A4) +/* DPORT_PRO_PWM1_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_PWM1_INTR_MAP 0x0000001F +#define DPORT_PRO_PWM1_INTR_MAP_M ((DPORT_PRO_PWM1_INTR_MAP_V)<<(DPORT_PRO_PWM1_INTR_MAP_S)) +#define DPORT_PRO_PWM1_INTR_MAP_V 0x1F +#define DPORT_PRO_PWM1_INTR_MAP_S 0 + +#define DPORT_PRO_PWM2_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x1A8) +/* DPORT_PRO_PWM2_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_PWM2_INTR_MAP 0x0000001F +#define DPORT_PRO_PWM2_INTR_MAP_M ((DPORT_PRO_PWM2_INTR_MAP_V)<<(DPORT_PRO_PWM2_INTR_MAP_S)) +#define DPORT_PRO_PWM2_INTR_MAP_V 0x1F +#define DPORT_PRO_PWM2_INTR_MAP_S 0 + +#define DPORT_PRO_PWM3_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x1AC) +/* DPORT_PRO_PWM3_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_PWM3_INTR_MAP 0x0000001F +#define DPORT_PRO_PWM3_INTR_MAP_M ((DPORT_PRO_PWM3_INTR_MAP_V)<<(DPORT_PRO_PWM3_INTR_MAP_S)) +#define DPORT_PRO_PWM3_INTR_MAP_V 0x1F +#define DPORT_PRO_PWM3_INTR_MAP_S 0 + +#define DPORT_PRO_LEDC_INT_MAP_REG (DR_REG_DPORT_BASE + 0x1B0) +/* DPORT_PRO_LEDC_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_LEDC_INT_MAP 0x0000001F +#define DPORT_PRO_LEDC_INT_MAP_M ((DPORT_PRO_LEDC_INT_MAP_V)<<(DPORT_PRO_LEDC_INT_MAP_S)) +#define DPORT_PRO_LEDC_INT_MAP_V 0x1F +#define DPORT_PRO_LEDC_INT_MAP_S 0 + +#define DPORT_PRO_EFUSE_INT_MAP_REG (DR_REG_DPORT_BASE + 0x1B4) +/* DPORT_PRO_EFUSE_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_EFUSE_INT_MAP 0x0000001F +#define DPORT_PRO_EFUSE_INT_MAP_M ((DPORT_PRO_EFUSE_INT_MAP_V)<<(DPORT_PRO_EFUSE_INT_MAP_S)) +#define DPORT_PRO_EFUSE_INT_MAP_V 0x1F +#define DPORT_PRO_EFUSE_INT_MAP_S 0 + +#define DPORT_PRO_CAN_INT_MAP_REG (DR_REG_DPORT_BASE + 0x1B8) +/* DPORT_PRO_CAN_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_CAN_INT_MAP 0x0000001F +#define DPORT_PRO_CAN_INT_MAP_M ((DPORT_PRO_CAN_INT_MAP_V)<<(DPORT_PRO_CAN_INT_MAP_S)) +#define DPORT_PRO_CAN_INT_MAP_V 0x1F +#define DPORT_PRO_CAN_INT_MAP_S 0 + +#define DPORT_PRO_RTC_CORE_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x1BC) +/* DPORT_PRO_RTC_CORE_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_RTC_CORE_INTR_MAP 0x0000001F +#define DPORT_PRO_RTC_CORE_INTR_MAP_M ((DPORT_PRO_RTC_CORE_INTR_MAP_V)<<(DPORT_PRO_RTC_CORE_INTR_MAP_S)) +#define DPORT_PRO_RTC_CORE_INTR_MAP_V 0x1F +#define DPORT_PRO_RTC_CORE_INTR_MAP_S 0 + +#define DPORT_PRO_RMT_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x1C0) +/* DPORT_PRO_RMT_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_RMT_INTR_MAP 0x0000001F +#define DPORT_PRO_RMT_INTR_MAP_M ((DPORT_PRO_RMT_INTR_MAP_V)<<(DPORT_PRO_RMT_INTR_MAP_S)) +#define DPORT_PRO_RMT_INTR_MAP_V 0x1F +#define DPORT_PRO_RMT_INTR_MAP_S 0 + +#define DPORT_PRO_PCNT_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x1C4) +/* DPORT_PRO_PCNT_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_PCNT_INTR_MAP 0x0000001F +#define DPORT_PRO_PCNT_INTR_MAP_M ((DPORT_PRO_PCNT_INTR_MAP_V)<<(DPORT_PRO_PCNT_INTR_MAP_S)) +#define DPORT_PRO_PCNT_INTR_MAP_V 0x1F +#define DPORT_PRO_PCNT_INTR_MAP_S 0 + +#define DPORT_PRO_I2C_EXT0_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x1C8) +/* DPORT_PRO_I2C_EXT0_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_I2C_EXT0_INTR_MAP 0x0000001F +#define DPORT_PRO_I2C_EXT0_INTR_MAP_M ((DPORT_PRO_I2C_EXT0_INTR_MAP_V)<<(DPORT_PRO_I2C_EXT0_INTR_MAP_S)) +#define DPORT_PRO_I2C_EXT0_INTR_MAP_V 0x1F +#define DPORT_PRO_I2C_EXT0_INTR_MAP_S 0 + +#define DPORT_PRO_I2C_EXT1_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x1CC) +/* DPORT_PRO_I2C_EXT1_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_I2C_EXT1_INTR_MAP 0x0000001F +#define DPORT_PRO_I2C_EXT1_INTR_MAP_M ((DPORT_PRO_I2C_EXT1_INTR_MAP_V)<<(DPORT_PRO_I2C_EXT1_INTR_MAP_S)) +#define DPORT_PRO_I2C_EXT1_INTR_MAP_V 0x1F +#define DPORT_PRO_I2C_EXT1_INTR_MAP_S 0 + +#define DPORT_PRO_RSA_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x1D0) +/* DPORT_PRO_RSA_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_RSA_INTR_MAP 0x0000001F +#define DPORT_PRO_RSA_INTR_MAP_M ((DPORT_PRO_RSA_INTR_MAP_V)<<(DPORT_PRO_RSA_INTR_MAP_S)) +#define DPORT_PRO_RSA_INTR_MAP_V 0x1F +#define DPORT_PRO_RSA_INTR_MAP_S 0 + +#define DPORT_PRO_SPI1_DMA_INT_MAP_REG (DR_REG_DPORT_BASE + 0x1D4) +/* DPORT_PRO_SPI1_DMA_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_SPI1_DMA_INT_MAP 0x0000001F +#define DPORT_PRO_SPI1_DMA_INT_MAP_M ((DPORT_PRO_SPI1_DMA_INT_MAP_V)<<(DPORT_PRO_SPI1_DMA_INT_MAP_S)) +#define DPORT_PRO_SPI1_DMA_INT_MAP_V 0x1F +#define DPORT_PRO_SPI1_DMA_INT_MAP_S 0 + +#define DPORT_PRO_SPI2_DMA_INT_MAP_REG (DR_REG_DPORT_BASE + 0x1D8) +/* DPORT_PRO_SPI2_DMA_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_SPI2_DMA_INT_MAP 0x0000001F +#define DPORT_PRO_SPI2_DMA_INT_MAP_M ((DPORT_PRO_SPI2_DMA_INT_MAP_V)<<(DPORT_PRO_SPI2_DMA_INT_MAP_S)) +#define DPORT_PRO_SPI2_DMA_INT_MAP_V 0x1F +#define DPORT_PRO_SPI2_DMA_INT_MAP_S 0 + +#define DPORT_PRO_SPI3_DMA_INT_MAP_REG (DR_REG_DPORT_BASE + 0x1DC) +/* DPORT_PRO_SPI3_DMA_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_SPI3_DMA_INT_MAP 0x0000001F +#define DPORT_PRO_SPI3_DMA_INT_MAP_M ((DPORT_PRO_SPI3_DMA_INT_MAP_V)<<(DPORT_PRO_SPI3_DMA_INT_MAP_S)) +#define DPORT_PRO_SPI3_DMA_INT_MAP_V 0x1F +#define DPORT_PRO_SPI3_DMA_INT_MAP_S 0 + +#define DPORT_PRO_WDG_INT_MAP_REG (DR_REG_DPORT_BASE + 0x1E0) +/* DPORT_PRO_WDG_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_WDG_INT_MAP 0x0000001F +#define DPORT_PRO_WDG_INT_MAP_M ((DPORT_PRO_WDG_INT_MAP_V)<<(DPORT_PRO_WDG_INT_MAP_S)) +#define DPORT_PRO_WDG_INT_MAP_V 0x1F +#define DPORT_PRO_WDG_INT_MAP_S 0 + +#define DPORT_PRO_TIMER_INT1_MAP_REG (DR_REG_DPORT_BASE + 0x1E4) +/* DPORT_PRO_TIMER_INT1_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_TIMER_INT1_MAP 0x0000001F +#define DPORT_PRO_TIMER_INT1_MAP_M ((DPORT_PRO_TIMER_INT1_MAP_V)<<(DPORT_PRO_TIMER_INT1_MAP_S)) +#define DPORT_PRO_TIMER_INT1_MAP_V 0x1F +#define DPORT_PRO_TIMER_INT1_MAP_S 0 + +#define DPORT_PRO_TIMER_INT2_MAP_REG (DR_REG_DPORT_BASE + 0x1E8) +/* DPORT_PRO_TIMER_INT2_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_TIMER_INT2_MAP 0x0000001F +#define DPORT_PRO_TIMER_INT2_MAP_M ((DPORT_PRO_TIMER_INT2_MAP_V)<<(DPORT_PRO_TIMER_INT2_MAP_S)) +#define DPORT_PRO_TIMER_INT2_MAP_V 0x1F +#define DPORT_PRO_TIMER_INT2_MAP_S 0 + +#define DPORT_PRO_TG_T0_EDGE_INT_MAP_REG (DR_REG_DPORT_BASE + 0x1EC) +/* DPORT_PRO_TG_T0_EDGE_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_TG_T0_EDGE_INT_MAP 0x0000001F +#define DPORT_PRO_TG_T0_EDGE_INT_MAP_M ((DPORT_PRO_TG_T0_EDGE_INT_MAP_V)<<(DPORT_PRO_TG_T0_EDGE_INT_MAP_S)) +#define DPORT_PRO_TG_T0_EDGE_INT_MAP_V 0x1F +#define DPORT_PRO_TG_T0_EDGE_INT_MAP_S 0 + +#define DPORT_PRO_TG_T1_EDGE_INT_MAP_REG (DR_REG_DPORT_BASE + 0x1F0) +/* DPORT_PRO_TG_T1_EDGE_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_TG_T1_EDGE_INT_MAP 0x0000001F +#define DPORT_PRO_TG_T1_EDGE_INT_MAP_M ((DPORT_PRO_TG_T1_EDGE_INT_MAP_V)<<(DPORT_PRO_TG_T1_EDGE_INT_MAP_S)) +#define DPORT_PRO_TG_T1_EDGE_INT_MAP_V 0x1F +#define DPORT_PRO_TG_T1_EDGE_INT_MAP_S 0 + +#define DPORT_PRO_TG_WDT_EDGE_INT_MAP_REG (DR_REG_DPORT_BASE + 0x1F4) +/* DPORT_PRO_TG_WDT_EDGE_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_TG_WDT_EDGE_INT_MAP 0x0000001F +#define DPORT_PRO_TG_WDT_EDGE_INT_MAP_M ((DPORT_PRO_TG_WDT_EDGE_INT_MAP_V)<<(DPORT_PRO_TG_WDT_EDGE_INT_MAP_S)) +#define DPORT_PRO_TG_WDT_EDGE_INT_MAP_V 0x1F +#define DPORT_PRO_TG_WDT_EDGE_INT_MAP_S 0 + +#define DPORT_PRO_TG_LACT_EDGE_INT_MAP_REG (DR_REG_DPORT_BASE + 0x1F8) +/* DPORT_PRO_TG_LACT_EDGE_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_TG_LACT_EDGE_INT_MAP 0x0000001F +#define DPORT_PRO_TG_LACT_EDGE_INT_MAP_M ((DPORT_PRO_TG_LACT_EDGE_INT_MAP_V)<<(DPORT_PRO_TG_LACT_EDGE_INT_MAP_S)) +#define DPORT_PRO_TG_LACT_EDGE_INT_MAP_V 0x1F +#define DPORT_PRO_TG_LACT_EDGE_INT_MAP_S 0 + +#define DPORT_PRO_TG1_T0_EDGE_INT_MAP_REG (DR_REG_DPORT_BASE + 0x1FC) +/* DPORT_PRO_TG1_T0_EDGE_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_TG1_T0_EDGE_INT_MAP 0x0000001F +#define DPORT_PRO_TG1_T0_EDGE_INT_MAP_M ((DPORT_PRO_TG1_T0_EDGE_INT_MAP_V)<<(DPORT_PRO_TG1_T0_EDGE_INT_MAP_S)) +#define DPORT_PRO_TG1_T0_EDGE_INT_MAP_V 0x1F +#define DPORT_PRO_TG1_T0_EDGE_INT_MAP_S 0 + +#define DPORT_PRO_TG1_T1_EDGE_INT_MAP_REG (DR_REG_DPORT_BASE + 0x200) +/* DPORT_PRO_TG1_T1_EDGE_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_TG1_T1_EDGE_INT_MAP 0x0000001F +#define DPORT_PRO_TG1_T1_EDGE_INT_MAP_M ((DPORT_PRO_TG1_T1_EDGE_INT_MAP_V)<<(DPORT_PRO_TG1_T1_EDGE_INT_MAP_S)) +#define DPORT_PRO_TG1_T1_EDGE_INT_MAP_V 0x1F +#define DPORT_PRO_TG1_T1_EDGE_INT_MAP_S 0 + +#define DPORT_PRO_TG1_WDT_EDGE_INT_MAP_REG (DR_REG_DPORT_BASE + 0x204) +/* DPORT_PRO_TG1_WDT_EDGE_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_TG1_WDT_EDGE_INT_MAP 0x0000001F +#define DPORT_PRO_TG1_WDT_EDGE_INT_MAP_M ((DPORT_PRO_TG1_WDT_EDGE_INT_MAP_V)<<(DPORT_PRO_TG1_WDT_EDGE_INT_MAP_S)) +#define DPORT_PRO_TG1_WDT_EDGE_INT_MAP_V 0x1F +#define DPORT_PRO_TG1_WDT_EDGE_INT_MAP_S 0 + +#define DPORT_PRO_TG1_LACT_EDGE_INT_MAP_REG (DR_REG_DPORT_BASE + 0x208) +/* DPORT_PRO_TG1_LACT_EDGE_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_TG1_LACT_EDGE_INT_MAP 0x0000001F +#define DPORT_PRO_TG1_LACT_EDGE_INT_MAP_M ((DPORT_PRO_TG1_LACT_EDGE_INT_MAP_V)<<(DPORT_PRO_TG1_LACT_EDGE_INT_MAP_S)) +#define DPORT_PRO_TG1_LACT_EDGE_INT_MAP_V 0x1F +#define DPORT_PRO_TG1_LACT_EDGE_INT_MAP_S 0 + +#define DPORT_PRO_MMU_IA_INT_MAP_REG (DR_REG_DPORT_BASE + 0x20C) +/* DPORT_PRO_MMU_IA_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_MMU_IA_INT_MAP 0x0000001F +#define DPORT_PRO_MMU_IA_INT_MAP_M ((DPORT_PRO_MMU_IA_INT_MAP_V)<<(DPORT_PRO_MMU_IA_INT_MAP_S)) +#define DPORT_PRO_MMU_IA_INT_MAP_V 0x1F +#define DPORT_PRO_MMU_IA_INT_MAP_S 0 + +#define DPORT_PRO_MPU_IA_INT_MAP_REG (DR_REG_DPORT_BASE + 0x210) +/* DPORT_PRO_MPU_IA_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_MPU_IA_INT_MAP 0x0000001F +#define DPORT_PRO_MPU_IA_INT_MAP_M ((DPORT_PRO_MPU_IA_INT_MAP_V)<<(DPORT_PRO_MPU_IA_INT_MAP_S)) +#define DPORT_PRO_MPU_IA_INT_MAP_V 0x1F +#define DPORT_PRO_MPU_IA_INT_MAP_S 0 + +#define DPORT_PRO_CACHE_IA_INT_MAP_REG (DR_REG_DPORT_BASE + 0x214) +/* DPORT_PRO_CACHE_IA_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_PRO_CACHE_IA_INT_MAP 0x0000001F +#define DPORT_PRO_CACHE_IA_INT_MAP_M ((DPORT_PRO_CACHE_IA_INT_MAP_V)<<(DPORT_PRO_CACHE_IA_INT_MAP_S)) +#define DPORT_PRO_CACHE_IA_INT_MAP_V 0x1F +#define DPORT_PRO_CACHE_IA_INT_MAP_S 0 + +#define DPORT_APP_MAC_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x218) +/* DPORT_APP_MAC_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_MAC_INTR_MAP 0x0000001F +#define DPORT_APP_MAC_INTR_MAP_M ((DPORT_APP_MAC_INTR_MAP_V)<<(DPORT_APP_MAC_INTR_MAP_S)) +#define DPORT_APP_MAC_INTR_MAP_V 0x1F +#define DPORT_APP_MAC_INTR_MAP_S 0 + +#define DPORT_APP_MAC_NMI_MAP_REG (DR_REG_DPORT_BASE + 0x21C) +/* DPORT_APP_MAC_NMI_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_MAC_NMI_MAP 0x0000001F +#define DPORT_APP_MAC_NMI_MAP_M ((DPORT_APP_MAC_NMI_MAP_V)<<(DPORT_APP_MAC_NMI_MAP_S)) +#define DPORT_APP_MAC_NMI_MAP_V 0x1F +#define DPORT_APP_MAC_NMI_MAP_S 0 + +#define DPORT_APP_BB_INT_MAP_REG (DR_REG_DPORT_BASE + 0x220) +/* DPORT_APP_BB_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_BB_INT_MAP 0x0000001F +#define DPORT_APP_BB_INT_MAP_M ((DPORT_APP_BB_INT_MAP_V)<<(DPORT_APP_BB_INT_MAP_S)) +#define DPORT_APP_BB_INT_MAP_V 0x1F +#define DPORT_APP_BB_INT_MAP_S 0 + +#define DPORT_APP_BT_MAC_INT_MAP_REG (DR_REG_DPORT_BASE + 0x224) +/* DPORT_APP_BT_MAC_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_BT_MAC_INT_MAP 0x0000001F +#define DPORT_APP_BT_MAC_INT_MAP_M ((DPORT_APP_BT_MAC_INT_MAP_V)<<(DPORT_APP_BT_MAC_INT_MAP_S)) +#define DPORT_APP_BT_MAC_INT_MAP_V 0x1F +#define DPORT_APP_BT_MAC_INT_MAP_S 0 + +#define DPORT_APP_BT_BB_INT_MAP_REG (DR_REG_DPORT_BASE + 0x228) +/* DPORT_APP_BT_BB_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_BT_BB_INT_MAP 0x0000001F +#define DPORT_APP_BT_BB_INT_MAP_M ((DPORT_APP_BT_BB_INT_MAP_V)<<(DPORT_APP_BT_BB_INT_MAP_S)) +#define DPORT_APP_BT_BB_INT_MAP_V 0x1F +#define DPORT_APP_BT_BB_INT_MAP_S 0 + +#define DPORT_APP_BT_BB_NMI_MAP_REG (DR_REG_DPORT_BASE + 0x22C) +/* DPORT_APP_BT_BB_NMI_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_BT_BB_NMI_MAP 0x0000001F +#define DPORT_APP_BT_BB_NMI_MAP_M ((DPORT_APP_BT_BB_NMI_MAP_V)<<(DPORT_APP_BT_BB_NMI_MAP_S)) +#define DPORT_APP_BT_BB_NMI_MAP_V 0x1F +#define DPORT_APP_BT_BB_NMI_MAP_S 0 + +#define DPORT_APP_RWBT_IRQ_MAP_REG (DR_REG_DPORT_BASE + 0x230) +/* DPORT_APP_RWBT_IRQ_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_RWBT_IRQ_MAP 0x0000001F +#define DPORT_APP_RWBT_IRQ_MAP_M ((DPORT_APP_RWBT_IRQ_MAP_V)<<(DPORT_APP_RWBT_IRQ_MAP_S)) +#define DPORT_APP_RWBT_IRQ_MAP_V 0x1F +#define DPORT_APP_RWBT_IRQ_MAP_S 0 + +#define DPORT_APP_RWBLE_IRQ_MAP_REG (DR_REG_DPORT_BASE + 0x234) +/* DPORT_APP_RWBLE_IRQ_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_RWBLE_IRQ_MAP 0x0000001F +#define DPORT_APP_RWBLE_IRQ_MAP_M ((DPORT_APP_RWBLE_IRQ_MAP_V)<<(DPORT_APP_RWBLE_IRQ_MAP_S)) +#define DPORT_APP_RWBLE_IRQ_MAP_V 0x1F +#define DPORT_APP_RWBLE_IRQ_MAP_S 0 + +#define DPORT_APP_RWBT_NMI_MAP_REG (DR_REG_DPORT_BASE + 0x238) +/* DPORT_APP_RWBT_NMI_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_RWBT_NMI_MAP 0x0000001F +#define DPORT_APP_RWBT_NMI_MAP_M ((DPORT_APP_RWBT_NMI_MAP_V)<<(DPORT_APP_RWBT_NMI_MAP_S)) +#define DPORT_APP_RWBT_NMI_MAP_V 0x1F +#define DPORT_APP_RWBT_NMI_MAP_S 0 + +#define DPORT_APP_RWBLE_NMI_MAP_REG (DR_REG_DPORT_BASE + 0x23C) +/* DPORT_APP_RWBLE_NMI_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_RWBLE_NMI_MAP 0x0000001F +#define DPORT_APP_RWBLE_NMI_MAP_M ((DPORT_APP_RWBLE_NMI_MAP_V)<<(DPORT_APP_RWBLE_NMI_MAP_S)) +#define DPORT_APP_RWBLE_NMI_MAP_V 0x1F +#define DPORT_APP_RWBLE_NMI_MAP_S 0 + +#define DPORT_APP_SLC0_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x240) +/* DPORT_APP_SLC0_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_SLC0_INTR_MAP 0x0000001F +#define DPORT_APP_SLC0_INTR_MAP_M ((DPORT_APP_SLC0_INTR_MAP_V)<<(DPORT_APP_SLC0_INTR_MAP_S)) +#define DPORT_APP_SLC0_INTR_MAP_V 0x1F +#define DPORT_APP_SLC0_INTR_MAP_S 0 + +#define DPORT_APP_SLC1_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x244) +/* DPORT_APP_SLC1_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_SLC1_INTR_MAP 0x0000001F +#define DPORT_APP_SLC1_INTR_MAP_M ((DPORT_APP_SLC1_INTR_MAP_V)<<(DPORT_APP_SLC1_INTR_MAP_S)) +#define DPORT_APP_SLC1_INTR_MAP_V 0x1F +#define DPORT_APP_SLC1_INTR_MAP_S 0 + +#define DPORT_APP_UHCI0_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x248) +/* DPORT_APP_UHCI0_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_UHCI0_INTR_MAP 0x0000001F +#define DPORT_APP_UHCI0_INTR_MAP_M ((DPORT_APP_UHCI0_INTR_MAP_V)<<(DPORT_APP_UHCI0_INTR_MAP_S)) +#define DPORT_APP_UHCI0_INTR_MAP_V 0x1F +#define DPORT_APP_UHCI0_INTR_MAP_S 0 + +#define DPORT_APP_UHCI1_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x24C) +/* DPORT_APP_UHCI1_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_UHCI1_INTR_MAP 0x0000001F +#define DPORT_APP_UHCI1_INTR_MAP_M ((DPORT_APP_UHCI1_INTR_MAP_V)<<(DPORT_APP_UHCI1_INTR_MAP_S)) +#define DPORT_APP_UHCI1_INTR_MAP_V 0x1F +#define DPORT_APP_UHCI1_INTR_MAP_S 0 + +#define DPORT_APP_TG_T0_LEVEL_INT_MAP_REG (DR_REG_DPORT_BASE + 0x250) +/* DPORT_APP_TG_T0_LEVEL_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_TG_T0_LEVEL_INT_MAP 0x0000001F +#define DPORT_APP_TG_T0_LEVEL_INT_MAP_M ((DPORT_APP_TG_T0_LEVEL_INT_MAP_V)<<(DPORT_APP_TG_T0_LEVEL_INT_MAP_S)) +#define DPORT_APP_TG_T0_LEVEL_INT_MAP_V 0x1F +#define DPORT_APP_TG_T0_LEVEL_INT_MAP_S 0 + +#define DPORT_APP_TG_T1_LEVEL_INT_MAP_REG (DR_REG_DPORT_BASE + 0x254) +/* DPORT_APP_TG_T1_LEVEL_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_TG_T1_LEVEL_INT_MAP 0x0000001F +#define DPORT_APP_TG_T1_LEVEL_INT_MAP_M ((DPORT_APP_TG_T1_LEVEL_INT_MAP_V)<<(DPORT_APP_TG_T1_LEVEL_INT_MAP_S)) +#define DPORT_APP_TG_T1_LEVEL_INT_MAP_V 0x1F +#define DPORT_APP_TG_T1_LEVEL_INT_MAP_S 0 + +#define DPORT_APP_TG_WDT_LEVEL_INT_MAP_REG (DR_REG_DPORT_BASE + 0x258) +/* DPORT_APP_TG_WDT_LEVEL_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_TG_WDT_LEVEL_INT_MAP 0x0000001F +#define DPORT_APP_TG_WDT_LEVEL_INT_MAP_M ((DPORT_APP_TG_WDT_LEVEL_INT_MAP_V)<<(DPORT_APP_TG_WDT_LEVEL_INT_MAP_S)) +#define DPORT_APP_TG_WDT_LEVEL_INT_MAP_V 0x1F +#define DPORT_APP_TG_WDT_LEVEL_INT_MAP_S 0 + +#define DPORT_APP_TG_LACT_LEVEL_INT_MAP_REG (DR_REG_DPORT_BASE + 0x25C) +/* DPORT_APP_TG_LACT_LEVEL_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_TG_LACT_LEVEL_INT_MAP 0x0000001F +#define DPORT_APP_TG_LACT_LEVEL_INT_MAP_M ((DPORT_APP_TG_LACT_LEVEL_INT_MAP_V)<<(DPORT_APP_TG_LACT_LEVEL_INT_MAP_S)) +#define DPORT_APP_TG_LACT_LEVEL_INT_MAP_V 0x1F +#define DPORT_APP_TG_LACT_LEVEL_INT_MAP_S 0 + +#define DPORT_APP_TG1_T0_LEVEL_INT_MAP_REG (DR_REG_DPORT_BASE + 0x260) +/* DPORT_APP_TG1_T0_LEVEL_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_TG1_T0_LEVEL_INT_MAP 0x0000001F +#define DPORT_APP_TG1_T0_LEVEL_INT_MAP_M ((DPORT_APP_TG1_T0_LEVEL_INT_MAP_V)<<(DPORT_APP_TG1_T0_LEVEL_INT_MAP_S)) +#define DPORT_APP_TG1_T0_LEVEL_INT_MAP_V 0x1F +#define DPORT_APP_TG1_T0_LEVEL_INT_MAP_S 0 + +#define DPORT_APP_TG1_T1_LEVEL_INT_MAP_REG (DR_REG_DPORT_BASE + 0x264) +/* DPORT_APP_TG1_T1_LEVEL_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_TG1_T1_LEVEL_INT_MAP 0x0000001F +#define DPORT_APP_TG1_T1_LEVEL_INT_MAP_M ((DPORT_APP_TG1_T1_LEVEL_INT_MAP_V)<<(DPORT_APP_TG1_T1_LEVEL_INT_MAP_S)) +#define DPORT_APP_TG1_T1_LEVEL_INT_MAP_V 0x1F +#define DPORT_APP_TG1_T1_LEVEL_INT_MAP_S 0 + +#define DPORT_APP_TG1_WDT_LEVEL_INT_MAP_REG (DR_REG_DPORT_BASE + 0x268) +/* DPORT_APP_TG1_WDT_LEVEL_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_TG1_WDT_LEVEL_INT_MAP 0x0000001F +#define DPORT_APP_TG1_WDT_LEVEL_INT_MAP_M ((DPORT_APP_TG1_WDT_LEVEL_INT_MAP_V)<<(DPORT_APP_TG1_WDT_LEVEL_INT_MAP_S)) +#define DPORT_APP_TG1_WDT_LEVEL_INT_MAP_V 0x1F +#define DPORT_APP_TG1_WDT_LEVEL_INT_MAP_S 0 + +#define DPORT_APP_TG1_LACT_LEVEL_INT_MAP_REG (DR_REG_DPORT_BASE + 0x26C) +/* DPORT_APP_TG1_LACT_LEVEL_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_TG1_LACT_LEVEL_INT_MAP 0x0000001F +#define DPORT_APP_TG1_LACT_LEVEL_INT_MAP_M ((DPORT_APP_TG1_LACT_LEVEL_INT_MAP_V)<<(DPORT_APP_TG1_LACT_LEVEL_INT_MAP_S)) +#define DPORT_APP_TG1_LACT_LEVEL_INT_MAP_V 0x1F +#define DPORT_APP_TG1_LACT_LEVEL_INT_MAP_S 0 + +#define DPORT_APP_GPIO_INTERRUPT_MAP_REG (DR_REG_DPORT_BASE + 0x270) +/* DPORT_APP_GPIO_INTERRUPT_APP_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_GPIO_INTERRUPT_APP_MAP 0x0000001F +#define DPORT_APP_GPIO_INTERRUPT_APP_MAP_M ((DPORT_APP_GPIO_INTERRUPT_APP_MAP_V)<<(DPORT_APP_GPIO_INTERRUPT_APP_MAP_S)) +#define DPORT_APP_GPIO_INTERRUPT_APP_MAP_V 0x1F +#define DPORT_APP_GPIO_INTERRUPT_APP_MAP_S 0 + +#define DPORT_APP_GPIO_INTERRUPT_NMI_MAP_REG (DR_REG_DPORT_BASE + 0x274) +/* DPORT_APP_GPIO_INTERRUPT_APP_NMI_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_GPIO_INTERRUPT_APP_NMI_MAP 0x0000001F +#define DPORT_APP_GPIO_INTERRUPT_APP_NMI_MAP_M ((DPORT_APP_GPIO_INTERRUPT_APP_NMI_MAP_V)<<(DPORT_APP_GPIO_INTERRUPT_APP_NMI_MAP_S)) +#define DPORT_APP_GPIO_INTERRUPT_APP_NMI_MAP_V 0x1F +#define DPORT_APP_GPIO_INTERRUPT_APP_NMI_MAP_S 0 + +#define DPORT_APP_CPU_INTR_FROM_CPU_0_MAP_REG (DR_REG_DPORT_BASE + 0x278) +/* DPORT_APP_CPU_INTR_FROM_CPU_0_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_CPU_INTR_FROM_CPU_0_MAP 0x0000001F +#define DPORT_APP_CPU_INTR_FROM_CPU_0_MAP_M ((DPORT_APP_CPU_INTR_FROM_CPU_0_MAP_V)<<(DPORT_APP_CPU_INTR_FROM_CPU_0_MAP_S)) +#define DPORT_APP_CPU_INTR_FROM_CPU_0_MAP_V 0x1F +#define DPORT_APP_CPU_INTR_FROM_CPU_0_MAP_S 0 + +#define DPORT_APP_CPU_INTR_FROM_CPU_1_MAP_REG (DR_REG_DPORT_BASE + 0x27C) +/* DPORT_APP_CPU_INTR_FROM_CPU_1_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_CPU_INTR_FROM_CPU_1_MAP 0x0000001F +#define DPORT_APP_CPU_INTR_FROM_CPU_1_MAP_M ((DPORT_APP_CPU_INTR_FROM_CPU_1_MAP_V)<<(DPORT_APP_CPU_INTR_FROM_CPU_1_MAP_S)) +#define DPORT_APP_CPU_INTR_FROM_CPU_1_MAP_V 0x1F +#define DPORT_APP_CPU_INTR_FROM_CPU_1_MAP_S 0 + +#define DPORT_APP_CPU_INTR_FROM_CPU_2_MAP_REG (DR_REG_DPORT_BASE + 0x280) +/* DPORT_APP_CPU_INTR_FROM_CPU_2_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_CPU_INTR_FROM_CPU_2_MAP 0x0000001F +#define DPORT_APP_CPU_INTR_FROM_CPU_2_MAP_M ((DPORT_APP_CPU_INTR_FROM_CPU_2_MAP_V)<<(DPORT_APP_CPU_INTR_FROM_CPU_2_MAP_S)) +#define DPORT_APP_CPU_INTR_FROM_CPU_2_MAP_V 0x1F +#define DPORT_APP_CPU_INTR_FROM_CPU_2_MAP_S 0 + +#define DPORT_APP_CPU_INTR_FROM_CPU_3_MAP_REG (DR_REG_DPORT_BASE + 0x284) +/* DPORT_APP_CPU_INTR_FROM_CPU_3_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_CPU_INTR_FROM_CPU_3_MAP 0x0000001F +#define DPORT_APP_CPU_INTR_FROM_CPU_3_MAP_M ((DPORT_APP_CPU_INTR_FROM_CPU_3_MAP_V)<<(DPORT_APP_CPU_INTR_FROM_CPU_3_MAP_S)) +#define DPORT_APP_CPU_INTR_FROM_CPU_3_MAP_V 0x1F +#define DPORT_APP_CPU_INTR_FROM_CPU_3_MAP_S 0 + +#define DPORT_APP_SPI_INTR_0_MAP_REG (DR_REG_DPORT_BASE + 0x288) +/* DPORT_APP_SPI_INTR_0_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_SPI_INTR_0_MAP 0x0000001F +#define DPORT_APP_SPI_INTR_0_MAP_M ((DPORT_APP_SPI_INTR_0_MAP_V)<<(DPORT_APP_SPI_INTR_0_MAP_S)) +#define DPORT_APP_SPI_INTR_0_MAP_V 0x1F +#define DPORT_APP_SPI_INTR_0_MAP_S 0 + +#define DPORT_APP_SPI_INTR_1_MAP_REG (DR_REG_DPORT_BASE + 0x28C) +/* DPORT_APP_SPI_INTR_1_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_SPI_INTR_1_MAP 0x0000001F +#define DPORT_APP_SPI_INTR_1_MAP_M ((DPORT_APP_SPI_INTR_1_MAP_V)<<(DPORT_APP_SPI_INTR_1_MAP_S)) +#define DPORT_APP_SPI_INTR_1_MAP_V 0x1F +#define DPORT_APP_SPI_INTR_1_MAP_S 0 + +#define DPORT_APP_SPI_INTR_2_MAP_REG (DR_REG_DPORT_BASE + 0x290) +/* DPORT_APP_SPI_INTR_2_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_SPI_INTR_2_MAP 0x0000001F +#define DPORT_APP_SPI_INTR_2_MAP_M ((DPORT_APP_SPI_INTR_2_MAP_V)<<(DPORT_APP_SPI_INTR_2_MAP_S)) +#define DPORT_APP_SPI_INTR_2_MAP_V 0x1F +#define DPORT_APP_SPI_INTR_2_MAP_S 0 + +#define DPORT_APP_SPI_INTR_3_MAP_REG (DR_REG_DPORT_BASE + 0x294) +/* DPORT_APP_SPI_INTR_3_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_SPI_INTR_3_MAP 0x0000001F +#define DPORT_APP_SPI_INTR_3_MAP_M ((DPORT_APP_SPI_INTR_3_MAP_V)<<(DPORT_APP_SPI_INTR_3_MAP_S)) +#define DPORT_APP_SPI_INTR_3_MAP_V 0x1F +#define DPORT_APP_SPI_INTR_3_MAP_S 0 + +#define DPORT_APP_I2S0_INT_MAP_REG (DR_REG_DPORT_BASE + 0x298) +/* DPORT_APP_I2S0_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_I2S0_INT_MAP 0x0000001F +#define DPORT_APP_I2S0_INT_MAP_M ((DPORT_APP_I2S0_INT_MAP_V)<<(DPORT_APP_I2S0_INT_MAP_S)) +#define DPORT_APP_I2S0_INT_MAP_V 0x1F +#define DPORT_APP_I2S0_INT_MAP_S 0 + +#define DPORT_APP_I2S1_INT_MAP_REG (DR_REG_DPORT_BASE + 0x29C) +/* DPORT_APP_I2S1_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_I2S1_INT_MAP 0x0000001F +#define DPORT_APP_I2S1_INT_MAP_M ((DPORT_APP_I2S1_INT_MAP_V)<<(DPORT_APP_I2S1_INT_MAP_S)) +#define DPORT_APP_I2S1_INT_MAP_V 0x1F +#define DPORT_APP_I2S1_INT_MAP_S 0 + +#define DPORT_APP_UART_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x2A0) +/* DPORT_APP_UART_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_UART_INTR_MAP 0x0000001F +#define DPORT_APP_UART_INTR_MAP_M ((DPORT_APP_UART_INTR_MAP_V)<<(DPORT_APP_UART_INTR_MAP_S)) +#define DPORT_APP_UART_INTR_MAP_V 0x1F +#define DPORT_APP_UART_INTR_MAP_S 0 + +#define DPORT_APP_UART1_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x2A4) +/* DPORT_APP_UART1_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_UART1_INTR_MAP 0x0000001F +#define DPORT_APP_UART1_INTR_MAP_M ((DPORT_APP_UART1_INTR_MAP_V)<<(DPORT_APP_UART1_INTR_MAP_S)) +#define DPORT_APP_UART1_INTR_MAP_V 0x1F +#define DPORT_APP_UART1_INTR_MAP_S 0 + +#define DPORT_APP_UART2_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x2A8) +/* DPORT_APP_UART2_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_UART2_INTR_MAP 0x0000001F +#define DPORT_APP_UART2_INTR_MAP_M ((DPORT_APP_UART2_INTR_MAP_V)<<(DPORT_APP_UART2_INTR_MAP_S)) +#define DPORT_APP_UART2_INTR_MAP_V 0x1F +#define DPORT_APP_UART2_INTR_MAP_S 0 + +#define DPORT_APP_SDIO_HOST_INTERRUPT_MAP_REG (DR_REG_DPORT_BASE + 0x2AC) +/* DPORT_APP_SDIO_HOST_INTERRUPT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_SDIO_HOST_INTERRUPT_MAP 0x0000001F +#define DPORT_APP_SDIO_HOST_INTERRUPT_MAP_M ((DPORT_APP_SDIO_HOST_INTERRUPT_MAP_V)<<(DPORT_APP_SDIO_HOST_INTERRUPT_MAP_S)) +#define DPORT_APP_SDIO_HOST_INTERRUPT_MAP_V 0x1F +#define DPORT_APP_SDIO_HOST_INTERRUPT_MAP_S 0 + +#define DPORT_APP_EMAC_INT_MAP_REG (DR_REG_DPORT_BASE + 0x2B0) +/* DPORT_APP_EMAC_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_EMAC_INT_MAP 0x0000001F +#define DPORT_APP_EMAC_INT_MAP_M ((DPORT_APP_EMAC_INT_MAP_V)<<(DPORT_APP_EMAC_INT_MAP_S)) +#define DPORT_APP_EMAC_INT_MAP_V 0x1F +#define DPORT_APP_EMAC_INT_MAP_S 0 + +#define DPORT_APP_PWM0_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x2B4) +/* DPORT_APP_PWM0_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_PWM0_INTR_MAP 0x0000001F +#define DPORT_APP_PWM0_INTR_MAP_M ((DPORT_APP_PWM0_INTR_MAP_V)<<(DPORT_APP_PWM0_INTR_MAP_S)) +#define DPORT_APP_PWM0_INTR_MAP_V 0x1F +#define DPORT_APP_PWM0_INTR_MAP_S 0 + +#define DPORT_APP_PWM1_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x2B8) +/* DPORT_APP_PWM1_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_PWM1_INTR_MAP 0x0000001F +#define DPORT_APP_PWM1_INTR_MAP_M ((DPORT_APP_PWM1_INTR_MAP_V)<<(DPORT_APP_PWM1_INTR_MAP_S)) +#define DPORT_APP_PWM1_INTR_MAP_V 0x1F +#define DPORT_APP_PWM1_INTR_MAP_S 0 + +#define DPORT_APP_PWM2_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x2BC) +/* DPORT_APP_PWM2_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_PWM2_INTR_MAP 0x0000001F +#define DPORT_APP_PWM2_INTR_MAP_M ((DPORT_APP_PWM2_INTR_MAP_V)<<(DPORT_APP_PWM2_INTR_MAP_S)) +#define DPORT_APP_PWM2_INTR_MAP_V 0x1F +#define DPORT_APP_PWM2_INTR_MAP_S 0 + +#define DPORT_APP_PWM3_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x2C0) +/* DPORT_APP_PWM3_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_PWM3_INTR_MAP 0x0000001F +#define DPORT_APP_PWM3_INTR_MAP_M ((DPORT_APP_PWM3_INTR_MAP_V)<<(DPORT_APP_PWM3_INTR_MAP_S)) +#define DPORT_APP_PWM3_INTR_MAP_V 0x1F +#define DPORT_APP_PWM3_INTR_MAP_S 0 + +#define DPORT_APP_LEDC_INT_MAP_REG (DR_REG_DPORT_BASE + 0x2C4) +/* DPORT_APP_LEDC_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_LEDC_INT_MAP 0x0000001F +#define DPORT_APP_LEDC_INT_MAP_M ((DPORT_APP_LEDC_INT_MAP_V)<<(DPORT_APP_LEDC_INT_MAP_S)) +#define DPORT_APP_LEDC_INT_MAP_V 0x1F +#define DPORT_APP_LEDC_INT_MAP_S 0 + +#define DPORT_APP_EFUSE_INT_MAP_REG (DR_REG_DPORT_BASE + 0x2C8) +/* DPORT_APP_EFUSE_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_EFUSE_INT_MAP 0x0000001F +#define DPORT_APP_EFUSE_INT_MAP_M ((DPORT_APP_EFUSE_INT_MAP_V)<<(DPORT_APP_EFUSE_INT_MAP_S)) +#define DPORT_APP_EFUSE_INT_MAP_V 0x1F +#define DPORT_APP_EFUSE_INT_MAP_S 0 + +#define DPORT_APP_CAN_INT_MAP_REG (DR_REG_DPORT_BASE + 0x2CC) +/* DPORT_APP_CAN_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_CAN_INT_MAP 0x0000001F +#define DPORT_APP_CAN_INT_MAP_M ((DPORT_APP_CAN_INT_MAP_V)<<(DPORT_APP_CAN_INT_MAP_S)) +#define DPORT_APP_CAN_INT_MAP_V 0x1F +#define DPORT_APP_CAN_INT_MAP_S 0 + +#define DPORT_APP_RTC_CORE_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x2D0) +/* DPORT_APP_RTC_CORE_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_RTC_CORE_INTR_MAP 0x0000001F +#define DPORT_APP_RTC_CORE_INTR_MAP_M ((DPORT_APP_RTC_CORE_INTR_MAP_V)<<(DPORT_APP_RTC_CORE_INTR_MAP_S)) +#define DPORT_APP_RTC_CORE_INTR_MAP_V 0x1F +#define DPORT_APP_RTC_CORE_INTR_MAP_S 0 + +#define DPORT_APP_RMT_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x2D4) +/* DPORT_APP_RMT_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_RMT_INTR_MAP 0x0000001F +#define DPORT_APP_RMT_INTR_MAP_M ((DPORT_APP_RMT_INTR_MAP_V)<<(DPORT_APP_RMT_INTR_MAP_S)) +#define DPORT_APP_RMT_INTR_MAP_V 0x1F +#define DPORT_APP_RMT_INTR_MAP_S 0 + +#define DPORT_APP_PCNT_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x2D8) +/* DPORT_APP_PCNT_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_PCNT_INTR_MAP 0x0000001F +#define DPORT_APP_PCNT_INTR_MAP_M ((DPORT_APP_PCNT_INTR_MAP_V)<<(DPORT_APP_PCNT_INTR_MAP_S)) +#define DPORT_APP_PCNT_INTR_MAP_V 0x1F +#define DPORT_APP_PCNT_INTR_MAP_S 0 + +#define DPORT_APP_I2C_EXT0_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x2DC) +/* DPORT_APP_I2C_EXT0_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_I2C_EXT0_INTR_MAP 0x0000001F +#define DPORT_APP_I2C_EXT0_INTR_MAP_M ((DPORT_APP_I2C_EXT0_INTR_MAP_V)<<(DPORT_APP_I2C_EXT0_INTR_MAP_S)) +#define DPORT_APP_I2C_EXT0_INTR_MAP_V 0x1F +#define DPORT_APP_I2C_EXT0_INTR_MAP_S 0 + +#define DPORT_APP_I2C_EXT1_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x2E0) +/* DPORT_APP_I2C_EXT1_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_I2C_EXT1_INTR_MAP 0x0000001F +#define DPORT_APP_I2C_EXT1_INTR_MAP_M ((DPORT_APP_I2C_EXT1_INTR_MAP_V)<<(DPORT_APP_I2C_EXT1_INTR_MAP_S)) +#define DPORT_APP_I2C_EXT1_INTR_MAP_V 0x1F +#define DPORT_APP_I2C_EXT1_INTR_MAP_S 0 + +#define DPORT_APP_RSA_INTR_MAP_REG (DR_REG_DPORT_BASE + 0x2E4) +/* DPORT_APP_RSA_INTR_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_RSA_INTR_MAP 0x0000001F +#define DPORT_APP_RSA_INTR_MAP_M ((DPORT_APP_RSA_INTR_MAP_V)<<(DPORT_APP_RSA_INTR_MAP_S)) +#define DPORT_APP_RSA_INTR_MAP_V 0x1F +#define DPORT_APP_RSA_INTR_MAP_S 0 + +#define DPORT_APP_SPI1_DMA_INT_MAP_REG (DR_REG_DPORT_BASE + 0x2E8) +/* DPORT_APP_SPI1_DMA_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_SPI1_DMA_INT_MAP 0x0000001F +#define DPORT_APP_SPI1_DMA_INT_MAP_M ((DPORT_APP_SPI1_DMA_INT_MAP_V)<<(DPORT_APP_SPI1_DMA_INT_MAP_S)) +#define DPORT_APP_SPI1_DMA_INT_MAP_V 0x1F +#define DPORT_APP_SPI1_DMA_INT_MAP_S 0 + +#define DPORT_APP_SPI2_DMA_INT_MAP_REG (DR_REG_DPORT_BASE + 0x2EC) +/* DPORT_APP_SPI2_DMA_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_SPI2_DMA_INT_MAP 0x0000001F +#define DPORT_APP_SPI2_DMA_INT_MAP_M ((DPORT_APP_SPI2_DMA_INT_MAP_V)<<(DPORT_APP_SPI2_DMA_INT_MAP_S)) +#define DPORT_APP_SPI2_DMA_INT_MAP_V 0x1F +#define DPORT_APP_SPI2_DMA_INT_MAP_S 0 + +#define DPORT_APP_SPI3_DMA_INT_MAP_REG (DR_REG_DPORT_BASE + 0x2F0) +/* DPORT_APP_SPI3_DMA_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_SPI3_DMA_INT_MAP 0x0000001F +#define DPORT_APP_SPI3_DMA_INT_MAP_M ((DPORT_APP_SPI3_DMA_INT_MAP_V)<<(DPORT_APP_SPI3_DMA_INT_MAP_S)) +#define DPORT_APP_SPI3_DMA_INT_MAP_V 0x1F +#define DPORT_APP_SPI3_DMA_INT_MAP_S 0 + +#define DPORT_APP_WDG_INT_MAP_REG (DR_REG_DPORT_BASE + 0x2F4) +/* DPORT_APP_WDG_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_WDG_INT_MAP 0x0000001F +#define DPORT_APP_WDG_INT_MAP_M ((DPORT_APP_WDG_INT_MAP_V)<<(DPORT_APP_WDG_INT_MAP_S)) +#define DPORT_APP_WDG_INT_MAP_V 0x1F +#define DPORT_APP_WDG_INT_MAP_S 0 + +#define DPORT_APP_TIMER_INT1_MAP_REG (DR_REG_DPORT_BASE + 0x2F8) +/* DPORT_APP_TIMER_INT1_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_TIMER_INT1_MAP 0x0000001F +#define DPORT_APP_TIMER_INT1_MAP_M ((DPORT_APP_TIMER_INT1_MAP_V)<<(DPORT_APP_TIMER_INT1_MAP_S)) +#define DPORT_APP_TIMER_INT1_MAP_V 0x1F +#define DPORT_APP_TIMER_INT1_MAP_S 0 + +#define DPORT_APP_TIMER_INT2_MAP_REG (DR_REG_DPORT_BASE + 0x2FC) +/* DPORT_APP_TIMER_INT2_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_TIMER_INT2_MAP 0x0000001F +#define DPORT_APP_TIMER_INT2_MAP_M ((DPORT_APP_TIMER_INT2_MAP_V)<<(DPORT_APP_TIMER_INT2_MAP_S)) +#define DPORT_APP_TIMER_INT2_MAP_V 0x1F +#define DPORT_APP_TIMER_INT2_MAP_S 0 + +#define DPORT_APP_TG_T0_EDGE_INT_MAP_REG (DR_REG_DPORT_BASE + 0x300) +/* DPORT_APP_TG_T0_EDGE_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_TG_T0_EDGE_INT_MAP 0x0000001F +#define DPORT_APP_TG_T0_EDGE_INT_MAP_M ((DPORT_APP_TG_T0_EDGE_INT_MAP_V)<<(DPORT_APP_TG_T0_EDGE_INT_MAP_S)) +#define DPORT_APP_TG_T0_EDGE_INT_MAP_V 0x1F +#define DPORT_APP_TG_T0_EDGE_INT_MAP_S 0 + +#define DPORT_APP_TG_T1_EDGE_INT_MAP_REG (DR_REG_DPORT_BASE + 0x304) +/* DPORT_APP_TG_T1_EDGE_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_TG_T1_EDGE_INT_MAP 0x0000001F +#define DPORT_APP_TG_T1_EDGE_INT_MAP_M ((DPORT_APP_TG_T1_EDGE_INT_MAP_V)<<(DPORT_APP_TG_T1_EDGE_INT_MAP_S)) +#define DPORT_APP_TG_T1_EDGE_INT_MAP_V 0x1F +#define DPORT_APP_TG_T1_EDGE_INT_MAP_S 0 + +#define DPORT_APP_TG_WDT_EDGE_INT_MAP_REG (DR_REG_DPORT_BASE + 0x308) +/* DPORT_APP_TG_WDT_EDGE_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_TG_WDT_EDGE_INT_MAP 0x0000001F +#define DPORT_APP_TG_WDT_EDGE_INT_MAP_M ((DPORT_APP_TG_WDT_EDGE_INT_MAP_V)<<(DPORT_APP_TG_WDT_EDGE_INT_MAP_S)) +#define DPORT_APP_TG_WDT_EDGE_INT_MAP_V 0x1F +#define DPORT_APP_TG_WDT_EDGE_INT_MAP_S 0 + +#define DPORT_APP_TG_LACT_EDGE_INT_MAP_REG (DR_REG_DPORT_BASE + 0x30C) +/* DPORT_APP_TG_LACT_EDGE_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_TG_LACT_EDGE_INT_MAP 0x0000001F +#define DPORT_APP_TG_LACT_EDGE_INT_MAP_M ((DPORT_APP_TG_LACT_EDGE_INT_MAP_V)<<(DPORT_APP_TG_LACT_EDGE_INT_MAP_S)) +#define DPORT_APP_TG_LACT_EDGE_INT_MAP_V 0x1F +#define DPORT_APP_TG_LACT_EDGE_INT_MAP_S 0 + +#define DPORT_APP_TG1_T0_EDGE_INT_MAP_REG (DR_REG_DPORT_BASE + 0x310) +/* DPORT_APP_TG1_T0_EDGE_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_TG1_T0_EDGE_INT_MAP 0x0000001F +#define DPORT_APP_TG1_T0_EDGE_INT_MAP_M ((DPORT_APP_TG1_T0_EDGE_INT_MAP_V)<<(DPORT_APP_TG1_T0_EDGE_INT_MAP_S)) +#define DPORT_APP_TG1_T0_EDGE_INT_MAP_V 0x1F +#define DPORT_APP_TG1_T0_EDGE_INT_MAP_S 0 + +#define DPORT_APP_TG1_T1_EDGE_INT_MAP_REG (DR_REG_DPORT_BASE + 0x314) +/* DPORT_APP_TG1_T1_EDGE_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_TG1_T1_EDGE_INT_MAP 0x0000001F +#define DPORT_APP_TG1_T1_EDGE_INT_MAP_M ((DPORT_APP_TG1_T1_EDGE_INT_MAP_V)<<(DPORT_APP_TG1_T1_EDGE_INT_MAP_S)) +#define DPORT_APP_TG1_T1_EDGE_INT_MAP_V 0x1F +#define DPORT_APP_TG1_T1_EDGE_INT_MAP_S 0 + +#define DPORT_APP_TG1_WDT_EDGE_INT_MAP_REG (DR_REG_DPORT_BASE + 0x318) +/* DPORT_APP_TG1_WDT_EDGE_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_TG1_WDT_EDGE_INT_MAP 0x0000001F +#define DPORT_APP_TG1_WDT_EDGE_INT_MAP_M ((DPORT_APP_TG1_WDT_EDGE_INT_MAP_V)<<(DPORT_APP_TG1_WDT_EDGE_INT_MAP_S)) +#define DPORT_APP_TG1_WDT_EDGE_INT_MAP_V 0x1F +#define DPORT_APP_TG1_WDT_EDGE_INT_MAP_S 0 + +#define DPORT_APP_TG1_LACT_EDGE_INT_MAP_REG (DR_REG_DPORT_BASE + 0x31C) +/* DPORT_APP_TG1_LACT_EDGE_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_TG1_LACT_EDGE_INT_MAP 0x0000001F +#define DPORT_APP_TG1_LACT_EDGE_INT_MAP_M ((DPORT_APP_TG1_LACT_EDGE_INT_MAP_V)<<(DPORT_APP_TG1_LACT_EDGE_INT_MAP_S)) +#define DPORT_APP_TG1_LACT_EDGE_INT_MAP_V 0x1F +#define DPORT_APP_TG1_LACT_EDGE_INT_MAP_S 0 + +#define DPORT_APP_MMU_IA_INT_MAP_REG (DR_REG_DPORT_BASE + 0x320) +/* DPORT_APP_MMU_IA_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_MMU_IA_INT_MAP 0x0000001F +#define DPORT_APP_MMU_IA_INT_MAP_M ((DPORT_APP_MMU_IA_INT_MAP_V)<<(DPORT_APP_MMU_IA_INT_MAP_S)) +#define DPORT_APP_MMU_IA_INT_MAP_V 0x1F +#define DPORT_APP_MMU_IA_INT_MAP_S 0 + +#define DPORT_APP_MPU_IA_INT_MAP_REG (DR_REG_DPORT_BASE + 0x324) +/* DPORT_APP_MPU_IA_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_MPU_IA_INT_MAP 0x0000001F +#define DPORT_APP_MPU_IA_INT_MAP_M ((DPORT_APP_MPU_IA_INT_MAP_V)<<(DPORT_APP_MPU_IA_INT_MAP_S)) +#define DPORT_APP_MPU_IA_INT_MAP_V 0x1F +#define DPORT_APP_MPU_IA_INT_MAP_S 0 + +#define DPORT_APP_CACHE_IA_INT_MAP_REG (DR_REG_DPORT_BASE + 0x328) +/* DPORT_APP_CACHE_IA_INT_MAP : R/W ;bitpos:[4:0] ;default: 5'd16 ; */ +/*description: */ +#define DPORT_APP_CACHE_IA_INT_MAP 0x0000001F +#define DPORT_APP_CACHE_IA_INT_MAP_M ((DPORT_APP_CACHE_IA_INT_MAP_V)<<(DPORT_APP_CACHE_IA_INT_MAP_S)) +#define DPORT_APP_CACHE_IA_INT_MAP_V 0x1F +#define DPORT_APP_CACHE_IA_INT_MAP_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_UART_REG (DR_REG_DPORT_BASE + 0x32C) +/* DPORT_UART_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_UART_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_UART_ACCESS_GRANT_CONFIG_M ((DPORT_UART_ACCESS_GRANT_CONFIG_V)<<(DPORT_UART_ACCESS_GRANT_CONFIG_S)) +#define DPORT_UART_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_UART_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_SPI1_REG (DR_REG_DPORT_BASE + 0x330) +/* DPORT_SPI1_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_SPI1_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_SPI1_ACCESS_GRANT_CONFIG_M ((DPORT_SPI1_ACCESS_GRANT_CONFIG_V)<<(DPORT_SPI1_ACCESS_GRANT_CONFIG_S)) +#define DPORT_SPI1_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_SPI1_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_SPI0_REG (DR_REG_DPORT_BASE + 0x334) +/* DPORT_SPI0_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_SPI0_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_SPI0_ACCESS_GRANT_CONFIG_M ((DPORT_SPI0_ACCESS_GRANT_CONFIG_V)<<(DPORT_SPI0_ACCESS_GRANT_CONFIG_S)) +#define DPORT_SPI0_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_SPI0_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_GPIO_REG (DR_REG_DPORT_BASE + 0x338) +/* DPORT_GPIO_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_GPIO_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_GPIO_ACCESS_GRANT_CONFIG_M ((DPORT_GPIO_ACCESS_GRANT_CONFIG_V)<<(DPORT_GPIO_ACCESS_GRANT_CONFIG_S)) +#define DPORT_GPIO_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_GPIO_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_FE2_REG (DR_REG_DPORT_BASE + 0x33C) +/* DPORT_FE2_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_FE2_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_FE2_ACCESS_GRANT_CONFIG_M ((DPORT_FE2_ACCESS_GRANT_CONFIG_V)<<(DPORT_FE2_ACCESS_GRANT_CONFIG_S)) +#define DPORT_FE2_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_FE2_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_FE_REG (DR_REG_DPORT_BASE + 0x340) +/* DPORT_FE_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_FE_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_FE_ACCESS_GRANT_CONFIG_M ((DPORT_FE_ACCESS_GRANT_CONFIG_V)<<(DPORT_FE_ACCESS_GRANT_CONFIG_S)) +#define DPORT_FE_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_FE_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_TIMER_REG (DR_REG_DPORT_BASE + 0x344) +/* DPORT_TIMER_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_TIMER_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_TIMER_ACCESS_GRANT_CONFIG_M ((DPORT_TIMER_ACCESS_GRANT_CONFIG_V)<<(DPORT_TIMER_ACCESS_GRANT_CONFIG_S)) +#define DPORT_TIMER_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_TIMER_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_RTC_REG (DR_REG_DPORT_BASE + 0x348) +/* DPORT_RTC_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_RTC_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_RTC_ACCESS_GRANT_CONFIG_M ((DPORT_RTC_ACCESS_GRANT_CONFIG_V)<<(DPORT_RTC_ACCESS_GRANT_CONFIG_S)) +#define DPORT_RTC_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_RTC_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_IO_MUX_REG (DR_REG_DPORT_BASE + 0x34C) +/* DPORT_IOMUX_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_IOMUX_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_IOMUX_ACCESS_GRANT_CONFIG_M ((DPORT_IOMUX_ACCESS_GRANT_CONFIG_V)<<(DPORT_IOMUX_ACCESS_GRANT_CONFIG_S)) +#define DPORT_IOMUX_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_IOMUX_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_WDG_REG (DR_REG_DPORT_BASE + 0x350) +/* DPORT_WDG_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_WDG_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_WDG_ACCESS_GRANT_CONFIG_M ((DPORT_WDG_ACCESS_GRANT_CONFIG_V)<<(DPORT_WDG_ACCESS_GRANT_CONFIG_S)) +#define DPORT_WDG_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_WDG_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_HINF_REG (DR_REG_DPORT_BASE + 0x354) +/* DPORT_HINF_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_HINF_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_HINF_ACCESS_GRANT_CONFIG_M ((DPORT_HINF_ACCESS_GRANT_CONFIG_V)<<(DPORT_HINF_ACCESS_GRANT_CONFIG_S)) +#define DPORT_HINF_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_HINF_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_UHCI1_REG (DR_REG_DPORT_BASE + 0x358) +/* DPORT_UHCI1_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_UHCI1_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_UHCI1_ACCESS_GRANT_CONFIG_M ((DPORT_UHCI1_ACCESS_GRANT_CONFIG_V)<<(DPORT_UHCI1_ACCESS_GRANT_CONFIG_S)) +#define DPORT_UHCI1_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_UHCI1_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_MISC_REG (DR_REG_DPORT_BASE + 0x35C) +/* DPORT_MISC_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_MISC_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_MISC_ACCESS_GRANT_CONFIG_M ((DPORT_MISC_ACCESS_GRANT_CONFIG_V)<<(DPORT_MISC_ACCESS_GRANT_CONFIG_S)) +#define DPORT_MISC_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_MISC_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_I2C_REG (DR_REG_DPORT_BASE + 0x360) +/* DPORT_I2C_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_I2C_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_I2C_ACCESS_GRANT_CONFIG_M ((DPORT_I2C_ACCESS_GRANT_CONFIG_V)<<(DPORT_I2C_ACCESS_GRANT_CONFIG_S)) +#define DPORT_I2C_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_I2C_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_I2S0_REG (DR_REG_DPORT_BASE + 0x364) +/* DPORT_I2S0_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_I2S0_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_I2S0_ACCESS_GRANT_CONFIG_M ((DPORT_I2S0_ACCESS_GRANT_CONFIG_V)<<(DPORT_I2S0_ACCESS_GRANT_CONFIG_S)) +#define DPORT_I2S0_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_I2S0_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_UART1_REG (DR_REG_DPORT_BASE + 0x368) +/* DPORT_UART1_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_UART1_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_UART1_ACCESS_GRANT_CONFIG_M ((DPORT_UART1_ACCESS_GRANT_CONFIG_V)<<(DPORT_UART1_ACCESS_GRANT_CONFIG_S)) +#define DPORT_UART1_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_UART1_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_BT_REG (DR_REG_DPORT_BASE + 0x36C) +/* DPORT_BT_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_BT_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_BT_ACCESS_GRANT_CONFIG_M ((DPORT_BT_ACCESS_GRANT_CONFIG_V)<<(DPORT_BT_ACCESS_GRANT_CONFIG_S)) +#define DPORT_BT_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_BT_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_BT_BUFFER_REG (DR_REG_DPORT_BASE + 0x370) +/* DPORT_BTBUFFER_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_BTBUFFER_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_BTBUFFER_ACCESS_GRANT_CONFIG_M ((DPORT_BTBUFFER_ACCESS_GRANT_CONFIG_V)<<(DPORT_BTBUFFER_ACCESS_GRANT_CONFIG_S)) +#define DPORT_BTBUFFER_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_BTBUFFER_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_I2C_EXT0_REG (DR_REG_DPORT_BASE + 0x374) +/* DPORT_I2CEXT0_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_I2CEXT0_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_I2CEXT0_ACCESS_GRANT_CONFIG_M ((DPORT_I2CEXT0_ACCESS_GRANT_CONFIG_V)<<(DPORT_I2CEXT0_ACCESS_GRANT_CONFIG_S)) +#define DPORT_I2CEXT0_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_I2CEXT0_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_UHCI0_REG (DR_REG_DPORT_BASE + 0x378) +/* DPORT_UHCI0_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_UHCI0_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_UHCI0_ACCESS_GRANT_CONFIG_M ((DPORT_UHCI0_ACCESS_GRANT_CONFIG_V)<<(DPORT_UHCI0_ACCESS_GRANT_CONFIG_S)) +#define DPORT_UHCI0_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_UHCI0_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_SLCHOST_REG (DR_REG_DPORT_BASE + 0x37C) +/* DPORT_SLCHOST_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_SLCHOST_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_SLCHOST_ACCESS_GRANT_CONFIG_M ((DPORT_SLCHOST_ACCESS_GRANT_CONFIG_V)<<(DPORT_SLCHOST_ACCESS_GRANT_CONFIG_S)) +#define DPORT_SLCHOST_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_SLCHOST_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_RMT_REG (DR_REG_DPORT_BASE + 0x380) +/* DPORT_RMT_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_RMT_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_RMT_ACCESS_GRANT_CONFIG_M ((DPORT_RMT_ACCESS_GRANT_CONFIG_V)<<(DPORT_RMT_ACCESS_GRANT_CONFIG_S)) +#define DPORT_RMT_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_RMT_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_PCNT_REG (DR_REG_DPORT_BASE + 0x384) +/* DPORT_PCNT_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_PCNT_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_PCNT_ACCESS_GRANT_CONFIG_M ((DPORT_PCNT_ACCESS_GRANT_CONFIG_V)<<(DPORT_PCNT_ACCESS_GRANT_CONFIG_S)) +#define DPORT_PCNT_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_PCNT_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_SLC_REG (DR_REG_DPORT_BASE + 0x388) +/* DPORT_SLC_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_SLC_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_SLC_ACCESS_GRANT_CONFIG_M ((DPORT_SLC_ACCESS_GRANT_CONFIG_V)<<(DPORT_SLC_ACCESS_GRANT_CONFIG_S)) +#define DPORT_SLC_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_SLC_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_LEDC_REG (DR_REG_DPORT_BASE + 0x38C) +/* DPORT_LEDC_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_LEDC_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_LEDC_ACCESS_GRANT_CONFIG_M ((DPORT_LEDC_ACCESS_GRANT_CONFIG_V)<<(DPORT_LEDC_ACCESS_GRANT_CONFIG_S)) +#define DPORT_LEDC_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_LEDC_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_EFUSE_REG (DR_REG_DPORT_BASE + 0x390) +/* DPORT_EFUSE_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_EFUSE_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_EFUSE_ACCESS_GRANT_CONFIG_M ((DPORT_EFUSE_ACCESS_GRANT_CONFIG_V)<<(DPORT_EFUSE_ACCESS_GRANT_CONFIG_S)) +#define DPORT_EFUSE_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_EFUSE_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_SPI_ENCRYPT_REG (DR_REG_DPORT_BASE + 0x394) +/* DPORT_SPI_ENCRYPY_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_SPI_ENCRYPY_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_SPI_ENCRYPY_ACCESS_GRANT_CONFIG_M ((DPORT_SPI_ENCRYPY_ACCESS_GRANT_CONFIG_V)<<(DPORT_SPI_ENCRYPY_ACCESS_GRANT_CONFIG_S)) +#define DPORT_SPI_ENCRYPY_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_SPI_ENCRYPY_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_BB_REG (DR_REG_DPORT_BASE + 0x398) +/* DPORT_BB_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_BB_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_BB_ACCESS_GRANT_CONFIG_M ((DPORT_BB_ACCESS_GRANT_CONFIG_V)<<(DPORT_BB_ACCESS_GRANT_CONFIG_S)) +#define DPORT_BB_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_BB_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_PWM0_REG (DR_REG_DPORT_BASE + 0x39C) +/* DPORT_PWM0_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_PWM0_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_PWM0_ACCESS_GRANT_CONFIG_M ((DPORT_PWM0_ACCESS_GRANT_CONFIG_V)<<(DPORT_PWM0_ACCESS_GRANT_CONFIG_S)) +#define DPORT_PWM0_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_PWM0_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_TIMERGROUP_REG (DR_REG_DPORT_BASE + 0x3A0) +/* DPORT_TIMERGROUP_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_TIMERGROUP_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_TIMERGROUP_ACCESS_GRANT_CONFIG_M ((DPORT_TIMERGROUP_ACCESS_GRANT_CONFIG_V)<<(DPORT_TIMERGROUP_ACCESS_GRANT_CONFIG_S)) +#define DPORT_TIMERGROUP_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_TIMERGROUP_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_TIMERGROUP1_REG (DR_REG_DPORT_BASE + 0x3A4) +/* DPORT_TIMERGROUP1_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_TIMERGROUP1_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_TIMERGROUP1_ACCESS_GRANT_CONFIG_M ((DPORT_TIMERGROUP1_ACCESS_GRANT_CONFIG_V)<<(DPORT_TIMERGROUP1_ACCESS_GRANT_CONFIG_S)) +#define DPORT_TIMERGROUP1_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_TIMERGROUP1_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_SPI2_REG (DR_REG_DPORT_BASE + 0x3A8) +/* DPORT_SPI2_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_SPI2_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_SPI2_ACCESS_GRANT_CONFIG_M ((DPORT_SPI2_ACCESS_GRANT_CONFIG_V)<<(DPORT_SPI2_ACCESS_GRANT_CONFIG_S)) +#define DPORT_SPI2_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_SPI2_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_SPI3_REG (DR_REG_DPORT_BASE + 0x3AC) +/* DPORT_SPI3_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_SPI3_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_SPI3_ACCESS_GRANT_CONFIG_M ((DPORT_SPI3_ACCESS_GRANT_CONFIG_V)<<(DPORT_SPI3_ACCESS_GRANT_CONFIG_S)) +#define DPORT_SPI3_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_SPI3_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_APB_CTRL_REG (DR_REG_DPORT_BASE + 0x3B0) +/* DPORT_APBCTRL_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_APBCTRL_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_APBCTRL_ACCESS_GRANT_CONFIG_M ((DPORT_APBCTRL_ACCESS_GRANT_CONFIG_V)<<(DPORT_APBCTRL_ACCESS_GRANT_CONFIG_S)) +#define DPORT_APBCTRL_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_APBCTRL_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_I2C_EXT1_REG (DR_REG_DPORT_BASE + 0x3B4) +/* DPORT_I2CEXT1_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_I2CEXT1_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_I2CEXT1_ACCESS_GRANT_CONFIG_M ((DPORT_I2CEXT1_ACCESS_GRANT_CONFIG_V)<<(DPORT_I2CEXT1_ACCESS_GRANT_CONFIG_S)) +#define DPORT_I2CEXT1_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_I2CEXT1_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_SDIO_HOST_REG (DR_REG_DPORT_BASE + 0x3B8) +/* DPORT_SDIOHOST_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_SDIOHOST_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_SDIOHOST_ACCESS_GRANT_CONFIG_M ((DPORT_SDIOHOST_ACCESS_GRANT_CONFIG_V)<<(DPORT_SDIOHOST_ACCESS_GRANT_CONFIG_S)) +#define DPORT_SDIOHOST_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_SDIOHOST_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_EMAC_REG (DR_REG_DPORT_BASE + 0x3BC) +/* DPORT_EMAC_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_EMAC_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_EMAC_ACCESS_GRANT_CONFIG_M ((DPORT_EMAC_ACCESS_GRANT_CONFIG_V)<<(DPORT_EMAC_ACCESS_GRANT_CONFIG_S)) +#define DPORT_EMAC_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_EMAC_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_CAN_REG (DR_REG_DPORT_BASE + 0x3C0) +/* DPORT_CAN_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_CAN_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_CAN_ACCESS_GRANT_CONFIG_M ((DPORT_CAN_ACCESS_GRANT_CONFIG_V)<<(DPORT_CAN_ACCESS_GRANT_CONFIG_S)) +#define DPORT_CAN_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_CAN_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_PWM1_REG (DR_REG_DPORT_BASE + 0x3C4) +/* DPORT_PWM1_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_PWM1_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_PWM1_ACCESS_GRANT_CONFIG_M ((DPORT_PWM1_ACCESS_GRANT_CONFIG_V)<<(DPORT_PWM1_ACCESS_GRANT_CONFIG_S)) +#define DPORT_PWM1_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_PWM1_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_I2S1_REG (DR_REG_DPORT_BASE + 0x3C8) +/* DPORT_I2S1_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_I2S1_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_I2S1_ACCESS_GRANT_CONFIG_M ((DPORT_I2S1_ACCESS_GRANT_CONFIG_V)<<(DPORT_I2S1_ACCESS_GRANT_CONFIG_S)) +#define DPORT_I2S1_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_I2S1_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_UART2_REG (DR_REG_DPORT_BASE + 0x3CC) +/* DPORT_UART2_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_UART2_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_UART2_ACCESS_GRANT_CONFIG_M ((DPORT_UART2_ACCESS_GRANT_CONFIG_V)<<(DPORT_UART2_ACCESS_GRANT_CONFIG_S)) +#define DPORT_UART2_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_UART2_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_PWM2_REG (DR_REG_DPORT_BASE + 0x3D0) +/* DPORT_PWM2_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_PWM2_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_PWM2_ACCESS_GRANT_CONFIG_M ((DPORT_PWM2_ACCESS_GRANT_CONFIG_V)<<(DPORT_PWM2_ACCESS_GRANT_CONFIG_S)) +#define DPORT_PWM2_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_PWM2_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_PWM3_REG (DR_REG_DPORT_BASE + 0x3D4) +/* DPORT_PWM3_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_PWM3_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_PWM3_ACCESS_GRANT_CONFIG_M ((DPORT_PWM3_ACCESS_GRANT_CONFIG_V)<<(DPORT_PWM3_ACCESS_GRANT_CONFIG_S)) +#define DPORT_PWM3_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_PWM3_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_RWBT_REG (DR_REG_DPORT_BASE + 0x3D8) +/* DPORT_RWBT_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_RWBT_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_RWBT_ACCESS_GRANT_CONFIG_M ((DPORT_RWBT_ACCESS_GRANT_CONFIG_V)<<(DPORT_RWBT_ACCESS_GRANT_CONFIG_S)) +#define DPORT_RWBT_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_RWBT_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_BTMAC_REG (DR_REG_DPORT_BASE + 0x3DC) +/* DPORT_BTMAC_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_BTMAC_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_BTMAC_ACCESS_GRANT_CONFIG_M ((DPORT_BTMAC_ACCESS_GRANT_CONFIG_V)<<(DPORT_BTMAC_ACCESS_GRANT_CONFIG_S)) +#define DPORT_BTMAC_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_BTMAC_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_WIFIMAC_REG (DR_REG_DPORT_BASE + 0x3E0) +/* DPORT_WIFIMAC_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_WIFIMAC_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_WIFIMAC_ACCESS_GRANT_CONFIG_M ((DPORT_WIFIMAC_ACCESS_GRANT_CONFIG_V)<<(DPORT_WIFIMAC_ACCESS_GRANT_CONFIG_S)) +#define DPORT_WIFIMAC_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_WIFIMAC_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_AHBLITE_MPU_TABLE_PWR_REG (DR_REG_DPORT_BASE + 0x3E4) +/* DPORT_PWR_ACCESS_GRANT_CONFIG : R/W ;bitpos:[5:0] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_PWR_ACCESS_GRANT_CONFIG 0x0000003F +#define DPORT_PWR_ACCESS_GRANT_CONFIG_M ((DPORT_PWR_ACCESS_GRANT_CONFIG_V)<<(DPORT_PWR_ACCESS_GRANT_CONFIG_S)) +#define DPORT_PWR_ACCESS_GRANT_CONFIG_V 0x3F +#define DPORT_PWR_ACCESS_GRANT_CONFIG_S 0 + +#define DPORT_MEM_ACCESS_DBUG0_REG (DR_REG_DPORT_BASE + 0x3E8) +/* DPORT_INTERNAL_SRAM_MMU_MULTI_HIT : RO ;bitpos:[29:26] ;default: 4'b0 ; */ +/*description: */ +#define DPORT_INTERNAL_SRAM_MMU_MULTI_HIT 0x0000000F +#define DPORT_INTERNAL_SRAM_MMU_MULTI_HIT_M ((DPORT_INTERNAL_SRAM_MMU_MULTI_HIT_V)<<(DPORT_INTERNAL_SRAM_MMU_MULTI_HIT_S)) +#define DPORT_INTERNAL_SRAM_MMU_MULTI_HIT_V 0xF +#define DPORT_INTERNAL_SRAM_MMU_MULTI_HIT_S 26 +/* DPORT_INTERNAL_SRAM_IA : RO ;bitpos:[25:14] ;default: 12'b0 ; */ +/*description: */ +#define DPORT_INTERNAL_SRAM_IA 0x00000FFF +#define DPORT_INTERNAL_SRAM_IA_M ((DPORT_INTERNAL_SRAM_IA_V)<<(DPORT_INTERNAL_SRAM_IA_S)) +#define DPORT_INTERNAL_SRAM_IA_V 0xFFF +#define DPORT_INTERNAL_SRAM_IA_S 14 +/* DPORT_INTERNAL_SRAM_MMU_AD : RO ;bitpos:[13:10] ;default: 4'b0 ; */ +/*description: */ +#define DPORT_INTERNAL_SRAM_MMU_AD 0x0000000F +#define DPORT_INTERNAL_SRAM_MMU_AD_M ((DPORT_INTERNAL_SRAM_MMU_AD_V)<<(DPORT_INTERNAL_SRAM_MMU_AD_S)) +#define DPORT_INTERNAL_SRAM_MMU_AD_V 0xF +#define DPORT_INTERNAL_SRAM_MMU_AD_S 10 +/* DPORT_SHARE_ROM_IA : RO ;bitpos:[9:6] ;default: 4'b0 ; */ +/*description: */ +#define DPORT_SHARE_ROM_IA 0x0000000F +#define DPORT_SHARE_ROM_IA_M ((DPORT_SHARE_ROM_IA_V)<<(DPORT_SHARE_ROM_IA_S)) +#define DPORT_SHARE_ROM_IA_V 0xF +#define DPORT_SHARE_ROM_IA_S 6 +/* DPORT_SHARE_ROM_MPU_AD : RO ;bitpos:[5:4] ;default: 2'b0 ; */ +/*description: */ +#define DPORT_SHARE_ROM_MPU_AD 0x00000003 +#define DPORT_SHARE_ROM_MPU_AD_M ((DPORT_SHARE_ROM_MPU_AD_V)<<(DPORT_SHARE_ROM_MPU_AD_S)) +#define DPORT_SHARE_ROM_MPU_AD_V 0x3 +#define DPORT_SHARE_ROM_MPU_AD_S 4 +/* DPORT_APP_ROM_IA : RO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_APP_ROM_IA (BIT(3)) +#define DPORT_APP_ROM_IA_M (BIT(3)) +#define DPORT_APP_ROM_IA_V 0x1 +#define DPORT_APP_ROM_IA_S 3 +/* DPORT_APP_ROM_MPU_AD : RO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_APP_ROM_MPU_AD (BIT(2)) +#define DPORT_APP_ROM_MPU_AD_M (BIT(2)) +#define DPORT_APP_ROM_MPU_AD_V 0x1 +#define DPORT_APP_ROM_MPU_AD_S 2 +/* DPORT_PRO_ROM_IA : RO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_PRO_ROM_IA (BIT(1)) +#define DPORT_PRO_ROM_IA_M (BIT(1)) +#define DPORT_PRO_ROM_IA_V 0x1 +#define DPORT_PRO_ROM_IA_S 1 +/* DPORT_PRO_ROM_MPU_AD : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_PRO_ROM_MPU_AD (BIT(0)) +#define DPORT_PRO_ROM_MPU_AD_M (BIT(0)) +#define DPORT_PRO_ROM_MPU_AD_V 0x1 +#define DPORT_PRO_ROM_MPU_AD_S 0 + +#define DPORT_MEM_ACCESS_DBUG1_REG (DR_REG_DPORT_BASE + 0x3EC) +/* DPORT_AHBLITE_IA : RO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_AHBLITE_IA (BIT(10)) +#define DPORT_AHBLITE_IA_M (BIT(10)) +#define DPORT_AHBLITE_IA_V 0x1 +#define DPORT_AHBLITE_IA_S 10 +/* DPORT_AHBLITE_ACCESS_DENY : RO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_AHBLITE_ACCESS_DENY (BIT(9)) +#define DPORT_AHBLITE_ACCESS_DENY_M (BIT(9)) +#define DPORT_AHBLITE_ACCESS_DENY_V 0x1 +#define DPORT_AHBLITE_ACCESS_DENY_S 9 +/* DPORT_AHB_ACCESS_DENY : RO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_AHB_ACCESS_DENY (BIT(8)) +#define DPORT_AHB_ACCESS_DENY_M (BIT(8)) +#define DPORT_AHB_ACCESS_DENY_V 0x1 +#define DPORT_AHB_ACCESS_DENY_S 8 +/* DPORT_PIDGEN_IA : RO ;bitpos:[7:6] ;default: 2'b0 ; */ +/*description: */ +#define DPORT_PIDGEN_IA 0x00000003 +#define DPORT_PIDGEN_IA_M ((DPORT_PIDGEN_IA_V)<<(DPORT_PIDGEN_IA_S)) +#define DPORT_PIDGEN_IA_V 0x3 +#define DPORT_PIDGEN_IA_S 6 +/* DPORT_ARB_IA : RO ;bitpos:[5:4] ;default: 2'b0 ; */ +/*description: */ +#define DPORT_ARB_IA 0x00000003 +#define DPORT_ARB_IA_M ((DPORT_ARB_IA_V)<<(DPORT_ARB_IA_S)) +#define DPORT_ARB_IA_V 0x3 +#define DPORT_ARB_IA_S 4 +/* DPORT_INTERNAL_SRAM_MMU_MISS : RO ;bitpos:[3:0] ;default: 4'b0 ; */ +/*description: */ +#define DPORT_INTERNAL_SRAM_MMU_MISS 0x0000000F +#define DPORT_INTERNAL_SRAM_MMU_MISS_M ((DPORT_INTERNAL_SRAM_MMU_MISS_V)<<(DPORT_INTERNAL_SRAM_MMU_MISS_S)) +#define DPORT_INTERNAL_SRAM_MMU_MISS_V 0xF +#define DPORT_INTERNAL_SRAM_MMU_MISS_S 0 + +#define DPORT_PRO_DCACHE_DBUG0_REG (DR_REG_DPORT_BASE + 0x3F0) +/* DPORT_PRO_RX_END : RO ;bitpos:[23] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_PRO_RX_END (BIT(23)) +#define DPORT_PRO_RX_END_M (BIT(23)) +#define DPORT_PRO_RX_END_V 0x1 +#define DPORT_PRO_RX_END_S 23 +/* DPORT_PRO_SLAVE_WDATA_V : RO ;bitpos:[22] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_PRO_SLAVE_WDATA_V (BIT(22)) +#define DPORT_PRO_SLAVE_WDATA_V_M (BIT(22)) +#define DPORT_PRO_SLAVE_WDATA_V_V 0x1 +#define DPORT_PRO_SLAVE_WDATA_V_S 22 +/* DPORT_PRO_SLAVE_WR : RO ;bitpos:[21] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_PRO_SLAVE_WR (BIT(21)) +#define DPORT_PRO_SLAVE_WR_M (BIT(21)) +#define DPORT_PRO_SLAVE_WR_V 0x1 +#define DPORT_PRO_SLAVE_WR_S 21 +/* DPORT_PRO_TX_END : RO ;bitpos:[20] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_PRO_TX_END (BIT(20)) +#define DPORT_PRO_TX_END_M (BIT(20)) +#define DPORT_PRO_TX_END_V 0x1 +#define DPORT_PRO_TX_END_S 20 +/* DPORT_PRO_WR_BAK_TO_READ : RO ;bitpos:[19] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_PRO_WR_BAK_TO_READ (BIT(19)) +#define DPORT_PRO_WR_BAK_TO_READ_M (BIT(19)) +#define DPORT_PRO_WR_BAK_TO_READ_V 0x1 +#define DPORT_PRO_WR_BAK_TO_READ_S 19 +/* DPORT_PRO_CACHE_STATE : RO ;bitpos:[18:7] ;default: 12'b0 ; */ +/*description: */ +#define DPORT_PRO_CACHE_STATE 0x00000FFF +#define DPORT_PRO_CACHE_STATE_M ((DPORT_PRO_CACHE_STATE_V)<<(DPORT_PRO_CACHE_STATE_S)) +#define DPORT_PRO_CACHE_STATE_V 0xFFF +#define DPORT_PRO_CACHE_STATE_S 7 +/* DPORT_PRO_CACHE_IA : RO ;bitpos:[6:1] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_PRO_CACHE_IA 0x0000003F +#define DPORT_PRO_CACHE_IA_M ((DPORT_PRO_CACHE_IA_V)<<(DPORT_PRO_CACHE_IA_S)) +#define DPORT_PRO_CACHE_IA_V 0x3F +#define DPORT_PRO_CACHE_IA_S 1 +/* DPORT_PRO_CACHE_MMU_IA : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_PRO_CACHE_MMU_IA (BIT(0)) +#define DPORT_PRO_CACHE_MMU_IA_M (BIT(0)) +#define DPORT_PRO_CACHE_MMU_IA_V 0x1 +#define DPORT_PRO_CACHE_MMU_IA_S 0 + +#define DPORT_PRO_DCACHE_DBUG1_REG (DR_REG_DPORT_BASE + 0x3F4) +/* DPORT_PRO_CTAG_RAM_RDATA : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define DPORT_PRO_CTAG_RAM_RDATA 0xFFFFFFFF +#define DPORT_PRO_CTAG_RAM_RDATA_M ((DPORT_PRO_CTAG_RAM_RDATA_V)<<(DPORT_PRO_CTAG_RAM_RDATA_S)) +#define DPORT_PRO_CTAG_RAM_RDATA_V 0xFFFFFFFF +#define DPORT_PRO_CTAG_RAM_RDATA_S 0 + +#define DPORT_PRO_DCACHE_DBUG2_REG (DR_REG_DPORT_BASE + 0x3F8) +/* DPORT_PRO_CACHE_VADDR : RO ;bitpos:[26:0] ;default: 27'b0 ; */ +/*description: */ +#define DPORT_PRO_CACHE_VADDR 0x07FFFFFF +#define DPORT_PRO_CACHE_VADDR_M ((DPORT_PRO_CACHE_VADDR_V)<<(DPORT_PRO_CACHE_VADDR_S)) +#define DPORT_PRO_CACHE_VADDR_V 0x7FFFFFF +#define DPORT_PRO_CACHE_VADDR_S 0 + +#define DPORT_PRO_DCACHE_DBUG3_REG (DR_REG_DPORT_BASE + 0x3FC) +/* DPORT_PRO_CACHE_IRAM0_PID_ERROR : RO ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_PRO_CACHE_IRAM0_PID_ERROR (BIT(15)) +#define DPORT_PRO_CACHE_IRAM0_PID_ERROR_M (BIT(15)) +#define DPORT_PRO_CACHE_IRAM0_PID_ERROR_V 0x1 +#define DPORT_PRO_CACHE_IRAM0_PID_ERROR_S 15 +/* DPORT_PRO_CPU_DISABLED_CACHE_IA : RO ;bitpos:[14:9] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_PRO_CPU_DISABLED_CACHE_IA 0x0000003F +#define DPORT_PRO_CPU_DISABLED_CACHE_IA_M ((DPORT_PRO_CPU_DISABLED_CACHE_IA_V)<<(DPORT_PRO_CPU_DISABLED_CACHE_IA_S)) +#define DPORT_PRO_CPU_DISABLED_CACHE_IA_V 0x3F +#define DPORT_PRO_CPU_DISABLED_CACHE_IA_S 9 +/* This is the contents of DPORT_PRO_CPU_DISABLED_CACHE_IA field expanded */ +/* The following bits will be set upon invalid access for different memory + * regions: */ +/* Port of the APP CPU cache when cache is used in high/low or odd/even mode */ +#define DPORT_PRO_CPU_DISABLED_CACHE_IA_OPPOSITE BIT(9) +#define DPORT_PRO_CPU_DISABLED_CACHE_IA_OPPOSITE_M BIT(9) +#define DPORT_PRO_CPU_DISABLED_CACHE_IA_OPPOSITE_V 1 +#define DPORT_PRO_CPU_DISABLED_CACHE_IA_OPPOSITE_S 9 +/* DRAM1: 0x3F80_0000 ~ 0x3FBF_FFFF(R/W) */ +#define DPORT_PRO_CPU_DISABLED_CACHE_IA_DRAM1 BIT(10) +#define DPORT_PRO_CPU_DISABLED_CACHE_IA_DRAM1_M BIT(10) +#define DPORT_PRO_CPU_DISABLED_CACHE_IA_DRAM1_V 1 +#define DPORT_PRO_CPU_DISABLED_CACHE_IA_DRAM1_S 10 +/* IROM0: 0x4080_0000 ~ 0x40BF_FFFF(RO) */ +#define DPORT_PRO_CPU_DISABLED_CACHE_IA_IROM0 BIT(11) +#define DPORT_PRO_CPU_DISABLED_CACHE_IA_IROM0_M BIT(11) +#define DPORT_PRO_CPU_DISABLED_CACHE_IA_IROM0_V 1 +#define DPORT_PRO_CPU_DISABLED_CACHE_IA_IROM0_S 11 +/* IRAM1: 0x4040_0000 ~ 0x407F_FFFF(RO) */ +#define DPORT_PRO_CPU_DISABLED_CACHE_IA_IRAM1 BIT(12) +#define DPORT_PRO_CPU_DISABLED_CACHE_IA_IRAM1_M BIT(12) +#define DPORT_PRO_CPU_DISABLED_CACHE_IA_IRAM1_V 1 +#define DPORT_PRO_CPU_DISABLED_CACHE_IA_IRAM1_S 12 +/* IRAM0: 0x4080_0000 ~ 0x40BF_FFFF(RO) */ +#define DPORT_PRO_CPU_DISABLED_CACHE_IA_IRAM0 BIT(13) +#define DPORT_PRO_CPU_DISABLED_CACHE_IA_IRAM0_M BIT(13) +#define DPORT_PRO_CPU_DISABLED_CACHE_IA_IRAM0_V 1 +#define DPORT_PRO_CPU_DISABLED_CACHE_IA_IRAM0_S 13 +/* DROM0: 0x3F40_0000 ~ 0x3F7F_FFFF (RO) */ +#define DPORT_PRO_CPU_DISABLED_CACHE_IA_DROM0 BIT(14) +#define DPORT_PRO_CPU_DISABLED_CACHE_IA_DROM0_M BIT(14) +#define DPORT_PRO_CPU_DISABLED_CACHE_IA_DROM0_V 1 +#define DPORT_PRO_CPU_DISABLED_CACHE_IA_DROM0_S 14 + +/* DPORT_PRO_MMU_RDATA : RO ;bitpos:[8:0] ;default: 9'h0 ; */ +/*description: */ +#define DPORT_PRO_MMU_RDATA 0x000001FF +#define DPORT_PRO_MMU_RDATA_M ((DPORT_PRO_MMU_RDATA_V)<<(DPORT_PRO_MMU_RDATA_S)) +#define DPORT_PRO_MMU_RDATA_V 0x1FF +#define DPORT_PRO_MMU_RDATA_S 0 + +#define DPORT_PRO_DCACHE_DBUG4_REG (DR_REG_DPORT_BASE + 0x400) +/* DPORT_PRO_DRAM1ADDR0_IA : RO ;bitpos:[19:0] ;default: 20'b0 ; */ +/*description: */ +#define DPORT_PRO_DRAM1ADDR0_IA 0x000FFFFF +#define DPORT_PRO_DRAM1ADDR0_IA_M ((DPORT_PRO_DRAM1ADDR0_IA_V)<<(DPORT_PRO_DRAM1ADDR0_IA_S)) +#define DPORT_PRO_DRAM1ADDR0_IA_V 0xFFFFF +#define DPORT_PRO_DRAM1ADDR0_IA_S 0 + +#define DPORT_PRO_DCACHE_DBUG5_REG (DR_REG_DPORT_BASE + 0x404) +/* DPORT_PRO_DROM0ADDR0_IA : RO ;bitpos:[19:0] ;default: 20'b0 ; */ +/*description: */ +#define DPORT_PRO_DROM0ADDR0_IA 0x000FFFFF +#define DPORT_PRO_DROM0ADDR0_IA_M ((DPORT_PRO_DROM0ADDR0_IA_V)<<(DPORT_PRO_DROM0ADDR0_IA_S)) +#define DPORT_PRO_DROM0ADDR0_IA_V 0xFFFFF +#define DPORT_PRO_DROM0ADDR0_IA_S 0 + +#define DPORT_PRO_DCACHE_DBUG6_REG (DR_REG_DPORT_BASE + 0x408) +/* DPORT_PRO_IRAM0ADDR_IA : RO ;bitpos:[19:0] ;default: 20'b0 ; */ +/*description: */ +#define DPORT_PRO_IRAM0ADDR_IA 0x000FFFFF +#define DPORT_PRO_IRAM0ADDR_IA_M ((DPORT_PRO_IRAM0ADDR_IA_V)<<(DPORT_PRO_IRAM0ADDR_IA_S)) +#define DPORT_PRO_IRAM0ADDR_IA_V 0xFFFFF +#define DPORT_PRO_IRAM0ADDR_IA_S 0 + +#define DPORT_PRO_DCACHE_DBUG7_REG (DR_REG_DPORT_BASE + 0x40C) +/* DPORT_PRO_IRAM1ADDR_IA : RO ;bitpos:[19:0] ;default: 20'b0 ; */ +/*description: */ +#define DPORT_PRO_IRAM1ADDR_IA 0x000FFFFF +#define DPORT_PRO_IRAM1ADDR_IA_M ((DPORT_PRO_IRAM1ADDR_IA_V)<<(DPORT_PRO_IRAM1ADDR_IA_S)) +#define DPORT_PRO_IRAM1ADDR_IA_V 0xFFFFF +#define DPORT_PRO_IRAM1ADDR_IA_S 0 + +#define DPORT_PRO_DCACHE_DBUG8_REG (DR_REG_DPORT_BASE + 0x410) +/* DPORT_PRO_IROM0ADDR_IA : RO ;bitpos:[19:0] ;default: 20'b0 ; */ +/*description: */ +#define DPORT_PRO_IROM0ADDR_IA 0x000FFFFF +#define DPORT_PRO_IROM0ADDR_IA_M ((DPORT_PRO_IROM0ADDR_IA_V)<<(DPORT_PRO_IROM0ADDR_IA_S)) +#define DPORT_PRO_IROM0ADDR_IA_V 0xFFFFF +#define DPORT_PRO_IROM0ADDR_IA_S 0 + +#define DPORT_PRO_DCACHE_DBUG9_REG (DR_REG_DPORT_BASE + 0x414) +/* DPORT_PRO_OPSDRAMADDR_IA : RO ;bitpos:[19:0] ;default: 20'b0 ; */ +/*description: */ +#define DPORT_PRO_OPSDRAMADDR_IA 0x000FFFFF +#define DPORT_PRO_OPSDRAMADDR_IA_M ((DPORT_PRO_OPSDRAMADDR_IA_V)<<(DPORT_PRO_OPSDRAMADDR_IA_S)) +#define DPORT_PRO_OPSDRAMADDR_IA_V 0xFFFFF +#define DPORT_PRO_OPSDRAMADDR_IA_S 0 + +#define DPORT_APP_DCACHE_DBUG0_REG (DR_REG_DPORT_BASE + 0x418) +/* DPORT_APP_RX_END : RO ;bitpos:[23] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_APP_RX_END (BIT(23)) +#define DPORT_APP_RX_END_M (BIT(23)) +#define DPORT_APP_RX_END_V 0x1 +#define DPORT_APP_RX_END_S 23 +/* DPORT_APP_SLAVE_WDATA_V : RO ;bitpos:[22] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_APP_SLAVE_WDATA_V (BIT(22)) +#define DPORT_APP_SLAVE_WDATA_V_M (BIT(22)) +#define DPORT_APP_SLAVE_WDATA_V_V 0x1 +#define DPORT_APP_SLAVE_WDATA_V_S 22 +/* DPORT_APP_SLAVE_WR : RO ;bitpos:[21] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_APP_SLAVE_WR (BIT(21)) +#define DPORT_APP_SLAVE_WR_M (BIT(21)) +#define DPORT_APP_SLAVE_WR_V 0x1 +#define DPORT_APP_SLAVE_WR_S 21 +/* DPORT_APP_TX_END : RO ;bitpos:[20] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_APP_TX_END (BIT(20)) +#define DPORT_APP_TX_END_M (BIT(20)) +#define DPORT_APP_TX_END_V 0x1 +#define DPORT_APP_TX_END_S 20 +/* DPORT_APP_WR_BAK_TO_READ : RO ;bitpos:[19] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_APP_WR_BAK_TO_READ (BIT(19)) +#define DPORT_APP_WR_BAK_TO_READ_M (BIT(19)) +#define DPORT_APP_WR_BAK_TO_READ_V 0x1 +#define DPORT_APP_WR_BAK_TO_READ_S 19 +/* DPORT_APP_CACHE_STATE : RO ;bitpos:[18:7] ;default: 12'b0 ; */ +/*description: */ +#define DPORT_APP_CACHE_STATE 0x00000FFF +#define DPORT_APP_CACHE_STATE_M ((DPORT_APP_CACHE_STATE_V)<<(DPORT_APP_CACHE_STATE_S)) +#define DPORT_APP_CACHE_STATE_V 0xFFF +#define DPORT_APP_CACHE_STATE_S 7 +/* DPORT_APP_CACHE_IA : RO ;bitpos:[6:1] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_APP_CACHE_IA 0x0000003F +#define DPORT_APP_CACHE_IA_M ((DPORT_APP_CACHE_IA_V)<<(DPORT_APP_CACHE_IA_S)) +#define DPORT_APP_CACHE_IA_V 0x3F +#define DPORT_APP_CACHE_IA_S 1 +/* DPORT_APP_CACHE_MMU_IA : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_APP_CACHE_MMU_IA (BIT(0)) +#define DPORT_APP_CACHE_MMU_IA_M (BIT(0)) +#define DPORT_APP_CACHE_MMU_IA_V 0x1 +#define DPORT_APP_CACHE_MMU_IA_S 0 + +#define DPORT_APP_DCACHE_DBUG1_REG (DR_REG_DPORT_BASE + 0x41C) +/* DPORT_APP_CTAG_RAM_RDATA : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define DPORT_APP_CTAG_RAM_RDATA 0xFFFFFFFF +#define DPORT_APP_CTAG_RAM_RDATA_M ((DPORT_APP_CTAG_RAM_RDATA_V)<<(DPORT_APP_CTAG_RAM_RDATA_S)) +#define DPORT_APP_CTAG_RAM_RDATA_V 0xFFFFFFFF +#define DPORT_APP_CTAG_RAM_RDATA_S 0 + +#define DPORT_APP_DCACHE_DBUG2_REG (DR_REG_DPORT_BASE + 0x420) +/* DPORT_APP_CACHE_VADDR : RO ;bitpos:[26:0] ;default: 27'b0 ; */ +/*description: */ +#define DPORT_APP_CACHE_VADDR 0x07FFFFFF +#define DPORT_APP_CACHE_VADDR_M ((DPORT_APP_CACHE_VADDR_V)<<(DPORT_APP_CACHE_VADDR_S)) +#define DPORT_APP_CACHE_VADDR_V 0x7FFFFFF +#define DPORT_APP_CACHE_VADDR_S 0 + +#define DPORT_APP_DCACHE_DBUG3_REG (DR_REG_DPORT_BASE + 0x424) +/* DPORT_APP_CACHE_IRAM0_PID_ERROR : RO ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_APP_CACHE_IRAM0_PID_ERROR (BIT(15)) +#define DPORT_APP_CACHE_IRAM0_PID_ERROR_M (BIT(15)) +#define DPORT_APP_CACHE_IRAM0_PID_ERROR_V 0x1 +#define DPORT_APP_CACHE_IRAM0_PID_ERROR_S 15 +/* DPORT_APP_CPU_DISABLED_CACHE_IA : RO ;bitpos:[14:9] ;default: 6'b0 ; */ +/*description: */ +#define DPORT_APP_CPU_DISABLED_CACHE_IA 0x0000003F +#define DPORT_APP_CPU_DISABLED_CACHE_IA_M ((DPORT_APP_CPU_DISABLED_CACHE_IA_V)<<(DPORT_APP_CPU_DISABLED_CACHE_IA_S)) +#define DPORT_APP_CPU_DISABLED_CACHE_IA_V 0x3F +#define DPORT_APP_CPU_DISABLED_CACHE_IA_S 9 +/* This is the contents of DPORT_APP_CPU_DISABLED_CACHE_IA field expanded */ +/* The following bits will be set upon invalid access for different memory + * regions: */ +/* Port of the PRO CPU cache when cache is used in high/low or odd/even mode */ +#define DPORT_APP_CPU_DISABLED_CACHE_IA_OPPOSITE BIT(9) +#define DPORT_APP_CPU_DISABLED_CACHE_IA_OPPOSITE_M BIT(9) +#define DPORT_APP_CPU_DISABLED_CACHE_IA_OPPOSITE_V 1 +#define DPORT_APP_CPU_DISABLED_CACHE_IA_OPPOSITE_S 9 +/* DRAM1: 0x3F80_0000 ~ 0x3FBF_FFFF(R/W) */ +#define DPORT_APP_CPU_DISABLED_CACHE_IA_DRAM1 BIT(10) +#define DPORT_APP_CPU_DISABLED_CACHE_IA_DRAM1_M BIT(10) +#define DPORT_APP_CPU_DISABLED_CACHE_IA_DRAM1_V 1 +#define DPORT_APP_CPU_DISABLED_CACHE_IA_DRAM1_S 10 +/* IROM0: 0x4080_0000 ~ 0x40BF_FFFF(RO) */ +#define DPORT_APP_CPU_DISABLED_CACHE_IA_IROM0 BIT(11) +#define DPORT_APP_CPU_DISABLED_CACHE_IA_IROM0_M BIT(11) +#define DPORT_APP_CPU_DISABLED_CACHE_IA_IROM0_V 1 +#define DPORT_APP_CPU_DISABLED_CACHE_IA_IROM0_S 11 +/* IRAM1: 0x4040_0000 ~ 0x407F_FFFF(RO) */ +#define DPORT_APP_CPU_DISABLED_CACHE_IA_IRAM1 BIT(12) +#define DPORT_APP_CPU_DISABLED_CACHE_IA_IRAM1_M BIT(12) +#define DPORT_APP_CPU_DISABLED_CACHE_IA_IRAM1_V 1 +#define DPORT_APP_CPU_DISABLED_CACHE_IA_IRAM1_S 12 +/* IRAM0: 0x4080_0000 ~ 0x40BF_FFFF(RO) */ +#define DPORT_APP_CPU_DISABLED_CACHE_IA_IRAM0 BIT(13) +#define DPORT_APP_CPU_DISABLED_CACHE_IA_IRAM0_M BIT(13) +#define DPORT_APP_CPU_DISABLED_CACHE_IA_IRAM0_V 1 +#define DPORT_APP_CPU_DISABLED_CACHE_IA_IRAM0_S 13 +/* DROM0: 0x3F40_0000 ~ 0x3F7F_FFFF (RO) */ +#define DPORT_APP_CPU_DISABLED_CACHE_IA_DROM0 BIT(14) +#define DPORT_APP_CPU_DISABLED_CACHE_IA_DROM0_M BIT(14) +#define DPORT_APP_CPU_DISABLED_CACHE_IA_DROM0_V 1 +#define DPORT_APP_CPU_DISABLED_CACHE_IA_DROM0_S 14 + +/* DPORT_APP_MMU_RDATA : RO ;bitpos:[8:0] ;default: 9'h0 ; */ +/*description: */ +#define DPORT_APP_MMU_RDATA 0x000001FF +#define DPORT_APP_MMU_RDATA_M ((DPORT_APP_MMU_RDATA_V)<<(DPORT_APP_MMU_RDATA_S)) +#define DPORT_APP_MMU_RDATA_V 0x1FF +#define DPORT_APP_MMU_RDATA_S 0 + +#define DPORT_APP_DCACHE_DBUG4_REG (DR_REG_DPORT_BASE + 0x428) +/* DPORT_APP_DRAM1ADDR0_IA : RO ;bitpos:[19:0] ;default: 20'b0 ; */ +/*description: */ +#define DPORT_APP_DRAM1ADDR0_IA 0x000FFFFF +#define DPORT_APP_DRAM1ADDR0_IA_M ((DPORT_APP_DRAM1ADDR0_IA_V)<<(DPORT_APP_DRAM1ADDR0_IA_S)) +#define DPORT_APP_DRAM1ADDR0_IA_V 0xFFFFF +#define DPORT_APP_DRAM1ADDR0_IA_S 0 + +#define DPORT_APP_DCACHE_DBUG5_REG (DR_REG_DPORT_BASE + 0x42C) +/* DPORT_APP_DROM0ADDR0_IA : RO ;bitpos:[19:0] ;default: 20'b0 ; */ +/*description: */ +#define DPORT_APP_DROM0ADDR0_IA 0x000FFFFF +#define DPORT_APP_DROM0ADDR0_IA_M ((DPORT_APP_DROM0ADDR0_IA_V)<<(DPORT_APP_DROM0ADDR0_IA_S)) +#define DPORT_APP_DROM0ADDR0_IA_V 0xFFFFF +#define DPORT_APP_DROM0ADDR0_IA_S 0 + +#define DPORT_APP_DCACHE_DBUG6_REG (DR_REG_DPORT_BASE + 0x430) +/* DPORT_APP_IRAM0ADDR_IA : RO ;bitpos:[19:0] ;default: 20'b0 ; */ +/*description: */ +#define DPORT_APP_IRAM0ADDR_IA 0x000FFFFF +#define DPORT_APP_IRAM0ADDR_IA_M ((DPORT_APP_IRAM0ADDR_IA_V)<<(DPORT_APP_IRAM0ADDR_IA_S)) +#define DPORT_APP_IRAM0ADDR_IA_V 0xFFFFF +#define DPORT_APP_IRAM0ADDR_IA_S 0 + +#define DPORT_APP_DCACHE_DBUG7_REG (DR_REG_DPORT_BASE + 0x434) +/* DPORT_APP_IRAM1ADDR_IA : RO ;bitpos:[19:0] ;default: 20'b0 ; */ +/*description: */ +#define DPORT_APP_IRAM1ADDR_IA 0x000FFFFF +#define DPORT_APP_IRAM1ADDR_IA_M ((DPORT_APP_IRAM1ADDR_IA_V)<<(DPORT_APP_IRAM1ADDR_IA_S)) +#define DPORT_APP_IRAM1ADDR_IA_V 0xFFFFF +#define DPORT_APP_IRAM1ADDR_IA_S 0 + +#define DPORT_APP_DCACHE_DBUG8_REG (DR_REG_DPORT_BASE + 0x438) +/* DPORT_APP_IROM0ADDR_IA : RO ;bitpos:[19:0] ;default: 20'b0 ; */ +/*description: */ +#define DPORT_APP_IROM0ADDR_IA 0x000FFFFF +#define DPORT_APP_IROM0ADDR_IA_M ((DPORT_APP_IROM0ADDR_IA_V)<<(DPORT_APP_IROM0ADDR_IA_S)) +#define DPORT_APP_IROM0ADDR_IA_V 0xFFFFF +#define DPORT_APP_IROM0ADDR_IA_S 0 + +#define DPORT_APP_DCACHE_DBUG9_REG (DR_REG_DPORT_BASE + 0x43C) +/* DPORT_APP_OPSDRAMADDR_IA : RO ;bitpos:[19:0] ;default: 20'b0 ; */ +/*description: */ +#define DPORT_APP_OPSDRAMADDR_IA 0x000FFFFF +#define DPORT_APP_OPSDRAMADDR_IA_M ((DPORT_APP_OPSDRAMADDR_IA_V)<<(DPORT_APP_OPSDRAMADDR_IA_S)) +#define DPORT_APP_OPSDRAMADDR_IA_V 0xFFFFF +#define DPORT_APP_OPSDRAMADDR_IA_S 0 + +#define DPORT_PRO_CPU_RECORD_CTRL_REG (DR_REG_DPORT_BASE + 0x440) +/* DPORT_PRO_CPU_PDEBUG_ENABLE : R/W ;bitpos:[8] ;default: 1'b1 ; */ +/*description: */ +#define DPORT_PRO_CPU_PDEBUG_ENABLE (BIT(8)) +#define DPORT_PRO_CPU_PDEBUG_ENABLE_M (BIT(8)) +#define DPORT_PRO_CPU_PDEBUG_ENABLE_V 0x1 +#define DPORT_PRO_CPU_PDEBUG_ENABLE_S 8 +/* DPORT_PRO_CPU_RECORD_DISABLE : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_PRO_CPU_RECORD_DISABLE (BIT(4)) +#define DPORT_PRO_CPU_RECORD_DISABLE_M (BIT(4)) +#define DPORT_PRO_CPU_RECORD_DISABLE_V 0x1 +#define DPORT_PRO_CPU_RECORD_DISABLE_S 4 +/* DPORT_PRO_CPU_RECORD_ENABLE : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_PRO_CPU_RECORD_ENABLE (BIT(0)) +#define DPORT_PRO_CPU_RECORD_ENABLE_M (BIT(0)) +#define DPORT_PRO_CPU_RECORD_ENABLE_V 0x1 +#define DPORT_PRO_CPU_RECORD_ENABLE_S 0 + +#define DPORT_PRO_CPU_RECORD_STATUS_REG (DR_REG_DPORT_BASE + 0x444) +/* DPORT_PRO_CPU_RECORDING : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_PRO_CPU_RECORDING (BIT(0)) +#define DPORT_PRO_CPU_RECORDING_M (BIT(0)) +#define DPORT_PRO_CPU_RECORDING_V 0x1 +#define DPORT_PRO_CPU_RECORDING_S 0 + +#define DPORT_PRO_CPU_RECORD_PID_REG (DR_REG_DPORT_BASE + 0x448) +/* DPORT_RECORD_PRO_PID : RO ;bitpos:[2:0] ;default: 3'd0 ; */ +/*description: */ +#define DPORT_RECORD_PRO_PID 0x00000007 +#define DPORT_RECORD_PRO_PID_M ((DPORT_RECORD_PRO_PID_V)<<(DPORT_RECORD_PRO_PID_S)) +#define DPORT_RECORD_PRO_PID_V 0x7 +#define DPORT_RECORD_PRO_PID_S 0 + +#define DPORT_PRO_CPU_RECORD_PDEBUGINST_REG (DR_REG_DPORT_BASE + 0x44C) +/* DPORT_RECORD_PRO_PDEBUGINST : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define DPORT_RECORD_PRO_PDEBUGINST 0xFFFFFFFF +#define DPORT_RECORD_PRO_PDEBUGINST_M ((DPORT_RECORD_PRO_PDEBUGINST_V)<<(DPORT_RECORD_PRO_PDEBUGINST_S)) +#define DPORT_RECORD_PRO_PDEBUGINST_V 0xFFFFFFFF +#define DPORT_RECORD_PRO_PDEBUGINST_S 0 +/* register layout: + * SIZE [7..0] : Instructions normally complete in the W stage. The size of the instruction in the W is given + * by this field in number of bytes. If it is 8’b0 in a given cycle the W stage has no completing + * instruction. This is also known as a bubble cycle. Also see DPORT_PRO_CPU_RECORD_PDEBUGSTATUS_REG. + * ISRC [14..12] : Instruction source. +** LOOP [23..20] : Loopback status. +** CINTLEVEL [27..24]: CINTLEVEL. +*/ +#define DPORT_RECORD_PDEBUGINST_SZ_M ((DPORT_RECORD_PDEBUGINST_SZ_V)<<(DPORT_RECORD_PDEBUGINST_SZ_S)) +#define DPORT_RECORD_PDEBUGINST_SZ_V 0xFF +#define DPORT_RECORD_PDEBUGINST_SZ_S 0 +#define DPORT_RECORD_PDEBUGINST_SZ(_r_) (((_r_)>>DPORT_RECORD_PDEBUGINST_SZ_S) & DPORT_RECORD_PDEBUGINST_SZ_V) +#define DPORT_RECORD_PDEBUGINST_ISRC_M ((DPORT_RECORD_PDEBUGINST_ISRC_V)<<(DPORT_RECORD_PDEBUGINST_ISRC_S)) +#define DPORT_RECORD_PDEBUGINST_ISRC_V 0x07 +#define DPORT_RECORD_PDEBUGINST_ISRC_S 12 +#define DPORT_RECORD_PDEBUGINST_ISRC(_r_) (((_r_)>>DPORT_RECORD_PDEBUGINST_ISRC_S) & DPORT_RECORD_PDEBUGINST_ISRC_V) +// #define DPORT_RECORD_PDEBUGINST_LOOP_M ((DPORT_RECORD_PDEBUGINST_LOOP_V)<<(DPORT_RECORD_PDEBUGINST_LOOP_S)) +// #define DPORT_RECORD_PDEBUGINST_LOOP_V 0x0F +// #define DPORT_RECORD_PDEBUGINST_LOOP_S 20 +// #define DPORT_RECORD_PDEBUGINST_LOOP(_r_) (((_r_)>>DPORT_RECORD_PDEBUGINST_LOOP_S) & DPORT_RECORD_PDEBUGINST_LOOP_V) +#define DPORT_RECORD_PDEBUGINST_LOOP_REP (BIT(20)) /* loopback will occur */ +#define DPORT_RECORD_PDEBUGINST_LOOP (BIT(21)) /* last inst of loop */ +#define DPORT_RECORD_PDEBUGINST_CINTL_M ((DPORT_RECORD_PDEBUGINST_CINTL_V)<<(DPORT_RECORD_PDEBUGINST_CINTL_S)) +#define DPORT_RECORD_PDEBUGINST_CINTL_V 0x0F +#define DPORT_RECORD_PDEBUGINST_CINTL_S 24 +#define DPORT_RECORD_PDEBUGINST_CINTL(_r_) (((_r_)>>DPORT_RECORD_PDEBUGINST_CINTL_S) & DPORT_RECORD_PDEBUGINST_CINTL_V) + +#define DPORT_PRO_CPU_RECORD_PDEBUGSTATUS_REG (DR_REG_DPORT_BASE + 0x450) +/* DPORT_RECORD_PRO_PDEBUGSTATUS : RO ;bitpos:[7:0] ;default: 8'b0 ; */ +/*description: */ +#define DPORT_RECORD_PRO_PDEBUGSTATUS 0x000000FF +#define DPORT_RECORD_PRO_PDEBUGSTATUS_M ((DPORT_RECORD_PRO_PDEBUGSTATUS_V)<<(DPORT_RECORD_PRO_PDEBUGSTATUS_S)) +#define DPORT_RECORD_PRO_PDEBUGSTATUS_V 0xFF +#define DPORT_RECORD_PRO_PDEBUGSTATUS_S 0 +/* register layout: + * BBCAUSE [5..0]: Indicates cause for bubble cycle. See below for posible values. When DPORT_RECORD_PDEBUGINST_SZ == 0 + * INSNTYPE[5..0]: Indicates type of instruction retiring in the W stage. See below for posible values. When DPORT_RECORD_PDEBUGINST_SZ > 0 +*/ +#define DPORT_RECORD_PDEBUGSTATUS_BBCAUSE_M ((DPORT_RECORD_PDEBUGSTATUS_BBCAUSE_V)<<(DPORT_RECORD_PDEBUGSTATUS_BBCAUSE_S)) +#define DPORT_RECORD_PDEBUGSTATUS_BBCAUSE_V 0x3F +#define DPORT_RECORD_PDEBUGSTATUS_BBCAUSE_S 0 +#define DPORT_RECORD_PDEBUGSTATUS_BBCAUSE(_r_) (((_r_)>>DPORT_RECORD_PDEBUGSTATUS_BBCAUSE_S) & DPORT_RECORD_PDEBUGSTATUS_BBCAUSE_V) +#define DPORT_RECORD_PDEBUGSTATUS_BBCAUSE_PSO 0x00 /* Power shut off */ +#define DPORT_RECORD_PDEBUGSTATUS_BBCAUSE_DEP 0x02 /* Register dependency or resource conflict. See DPORT_XXX_CPU_RECORD_PDEBUGDATA_REG for extra info. */ +#define DPORT_RECORD_PDEBUGSTATUS_BBCAUSE_CTL 0x04 /* Control transfer bubble */ +#define DPORT_RECORD_PDEBUGSTATUS_BBCAUSE_ICM 0x08 /* I-cache miss (incl uncached miss) */ +#define DPORT_RECORD_PDEBUGSTATUS_BBCAUSE_DCM 0x0C /* D-cache miss (excl uncached miss) */ +#define DPORT_RECORD_PDEBUGSTATUS_BBCAUSE_EXC0 0x10 /* Exception or interrupt (W stage). See DPORT_XXX_CPU_RECORD_PDEBUGDATA_REG for extra info. + The virtual address of the instruction that was killed appears on DPORT_PRO_CPU_RECORD_PDEBUGPC_REG[31:0] */ +#define DPORT_RECORD_PDEBUGSTATUS_BBCAUSE_EXC1 0x11 /* Exception or interrupt (W+1 stage). See DPORT_XXX_CPU_RECORD_PDEBUGDATA_REG for extra info. */ +#define DPORT_RECORD_PDEBUGSTATUS_BBCAUSE_RPL 0x14 /* Instruction replay (other). DPORT_XXX_CPU_RECORD_PDEBUGDATA_REG has the PC of the replaying instruction. */ +#define DPORT_RECORD_PDEBUGSTATUS_BBCAUSE_ITLB 0x18 /* HW ITLB refill. The refill address and data are available on + DPORT_PRO_CPU_RECORD_PDEBUGLS0ADDR_REG and DPORT_PRO_CPU_RECORD_PDEBUGLS0DATA_REG. */ +#define DPORT_RECORD_PDEBUGSTATUS_BBCAUSE_ITLBM 0x1A /* ITLB miss */ +#define DPORT_RECORD_PDEBUGSTATUS_BBCAUSE_DTLB 0x1C /* HW DTLB refill. The refill address and data are available on + DPORT_PRO_CPU_RECORD_PDEBUGLS0ADDR_REG and DPORT_PRO_CPU_RECORD_PDEBUGLS0DATA_REG. */ +#define DPORT_RECORD_PDEBUGSTATUS_BBCAUSE_DTLBM 0x1E /* DTLB miss */ +#define DPORT_RECORD_PDEBUGSTATUS_BBCAUSE_STALL 0x20 /* Stall . The cause of the global stall is further classified in the DPORT_XXX_CPU_RECORD_PDEBUGDATA_REG. */ +#define DPORT_RECORD_PDEBUGSTATUS_BBCAUSE_HWMEC 0x24 /* HW-corrected memory error */ +#define DPORT_RECORD_PDEBUGSTATUS_BBCAUSE_WAITI 0x28 /* WAITI mode */ +#define DPORT_RECORD_PDEBUGSTATUS_BBCAUSE_OTHER 0x3C /* all other bubbles */ +#define DPORT_RECORD_PDEBUGSTATUS_INSNTYPE_M ((DPORT_RECORD_PDEBUGSTATUS_INSNTYPE_V)<<(DPORT_RECORD_PDEBUGSTATUS_INSNTYPE_S)) +#define DPORT_RECORD_PDEBUGSTATUS_INSNTYPE_V 0x3F +#define DPORT_RECORD_PDEBUGSTATUS_INSNTYPE_S 0 +#define DPORT_RECORD_PDEBUGSTATUS_INSNTYPE(_r_) (((_r_)>>DPORT_RECORD_PDEBUGSTATUS_INSNTYPE_S) & DPORT_RECORD_PDEBUGSTATUS_INSNTYPE_V) +#define DPORT_RECORD_PDEBUGSTATUS_INSNTYPE_JX 0x00 /* JX */ +#define DPORT_RECORD_PDEBUGSTATUS_INSNTYPE_CALLX 0x04 /* CALLX */ +#define DPORT_RECORD_PDEBUGSTATUS_INSNTYPE_CRET 0x08 /* All call returns */ +#define DPORT_RECORD_PDEBUGSTATUS_INSNTYPE_ERET 0x0C /* All exception returns */ +#define DPORT_RECORD_PDEBUGSTATUS_INSNTYPE_B 0x10 /* Branch taken or loop not taken */ +#define DPORT_RECORD_PDEBUGSTATUS_INSNTYPE_J 0x14 /* J */ +#define DPORT_RECORD_PDEBUGSTATUS_INSNTYPE_CALL 0x18 /* CALL */ +#define DPORT_RECORD_PDEBUGSTATUS_INSNTYPE_BN 0x1C /* Branch not taken */ +#define DPORT_RECORD_PDEBUGSTATUS_INSNTYPE_LOOP 0x20 /* Loop instruction (taken) */ +#define DPORT_RECORD_PDEBUGSTATUS_INSNTYPE_S32C1I 0x24 /* S32C1I. The address and load data (before the conditional store) are available on the LS signals*/ +#define DPORT_RECORD_PDEBUGSTATUS_INSNTYPE_WXSR2LB 0x28 /* WSR/XSR to LBEGIN */ +#define DPORT_RECORD_PDEBUGSTATUS_INSNTYPE_WSR2MMID 0x2C /* WSR to MMID */ +#define DPORT_RECORD_PDEBUGSTATUS_INSNTYPE_RWXSR 0x30 /* RSR or WSR (except MMID and LBEGIN) or XSR (except LBEGIN) */ +#define DPORT_RECORD_PDEBUGSTATUS_INSNTYPE_RWER 0x34 /* RER or WER */ +#define DPORT_RECORD_PDEBUGSTATUS_INSNTYPE_DEF 0x3C /* Default */ + +#define DPORT_PRO_CPU_RECORD_PDEBUGDATA_REG (DR_REG_DPORT_BASE + 0x454) +/* DPORT_RECORD_PRO_PDEBUGDATA : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define DPORT_RECORD_PRO_PDEBUGDATA 0xFFFFFFFF +#define DPORT_RECORD_PRO_PDEBUGDATA_M ((DPORT_RECORD_PRO_PDEBUGDATA_V)<<(DPORT_RECORD_PRO_PDEBUGDATA_S)) +#define DPORT_RECORD_PRO_PDEBUGDATA_V 0xFFFFFFFF +#define DPORT_RECORD_PRO_PDEBUGDATA_S 0 +/* register layout when bubble cycke cause is DPORT_RECORD_PDEBUGSTATUS_BBCAUSE_DEP: + * + * HALT [17]: HALT instruction (TX only) + * MEMW [16]: MEMW, EXTW or EXCW instruction dependency + * REG [12]: register dependencies or resource (e.g.TIE ports) conflicts + * STR [11]: store release (instruction) dependency + * LSU [8] : various LSU dependencies (MHT access, prefetch, cache access insts, s32c1i, etc) + * OTHER[0] : all other hold dependencies resulting from data or resource dependencies +*/ +#define DPORT_RECORD_PDEBUGDATA_DEP_HALT (BIT(17)) +#define DPORT_RECORD_PDEBUGDATA_DEP_MEMW (BIT(16)) +#define DPORT_RECORD_PDEBUGDATA_DEP_REG (BIT(12)) +#define DPORT_RECORD_PDEBUGDATA_DEP_STR (BIT(11)) +#define DPORT_RECORD_PDEBUGDATA_DEP_LSU (BIT(8)) +#define DPORT_RECORD_PDEBUGDATA_DEP_OTHER (BIT(0)) +/* register layout when bubble cycke cause is DPORT_RECORD_PDEBUGSTATUS_BBCAUSE_EXCn: + * + * EXCCAUSE[21..16]: Processor exception cause + * EXCVEC [4..0] : Encoded Exception Vector +*/ +#define DPORT_RECORD_PDEBUGDATA_EXCCAUSE_M ((DPORT_RECORD_PDEBUGDATA_EXCCAUSE_V)<<(DPORT_RECORD_PDEBUGDATA_EXCCAUSE_S)) +#define DPORT_RECORD_PDEBUGDATA_EXCCAUSE_V 0x3F +#define DPORT_RECORD_PDEBUGDATA_EXCCAUSE_S 16 +#define DPORT_RECORD_PDEBUGDATA_EXCCAUSE(_r_) (((_r_)>>DPORT_RECORD_PDEBUGDATA_EXCCAUSE_S) & DPORT_RECORD_PDEBUGDATA_EXCCAUSE_V) +#define DPORT_RECORD_PDEBUGDATA_EXCVEC_M ((DPORT_RECORD_PDEBUGDATA_EXCCAUSE_V)<<(DPORT_RECORD_PDEBUGDATA_EXCCAUSE_S)) +#define DPORT_RECORD_PDEBUGDATA_EXCVEC_V 0x1F +#define DPORT_RECORD_PDEBUGDATA_EXCVEC_S 0 +#define DPORT_RECORD_PDEBUGDATA_EXCVEC(_r_) (((_r_)>>DPORT_RECORD_PDEBUGDATA_EXCCAUSE_S) & DPORT_RECORD_PDEBUGDATA_EXCCAUSE_V) +#define DPORT_RECORD_PDEBUGDATA_EXCVEC_NONE 0x00 /* no vector */ +#define DPORT_RECORD_PDEBUGDATA_EXCVEC_RST 0x01 /* Reset */ +#define DPORT_RECORD_PDEBUGDATA_EXCVEC_DBG 0x02 /* Debug (repl corresp level “n”) */ +#define DPORT_RECORD_PDEBUGDATA_EXCVEC_NMI 0x03 /* NMI (repl corresp level “n”) */ +#define DPORT_RECORD_PDEBUGDATA_EXCVEC_USR 0x04 /* User */ +#define DPORT_RECORD_PDEBUGDATA_EXCVEC_KRNL 0x05 /* Kernel */ +#define DPORT_RECORD_PDEBUGDATA_EXCVEC_DBL 0x06 /* Double */ +#define DPORT_RECORD_PDEBUGDATA_EXCVEC_EMEM 0x07 /* Memory Error */ +#define DPORT_RECORD_PDEBUGDATA_EXCVEC_OVF4 0x0A /* Window Overflow 4 */ +#define DPORT_RECORD_PDEBUGDATA_EXCVEC_UNF4 0x0B /* Window Underflow 4 */ +#define DPORT_RECORD_PDEBUGDATA_EXCVEC_OVF8 0x0C /* Window Overflow 8 */ +#define DPORT_RECORD_PDEBUGDATA_EXCVEC_UNF8 0x0D /* Window Underflow 8 */ +#define DPORT_RECORD_PDEBUGDATA_EXCVEC_OVF12 0x0E /* Window Overflow 12 */ +#define DPORT_RECORD_PDEBUGDATA_EXCVEC_UNF12 0x0F /* Window Underflow 12 */ +#define DPORT_RECORD_PDEBUGDATA_EXCVEC_INT2 0x10 /* Int Level 2 (n/a if debug/NMI) */ +#define DPORT_RECORD_PDEBUGDATA_EXCVEC_INT3 0x11 /* Int Level 3 (n/a if debug/NMI) */ +#define DPORT_RECORD_PDEBUGDATA_EXCVEC_INT4 0x12 /* Int Level 4 (n/a if debug/NMI) */ +#define DPORT_RECORD_PDEBUGDATA_EXCVEC_INT5 0x13 /* Int Level 5 (n/a if debug/NMI) */ +#define DPORT_RECORD_PDEBUGDATA_EXCVEC_INT6 0x14 /* Int Level 6 (n/a if debug/NMI) */ +/* register layout when bubble cycke cause is DPORT_RECORD_PDEBUGSTATUS_BBCAUSE_STALL: + * + * ITERDIV[19] : Iterative divide stall. + * ITERMUL[18] : Iterative multiply stall. + * BANKCONFL[16]: Bank-conflict stall. + * BPLOAD[15] : Bypass load stall. + * LSPROC[14] : Load/store miss-processing stall. + * L32R[13] : FastL32R stall. + * BPIFETCH[12] : Bypass I fetch stall. + * RUNSTALL[10] : RunStall. + * TIE[9] : TIE port stall. + * IPIF[8] : Instruction RAM inbound-PIF stall. + * IRAMBUSY[7] : Instruction RAM/ROM busy stall. + * ICM[6] : I-cache-miss stall. + * LSU[4] : The LSU will stall the pipeline under various local memory access conflict situations. + * DCM[3] : D-cache-miss stall. + * BUFFCONFL[2] : Store buffer conflict stall. + * BUFF[1] : Store buffer full stall. +*/ +#define DPORT_RECORD_PDEBUGDATA_STALL_ITERDIV (BIT(19)) +#define DPORT_RECORD_PDEBUGDATA_STALL_ITERMUL (BIT(18)) +#define DPORT_RECORD_PDEBUGDATA_STALL_BANKCONFL (BIT(16)) +#define DPORT_RECORD_PDEBUGDATA_STALL_BPLOAD (BIT(15)) +#define DPORT_RECORD_PDEBUGDATA_STALL_LSPROC (BIT(14)) +#define DPORT_RECORD_PDEBUGDATA_STALL_L32R (BIT(13)) +#define DPORT_RECORD_PDEBUGDATA_STALL_BPIFETCH (BIT(12)) +#define DPORT_RECORD_PDEBUGDATA_STALL_RUN (BIT(10)) +#define DPORT_RECORD_PDEBUGDATA_STALL_TIE (BIT(9)) +#define DPORT_RECORD_PDEBUGDATA_STALL_IPIF (BIT(8)) +#define DPORT_RECORD_PDEBUGDATA_STALL_IRAMBUSY (BIT(7)) +#define DPORT_RECORD_PDEBUGDATA_STALL_ICM (BIT(6)) +#define DPORT_RECORD_PDEBUGDATA_STALL_LSU (BIT(4)) +#define DPORT_RECORD_PDEBUGDATA_STALL_DCM (BIT(3)) +#define DPORT_RECORD_PDEBUGDATA_STALL_BUFFCONFL (BIT(2)) +#define DPORT_RECORD_PDEBUGDATA_STALL_BUFF (BIT(1)) +/* register layout for DPORT_RECORD_PDEBUGSTATUS_INSNTYPE_RWXSR: + * + * XSR[10] : XSR Instruction + * WSR[9] : WSR Instruction + * RSR[8] : RSR Instruction + * SR[7..0] : Special Register Number +*/ +#define DPORT_RECORD_PDEBUGDATA_INSNTYPE_XSR (BIT(10)) +#define DPORT_RECORD_PDEBUGDATA_INSNTYPE_WSR (BIT(9)) +#define DPORT_RECORD_PDEBUGDATA_INSNTYPE_RSR (BIT(8)) +#define DPORT_RECORD_PDEBUGDATA_INSNTYPE_SR_M ((DPORT_RECORD_PDEBUGDATA_INSNTYPE_SR_V)<<(DPORT_RECORD_PDEBUGDATA_INSNTYPE_SR_S)) +#define DPORT_RECORD_PDEBUGDATA_INSNTYPE_SR_V 0xFF +#define DPORT_RECORD_PDEBUGDATA_INSNTYPE_SR_S 0 +#define DPORT_RECORD_PDEBUGDATA_INSNTYPE_SR(_r_) (((_r_)>>DPORT_RECORD_PDEBUGDATA_INSNTYPE_SR_S) & DPORT_RECORD_PDEBUGDATA_INSNTYPE_SR_V) +/* register layout for DPORT_RECORD_PDEBUGSTATUS_INSNTYPE_RWER: + * + * ER[13..2]: ER Address + * WER[1] : WER Instruction + * RER[0] : RER Instruction +*/ +#define DPORT_RECORD_PDEBUGDATA_INSNTYPE_ER_M ((DPORT_RECORD_PDEBUGDATA_INSNTYPE_ER_V)<<(DPORT_RECORD_PDEBUGDATA_INSNTYPE_ER_S)) +#define DPORT_RECORD_PDEBUGDATA_INSNTYPE_ER_V 0xFFF +#define DPORT_RECORD_PDEBUGDATA_INSNTYPE_ER_S 2 +#define DPORT_RECORD_PDEBUGDATA_INSNTYPE_ER(_r_) (((_r_)>>DPORT_RECORD_PDEBUGDATA_INSNTYPE_ER_S) & DPORT_RECORD_PDEBUGDATA_INSNTYPE_ER_V) +#define DPORT_RECORD_PDEBUGDATA_INSNTYPE_WER (BIT(1)) +#define DPORT_RECORD_PDEBUGDATA_INSNTYPE_RER (BIT(0)) + + +#define DPORT_PRO_CPU_RECORD_PDEBUGPC_REG (DR_REG_DPORT_BASE + 0x458) +/* DPORT_RECORD_PRO_PDEBUGPC : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define DPORT_RECORD_PRO_PDEBUGPC 0xFFFFFFFF +#define DPORT_RECORD_PRO_PDEBUGPC_M ((DPORT_RECORD_PRO_PDEBUGPC_V)<<(DPORT_RECORD_PRO_PDEBUGPC_S)) +#define DPORT_RECORD_PRO_PDEBUGPC_V 0xFFFFFFFF +#define DPORT_RECORD_PRO_PDEBUGPC_S 0 + +#define DPORT_PRO_CPU_RECORD_PDEBUGLS0STAT_REG (DR_REG_DPORT_BASE + 0x45C) +/* DPORT_RECORD_PRO_PDEBUGLS0STAT : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define DPORT_RECORD_PRO_PDEBUGLS0STAT 0xFFFFFFFF +#define DPORT_RECORD_PRO_PDEBUGLS0STAT_M ((DPORT_RECORD_PRO_PDEBUGLS0STAT_V)<<(DPORT_RECORD_PRO_PDEBUGLS0STAT_S)) +#define DPORT_RECORD_PRO_PDEBUGLS0STAT_V 0xFFFFFFFF +#define DPORT_RECORD_PRO_PDEBUGLS0STAT_S 0 +/* register layout: + * TYPE [3..0] : Type of instruction in LS. + * SZ [7..4] : Operand size. + * DTLBM [8] : Data TLB miss. + * DCM [9] : D-cache miss. + * DCH [10] : D-cache hit. + * UC [12] : Uncached. + * WB [13] : Writeback. + * COH [16] : Coherency. + * STCOH [18..17]: Coherent state. + * TGT [23..20] : Local target. +*/ +#define DPORT_RECORD_PDEBUGLS0STAT_TYPE_M ((DPORT_RECORD_PDEBUGLS0STAT_TYPE_V)<<(DPORT_RECORD_PDEBUGLS0STAT_TYPE_S)) +#define DPORT_RECORD_PDEBUGLS0STAT_TYPE_V 0x0F +#define DPORT_RECORD_PDEBUGLS0STAT_TYPE_S 0 +#define DPORT_RECORD_PDEBUGLS0STAT_TYPE(_r_) (((_r_)>>DPORT_RECORD_PDEBUGLS0STAT_TYPE_S) & DPORT_RECORD_PDEBUGLS0STAT_TYPE_V) +#define DPORT_RECORD_PDEBUGLS0STAT_TYPE_NONE 0x00 /* neither */ +#define DPORT_RECORD_PDEBUGLS0STAT_TYPE_ITLBR 0x01 /* hw itlb refill */ +#define DPORT_RECORD_PDEBUGLS0STAT_TYPE_DTLBR 0x02 /* hw dtlb refill */ +#define DPORT_RECORD_PDEBUGLS0STAT_TYPE_LD 0x05 /* load */ +#define DPORT_RECORD_PDEBUGLS0STAT_TYPE_STR 0x06 /* store */ +#define DPORT_RECORD_PDEBUGLS0STAT_TYPE_L32R 0x08 /* l32r */ +#define DPORT_RECORD_PDEBUGLS0STAT_TYPE_S32CLI1 0x0A /* s32ci1 */ +#define DPORT_RECORD_PDEBUGLS0STAT_TYPE_CTI 0x0C /* cache test inst */ +#define DPORT_RECORD_PDEBUGLS0STAT_TYPE_RWXSR 0x0E /* rsr/wsr/xsr */ +#define DPORT_RECORD_PDEBUGLS0STAT_TYPE_RWER 0x0F /* rer/wer */ +#define DPORT_RECORD_PDEBUGLS0STAT_SZ_M ((DPORT_RECORD_PDEBUGLS0STAT_SZ_V)<<(DPORT_RECORD_PDEBUGLS0STAT_SZ_S)) +#define DPORT_RECORD_PDEBUGLS0STAT_SZ_V 0x0F +#define DPORT_RECORD_PDEBUGLS0STAT_SZ_S 4 +#define DPORT_RECORD_PDEBUGLS0STAT_SZ(_r_) (((_r_)>>DPORT_RECORD_PDEBUGLS0STAT_SZ_S) & DPORT_RECORD_PDEBUGLS0STAT_SZ_V) +#define DPORT_RECORD_PDEBUGLS0STAT_SZB(_r_) ((8<>DPORT_RECORD_PDEBUGLS0STAT_STCOH_S) & DPORT_RECORD_PDEBUGLS0STAT_STCOH_V) +#define DPORT_RECORD_PDEBUGLS0STAT_STCOH_NONE 0x0 /* neither shared nor exclusive nor modified */ +#define DPORT_RECORD_PDEBUGLS0STAT_STCOH_SHARED 0x1 /* shared */ +#define DPORT_RECORD_PDEBUGLS0STAT_STCOH_EXCL 0x2 /* exclusive */ +#define DPORT_RECORD_PDEBUGLS0STAT_STCOH_MOD 0x3 /* modified */ +#define DPORT_RECORD_PDEBUGLS0STAT_TGT_M ((DPORT_RECORD_PDEBUGLS0STAT_TGT_V)<<(DPORT_RECORD_PDEBUGLS0STAT_TGT_S)) +#define DPORT_RECORD_PDEBUGLS0STAT_TGT_V 0x0F +#define DPORT_RECORD_PDEBUGLS0STAT_TGT_S 20 +#define DPORT_RECORD_PDEBUGLS0STAT_TGT(_r_) (((_r_)>>DPORT_RECORD_PDEBUGLS0STAT_TGT_S) & DPORT_RECORD_PDEBUGLS0STAT_TGT_V) +#define DPORT_RECORD_PDEBUGLS0STAT_TGT_EXT 0x0 /* not to local memory */ +#define DPORT_RECORD_PDEBUGLS0STAT_TGT_IRAM0 0x2 /* 001x: InstRAM (0/1) */ +#define DPORT_RECORD_PDEBUGLS0STAT_TGT_IRAM1 0x3 /* 001x: InstRAM (0/1) */ +#define DPORT_RECORD_PDEBUGLS0STAT_TGT_IROM0 0x4 /* 010x: InstROM (0/1) */ +#define DPORT_RECORD_PDEBUGLS0STAT_TGT_IROM1 0x5 /* 010x: InstROM (0/1) */ +#define DPORT_RECORD_PDEBUGLS0STAT_TGT_DRAM0 0x0A /* 101x: DataRAM (0/1) */ +#define DPORT_RECORD_PDEBUGLS0STAT_TGT_DRAM1 0x0B /* 101x: DataRAM (0/1) */ +#define DPORT_RECORD_PDEBUGLS0STAT_TGT_DROM0 0xE /* 111x: DataROM (0/1) */ +#define DPORT_RECORD_PDEBUGLS0STAT_TGT_DROM1 0xF /* 111x: DataROM (0/1) */ +// #define DPORT_RECORD_PDEBUGLS0STAT_TGT_IRAM(_t_) (((_t_)&0xE)=0x2) /* 001x: InstRAM (0/1) */ +// #define DPORT_RECORD_PDEBUGLS0STAT_TGT_IROM(_t_) (((_t_)&0xE)=0x4) /* 010x: InstROM (0/1) */ +// #define DPORT_RECORD_PDEBUGLS0STAT_TGT_DRAM(_t_) (((_t_)&0xE)=0x2) /* 101x: DataRAM (0/1) */ +// #define DPORT_RECORD_PDEBUGLS0STAT_TGT_DROM(_t_) (((_t_)&0xE)=0x2) /* 111x: DataROM (0/1) */ + +#define DPORT_PRO_CPU_RECORD_PDEBUGLS0ADDR_REG (DR_REG_DPORT_BASE + 0x460) +/* DPORT_RECORD_PRO_PDEBUGLS0ADDR : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define DPORT_RECORD_PRO_PDEBUGLS0ADDR 0xFFFFFFFF +#define DPORT_RECORD_PRO_PDEBUGLS0ADDR_M ((DPORT_RECORD_PRO_PDEBUGLS0ADDR_V)<<(DPORT_RECORD_PRO_PDEBUGLS0ADDR_S)) +#define DPORT_RECORD_PRO_PDEBUGLS0ADDR_V 0xFFFFFFFF +#define DPORT_RECORD_PRO_PDEBUGLS0ADDR_S 0 + +#define DPORT_PRO_CPU_RECORD_PDEBUGLS0DATA_REG (DR_REG_DPORT_BASE + 0x464) +/* DPORT_RECORD_PRO_PDEBUGLS0DATA : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define DPORT_RECORD_PRO_PDEBUGLS0DATA 0xFFFFFFFF +#define DPORT_RECORD_PRO_PDEBUGLS0DATA_M ((DPORT_RECORD_PRO_PDEBUGLS0DATA_V)<<(DPORT_RECORD_PRO_PDEBUGLS0DATA_S)) +#define DPORT_RECORD_PRO_PDEBUGLS0DATA_V 0xFFFFFFFF +#define DPORT_RECORD_PRO_PDEBUGLS0DATA_S 0 + +#define DPORT_APP_CPU_RECORD_CTRL_REG (DR_REG_DPORT_BASE + 0x468) +/* DPORT_APP_CPU_PDEBUG_ENABLE : R/W ;bitpos:[8] ;default: 1'b1 ; */ +/*description: */ +#define DPORT_APP_CPU_PDEBUG_ENABLE (BIT(8)) +#define DPORT_APP_CPU_PDEBUG_ENABLE_M (BIT(8)) +#define DPORT_APP_CPU_PDEBUG_ENABLE_V 0x1 +#define DPORT_APP_CPU_PDEBUG_ENABLE_S 8 +/* DPORT_APP_CPU_RECORD_DISABLE : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_APP_CPU_RECORD_DISABLE (BIT(4)) +#define DPORT_APP_CPU_RECORD_DISABLE_M (BIT(4)) +#define DPORT_APP_CPU_RECORD_DISABLE_V 0x1 +#define DPORT_APP_CPU_RECORD_DISABLE_S 4 +/* DPORT_APP_CPU_RECORD_ENABLE : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_APP_CPU_RECORD_ENABLE (BIT(0)) +#define DPORT_APP_CPU_RECORD_ENABLE_M (BIT(0)) +#define DPORT_APP_CPU_RECORD_ENABLE_V 0x1 +#define DPORT_APP_CPU_RECORD_ENABLE_S 0 + +#define DPORT_APP_CPU_RECORD_STATUS_REG (DR_REG_DPORT_BASE + 0x46C) +/* DPORT_APP_CPU_RECORDING : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_APP_CPU_RECORDING (BIT(0)) +#define DPORT_APP_CPU_RECORDING_M (BIT(0)) +#define DPORT_APP_CPU_RECORDING_V 0x1 +#define DPORT_APP_CPU_RECORDING_S 0 + +#define DPORT_APP_CPU_RECORD_PID_REG (DR_REG_DPORT_BASE + 0x470) +/* DPORT_RECORD_APP_PID : RO ;bitpos:[2:0] ;default: 3'd0 ; */ +/*description: */ +#define DPORT_RECORD_APP_PID 0x00000007 +#define DPORT_RECORD_APP_PID_M ((DPORT_RECORD_APP_PID_V)<<(DPORT_RECORD_APP_PID_S)) +#define DPORT_RECORD_APP_PID_V 0x7 +#define DPORT_RECORD_APP_PID_S 0 + +#define DPORT_APP_CPU_RECORD_PDEBUGINST_REG (DR_REG_DPORT_BASE + 0x474) +/* DPORT_RECORD_APP_PDEBUGINST : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define DPORT_RECORD_APP_PDEBUGINST 0xFFFFFFFF +#define DPORT_RECORD_APP_PDEBUGINST_M ((DPORT_RECORD_APP_PDEBUGINST_V)<<(DPORT_RECORD_APP_PDEBUGINST_S)) +#define DPORT_RECORD_APP_PDEBUGINST_V 0xFFFFFFFF +#define DPORT_RECORD_APP_PDEBUGINST_S 0 + +#define DPORT_APP_CPU_RECORD_PDEBUGSTATUS_REG (DR_REG_DPORT_BASE + 0x478) +/* DPORT_RECORD_APP_PDEBUGSTATUS : RO ;bitpos:[7:0] ;default: 8'b0 ; */ +/*description: */ +#define DPORT_RECORD_APP_PDEBUGSTATUS 0x000000FF +#define DPORT_RECORD_APP_PDEBUGSTATUS_M ((DPORT_RECORD_APP_PDEBUGSTATUS_V)<<(DPORT_RECORD_APP_PDEBUGSTATUS_S)) +#define DPORT_RECORD_APP_PDEBUGSTATUS_V 0xFF +#define DPORT_RECORD_APP_PDEBUGSTATUS_S 0 + +#define DPORT_APP_CPU_RECORD_PDEBUGDATA_REG (DR_REG_DPORT_BASE + 0x47C) +/* DPORT_RECORD_APP_PDEBUGDATA : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define DPORT_RECORD_APP_PDEBUGDATA 0xFFFFFFFF +#define DPORT_RECORD_APP_PDEBUGDATA_M ((DPORT_RECORD_APP_PDEBUGDATA_V)<<(DPORT_RECORD_APP_PDEBUGDATA_S)) +#define DPORT_RECORD_APP_PDEBUGDATA_V 0xFFFFFFFF +#define DPORT_RECORD_APP_PDEBUGDATA_S 0 + +#define DPORT_APP_CPU_RECORD_PDEBUGPC_REG (DR_REG_DPORT_BASE + 0x480) +/* DPORT_RECORD_APP_PDEBUGPC : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define DPORT_RECORD_APP_PDEBUGPC 0xFFFFFFFF +#define DPORT_RECORD_APP_PDEBUGPC_M ((DPORT_RECORD_APP_PDEBUGPC_V)<<(DPORT_RECORD_APP_PDEBUGPC_S)) +#define DPORT_RECORD_APP_PDEBUGPC_V 0xFFFFFFFF +#define DPORT_RECORD_APP_PDEBUGPC_S 0 + +#define DPORT_APP_CPU_RECORD_PDEBUGLS0STAT_REG (DR_REG_DPORT_BASE + 0x484) +/* DPORT_RECORD_APP_PDEBUGLS0STAT : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define DPORT_RECORD_APP_PDEBUGLS0STAT 0xFFFFFFFF +#define DPORT_RECORD_APP_PDEBUGLS0STAT_M ((DPORT_RECORD_APP_PDEBUGLS0STAT_V)<<(DPORT_RECORD_APP_PDEBUGLS0STAT_S)) +#define DPORT_RECORD_APP_PDEBUGLS0STAT_V 0xFFFFFFFF +#define DPORT_RECORD_APP_PDEBUGLS0STAT_S 0 + +#define DPORT_APP_CPU_RECORD_PDEBUGLS0ADDR_REG (DR_REG_DPORT_BASE + 0x488) +/* DPORT_RECORD_APP_PDEBUGLS0ADDR : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define DPORT_RECORD_APP_PDEBUGLS0ADDR 0xFFFFFFFF +#define DPORT_RECORD_APP_PDEBUGLS0ADDR_M ((DPORT_RECORD_APP_PDEBUGLS0ADDR_V)<<(DPORT_RECORD_APP_PDEBUGLS0ADDR_S)) +#define DPORT_RECORD_APP_PDEBUGLS0ADDR_V 0xFFFFFFFF +#define DPORT_RECORD_APP_PDEBUGLS0ADDR_S 0 + +#define DPORT_APP_CPU_RECORD_PDEBUGLS0DATA_REG (DR_REG_DPORT_BASE + 0x48C) +/* DPORT_RECORD_APP_PDEBUGLS0DATA : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define DPORT_RECORD_APP_PDEBUGLS0DATA 0xFFFFFFFF +#define DPORT_RECORD_APP_PDEBUGLS0DATA_M ((DPORT_RECORD_APP_PDEBUGLS0DATA_V)<<(DPORT_RECORD_APP_PDEBUGLS0DATA_S)) +#define DPORT_RECORD_APP_PDEBUGLS0DATA_V 0xFFFFFFFF +#define DPORT_RECORD_APP_PDEBUGLS0DATA_S 0 + +#define DPORT_RSA_PD_CTRL_REG (DR_REG_DPORT_BASE + 0x490) +/* DPORT_RSA_PD : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_RSA_PD (BIT(0)) +#define DPORT_RSA_PD_M (BIT(0)) +#define DPORT_RSA_PD_V 0x1 +#define DPORT_RSA_PD_S 0 + +#define DPORT_ROM_MPU_TABLE0_REG (DR_REG_DPORT_BASE + 0x494) +/* DPORT_ROM_MPU_TABLE0 : R/W ;bitpos:[1:0] ;default: 2'b1 ; */ +/*description: */ +#define DPORT_ROM_MPU_TABLE0 0x00000003 +#define DPORT_ROM_MPU_TABLE0_M ((DPORT_ROM_MPU_TABLE0_V)<<(DPORT_ROM_MPU_TABLE0_S)) +#define DPORT_ROM_MPU_TABLE0_V 0x3 +#define DPORT_ROM_MPU_TABLE0_S 0 + +#define DPORT_ROM_MPU_TABLE1_REG (DR_REG_DPORT_BASE + 0x498) +/* DPORT_ROM_MPU_TABLE1 : R/W ;bitpos:[1:0] ;default: 2'b1 ; */ +/*description: */ +#define DPORT_ROM_MPU_TABLE1 0x00000003 +#define DPORT_ROM_MPU_TABLE1_M ((DPORT_ROM_MPU_TABLE1_V)<<(DPORT_ROM_MPU_TABLE1_S)) +#define DPORT_ROM_MPU_TABLE1_V 0x3 +#define DPORT_ROM_MPU_TABLE1_S 0 + +#define DPORT_ROM_MPU_TABLE2_REG (DR_REG_DPORT_BASE + 0x49C) +/* DPORT_ROM_MPU_TABLE2 : R/W ;bitpos:[1:0] ;default: 2'b1 ; */ +/*description: */ +#define DPORT_ROM_MPU_TABLE2 0x00000003 +#define DPORT_ROM_MPU_TABLE2_M ((DPORT_ROM_MPU_TABLE2_V)<<(DPORT_ROM_MPU_TABLE2_S)) +#define DPORT_ROM_MPU_TABLE2_V 0x3 +#define DPORT_ROM_MPU_TABLE2_S 0 + +#define DPORT_ROM_MPU_TABLE3_REG (DR_REG_DPORT_BASE + 0x4A0) +/* DPORT_ROM_MPU_TABLE3 : R/W ;bitpos:[1:0] ;default: 2'b1 ; */ +/*description: */ +#define DPORT_ROM_MPU_TABLE3 0x00000003 +#define DPORT_ROM_MPU_TABLE3_M ((DPORT_ROM_MPU_TABLE3_V)<<(DPORT_ROM_MPU_TABLE3_S)) +#define DPORT_ROM_MPU_TABLE3_V 0x3 +#define DPORT_ROM_MPU_TABLE3_S 0 + +#define DPORT_SHROM_MPU_TABLE0_REG (DR_REG_DPORT_BASE + 0x4A4) +/* DPORT_SHROM_MPU_TABLE0 : R/W ;bitpos:[1:0] ;default: 2'b1 ; */ +/*description: */ +#define DPORT_SHROM_MPU_TABLE0 0x00000003 +#define DPORT_SHROM_MPU_TABLE0_M ((DPORT_SHROM_MPU_TABLE0_V)<<(DPORT_SHROM_MPU_TABLE0_S)) +#define DPORT_SHROM_MPU_TABLE0_V 0x3 +#define DPORT_SHROM_MPU_TABLE0_S 0 + +#define DPORT_SHROM_MPU_TABLE1_REG (DR_REG_DPORT_BASE + 0x4A8) +/* DPORT_SHROM_MPU_TABLE1 : R/W ;bitpos:[1:0] ;default: 2'b1 ; */ +/*description: */ +#define DPORT_SHROM_MPU_TABLE1 0x00000003 +#define DPORT_SHROM_MPU_TABLE1_M ((DPORT_SHROM_MPU_TABLE1_V)<<(DPORT_SHROM_MPU_TABLE1_S)) +#define DPORT_SHROM_MPU_TABLE1_V 0x3 +#define DPORT_SHROM_MPU_TABLE1_S 0 + +#define DPORT_SHROM_MPU_TABLE2_REG (DR_REG_DPORT_BASE + 0x4AC) +/* DPORT_SHROM_MPU_TABLE2 : R/W ;bitpos:[1:0] ;default: 2'b1 ; */ +/*description: */ +#define DPORT_SHROM_MPU_TABLE2 0x00000003 +#define DPORT_SHROM_MPU_TABLE2_M ((DPORT_SHROM_MPU_TABLE2_V)<<(DPORT_SHROM_MPU_TABLE2_S)) +#define DPORT_SHROM_MPU_TABLE2_V 0x3 +#define DPORT_SHROM_MPU_TABLE2_S 0 + +#define DPORT_SHROM_MPU_TABLE3_REG (DR_REG_DPORT_BASE + 0x4B0) +/* DPORT_SHROM_MPU_TABLE3 : R/W ;bitpos:[1:0] ;default: 2'b1 ; */ +/*description: */ +#define DPORT_SHROM_MPU_TABLE3 0x00000003 +#define DPORT_SHROM_MPU_TABLE3_M ((DPORT_SHROM_MPU_TABLE3_V)<<(DPORT_SHROM_MPU_TABLE3_S)) +#define DPORT_SHROM_MPU_TABLE3_V 0x3 +#define DPORT_SHROM_MPU_TABLE3_S 0 + +#define DPORT_SHROM_MPU_TABLE4_REG (DR_REG_DPORT_BASE + 0x4B4) +/* DPORT_SHROM_MPU_TABLE4 : R/W ;bitpos:[1:0] ;default: 2'b1 ; */ +/*description: */ +#define DPORT_SHROM_MPU_TABLE4 0x00000003 +#define DPORT_SHROM_MPU_TABLE4_M ((DPORT_SHROM_MPU_TABLE4_V)<<(DPORT_SHROM_MPU_TABLE4_S)) +#define DPORT_SHROM_MPU_TABLE4_V 0x3 +#define DPORT_SHROM_MPU_TABLE4_S 0 + +#define DPORT_SHROM_MPU_TABLE5_REG (DR_REG_DPORT_BASE + 0x4B8) +/* DPORT_SHROM_MPU_TABLE5 : R/W ;bitpos:[1:0] ;default: 2'b1 ; */ +/*description: */ +#define DPORT_SHROM_MPU_TABLE5 0x00000003 +#define DPORT_SHROM_MPU_TABLE5_M ((DPORT_SHROM_MPU_TABLE5_V)<<(DPORT_SHROM_MPU_TABLE5_S)) +#define DPORT_SHROM_MPU_TABLE5_V 0x3 +#define DPORT_SHROM_MPU_TABLE5_S 0 + +#define DPORT_SHROM_MPU_TABLE6_REG (DR_REG_DPORT_BASE + 0x4BC) +/* DPORT_SHROM_MPU_TABLE6 : R/W ;bitpos:[1:0] ;default: 2'b1 ; */ +/*description: */ +#define DPORT_SHROM_MPU_TABLE6 0x00000003 +#define DPORT_SHROM_MPU_TABLE6_M ((DPORT_SHROM_MPU_TABLE6_V)<<(DPORT_SHROM_MPU_TABLE6_S)) +#define DPORT_SHROM_MPU_TABLE6_V 0x3 +#define DPORT_SHROM_MPU_TABLE6_S 0 + +#define DPORT_SHROM_MPU_TABLE7_REG (DR_REG_DPORT_BASE + 0x4C0) +/* DPORT_SHROM_MPU_TABLE7 : R/W ;bitpos:[1:0] ;default: 2'b1 ; */ +/*description: */ +#define DPORT_SHROM_MPU_TABLE7 0x00000003 +#define DPORT_SHROM_MPU_TABLE7_M ((DPORT_SHROM_MPU_TABLE7_V)<<(DPORT_SHROM_MPU_TABLE7_S)) +#define DPORT_SHROM_MPU_TABLE7_V 0x3 +#define DPORT_SHROM_MPU_TABLE7_S 0 + +#define DPORT_SHROM_MPU_TABLE8_REG (DR_REG_DPORT_BASE + 0x4C4) +/* DPORT_SHROM_MPU_TABLE8 : R/W ;bitpos:[1:0] ;default: 2'b1 ; */ +/*description: */ +#define DPORT_SHROM_MPU_TABLE8 0x00000003 +#define DPORT_SHROM_MPU_TABLE8_M ((DPORT_SHROM_MPU_TABLE8_V)<<(DPORT_SHROM_MPU_TABLE8_S)) +#define DPORT_SHROM_MPU_TABLE8_V 0x3 +#define DPORT_SHROM_MPU_TABLE8_S 0 + +#define DPORT_SHROM_MPU_TABLE9_REG (DR_REG_DPORT_BASE + 0x4C8) +/* DPORT_SHROM_MPU_TABLE9 : R/W ;bitpos:[1:0] ;default: 2'b1 ; */ +/*description: */ +#define DPORT_SHROM_MPU_TABLE9 0x00000003 +#define DPORT_SHROM_MPU_TABLE9_M ((DPORT_SHROM_MPU_TABLE9_V)<<(DPORT_SHROM_MPU_TABLE9_S)) +#define DPORT_SHROM_MPU_TABLE9_V 0x3 +#define DPORT_SHROM_MPU_TABLE9_S 0 + +#define DPORT_SHROM_MPU_TABLE10_REG (DR_REG_DPORT_BASE + 0x4CC) +/* DPORT_SHROM_MPU_TABLE10 : R/W ;bitpos:[1:0] ;default: 2'b1 ; */ +/*description: */ +#define DPORT_SHROM_MPU_TABLE10 0x00000003 +#define DPORT_SHROM_MPU_TABLE10_M ((DPORT_SHROM_MPU_TABLE10_V)<<(DPORT_SHROM_MPU_TABLE10_S)) +#define DPORT_SHROM_MPU_TABLE10_V 0x3 +#define DPORT_SHROM_MPU_TABLE10_S 0 + +#define DPORT_SHROM_MPU_TABLE11_REG (DR_REG_DPORT_BASE + 0x4D0) +/* DPORT_SHROM_MPU_TABLE11 : R/W ;bitpos:[1:0] ;default: 2'b1 ; */ +/*description: */ +#define DPORT_SHROM_MPU_TABLE11 0x00000003 +#define DPORT_SHROM_MPU_TABLE11_M ((DPORT_SHROM_MPU_TABLE11_V)<<(DPORT_SHROM_MPU_TABLE11_S)) +#define DPORT_SHROM_MPU_TABLE11_V 0x3 +#define DPORT_SHROM_MPU_TABLE11_S 0 + +#define DPORT_SHROM_MPU_TABLE12_REG (DR_REG_DPORT_BASE + 0x4D4) +/* DPORT_SHROM_MPU_TABLE12 : R/W ;bitpos:[1:0] ;default: 2'b1 ; */ +/*description: */ +#define DPORT_SHROM_MPU_TABLE12 0x00000003 +#define DPORT_SHROM_MPU_TABLE12_M ((DPORT_SHROM_MPU_TABLE12_V)<<(DPORT_SHROM_MPU_TABLE12_S)) +#define DPORT_SHROM_MPU_TABLE12_V 0x3 +#define DPORT_SHROM_MPU_TABLE12_S 0 + +#define DPORT_SHROM_MPU_TABLE13_REG (DR_REG_DPORT_BASE + 0x4D8) +/* DPORT_SHROM_MPU_TABLE13 : R/W ;bitpos:[1:0] ;default: 2'b1 ; */ +/*description: */ +#define DPORT_SHROM_MPU_TABLE13 0x00000003 +#define DPORT_SHROM_MPU_TABLE13_M ((DPORT_SHROM_MPU_TABLE13_V)<<(DPORT_SHROM_MPU_TABLE13_S)) +#define DPORT_SHROM_MPU_TABLE13_V 0x3 +#define DPORT_SHROM_MPU_TABLE13_S 0 + +#define DPORT_SHROM_MPU_TABLE14_REG (DR_REG_DPORT_BASE + 0x4DC) +/* DPORT_SHROM_MPU_TABLE14 : R/W ;bitpos:[1:0] ;default: 2'b1 ; */ +/*description: */ +#define DPORT_SHROM_MPU_TABLE14 0x00000003 +#define DPORT_SHROM_MPU_TABLE14_M ((DPORT_SHROM_MPU_TABLE14_V)<<(DPORT_SHROM_MPU_TABLE14_S)) +#define DPORT_SHROM_MPU_TABLE14_V 0x3 +#define DPORT_SHROM_MPU_TABLE14_S 0 + +#define DPORT_SHROM_MPU_TABLE15_REG (DR_REG_DPORT_BASE + 0x4E0) +/* DPORT_SHROM_MPU_TABLE15 : R/W ;bitpos:[1:0] ;default: 2'b1 ; */ +/*description: */ +#define DPORT_SHROM_MPU_TABLE15 0x00000003 +#define DPORT_SHROM_MPU_TABLE15_M ((DPORT_SHROM_MPU_TABLE15_V)<<(DPORT_SHROM_MPU_TABLE15_S)) +#define DPORT_SHROM_MPU_TABLE15_V 0x3 +#define DPORT_SHROM_MPU_TABLE15_S 0 + +#define DPORT_SHROM_MPU_TABLE16_REG (DR_REG_DPORT_BASE + 0x4E4) +/* DPORT_SHROM_MPU_TABLE16 : R/W ;bitpos:[1:0] ;default: 2'b1 ; */ +/*description: */ +#define DPORT_SHROM_MPU_TABLE16 0x00000003 +#define DPORT_SHROM_MPU_TABLE16_M ((DPORT_SHROM_MPU_TABLE16_V)<<(DPORT_SHROM_MPU_TABLE16_S)) +#define DPORT_SHROM_MPU_TABLE16_V 0x3 +#define DPORT_SHROM_MPU_TABLE16_S 0 + +#define DPORT_SHROM_MPU_TABLE17_REG (DR_REG_DPORT_BASE + 0x4E8) +/* DPORT_SHROM_MPU_TABLE17 : R/W ;bitpos:[1:0] ;default: 2'b1 ; */ +/*description: */ +#define DPORT_SHROM_MPU_TABLE17 0x00000003 +#define DPORT_SHROM_MPU_TABLE17_M ((DPORT_SHROM_MPU_TABLE17_V)<<(DPORT_SHROM_MPU_TABLE17_S)) +#define DPORT_SHROM_MPU_TABLE17_V 0x3 +#define DPORT_SHROM_MPU_TABLE17_S 0 + +#define DPORT_SHROM_MPU_TABLE18_REG (DR_REG_DPORT_BASE + 0x4EC) +/* DPORT_SHROM_MPU_TABLE18 : R/W ;bitpos:[1:0] ;default: 2'b1 ; */ +/*description: */ +#define DPORT_SHROM_MPU_TABLE18 0x00000003 +#define DPORT_SHROM_MPU_TABLE18_M ((DPORT_SHROM_MPU_TABLE18_V)<<(DPORT_SHROM_MPU_TABLE18_S)) +#define DPORT_SHROM_MPU_TABLE18_V 0x3 +#define DPORT_SHROM_MPU_TABLE18_S 0 + +#define DPORT_SHROM_MPU_TABLE19_REG (DR_REG_DPORT_BASE + 0x4F0) +/* DPORT_SHROM_MPU_TABLE19 : R/W ;bitpos:[1:0] ;default: 2'b1 ; */ +/*description: */ +#define DPORT_SHROM_MPU_TABLE19 0x00000003 +#define DPORT_SHROM_MPU_TABLE19_M ((DPORT_SHROM_MPU_TABLE19_V)<<(DPORT_SHROM_MPU_TABLE19_S)) +#define DPORT_SHROM_MPU_TABLE19_V 0x3 +#define DPORT_SHROM_MPU_TABLE19_S 0 + +#define DPORT_SHROM_MPU_TABLE20_REG (DR_REG_DPORT_BASE + 0x4F4) +/* DPORT_SHROM_MPU_TABLE20 : R/W ;bitpos:[1:0] ;default: 2'b1 ; */ +/*description: */ +#define DPORT_SHROM_MPU_TABLE20 0x00000003 +#define DPORT_SHROM_MPU_TABLE20_M ((DPORT_SHROM_MPU_TABLE20_V)<<(DPORT_SHROM_MPU_TABLE20_S)) +#define DPORT_SHROM_MPU_TABLE20_V 0x3 +#define DPORT_SHROM_MPU_TABLE20_S 0 + +#define DPORT_SHROM_MPU_TABLE21_REG (DR_REG_DPORT_BASE + 0x4F8) +/* DPORT_SHROM_MPU_TABLE21 : R/W ;bitpos:[1:0] ;default: 2'b1 ; */ +/*description: */ +#define DPORT_SHROM_MPU_TABLE21 0x00000003 +#define DPORT_SHROM_MPU_TABLE21_M ((DPORT_SHROM_MPU_TABLE21_V)<<(DPORT_SHROM_MPU_TABLE21_S)) +#define DPORT_SHROM_MPU_TABLE21_V 0x3 +#define DPORT_SHROM_MPU_TABLE21_S 0 + +#define DPORT_SHROM_MPU_TABLE22_REG (DR_REG_DPORT_BASE + 0x4FC) +/* DPORT_SHROM_MPU_TABLE22 : R/W ;bitpos:[1:0] ;default: 2'b1 ; */ +/*description: */ +#define DPORT_SHROM_MPU_TABLE22 0x00000003 +#define DPORT_SHROM_MPU_TABLE22_M ((DPORT_SHROM_MPU_TABLE22_V)<<(DPORT_SHROM_MPU_TABLE22_S)) +#define DPORT_SHROM_MPU_TABLE22_V 0x3 +#define DPORT_SHROM_MPU_TABLE22_S 0 + +#define DPORT_SHROM_MPU_TABLE23_REG (DR_REG_DPORT_BASE + 0x500) +/* DPORT_SHROM_MPU_TABLE23 : R/W ;bitpos:[1:0] ;default: 2'b1 ; */ +/*description: */ +#define DPORT_SHROM_MPU_TABLE23 0x00000003 +#define DPORT_SHROM_MPU_TABLE23_M ((DPORT_SHROM_MPU_TABLE23_V)<<(DPORT_SHROM_MPU_TABLE23_S)) +#define DPORT_SHROM_MPU_TABLE23_V 0x3 +#define DPORT_SHROM_MPU_TABLE23_S 0 + +#define DPORT_IMMU_TABLE0_REG (DR_REG_DPORT_BASE + 0x504) +/* DPORT_IMMU_TABLE0 : R/W ;bitpos:[6:0] ;default: 7'd0 ; */ +/*description: */ +#define DPORT_IMMU_TABLE0 0x0000007F +#define DPORT_IMMU_TABLE0_M ((DPORT_IMMU_TABLE0_V)<<(DPORT_IMMU_TABLE0_S)) +#define DPORT_IMMU_TABLE0_V 0x7F +#define DPORT_IMMU_TABLE0_S 0 + +#define DPORT_IMMU_TABLE1_REG (DR_REG_DPORT_BASE + 0x508) +/* DPORT_IMMU_TABLE1 : R/W ;bitpos:[6:0] ;default: 7'd1 ; */ +/*description: */ +#define DPORT_IMMU_TABLE1 0x0000007F +#define DPORT_IMMU_TABLE1_M ((DPORT_IMMU_TABLE1_V)<<(DPORT_IMMU_TABLE1_S)) +#define DPORT_IMMU_TABLE1_V 0x7F +#define DPORT_IMMU_TABLE1_S 0 + +#define DPORT_IMMU_TABLE2_REG (DR_REG_DPORT_BASE + 0x50C) +/* DPORT_IMMU_TABLE2 : R/W ;bitpos:[6:0] ;default: 7'd2 ; */ +/*description: */ +#define DPORT_IMMU_TABLE2 0x0000007F +#define DPORT_IMMU_TABLE2_M ((DPORT_IMMU_TABLE2_V)<<(DPORT_IMMU_TABLE2_S)) +#define DPORT_IMMU_TABLE2_V 0x7F +#define DPORT_IMMU_TABLE2_S 0 + +#define DPORT_IMMU_TABLE3_REG (DR_REG_DPORT_BASE + 0x510) +/* DPORT_IMMU_TABLE3 : R/W ;bitpos:[6:0] ;default: 7'd3 ; */ +/*description: */ +#define DPORT_IMMU_TABLE3 0x0000007F +#define DPORT_IMMU_TABLE3_M ((DPORT_IMMU_TABLE3_V)<<(DPORT_IMMU_TABLE3_S)) +#define DPORT_IMMU_TABLE3_V 0x7F +#define DPORT_IMMU_TABLE3_S 0 + +#define DPORT_IMMU_TABLE4_REG (DR_REG_DPORT_BASE + 0x514) +/* DPORT_IMMU_TABLE4 : R/W ;bitpos:[6:0] ;default: 7'd4 ; */ +/*description: */ +#define DPORT_IMMU_TABLE4 0x0000007F +#define DPORT_IMMU_TABLE4_M ((DPORT_IMMU_TABLE4_V)<<(DPORT_IMMU_TABLE4_S)) +#define DPORT_IMMU_TABLE4_V 0x7F +#define DPORT_IMMU_TABLE4_S 0 + +#define DPORT_IMMU_TABLE5_REG (DR_REG_DPORT_BASE + 0x518) +/* DPORT_IMMU_TABLE5 : R/W ;bitpos:[6:0] ;default: 7'd5 ; */ +/*description: */ +#define DPORT_IMMU_TABLE5 0x0000007F +#define DPORT_IMMU_TABLE5_M ((DPORT_IMMU_TABLE5_V)<<(DPORT_IMMU_TABLE5_S)) +#define DPORT_IMMU_TABLE5_V 0x7F +#define DPORT_IMMU_TABLE5_S 0 + +#define DPORT_IMMU_TABLE6_REG (DR_REG_DPORT_BASE + 0x51C) +/* DPORT_IMMU_TABLE6 : R/W ;bitpos:[6:0] ;default: 7'd6 ; */ +/*description: */ +#define DPORT_IMMU_TABLE6 0x0000007F +#define DPORT_IMMU_TABLE6_M ((DPORT_IMMU_TABLE6_V)<<(DPORT_IMMU_TABLE6_S)) +#define DPORT_IMMU_TABLE6_V 0x7F +#define DPORT_IMMU_TABLE6_S 0 + +#define DPORT_IMMU_TABLE7_REG (DR_REG_DPORT_BASE + 0x520) +/* DPORT_IMMU_TABLE7 : R/W ;bitpos:[6:0] ;default: 7'd7 ; */ +/*description: */ +#define DPORT_IMMU_TABLE7 0x0000007F +#define DPORT_IMMU_TABLE7_M ((DPORT_IMMU_TABLE7_V)<<(DPORT_IMMU_TABLE7_S)) +#define DPORT_IMMU_TABLE7_V 0x7F +#define DPORT_IMMU_TABLE7_S 0 + +#define DPORT_IMMU_TABLE8_REG (DR_REG_DPORT_BASE + 0x524) +/* DPORT_IMMU_TABLE8 : R/W ;bitpos:[6:0] ;default: 7'd8 ; */ +/*description: */ +#define DPORT_IMMU_TABLE8 0x0000007F +#define DPORT_IMMU_TABLE8_M ((DPORT_IMMU_TABLE8_V)<<(DPORT_IMMU_TABLE8_S)) +#define DPORT_IMMU_TABLE8_V 0x7F +#define DPORT_IMMU_TABLE8_S 0 + +#define DPORT_IMMU_TABLE9_REG (DR_REG_DPORT_BASE + 0x528) +/* DPORT_IMMU_TABLE9 : R/W ;bitpos:[6:0] ;default: 7'd9 ; */ +/*description: */ +#define DPORT_IMMU_TABLE9 0x0000007F +#define DPORT_IMMU_TABLE9_M ((DPORT_IMMU_TABLE9_V)<<(DPORT_IMMU_TABLE9_S)) +#define DPORT_IMMU_TABLE9_V 0x7F +#define DPORT_IMMU_TABLE9_S 0 + +#define DPORT_IMMU_TABLE10_REG (DR_REG_DPORT_BASE + 0x52C) +/* DPORT_IMMU_TABLE10 : R/W ;bitpos:[6:0] ;default: 7'd10 ; */ +/*description: */ +#define DPORT_IMMU_TABLE10 0x0000007F +#define DPORT_IMMU_TABLE10_M ((DPORT_IMMU_TABLE10_V)<<(DPORT_IMMU_TABLE10_S)) +#define DPORT_IMMU_TABLE10_V 0x7F +#define DPORT_IMMU_TABLE10_S 0 + +#define DPORT_IMMU_TABLE11_REG (DR_REG_DPORT_BASE + 0x530) +/* DPORT_IMMU_TABLE11 : R/W ;bitpos:[6:0] ;default: 7'd11 ; */ +/*description: */ +#define DPORT_IMMU_TABLE11 0x0000007F +#define DPORT_IMMU_TABLE11_M ((DPORT_IMMU_TABLE11_V)<<(DPORT_IMMU_TABLE11_S)) +#define DPORT_IMMU_TABLE11_V 0x7F +#define DPORT_IMMU_TABLE11_S 0 + +#define DPORT_IMMU_TABLE12_REG (DR_REG_DPORT_BASE + 0x534) +/* DPORT_IMMU_TABLE12 : R/W ;bitpos:[6:0] ;default: 7'd12 ; */ +/*description: */ +#define DPORT_IMMU_TABLE12 0x0000007F +#define DPORT_IMMU_TABLE12_M ((DPORT_IMMU_TABLE12_V)<<(DPORT_IMMU_TABLE12_S)) +#define DPORT_IMMU_TABLE12_V 0x7F +#define DPORT_IMMU_TABLE12_S 0 + +#define DPORT_IMMU_TABLE13_REG (DR_REG_DPORT_BASE + 0x538) +/* DPORT_IMMU_TABLE13 : R/W ;bitpos:[6:0] ;default: 7'd13 ; */ +/*description: */ +#define DPORT_IMMU_TABLE13 0x0000007F +#define DPORT_IMMU_TABLE13_M ((DPORT_IMMU_TABLE13_V)<<(DPORT_IMMU_TABLE13_S)) +#define DPORT_IMMU_TABLE13_V 0x7F +#define DPORT_IMMU_TABLE13_S 0 + +#define DPORT_IMMU_TABLE14_REG (DR_REG_DPORT_BASE + 0x53C) +/* DPORT_IMMU_TABLE14 : R/W ;bitpos:[6:0] ;default: 7'd14 ; */ +/*description: */ +#define DPORT_IMMU_TABLE14 0x0000007F +#define DPORT_IMMU_TABLE14_M ((DPORT_IMMU_TABLE14_V)<<(DPORT_IMMU_TABLE14_S)) +#define DPORT_IMMU_TABLE14_V 0x7F +#define DPORT_IMMU_TABLE14_S 0 + +#define DPORT_IMMU_TABLE15_REG (DR_REG_DPORT_BASE + 0x540) +/* DPORT_IMMU_TABLE15 : R/W ;bitpos:[6:0] ;default: 7'd15 ; */ +/*description: */ +#define DPORT_IMMU_TABLE15 0x0000007F +#define DPORT_IMMU_TABLE15_M ((DPORT_IMMU_TABLE15_V)<<(DPORT_IMMU_TABLE15_S)) +#define DPORT_IMMU_TABLE15_V 0x7F +#define DPORT_IMMU_TABLE15_S 0 + +#define DPORT_DMMU_TABLE0_REG (DR_REG_DPORT_BASE + 0x544) +/* DPORT_DMMU_TABLE0 : R/W ;bitpos:[6:0] ;default: 7'd0 ; */ +/*description: */ +#define DPORT_DMMU_TABLE0 0x0000007F +#define DPORT_DMMU_TABLE0_M ((DPORT_DMMU_TABLE0_V)<<(DPORT_DMMU_TABLE0_S)) +#define DPORT_DMMU_TABLE0_V 0x7F +#define DPORT_DMMU_TABLE0_S 0 + +#define DPORT_DMMU_TABLE1_REG (DR_REG_DPORT_BASE + 0x548) +/* DPORT_DMMU_TABLE1 : R/W ;bitpos:[6:0] ;default: 7'd1 ; */ +/*description: */ +#define DPORT_DMMU_TABLE1 0x0000007F +#define DPORT_DMMU_TABLE1_M ((DPORT_DMMU_TABLE1_V)<<(DPORT_DMMU_TABLE1_S)) +#define DPORT_DMMU_TABLE1_V 0x7F +#define DPORT_DMMU_TABLE1_S 0 + +#define DPORT_DMMU_TABLE2_REG (DR_REG_DPORT_BASE + 0x54C) +/* DPORT_DMMU_TABLE2 : R/W ;bitpos:[6:0] ;default: 7'd2 ; */ +/*description: */ +#define DPORT_DMMU_TABLE2 0x0000007F +#define DPORT_DMMU_TABLE2_M ((DPORT_DMMU_TABLE2_V)<<(DPORT_DMMU_TABLE2_S)) +#define DPORT_DMMU_TABLE2_V 0x7F +#define DPORT_DMMU_TABLE2_S 0 + +#define DPORT_DMMU_TABLE3_REG (DR_REG_DPORT_BASE + 0x550) +/* DPORT_DMMU_TABLE3 : R/W ;bitpos:[6:0] ;default: 7'd3 ; */ +/*description: */ +#define DPORT_DMMU_TABLE3 0x0000007F +#define DPORT_DMMU_TABLE3_M ((DPORT_DMMU_TABLE3_V)<<(DPORT_DMMU_TABLE3_S)) +#define DPORT_DMMU_TABLE3_V 0x7F +#define DPORT_DMMU_TABLE3_S 0 + +#define DPORT_DMMU_TABLE4_REG (DR_REG_DPORT_BASE + 0x554) +/* DPORT_DMMU_TABLE4 : R/W ;bitpos:[6:0] ;default: 7'd4 ; */ +/*description: */ +#define DPORT_DMMU_TABLE4 0x0000007F +#define DPORT_DMMU_TABLE4_M ((DPORT_DMMU_TABLE4_V)<<(DPORT_DMMU_TABLE4_S)) +#define DPORT_DMMU_TABLE4_V 0x7F +#define DPORT_DMMU_TABLE4_S 0 + +#define DPORT_DMMU_TABLE5_REG (DR_REG_DPORT_BASE + 0x558) +/* DPORT_DMMU_TABLE5 : R/W ;bitpos:[6:0] ;default: 7'd5 ; */ +/*description: */ +#define DPORT_DMMU_TABLE5 0x0000007F +#define DPORT_DMMU_TABLE5_M ((DPORT_DMMU_TABLE5_V)<<(DPORT_DMMU_TABLE5_S)) +#define DPORT_DMMU_TABLE5_V 0x7F +#define DPORT_DMMU_TABLE5_S 0 + +#define DPORT_DMMU_TABLE6_REG (DR_REG_DPORT_BASE + 0x55C) +/* DPORT_DMMU_TABLE6 : R/W ;bitpos:[6:0] ;default: 7'd6 ; */ +/*description: */ +#define DPORT_DMMU_TABLE6 0x0000007F +#define DPORT_DMMU_TABLE6_M ((DPORT_DMMU_TABLE6_V)<<(DPORT_DMMU_TABLE6_S)) +#define DPORT_DMMU_TABLE6_V 0x7F +#define DPORT_DMMU_TABLE6_S 0 + +#define DPORT_DMMU_TABLE7_REG (DR_REG_DPORT_BASE + 0x560) +/* DPORT_DMMU_TABLE7 : R/W ;bitpos:[6:0] ;default: 7'd7 ; */ +/*description: */ +#define DPORT_DMMU_TABLE7 0x0000007F +#define DPORT_DMMU_TABLE7_M ((DPORT_DMMU_TABLE7_V)<<(DPORT_DMMU_TABLE7_S)) +#define DPORT_DMMU_TABLE7_V 0x7F +#define DPORT_DMMU_TABLE7_S 0 + +#define DPORT_DMMU_TABLE8_REG (DR_REG_DPORT_BASE + 0x564) +/* DPORT_DMMU_TABLE8 : R/W ;bitpos:[6:0] ;default: 7'd8 ; */ +/*description: */ +#define DPORT_DMMU_TABLE8 0x0000007F +#define DPORT_DMMU_TABLE8_M ((DPORT_DMMU_TABLE8_V)<<(DPORT_DMMU_TABLE8_S)) +#define DPORT_DMMU_TABLE8_V 0x7F +#define DPORT_DMMU_TABLE8_S 0 + +#define DPORT_DMMU_TABLE9_REG (DR_REG_DPORT_BASE + 0x568) +/* DPORT_DMMU_TABLE9 : R/W ;bitpos:[6:0] ;default: 7'd9 ; */ +/*description: */ +#define DPORT_DMMU_TABLE9 0x0000007F +#define DPORT_DMMU_TABLE9_M ((DPORT_DMMU_TABLE9_V)<<(DPORT_DMMU_TABLE9_S)) +#define DPORT_DMMU_TABLE9_V 0x7F +#define DPORT_DMMU_TABLE9_S 0 + +#define DPORT_DMMU_TABLE10_REG (DR_REG_DPORT_BASE + 0x56C) +/* DPORT_DMMU_TABLE10 : R/W ;bitpos:[6:0] ;default: 7'd10 ; */ +/*description: */ +#define DPORT_DMMU_TABLE10 0x0000007F +#define DPORT_DMMU_TABLE10_M ((DPORT_DMMU_TABLE10_V)<<(DPORT_DMMU_TABLE10_S)) +#define DPORT_DMMU_TABLE10_V 0x7F +#define DPORT_DMMU_TABLE10_S 0 + +#define DPORT_DMMU_TABLE11_REG (DR_REG_DPORT_BASE + 0x570) +/* DPORT_DMMU_TABLE11 : R/W ;bitpos:[6:0] ;default: 7'd11 ; */ +/*description: */ +#define DPORT_DMMU_TABLE11 0x0000007F +#define DPORT_DMMU_TABLE11_M ((DPORT_DMMU_TABLE11_V)<<(DPORT_DMMU_TABLE11_S)) +#define DPORT_DMMU_TABLE11_V 0x7F +#define DPORT_DMMU_TABLE11_S 0 + +#define DPORT_DMMU_TABLE12_REG (DR_REG_DPORT_BASE + 0x574) +/* DPORT_DMMU_TABLE12 : R/W ;bitpos:[6:0] ;default: 7'd12 ; */ +/*description: */ +#define DPORT_DMMU_TABLE12 0x0000007F +#define DPORT_DMMU_TABLE12_M ((DPORT_DMMU_TABLE12_V)<<(DPORT_DMMU_TABLE12_S)) +#define DPORT_DMMU_TABLE12_V 0x7F +#define DPORT_DMMU_TABLE12_S 0 + +#define DPORT_DMMU_TABLE13_REG (DR_REG_DPORT_BASE + 0x578) +/* DPORT_DMMU_TABLE13 : R/W ;bitpos:[6:0] ;default: 7'd13 ; */ +/*description: */ +#define DPORT_DMMU_TABLE13 0x0000007F +#define DPORT_DMMU_TABLE13_M ((DPORT_DMMU_TABLE13_V)<<(DPORT_DMMU_TABLE13_S)) +#define DPORT_DMMU_TABLE13_V 0x7F +#define DPORT_DMMU_TABLE13_S 0 + +#define DPORT_DMMU_TABLE14_REG (DR_REG_DPORT_BASE + 0x57C) +/* DPORT_DMMU_TABLE14 : R/W ;bitpos:[6:0] ;default: 7'd14 ; */ +/*description: */ +#define DPORT_DMMU_TABLE14 0x0000007F +#define DPORT_DMMU_TABLE14_M ((DPORT_DMMU_TABLE14_V)<<(DPORT_DMMU_TABLE14_S)) +#define DPORT_DMMU_TABLE14_V 0x7F +#define DPORT_DMMU_TABLE14_S 0 + +#define DPORT_DMMU_TABLE15_REG (DR_REG_DPORT_BASE + 0x580) +/* DPORT_DMMU_TABLE15 : R/W ;bitpos:[6:0] ;default: 7'd15 ; */ +/*description: */ +#define DPORT_DMMU_TABLE15 0x0000007F +#define DPORT_DMMU_TABLE15_M ((DPORT_DMMU_TABLE15_V)<<(DPORT_DMMU_TABLE15_S)) +#define DPORT_DMMU_TABLE15_V 0x7F +#define DPORT_DMMU_TABLE15_S 0 + +#define DPORT_PRO_INTRUSION_CTRL_REG (DR_REG_DPORT_BASE + 0x584) +/* DPORT_PRO_INTRUSION_RECORD_RESET_N : R/W ;bitpos:[0] ;default: 1'b1 ; */ +/*description: */ +#define DPORT_PRO_INTRUSION_RECORD_RESET_N (BIT(0)) +#define DPORT_PRO_INTRUSION_RECORD_RESET_N_M (BIT(0)) +#define DPORT_PRO_INTRUSION_RECORD_RESET_N_V 0x1 +#define DPORT_PRO_INTRUSION_RECORD_RESET_N_S 0 + +#define DPORT_PRO_INTRUSION_STATUS_REG (DR_REG_DPORT_BASE + 0x588) +/* DPORT_PRO_INTRUSION_RECORD : RO ;bitpos:[3:0] ;default: 4'b0 ; */ +/*description: */ +#define DPORT_PRO_INTRUSION_RECORD 0x0000000F +#define DPORT_PRO_INTRUSION_RECORD_M ((DPORT_PRO_INTRUSION_RECORD_V)<<(DPORT_PRO_INTRUSION_RECORD_S)) +#define DPORT_PRO_INTRUSION_RECORD_V 0xF +#define DPORT_PRO_INTRUSION_RECORD_S 0 + +#define DPORT_APP_INTRUSION_CTRL_REG (DR_REG_DPORT_BASE + 0x58C) +/* DPORT_APP_INTRUSION_RECORD_RESET_N : R/W ;bitpos:[0] ;default: 1'b1 ; */ +/*description: */ +#define DPORT_APP_INTRUSION_RECORD_RESET_N (BIT(0)) +#define DPORT_APP_INTRUSION_RECORD_RESET_N_M (BIT(0)) +#define DPORT_APP_INTRUSION_RECORD_RESET_N_V 0x1 +#define DPORT_APP_INTRUSION_RECORD_RESET_N_S 0 + +#define DPORT_APP_INTRUSION_STATUS_REG (DR_REG_DPORT_BASE + 0x590) +/* DPORT_APP_INTRUSION_RECORD : RO ;bitpos:[3:0] ;default: 4'b0 ; */ +/*description: */ +#define DPORT_APP_INTRUSION_RECORD 0x0000000F +#define DPORT_APP_INTRUSION_RECORD_M ((DPORT_APP_INTRUSION_RECORD_V)<<(DPORT_APP_INTRUSION_RECORD_S)) +#define DPORT_APP_INTRUSION_RECORD_V 0xF +#define DPORT_APP_INTRUSION_RECORD_S 0 + +#define DPORT_FRONT_END_MEM_PD_REG (DR_REG_DPORT_BASE + 0x594) +/* DPORT_PBUS_MEM_FORCE_PD : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_PBUS_MEM_FORCE_PD (BIT(3)) +#define DPORT_PBUS_MEM_FORCE_PD_M (BIT(3)) +#define DPORT_PBUS_MEM_FORCE_PD_V 0x1 +#define DPORT_PBUS_MEM_FORCE_PD_S 3 +/* DPORT_PBUS_MEM_FORCE_PU : R/W ;bitpos:[2] ;default: 1'b1 ; */ +/*description: */ +#define DPORT_PBUS_MEM_FORCE_PU (BIT(2)) +#define DPORT_PBUS_MEM_FORCE_PU_M (BIT(2)) +#define DPORT_PBUS_MEM_FORCE_PU_V 0x1 +#define DPORT_PBUS_MEM_FORCE_PU_S 2 +/* DPORT_AGC_MEM_FORCE_PD : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_AGC_MEM_FORCE_PD (BIT(1)) +#define DPORT_AGC_MEM_FORCE_PD_M (BIT(1)) +#define DPORT_AGC_MEM_FORCE_PD_V 0x1 +#define DPORT_AGC_MEM_FORCE_PD_S 1 +/* DPORT_AGC_MEM_FORCE_PU : R/W ;bitpos:[0] ;default: 1'b1 ; */ +/*description: */ +#define DPORT_AGC_MEM_FORCE_PU (BIT(0)) +#define DPORT_AGC_MEM_FORCE_PU_M (BIT(0)) +#define DPORT_AGC_MEM_FORCE_PU_V 0x1 +#define DPORT_AGC_MEM_FORCE_PU_S 0 + +#define DPORT_MMU_IA_INT_EN_REG (DR_REG_DPORT_BASE + 0x598) +/* DPORT_MMU_IA_INT_EN : R/W ;bitpos:[23:0] ;default: 24'b0 ; */ +/*description: */ +#define DPORT_MMU_IA_INT_EN 0x00FFFFFF +#define DPORT_MMU_IA_INT_EN_M ((DPORT_MMU_IA_INT_EN_V)<<(DPORT_MMU_IA_INT_EN_S)) +#define DPORT_MMU_IA_INT_EN_V 0xFFFFFF +#define DPORT_MMU_IA_INT_EN_S 0 + +#define DPORT_MPU_IA_INT_EN_REG (DR_REG_DPORT_BASE + 0x59C) +/* DPORT_MPU_IA_INT_EN : R/W ;bitpos:[16:0] ;default: 17'b0 ; */ +/*description: */ +#define DPORT_MPU_IA_INT_EN 0x0001FFFF +#define DPORT_MPU_IA_INT_EN_M ((DPORT_MPU_IA_INT_EN_V)<<(DPORT_MPU_IA_INT_EN_S)) +#define DPORT_MPU_IA_INT_EN_V 0x1FFFF +#define DPORT_MPU_IA_INT_EN_S 0 + +#define DPORT_CACHE_IA_INT_EN_REG (DR_REG_DPORT_BASE + 0x5A0) +/* DPORT_CACHE_IA_INT_EN : R/W ;bitpos:[27:0] ;default: 28'b0 ; */ +/*description: Interrupt enable bits for various invalid cache access reasons*/ +#define DPORT_CACHE_IA_INT_EN 0x0FFFFFFF +#define DPORT_CACHE_IA_INT_EN_M ((DPORT_CACHE_IA_INT_EN_V)<<(DPORT_CACHE_IA_INT_EN_S)) +#define DPORT_CACHE_IA_INT_EN_V 0xFFFFFFF +#define DPORT_CACHE_IA_INT_EN_S 0 +/* Contents of DPORT_CACHE_IA_INT_EN field: */ +/* DPORT_CACHE_IA_INT_PRO_OPPOSITE : R/W ;bitpos:[19] ;default: 1'b0 ; */ +/*description: PRO CPU invalid access to APP CPU cache when cache disabled */ +#define DPORT_CACHE_IA_INT_PRO_OPPOSITE BIT(19) +#define DPORT_CACHE_IA_INT_PRO_OPPOSITE_M BIT(19) +#define DPORT_CACHE_IA_INT_PRO_OPPOSITE_V (1) +#define DPORT_CACHE_IA_INT_PRO_OPPOSITE_S (19) +/* DPORT_CACHE_IA_INT_PRO_DRAM1 : R/W ;bitpos:[18] ;default: 1'b0 ; */ +/*description: PRO CPU invalid access to DRAM1 when cache is disabled */ +#define DPORT_CACHE_IA_INT_PRO_DRAM1 BIT(18) +#define DPORT_CACHE_IA_INT_PRO_DRAM1_M BIT(18) +#define DPORT_CACHE_IA_INT_PRO_DRAM1_V (1) +#define DPORT_CACHE_IA_INT_PRO_DRAM1_S (18) +/* DPORT_CACHE_IA_INT_PRO_IROM0 : R/W ;bitpos:[17] ;default: 1'b0 ; */ +/*description: PRO CPU invalid access to IROM0 when cache is disabled */ +#define DPORT_CACHE_IA_INT_PRO_IROM0 BIT(17) +#define DPORT_CACHE_IA_INT_PRO_IROM0_M BIT(17) +#define DPORT_CACHE_IA_INT_PRO_IROM0_V (1) +#define DPORT_CACHE_IA_INT_PRO_IROM0_S (17) +/* DPORT_CACHE_IA_INT_PRO_IRAM1 : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: PRO CPU invalid access to IRAM1 when cache is disabled */ +#define DPORT_CACHE_IA_INT_PRO_IRAM1 BIT(16) +#define DPORT_CACHE_IA_INT_PRO_IRAM1_M BIT(16) +#define DPORT_CACHE_IA_INT_PRO_IRAM1_V (1) +#define DPORT_CACHE_IA_INT_PRO_IRAM1_S (16) +/* DPORT_CACHE_IA_INT_PRO_IRAM0 : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: PRO CPU invalid access to IRAM0 when cache is disabled */ +#define DPORT_CACHE_IA_INT_PRO_IRAM0 BIT(15) +#define DPORT_CACHE_IA_INT_PRO_IRAM0_M BIT(15) +#define DPORT_CACHE_IA_INT_PRO_IRAM0_V (1) +#define DPORT_CACHE_IA_INT_PRO_IRAM0_S (15) +/* DPORT_CACHE_IA_INT_PRO_DROM0 : R/W ;bitpos:[14] ;default: 1'b0 ; */ +/*description: PRO CPU invalid access to DROM0 when cache is disabled */ +#define DPORT_CACHE_IA_INT_PRO_DROM0 BIT(14) +#define DPORT_CACHE_IA_INT_PRO_DROM0_M BIT(14) +#define DPORT_CACHE_IA_INT_PRO_DROM0_V (1) +#define DPORT_CACHE_IA_INT_PRO_DROM0_S (14) +/* DPORT_CACHE_IA_INT_APP_OPPOSITE : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: APP CPU invalid access to APP CPU cache when cache disabled */ +#define DPORT_CACHE_IA_INT_APP_OPPOSITE BIT(5) +#define DPORT_CACHE_IA_INT_APP_OPPOSITE_M BIT(5) +#define DPORT_CACHE_IA_INT_APP_OPPOSITE_V (1) +#define DPORT_CACHE_IA_INT_APP_OPPOSITE_S (5) +/* DPORT_CACHE_IA_INT_APP_DRAM1 : R/W ;bitpos:43] ;default: 1'b0 ; */ +/*description: APP CPU invalid access to DRAM1 when cache is disabled */ +#define DPORT_CACHE_IA_INT_APP_DRAM1 BIT(4) +#define DPORT_CACHE_IA_INT_APP_DRAM1_M BIT(4) +#define DPORT_CACHE_IA_INT_APP_DRAM1_V (1) +#define DPORT_CACHE_IA_INT_APP_DRAM1_S (4) +/* DPORT_CACHE_IA_INT_APP_IROM0 : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: APP CPU invalid access to IROM0 when cache is disabled */ +#define DPORT_CACHE_IA_INT_APP_IROM0 BIT(3) +#define DPORT_CACHE_IA_INT_APP_IROM0_M BIT(3) +#define DPORT_CACHE_IA_INT_APP_IROM0_V (1) +#define DPORT_CACHE_IA_INT_APP_IROM0_S (3) +/* DPORT_CACHE_IA_INT_APP_IRAM1 : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: APP CPU invalid access to IRAM1 when cache is disabled */ +#define DPORT_CACHE_IA_INT_APP_IRAM1 BIT(2) +#define DPORT_CACHE_IA_INT_APP_IRAM1_M BIT(2) +#define DPORT_CACHE_IA_INT_APP_IRAM1_V (1) +#define DPORT_CACHE_IA_INT_APP_IRAM1_S (2) +/* DPORT_CACHE_IA_INT_APP_IRAM0 : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: APP CPU invalid access to IRAM0 when cache is disabled */ +#define DPORT_CACHE_IA_INT_APP_IRAM0 BIT(1) +#define DPORT_CACHE_IA_INT_APP_IRAM0_M BIT(1) +#define DPORT_CACHE_IA_INT_APP_IRAM0_V (1) +#define DPORT_CACHE_IA_INT_APP_IRAM0_S (1) +/* DPORT_CACHE_IA_INT_APP_DROM0 : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: APP CPU invalid access to DROM0 when cache is disabled */ +#define DPORT_CACHE_IA_INT_APP_DROM0 BIT(0) +#define DPORT_CACHE_IA_INT_APP_DROM0_M BIT(0) +#define DPORT_CACHE_IA_INT_APP_DROM0_V (1) +#define DPORT_CACHE_IA_INT_APP_DROM0_S (0) + +#define DPORT_SECURE_BOOT_CTRL_REG (DR_REG_DPORT_BASE + 0x5A4) +/* DPORT_SW_BOOTLOADER_SEL : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define DPORT_SW_BOOTLOADER_SEL (BIT(0)) +#define DPORT_SW_BOOTLOADER_SEL_M (BIT(0)) +#define DPORT_SW_BOOTLOADER_SEL_V 0x1 +#define DPORT_SW_BOOTLOADER_SEL_S 0 + +#define DPORT_SPI_DMA_CHAN_SEL_REG (DR_REG_DPORT_BASE + 0x5A8) +/* DPORT_SPI3_DMA_CHAN_SEL : R/W ;bitpos:[5:4] ;default: 2'b00 ; */ +/*description: */ +#define DPORT_SPI3_DMA_CHAN_SEL 0x00000003 +#define DPORT_SPI3_DMA_CHAN_SEL_M ((DPORT_SPI3_DMA_CHAN_SEL_V)<<(DPORT_SPI3_DMA_CHAN_SEL_S)) +#define DPORT_SPI3_DMA_CHAN_SEL_V 0x3 +#define DPORT_SPI3_DMA_CHAN_SEL_S 4 +/* DPORT_SPI2_DMA_CHAN_SEL : R/W ;bitpos:[3:2] ;default: 2'b00 ; */ +/*description: */ +#define DPORT_SPI2_DMA_CHAN_SEL 0x00000003 +#define DPORT_SPI2_DMA_CHAN_SEL_M ((DPORT_SPI2_DMA_CHAN_SEL_V)<<(DPORT_SPI2_DMA_CHAN_SEL_S)) +#define DPORT_SPI2_DMA_CHAN_SEL_V 0x3 +#define DPORT_SPI2_DMA_CHAN_SEL_S 2 +/* DPORT_SPI1_DMA_CHAN_SEL : R/W ;bitpos:[1:0] ;default: 2'b00 ; */ +/*description: */ +#define DPORT_SPI1_DMA_CHAN_SEL 0x00000003 +#define DPORT_SPI1_DMA_CHAN_SEL_M ((DPORT_SPI1_DMA_CHAN_SEL_V)<<(DPORT_SPI1_DMA_CHAN_SEL_S)) +#define DPORT_SPI1_DMA_CHAN_SEL_V 0x3 +#define DPORT_SPI1_DMA_CHAN_SEL_S 0 + +#define DPORT_PRO_VECBASE_CTRL_REG (DR_REG_DPORT_BASE + 0x5AC) +/* DPORT_PRO_OUT_VECBASE_SEL : R/W ;bitpos:[1:0] ;default: 2'b0 ; */ +/*description: */ +#define DPORT_PRO_OUT_VECBASE_SEL 0x00000003 +#define DPORT_PRO_OUT_VECBASE_SEL_M ((DPORT_PRO_OUT_VECBASE_SEL_V)<<(DPORT_PRO_OUT_VECBASE_SEL_S)) +#define DPORT_PRO_OUT_VECBASE_SEL_V 0x3 +#define DPORT_PRO_OUT_VECBASE_SEL_S 0 + +#define DPORT_PRO_VECBASE_SET_REG (DR_REG_DPORT_BASE + 0x5B0) +/* DPORT_PRO_OUT_VECBASE_REG : R/W ;bitpos:[21:0] ;default: 22'b0 ; */ +/*description: */ +#define DPORT_PRO_OUT_VECBASE_REG 0x003FFFFF +#define DPORT_PRO_OUT_VECBASE_REG_M ((DPORT_PRO_OUT_VECBASE_REG_V)<<(DPORT_PRO_OUT_VECBASE_REG_S)) +#define DPORT_PRO_OUT_VECBASE_REG_V 0x3FFFFF +#define DPORT_PRO_OUT_VECBASE_REG_S 0 + +#define DPORT_APP_VECBASE_CTRL_REG (DR_REG_DPORT_BASE + 0x5B4) +/* DPORT_APP_OUT_VECBASE_SEL : R/W ;bitpos:[1:0] ;default: 2'b0 ; */ +/*description: */ +#define DPORT_APP_OUT_VECBASE_SEL 0x00000003 +#define DPORT_APP_OUT_VECBASE_SEL_M ((DPORT_APP_OUT_VECBASE_SEL_V)<<(DPORT_APP_OUT_VECBASE_SEL_S)) +#define DPORT_APP_OUT_VECBASE_SEL_V 0x3 +#define DPORT_APP_OUT_VECBASE_SEL_S 0 + +#define DPORT_APP_VECBASE_SET_REG (DR_REG_DPORT_BASE + 0x5B8) +/* DPORT_APP_OUT_VECBASE_REG : R/W ;bitpos:[21:0] ;default: 22'b0 ; */ +/*description: */ +#define DPORT_APP_OUT_VECBASE_REG 0x003FFFFF +#define DPORT_APP_OUT_VECBASE_REG_M ((DPORT_APP_OUT_VECBASE_REG_V)<<(DPORT_APP_OUT_VECBASE_REG_S)) +#define DPORT_APP_OUT_VECBASE_REG_V 0x3FFFFF +#define DPORT_APP_OUT_VECBASE_REG_S 0 + +#define DPORT_DATE_REG (DR_REG_DPORT_BASE + 0xFFC) +/* DPORT_DATE : R/W ;bitpos:[27:0] ;default: 28'h1605190 ; */ +/*description: */ +#define DPORT_DATE 0x0FFFFFFF +#define DPORT_DATE_M ((DPORT_DATE_V)<<(DPORT_DATE_S)) +#define DPORT_DATE_V 0xFFFFFFF +#define DPORT_DATE_S 0 +#define DPORT_DPORT_DATE_VERSION 0x1605190 + +/* Flash MMU table for PRO CPU */ +#define DPORT_PRO_FLASH_MMU_TABLE ((volatile uint32_t*) 0x3FF10000) + +/* Flash MMU table for APP CPU */ +#define DPORT_APP_FLASH_MMU_TABLE ((volatile uint32_t*) 0x3FF12000) + +#define DPORT_FLASH_MMU_TABLE_SIZE 0x100 + +#define DPORT_FLASH_MMU_TABLE_INVALID_VAL 0x100 + +#define DPORT_MMU_ADDRESS_MASK 0xff + +#endif /*_SOC_DPORT_REG_H_ */ + + diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/efuse_reg.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/efuse_reg.h new file mode 100644 index 0000000000000..bbe96771370b0 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/efuse_reg.h @@ -0,0 +1,1188 @@ +// 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. +#ifndef _SOC_EFUSE_REG_H_ +#define _SOC_EFUSE_REG_H_ + + +#include "soc.h" +#define EFUSE_BLK0_RDATA0_REG (DR_REG_EFUSE_BASE + 0x000) +/* EFUSE_RD_FLASH_CRYPT_CNT : RO ;bitpos:[26:20] ;default: 7'b0 ; */ +/*description: read for flash_crypt_cnt*/ +#define EFUSE_RD_FLASH_CRYPT_CNT 0x0000007F +#define EFUSE_RD_FLASH_CRYPT_CNT_M ((EFUSE_RD_FLASH_CRYPT_CNT_V)<<(EFUSE_RD_FLASH_CRYPT_CNT_S)) +#define EFUSE_RD_FLASH_CRYPT_CNT_V 0x7F +#define EFUSE_RD_FLASH_CRYPT_CNT_S 20 +/* EFUSE_RD_EFUSE_RD_DIS : RO ;bitpos:[19:16] ;default: 4'b0 ; */ +/*description: read for efuse_rd_disable*/ +#define EFUSE_RD_EFUSE_RD_DIS 0x0000000F +#define EFUSE_RD_EFUSE_RD_DIS_M ((EFUSE_RD_EFUSE_RD_DIS_V)<<(EFUSE_RD_EFUSE_RD_DIS_S)) +#define EFUSE_RD_EFUSE_RD_DIS_V 0xF +#define EFUSE_RD_EFUSE_RD_DIS_S 16 + +/* Read disable bits for efuse blocks 1-3 */ +#define EFUSE_RD_DIS_BLK1 (1<<16) +#define EFUSE_RD_DIS_BLK2 (1<<17) +#define EFUSE_RD_DIS_BLK3 (1<<18) +/* Read disable FLASH_CRYPT_CONFIG, CODING_SCHEME & KEY_STATUS + in efuse block 0 +*/ +#define EFUSE_RD_DIS_BLK0_PARTIAL (1<<19) + +/* EFUSE_RD_EFUSE_WR_DIS : RO ;bitpos:[15:0] ;default: 16'b0 ; */ +/*description: read for efuse_wr_disable*/ +#define EFUSE_RD_EFUSE_WR_DIS 0x0000FFFF +#define EFUSE_RD_EFUSE_WR_DIS_M ((EFUSE_RD_EFUSE_WR_DIS_V)<<(EFUSE_RD_EFUSE_WR_DIS_S)) +#define EFUSE_RD_EFUSE_WR_DIS_V 0xFFFF +#define EFUSE_RD_EFUSE_WR_DIS_S 0 + +/* Write disable bits */ +#define EFUSE_WR_DIS_RD_DIS (1<<0) /*< disable writing read disable reg */ +#define EFUSE_WR_DIS_WR_DIS (1<<1) /*< disable writing write disable reg */ +#define EFUSE_WR_DIS_FLASH_CRYPT_CNT (1<<2) +#define EFUSE_WR_DIS_MAC_SPI_CONFIG_HD (1<<3) /*< disable writing MAC & SPI config hd efuses */ +#define EFUSE_WR_DIS_XPD_SDIO (1<<5) /*< disable writing SDIO config efuses */ +#define EFUSE_WR_DIS_SPI_PAD_CONFIG (1<<6) /*< disable writing SPI_PAD_CONFIG efuses */ +#define EFUSE_WR_DIS_BLK1 (1<<7) /*< disable writing BLK1 efuses */ +#define EFUSE_WR_DIS_BLK2 (1<<8) /*< disable writing BLK2 efuses */ +#define EFUSE_WR_DIS_BLK3 (1<<9) /*< disable writing BLK3 efuses */ +#define EFUSE_WR_DIS_FLASH_CRYPT_CODING_SCHEME (1<<10) /*< disable writing FLASH_CRYPT_CONFIG and CODING_SCHEME efuses */ +#define EFUSE_WR_DIS_ABS_DONE_0 (1<<12) /*< disable writing ABS_DONE_0 efuse */ +#define EFUSE_WR_DIS_ABS_DONE_1 (1<<13) /*< disable writing ABS_DONE_1 efuse */ +#define EFUSE_WR_DIS_JTAG_DISABLE (1<<14) /*< disable writing JTAG_DISABLE efuse */ +#define EFUSE_WR_DIS_CONSOLE_DL_DISABLE (1<<15) /*< disable writing CONSOLE_DEBUG_DISABLE, DISABLE_DL_ENCRYPT, DISABLE_DL_DECRYPT and DISABLE_DL_CACHE efuses */ + +#define EFUSE_BLK0_RDATA1_REG (DR_REG_EFUSE_BASE + 0x004) +/* EFUSE_RD_WIFI_MAC_CRC_LOW : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: read for low 32bit WIFI_MAC_Address*/ +#define EFUSE_RD_WIFI_MAC_CRC_LOW 0xFFFFFFFF +#define EFUSE_RD_WIFI_MAC_CRC_LOW_M ((EFUSE_RD_WIFI_MAC_CRC_LOW_V)<<(EFUSE_RD_WIFI_MAC_CRC_LOW_S)) +#define EFUSE_RD_WIFI_MAC_CRC_LOW_V 0xFFFFFFFF +#define EFUSE_RD_WIFI_MAC_CRC_LOW_S 0 + +#define EFUSE_BLK0_RDATA2_REG (DR_REG_EFUSE_BASE + 0x008) +/* EFUSE_RD_WIFI_MAC_CRC_HIGH : RO ;bitpos:[23:0] ;default: 24'b0 ; */ +/*description: read for high 24bit WIFI_MAC_Address*/ +#define EFUSE_RD_WIFI_MAC_CRC_HIGH 0x00FFFFFF +#define EFUSE_RD_WIFI_MAC_CRC_HIGH_M ((EFUSE_RD_WIFI_MAC_CRC_HIGH_V)<<(EFUSE_RD_WIFI_MAC_CRC_HIGH_S)) +#define EFUSE_RD_WIFI_MAC_CRC_HIGH_V 0xFFFFFF +#define EFUSE_RD_WIFI_MAC_CRC_HIGH_S 0 + +#define EFUSE_BLK0_RDATA3_REG (DR_REG_EFUSE_BASE + 0x00c) +/* EFUSE_RD_CHIP_VER_REV1 : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: bit is set to 1 for rev1 silicon*/ +#define EFUSE_RD_CHIP_VER_REV1 (BIT(15)) +#define EFUSE_RD_CHIP_VER_REV1_M ((EFUSE_RD_CHIP_VER_REV1_V)<<(EFUSE_RD_CHIP_VER_REV1_S)) +#define EFUSE_RD_CHIP_VER_REV1_V 0x1 +#define EFUSE_RD_CHIP_VER_REV1_S 15 +/* EFUSE_RD_BLK3_PART_RESERVE : R/W ; bitpos:[14] ; default: 1'b0; */ +/*description: If set, this bit indicates that BLOCK3[143:96] is reserved for internal use*/ +#define EFUSE_RD_BLK3_PART_RESERVE (BIT(14)) +#define EFUSE_RD_BLK3_PART_RESERVE_M ((EFUSE_RD_BLK3_PART_RESERVE_V)<<(EFUSE_RD_BLK3_PART_RESERVE_S)) +#define EFUSE_RD_BLK3_PART_RESERVE_V 0x1 +#define EFUSE_RD_BLK3_PART_RESERVE_S 14 +/* EFUSE_RD_CHIP_CPU_FREQ_RATED : R/W ;bitpos:[13] ;default: 1'b0 ; */ +/*description: If set, the ESP32's maximum CPU frequency has been rated*/ +#define EFUSE_RD_CHIP_CPU_FREQ_RATED (BIT(13)) +#define EFUSE_RD_CHIP_CPU_FREQ_RATED_M ((EFUSE_RD_CHIP_CPU_FREQ_RATED_V)<<(EFUSE_RD_CHIP_CPU_FREQ_RATED_S)) +#define EFUSE_RD_CHIP_CPU_FREQ_RATED_V 0x1 +#define EFUSE_RD_CHIP_CPU_FREQ_RATED_S 13 +/* EFUSE_RD_CHIP_CPU_FREQ_LOW : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: If set alongside EFUSE_RD_CHIP_CPU_FREQ_RATED, the ESP32's max CPU frequency is rated for 160MHz. 240MHz otherwise*/ +#define EFUSE_RD_CHIP_CPU_FREQ_LOW (BIT(12)) +#define EFUSE_RD_CHIP_CPU_FREQ_LOW_M ((EFUSE_RD_CHIP_CPU_FREQ_LOW_V)<<(EFUSE_RD_CHIP_CPU_FREQ_LOW_S)) +#define EFUSE_RD_CHIP_CPU_FREQ_LOW_V 0x1 +#define EFUSE_RD_CHIP_CPU_FREQ_LOW_S 12 +/* EFUSE_RD_CHIP_VER_PKG : R/W ;bitpos:[11:9] ;default: 3'b0 ; */ +/*description: chip package */ +#define EFUSE_RD_CHIP_VER_PKG 0x00000007 +#define EFUSE_RD_CHIP_VER_PKG_M ((EFUSE_RD_CHIP_VER_PKG_V)<<(EFUSE_RD_CHIP_VER_PKG_S)) +#define EFUSE_RD_CHIP_VER_PKG_V 0x7 +#define EFUSE_RD_CHIP_VER_PKG_S 9 +#define EFUSE_RD_CHIP_VER_PKG_ESP32D0WDQ6 0 +#define EFUSE_RD_CHIP_VER_PKG_ESP32D0WDQ5 1 +#define EFUSE_RD_CHIP_VER_PKG_ESP32D2WDQ5 2 +#define EFUSE_RD_CHIP_VER_PKG_ESP32PICOD2 4 +#define EFUSE_RD_CHIP_VER_PKG_ESP32PICOD4 5 +/* EFUSE_RD_SPI_PAD_CONFIG_HD : RO ;bitpos:[8:4] ;default: 5'b0 ; */ +/*description: read for SPI_pad_config_hd*/ +#define EFUSE_RD_SPI_PAD_CONFIG_HD 0x0000001F +#define EFUSE_RD_SPI_PAD_CONFIG_HD_M ((EFUSE_RD_SPI_PAD_CONFIG_HD_V)<<(EFUSE_RD_SPI_PAD_CONFIG_HD_S)) +#define EFUSE_RD_SPI_PAD_CONFIG_HD_V 0x1F +#define EFUSE_RD_SPI_PAD_CONFIG_HD_S 4 +/* EFUSE_RD_CHIP_VER_DIS_CACHE : RO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define EFUSE_RD_CHIP_VER_DIS_CACHE (BIT(3)) +#define EFUSE_RD_CHIP_VER_DIS_CACHE_M (BIT(3)) +#define EFUSE_RD_CHIP_VER_DIS_CACHE_V 0x1 +#define EFUSE_RD_CHIP_VER_DIS_CACHE_S 3 +/* EFUSE_RD_CHIP_VER_32PAD : RO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define EFUSE_RD_CHIP_VER_32PAD (BIT(2)) +#define EFUSE_RD_CHIP_VER_32PAD_M (BIT(2)) +#define EFUSE_RD_CHIP_VER_32PAD_V 0x1 +#define EFUSE_RD_CHIP_VER_32PAD_S 2 +/* EFUSE_RD_CHIP_VER_DIS_BT : RO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define EFUSE_RD_CHIP_VER_DIS_BT (BIT(1)) +#define EFUSE_RD_CHIP_VER_DIS_BT_M (BIT(1)) +#define EFUSE_RD_CHIP_VER_DIS_BT_V 0x1 +#define EFUSE_RD_CHIP_VER_DIS_BT_S 1 +/* EFUSE_RD_CHIP_VER_DIS_APP_CPU : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define EFUSE_RD_CHIP_VER_DIS_APP_CPU (BIT(0)) +#define EFUSE_RD_CHIP_VER_DIS_APP_CPU_M (BIT(0)) +#define EFUSE_RD_CHIP_VER_DIS_APP_CPU_V 0x1 +#define EFUSE_RD_CHIP_VER_DIS_APP_CPU_S 0 + +#define EFUSE_BLK0_RDATA4_REG (DR_REG_EFUSE_BASE + 0x010) +/* EFUSE_RD_SDIO_FORCE : RO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: read for sdio_force*/ +#define EFUSE_RD_SDIO_FORCE (BIT(16)) +#define EFUSE_RD_SDIO_FORCE_M (BIT(16)) +#define EFUSE_RD_SDIO_FORCE_V 0x1 +#define EFUSE_RD_SDIO_FORCE_S 16 +/* EFUSE_RD_SDIO_TIEH : RO ;bitpos:[15] ;default: 1'b0 ; */ +/*description: read for SDIO_TIEH*/ +#define EFUSE_RD_SDIO_TIEH (BIT(15)) +#define EFUSE_RD_SDIO_TIEH_M (BIT(15)) +#define EFUSE_RD_SDIO_TIEH_V 0x1 +#define EFUSE_RD_SDIO_TIEH_S 15 +/* EFUSE_RD_XPD_SDIO_REG : RO ;bitpos:[14] ;default: 1'b0 ; */ +/*description: read for XPD_SDIO_REG*/ +#define EFUSE_RD_XPD_SDIO_REG (BIT(14)) +#define EFUSE_RD_XPD_SDIO_REG_M (BIT(14)) +#define EFUSE_RD_XPD_SDIO_REG_V 0x1 +#define EFUSE_RD_XPD_SDIO_REG_S 14 +/* EFUSE_RD_ADC_VREF : R/W ;bitpos:[12:8] ;default: 5'b0 ; */ +/*description: True ADC reference voltage */ +#define EFUSE_RD_ADC_VREF 0x0000001F +#define EFUSE_RD_ADC_VREF_M ((EFUSE_RD_ADC_VREF_V)<<(EFUSE_RD_ADC_VREF_S)) +#define EFUSE_RD_ADC_VREF_V 0x1F +#define EFUSE_RD_ADC_VREF_S 8 +/* Note: EFUSE_ADC_VREF and SDIO_DREFH/M/L share the same address space. Newer + * versions of ESP32 come with EFUSE_ADC_VREF already burned, therefore + * SDIO_DREFH/M/L is only available in older versions of ESP32 */ +/* EFUSE_RD_SDIO_DREFL : RO ;bitpos:[13:12] ;default: 2'b0 ; */ +/*description: */ +#define EFUSE_RD_SDIO_DREFL 0x00000003 +#define EFUSE_RD_SDIO_DREFL_M ((EFUSE_RD_SDIO_DREFL_V)<<(EFUSE_RD_SDIO_DREFL_S)) +#define EFUSE_RD_SDIO_DREFL_V 0x3 +#define EFUSE_RD_SDIO_DREFL_S 12 +/* EFUSE_RD_SDIO_DREFM : RO ;bitpos:[11:10] ;default: 2'b0 ; */ +/*description: */ +#define EFUSE_RD_SDIO_DREFM 0x00000003 +#define EFUSE_RD_SDIO_DREFM_M ((EFUSE_RD_SDIO_DREFM_V)<<(EFUSE_RD_SDIO_DREFM_S)) +#define EFUSE_RD_SDIO_DREFM_V 0x3 +#define EFUSE_RD_SDIO_DREFM_S 10 +/* EFUSE_RD_SDIO_DREFH : RO ;bitpos:[9:8] ;default: 2'b0 ; */ +/*description: */ +#define EFUSE_RD_SDIO_DREFH 0x00000003 +#define EFUSE_RD_SDIO_DREFH_M ((EFUSE_RD_SDIO_DREFH_V)<<(EFUSE_RD_SDIO_DREFH_S)) +#define EFUSE_RD_SDIO_DREFH_V 0x3 +#define EFUSE_RD_SDIO_DREFH_S 8 +/* EFUSE_RD_CK8M_FREQ : RO ;bitpos:[7:0] ;default: 8'b0 ; */ +/*description: */ +#define EFUSE_RD_CK8M_FREQ 0x000000FF +#define EFUSE_RD_CK8M_FREQ_M ((EFUSE_RD_CK8M_FREQ_V)<<(EFUSE_RD_CK8M_FREQ_S)) +#define EFUSE_RD_CK8M_FREQ_V 0xFF +#define EFUSE_RD_CK8M_FREQ_S 0 + +#define EFUSE_BLK0_RDATA5_REG (DR_REG_EFUSE_BASE + 0x014) +/* EFUSE_RD_FLASH_CRYPT_CONFIG : RO ;bitpos:[31:28] ;default: 4'b0 ; */ +/*description: read for flash_crypt_config*/ +#define EFUSE_RD_FLASH_CRYPT_CONFIG 0x0000000F +#define EFUSE_RD_FLASH_CRYPT_CONFIG_M ((EFUSE_RD_FLASH_CRYPT_CONFIG_V)<<(EFUSE_RD_FLASH_CRYPT_CONFIG_S)) +#define EFUSE_RD_FLASH_CRYPT_CONFIG_V 0xF +#define EFUSE_RD_FLASH_CRYPT_CONFIG_S 28 +/* EFUSE_RD_DIG_VOL_L6: RO; bitpos:[27:24]; */ +/*descritpion: This field stores the difference between the digital regulator voltage at level6 and 1.2 V. (RO) + BIT[27] is the sign bit, 0: + , 1: - + BIT[26:24] is the difference value, unit: 0.017V + volt_lv6 = BIT[27] ? 1.2 - BIT[26:24] * 0.017 : 1.2 + BIT[26:24] * 0.017 */ +#define EFUSE_RD_DIG_VOL_L6 0x0F +#define EFUSE_RD_DIG_VOL_L6_M ((EFUSE_RD_DIG_VOL_L6_V)<<(EFUSE_RD_DIG_VOL_L6_S)) +#define EFUSE_RD_DIG_VOL_L6_V 0x0F +#define EFUSE_RD_DIG_VOL_L6_S 24 +/* EFUSE_RD_VOL_LEVEL_HP_INV: RO; bitpos:[23:22] */ +/*description: This field stores the voltage level for CPU to run at 240 MHz, or for flash/PSRAM to run at 80 MHz. +0x0: level 7; 0x1: level 6; 0x2: level 5; 0x3: level 4. (RO)*/ +#define EFUSE_RD_VOL_LEVEL_HP_INV 0x03 +#define EFUSE_RD_VOL_LEVEL_HP_INV_M ((EFUSE_RD_VOL_LEVEL_HP_INV_V)<<(EFUSE_RD_VOL_LEVEL_HP_INV_S)) +#define EFUSE_RD_VOL_LEVEL_HP_INV_V 0x03 +#define EFUSE_RD_VOL_LEVEL_HP_INV_S 22 +/* EFUSE_RD_INST_CONFIG : RO ;bitpos:[27:20] ;default: 8'b0 ; */ +/* Deprecated */ +#define EFUSE_RD_INST_CONFIG 0x000000FF /** Deprecated **/ +#define EFUSE_RD_INST_CONFIG_M ((EFUSE_RD_INST_CONFIG_V)<<(EFUSE_RD_INST_CONFIG_S)) /** Deprecated **/ +#define EFUSE_RD_INST_CONFIG_V 0xFF /** Deprecated **/ +#define EFUSE_RD_INST_CONFIG_S 20 /** Deprecated **/ +/* EFUSE_RD_SPI_PAD_CONFIG_CS0 : RO ;bitpos:[19:15] ;default: 5'b0 ; */ +/*description: read for SPI_pad_config_cs0*/ +#define EFUSE_RD_SPI_PAD_CONFIG_CS0 0x0000001F +#define EFUSE_RD_SPI_PAD_CONFIG_CS0_M ((EFUSE_RD_SPI_PAD_CONFIG_CS0_V)<<(EFUSE_RD_SPI_PAD_CONFIG_CS0_S)) +#define EFUSE_RD_SPI_PAD_CONFIG_CS0_V 0x1F +#define EFUSE_RD_SPI_PAD_CONFIG_CS0_S 15 +/* EFUSE_RD_SPI_PAD_CONFIG_D : RO ;bitpos:[14:10] ;default: 5'b0 ; */ +/*description: read for SPI_pad_config_d*/ +#define EFUSE_RD_SPI_PAD_CONFIG_D 0x0000001F +#define EFUSE_RD_SPI_PAD_CONFIG_D_M ((EFUSE_RD_SPI_PAD_CONFIG_D_V)<<(EFUSE_RD_SPI_PAD_CONFIG_D_S)) +#define EFUSE_RD_SPI_PAD_CONFIG_D_V 0x1F +#define EFUSE_RD_SPI_PAD_CONFIG_D_S 10 +/* EFUSE_RD_SPI_PAD_CONFIG_Q : RO ;bitpos:[9:5] ;default: 5'b0 ; */ +/*description: read for SPI_pad_config_q*/ +#define EFUSE_RD_SPI_PAD_CONFIG_Q 0x0000001F +#define EFUSE_RD_SPI_PAD_CONFIG_Q_M ((EFUSE_RD_SPI_PAD_CONFIG_Q_V)<<(EFUSE_RD_SPI_PAD_CONFIG_Q_S)) +#define EFUSE_RD_SPI_PAD_CONFIG_Q_V 0x1F +#define EFUSE_RD_SPI_PAD_CONFIG_Q_S 5 +/* EFUSE_RD_SPI_PAD_CONFIG_CLK : RO ;bitpos:[4:0] ;default: 5'b0 ; */ +/*description: read for SPI_pad_config_clk*/ +#define EFUSE_RD_SPI_PAD_CONFIG_CLK 0x0000001F +#define EFUSE_RD_SPI_PAD_CONFIG_CLK_M ((EFUSE_RD_SPI_PAD_CONFIG_CLK_V)<<(EFUSE_RD_SPI_PAD_CONFIG_CLK_S)) +#define EFUSE_RD_SPI_PAD_CONFIG_CLK_V 0x1F +#define EFUSE_RD_SPI_PAD_CONFIG_CLK_S 0 + +#define EFUSE_BLK0_RDATA6_REG (DR_REG_EFUSE_BASE + 0x018) +/* EFUSE_RD_KEY_STATUS : RO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: read for key_status*/ +#define EFUSE_RD_KEY_STATUS (BIT(10)) +#define EFUSE_RD_KEY_STATUS_M (BIT(10)) +#define EFUSE_RD_KEY_STATUS_V 0x1 +#define EFUSE_RD_KEY_STATUS_S 10 +/* EFUSE_RD_DISABLE_DL_CACHE : RO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: read for download_dis_cache*/ +#define EFUSE_RD_DISABLE_DL_CACHE (BIT(9)) +#define EFUSE_RD_DISABLE_DL_CACHE_M (BIT(9)) +#define EFUSE_RD_DISABLE_DL_CACHE_V 0x1 +#define EFUSE_RD_DISABLE_DL_CACHE_S 9 +/* EFUSE_RD_DISABLE_DL_DECRYPT : RO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: read for download_dis_decrypt*/ +#define EFUSE_RD_DISABLE_DL_DECRYPT (BIT(8)) +#define EFUSE_RD_DISABLE_DL_DECRYPT_M (BIT(8)) +#define EFUSE_RD_DISABLE_DL_DECRYPT_V 0x1 +#define EFUSE_RD_DISABLE_DL_DECRYPT_S 8 +/* EFUSE_RD_DISABLE_DL_ENCRYPT : RO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: read for download_dis_encrypt*/ +#define EFUSE_RD_DISABLE_DL_ENCRYPT (BIT(7)) +#define EFUSE_RD_DISABLE_DL_ENCRYPT_M (BIT(7)) +#define EFUSE_RD_DISABLE_DL_ENCRYPT_V 0x1 +#define EFUSE_RD_DISABLE_DL_ENCRYPT_S 7 +/* EFUSE_RD_DISABLE_JTAG : RO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: read for JTAG_disable*/ +#define EFUSE_RD_DISABLE_JTAG (BIT(6)) +#define EFUSE_RD_DISABLE_JTAG_M (BIT(6)) +#define EFUSE_RD_DISABLE_JTAG_V 0x1 +#define EFUSE_RD_DISABLE_JTAG_S 6 +/* EFUSE_RD_ABS_DONE_1 : RO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: read for abstract_done_1*/ +#define EFUSE_RD_ABS_DONE_1 (BIT(5)) +#define EFUSE_RD_ABS_DONE_1_M (BIT(5)) +#define EFUSE_RD_ABS_DONE_1_V 0x1 +#define EFUSE_RD_ABS_DONE_1_S 5 +/* EFUSE_RD_ABS_DONE_0 : RO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: read for abstract_done_0*/ +#define EFUSE_RD_ABS_DONE_0 (BIT(4)) +#define EFUSE_RD_ABS_DONE_0_M (BIT(4)) +#define EFUSE_RD_ABS_DONE_0_V 0x1 +#define EFUSE_RD_ABS_DONE_0_S 4 +/* EFUSE_RD_DISABLE_SDIO_HOST : RO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define EFUSE_RD_DISABLE_SDIO_HOST (BIT(3)) +#define EFUSE_RD_DISABLE_SDIO_HOST_M (BIT(3)) +#define EFUSE_RD_DISABLE_SDIO_HOST_V 0x1 +#define EFUSE_RD_DISABLE_SDIO_HOST_S 3 +/* EFUSE_RD_CONSOLE_DEBUG_DISABLE : RO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: read for console_debug_disable*/ +#define EFUSE_RD_CONSOLE_DEBUG_DISABLE (BIT(2)) +#define EFUSE_RD_CONSOLE_DEBUG_DISABLE_M (BIT(2)) +#define EFUSE_RD_CONSOLE_DEBUG_DISABLE_V 0x1 +#define EFUSE_RD_CONSOLE_DEBUG_DISABLE_S 2 +/* EFUSE_RD_CODING_SCHEME : RO ;bitpos:[1:0] ;default: 2'b0 ; */ +/*description: read for coding_scheme*/ +#define EFUSE_RD_CODING_SCHEME 0x00000003 +#define EFUSE_RD_CODING_SCHEME_M ((EFUSE_RD_CODING_SCHEME_V)<<(EFUSE_RD_CODING_SCHEME_S)) +#define EFUSE_RD_CODING_SCHEME_V 0x3 +#define EFUSE_RD_CODING_SCHEME_S 0 + +#define EFUSE_CODING_SCHEME_VAL_NONE 0x0 +#define EFUSE_CODING_SCHEME_VAL_34 0x1 +#define EFUSE_CODING_SCHEME_VAL_REPEAT 0x2 + +#define EFUSE_BLK0_WDATA0_REG (DR_REG_EFUSE_BASE + 0x01c) +/* EFUSE_FLASH_CRYPT_CNT : R/W ;bitpos:[26:20] ;default: 7'b0 ; */ +/*description: program for flash_crypt_cnt*/ +#define EFUSE_FLASH_CRYPT_CNT 0x0000007F +#define EFUSE_FLASH_CRYPT_CNT_M ((EFUSE_FLASH_CRYPT_CNT_V)<<(EFUSE_FLASH_CRYPT_CNT_S)) +#define EFUSE_FLASH_CRYPT_CNT_V 0x7F +#define EFUSE_FLASH_CRYPT_CNT_S 20 +/* EFUSE_RD_DIS : R/W ;bitpos:[19:16] ;default: 4'b0 ; */ +/*description: program for efuse_rd_disable*/ +#define EFUSE_RD_DIS 0x0000000F +#define EFUSE_RD_DIS_M ((EFUSE_RD_DIS_V)<<(EFUSE_RD_DIS_S)) +#define EFUSE_RD_DIS_V 0xF +#define EFUSE_RD_DIS_S 16 +/* EFUSE_WR_DIS : R/W ;bitpos:[15:0] ;default: 16'b0 ; */ +/*description: program for efuse_wr_disable*/ +#define EFUSE_WR_DIS 0x0000FFFF +#define EFUSE_WR_DIS_M ((EFUSE_WR_DIS_V)<<(EFUSE_WR_DIS_S)) +#define EFUSE_WR_DIS_V 0xFFFF +#define EFUSE_WR_DIS_S 0 + +#define EFUSE_BLK0_WDATA1_REG (DR_REG_EFUSE_BASE + 0x020) +/* EFUSE_WIFI_MAC_CRC_LOW : R/W ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: program for low 32bit WIFI_MAC_Address*/ +#define EFUSE_WIFI_MAC_CRC_LOW 0xFFFFFFFF +#define EFUSE_WIFI_MAC_CRC_LOW_M ((EFUSE_WIFI_MAC_CRC_LOW_V)<<(EFUSE_WIFI_MAC_CRC_LOW_S)) +#define EFUSE_WIFI_MAC_CRC_LOW_V 0xFFFFFFFF +#define EFUSE_WIFI_MAC_CRC_LOW_S 0 + +#define EFUSE_BLK0_WDATA2_REG (DR_REG_EFUSE_BASE + 0x024) +/* EFUSE_WIFI_MAC_CRC_HIGH : R/W ;bitpos:[23:0] ;default: 24'b0 ; */ +/*description: program for high 24bit WIFI_MAC_Address*/ +#define EFUSE_WIFI_MAC_CRC_HIGH 0x00FFFFFF +#define EFUSE_WIFI_MAC_CRC_HIGH_M ((EFUSE_WIFI_MAC_CRC_HIGH_V)<<(EFUSE_WIFI_MAC_CRC_HIGH_S)) +#define EFUSE_WIFI_MAC_CRC_HIGH_V 0xFFFFFF +#define EFUSE_WIFI_MAC_CRC_HIGH_S 0 + +#define EFUSE_BLK0_WDATA3_REG (DR_REG_EFUSE_BASE + 0x028) +/* EFUSE_CHIP_VER_REV1 : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define EFUSE_CHIP_VER_REV1 (BIT(15)) +#define EFUSE_CHIP_VER_REV1_M ((EFUSE_CHIP_VER_REV1_V)<<(EFUSE_CHIP_VER_REV1_S)) +#define EFUSE_CHIP_VER_REV1_V 0x1 +#define EFUSE_CHIP_VER_REV1_S 15 +/* EFUSE_BLK3_PART_RESERVE : R/W ; bitpos:[14] ; default: 1'b0; */ +/*description: If set, this bit indicates that BLOCK3[143:96] is reserved for internal use*/ +#define EFUSE_BLK3_PART_RESERVE (BIT(14)) +#define EFUSE_BLK3_PART_RESERVE_M ((EFUSE_BLK3_PART_RESERVE_V)<<(EFUSE_BLK3_PART_RESERVE_S)) +#define EFUSE_BLK3_PART_RESERVE_V 0x1 +#define EFUSE_BLK3_PART_RESERVE_S 14 +/* EFUSE_CHIP_CPU_FREQ_RATED : R/W ;bitpos:[13] ;default: 1'b0 ; */ +/*description: If set, the ESP32's maximum CPU frequency has been rated*/ +#define EFUSE_CHIP_CPU_FREQ_RATED (BIT(13)) +#define EFUSE_CHIP_CPU_FREQ_RATED_M ((EFUSE_CHIP_CPU_FREQ_RATED_V)<<(EFUSE_CHIP_CPU_FREQ_RATED_S)) +#define EFUSE_CHIP_CPU_FREQ_RATED_V 0x1 +#define EFUSE_CHIP_CPU_FREQ_RATED_S 13 +/* EFUSE_CHIP_CPU_FREQ_LOW : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: If set alongside EFUSE_CHIP_CPU_FREQ_RATED, the ESP32's max CPU frequency is rated for 160MHz. 240MHz otherwise*/ +#define EFUSE_CHIP_CPU_FREQ_LOW (BIT(12)) +#define EFUSE_CHIP_CPU_FREQ_LOW_M ((EFUSE_CHIP_CPU_FREQ_LOW_V)<<(EFUSE_CHIP_CPU_FREQ_LOW_S)) +#define EFUSE_CHIP_CPU_FREQ_LOW_V 0x1 +#define EFUSE_CHIP_CPU_FREQ_LOW_S 12 +/* EFUSE_CHIP_VER_PKG : R/W ;bitpos:[11:9] ;default: 3'b0 ; */ +/*description: */ +#define EFUSE_CHIP_VER_PKG 0x00000007 +#define EFUSE_CHIP_VER_PKG_M ((EFUSE_CHIP_VER_PKG_V)<<(EFUSE_CHIP_VER_PKG_S)) +#define EFUSE_CHIP_VER_PKG_V 0x7 +#define EFUSE_CHIP_VER_PKG_S 9 +#define EFUSE_CHIP_VER_PKG_ESP32D0WDQ6 0 +#define EFUSE_CHIP_VER_PKG_ESP32D0WDQ5 1 +#define EFUSE_CHIP_VER_PKG_ESP32D2WDQ5 2 +#define EFUSE_CHIP_VER_PKG_ESP32PICOD2 4 +#define EFUSE_CHIP_VER_PKG_ESP32PICOD4 5 +/* EFUSE_SPI_PAD_CONFIG_HD : R/W ;bitpos:[8:4] ;default: 5'b0 ; */ +/*description: program for SPI_pad_config_hd*/ +#define EFUSE_SPI_PAD_CONFIG_HD 0x0000001F +#define EFUSE_SPI_PAD_CONFIG_HD_M ((EFUSE_SPI_PAD_CONFIG_HD_V)<<(EFUSE_SPI_PAD_CONFIG_HD_S)) +#define EFUSE_SPI_PAD_CONFIG_HD_V 0x1F +#define EFUSE_SPI_PAD_CONFIG_HD_S 4 +/* EFUSE_CHIP_VER_DIS_CACHE : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define EFUSE_CHIP_VER_DIS_CACHE (BIT(3)) +#define EFUSE_CHIP_VER_DIS_CACHE_M (BIT(3)) +#define EFUSE_CHIP_VER_DIS_CACHE_V 0x1 +#define EFUSE_CHIP_VER_DIS_CACHE_S 3 +/* EFUSE_CHIP_VER_32PAD : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define EFUSE_CHIP_VER_32PAD (BIT(2)) +#define EFUSE_CHIP_VER_32PAD_M (BIT(2)) +#define EFUSE_CHIP_VER_32PAD_V 0x1 +#define EFUSE_CHIP_VER_32PAD_S 2 +/* EFUSE_CHIP_VER_DIS_BT : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define EFUSE_CHIP_VER_DIS_BT (BIT(1)) +#define EFUSE_CHIP_VER_DIS_BT_M (BIT(1)) +#define EFUSE_CHIP_VER_DIS_BT_V 0x1 +#define EFUSE_CHIP_VER_DIS_BT_S 1 +/* EFUSE_CHIP_VER_DIS_APP_CPU : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define EFUSE_CHIP_VER_DIS_APP_CPU (BIT(0)) +#define EFUSE_CHIP_VER_DIS_APP_CPU_M (BIT(0)) +#define EFUSE_CHIP_VER_DIS_APP_CPU_V 0x1 +#define EFUSE_CHIP_VER_DIS_APP_CPU_S 0 + +#define EFUSE_BLK0_WDATA4_REG (DR_REG_EFUSE_BASE + 0x02c) +/* EFUSE_SDIO_FORCE : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: program for sdio_force*/ +#define EFUSE_SDIO_FORCE (BIT(16)) +#define EFUSE_SDIO_FORCE_M (BIT(16)) +#define EFUSE_SDIO_FORCE_V 0x1 +#define EFUSE_SDIO_FORCE_S 16 +/* EFUSE_SDIO_TIEH : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: program for SDIO_TIEH*/ +#define EFUSE_SDIO_TIEH (BIT(15)) +#define EFUSE_SDIO_TIEH_M (BIT(15)) +#define EFUSE_SDIO_TIEH_V 0x1 +#define EFUSE_SDIO_TIEH_S 15 +/* EFUSE_XPD_SDIO_REG : R/W ;bitpos:[14] ;default: 1'b0 ; */ +/*description: program for XPD_SDIO_REG*/ +#define EFUSE_XPD_SDIO_REG (BIT(14)) +#define EFUSE_XPD_SDIO_REG_M (BIT(14)) +#define EFUSE_XPD_SDIO_REG_V 0x1 +#define EFUSE_XPD_SDIO_REG_S 14 +/* EFUSE_ADC_VREF : R/W ;bitpos:[12:8] ;default: 5'b0 ; */ +/*description: True ADC reference voltage */ +#define EFUSE_ADC_VREF 0x0000001F +#define EFUSE_ADC_VREF_M ((EFUSE_ADC_VREF_V)<<(EFUSE_ADC_VREF_S)) +#define EFUSE_ADC_VREF_V 0x1F +#define EFUSE_ADC_VREF_S 8 +/* Note: EFUSE_ADC_VREF and SDIO_DREFH/M/L share the same address space. Newer + * versions of ESP32 come with EFUSE_ADC_VREF already burned, therefore + * SDIO_DREFH/M/L is only available in older versions of ESP32 */ +/* EFUSE_SDIO_DREFL : R/W ;bitpos:[13:12] ;default: 2'b0 ; */ +/*description: */ +#define EFUSE_SDIO_DREFL 0x00000003 +#define EFUSE_SDIO_DREFL_M ((EFUSE_SDIO_DREFL_V)<<(EFUSE_SDIO_DREFL_S)) +#define EFUSE_SDIO_DREFL_V 0x3 +#define EFUSE_SDIO_DREFL_S 12 +/* EFUSE_SDIO_DREFM : R/W ;bitpos:[11:10] ;default: 2'b0 ; */ +/*description: */ +#define EFUSE_SDIO_DREFM 0x00000003 +#define EFUSE_SDIO_DREFM_M ((EFUSE_SDIO_DREFM_V)<<(EFUSE_SDIO_DREFM_S)) +#define EFUSE_SDIO_DREFM_V 0x3 +#define EFUSE_SDIO_DREFM_S 10 +/* EFUSE_SDIO_DREFH : R/W ;bitpos:[9:8] ;default: 2'b0 ; */ +/*description: */ +#define EFUSE_SDIO_DREFH 0x00000003 +#define EFUSE_SDIO_DREFH_M ((EFUSE_SDIO_DREFH_V)<<(EFUSE_SDIO_DREFH_S)) +#define EFUSE_SDIO_DREFH_V 0x3 +#define EFUSE_SDIO_DREFH_S 8 +/* EFUSE_CK8M_FREQ : R/W ;bitpos:[7:0] ;default: 8'b0 ; */ +/*description: */ +#define EFUSE_CK8M_FREQ 0x000000FF +#define EFUSE_CK8M_FREQ_M ((EFUSE_CK8M_FREQ_V)<<(EFUSE_CK8M_FREQ_S)) +#define EFUSE_CK8M_FREQ_V 0xFF +#define EFUSE_CK8M_FREQ_S 0 + +#define EFUSE_BLK0_WDATA5_REG (DR_REG_EFUSE_BASE + 0x030) +/* EFUSE_FLASH_CRYPT_CONFIG : R/W ;bitpos:[31:28] ;default: 4'b0 ; */ +/*description: program for flash_crypt_config*/ +#define EFUSE_FLASH_CRYPT_CONFIG 0x0000000F +#define EFUSE_FLASH_CRYPT_CONFIG_M ((EFUSE_FLASH_CRYPT_CONFIG_V)<<(EFUSE_FLASH_CRYPT_CONFIG_S)) +#define EFUSE_FLASH_CRYPT_CONFIG_V 0xF +#define EFUSE_FLASH_CRYPT_CONFIG_S 28 +/* EFUSE_DIG_VOL_L6: R/W; bitpos:[27:24]; */ +/*descritpion: This field stores the difference between the digital regulator voltage at level6 and 1.2 V. (R/W) + BIT[27] is the sign bit, 0: + , 1: - + BIT[26:24] is the difference value, unit: 0.017V + volt_lv6 = BIT[27] ? 1.2 - BIT[26:24] * 0.017 : 1.2 + BIT[26:24] * 0.017 */ +#define EFUSE_DIG_VOL_L6 0x0F +#define EFUSE_DIG_VOL_L6_M ((EFUSE_RD_DIG_VOL_L6_V)<<(EFUSE_RD_DIG_VOL_L6_S)) +#define EFUSE_DIG_VOL_L6_V 0x0F +#define EFUSE_DIG_VOL_L6_S 24 +/* EFUSE_VOL_LEVEL_HP_INV: R/W; bitpos:[23:22] */ +/*description: This field stores the voltage level for CPU to run at 240 MHz, or for flash/PSRAM to run at 80 MHz. +0x0: level 7; 0x1: level 6; 0x2: level 5; 0x3: level 4. (R/W)*/ +#define EFUSE_VOL_LEVEL_HP_INV 0x03 +#define EFUSE_VOL_LEVEL_HP_INV_M ((EFUSE_RD_VOL_LEVEL_HP_INV_V)<<(EFUSE_RD_VOL_LEVEL_HP_INV_S)) +#define EFUSE_VOL_LEVEL_HP_INV_V 0x03 +#define EFUSE_VOL_LEVEL_HP_INV_S 22 +/* EFUSE_INST_CONFIG : R/W ;bitpos:[27:20] ;default: 8'b0 ; */ +/* Deprecated */ +#define EFUSE_INST_CONFIG 0x000000FF /** Deprecated **/ +#define EFUSE_INST_CONFIG_M ((EFUSE_INST_CONFIG_V)<<(EFUSE_INST_CONFIG_S)) /** Deprecated **/ +#define EFUSE_INST_CONFIG_V 0xFF /** Deprecated **/ +#define EFUSE_INST_CONFIG_S 20 /** Deprecated **/ +/* EFUSE_SPI_PAD_CONFIG_CS0 : R/W ;bitpos:[19:15] ;default: 5'b0 ; */ +/*description: program for SPI_pad_config_cs0*/ +#define EFUSE_SPI_PAD_CONFIG_CS0 0x0000001F +#define EFUSE_SPI_PAD_CONFIG_CS0_M ((EFUSE_SPI_PAD_CONFIG_CS0_V)<<(EFUSE_SPI_PAD_CONFIG_CS0_S)) +#define EFUSE_SPI_PAD_CONFIG_CS0_V 0x1F +#define EFUSE_SPI_PAD_CONFIG_CS0_S 15 +/* EFUSE_SPI_PAD_CONFIG_D : R/W ;bitpos:[14:10] ;default: 5'b0 ; */ +/*description: program for SPI_pad_config_d*/ +#define EFUSE_SPI_PAD_CONFIG_D 0x0000001F +#define EFUSE_SPI_PAD_CONFIG_D_M ((EFUSE_SPI_PAD_CONFIG_D_V)<<(EFUSE_SPI_PAD_CONFIG_D_S)) +#define EFUSE_SPI_PAD_CONFIG_D_V 0x1F +#define EFUSE_SPI_PAD_CONFIG_D_S 10 +/* EFUSE_SPI_PAD_CONFIG_Q : R/W ;bitpos:[9:5] ;default: 5'b0 ; */ +/*description: program for SPI_pad_config_q*/ +#define EFUSE_SPI_PAD_CONFIG_Q 0x0000001F +#define EFUSE_SPI_PAD_CONFIG_Q_M ((EFUSE_SPI_PAD_CONFIG_Q_V)<<(EFUSE_SPI_PAD_CONFIG_Q_S)) +#define EFUSE_SPI_PAD_CONFIG_Q_V 0x1F +#define EFUSE_SPI_PAD_CONFIG_Q_S 5 +/* EFUSE_SPI_PAD_CONFIG_CLK : R/W ;bitpos:[4:0] ;default: 5'b0 ; */ +/*description: program for SPI_pad_config_clk*/ +#define EFUSE_SPI_PAD_CONFIG_CLK 0x0000001F +#define EFUSE_SPI_PAD_CONFIG_CLK_M ((EFUSE_SPI_PAD_CONFIG_CLK_V)<<(EFUSE_SPI_PAD_CONFIG_CLK_S)) +#define EFUSE_SPI_PAD_CONFIG_CLK_V 0x1F +#define EFUSE_SPI_PAD_CONFIG_CLK_S 0 + +#define EFUSE_BLK0_WDATA6_REG (DR_REG_EFUSE_BASE + 0x034) +/* EFUSE_KEY_STATUS : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: program for key_status*/ +#define EFUSE_KEY_STATUS (BIT(10)) +#define EFUSE_KEY_STATUS_M (BIT(10)) +#define EFUSE_KEY_STATUS_V 0x1 +#define EFUSE_KEY_STATUS_S 10 +/* EFUSE_DISABLE_DL_CACHE : R/W ;bitpos:[9] ;default: 1'b0 ; */ +/*description: program for download_dis_cache*/ +#define EFUSE_DISABLE_DL_CACHE (BIT(9)) +#define EFUSE_DISABLE_DL_CACHE_M (BIT(9)) +#define EFUSE_DISABLE_DL_CACHE_V 0x1 +#define EFUSE_DISABLE_DL_CACHE_S 9 +/* EFUSE_DISABLE_DL_DECRYPT : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: program for download_dis_decrypt*/ +#define EFUSE_DISABLE_DL_DECRYPT (BIT(8)) +#define EFUSE_DISABLE_DL_DECRYPT_M (BIT(8)) +#define EFUSE_DISABLE_DL_DECRYPT_V 0x1 +#define EFUSE_DISABLE_DL_DECRYPT_S 8 +/* EFUSE_DISABLE_DL_ENCRYPT : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: program for download_dis_encrypt*/ +#define EFUSE_DISABLE_DL_ENCRYPT (BIT(7)) +#define EFUSE_DISABLE_DL_ENCRYPT_M (BIT(7)) +#define EFUSE_DISABLE_DL_ENCRYPT_V 0x1 +#define EFUSE_DISABLE_DL_ENCRYPT_S 7 +/* EFUSE_DISABLE_JTAG : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: program for JTAG_disable*/ +#define EFUSE_DISABLE_JTAG (BIT(6)) +#define EFUSE_DISABLE_JTAG_M (BIT(6)) +#define EFUSE_DISABLE_JTAG_V 0x1 +#define EFUSE_DISABLE_JTAG_S 6 +/* EFUSE_ABS_DONE_1 : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: program for abstract_done_1*/ +#define EFUSE_ABS_DONE_1 (BIT(5)) +#define EFUSE_ABS_DONE_1_M (BIT(5)) +#define EFUSE_ABS_DONE_1_V 0x1 +#define EFUSE_ABS_DONE_1_S 5 +/* EFUSE_ABS_DONE_0 : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: program for abstract_done_0*/ +#define EFUSE_ABS_DONE_0 (BIT(4)) +#define EFUSE_ABS_DONE_0_M (BIT(4)) +#define EFUSE_ABS_DONE_0_V 0x1 +#define EFUSE_ABS_DONE_0_S 4 +/* EFUSE_DISABLE_SDIO_HOST : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define EFUSE_DISABLE_SDIO_HOST (BIT(3)) +#define EFUSE_DISABLE_SDIO_HOST_M (BIT(3)) +#define EFUSE_DISABLE_SDIO_HOST_V 0x1 +#define EFUSE_DISABLE_SDIO_HOST_S 3 +/* EFUSE_CONSOLE_DEBUG_DISABLE : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: program for console_debug_disable*/ +#define EFUSE_CONSOLE_DEBUG_DISABLE (BIT(2)) +#define EFUSE_CONSOLE_DEBUG_DISABLE_M (BIT(2)) +#define EFUSE_CONSOLE_DEBUG_DISABLE_V 0x1 +#define EFUSE_CONSOLE_DEBUG_DISABLE_S 2 +/* EFUSE_CODING_SCHEME : R/W ;bitpos:[1:0] ;default: 2'b0 ; */ +/*description: program for coding_scheme*/ +#define EFUSE_CODING_SCHEME 0x00000003 +#define EFUSE_CODING_SCHEME_M ((EFUSE_CODING_SCHEME_V)<<(EFUSE_CODING_SCHEME_S)) +#define EFUSE_CODING_SCHEME_V 0x3 +#define EFUSE_CODING_SCHEME_S 0 + +#define EFUSE_BLK1_RDATA0_REG (DR_REG_EFUSE_BASE + 0x038) +/* EFUSE_BLK1_DOUT0 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: read for BLOCK1*/ +#define EFUSE_BLK1_DOUT0 0xFFFFFFFF +#define EFUSE_BLK1_DOUT0_M ((EFUSE_BLK1_DOUT0_V)<<(EFUSE_BLK1_DOUT0_S)) +#define EFUSE_BLK1_DOUT0_V 0xFFFFFFFF +#define EFUSE_BLK1_DOUT0_S 0 + +#define EFUSE_BLK1_RDATA1_REG (DR_REG_EFUSE_BASE + 0x03c) +/* EFUSE_BLK1_DOUT1 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: read for BLOCK1*/ +#define EFUSE_BLK1_DOUT1 0xFFFFFFFF +#define EFUSE_BLK1_DOUT1_M ((EFUSE_BLK1_DOUT1_V)<<(EFUSE_BLK1_DOUT1_S)) +#define EFUSE_BLK1_DOUT1_V 0xFFFFFFFF +#define EFUSE_BLK1_DOUT1_S 0 + +#define EFUSE_BLK1_RDATA2_REG (DR_REG_EFUSE_BASE + 0x040) +/* EFUSE_BLK1_DOUT2 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: read for BLOCK1*/ +#define EFUSE_BLK1_DOUT2 0xFFFFFFFF +#define EFUSE_BLK1_DOUT2_M ((EFUSE_BLK1_DOUT2_V)<<(EFUSE_BLK1_DOUT2_S)) +#define EFUSE_BLK1_DOUT2_V 0xFFFFFFFF +#define EFUSE_BLK1_DOUT2_S 0 + +#define EFUSE_BLK1_RDATA3_REG (DR_REG_EFUSE_BASE + 0x044) +/* EFUSE_BLK1_DOUT3 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: read for BLOCK1*/ +#define EFUSE_BLK1_DOUT3 0xFFFFFFFF +#define EFUSE_BLK1_DOUT3_M ((EFUSE_BLK1_DOUT3_V)<<(EFUSE_BLK1_DOUT3_S)) +#define EFUSE_BLK1_DOUT3_V 0xFFFFFFFF +#define EFUSE_BLK1_DOUT3_S 0 + +#define EFUSE_BLK1_RDATA4_REG (DR_REG_EFUSE_BASE + 0x048) +/* EFUSE_BLK1_DOUT4 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: read for BLOCK1*/ +#define EFUSE_BLK1_DOUT4 0xFFFFFFFF +#define EFUSE_BLK1_DOUT4_M ((EFUSE_BLK1_DOUT4_V)<<(EFUSE_BLK1_DOUT4_S)) +#define EFUSE_BLK1_DOUT4_V 0xFFFFFFFF +#define EFUSE_BLK1_DOUT4_S 0 + +#define EFUSE_BLK1_RDATA5_REG (DR_REG_EFUSE_BASE + 0x04c) +/* EFUSE_BLK1_DOUT5 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: read for BLOCK1*/ +#define EFUSE_BLK1_DOUT5 0xFFFFFFFF +#define EFUSE_BLK1_DOUT5_M ((EFUSE_BLK1_DOUT5_V)<<(EFUSE_BLK1_DOUT5_S)) +#define EFUSE_BLK1_DOUT5_V 0xFFFFFFFF +#define EFUSE_BLK1_DOUT5_S 0 + +#define EFUSE_BLK1_RDATA6_REG (DR_REG_EFUSE_BASE + 0x050) +/* EFUSE_BLK1_DOUT6 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: read for BLOCK1*/ +#define EFUSE_BLK1_DOUT6 0xFFFFFFFF +#define EFUSE_BLK1_DOUT6_M ((EFUSE_BLK1_DOUT6_V)<<(EFUSE_BLK1_DOUT6_S)) +#define EFUSE_BLK1_DOUT6_V 0xFFFFFFFF +#define EFUSE_BLK1_DOUT6_S 0 + +#define EFUSE_BLK1_RDATA7_REG (DR_REG_EFUSE_BASE + 0x054) +/* EFUSE_BLK1_DOUT7 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: read for BLOCK1*/ +#define EFUSE_BLK1_DOUT7 0xFFFFFFFF +#define EFUSE_BLK1_DOUT7_M ((EFUSE_BLK1_DOUT7_V)<<(EFUSE_BLK1_DOUT7_S)) +#define EFUSE_BLK1_DOUT7_V 0xFFFFFFFF +#define EFUSE_BLK1_DOUT7_S 0 + +#define EFUSE_BLK2_RDATA0_REG (DR_REG_EFUSE_BASE + 0x058) +/* EFUSE_BLK2_DOUT0 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: read for BLOCK2*/ +#define EFUSE_BLK2_DOUT0 0xFFFFFFFF +#define EFUSE_BLK2_DOUT0_M ((EFUSE_BLK2_DOUT0_V)<<(EFUSE_BLK2_DOUT0_S)) +#define EFUSE_BLK2_DOUT0_V 0xFFFFFFFF +#define EFUSE_BLK2_DOUT0_S 0 + +#define EFUSE_BLK2_RDATA1_REG (DR_REG_EFUSE_BASE + 0x05c) +/* EFUSE_BLK2_DOUT1 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: read for BLOCK2*/ +#define EFUSE_BLK2_DOUT1 0xFFFFFFFF +#define EFUSE_BLK2_DOUT1_M ((EFUSE_BLK2_DOUT1_V)<<(EFUSE_BLK2_DOUT1_S)) +#define EFUSE_BLK2_DOUT1_V 0xFFFFFFFF +#define EFUSE_BLK2_DOUT1_S 0 + +#define EFUSE_BLK2_RDATA2_REG (DR_REG_EFUSE_BASE + 0x060) +/* EFUSE_BLK2_DOUT2 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: read for BLOCK2*/ +#define EFUSE_BLK2_DOUT2 0xFFFFFFFF +#define EFUSE_BLK2_DOUT2_M ((EFUSE_BLK2_DOUT2_V)<<(EFUSE_BLK2_DOUT2_S)) +#define EFUSE_BLK2_DOUT2_V 0xFFFFFFFF +#define EFUSE_BLK2_DOUT2_S 0 + +#define EFUSE_BLK2_RDATA3_REG (DR_REG_EFUSE_BASE + 0x064) +/* EFUSE_BLK2_DOUT3 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: read for BLOCK2*/ +#define EFUSE_BLK2_DOUT3 0xFFFFFFFF +#define EFUSE_BLK2_DOUT3_M ((EFUSE_BLK2_DOUT3_V)<<(EFUSE_BLK2_DOUT3_S)) +#define EFUSE_BLK2_DOUT3_V 0xFFFFFFFF +#define EFUSE_BLK2_DOUT3_S 0 + +#define EFUSE_BLK2_RDATA4_REG (DR_REG_EFUSE_BASE + 0x068) +/* EFUSE_BLK2_DOUT4 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: read for BLOCK2*/ +#define EFUSE_BLK2_DOUT4 0xFFFFFFFF +#define EFUSE_BLK2_DOUT4_M ((EFUSE_BLK2_DOUT4_V)<<(EFUSE_BLK2_DOUT4_S)) +#define EFUSE_BLK2_DOUT4_V 0xFFFFFFFF +#define EFUSE_BLK2_DOUT4_S 0 + +#define EFUSE_BLK2_RDATA5_REG (DR_REG_EFUSE_BASE + 0x06c) +/* EFUSE_BLK2_DOUT5 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: read for BLOCK2*/ +#define EFUSE_BLK2_DOUT5 0xFFFFFFFF +#define EFUSE_BLK2_DOUT5_M ((EFUSE_BLK2_DOUT5_V)<<(EFUSE_BLK2_DOUT5_S)) +#define EFUSE_BLK2_DOUT5_V 0xFFFFFFFF +#define EFUSE_BLK2_DOUT5_S 0 + +#define EFUSE_BLK2_RDATA6_REG (DR_REG_EFUSE_BASE + 0x070) +/* EFUSE_BLK2_DOUT6 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: read for BLOCK2*/ +#define EFUSE_BLK2_DOUT6 0xFFFFFFFF +#define EFUSE_BLK2_DOUT6_M ((EFUSE_BLK2_DOUT6_V)<<(EFUSE_BLK2_DOUT6_S)) +#define EFUSE_BLK2_DOUT6_V 0xFFFFFFFF +#define EFUSE_BLK2_DOUT6_S 0 + +#define EFUSE_BLK2_RDATA7_REG (DR_REG_EFUSE_BASE + 0x074) +/* EFUSE_BLK2_DOUT7 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: read for BLOCK2*/ +#define EFUSE_BLK2_DOUT7 0xFFFFFFFF +#define EFUSE_BLK2_DOUT7_M ((EFUSE_BLK2_DOUT7_V)<<(EFUSE_BLK2_DOUT7_S)) +#define EFUSE_BLK2_DOUT7_V 0xFFFFFFFF +#define EFUSE_BLK2_DOUT7_S 0 + +#define EFUSE_BLK3_RDATA0_REG (DR_REG_EFUSE_BASE + 0x078) +/* EFUSE_BLK3_DOUT0 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: read for BLOCK3*/ +#define EFUSE_BLK3_DOUT0 0xFFFFFFFF +#define EFUSE_BLK3_DOUT0_M ((EFUSE_BLK3_DOUT0_V)<<(EFUSE_BLK3_DOUT0_S)) +#define EFUSE_BLK3_DOUT0_V 0xFFFFFFFF +#define EFUSE_BLK3_DOUT0_S 0 + +#define EFUSE_BLK3_RDATA1_REG (DR_REG_EFUSE_BASE + 0x07c) +/* EFUSE_BLK3_DOUT1 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: read for BLOCK3*/ +#define EFUSE_BLK3_DOUT1 0xFFFFFFFF +#define EFUSE_BLK3_DOUT1_M ((EFUSE_BLK3_DOUT1_V)<<(EFUSE_BLK3_DOUT1_S)) +#define EFUSE_BLK3_DOUT1_V 0xFFFFFFFF +#define EFUSE_BLK3_DOUT1_S 0 + +#define EFUSE_BLK3_RDATA2_REG (DR_REG_EFUSE_BASE + 0x080) +/* EFUSE_BLK3_DOUT2 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: read for BLOCK3*/ +#define EFUSE_BLK3_DOUT2 0xFFFFFFFF +#define EFUSE_BLK3_DOUT2_M ((EFUSE_BLK3_DOUT2_V)<<(EFUSE_BLK3_DOUT2_S)) +#define EFUSE_BLK3_DOUT2_V 0xFFFFFFFF +#define EFUSE_BLK3_DOUT2_S 0 + +/* Note: Newer ESP32s utilize BLK3_DATA3 and parts of BLK3_DATA4 for calibration + * purposes. This usage is indicated by the EFUSE_RD_BLK3_PART_RESERVE bit.*/ +#define EFUSE_BLK3_RDATA3_REG (DR_REG_EFUSE_BASE + 0x084) +/* EFUSE_BLK3_DOUT3 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: read for BLOCK3*/ +#define EFUSE_BLK3_DOUT3 0xFFFFFFFF +#define EFUSE_BLK3_DOUT3_M ((EFUSE_BLK3_DOUT3_V)<<(EFUSE_BLK3_DOUT3_S)) +#define EFUSE_BLK3_DOUT3_V 0xFFFFFFFF +#define EFUSE_BLK3_DOUT3_S 0 +/* EFUSE_RD_ADC2_TP_HIGH : R/W ;bitpos:[31:23] ;default: 9'b0 ; */ +/*description: ADC2 Two Point calibration high point. Only valid if EFUSE_RD_BLK3_PART_RESERVE */ +#define EFUSE_RD_ADC2_TP_HIGH 0x1FF +#define EFUSE_RD_ADC2_TP_HIGH_M ((EFUSE_RD_ADC2_TP_HIGH_V)<<(EFUSE_RD_ADC2_TP_HIGH_S)) +#define EFUSE_RD_ADC2_TP_HIGH_V 0x1FF +#define EFUSE_RD_ADC2_TP_HIGH_S 23 +/* EFUSE_RD_ADC2_TP_LOW : R/W ;bitpos:[22:16] ;default: 7'b0 ; */ +/*description: ADC2 Two Point calibration low point. Only valid if EFUSE_RD_BLK3_PART_RESERVE */ +#define EFUSE_RD_ADC2_TP_LOW 0x7F +#define EFUSE_RD_ADC2_TP_LOW_M ((EFUSE_RD_ADC2_TP_LOW_V)<<(EFUSE_RD_ADC2_TP_LOW_S)) +#define EFUSE_RD_ADC2_TP_LOW_V 0x7F +#define EFUSE_RD_ADC2_TP_LOW_S 16 +/* EFUSE_RD_ADC1_TP_HIGH : R/W ;bitpos:[15:7] ;default: 9'b0 ; */ +/*description: ADC1 Two Point calibration high point. Only valid if EFUSE_RD_BLK3_PART_RESERVE */ +#define EFUSE_RD_ADC1_TP_HIGH 0x1FF +#define EFUSE_RD_ADC1_TP_HIGH_M ((EFUSE_RD_ADC1_TP_HIGH_V)<<(EFUSE_RD_ADC1_TP_HIGH_S)) +#define EFUSE_RD_ADC1_TP_HIGH_V 0x1FF +#define EFUSE_RD_ADC1_TP_HIGH_S 7 +/* EFUSE_RD_ADC1_TP_LOW : R/W ;bitpos:[6:0] ;default: 7'b0 ; */ +/*description: ADC1 Two Point calibration low point. Only valid if EFUSE_RD_BLK3_PART_RESERVE */ +#define EFUSE_RD_ADC1_TP_LOW 0x7F +#define EFUSE_RD_ADC1_TP_LOW_M ((EFUSE_RD_ADC1_TP_LOW_V)<<(EFUSE_RD_ADC1_TP_LOW_S)) +#define EFUSE_RD_ADC1_TP_LOW_V 0x7F +#define EFUSE_RD_ADC1_TP_LOW_S 0 + +#define EFUSE_BLK3_RDATA4_REG (DR_REG_EFUSE_BASE + 0x088) +/* EFUSE_BLK3_DOUT4 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: read for BLOCK3*/ +#define EFUSE_BLK3_DOUT4 0xFFFFFFFF +#define EFUSE_BLK3_DOUT4_M ((EFUSE_BLK3_DOUT4_V)<<(EFUSE_BLK3_DOUT4_S)) +#define EFUSE_BLK3_DOUT4_V 0xFFFFFFFF +#define EFUSE_BLK3_DOUT4_S 0 +/* EFUSE_RD_CAL_RESERVED: R/W ; bitpos:[0:15] ; default : 16'h0 ; */ +/*description: Reserved for future calibration use. Indicated by EFUSE_RD_BLK3_PART_RESERVE */ +#define EFUSE_RD_CAL_RESERVED 0x0000FFFF +#define EFUSE_RD_CAL_RESERVED_M ((EFUSE_RD_CAL_RESERVED_V)<<(EFUSE_RD_CAL_RESERVED_S)) +#define EFUSE_RD_CAL_RESERVED_V 0xFFFF +#define EFUSE_RD_CAL_RESERVED_S 0 + +#define EFUSE_BLK3_RDATA5_REG (DR_REG_EFUSE_BASE + 0x08c) +/* EFUSE_BLK3_DOUT5 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: read for BLOCK3*/ +#define EFUSE_BLK3_DOUT5 0xFFFFFFFF +#define EFUSE_BLK3_DOUT5_M ((EFUSE_BLK3_DOUT5_V)<<(EFUSE_BLK3_DOUT5_S)) +#define EFUSE_BLK3_DOUT5_V 0xFFFFFFFF +#define EFUSE_BLK3_DOUT5_S 0 + +#define EFUSE_BLK3_RDATA6_REG (DR_REG_EFUSE_BASE + 0x090) +/* EFUSE_BLK3_DOUT6 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: read for BLOCK3*/ +#define EFUSE_BLK3_DOUT6 0xFFFFFFFF +#define EFUSE_BLK3_DOUT6_M ((EFUSE_BLK3_DOUT6_V)<<(EFUSE_BLK3_DOUT6_S)) +#define EFUSE_BLK3_DOUT6_V 0xFFFFFFFF +#define EFUSE_BLK3_DOUT6_S 0 + +#define EFUSE_BLK3_RDATA7_REG (DR_REG_EFUSE_BASE + 0x094) +/* EFUSE_BLK3_DOUT7 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: read for BLOCK3*/ +#define EFUSE_BLK3_DOUT7 0xFFFFFFFF +#define EFUSE_BLK3_DOUT7_M ((EFUSE_BLK3_DOUT7_V)<<(EFUSE_BLK3_DOUT7_S)) +#define EFUSE_BLK3_DOUT7_V 0xFFFFFFFF +#define EFUSE_BLK3_DOUT7_S 0 + +#define EFUSE_BLK1_WDATA0_REG (DR_REG_EFUSE_BASE + 0x098) +/* EFUSE_BLK1_DIN0 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: program for BLOCK1*/ +#define EFUSE_BLK1_DIN0 0xFFFFFFFF +#define EFUSE_BLK1_DIN0_M ((EFUSE_BLK1_DIN0_V)<<(EFUSE_BLK1_DIN0_S)) +#define EFUSE_BLK1_DIN0_V 0xFFFFFFFF +#define EFUSE_BLK1_DIN0_S 0 + +#define EFUSE_BLK1_WDATA1_REG (DR_REG_EFUSE_BASE + 0x09c) +/* EFUSE_BLK1_DIN1 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: program for BLOCK1*/ +#define EFUSE_BLK1_DIN1 0xFFFFFFFF +#define EFUSE_BLK1_DIN1_M ((EFUSE_BLK1_DIN1_V)<<(EFUSE_BLK1_DIN1_S)) +#define EFUSE_BLK1_DIN1_V 0xFFFFFFFF +#define EFUSE_BLK1_DIN1_S 0 + +#define EFUSE_BLK1_WDATA2_REG (DR_REG_EFUSE_BASE + 0x0a0) +/* EFUSE_BLK1_DIN2 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: program for BLOCK1*/ +#define EFUSE_BLK1_DIN2 0xFFFFFFFF +#define EFUSE_BLK1_DIN2_M ((EFUSE_BLK1_DIN2_V)<<(EFUSE_BLK1_DIN2_S)) +#define EFUSE_BLK1_DIN2_V 0xFFFFFFFF +#define EFUSE_BLK1_DIN2_S 0 + +#define EFUSE_BLK1_WDATA3_REG (DR_REG_EFUSE_BASE + 0x0a4) +/* EFUSE_BLK1_DIN3 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: program for BLOCK1*/ +#define EFUSE_BLK1_DIN3 0xFFFFFFFF +#define EFUSE_BLK1_DIN3_M ((EFUSE_BLK1_DIN3_V)<<(EFUSE_BLK1_DIN3_S)) +#define EFUSE_BLK1_DIN3_V 0xFFFFFFFF +#define EFUSE_BLK1_DIN3_S 0 + +#define EFUSE_BLK1_WDATA4_REG (DR_REG_EFUSE_BASE + 0x0a8) +/* EFUSE_BLK1_DIN4 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: program for BLOCK1*/ +#define EFUSE_BLK1_DIN4 0xFFFFFFFF +#define EFUSE_BLK1_DIN4_M ((EFUSE_BLK1_DIN4_V)<<(EFUSE_BLK1_DIN4_S)) +#define EFUSE_BLK1_DIN4_V 0xFFFFFFFF +#define EFUSE_BLK1_DIN4_S 0 + +#define EFUSE_BLK1_WDATA5_REG (DR_REG_EFUSE_BASE + 0x0ac) +/* EFUSE_BLK1_DIN5 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: program for BLOCK1*/ +#define EFUSE_BLK1_DIN5 0xFFFFFFFF +#define EFUSE_BLK1_DIN5_M ((EFUSE_BLK1_DIN5_V)<<(EFUSE_BLK1_DIN5_S)) +#define EFUSE_BLK1_DIN5_V 0xFFFFFFFF +#define EFUSE_BLK1_DIN5_S 0 + +#define EFUSE_BLK1_WDATA6_REG (DR_REG_EFUSE_BASE + 0x0b0) +/* EFUSE_BLK1_DIN6 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: program for BLOCK1*/ +#define EFUSE_BLK1_DIN6 0xFFFFFFFF +#define EFUSE_BLK1_DIN6_M ((EFUSE_BLK1_DIN6_V)<<(EFUSE_BLK1_DIN6_S)) +#define EFUSE_BLK1_DIN6_V 0xFFFFFFFF +#define EFUSE_BLK1_DIN6_S 0 + +#define EFUSE_BLK1_WDATA7_REG (DR_REG_EFUSE_BASE + 0x0b4) +/* EFUSE_BLK1_DIN7 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: program for BLOCK1*/ +#define EFUSE_BLK1_DIN7 0xFFFFFFFF +#define EFUSE_BLK1_DIN7_M ((EFUSE_BLK1_DIN7_V)<<(EFUSE_BLK1_DIN7_S)) +#define EFUSE_BLK1_DIN7_V 0xFFFFFFFF +#define EFUSE_BLK1_DIN7_S 0 + +#define EFUSE_BLK2_WDATA0_REG (DR_REG_EFUSE_BASE + 0x0b8) +/* EFUSE_BLK2_DIN0 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: program for BLOCK2*/ +#define EFUSE_BLK2_DIN0 0xFFFFFFFF +#define EFUSE_BLK2_DIN0_M ((EFUSE_BLK2_DIN0_V)<<(EFUSE_BLK2_DIN0_S)) +#define EFUSE_BLK2_DIN0_V 0xFFFFFFFF +#define EFUSE_BLK2_DIN0_S 0 + +#define EFUSE_BLK2_WDATA1_REG (DR_REG_EFUSE_BASE + 0x0bc) +/* EFUSE_BLK2_DIN1 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: program for BLOCK2*/ +#define EFUSE_BLK2_DIN1 0xFFFFFFFF +#define EFUSE_BLK2_DIN1_M ((EFUSE_BLK2_DIN1_V)<<(EFUSE_BLK2_DIN1_S)) +#define EFUSE_BLK2_DIN1_V 0xFFFFFFFF +#define EFUSE_BLK2_DIN1_S 0 + +#define EFUSE_BLK2_WDATA2_REG (DR_REG_EFUSE_BASE + 0x0c0) +/* EFUSE_BLK2_DIN2 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: program for BLOCK2*/ +#define EFUSE_BLK2_DIN2 0xFFFFFFFF +#define EFUSE_BLK2_DIN2_M ((EFUSE_BLK2_DIN2_V)<<(EFUSE_BLK2_DIN2_S)) +#define EFUSE_BLK2_DIN2_V 0xFFFFFFFF +#define EFUSE_BLK2_DIN2_S 0 + +#define EFUSE_BLK2_WDATA3_REG (DR_REG_EFUSE_BASE + 0x0c4) +/* EFUSE_BLK2_DIN3 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: program for BLOCK2*/ +#define EFUSE_BLK2_DIN3 0xFFFFFFFF +#define EFUSE_BLK2_DIN3_M ((EFUSE_BLK2_DIN3_V)<<(EFUSE_BLK2_DIN3_S)) +#define EFUSE_BLK2_DIN3_V 0xFFFFFFFF +#define EFUSE_BLK2_DIN3_S 0 + +#define EFUSE_BLK2_WDATA4_REG (DR_REG_EFUSE_BASE + 0x0c8) +/* EFUSE_BLK2_DIN4 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: program for BLOCK2*/ +#define EFUSE_BLK2_DIN4 0xFFFFFFFF +#define EFUSE_BLK2_DIN4_M ((EFUSE_BLK2_DIN4_V)<<(EFUSE_BLK2_DIN4_S)) +#define EFUSE_BLK2_DIN4_V 0xFFFFFFFF +#define EFUSE_BLK2_DIN4_S 0 + +#define EFUSE_BLK2_WDATA5_REG (DR_REG_EFUSE_BASE + 0x0cc) +/* EFUSE_BLK2_DIN5 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: program for BLOCK2*/ +#define EFUSE_BLK2_DIN5 0xFFFFFFFF +#define EFUSE_BLK2_DIN5_M ((EFUSE_BLK2_DIN5_V)<<(EFUSE_BLK2_DIN5_S)) +#define EFUSE_BLK2_DIN5_V 0xFFFFFFFF +#define EFUSE_BLK2_DIN5_S 0 + +#define EFUSE_BLK2_WDATA6_REG (DR_REG_EFUSE_BASE + 0x0d0) +/* EFUSE_BLK2_DIN6 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: program for BLOCK2*/ +#define EFUSE_BLK2_DIN6 0xFFFFFFFF +#define EFUSE_BLK2_DIN6_M ((EFUSE_BLK2_DIN6_V)<<(EFUSE_BLK2_DIN6_S)) +#define EFUSE_BLK2_DIN6_V 0xFFFFFFFF +#define EFUSE_BLK2_DIN6_S 0 + +#define EFUSE_BLK2_WDATA7_REG (DR_REG_EFUSE_BASE + 0x0d4) +/* EFUSE_BLK2_DIN7 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: program for BLOCK2*/ +#define EFUSE_BLK2_DIN7 0xFFFFFFFF +#define EFUSE_BLK2_DIN7_M ((EFUSE_BLK2_DIN7_V)<<(EFUSE_BLK2_DIN7_S)) +#define EFUSE_BLK2_DIN7_V 0xFFFFFFFF +#define EFUSE_BLK2_DIN7_S 0 + +#define EFUSE_BLK3_WDATA0_REG (DR_REG_EFUSE_BASE + 0x0d8) +/* EFUSE_BLK3_DIN0 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: program for BLOCK3*/ +#define EFUSE_BLK3_DIN0 0xFFFFFFFF +#define EFUSE_BLK3_DIN0_M ((EFUSE_BLK3_DIN0_V)<<(EFUSE_BLK3_DIN0_S)) +#define EFUSE_BLK3_DIN0_V 0xFFFFFFFF +#define EFUSE_BLK3_DIN0_S 0 + +#define EFUSE_BLK3_WDATA1_REG (DR_REG_EFUSE_BASE + 0x0dc) +/* EFUSE_BLK3_DIN1 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: program for BLOCK3*/ +#define EFUSE_BLK3_DIN1 0xFFFFFFFF +#define EFUSE_BLK3_DIN1_M ((EFUSE_BLK3_DIN1_V)<<(EFUSE_BLK3_DIN1_S)) +#define EFUSE_BLK3_DIN1_V 0xFFFFFFFF +#define EFUSE_BLK3_DIN1_S 0 + +#define EFUSE_BLK3_WDATA2_REG (DR_REG_EFUSE_BASE + 0x0e0) +/* EFUSE_BLK3_DIN2 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: program for BLOCK3*/ +#define EFUSE_BLK3_DIN2 0xFFFFFFFF +#define EFUSE_BLK3_DIN2_M ((EFUSE_BLK3_DIN2_V)<<(EFUSE_BLK3_DIN2_S)) +#define EFUSE_BLK3_DIN2_V 0xFFFFFFFF +#define EFUSE_BLK3_DIN2_S 0 + +/* Note: Newer ESP32s utilize BLK3_DATA3 and parts of BLK3_DATA4 for calibration + * purposes. This usage is indicated by the EFUSE_RD_BLK3_PART_RESERVE bit.*/ +#define EFUSE_BLK3_WDATA3_REG (DR_REG_EFUSE_BASE + 0x0e4) +/* EFUSE_BLK3_DIN3 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: program for BLOCK3*/ +#define EFUSE_BLK3_DIN3 0xFFFFFFFF +#define EFUSE_BLK3_DIN3_M ((EFUSE_BLK3_DIN3_V)<<(EFUSE_BLK3_DIN3_S)) +#define EFUSE_BLK3_DIN3_V 0xFFFFFFFF +#define EFUSE_BLK3_DIN3_S 0 +/* EFUSE_ADC2_TP_HIGH : R/W ;bitpos:[31:23] ;default: 9'b0 ; */ +/*description: ADC2 Two Point calibration high point. Only valid if EFUSE_RD_BLK3_PART_RESERVE */ +#define EFUSE_ADC2_TP_HIGH 0x1FF +#define EFUSE_ADC2_TP_HIGH_M ((EFUSE_ADC2_TP_HIGH_V)<<(EFUSE_ADC2_TP_HIGH_S)) +#define EFUSE_ADC2_TP_HIGH_V 0x1FF +#define EFUSE_ADC2_TP_HIGH_S 23 +/* EFUSE_ADC2_TP_LOW : R/W ;bitpos:[22:16] ;default: 7'b0 ; */ +/*description: ADC2 Two Point calibration low point. Only valid if EFUSE_RD_BLK3_PART_RESERVE */ +#define EFUSE_ADC2_TP_LOW 0x7F +#define EFUSE_ADC2_TP_LOW_M ((EFUSE_ADC2_TP_LOW_V)<<(EFUSE_ADC2_TP_LOW_S)) +#define EFUSE_ADC2_TP_LOW_V 0x7F +#define EFUSE_ADC2_TP_LOW_S 16 +/* EFUSE_ADC1_TP_HIGH : R/W ;bitpos:[15:7] ;default: 9'b0 ; */ +/*description: ADC1 Two Point calibration high point. Only valid if EFUSE_RD_BLK3_PART_RESERVE */ +#define EFUSE_ADC1_TP_HIGH 0x1FF +#define EFUSE_ADC1_TP_HIGH_M ((EFUSE_ADC1_TP_HIGH_V)<<(EFUSE_ADC1_TP_HIGH_S)) +#define EFUSE_ADC1_TP_HIGH_V 0x1FF +#define EFUSE_ADC1_TP_HIGH_S 7 +/* EFUSE_ADC1_TP_LOW : R/W ;bitpos:[6:0] ;default: 7'b0 ; */ +/*description: ADC1 Two Point calibration low point. Only valid if EFUSE_RD_BLK3_PART_RESERVE */ +#define EFUSE_ADC1_TP_LOW 0x7F +#define EFUSE_ADC1_TP_LOW_M ((EFUSE_ADC1_TP_LOW_V)<<(EFUSE_ADC1_TP_LOW_S)) +#define EFUSE_ADC1_TP_LOW_V 0x7F +#define EFUSE_ADC1_TP_LOW_S 0 + +#define EFUSE_BLK3_WDATA4_REG (DR_REG_EFUSE_BASE + 0x0e8) +/* EFUSE_BLK3_DIN4 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: program for BLOCK3*/ +#define EFUSE_BLK3_DIN4 0xFFFFFFFF +#define EFUSE_BLK3_DIN4_M ((EFUSE_BLK3_DIN4_V)<<(EFUSE_BLK3_DIN4_S)) +#define EFUSE_BLK3_DIN4_V 0xFFFFFFFF +#define EFUSE_BLK3_DIN4_S 0 +/* EFUSE_CAL_RESERVED: R/W ; bitpos:[0:15] ; default : 16'h0 ; */ +/*description: Reserved for future calibration use. Indicated by EFUSE_BLK3_PART_RESERVE */ +#define EFUSE_CAL_RESERVED 0x0000FFFF +#define EFUSE_CAL_RESERVED_M ((EFUSE_CAL_RESERVED_V)<<(EFUSE_CAL_RESERVED_S)) +#define EFUSE_CAL_RESERVED_V 0xFFFF +#define EFUSE_CAL_RESERVED_S 0 + +#define EFUSE_BLK3_WDATA5_REG (DR_REG_EFUSE_BASE + 0x0ec) +/* EFUSE_BLK3_DIN5 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: program for BLOCK3*/ +#define EFUSE_BLK3_DIN5 0xFFFFFFFF +#define EFUSE_BLK3_DIN5_M ((EFUSE_BLK3_DIN5_V)<<(EFUSE_BLK3_DIN5_S)) +#define EFUSE_BLK3_DIN5_V 0xFFFFFFFF +#define EFUSE_BLK3_DIN5_S 0 + +#define EFUSE_BLK3_WDATA6_REG (DR_REG_EFUSE_BASE + 0x0f0) +/* EFUSE_BLK3_DIN6 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: program for BLOCK3*/ +#define EFUSE_BLK3_DIN6 0xFFFFFFFF +#define EFUSE_BLK3_DIN6_M ((EFUSE_BLK3_DIN6_V)<<(EFUSE_BLK3_DIN6_S)) +#define EFUSE_BLK3_DIN6_V 0xFFFFFFFF +#define EFUSE_BLK3_DIN6_S 0 + +#define EFUSE_BLK3_WDATA7_REG (DR_REG_EFUSE_BASE + 0x0f4) +/* EFUSE_BLK3_DIN7 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: program for BLOCK3*/ +#define EFUSE_BLK3_DIN7 0xFFFFFFFF +#define EFUSE_BLK3_DIN7_M ((EFUSE_BLK3_DIN7_V)<<(EFUSE_BLK3_DIN7_S)) +#define EFUSE_BLK3_DIN7_V 0xFFFFFFFF +#define EFUSE_BLK3_DIN7_S 0 + +#define EFUSE_CLK_REG (DR_REG_EFUSE_BASE + 0x0f8) +/* EFUSE_CLK_EN : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define EFUSE_CLK_EN (BIT(16)) +#define EFUSE_CLK_EN_M (BIT(16)) +#define EFUSE_CLK_EN_V 0x1 +#define EFUSE_CLK_EN_S 16 +/* EFUSE_CLK_SEL1 : R/W ;bitpos:[15:8] ;default: 8'h40 ; */ +/*description: efuse timing configure*/ +#define EFUSE_CLK_SEL1 0x000000FF +#define EFUSE_CLK_SEL1_M ((EFUSE_CLK_SEL1_V)<<(EFUSE_CLK_SEL1_S)) +#define EFUSE_CLK_SEL1_V 0xFF +#define EFUSE_CLK_SEL1_S 8 +/* EFUSE_CLK_SEL0 : R/W ;bitpos:[7:0] ;default: 8'h52 ; */ +/*description: efuse timing configure*/ +#define EFUSE_CLK_SEL0 0x000000FF +#define EFUSE_CLK_SEL0_M ((EFUSE_CLK_SEL0_V)<<(EFUSE_CLK_SEL0_S)) +#define EFUSE_CLK_SEL0_V 0xFF +#define EFUSE_CLK_SEL0_S 0 + +#define EFUSE_CONF_REG (DR_REG_EFUSE_BASE + 0x0fc) +/* EFUSE_FORCE_NO_WR_RD_DIS : R/W ;bitpos:[16] ;default: 1'h1 ; */ +/*description: */ +#define EFUSE_FORCE_NO_WR_RD_DIS (BIT(16)) +#define EFUSE_FORCE_NO_WR_RD_DIS_M (BIT(16)) +#define EFUSE_FORCE_NO_WR_RD_DIS_V 0x1 +#define EFUSE_FORCE_NO_WR_RD_DIS_S 16 +/* EFUSE_OP_CODE : R/W ;bitpos:[15:0] ;default: 16'h0 ; */ +/*description: efuse operation code*/ +#define EFUSE_OP_CODE 0x0000FFFF +#define EFUSE_OP_CODE_M ((EFUSE_OP_CODE_V)<<(EFUSE_OP_CODE_S)) +#define EFUSE_OP_CODE_V 0xFFFF +#define EFUSE_OP_CODE_S 0 + +#define EFUSE_STATUS_REG (DR_REG_EFUSE_BASE + 0x100) +/* EFUSE_DEBUG : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define EFUSE_DEBUG 0xFFFFFFFF +#define EFUSE_DEBUG_M ((EFUSE_DEBUG_V)<<(EFUSE_DEBUG_S)) +#define EFUSE_DEBUG_V 0xFFFFFFFF +#define EFUSE_DEBUG_S 0 + +#define EFUSE_CMD_REG (DR_REG_EFUSE_BASE + 0x104) +/* EFUSE_PGM_CMD : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: command for program*/ +#define EFUSE_PGM_CMD (BIT(1)) +#define EFUSE_PGM_CMD_M (BIT(1)) +#define EFUSE_PGM_CMD_V 0x1 +#define EFUSE_PGM_CMD_S 1 +/* EFUSE_READ_CMD : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: command for read*/ +#define EFUSE_READ_CMD (BIT(0)) +#define EFUSE_READ_CMD_M (BIT(0)) +#define EFUSE_READ_CMD_V 0x1 +#define EFUSE_READ_CMD_S 0 + +#define EFUSE_INT_RAW_REG (DR_REG_EFUSE_BASE + 0x108) +/* EFUSE_PGM_DONE_INT_RAW : RO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: program done interrupt raw status*/ +#define EFUSE_PGM_DONE_INT_RAW (BIT(1)) +#define EFUSE_PGM_DONE_INT_RAW_M (BIT(1)) +#define EFUSE_PGM_DONE_INT_RAW_V 0x1 +#define EFUSE_PGM_DONE_INT_RAW_S 1 +/* EFUSE_READ_DONE_INT_RAW : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: read done interrupt raw status*/ +#define EFUSE_READ_DONE_INT_RAW (BIT(0)) +#define EFUSE_READ_DONE_INT_RAW_M (BIT(0)) +#define EFUSE_READ_DONE_INT_RAW_V 0x1 +#define EFUSE_READ_DONE_INT_RAW_S 0 + +#define EFUSE_INT_ST_REG (DR_REG_EFUSE_BASE + 0x10c) +/* EFUSE_PGM_DONE_INT_ST : RO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: program done interrupt status*/ +#define EFUSE_PGM_DONE_INT_ST (BIT(1)) +#define EFUSE_PGM_DONE_INT_ST_M (BIT(1)) +#define EFUSE_PGM_DONE_INT_ST_V 0x1 +#define EFUSE_PGM_DONE_INT_ST_S 1 +/* EFUSE_READ_DONE_INT_ST : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: read done interrupt status*/ +#define EFUSE_READ_DONE_INT_ST (BIT(0)) +#define EFUSE_READ_DONE_INT_ST_M (BIT(0)) +#define EFUSE_READ_DONE_INT_ST_V 0x1 +#define EFUSE_READ_DONE_INT_ST_S 0 + +#define EFUSE_INT_ENA_REG (DR_REG_EFUSE_BASE + 0x110) +/* EFUSE_PGM_DONE_INT_ENA : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: program done interrupt enable*/ +#define EFUSE_PGM_DONE_INT_ENA (BIT(1)) +#define EFUSE_PGM_DONE_INT_ENA_M (BIT(1)) +#define EFUSE_PGM_DONE_INT_ENA_V 0x1 +#define EFUSE_PGM_DONE_INT_ENA_S 1 +/* EFUSE_READ_DONE_INT_ENA : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: read done interrupt enable*/ +#define EFUSE_READ_DONE_INT_ENA (BIT(0)) +#define EFUSE_READ_DONE_INT_ENA_M (BIT(0)) +#define EFUSE_READ_DONE_INT_ENA_V 0x1 +#define EFUSE_READ_DONE_INT_ENA_S 0 + +#define EFUSE_INT_CLR_REG (DR_REG_EFUSE_BASE + 0x114) +/* EFUSE_PGM_DONE_INT_CLR : WO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: program done interrupt clear*/ +#define EFUSE_PGM_DONE_INT_CLR (BIT(1)) +#define EFUSE_PGM_DONE_INT_CLR_M (BIT(1)) +#define EFUSE_PGM_DONE_INT_CLR_V 0x1 +#define EFUSE_PGM_DONE_INT_CLR_S 1 +/* EFUSE_READ_DONE_INT_CLR : WO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: read done interrupt clear*/ +#define EFUSE_READ_DONE_INT_CLR (BIT(0)) +#define EFUSE_READ_DONE_INT_CLR_M (BIT(0)) +#define EFUSE_READ_DONE_INT_CLR_V 0x1 +#define EFUSE_READ_DONE_INT_CLR_S 0 + +#define EFUSE_DAC_CONF_REG (DR_REG_EFUSE_BASE + 0x118) +/* EFUSE_DAC_CLK_PAD_SEL : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define EFUSE_DAC_CLK_PAD_SEL (BIT(8)) +#define EFUSE_DAC_CLK_PAD_SEL_M (BIT(8)) +#define EFUSE_DAC_CLK_PAD_SEL_V 0x1 +#define EFUSE_DAC_CLK_PAD_SEL_S 8 +/* EFUSE_DAC_CLK_DIV : R/W ;bitpos:[7:0] ;default: 8'd40 ; */ +/*description: efuse timing configure*/ +#define EFUSE_DAC_CLK_DIV 0x000000FF +#define EFUSE_DAC_CLK_DIV_M ((EFUSE_DAC_CLK_DIV_V)<<(EFUSE_DAC_CLK_DIV_S)) +#define EFUSE_DAC_CLK_DIV_V 0xFF +#define EFUSE_DAC_CLK_DIV_S 0 + +#define EFUSE_DEC_STATUS_REG (DR_REG_EFUSE_BASE + 0x11c) +/* EFUSE_DEC_WARNINGS : RO ;bitpos:[11:0] ;default: 12'b0 ; */ +/*description: the decode result of 3/4 coding scheme has warning*/ +#define EFUSE_DEC_WARNINGS 0x00000FFF +#define EFUSE_DEC_WARNINGS_M ((EFUSE_DEC_WARNINGS_V)<<(EFUSE_DEC_WARNINGS_S)) +#define EFUSE_DEC_WARNINGS_V 0xFFF +#define EFUSE_DEC_WARNINGS_S 0 + +#define EFUSE_DATE_REG (DR_REG_EFUSE_BASE + 0x1FC) +/* EFUSE_DATE : R/W ;bitpos:[31:0] ;default: 32'h16042600 ; */ +/*description: */ +#define EFUSE_DATE 0xFFFFFFFF +#define EFUSE_DATE_M ((EFUSE_DATE_V)<<(EFUSE_DATE_S)) +#define EFUSE_DATE_V 0xFFFFFFFF +#define EFUSE_DATE_S 0 + + + + +#endif /*_SOC_EFUSE_REG_H_ */ + + diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/emac_dma_struct.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/emac_dma_struct.h new file mode 100644 index 0000000000000..35d1361281866 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/emac_dma_struct.h @@ -0,0 +1,162 @@ +// 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 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include + +typedef volatile struct { + union { + struct { + uint32_t sw_rst : 1; /*When this bit is set the MAC DMA Controller resets the logic and all internal registers of the MAC. It is cleared automatically after the reset operation is complete in all of the ETH_MAC clock domains. Before reprogramming any register of the ETH_MAC you should read a zero (0) value in this bit.*/ + uint32_t dma_arb_sch : 1; /*This bit specifies the arbitration scheme between the transmit and receive paths.1'b0: weighted round-robin with RX:TX or TX:RX priority specified in PR (bit[15:14]). 1'b1 Fixed priority (Rx priority to Tx).*/ + uint32_t desc_skip_len : 5; /*This bit specifies the number of Word to skip between two unchained descriptors.The address skipping starts from the end of current descriptor to the start of next descriptor. When the DSL(DESC_SKIP_LEN) value is equal to zero the descriptor table is taken as contiguous by the DMA in Ring mode.*/ + uint32_t alt_desc_size : 1; /*When set the size of the alternate descriptor increases to 32 bytes.*/ + uint32_t prog_burst_len : 6; /*These bits indicate the maximum number of beats to be transferred in one DMA transaction. If the number of beats to be transferred is more than 32 then perform the following steps: 1. Set the PBLx8 mode 2. Set the PBL(PROG_BURST_LEN).*/ + uint32_t pri_ratio : 2; /*These bits control the priority ratio in the weighted round-robin arbitration between the Rx DMA and Tx DMA. These bits are valid only when Bit 1 (DA) is reset. The priority ratio Rx:Tx represented by each bit: 2'b00 -- 1: 1 2'b01 -- 2: 0 2'b10 -- 3: 1 2'b11 -- 4: 1*/ + uint32_t fixed_burst : 1; /*This bit controls whether the AHB master interface performs fixed burst transfers or not. When set the AHB interface uses only SINGLE INCR4 INCR8 or INCR16 during start of the normal burst transfers. When reset the AHB interface uses SINGLE and INCR burst transfer Operations.*/ + uint32_t rx_dma_pbl : 6; /*This field indicates the maximum number of beats to be transferred in one Rx DMA transaction. This is the maximum value that is used in a single block Read or Write.The Rx DMA always attempts to burst as specified in the RPBL(RX_DMA_PBL) bit each time it starts a burst transfer on the host bus. You can program RPBL with values of 1 2 4 8 16 and 32. Any other value results in undefined behavior. This field is valid and applicable only when USP(USE_SEP_PBL) is set high.*/ + uint32_t use_sep_pbl : 1; /*When set high this bit configures the Rx DMA to use the value configured in Bits[22:17] as PBL. The PBL value in Bits[13:8] is applicable only to the Tx DMA operations. When reset to low the PBL value in Bits[13:8] is applicable for both DMA engines.*/ + uint32_t pblx8_mode : 1; /*When set high this bit multiplies the programmed PBL value (Bits[22:17] and Bits[13:8]) eight times. Therefore the DMA transfers the data in 8 16 32 64 128 and 256 beats depending on the PBL value.*/ + uint32_t dmaaddralibea : 1; /*When this bit is set high and the FIXED_BURST bit is 1 the AHB interface generates all bursts aligned to the start address LS bits. If the FIXED_BURST bit is 0 the first burst (accessing the start address of data buffer) is not aligned but subsequent bursts are aligned to the address.*/ + uint32_t dmamixedburst : 1; /*When this bit is set high and the FIXED_BURST bit is low the AHB master interface starts all bursts of a length more than 16 with INCR (undefined burst) whereas it reverts to fixed burst transfers (INCRx and SINGLE) for burst length of 16 and less.*/ + uint32_t reserved27 : 1; + uint32_t reserved28 : 2; + uint32_t reserved30 : 1; + uint32_t reserved31 : 1; + }; + uint32_t val; + } dmabusmode; + uint32_t dmatxpolldemand; /*When these bits are written with any value the DMA reads the current descriptor to which the Register (Current Host Transmit Descriptor Register) is pointing. If that descriptor is not available (owned by the Host) the transmission returns to the suspend state and Bit[2] (TU) of Status Register is asserted. If the descriptor is available the transmission resumes.*/ + uint32_t dmarxpolldemand; /*When these bits are written with any value the DMA reads the current descriptor to which the Current Host Receive Descriptor Register is pointing. If that descriptor is not available (owned by the Host) the reception returns to the Suspended state and Bit[7] (RU) of Status Register is asserted. If the descriptor is available the Rx DMA returns to the active state.*/ + uint32_t dmarxbaseaddr; /*This field contains the base address of the first descriptor in the Receive Descriptor list. The LSB Bits[1:0] are ignored and internally taken as all-zero by the DMA. Therefore these LSB bits are read-only.*/ + uint32_t dmatxbaseaddr; /*This field contains the base address of the first descriptor in the Transmit Descriptor list. The LSB Bits[1:0] are ignored and are internally taken as all-zero by the DMA.Therefore these LSB bits are read-only.*/ + union { + struct { + uint32_t trans_int : 1; /*This bit indicates that the frame transmission is complete. When transmission is complete Bit[31] (OWN) of TDES0 is reset and the specific frame status information is updated in the Descriptor.*/ + uint32_t trans_proc_stop : 1; /*This bit is set when the transmission is stopped.*/ + uint32_t trans_buf_unavail : 1; /*This bit indicates that the host owns the Next Descriptor in the Transmit List and the DMA cannot acquire it. Transmission is suspended. Bits[22:20] explain the Transmit Process state transitions. To resume processing Transmit descriptors the host should change the ownership of the descriptor by setting TDES0[31] and then issue a Transmit Poll Demand Command.*/ + uint32_t trans_jabber_to : 1; /*This bit indicates that the Transmit Jabber Timer expired which happens when the frame size exceeds 2 048 (10 240 bytes when the Jumbo frame is enabled). When the Jabber Timeout occurs the transmission process is aborted and placed in the Stopped state. This causes the Transmit Jabber Timeout TDES0[14] flag to assert.*/ + uint32_t recv_ovflow : 1; /*This bit indicates that the Receive Buffer had an Overflow during frame reception. If the partial frame is transferred to the application the overflow status is set in RDES0[11].*/ + uint32_t trans_undflow : 1; /*This bit indicates that the Transmit Buffer had an Underflow during frame transmission. Transmission is suspended and an Underflow Error TDES0[1] is set.*/ + uint32_t recv_int : 1; /*This bit indicates that the frame reception is complete. When reception is complete the Bit[31] of RDES1 (Disable Interrupt on Completion) is reset in the last Descriptor and the specific frame status information is updated in the descriptor. The reception remains in the Running state.*/ + uint32_t recv_buf_unavail : 1; /*This bit indicates that the host owns the Next Descriptor in the Receive List and the DMA cannot acquire it. The Receive Process is suspended. To resume processing Receive descriptors the host should change the ownership of the descriptor and issue a Receive Poll Demand command. If no Receive Poll Demand is issued the Receive Process resumes when the next recognized incoming frame is received. This bit is set only when the previous Receive Descriptor is owned by the DMA.*/ + uint32_t recv_proc_stop : 1; /*This bit is asserted when the Receive Process enters the Stopped state.*/ + uint32_t recv_wdt_to : 1; /*When set this bit indicates that the Receive Watchdog Timer expired while receiving the current frame and the current frame is truncated after the watchdog timeout.*/ + uint32_t early_trans_int : 1; /*This bit indicates that the frame to be transmitted is fully transferred to the MTL Transmit FIFO.*/ + uint32_t reserved11 : 2; + uint32_t fatal_bus_err_int : 1; /*This bit indicates that a bus error occurred as described in Bits [25:23]. When this bit is set the corresponding DMA engine disables all of its bus accesses.*/ + uint32_t early_recv_int : 1; /*This bit indicates that the DMA filled the first data buffer of the packet. This bit is cleared when the software writes 1 to this bit or when Bit[6] (RI) of this register is set (whichever occurs earlier).*/ + uint32_t abn_int_summ : 1; /*Abnormal Interrupt Summary bit value is the logical OR of the following when the corresponding interrupt bits are enabled in Interrupt Enable Register: Bit[1]: Transmit Process Stopped. Bit[3]: Transmit Jabber Timeout. Bit[4]: Receive FIFO Overflow. Bit[5]: Transmit Underflow. Bit[7]: Receive Buffer Unavailable. Bit[8]: Receive Process Stopped. Bit[9]: Receive Watchdog Timeout. Bit[10]: Early Transmit Interrupt. Bit[13]: Fatal Bus Error. Only unmasked bits affect the Abnormal Interrupt Summary bit. This is a sticky bit and must be cleared (by writing 1 to this bit) each time a corresponding bit which causes AIS to be set is cleared.*/ + uint32_t norm_int_summ : 1; /*Normal Interrupt Summary bit value is the logical OR of the following bits when the corresponding interrupt bits are enabled in Interrupt Enable Register: Bit[0]: Transmit Interrupt. Bit[2]: Transmit Buffer Unavailable. Bit[6]: Receive Interrupt. Bit[14]: Early Receive Interrupt. Only unmasked bits affect the Normal Interrupt Summary bit.This is a sticky bit and must be cleared (by writing 1 to this bit) each time a corresponding bit which causes NIS to be set is cleared.*/ + uint32_t recv_proc_state : 3; /*This field indicates the Receive DMA FSM state. This field does not generate an interrupt. 3'b000: Stopped. Reset or Stop Receive Command issued. 3'b001: Running. Fetching Receive Transfer Descriptor. 3'b010: Reserved for future use. 3'b011: Running. Waiting for RX packets. 3'b100: Suspended. Receive Descriptor Unavailable. 3'b101: Running. Closing Receive Descriptor. 3'b110: TIME_STAMP write state. 3'b111: Running. Transferring the TX packets data from receive buffer to host memory.*/ + uint32_t trans_proc_state : 3; /*This field indicates the Transmit DMA FSM state. This field does not generate an interrupt. 3'b000: Stopped. Reset or Stop Transmit Command issued. 3'b001: Running. Fetching Transmit Transfer Descriptor. 3'b010: Reserved for future use. 3'b011: Running. Waiting for TX packets. 3'b100: Suspended. Receive Descriptor Unavailable. 3'b101: Running. Closing Transmit Descriptor. 3'b110: TIME_STAMP write state. 3'b111: Running. Transferring the TX packets data from transmit buffer to host memory.*/ + uint32_t error_bits : 3; /*This field indicates the type of error that caused a Bus Error for example error response on the AHB interface. This field is valid only when Bit[13] (FBI) is set. This field does not generate an interrupt. 3'b000: Error during Rx DMA Write Data Transfer. 3'b011: Error during Tx DMA Read Data Transfer. 3'b100: Error during Rx DMA Descriptor Write Access. 3'b101: Error during Tx DMA Descriptor Write Access. 3'b110: Error during Rx DMA Descriptor Read Access. 3'b111: Error during Tx DMA Descriptor Read Access.*/ + uint32_t reserved26 : 1; + uint32_t reserved27 : 1; + uint32_t pmt_int : 1; /*This bit indicates an interrupt event in the PMT module of the ETH_MAC. The software must read the PMT Control and Status Register in the MAC to get the exact cause of interrupt and clear its source to reset this bit to 1'b0.*/ + uint32_t ts_tri_int : 1; /*This bit indicates an interrupt event in the Timestamp Generator block of the ETH_MAC.The software must read the corresponding registers in the ETH_MAC to get the exact cause of the interrupt and clear its source to reset this bit to 1'b0.*/ + uint32_t reserved30 : 1; + uint32_t reserved31 : 1; + }; + uint32_t val; + } dmastatus; + union { + struct { + uint32_t reserved0 : 1; + uint32_t start_stop_rx : 1; /*When this bit is set the Receive process is placed in the Running state. The DMA attempts to acquire the descriptor from the Receive list and processes the incoming frames.When this bit is cleared the Rx DMA operation is stopped after the transfer of the current frame.*/ + uint32_t opt_second_frame : 1; /*When this bit is set it instructs the DMA to process the second frame of the Transmit data even before the status for the first frame is obtained.*/ + uint32_t rx_thresh_ctrl : 2; /*These two bits control the threshold level of the MTL Receive FIFO. Transfer (request) to DMA starts when the frame size within the MTL Receive FIFO is larger than the threshold. 2'b00: 64, 2'b01: 32, 2'b10: 96, 2'b11: 128 .*/ + uint32_t drop_gfrm : 1; /*When set the MAC drops the received giant frames in the Rx FIFO that is frames that are larger than the computed giant frame limit.*/ + uint32_t fwd_under_gf : 1; /*When set the Rx FIFO forwards Undersized frames (that is frames with no Error and length less than 64 bytes) including pad-bytes and CRC.*/ + uint32_t fwd_err_frame : 1; /*When this bit is reset the Rx FIFO drops frames with error status (CRC error collision error giant frame watchdog timeout or overflow).*/ + uint32_t reserved8 : 1; + uint32_t reserved9 : 2; + uint32_t reserved11 : 2; + uint32_t start_stop_transmission_command : 1; /*When this bit is set transmission is placed in the Running state and the DMA checks the Transmit List at the current position for a frame to be transmitted.When this bit is reset the transmission process is placed in the Stopped state after completing the transmission of the current frame.*/ + uint32_t tx_thresh_ctrl : 3; /*These bits control the threshold level of the MTL Transmit FIFO. Transmission starts when the frame size within the MTL Transmit FIFO is larger than the threshold. In addition full frames with a length less than the threshold are also transmitted. These bits are used only when Tx_Str_fwd is reset. 3'b000: 64 3'b001: 128 3'b010: 192 3'b011: 256 3'b100: 40 3'b101: 32 3'b110: 24 3'b111: 16 .*/ + uint32_t reserved17 : 3; + uint32_t flush_tx_fifo : 1; /*When this bit is set the transmit FIFO controller logic is reset to its default values and thus all data in the Tx FIFO is lost or flushed. This bit is cleared internally when the flushing operation is complete.*/ + uint32_t tx_str_fwd : 1; /*When this bit is set transmission starts when a full frame resides in the MTL Transmit FIFO. When this bit is set the Tx_Thresh_Ctrl values specified in Tx_Thresh_Ctrl are ignored.*/ + uint32_t reserved22 : 1; + uint32_t reserved23 : 1; + uint32_t dis_flush_recv_frames : 1; /*When this bit is set the Rx DMA does not flush any frames because of the unavailability of receive descriptors or buffers.*/ + uint32_t rx_store_forward : 1; /*When this bit is set the MTL reads a frame from the Rx FIFO only after the complete frame has been written to it.*/ + uint32_t dis_drop_tcpip_err_fram : 1; /*When this bit is set the MAC does not drop the frames which only have errors detected by the Receive Checksum engine.When this bit is reset all error frames are dropped if the Fwd_Err_Frame bit is reset.*/ + uint32_t reserved27 : 5; + }; + uint32_t val; + } dmaoperation_mode; + union { + struct { + uint32_t dmain_tie : 1; /*When this bit is set with Normal Interrupt Summary Enable (Bit[16]) the Transmit Interrupt is enabled. When this bit is reset the Transmit Interrupt is disabled.*/ + uint32_t dmain_tse : 1; /*When this bit is set with Abnormal Interrupt Summary Enable (Bit[15]) the Transmission Stopped Interrupt is enabled. When this bit is reset the Transmission Stopped Interrupt is disabled.*/ + uint32_t dmain_tbue : 1; /*When this bit is set with Normal Interrupt Summary Enable (Bit 16) the Transmit Buffer Unavailable Interrupt is enabled. When this bit is reset the Transmit Buffer Unavailable Interrupt is Disabled.*/ + uint32_t dmain_tjte : 1; /*When this bit is set with Abnormal Interrupt Summary Enable (Bit[15]) the Transmit Jabber Timeout Interrupt is enabled. When this bit is reset the Transmit Jabber Timeout Interrupt is disabled.*/ + uint32_t dmain_oie : 1; /*When this bit is set with Abnormal Interrupt Summary Enable (Bit[15]) the Receive Overflow Interrupt is enabled. When this bit is reset the Overflow Interrupt is disabled.*/ + uint32_t dmain_uie : 1; /*When this bit is set with Abnormal Interrupt Summary Enable (Bit[15]) the Transmit Underflow Interrupt is enabled. When this bit is reset the Underflow Interrupt is disabled.*/ + uint32_t dmain_rie : 1; /*When this bit is set with Normal Interrupt Summary Enable (Bit[16]) the Receive Interrupt is enabled. When this bit is reset the Receive Interrupt is disabled.*/ + uint32_t dmain_rbue : 1; /*When this bit is set with Abnormal Interrupt Summary Enable (Bit[15]) the Receive Buffer Unavailable Interrupt is enabled. When this bit is reset the Receive Buffer Unavailable Interrupt is disabled.*/ + uint32_t dmain_rse : 1; /*When this bit is set with Abnormal Interrupt Summary Enable (Bit[15]) the Receive Stopped Interrupt is enabled. When this bit is reset the Receive Stopped Interrupt is disabled.*/ + uint32_t dmain_rwte : 1; /*When this bit is set with Abnormal Interrupt Summary Enable (Bit[15]) the Receive Watchdog Timeout Interrupt is enabled. When this bit is reset the Receive Watchdog Timeout Interrupt is disabled.*/ + uint32_t dmain_etie : 1; /*When this bit is set with an Abnormal Interrupt Summary Enable (Bit[15]) the Early Transmit Interrupt is enabled. When this bit is reset the Early Transmit Interrupt is disabled.*/ + uint32_t reserved11 : 2; + uint32_t dmain_fbee : 1; /*When this bit is set with Abnormal Interrupt Summary Enable (Bit[15]) the Fatal Bus Error Interrupt is enabled. When this bit is reset the Fatal Bus Error Enable Interrupt is disabled.*/ + uint32_t dmain_erie : 1; /*When this bit is set with Normal Interrupt Summary Enable (Bit[16]) the Early Receive Interrupt is enabled. When this bit is reset the Early Receive Interrupt is disabled.*/ + uint32_t dmain_aise : 1; /*When this bit is set abnormal interrupt summary is enabled. When this bit is reset the abnormal interrupt summary is disabled. This bit enables the following interrupts in Status Register: Bit[1]: Transmit Process Stopped. Bit[3]: Transmit Jabber Timeout. Bit[4]: Receive Overflow. Bit[5]: Transmit Underflow. Bit[7]: Receive Buffer Unavailable. Bit[8]: Receive Process Stopped. Bit[9]: Receive Watchdog Timeout. Bit[10]: Early Transmit Interrupt. Bit[13]: Fatal Bus Error.*/ + uint32_t dmain_nise : 1; /*When this bit is set normal interrupt summary is enabled. When this bit is reset normal interrupt summary is disabled. This bit enables the following interrupts in Status Register: Bit[0]: Transmit Interrupt. Bit[2]: Transmit Buffer Unavailable. Bit[6]: Receive Interrupt. Bit[14]: Early Receive Interrupt.*/ + uint32_t reserved17 : 15; + }; + uint32_t val; + } dmain_en; + union { + struct { + uint32_t missed_fc : 16; /*This field indicates the number of frames missed by the controller because of the Host Receive Buffer being unavailable. This counter is incremented each time the DMA discards an incoming frame. The counter is cleared when this register is read.*/ + uint32_t overflow_bmfc : 1; /*This bit is set every time Missed Frame Counter (Bits[15:0]) overflows that is the DMA discards an incoming frame because of the Host Receive Buffer being unavailable with the missed frame counter at maximum value. In such a scenario the Missed frame counter is reset to all-zeros and this bit indicates that the rollover happened.*/ + uint32_t overflow_fc : 11; /*This field indicates the number of frames missed by the application. This counter is incremented each time the MTL FIFO overflows. The counter is cleared when this register is read.*/ + uint32_t overflow_bfoc : 1; /*This bit is set every time the Overflow Frame Counter (Bits[27:17]) overflows that is the Rx FIFO overflows with the overflow frame counter at maximum value. In such a scenario the overflow frame counter is reset to all-zeros and this bit indicates that the rollover happened.*/ + uint32_t reserved29 : 3; + }; + uint32_t val; + } dmamissedfr; + union { + struct { + uint32_t riwtc : 8; /*This bit indicates the number of system clock cycles multiplied by 256 for which the watchdog timer is set. The watchdog timer gets triggered with the programmed value after the Rx DMA completes the transfer of a frame for which the RI(RECV_INT) status bit is not set because of the setting in the corresponding descriptor RDES1[31]. When the watchdog timer runs out the RI bit is set and the timer is stopped. The watchdog timer is reset when the RI bit is set high because of automatic setting of RI as per RDES1[31] of any received frame.*/ + uint32_t reserved8 : 24; + }; + uint32_t val; + } dmarintwdtimer; + 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; + uint32_t dmatxcurrdesc; /*The address of the current receive descriptor list. Cleared on Reset.Pointer updated by the DMA during operation.*/ + uint32_t dmarxcurrdesc; /*The address of the current receive descriptor list. Cleared on Reset.Pointer updated by the DMA during operation.*/ + uint32_t dmatxcurraddr_buf; /*The address of the current receive descriptor list. Cleared on Reset.Pointer updated by the DMA during operation.*/ + uint32_t dmarxcurraddr_buf; /*The address of the current receive descriptor list. Cleared on Reset.Pointer updated by the DMA during operation.*/ +} emac_dma_dev_t; + +extern emac_dma_dev_t EMAC_DMA; + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/emac_ext_struct.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/emac_ext_struct.h new file mode 100644 index 0000000000000..6c0b8921be241 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/emac_ext_struct.h @@ -0,0 +1,74 @@ +// 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 + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +typedef volatile struct { + union { + struct { + uint32_t div_num : 4; + uint32_t h_div_num : 4; + uint32_t reserved8 : 24; + }; + uint32_t val; + } ex_clkout_conf; + union { + struct { + uint32_t div_num_10m : 6; + uint32_t h_div_num_10m : 6; + uint32_t div_num_100m : 6; + uint32_t h_div_num_100m : 6; + uint32_t clk_sel : 1; + uint32_t reserved25 : 7; + }; + uint32_t val; + } ex_oscclk_conf; + union { + struct { + uint32_t ext_en : 1; + uint32_t int_en : 1; + uint32_t reserved2 : 1; + uint32_t mii_clk_tx_en : 1; + uint32_t mii_clk_rx_en : 1; + uint32_t reserved5 : 27; + }; + uint32_t val; + } ex_clk_ctrl; + union { + struct { + uint32_t reserved0 : 13; + uint32_t phy_intf_sel : 3; + uint32_t reserved16 : 16; + }; + uint32_t val; + } ex_phyinf_conf; + union { + struct { + uint32_t ram_pd_en : 2; + uint32_t reserved2 : 30; + }; + uint32_t val; + } pd_sel; +} emac_ext_dev_t; + +extern emac_ext_dev_t EMAC_EXT; + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/emac_mac_struct.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/emac_mac_struct.h new file mode 100644 index 0000000000000..0cbf9c32579f7 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/emac_mac_struct.h @@ -0,0 +1,345 @@ +// 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 + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +typedef volatile struct { + union { + struct { + uint32_t pltf : 2; /*These bits control the number of preamble bytes that are added to the beginning of every Transmit frame. The preamble reduction occurs only when the MAC is operating in the full-duplex mode.2'b00: 7 bytes of preamble. 2'b01: 5 bytes of preamble. 2'b10: 3 bytes of preamble.*/ + uint32_t rx : 1; /*When this bit is set the receiver state machine of the MAC is enabled for receiving frames from the MII. When this bit is reset the MAC receive state machine is disabled after the completion of the reception of the current frame and does not receive any further frames from the MII.*/ + uint32_t tx : 1; /*When this bit is set the transmit state machine of the MAC is enabled for transmission on the MII. When this bit is reset the MAC transmit state machine is disabled after the completion of the transmission of the current frame and does not transmit any further frames.*/ + uint32_t deferralcheck : 1; /*Deferral Check.*/ + uint32_t backofflimit : 2; /*The Back-Off limit determines the random integer number (r) of slot time delays (512 bit times for 10/100 Mbps) for which the MAC waits before rescheduling a transmission attempt during retries after a collision. This bit is applicable only in the half-duplex mode. 00: k= min (n 10). 01: k = min (n 8). 10: k = min (n 4). 11: k = min (n 1) n = retransmission attempt. The random integer r takes the value in the Range 0 ~ 2000.*/ + uint32_t padcrcstrip : 1; /*When this bit is set the MAC strips the Pad or FCS field on the incoming frames only if the value of the length field is less than 1 536 bytes. All received frames with length field greater than or equal to 1 536 bytes are passed to the application without stripping the Pad or FCS field. When this bit is reset the MAC passes all incoming frames without modifying them to the Host.*/ + uint32_t reserved8 : 1; + uint32_t retry : 1; /*When this bit is set the MAC attempts only one transmission. When a collision occurs on the MII interface the MAC ignores the current frame transmission and reports a Frame Abort with excessive collision error in the transmit frame status. When this bit is reset the MAC attempts retries based on the settings of the BL field (Bits [6:5]). This bit is applicable only in the half-duplex Mode.*/ + uint32_t rxipcoffload : 1; /*When this bit is set the MAC calculates the 16-bit one's complement of the one's complement sum of all received Ethernet frame payloads. It also checks whether the IPv4 Header checksum (assumed to be bytes 25/26 or 29/30 (VLAN-tagged) of the received Ethernet frame) is correct for the received frame and gives the status in the receive status word. The MAC also appends the 16-bit checksum calculated for the IP header datagram payload (bytes after the IPv4 header) and appends it to the Ethernet frame transferred to the application (when Type 2 COE is deselected). When this bit is reset this function is disabled.*/ + uint32_t duplex : 1; /*When this bit is set the MAC operates in the full-duplex mode where it can transmit and receive simultaneously. This bit is read only with default value of 1'b1 in the full-duplex-mode.*/ + uint32_t loopback : 1; /*When this bit is set the MAC operates in the loopback mode MII. The MII Receive clock input (CLK_RX) is required for the loopback to work properly because the transmit clock is not looped-back internally.*/ + uint32_t rxown : 1; /*When this bit is set the MAC disables the reception of frames when the TX_EN is asserted in the half-duplex mode. When this bit is reset the MAC receives all packets that are given by the PHY while transmitting. This bit is not applicable if the MAC is operating in the full duplex mode.*/ + uint32_t fespeed : 1; /*This bit selects the speed in the MII RMII interface. 0: 10 Mbps. 1: 100 Mbps.*/ + uint32_t mii : 1; /*This bit selects the Ethernet line speed. It should be set to 1 for 10 or 100 Mbps operations.In 10 or 100 Mbps operations this bit along with FES(EMACFESPEED) bit it selects the exact linespeed. In the 10/100 Mbps-only operations the bit is always 1.*/ + uint32_t disablecrs : 1; /*When set high this bit makes the MAC transmitter ignore the MII CRS signal during frame transmission in the half-duplex mode. This request results in no errors generated because of Loss of Carrier or No Carrier during such transmission. When this bit is low the MAC transmitter generates such errors because of Carrier Sense and can even abort the transmissions.*/ + uint32_t interframegap : 3; /*These bits control the minimum IFG between frames during transmission. 3'b000: 96 bit times. 3'b001: 88 bit times. 3'b010: 80 bit times. 3'b111: 40 bit times. In the half-duplex mode the minimum IFG can be configured only for 64 bit times (IFG = 100). Lower values are not considered.*/ + uint32_t jumboframe : 1; /*When this bit is set the MAC allows Jumbo frames of 9 018 bytes (9 022 bytes for VLAN tagged frames) without reporting a giant frame error in the receive frame status.*/ + uint32_t reserved21 : 1; + uint32_t jabber : 1; /*When this bit is set the MAC disables the jabber timer on the transmitter. The MAC can transfer frames of up to 16 383 bytes. When this bit is reset the MAC cuts off the transmitter if the application sends out more than 2 048 bytes of data (10 240 if JE is set high) during Transmission.*/ + uint32_t watchdog : 1; /*When this bit is set the MAC disables the watchdog timer on the receiver. The MAC can receive frames of up to 16 383 bytes. When this bit is reset the MAC does not allow a receive frame which more than 2 048 bytes (10 240 if JE is set high) or the value programmed in Register (Watchdog Timeout Register). The MAC cuts off any bytes received after the watchdog limit number of bytes.*/ + uint32_t reserved24 : 1; + uint32_t reserved25 : 1; + uint32_t reserved26 : 1; + uint32_t ass2kp : 1; /*When set the MAC considers all frames with up to 2 000 bytes length as normal packets.When Bit[20] (JE) is not set the MAC considers all received frames of size more than 2K bytes as Giant frames. When this bit is reset and Bit[20] (JE) is not set the MAC considers all received frames of size more than 1 518 bytes (1 522 bytes for tagged) as Giant frames. When Bit[20] is set setting this bit has no effect on Giant Frame status.*/ + uint32_t sairc : 3; /*This field controls the source address insertion or replacement for all transmitted frames.Bit[30] specifies which MAC Address register (0 or 1) is used for source address insertion or replacement based on the values of Bits [29:28]: 2'b0x: The input signals mti_sa_ctrl_i and ati_sa_ctrl_i control the SA field generation. 2'b10: If Bit[30] is set to 0 the MAC inserts the content of the MAC Address 0 registers in the SA field of all transmitted frames. If Bit[30] is set to 1 the MAC inserts the content of the MAC Address 1 registers in the SA field of all transmitted frames. 2'b11: If Bit[30] is set to 0 the MAC replaces the content of the MAC Address 0 registers in the SA field of all transmitted frames. If Bit[30] is set to 1 the MAC replaces the content of the MAC Address 1 registers in the SA field of all transmitted frames.*/ + uint32_t reserved31 : 1; + }; + uint32_t val; + } gmacconfig; + union { + struct { + uint32_t pmode : 1; /*When this bit is set the Address Filter module passes all incoming frames irrespective of the destination or source address. The SA or DA Filter Fails status bits of the Receive Status Word are always cleared when PR(PRI_RATIO) is set.*/ + uint32_t reserved1 : 1; + uint32_t reserved2 : 1; + uint32_t daif : 1; /*When this bit is set the Address Check block operates in inverse filtering mode for the DA address comparison for both unicast and multicast frames. When reset normal filtering of frames is performed.*/ + uint32_t pam : 1; /*When set this bit indicates that all received frames with a multicast destination address (first bit in the destination address field is '1') are passed.*/ + uint32_t dbf : 1; /*When this bit is set the AFM(Address Filtering Module) module blocks all incoming broadcast frames. In addition it overrides all other filter settings. When this bit is reset the AFM module passes all received broadcast Frames.*/ + uint32_t pcf : 2; /*These bits control the forwarding of all control frames (including unicast and multicast Pause frames). 2'b00: MAC filters all control frames from reaching the application. 2'b01: MAC forwards all control frames except Pause frames to application even if they fail the Address filter. 2'b10: MAC forwards all control frames to application even if they fail the Address Filter. 2'b11: MAC forwards control frames that pass the Address Filter.The following conditions should be true for the Pause frames processing: Condition 1: The MAC is in the full-duplex mode and flow control is enabled by setting Bit 2 (RFE) of Register (Flow Control Register) to 1. Condition 2: The destination address (DA) of the received frame matches the special multicast address or the MAC Address 0 when Bit 3 (UP) of the Register(Flow Control Register) is set. Condition 3: The Type field of the received frame is 0x8808 and the OPCODE field is 0x0001.*/ + uint32_t saif : 1; /*When this bit is set the Address Check block operates in inverse filtering mode for the SA address comparison. The frames whose SA matches the SA registers are marked as failing the SA Address filter. When this bit is reset frames whose SA does not match the SA registers are marked as failing the SA Address filter.*/ + uint32_t safe : 1; /*When this bit is set the MAC compares the SA field of the received frames with the values programmed in the enabled SA registers. If the comparison fails the MAC drops the frame. When this bit is reset the MAC forwards the received frame to the application with updated SAF bit of the Rx Status depending on the SA address comparison.*/ + uint32_t reserved10 : 1; + uint32_t reserved11 : 5; + uint32_t reserved16 : 1; + uint32_t reserved17 : 3; + uint32_t reserved20 : 1; + uint32_t reserved21 : 1; + uint32_t reserved22 : 9; + uint32_t receive_all : 1; /*When this bit is set the MAC Receiver module passes all received frames irrespective of whether they pass the address filter or not to the Application. The result of the SA or DA filtering is updated (pass or fail) in the corresponding bits in the Receive Status Word. When this bit is reset the Receiver module passes only those frames to the Application that pass the SA or DA address Filter.*/ + }; + uint32_t val; + } gmacff; + uint32_t reserved_1008; + uint32_t reserved_100c; + union { + struct { + uint32_t miibusy : 1; /*This bit should read logic 0 before writing to PHY Addr Register and PHY data Register.During a PHY register access the software sets this bit to 1'b1 to indicate that a Read or Write access is in progress. PHY data Register is invalid until this bit is cleared by the MAC. Therefore PHY data Register (MII Data) should be kept valid until the MAC clears this bit during a PHY Write operation. Similarly for a read operation the contents of Register 5 are not valid until this bit is cleared. The subsequent read or write operation should happen only after the previous operation is complete. Because there is no acknowledgment from the PHY to MAC after a read or write operation is completed there is no change in the functionality of this bit even when the PHY is not Present.*/ + uint32_t miiwrite : 1; /*When set this bit indicates to the PHY that this is a Write operation using the MII Data register. If this bit is not set it indicates that this is a Read operation that is placing the data in the MII Data register.*/ + uint32_t miicsrclk : 4; /*CSR clock range: 1.0 MHz ~ 2.5 MHz. 4'b0000: When the APB clock frequency is 80 MHz the MDC clock frequency is APB CLK/42 4'b0000: When the APB clock frequency is 40 MHz the MDC clock frequency is APB CLK/26.*/ + uint32_t miireg : 5; /*These bits select the desired MII register in the selected PHY device.*/ + uint32_t miidev : 5; /*This field indicates which of the 32 possible PHY devices are being accessed.*/ + uint32_t reserved16 : 16; + }; + uint32_t val; + } emacgmiiaddr; + union { + struct { + uint32_t mii_data : 16; /*This field contains the 16-bit data value read from the PHY after a Management Read operation or the 16-bit data value to be written to the PHY before a Management Write operation.*/ + uint32_t reserved16 : 16; + }; + uint32_t val; + } emacmiidata; + union { + struct { + uint32_t fcbba : 1; /*This bit initiates a Pause frame in the full-duplex mode and activates the backpressure function in the half-duplex mode if the TFCE bit is set. In the full-duplex mode this bit should be read as 1'b0 before writing to the Flow Control register. To initiate a Pause frame the Application must set this bit to 1'b1. During a transfer of the Control Frame this bit continues to be set to signify that a frame transmission is in progress. After the completion of Pause frame transmission the MAC resets this bit to 1'b0. The Flow Control register should not be written to until this bit is cleared. In the half-duplex mode when this bit is set (and TFCE is set) then backpressure is asserted by the MAC. During backpressure when the MAC receives a new frame the transmitter starts sending a JAM pattern resulting in a collision. When the MAC is configured for the full-duplex mode the BPA(backpressure activate) is automatically disabled.*/ + uint32_t tfce : 1; /*In the full-duplex mode when this bit is set the MAC enables the flow control operation to transmit Pause frames. When this bit is reset the flow control operation in the MAC is disabled and the MAC does not transmit any Pause frames. In the half-duplex mode when this bit is set the MAC enables the backpressure operation. When this bit is reset the backpressure feature is Disabled.*/ + uint32_t rfce : 1; /*When this bit is set the MAC decodes the received Pause frame and disables its transmitter for a specified (Pause) time. When this bit is reset the decode function of the Pause frame is disabled.*/ + uint32_t upfd : 1; /*A pause frame is processed when it has the unique multicast address specified in the IEEE Std 802.3. When this bit is set the MAC can also detect Pause frames with unicast address of the station. This unicast address should be as specified in the EMACADDR0 High Register and EMACADDR0 Low Register. When this bit is reset the MAC only detects Pause frames with unique multicast address.*/ + uint32_t plt : 2; /*This field configures the threshold of the Pause timer automatic retransmission of the Pause frame.The threshold values should be always less than the Pause Time configured in Bits[31:16]. For example if PT = 100H (256 slot-times) and PLT = 01 then a second Pause frame is automatically transmitted at 228 (256-28) slot times after the first Pause frame is transmitted. The following list provides the threshold values for different values: 2'b00: The threshold is Pause time minus 4 slot times (PT-4 slot times). 2'b01: The threshold is Pause time minus 28 slot times (PT-28 slot times). 2'b10: The threshold is Pause time minus 144 slot times (PT-144 slot times). 2'b11: The threshold is Pause time minus 256 slot times (PT-256 slot times). The slot time is defined as the time taken to transmit 512 bits (64 bytes) on the MII interface.*/ + uint32_t reserved6 : 1; + uint32_t dzpq : 1; /*When this bit is set it disables the automatic generation of the Zero-Quanta Pause frames on the de-assertion of the flow-control signal from the FIFO layer. When this bit is reset normal operation with automatic Zero-Quanta Pause frame generation is enabled.*/ + uint32_t reserved8 : 8; + uint32_t pause_time : 16; /*This field holds the value to be used in the Pause Time field in the transmit control frame. If the Pause Time bits is configured to be double-synchronized to the MII clock domain then consecutive writes to this register should be performed only after at least four clock cycles in the destination clock domain.*/ + }; + uint32_t val; + } gmacfc; + uint32_t reserved_101c; + uint32_t reserved_1020; + union { + struct { + uint32_t macrpes : 1; /*When high this bit indicates that the MAC MII receive protocol engine is actively receiving data and not in IDLE state.*/ + uint32_t macrffcs : 2; /*When high this field indicates the active state of the FIFO Read and Write controllers of the MAC Receive Frame Controller Module. MACRFFCS[1] represents the status of FIFO Read controller. MACRFFCS[0] represents the status of small FIFO Write controller.*/ + uint32_t reserved3 : 1; + uint32_t mtlrfwcas : 1; /*When high this bit indicates that the MTL Rx FIFO Write Controller is active and is transferring a received frame to the FIFO.*/ + uint32_t mtlrfrcs : 2; /*This field gives the state of the Rx FIFO read Controller: 2'b00: IDLE state.2'b01: Reading frame data.2'b10: Reading frame status (or timestamp).2'b11: Flushing the frame data and status.*/ + uint32_t reserved7 : 1; + uint32_t mtlrffls : 2; /*This field gives the status of the fill-level of the Rx FIFO: 2'b00: Rx FIFO Empty. 2'b01: Rx FIFO fill-level below flow-control deactivate threshold. 2'b10: Rx FIFO fill-level above flow-control activate threshold. 2'b11: Rx FIFO Full.*/ + uint32_t reserved10 : 6; + uint32_t mactpes : 1; /*When high this bit indicates that the MAC MII transmit protocol engine is actively transmitting data and is not in the IDLE state.*/ + uint32_t mactfcs : 2; /*This field indicates the state of the MAC Transmit Frame Controller module: 2'b00: IDLE state. 2'b01: Waiting for status of previous frame or IFG or backoff period to be over. 2'b10: Generating and transmitting a Pause frame (in the full-duplex mode). 2'b11: Transferring input frame for transmission.*/ + uint32_t mactp : 1; /*When high this bit indicates that the MAC transmitter is in the Pause condition (in the full-duplex-mode) and hence does not schedule any frame for transmission.*/ + uint32_t mtltfrcs : 2; /*This field indicates the state of the Tx FIFO Read Controller: 2'b00: IDLE state. 2'b01: READ state (transferring data to the MAC transmitter). 2'b10: Waiting for TxStatus from the MAC transmitter. 2'b11: Writing the received TxStatus or flushing the Tx FIFO.*/ + uint32_t mtltfwcs : 1; /*When high this bit indicates that the MTL Tx FIFO Write Controller is active and is transferring data to the Tx FIFO.*/ + uint32_t reserved23 : 1; + uint32_t mtltfnes : 1; /*When high this bit indicates that the MTL Tx FIFO is not empty and some data is left for Transmission.*/ + uint32_t mtltsffs : 1; /*When high this bit indicates that the MTL TxStatus FIFO is full. Therefore the MTL cannot accept any more frames for transmission.*/ + uint32_t reserved26 : 6; + }; + uint32_t val; + } emacdebug; + uint32_t pmt_rwuffr; /*The MSB (31st bit) must be zero.Bit j[30:0] is the byte mask. If Bit 1/2/3/4 (byte number) of the byte mask is set the CRC block processes the Filter 1/2/3/4 Offset + j of the incoming packet(PWKPTR is 0/1/2/3).RWKPTR is 0:Filter 0 Byte Mask .RWKPTR is 1:Filter 1 Byte Mask RWKPTR is 2:Filter 2 Byte Mask RWKPTR is 3:Filter 3 Byte Mask RWKPTR is 4:Bit 3/11/19/27 specifies the address type defining the destination address type of the pattern.When the bit is set the pattern applies to only multicast packets*/ + union { + struct { + uint32_t pwrdwn : 1; /*When set the MAC receiver drops all received frames until it receives the expected magic packet or remote wake-up frame.This bit must only be set when MGKPKTEN GLBLUCAST or RWKPKTEN bit is set high.*/ + uint32_t mgkpkten : 1; /*When set enables generation of a power management event because of magic packet reception.*/ + uint32_t rwkpkten : 1; /*When set enables generation of a power management event because of remote wake-up frame reception*/ + uint32_t reserved3 : 2; + uint32_t mgkprcvd : 1; /*When set this bit indicates that the power management event is generated because of the reception of a magic packet. This bit is cleared by a Read into this register.*/ + uint32_t rwkprcvd : 1; /*When set this bit indicates the power management event is generated because of the reception of a remote wake-up frame. This bit is cleared by a Read into this register.*/ + uint32_t reserved7 : 2; + uint32_t glblucast : 1; /*When set enables any unicast packet filtered by the MAC (DAFilter) address recognition to be a remote wake-up frame.*/ + uint32_t reserved10 : 14; + uint32_t rwkptr : 5; /*The maximum value of the pointer is 7 the detail information please refer to PMT_RWUFFR.*/ + uint32_t reserved29 : 2; + uint32_t rwkfiltrst : 1; /*When this bit is set it resets the RWKPTR register to 3’b000.*/ + }; + uint32_t val; + } pmt_csr; + union { + struct { + uint32_t tlpien : 1; /*When set this bit indicates that the MAC Transmitter has entered the LPI state because of the setting of the LPIEN bit. This bit is cleared by a read into this register.*/ + uint32_t tlpiex : 1; /*When set this bit indicates that the MAC transmitter has exited the LPI state after the user has cleared the LPIEN bit and the LPI_TW_Timer has expired.This bit is cleared by a read into this register.*/ + uint32_t rlpien : 1; /*When set this bit indicates that the MAC Receiver has received an LPI pattern and entered the LPI state. This bit is cleared by a read into this register.*/ + uint32_t rlpiex : 1; /*When set this bit indicates that the MAC Receiver has stopped receiving the LPI pattern on the MII interface exited the LPI state and resumed the normal reception. This bit is cleared by a read into this register.*/ + uint32_t reserved4 : 4; + uint32_t tlpist : 1; /*When set this bit indicates that the MAC is transmitting the LPI pattern on the MII interface.*/ + uint32_t rlpist : 1; /*When set this bit indicates that the MAC is receiving the LPI pattern on the MII interface.*/ + uint32_t reserved10 : 6; + uint32_t lpien : 1; /*When set this bit instructs the MAC Transmitter to enter the LPI state. When reset this bit instructs the MAC to exit the LPI state and resume normal transmission.This bit is cleared when the LPITXA bit is set and the MAC exits the LPI state because of the arrival of a new packet for transmission.*/ + uint32_t pls : 1; /*This bit indicates the link status of the PHY.When set the link is considered to be okay (up) and when reset the link is considered to be down.*/ + uint32_t reserved18 : 1; + uint32_t lpitxa : 1; /*This bit controls the behavior of the MAC when it is entering or coming out of the LPI mode on the transmit side.If the LPITXA and LPIEN bits are set to 1 the MAC enters the LPI mode only after all outstanding frames and pending frames have been transmitted. The MAC comes out of the LPI mode when the application sends any frame.When this bit is 0 the LPIEN bit directly controls behavior of the MAC when it is entering or coming out of the LPI mode.*/ + uint32_t reserved20 : 12; + }; + uint32_t val; + } gmaclpi_crs; + union { + struct { + uint32_t lpi_tw_timer : 16; /*This field specifies the minimum time (in microseconds) for which the MAC waits after it stops transmitting the LPI pattern to the PHY and before it resumes the normal transmission. The TLPIEX status bit is set after the expiry of this timer.*/ + uint32_t lpi_ls_timer : 10; /*This field specifies the minimum time (in milliseconds) for which the link status from the PHY should be up (OKAY) before the LPI pattern can be transmitted to the PHY. The MAC does not transmit the LPI pattern even when the LPIEN bit is set unless the LPI_LS_Timer reaches the programmed terminal count. The default value of the LPI_LS_Timer is 1000 (1 sec) as defined in the IEEE standard.*/ + uint32_t reserved26 : 6; + }; + uint32_t val; + } gmaclpitimerscontrol; + union { + struct { + uint32_t reserved0 : 1; + uint32_t reserved1 : 1; + uint32_t reserved2 : 1; + uint32_t pmtints : 1; /*This bit is set when a magic packet or remote wake-up frame is received in the power-down mode (see Bit[5] and Bit[6] in the PMT Control and Status Register). This bit is cleared when both Bits[6:5] are cleared because of a read operation to the PMT Control and Status register. This bit is valid only when you select the optional PMT module during core configuration.*/ + uint32_t reserved4 : 1; + uint32_t reserved5 : 1; + uint32_t reserved6 : 1; + uint32_t reserved7 : 1; + uint32_t reserved8 : 1; + uint32_t reserved9 : 1; + uint32_t lpiis : 1; /*When the Energy Efficient Ethernet feature is enabled this bit is set for any LPI state entry or exit in the MAC Transmitter or Receiver. This bit is cleared on reading Bit[0] of Register (LPI Control and Status Register).*/ + uint32_t reserved11 : 1; + uint32_t reserved12 : 20; + }; + uint32_t val; + } emacints; + union { + struct { + uint32_t reserved0 : 1; + uint32_t reserved1 : 1; + uint32_t reserved2 : 1; + uint32_t pmtintmask : 1; /*When set this bit disables the assertion of the interrupt signal because of the setting of PMT Interrupt Status bit in Register (Interrupt Status Register).*/ + uint32_t reserved4 : 5; + uint32_t reserved9 : 1; + uint32_t lpiintmask : 1; /*When set this bit disables the assertion of the interrupt signal because of the setting of the LPI Interrupt Status bit in Register (Interrupt Status Register).*/ + uint32_t reserved11 : 21; + }; + uint32_t val; + } emacintmask; + union { + struct { + uint32_t address0_hi : 16; /*This field contains the upper 16 bits (47:32) of the first 6-byte MAC address.The MAC uses this field for filtering the received frames and inserting the MAC address in the Transmit Flow Control (Pause) Frames.*/ + uint32_t reserved16 : 15; + uint32_t address_enable0 : 1; /*This bit is always set to 1.*/ + }; + uint32_t val; + } emacaddr0high; + uint32_t emacaddr0low; /*This field contains the lower 32 bits of the first 6-byte MAC address. This is used by the MAC for filtering the received frames and inserting the MAC address in the Transmit Flow Control (Pause) Frames.*/ + union { + struct { + uint32_t mac_address1_hi : 16; /*This field contains the upper 16 bits Bits[47:32] of the second 6-byte MAC Address.*/ + uint32_t reserved16 : 8; + uint32_t mask_byte_control : 6; /*These bits are mask control bits for comparison of each of the EMACADDR1 bytes. When set high the MAC does not compare the corresponding byte of received DA or SA with the contents of EMACADDR1 registers. Each bit controls the masking of the bytes as follows: Bit[29]: EMACADDR1 High [15:8]. Bit[28]: EMACADDR1 High [7:0]. Bit[27]: EMACADDR1 Low [31:24]. Bit[24]: EMACADDR1 Low [7:0].You can filter a group of addresses (known as group address filtering) by masking one or more bytes of the address.*/ + uint32_t source_address : 1; /*When this bit is set the EMACADDR1[47:0] is used to compare with the SA fields of the received frame. When this bit is reset the EMACADDR1[47:0] is used to compare with the DA fields of the received frame.*/ + uint32_t address_enable1 : 1; /*When this bit is set the address filter module uses the second MAC address for perfect filtering. When this bit is reset the address filter module ignores the address for filtering.*/ + }; + uint32_t val; + } emacaddr1high; + uint32_t emacaddr1low; /*This field contains the lower 32 bits of the second 6-byte MAC address.The content of this field is undefined so the register needs to be configured after the initialization Process.*/ + union { + struct { + uint32_t mac_address2_hi : 16; /*This field contains the upper 16 bits Bits[47:32] of the third 6-byte MAC address.*/ + uint32_t reserved16 : 8; + uint32_t mask_byte_control2 : 6; /*These bits are mask control bits for comparison of each of the EMACADDR2 bytes. When set high the MAC does not compare the corresponding byte of received DA or SA with the contents of EMACADDR2 registers. Each bit controls the masking of the bytes as follows: Bit[29]: EMACADDR2 High [15:8]. Bit[28]: EMACADDR2 High [7:0]. Bit[27]: EMACADDR2 Low [31:24]. Bit[24]: EMACADDR2 Low [7:0].You can filter a group of addresses (known as group address filtering) by masking one or more bytes of the address.*/ + uint32_t source_address2 : 1; /*When this bit is set the EMACADDR2[47:0] is used to compare with the SA fields of the received frame. When this bit is reset the EMACADDR2[47:0] is used to compare with the DA fields of the received frame.*/ + uint32_t address_enable2 : 1; /*When this bit is set the address filter module uses the third MAC address for perfect filtering. When this bit is reset the address filter module ignores the address for filtering.*/ + }; + uint32_t val; + } emacaddr2high; + uint32_t emacaddr2low; /*This field contains the lower 32 bits of the third 6-byte MAC address. The content of this field is undefined so the register needs to be configured after the initialization process.*/ + union { + struct { + uint32_t mac_address3_hi : 16; /*This field contains the upper 16 bits Bits[47:32] of the fourth 6-byte MAC address.*/ + uint32_t reserved16 : 8; + uint32_t mask_byte_control3 : 6; /*These bits are mask control bits for comparison of each of the EMACADDR3 bytes. When set high the MAC does not compare the corresponding byte of received DA or SA with the contents of EMACADDR3 registers. Each bit controls the masking of the bytes as follows: Bit[29]: EMACADDR3 High [15:8]. Bit[28]: EMACADDR3 High [7:0]. Bit[27]: EMACADDR3 Low [31:24]. Bit[24]: EMACADDR3 Low [7:0].You can filter a group of addresses (known as group address filtering) by masking one or more bytes of the address.*/ + uint32_t source_address3 : 1; /*When this bit is set the EMACADDR3[47:0] is used to compare with the SA fields of the received frame. When this bit is reset the EMACADDR3[47:0] is used to compare with the DA fields of the received frame.*/ + uint32_t address_enable3 : 1; /*When this bit is set the address filter module uses the fourth MAC address for perfect filtering. When this bit is reset the address filter module ignores the address for filtering.*/ + }; + uint32_t val; + } emacaddr3high; + uint32_t emacaddr3low; /*This field contains the lower 32 bits of the fourth 6-byte MAC address.The content of this field is undefined so the register needs to be configured after the initialization Process.*/ + union { + struct { + uint32_t mac_address4_hi : 16; /*This field contains the upper 16 bits Bits[47:32] of the fifth 6-byte MAC address.*/ + uint32_t reserved16 : 8; + uint32_t mask_byte_control4 : 6; /*These bits are mask control bits for comparison of each of the EMACADDR4 bytes. When set high the MAC does not compare the corresponding byte of received DA or SA with the contents of EMACADDR4 registers. Each bit controls the masking of the bytes as follows: Bit[29]: EMACADDR4 High [15:8]. Bit[28]: EMACADDR4 High [7:0]. Bit[27]: EMACADDR4 Low [31:24]. Bit[24]: EMACADDR4 Low [7:0].You can filter a group of addresses (known as group address filtering) by masking one or more bytes of the address.*/ + uint32_t source_address4 : 1; /*When this bit is set the EMACADDR4[47:0] is used to compare with the SA fields of the received frame. When this bit is reset the EMACADDR4[47:0] is used to compare with the DA fields of the received frame.*/ + uint32_t address_enable4 : 1; /*When this bit is set the address filter module uses the fifth MAC address for perfect filtering. When this bit is reset the address filter module ignores the address for filtering.*/ + }; + uint32_t val; + } emacaddr4high; + uint32_t emacaddr4low; /*This field contains the lower 32 bits of the fifth 6-byte MAC address. The content of this field is undefined so the register needs to be configured after the initialization process.*/ + union { + struct { + uint32_t mac_address5_hi : 16; /*This field contains the upper 16 bits Bits[47:32] of the sixth 6-byte MAC address.*/ + uint32_t reserved16 : 8; + uint32_t mask_byte_control5 : 6; /*These bits are mask control bits for comparison of each of the EMACADDR5 bytes. When set high the MAC does not compare the corresponding byte of received DA or SA with the contents of EMACADDR5 registers. Each bit controls the masking of the bytes as follows: Bit[29]: EMACADDR5 High [15:8]. Bit[28]: EMACADDR5 High [7:0]. Bit[27]: EMACADDR5 Low [31:24]. Bit[24]: EMACADDR5 Low [7:0].You can filter a group of addresses (known as group address filtering) by masking one or more bytes of the address.*/ + uint32_t source_address5 : 1; /*When this bit is set the EMACADDR5[47:0] is used to compare with the SA fields of the received frame. When this bit is reset the EMACADDR5[47:0] is used to compare with the DA fields of the received frame.*/ + uint32_t address_enable5 : 1; /*When this bit is set the address filter module uses the sixth MAC address for perfect filtering. When this bit is reset the address filter module ignores the address for filtering.*/ + }; + uint32_t val; + } emacaddr5high; + uint32_t emacaddr5low; /*This field contains the lower 32 bits of the sixth 6-byte MAC address. The content of this field is undefined so the register needs to be configured after the initialization process.*/ + union { + struct { + uint32_t mac_address6_hi : 16; /*This field contains the upper 16 bits Bits[47:32] of the seventh 6-byte MAC Address.*/ + uint32_t reserved16 : 8; + uint32_t mask_byte_control6 : 6; /*These bits are mask control bits for comparison of each of the EMACADDR6 bytes. When set high the MAC does not compare the corresponding byte of received DA or SA with the contents of EMACADDR6 registers. Each bit controls the masking of the bytes as follows: Bit[29]: EMACADDR6 High [15:8]. Bit[28]: EMACADDR6 High [7:0]. Bit[27]: EMACADDR6 Low [31:24]. Bit[24]: EMACADDR6 Low [7:0].You can filter a group of addresses (known as group address filtering) by masking one or more bytes of the address.*/ + uint32_t source_address6 : 1; /*When this bit is set the EMACADDR6[47:0] is used to compare with the SA fields of the received frame. When this bit is reset the EMACADDR6[47:0] is used to compare with the DA fields of the received frame.*/ + uint32_t address_enable6 : 1; /*When this bit is set the address filter module uses the seventh MAC address for perfect filtering. When this bit is reset the address filter module ignores the address for filtering.*/ + }; + uint32_t val; + } emacaddr6high; + uint32_t emacaddr6low; /*This field contains the lower 32 bits of the seventh 6-byte MAC address.The content of this field is undefined so the register needs to be configured after the initialization Process.*/ + union { + struct { + uint32_t mac_address7_hi : 16; /*This field contains the upper 16 bits Bits[47:32] of the eighth 6-byte MAC Address.*/ + uint32_t reserved16 : 8; + uint32_t mask_byte_control7 : 6; /*These bits are mask control bits for comparison of each of the EMACADDR7 bytes. When set high the MAC does not compare the corresponding byte of received DA or SA with the contents of EMACADDR7 registers. Each bit controls the masking of the bytes as follows: Bit[29]: EMACADDR7 High [15:8]. Bit[28]: EMACADDR7 High [7:0]. Bit[27]: EMACADDR7 Low [31:24]. Bit[24]: EMACADDR7 Low [7:0].You can filter a group of addresses (known as group address filtering) by masking one or more bytes of the address.*/ + uint32_t source_address7 : 1; /*When this bit is set the EMACADDR7[47:0] is used to compare with the SA fields of the received frame. When this bit is reset the EMACADDR7[47:0] is used to compare with the DA fields of the received frame.*/ + uint32_t address_enable7 : 1; /*When this bit is set the address filter module uses the eighth MAC address for perfect filtering. When this bit is reset the address filter module ignores the address for filtering.*/ + }; + uint32_t val; + } emacaddr7high; + uint32_t emacaddr7low; /*This field contains the lower 32 bits of the eighth 6-byte MAC address.The content of this field is undefined so the register needs to be configured after the initialization Process.*/ + uint32_t reserved_1080; + uint32_t reserved_1084; + uint32_t reserved_1088; + uint32_t reserved_108c; + uint32_t reserved_1090; + uint32_t reserved_1094; + uint32_t reserved_1098; + uint32_t reserved_109c; + uint32_t reserved_10a0; + uint32_t reserved_10a4; + uint32_t reserved_10a8; + uint32_t reserved_10ac; + uint32_t reserved_10b0; + uint32_t reserved_10b4; + uint32_t reserved_10b8; + uint32_t reserved_10bc; + uint32_t reserved_10c0; + uint32_t reserved_10c4; + uint32_t reserved_10c8; + uint32_t reserved_10cc; + uint32_t reserved_10d0; + uint32_t reserved_10d4; + union { + struct { + uint32_t link_mode : 1; /*This bit indicates the current mode of operation of the link: 1'b0: Half-duplex mode. 1'b1: Full-duplex mode.*/ + uint32_t link_speed : 2; /*This bit indicates the current speed of the link: 2'b00: 2.5 MHz. 2'b01: 25 MHz. 2'b10: 125 MHz.*/ + uint32_t reserved3 : 1; + uint32_t jabber_timeout : 1; /*This bit indicates whether there is jabber timeout error (1'b1) in the received Frame.*/ + uint32_t reserved5 : 1; + uint32_t reserved6 : 10; + uint32_t reserved16 : 1; + uint32_t reserved17 : 15; + }; + uint32_t val; + } emaccstatus; + union { + struct { + uint32_t wdogto : 14; /*When Bit[16] (PWE) is set and Bit[23] (WD) of EMACCONFIG_REG is reset this field is used as watchdog timeout for a received frame. If the length of a received frame exceeds the value of this field such frame is terminated and declared as an error frame.*/ + uint32_t reserved14 : 2; + uint32_t pwdogen : 1; /*When this bit is set and Bit[23] (WD) of EMACCONFIG_REG is reset the WTO field (Bits[13:0]) is used as watchdog timeout for a received frame. When this bit is cleared the watchdog timeout for a received frame is controlled by the setting of Bit[23] (WD) and Bit[20] (JE) in EMACCONFIG_REG.*/ + uint32_t reserved17 : 15; + }; + uint32_t val; + } emacwdogto; +} emac_mac_dev_t; + +extern emac_mac_dev_t EMAC_MAC; + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/fe_reg.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/fe_reg.h new file mode 100644 index 0000000000000..7705586d7c34a --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/fe_reg.h @@ -0,0 +1,41 @@ +// 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. + +#pragma once + +#include "soc/soc.h" + +/* Some of the RF frontend control registers. + * PU/PD fields defined here are used in sleep related functions. + */ + +#define FE_GEN_CTRL (DR_REG_FE_BASE + 0x0090) +#define FE_IQ_EST_FORCE_PU (BIT(5)) +#define FE_IQ_EST_FORCE_PU_M (BIT(5)) +#define FE_IQ_EST_FORCE_PU_V 1 +#define FE_IQ_EST_FORCE_PU_S 5 +#define FE_IQ_EST_FORCE_PD (BIT(4)) +#define FE_IQ_EST_FORCE_PD_M (BIT(4)) +#define FE_IQ_EST_FORCE_PD_V 1 +#define FE_IQ_EST_FORCE_PD_S 4 + +#define FE2_TX_INTERP_CTRL (DR_REG_FE2_BASE + 0x00f0) +#define FE2_TX_INF_FORCE_PU (BIT(10)) +#define FE2_TX_INF_FORCE_PU_M (BIT(10)) +#define FE2_TX_INF_FORCE_PU_V 1 +#define FE2_TX_INF_FORCE_PU_S 10 +#define FE2_TX_INF_FORCE_PD (BIT(9)) +#define FE2_TX_INF_FORCE_PD_M (BIT(9)) +#define FE2_TX_INF_FORCE_PD_V 1 +#define FE2_TX_INF_FORCE_PD_S 9 diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/frc_timer_reg.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/frc_timer_reg.h new file mode 100644 index 0000000000000..a2152c5c91aea --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/frc_timer_reg.h @@ -0,0 +1,52 @@ +// 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. + +#ifndef _SOC_FRC_TIMER_REG_H_ +#define _SOC_FRC_TIMER_REG_H_ + +#include "soc.h" + +/** + * These are the register definitions for "legacy" timers + */ + +#define REG_FRC_TIMER_BASE(i) (DR_REG_FRC_TIMER_BASE + i*0x20) + +#define FRC_TIMER_LOAD_REG(i) (REG_FRC_TIMER_BASE(i) + 0x0) // timer load value (23 bit for i==0, 32 bit for i==1) +#define FRC_TIMER_LOAD_VALUE(i) ((i == 0)?0x007FFFFF:0xffffffff) +#define FRC_TIMER_LOAD_VALUE_S 0 + +#define FRC_TIMER_COUNT_REG(i) (REG_FRC_TIMER_BASE(i) + 0x4) // timer count value (23 bit for i==0, 32 bit for i==1) +#define FRC_TIMER_COUNT ((i == 0)?0x007FFFFF:0xffffffff) +#define FRC_TIMER_COUNT_S 0 + +#define FRC_TIMER_CTRL_REG(i) (REG_FRC_TIMER_BASE(i) + 0x8) +#define FRC_TIMER_INT_STATUS (BIT(8)) // interrupt status (RO) +#define FRC_TIMER_ENABLE (BIT(7)) // enable timer +#define FRC_TIMER_AUTOLOAD (BIT(6)) // enable autoload +#define FRC_TIMER_PRESCALER 0x00000007 +#define FRC_TIMER_PRESCALER_S 1 +#define FRC_TIMER_PRESCALER_1 (0 << FRC_TIMER_PRESCALER_S) +#define FRC_TIMER_PRESCALER_16 (2 << FRC_TIMER_PRESCALER_S) +#define FRC_TIMER_PRESCALER_256 (4 << FRC_TIMER_PRESCALER_S) +#define FRC_TIMER_LEVEL_INT (BIT(0)) // 1: level, 0: edge + +#define FRC_TIMER_INT_REG(i) (REG_FRC_TIMER_BASE(i) + 0xC) +#define FRC_TIMER_INT_CLR (BIT(0)) // clear interrupt + +#define FRC_TIMER_ALARM_REG(i) (REG_FRC_TIMER_BASE(i) + 0x10) // timer alarm value; register only present for i == 1 +#define FRC_TIMER_ALARM 0xFFFFFFFF +#define FRC_TIMER_ALARM_S 0 + +#endif //_SOC_FRC_TIMER_REG_H_ diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/gpio_caps.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/gpio_caps.h new file mode 100644 index 0000000000000..0737f1401ae9a --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/gpio_caps.h @@ -0,0 +1,48 @@ +// 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. + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +// ESP32 has 1 GPIO peripheral +#define SOC_GPIO_PORT (1) +#define GPIO_PIN_COUNT (40) + +// On ESP32 those PADs which have RTC functions must set pullup/down/capability via RTC register. +// On ESP32-S2, Digital IOs have their own registers to control pullup/down/capability, independent with RTC registers. +#define GPIO_SUPPORTS_RTC_INDEPENDENT (0) +// Force hold is a new function of ESP32-S2 +#define GPIO_SUPPORTS_FORCE_HOLD (0) + +#define GPIO_APP_CPU_INTR_ENA (BIT(0)) +#define GPIO_APP_CPU_NMI_INTR_ENA (BIT(1)) +#define GPIO_PRO_CPU_INTR_ENA (BIT(2)) +#define GPIO_PRO_CPU_NMI_INTR_ENA (BIT(3)) +#define GPIO_SDIO_EXT_INTR_ENA (BIT(4)) + +#define GPIO_MODE_DEF_DISABLE (0) +#define GPIO_MODE_DEF_INPUT (BIT0) +#define GPIO_MODE_DEF_OUTPUT (BIT1) +#define GPIO_MODE_DEF_OD (BIT2) + +#define GPIO_IS_VALID_GPIO(gpio_num) ((gpio_num < GPIO_PIN_COUNT && GPIO_PIN_MUX_REG[gpio_num] != 0)) /*!< Check whether it is a valid GPIO number */ +#define GPIO_IS_VALID_OUTPUT_GPIO(gpio_num) ((GPIO_IS_VALID_GPIO(gpio_num)) && (gpio_num < 34)) /*!< Check whether it can be a valid GPIO number of output mode */ +#define GPIO_MASK_CONTAIN_INPUT_GPIO(gpio_mask) ((gpio_mask & (GPIO_SEL_34 | GPIO_SEL_35 | GPIO_SEL_36 | GPIO_SEL_37 | GPIO_SEL_38 | GPIO_SEL_39))) /*!< Check whether it contains input io */ + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/gpio_reg.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/gpio_reg.h new file mode 100644 index 0000000000000..8168f4ba12b3f --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/gpio_reg.h @@ -0,0 +1,8238 @@ +// 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. +#ifndef _SOC_GPIO_REG_H_ +#define _SOC_GPIO_REG_H_ + +#include "soc.h" +#define GPIO_BT_SELECT_REG (DR_REG_GPIO_BASE + 0x0000) +/* GPIO_BT_SEL : R/W ;bitpos:[31:0] ;default: x ; */ +/*description: NA*/ +#define GPIO_BT_SEL 0xFFFFFFFF +#define GPIO_BT_SEL_M ((GPIO_BT_SEL_V)<<(GPIO_BT_SEL_S)) +#define GPIO_BT_SEL_V 0xFFFFFFFF +#define GPIO_BT_SEL_S 0 + +#define GPIO_OUT_REG (DR_REG_GPIO_BASE + 0x0004) +/* GPIO_OUT_DATA : R/W ;bitpos:[31:0] ;default: x ; */ +/*description: GPIO0~31 output value*/ +#define GPIO_OUT_DATA 0xFFFFFFFF +#define GPIO_OUT_DATA_M ((GPIO_OUT_DATA_V)<<(GPIO_OUT_DATA_S)) +#define GPIO_OUT_DATA_V 0xFFFFFFFF +#define GPIO_OUT_DATA_S 0 + +#define GPIO_OUT_W1TS_REG (DR_REG_GPIO_BASE + 0x0008) +/* GPIO_OUT_DATA_W1TS : R/W ;bitpos:[31:0] ;default: x ; */ +/*description: GPIO0~31 output value write 1 to set*/ +#define GPIO_OUT_DATA_W1TS 0xFFFFFFFF +#define GPIO_OUT_DATA_W1TS_M ((GPIO_OUT_DATA_W1TS_V)<<(GPIO_OUT_DATA_W1TS_S)) +#define GPIO_OUT_DATA_W1TS_V 0xFFFFFFFF +#define GPIO_OUT_DATA_W1TS_S 0 + +#define GPIO_OUT_W1TC_REG (DR_REG_GPIO_BASE + 0x000c) +/* GPIO_OUT_DATA_W1TC : R/W ;bitpos:[31:0] ;default: x ; */ +/*description: GPIO0~31 output value write 1 to clear*/ +#define GPIO_OUT_DATA_W1TC 0xFFFFFFFF +#define GPIO_OUT_DATA_W1TC_M ((GPIO_OUT_DATA_W1TC_V)<<(GPIO_OUT_DATA_W1TC_S)) +#define GPIO_OUT_DATA_W1TC_V 0xFFFFFFFF +#define GPIO_OUT_DATA_W1TC_S 0 + +#define GPIO_OUT1_REG (DR_REG_GPIO_BASE + 0x0010) +/* GPIO_OUT1_DATA : R/W ;bitpos:[7:0] ;default: x ; */ +/*description: GPIO32~39 output value*/ +#define GPIO_OUT1_DATA 0x000000FF +#define GPIO_OUT1_DATA_M ((GPIO_OUT1_DATA_V)<<(GPIO_OUT1_DATA_S)) +#define GPIO_OUT1_DATA_V 0xFF +#define GPIO_OUT1_DATA_S 0 + +#define GPIO_OUT1_W1TS_REG (DR_REG_GPIO_BASE + 0x0014) +/* GPIO_OUT1_DATA_W1TS : R/W ;bitpos:[7:0] ;default: x ; */ +/*description: GPIO32~39 output value write 1 to set*/ +#define GPIO_OUT1_DATA_W1TS 0x000000FF +#define GPIO_OUT1_DATA_W1TS_M ((GPIO_OUT1_DATA_W1TS_V)<<(GPIO_OUT1_DATA_W1TS_S)) +#define GPIO_OUT1_DATA_W1TS_V 0xFF +#define GPIO_OUT1_DATA_W1TS_S 0 + +#define GPIO_OUT1_W1TC_REG (DR_REG_GPIO_BASE + 0x0018) +/* GPIO_OUT1_DATA_W1TC : R/W ;bitpos:[7:0] ;default: x ; */ +/*description: GPIO32~39 output value write 1 to clear*/ +#define GPIO_OUT1_DATA_W1TC 0x000000FF +#define GPIO_OUT1_DATA_W1TC_M ((GPIO_OUT1_DATA_W1TC_V)<<(GPIO_OUT1_DATA_W1TC_S)) +#define GPIO_OUT1_DATA_W1TC_V 0xFF +#define GPIO_OUT1_DATA_W1TC_S 0 + +#define GPIO_SDIO_SELECT_REG (DR_REG_GPIO_BASE + 0x001c) +/* GPIO_SDIO_SEL : R/W ;bitpos:[7:0] ;default: x ; */ +/*description: SDIO PADS on/off control from outside*/ +#define GPIO_SDIO_SEL 0x000000FF +#define GPIO_SDIO_SEL_M ((GPIO_SDIO_SEL_V)<<(GPIO_SDIO_SEL_S)) +#define GPIO_SDIO_SEL_V 0xFF +#define GPIO_SDIO_SEL_S 0 + +#define GPIO_ENABLE_REG (DR_REG_GPIO_BASE + 0x0020) +/* GPIO_ENABLE_DATA : R/W ;bitpos:[31:0] ;default: x ; */ +/*description: GPIO0~31 output enable*/ +#define GPIO_ENABLE_DATA 0xFFFFFFFF +#define GPIO_ENABLE_DATA_M ((GPIO_ENABLE_DATA_V)<<(GPIO_ENABLE_DATA_S)) +#define GPIO_ENABLE_DATA_V 0xFFFFFFFF +#define GPIO_ENABLE_DATA_S 0 + +#define GPIO_ENABLE_W1TS_REG (DR_REG_GPIO_BASE + 0x0024) +/* GPIO_ENABLE_DATA_W1TS : R/W ;bitpos:[31:0] ;default: x ; */ +/*description: GPIO0~31 output enable write 1 to set*/ +#define GPIO_ENABLE_DATA_W1TS 0xFFFFFFFF +#define GPIO_ENABLE_DATA_W1TS_M ((GPIO_ENABLE_DATA_W1TS_V)<<(GPIO_ENABLE_DATA_W1TS_S)) +#define GPIO_ENABLE_DATA_W1TS_V 0xFFFFFFFF +#define GPIO_ENABLE_DATA_W1TS_S 0 + +#define GPIO_ENABLE_W1TC_REG (DR_REG_GPIO_BASE + 0x0028) +/* GPIO_ENABLE_DATA_W1TC : R/W ;bitpos:[31:0] ;default: x ; */ +/*description: GPIO0~31 output enable write 1 to clear*/ +#define GPIO_ENABLE_DATA_W1TC 0xFFFFFFFF +#define GPIO_ENABLE_DATA_W1TC_M ((GPIO_ENABLE_DATA_W1TC_V)<<(GPIO_ENABLE_DATA_W1TC_S)) +#define GPIO_ENABLE_DATA_W1TC_V 0xFFFFFFFF +#define GPIO_ENABLE_DATA_W1TC_S 0 + +#define GPIO_ENABLE1_REG (DR_REG_GPIO_BASE + 0x002c) +/* GPIO_ENABLE1_DATA : R/W ;bitpos:[7:0] ;default: x ; */ +/*description: GPIO32~39 output enable*/ +#define GPIO_ENABLE1_DATA 0x000000FF +#define GPIO_ENABLE1_DATA_M ((GPIO_ENABLE1_DATA_V)<<(GPIO_ENABLE1_DATA_S)) +#define GPIO_ENABLE1_DATA_V 0xFF +#define GPIO_ENABLE1_DATA_S 0 + +#define GPIO_ENABLE1_W1TS_REG (DR_REG_GPIO_BASE + 0x0030) +/* GPIO_ENABLE1_DATA_W1TS : R/W ;bitpos:[7:0] ;default: x ; */ +/*description: GPIO32~39 output enable write 1 to set*/ +#define GPIO_ENABLE1_DATA_W1TS 0x000000FF +#define GPIO_ENABLE1_DATA_W1TS_M ((GPIO_ENABLE1_DATA_W1TS_V)<<(GPIO_ENABLE1_DATA_W1TS_S)) +#define GPIO_ENABLE1_DATA_W1TS_V 0xFF +#define GPIO_ENABLE1_DATA_W1TS_S 0 + +#define GPIO_ENABLE1_W1TC_REG (DR_REG_GPIO_BASE + 0x0034) +/* GPIO_ENABLE1_DATA_W1TC : R/W ;bitpos:[7:0] ;default: x ; */ +/*description: GPIO32~39 output enable write 1 to clear*/ +#define GPIO_ENABLE1_DATA_W1TC 0x000000FF +#define GPIO_ENABLE1_DATA_W1TC_M ((GPIO_ENABLE1_DATA_W1TC_V)<<(GPIO_ENABLE1_DATA_W1TC_S)) +#define GPIO_ENABLE1_DATA_W1TC_V 0xFF +#define GPIO_ENABLE1_DATA_W1TC_S 0 + +#define GPIO_STRAP_REG (DR_REG_GPIO_BASE + 0x0038) +/* GPIO_STRAPPING : RO ;bitpos:[15:0] ;default: ; */ +/*description: {10'b0, MTDI, GPIO0, GPIO2, GPIO4, MTDO, GPIO5} */ +#define GPIO_STRAPPING 0x0000FFFF +#define GPIO_STRAPPING_M ((GPIO_STRAPPING_V)<<(GPIO_STRAPPING_S)) +#define GPIO_STRAPPING_V 0xFFFF +#define GPIO_STRAPPING_S 0 + +#define GPIO_IN_REG (DR_REG_GPIO_BASE + 0x003c) +/* GPIO_IN_DATA : RO ;bitpos:[31:0] ;default: ; */ +/*description: GPIO0~31 input value*/ +#define GPIO_IN_DATA 0xFFFFFFFF +#define GPIO_IN_DATA_M ((GPIO_IN_DATA_V)<<(GPIO_IN_DATA_S)) +#define GPIO_IN_DATA_V 0xFFFFFFFF +#define GPIO_IN_DATA_S 0 + +#define GPIO_IN1_REG (DR_REG_GPIO_BASE + 0x0040) +/* GPIO_IN1_DATA : RO ;bitpos:[7:0] ;default: ; */ +/*description: GPIO32~39 input value*/ +#define GPIO_IN1_DATA 0x000000FF +#define GPIO_IN1_DATA_M ((GPIO_IN1_DATA_V)<<(GPIO_IN1_DATA_S)) +#define GPIO_IN1_DATA_V 0xFF +#define GPIO_IN1_DATA_S 0 + +#define GPIO_STATUS_REG (DR_REG_GPIO_BASE + 0x0044) +/* GPIO_STATUS_INT : R/W ;bitpos:[31:0] ;default: x ; */ +/*description: GPIO0~31 interrupt status*/ +#define GPIO_STATUS_INT 0xFFFFFFFF +#define GPIO_STATUS_INT_M ((GPIO_STATUS_INT_V)<<(GPIO_STATUS_INT_S)) +#define GPIO_STATUS_INT_V 0xFFFFFFFF +#define GPIO_STATUS_INT_S 0 + +#define GPIO_STATUS_W1TS_REG (DR_REG_GPIO_BASE + 0x0048) +/* GPIO_STATUS_INT_W1TS : R/W ;bitpos:[31:0] ;default: x ; */ +/*description: GPIO0~31 interrupt status write 1 to set*/ +#define GPIO_STATUS_INT_W1TS 0xFFFFFFFF +#define GPIO_STATUS_INT_W1TS_M ((GPIO_STATUS_INT_W1TS_V)<<(GPIO_STATUS_INT_W1TS_S)) +#define GPIO_STATUS_INT_W1TS_V 0xFFFFFFFF +#define GPIO_STATUS_INT_W1TS_S 0 + +#define GPIO_STATUS_W1TC_REG (DR_REG_GPIO_BASE + 0x004c) +/* GPIO_STATUS_INT_W1TC : R/W ;bitpos:[31:0] ;default: x ; */ +/*description: GPIO0~31 interrupt status write 1 to clear*/ +#define GPIO_STATUS_INT_W1TC 0xFFFFFFFF +#define GPIO_STATUS_INT_W1TC_M ((GPIO_STATUS_INT_W1TC_V)<<(GPIO_STATUS_INT_W1TC_S)) +#define GPIO_STATUS_INT_W1TC_V 0xFFFFFFFF +#define GPIO_STATUS_INT_W1TC_S 0 + +#define GPIO_STATUS1_REG (DR_REG_GPIO_BASE + 0x0050) +/* GPIO_STATUS1_INT : R/W ;bitpos:[7:0] ;default: x ; */ +/*description: GPIO32~39 interrupt status*/ +#define GPIO_STATUS1_INT 0x000000FF +#define GPIO_STATUS1_INT_M ((GPIO_STATUS1_INT_V)<<(GPIO_STATUS1_INT_S)) +#define GPIO_STATUS1_INT_V 0xFF +#define GPIO_STATUS1_INT_S 0 + +#define GPIO_STATUS1_W1TS_REG (DR_REG_GPIO_BASE + 0x0054) +/* GPIO_STATUS1_INT_W1TS : R/W ;bitpos:[7:0] ;default: x ; */ +/*description: GPIO32~39 interrupt status write 1 to set*/ +#define GPIO_STATUS1_INT_W1TS 0x000000FF +#define GPIO_STATUS1_INT_W1TS_M ((GPIO_STATUS1_INT_W1TS_V)<<(GPIO_STATUS1_INT_W1TS_S)) +#define GPIO_STATUS1_INT_W1TS_V 0xFF +#define GPIO_STATUS1_INT_W1TS_S 0 + +#define GPIO_STATUS1_W1TC_REG (DR_REG_GPIO_BASE + 0x0058) +/* GPIO_STATUS1_INT_W1TC : R/W ;bitpos:[7:0] ;default: x ; */ +/*description: GPIO32~39 interrupt status write 1 to clear*/ +#define GPIO_STATUS1_INT_W1TC 0x000000FF +#define GPIO_STATUS1_INT_W1TC_M ((GPIO_STATUS1_INT_W1TC_V)<<(GPIO_STATUS1_INT_W1TC_S)) +#define GPIO_STATUS1_INT_W1TC_V 0xFF +#define GPIO_STATUS1_INT_W1TC_S 0 + +#define GPIO_ACPU_INT_REG (DR_REG_GPIO_BASE + 0x0060) +/* GPIO_APPCPU_INT : RO ;bitpos:[31:0] ;default: x ; */ +/*description: GPIO0~31 APP CPU interrupt status*/ +#define GPIO_APPCPU_INT 0xFFFFFFFF +#define GPIO_APPCPU_INT_M ((GPIO_APPCPU_INT_V)<<(GPIO_APPCPU_INT_S)) +#define GPIO_APPCPU_INT_V 0xFFFFFFFF +#define GPIO_APPCPU_INT_S 0 + +#define GPIO_ACPU_NMI_INT_REG (DR_REG_GPIO_BASE + 0x0064) +/* GPIO_APPCPU_NMI_INT : RO ;bitpos:[31:0] ;default: x ; */ +/*description: GPIO0~31 APP CPU non-maskable interrupt status*/ +#define GPIO_APPCPU_NMI_INT 0xFFFFFFFF +#define GPIO_APPCPU_NMI_INT_M ((GPIO_APPCPU_NMI_INT_V)<<(GPIO_APPCPU_NMI_INT_S)) +#define GPIO_APPCPU_NMI_INT_V 0xFFFFFFFF +#define GPIO_APPCPU_NMI_INT_S 0 + +#define GPIO_PCPU_INT_REG (DR_REG_GPIO_BASE + 0x0068) +/* GPIO_PROCPU_INT : RO ;bitpos:[31:0] ;default: x ; */ +/*description: GPIO0~31 PRO CPU interrupt status*/ +#define GPIO_PROCPU_INT 0xFFFFFFFF +#define GPIO_PROCPU_INT_M ((GPIO_PROCPU_INT_V)<<(GPIO_PROCPU_INT_S)) +#define GPIO_PROCPU_INT_V 0xFFFFFFFF +#define GPIO_PROCPU_INT_S 0 + +#define GPIO_PCPU_NMI_INT_REG (DR_REG_GPIO_BASE + 0x006c) +/* GPIO_PROCPU_NMI_INT : RO ;bitpos:[31:0] ;default: x ; */ +/*description: GPIO0~31 PRO CPU non-maskable interrupt status*/ +#define GPIO_PROCPU_NMI_INT 0xFFFFFFFF +#define GPIO_PROCPU_NMI_INT_M ((GPIO_PROCPU_NMI_INT_V)<<(GPIO_PROCPU_NMI_INT_S)) +#define GPIO_PROCPU_NMI_INT_V 0xFFFFFFFF +#define GPIO_PROCPU_NMI_INT_S 0 + +#define GPIO_CPUSDIO_INT_REG (DR_REG_GPIO_BASE + 0x0070) +/* GPIO_SDIO_INT : RO ;bitpos:[31:0] ;default: x ; */ +/*description: SDIO's extent GPIO0~31 interrupt*/ +#define GPIO_SDIO_INT 0xFFFFFFFF +#define GPIO_SDIO_INT_M ((GPIO_SDIO_INT_V)<<(GPIO_SDIO_INT_S)) +#define GPIO_SDIO_INT_V 0xFFFFFFFF +#define GPIO_SDIO_INT_S 0 + +#define GPIO_ACPU_INT1_REG (DR_REG_GPIO_BASE + 0x0074) +/* GPIO_APPCPU_INT_H : RO ;bitpos:[7:0] ;default: x ; */ +/*description: GPIO32~39 APP CPU interrupt status*/ +#define GPIO_APPCPU_INT_H 0x000000FF +#define GPIO_APPCPU_INT_H_M ((GPIO_APPCPU_INT_H_V)<<(GPIO_APPCPU_INT_H_S)) +#define GPIO_APPCPU_INT_H_V 0xFF +#define GPIO_APPCPU_INT_H_S 0 + +#define GPIO_ACPU_NMI_INT1_REG (DR_REG_GPIO_BASE + 0x0078) +/* GPIO_APPCPU_NMI_INT_H : RO ;bitpos:[7:0] ;default: x ; */ +/*description: GPIO32~39 APP CPU non-maskable interrupt status*/ +#define GPIO_APPCPU_NMI_INT_H 0x000000FF +#define GPIO_APPCPU_NMI_INT_H_M ((GPIO_APPCPU_NMI_INT_H_V)<<(GPIO_APPCPU_NMI_INT_H_S)) +#define GPIO_APPCPU_NMI_INT_H_V 0xFF +#define GPIO_APPCPU_NMI_INT_H_S 0 + +#define GPIO_PCPU_INT1_REG (DR_REG_GPIO_BASE + 0x007c) +/* GPIO_PROCPU_INT_H : RO ;bitpos:[7:0] ;default: x ; */ +/*description: GPIO32~39 PRO CPU interrupt status*/ +#define GPIO_PROCPU_INT_H 0x000000FF +#define GPIO_PROCPU_INT_H_M ((GPIO_PROCPU_INT_H_V)<<(GPIO_PROCPU_INT_H_S)) +#define GPIO_PROCPU_INT_H_V 0xFF +#define GPIO_PROCPU_INT_H_S 0 + +#define GPIO_PCPU_NMI_INT1_REG (DR_REG_GPIO_BASE + 0x0080) +/* GPIO_PROCPU_NMI_INT_H : RO ;bitpos:[7:0] ;default: x ; */ +/*description: GPIO32~39 PRO CPU non-maskable interrupt status*/ +#define GPIO_PROCPU_NMI_INT_H 0x000000FF +#define GPIO_PROCPU_NMI_INT_H_M ((GPIO_PROCPU_NMI_INT_H_V)<<(GPIO_PROCPU_NMI_INT_H_S)) +#define GPIO_PROCPU_NMI_INT_H_V 0xFF +#define GPIO_PROCPU_NMI_INT_H_S 0 + +#define GPIO_CPUSDIO_INT1_REG (DR_REG_GPIO_BASE + 0x0084) +/* GPIO_SDIO_INT_H : RO ;bitpos:[7:0] ;default: x ; */ +/*description: SDIO's extent GPIO32~39 interrupt*/ +#define GPIO_SDIO_INT_H 0x000000FF +#define GPIO_SDIO_INT_H_M ((GPIO_SDIO_INT_H_V)<<(GPIO_SDIO_INT_H_S)) +#define GPIO_SDIO_INT_H_V 0xFF +#define GPIO_SDIO_INT_H_S 0 + +#define GPIO_REG(io_num) (GPIO_PIN0_REG + (io_num)*0x4) +#define GPIO_PIN_INT_ENA 0x0000001F +#define GPIO_PIN_INT_ENA_M ((GPIO_PIN_INT_ENA_V)<<(GPIO_PIN_INT_ENA_S)) +#define GPIO_PIN_INT_ENA_V 0x0000001F +#define GPIO_PIN_INT_ENA_S 13 +#define GPIO_PIN_CONFIG 0x00000003 +#define GPIO_PIN_CONFIG_M ((GPIO_PIN_CONFIG_V)<<(GPIO_PIN_CONFIG_S)) +#define GPIO_PIN_CONFIG_V 0x00000003 +#define GPIO_PIN_CONFIG_S 11 +#define GPIO_PIN_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN_WAKEUP_ENABLE_S 10 +#define GPIO_PIN_INT_TYPE 0x00000007 +#define GPIO_PIN_INT_TYPE_M ((GPIO_PIN_INT_TYPE_V)<<(GPIO_PIN_INT_TYPE_S)) +#define GPIO_PIN_INT_TYPE_V 0x00000007 +#define GPIO_PIN_INT_TYPE_S 7 +#define GPIO_PIN_PAD_DRIVER (BIT(2)) +#define GPIO_PIN_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN_PAD_DRIVER_V 0x1 +#define GPIO_PIN_PAD_DRIVER_S 2 + +#define GPIO_PIN0_REG (DR_REG_GPIO_BASE + 0x0088) +/* GPIO_PIN0_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN0_INT_ENA 0x0000001F +#define GPIO_PIN0_INT_ENA_M ((GPIO_PIN0_INT_ENA_V)<<(GPIO_PIN0_INT_ENA_S)) +#define GPIO_PIN0_INT_ENA_V 0x1F +#define GPIO_PIN0_INT_ENA_S 13 +/* GPIO_PIN0_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN0_CONFIG 0x00000003 +#define GPIO_PIN0_CONFIG_M ((GPIO_PIN0_CONFIG_V)<<(GPIO_PIN0_CONFIG_S)) +#define GPIO_PIN0_CONFIG_V 0x3 +#define GPIO_PIN0_CONFIG_S 11 +/* GPIO_PIN0_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN0_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN0_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN0_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN0_WAKEUP_ENABLE_S 10 +/* GPIO_PIN0_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN0_INT_TYPE 0x00000007 +#define GPIO_PIN0_INT_TYPE_M ((GPIO_PIN0_INT_TYPE_V)<<(GPIO_PIN0_INT_TYPE_S)) +#define GPIO_PIN0_INT_TYPE_V 0x7 +#define GPIO_PIN0_INT_TYPE_S 7 +/* GPIO_PIN0_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN0_PAD_DRIVER (BIT(2)) +#define GPIO_PIN0_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN0_PAD_DRIVER_V 0x1 +#define GPIO_PIN0_PAD_DRIVER_S 2 + +#define GPIO_PIN1_REG (DR_REG_GPIO_BASE + 0x008c) +/* GPIO_PIN1_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN1_INT_ENA 0x0000001F +#define GPIO_PIN1_INT_ENA_M ((GPIO_PIN1_INT_ENA_V)<<(GPIO_PIN1_INT_ENA_S)) +#define GPIO_PIN1_INT_ENA_V 0x1F +#define GPIO_PIN1_INT_ENA_S 13 +/* GPIO_PIN1_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN1_CONFIG 0x00000003 +#define GPIO_PIN1_CONFIG_M ((GPIO_PIN1_CONFIG_V)<<(GPIO_PIN1_CONFIG_S)) +#define GPIO_PIN1_CONFIG_V 0x3 +#define GPIO_PIN1_CONFIG_S 11 +/* GPIO_PIN1_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN1_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN1_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN1_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN1_WAKEUP_ENABLE_S 10 +/* GPIO_PIN1_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN1_INT_TYPE 0x00000007 +#define GPIO_PIN1_INT_TYPE_M ((GPIO_PIN1_INT_TYPE_V)<<(GPIO_PIN1_INT_TYPE_S)) +#define GPIO_PIN1_INT_TYPE_V 0x7 +#define GPIO_PIN1_INT_TYPE_S 7 +/* GPIO_PIN1_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN1_PAD_DRIVER (BIT(2)) +#define GPIO_PIN1_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN1_PAD_DRIVER_V 0x1 +#define GPIO_PIN1_PAD_DRIVER_S 2 + +#define GPIO_PIN2_REG (DR_REG_GPIO_BASE + 0x0090) +/* GPIO_PIN2_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN2_INT_ENA 0x0000001F +#define GPIO_PIN2_INT_ENA_M ((GPIO_PIN2_INT_ENA_V)<<(GPIO_PIN2_INT_ENA_S)) +#define GPIO_PIN2_INT_ENA_V 0x1F +#define GPIO_PIN2_INT_ENA_S 13 +/* GPIO_PIN2_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN2_CONFIG 0x00000003 +#define GPIO_PIN2_CONFIG_M ((GPIO_PIN2_CONFIG_V)<<(GPIO_PIN2_CONFIG_S)) +#define GPIO_PIN2_CONFIG_V 0x3 +#define GPIO_PIN2_CONFIG_S 11 +/* GPIO_PIN2_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN2_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN2_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN2_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN2_WAKEUP_ENABLE_S 10 +/* GPIO_PIN2_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN2_INT_TYPE 0x00000007 +#define GPIO_PIN2_INT_TYPE_M ((GPIO_PIN2_INT_TYPE_V)<<(GPIO_PIN2_INT_TYPE_S)) +#define GPIO_PIN2_INT_TYPE_V 0x7 +#define GPIO_PIN2_INT_TYPE_S 7 +/* GPIO_PIN2_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN2_PAD_DRIVER (BIT(2)) +#define GPIO_PIN2_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN2_PAD_DRIVER_V 0x1 +#define GPIO_PIN2_PAD_DRIVER_S 2 + +#define GPIO_PIN3_REG (DR_REG_GPIO_BASE + 0x0094) +/* GPIO_PIN3_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN3_INT_ENA 0x0000001F +#define GPIO_PIN3_INT_ENA_M ((GPIO_PIN3_INT_ENA_V)<<(GPIO_PIN3_INT_ENA_S)) +#define GPIO_PIN3_INT_ENA_V 0x1F +#define GPIO_PIN3_INT_ENA_S 13 +/* GPIO_PIN3_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN3_CONFIG 0x00000003 +#define GPIO_PIN3_CONFIG_M ((GPIO_PIN3_CONFIG_V)<<(GPIO_PIN3_CONFIG_S)) +#define GPIO_PIN3_CONFIG_V 0x3 +#define GPIO_PIN3_CONFIG_S 11 +/* GPIO_PIN3_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN3_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN3_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN3_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN3_WAKEUP_ENABLE_S 10 +/* GPIO_PIN3_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN3_INT_TYPE 0x00000007 +#define GPIO_PIN3_INT_TYPE_M ((GPIO_PIN3_INT_TYPE_V)<<(GPIO_PIN3_INT_TYPE_S)) +#define GPIO_PIN3_INT_TYPE_V 0x7 +#define GPIO_PIN3_INT_TYPE_S 7 +/* GPIO_PIN3_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN3_PAD_DRIVER (BIT(2)) +#define GPIO_PIN3_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN3_PAD_DRIVER_V 0x1 +#define GPIO_PIN3_PAD_DRIVER_S 2 + +#define GPIO_PIN4_REG (DR_REG_GPIO_BASE + 0x0098) +/* GPIO_PIN4_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN4_INT_ENA 0x0000001F +#define GPIO_PIN4_INT_ENA_M ((GPIO_PIN4_INT_ENA_V)<<(GPIO_PIN4_INT_ENA_S)) +#define GPIO_PIN4_INT_ENA_V 0x1F +#define GPIO_PIN4_INT_ENA_S 13 +/* GPIO_PIN4_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN4_CONFIG 0x00000003 +#define GPIO_PIN4_CONFIG_M ((GPIO_PIN4_CONFIG_V)<<(GPIO_PIN4_CONFIG_S)) +#define GPIO_PIN4_CONFIG_V 0x3 +#define GPIO_PIN4_CONFIG_S 11 +/* GPIO_PIN4_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN4_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN4_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN4_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN4_WAKEUP_ENABLE_S 10 +/* GPIO_PIN4_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN4_INT_TYPE 0x00000007 +#define GPIO_PIN4_INT_TYPE_M ((GPIO_PIN4_INT_TYPE_V)<<(GPIO_PIN4_INT_TYPE_S)) +#define GPIO_PIN4_INT_TYPE_V 0x7 +#define GPIO_PIN4_INT_TYPE_S 7 +/* GPIO_PIN4_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN4_PAD_DRIVER (BIT(2)) +#define GPIO_PIN4_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN4_PAD_DRIVER_V 0x1 +#define GPIO_PIN4_PAD_DRIVER_S 2 + +#define GPIO_PIN5_REG (DR_REG_GPIO_BASE + 0x009c) +/* GPIO_PIN5_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN5_INT_ENA 0x0000001F +#define GPIO_PIN5_INT_ENA_M ((GPIO_PIN5_INT_ENA_V)<<(GPIO_PIN5_INT_ENA_S)) +#define GPIO_PIN5_INT_ENA_V 0x1F +#define GPIO_PIN5_INT_ENA_S 13 +/* GPIO_PIN5_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN5_CONFIG 0x00000003 +#define GPIO_PIN5_CONFIG_M ((GPIO_PIN5_CONFIG_V)<<(GPIO_PIN5_CONFIG_S)) +#define GPIO_PIN5_CONFIG_V 0x3 +#define GPIO_PIN5_CONFIG_S 11 +/* GPIO_PIN5_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN5_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN5_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN5_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN5_WAKEUP_ENABLE_S 10 +/* GPIO_PIN5_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN5_INT_TYPE 0x00000007 +#define GPIO_PIN5_INT_TYPE_M ((GPIO_PIN5_INT_TYPE_V)<<(GPIO_PIN5_INT_TYPE_S)) +#define GPIO_PIN5_INT_TYPE_V 0x7 +#define GPIO_PIN5_INT_TYPE_S 7 +/* GPIO_PIN5_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN5_PAD_DRIVER (BIT(2)) +#define GPIO_PIN5_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN5_PAD_DRIVER_V 0x1 +#define GPIO_PIN5_PAD_DRIVER_S 2 + +#define GPIO_PIN6_REG (DR_REG_GPIO_BASE + 0x00a0) +/* GPIO_PIN6_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN6_INT_ENA 0x0000001F +#define GPIO_PIN6_INT_ENA_M ((GPIO_PIN6_INT_ENA_V)<<(GPIO_PIN6_INT_ENA_S)) +#define GPIO_PIN6_INT_ENA_V 0x1F +#define GPIO_PIN6_INT_ENA_S 13 +/* GPIO_PIN6_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN6_CONFIG 0x00000003 +#define GPIO_PIN6_CONFIG_M ((GPIO_PIN6_CONFIG_V)<<(GPIO_PIN6_CONFIG_S)) +#define GPIO_PIN6_CONFIG_V 0x3 +#define GPIO_PIN6_CONFIG_S 11 +/* GPIO_PIN6_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN6_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN6_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN6_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN6_WAKEUP_ENABLE_S 10 +/* GPIO_PIN6_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN6_INT_TYPE 0x00000007 +#define GPIO_PIN6_INT_TYPE_M ((GPIO_PIN6_INT_TYPE_V)<<(GPIO_PIN6_INT_TYPE_S)) +#define GPIO_PIN6_INT_TYPE_V 0x7 +#define GPIO_PIN6_INT_TYPE_S 7 +/* GPIO_PIN6_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN6_PAD_DRIVER (BIT(2)) +#define GPIO_PIN6_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN6_PAD_DRIVER_V 0x1 +#define GPIO_PIN6_PAD_DRIVER_S 2 + +#define GPIO_PIN7_REG (DR_REG_GPIO_BASE + 0x00a4) +/* GPIO_PIN7_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN7_INT_ENA 0x0000001F +#define GPIO_PIN7_INT_ENA_M ((GPIO_PIN7_INT_ENA_V)<<(GPIO_PIN7_INT_ENA_S)) +#define GPIO_PIN7_INT_ENA_V 0x1F +#define GPIO_PIN7_INT_ENA_S 13 +/* GPIO_PIN7_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN7_CONFIG 0x00000003 +#define GPIO_PIN7_CONFIG_M ((GPIO_PIN7_CONFIG_V)<<(GPIO_PIN7_CONFIG_S)) +#define GPIO_PIN7_CONFIG_V 0x3 +#define GPIO_PIN7_CONFIG_S 11 +/* GPIO_PIN7_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN7_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN7_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN7_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN7_WAKEUP_ENABLE_S 10 +/* GPIO_PIN7_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN7_INT_TYPE 0x00000007 +#define GPIO_PIN7_INT_TYPE_M ((GPIO_PIN7_INT_TYPE_V)<<(GPIO_PIN7_INT_TYPE_S)) +#define GPIO_PIN7_INT_TYPE_V 0x7 +#define GPIO_PIN7_INT_TYPE_S 7 +/* GPIO_PIN7_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN7_PAD_DRIVER (BIT(2)) +#define GPIO_PIN7_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN7_PAD_DRIVER_V 0x1 +#define GPIO_PIN7_PAD_DRIVER_S 2 + +#define GPIO_PIN8_REG (DR_REG_GPIO_BASE + 0x00a8) +/* GPIO_PIN8_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN8_INT_ENA 0x0000001F +#define GPIO_PIN8_INT_ENA_M ((GPIO_PIN8_INT_ENA_V)<<(GPIO_PIN8_INT_ENA_S)) +#define GPIO_PIN8_INT_ENA_V 0x1F +#define GPIO_PIN8_INT_ENA_S 13 +/* GPIO_PIN8_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN8_CONFIG 0x00000003 +#define GPIO_PIN8_CONFIG_M ((GPIO_PIN8_CONFIG_V)<<(GPIO_PIN8_CONFIG_S)) +#define GPIO_PIN8_CONFIG_V 0x3 +#define GPIO_PIN8_CONFIG_S 11 +/* GPIO_PIN8_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN8_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN8_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN8_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN8_WAKEUP_ENABLE_S 10 +/* GPIO_PIN8_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN8_INT_TYPE 0x00000007 +#define GPIO_PIN8_INT_TYPE_M ((GPIO_PIN8_INT_TYPE_V)<<(GPIO_PIN8_INT_TYPE_S)) +#define GPIO_PIN8_INT_TYPE_V 0x7 +#define GPIO_PIN8_INT_TYPE_S 7 +/* GPIO_PIN8_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN8_PAD_DRIVER (BIT(2)) +#define GPIO_PIN8_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN8_PAD_DRIVER_V 0x1 +#define GPIO_PIN8_PAD_DRIVER_S 2 + +#define GPIO_PIN9_REG (DR_REG_GPIO_BASE + 0x00ac) +/* GPIO_PIN9_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN9_INT_ENA 0x0000001F +#define GPIO_PIN9_INT_ENA_M ((GPIO_PIN9_INT_ENA_V)<<(GPIO_PIN9_INT_ENA_S)) +#define GPIO_PIN9_INT_ENA_V 0x1F +#define GPIO_PIN9_INT_ENA_S 13 +/* GPIO_PIN9_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN9_CONFIG 0x00000003 +#define GPIO_PIN9_CONFIG_M ((GPIO_PIN9_CONFIG_V)<<(GPIO_PIN9_CONFIG_S)) +#define GPIO_PIN9_CONFIG_V 0x3 +#define GPIO_PIN9_CONFIG_S 11 +/* GPIO_PIN9_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN9_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN9_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN9_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN9_WAKEUP_ENABLE_S 10 +/* GPIO_PIN9_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN9_INT_TYPE 0x00000007 +#define GPIO_PIN9_INT_TYPE_M ((GPIO_PIN9_INT_TYPE_V)<<(GPIO_PIN9_INT_TYPE_S)) +#define GPIO_PIN9_INT_TYPE_V 0x7 +#define GPIO_PIN9_INT_TYPE_S 7 +/* GPIO_PIN9_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN9_PAD_DRIVER (BIT(2)) +#define GPIO_PIN9_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN9_PAD_DRIVER_V 0x1 +#define GPIO_PIN9_PAD_DRIVER_S 2 + +#define GPIO_PIN10_REG (DR_REG_GPIO_BASE + 0x00b0) +/* GPIO_PIN10_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN10_INT_ENA 0x0000001F +#define GPIO_PIN10_INT_ENA_M ((GPIO_PIN10_INT_ENA_V)<<(GPIO_PIN10_INT_ENA_S)) +#define GPIO_PIN10_INT_ENA_V 0x1F +#define GPIO_PIN10_INT_ENA_S 13 +/* GPIO_PIN10_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN10_CONFIG 0x00000003 +#define GPIO_PIN10_CONFIG_M ((GPIO_PIN10_CONFIG_V)<<(GPIO_PIN10_CONFIG_S)) +#define GPIO_PIN10_CONFIG_V 0x3 +#define GPIO_PIN10_CONFIG_S 11 +/* GPIO_PIN10_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN10_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN10_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN10_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN10_WAKEUP_ENABLE_S 10 +/* GPIO_PIN10_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN10_INT_TYPE 0x00000007 +#define GPIO_PIN10_INT_TYPE_M ((GPIO_PIN10_INT_TYPE_V)<<(GPIO_PIN10_INT_TYPE_S)) +#define GPIO_PIN10_INT_TYPE_V 0x7 +#define GPIO_PIN10_INT_TYPE_S 7 +/* GPIO_PIN10_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN10_PAD_DRIVER (BIT(2)) +#define GPIO_PIN10_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN10_PAD_DRIVER_V 0x1 +#define GPIO_PIN10_PAD_DRIVER_S 2 + +#define GPIO_PIN11_REG (DR_REG_GPIO_BASE + 0x00b4) +/* GPIO_PIN11_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN11_INT_ENA 0x0000001F +#define GPIO_PIN11_INT_ENA_M ((GPIO_PIN11_INT_ENA_V)<<(GPIO_PIN11_INT_ENA_S)) +#define GPIO_PIN11_INT_ENA_V 0x1F +#define GPIO_PIN11_INT_ENA_S 13 +/* GPIO_PIN11_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN11_CONFIG 0x00000003 +#define GPIO_PIN11_CONFIG_M ((GPIO_PIN11_CONFIG_V)<<(GPIO_PIN11_CONFIG_S)) +#define GPIO_PIN11_CONFIG_V 0x3 +#define GPIO_PIN11_CONFIG_S 11 +/* GPIO_PIN11_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN11_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN11_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN11_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN11_WAKEUP_ENABLE_S 10 +/* GPIO_PIN11_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN11_INT_TYPE 0x00000007 +#define GPIO_PIN11_INT_TYPE_M ((GPIO_PIN11_INT_TYPE_V)<<(GPIO_PIN11_INT_TYPE_S)) +#define GPIO_PIN11_INT_TYPE_V 0x7 +#define GPIO_PIN11_INT_TYPE_S 7 +/* GPIO_PIN11_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN11_PAD_DRIVER (BIT(2)) +#define GPIO_PIN11_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN11_PAD_DRIVER_V 0x1 +#define GPIO_PIN11_PAD_DRIVER_S 2 + +#define GPIO_PIN12_REG (DR_REG_GPIO_BASE + 0x00b8) +/* GPIO_PIN12_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN12_INT_ENA 0x0000001F +#define GPIO_PIN12_INT_ENA_M ((GPIO_PIN12_INT_ENA_V)<<(GPIO_PIN12_INT_ENA_S)) +#define GPIO_PIN12_INT_ENA_V 0x1F +#define GPIO_PIN12_INT_ENA_S 13 +/* GPIO_PIN12_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN12_CONFIG 0x00000003 +#define GPIO_PIN12_CONFIG_M ((GPIO_PIN12_CONFIG_V)<<(GPIO_PIN12_CONFIG_S)) +#define GPIO_PIN12_CONFIG_V 0x3 +#define GPIO_PIN12_CONFIG_S 11 +/* GPIO_PIN12_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN12_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN12_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN12_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN12_WAKEUP_ENABLE_S 10 +/* GPIO_PIN12_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN12_INT_TYPE 0x00000007 +#define GPIO_PIN12_INT_TYPE_M ((GPIO_PIN12_INT_TYPE_V)<<(GPIO_PIN12_INT_TYPE_S)) +#define GPIO_PIN12_INT_TYPE_V 0x7 +#define GPIO_PIN12_INT_TYPE_S 7 +/* GPIO_PIN12_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN12_PAD_DRIVER (BIT(2)) +#define GPIO_PIN12_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN12_PAD_DRIVER_V 0x1 +#define GPIO_PIN12_PAD_DRIVER_S 2 + +#define GPIO_PIN13_REG (DR_REG_GPIO_BASE + 0x00bc) +/* GPIO_PIN13_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN13_INT_ENA 0x0000001F +#define GPIO_PIN13_INT_ENA_M ((GPIO_PIN13_INT_ENA_V)<<(GPIO_PIN13_INT_ENA_S)) +#define GPIO_PIN13_INT_ENA_V 0x1F +#define GPIO_PIN13_INT_ENA_S 13 +/* GPIO_PIN13_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN13_CONFIG 0x00000003 +#define GPIO_PIN13_CONFIG_M ((GPIO_PIN13_CONFIG_V)<<(GPIO_PIN13_CONFIG_S)) +#define GPIO_PIN13_CONFIG_V 0x3 +#define GPIO_PIN13_CONFIG_S 11 +/* GPIO_PIN13_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN13_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN13_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN13_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN13_WAKEUP_ENABLE_S 10 +/* GPIO_PIN13_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN13_INT_TYPE 0x00000007 +#define GPIO_PIN13_INT_TYPE_M ((GPIO_PIN13_INT_TYPE_V)<<(GPIO_PIN13_INT_TYPE_S)) +#define GPIO_PIN13_INT_TYPE_V 0x7 +#define GPIO_PIN13_INT_TYPE_S 7 +/* GPIO_PIN13_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN13_PAD_DRIVER (BIT(2)) +#define GPIO_PIN13_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN13_PAD_DRIVER_V 0x1 +#define GPIO_PIN13_PAD_DRIVER_S 2 + +#define GPIO_PIN14_REG (DR_REG_GPIO_BASE + 0x00c0) +/* GPIO_PIN14_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN14_INT_ENA 0x0000001F +#define GPIO_PIN14_INT_ENA_M ((GPIO_PIN14_INT_ENA_V)<<(GPIO_PIN14_INT_ENA_S)) +#define GPIO_PIN14_INT_ENA_V 0x1F +#define GPIO_PIN14_INT_ENA_S 13 +/* GPIO_PIN14_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN14_CONFIG 0x00000003 +#define GPIO_PIN14_CONFIG_M ((GPIO_PIN14_CONFIG_V)<<(GPIO_PIN14_CONFIG_S)) +#define GPIO_PIN14_CONFIG_V 0x3 +#define GPIO_PIN14_CONFIG_S 11 +/* GPIO_PIN14_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN14_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN14_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN14_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN14_WAKEUP_ENABLE_S 10 +/* GPIO_PIN14_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN14_INT_TYPE 0x00000007 +#define GPIO_PIN14_INT_TYPE_M ((GPIO_PIN14_INT_TYPE_V)<<(GPIO_PIN14_INT_TYPE_S)) +#define GPIO_PIN14_INT_TYPE_V 0x7 +#define GPIO_PIN14_INT_TYPE_S 7 +/* GPIO_PIN14_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN14_PAD_DRIVER (BIT(2)) +#define GPIO_PIN14_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN14_PAD_DRIVER_V 0x1 +#define GPIO_PIN14_PAD_DRIVER_S 2 + +#define GPIO_PIN15_REG (DR_REG_GPIO_BASE + 0x00c4) +/* GPIO_PIN15_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN15_INT_ENA 0x0000001F +#define GPIO_PIN15_INT_ENA_M ((GPIO_PIN15_INT_ENA_V)<<(GPIO_PIN15_INT_ENA_S)) +#define GPIO_PIN15_INT_ENA_V 0x1F +#define GPIO_PIN15_INT_ENA_S 13 +/* GPIO_PIN15_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN15_CONFIG 0x00000003 +#define GPIO_PIN15_CONFIG_M ((GPIO_PIN15_CONFIG_V)<<(GPIO_PIN15_CONFIG_S)) +#define GPIO_PIN15_CONFIG_V 0x3 +#define GPIO_PIN15_CONFIG_S 11 +/* GPIO_PIN15_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN15_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN15_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN15_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN15_WAKEUP_ENABLE_S 10 +/* GPIO_PIN15_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN15_INT_TYPE 0x00000007 +#define GPIO_PIN15_INT_TYPE_M ((GPIO_PIN15_INT_TYPE_V)<<(GPIO_PIN15_INT_TYPE_S)) +#define GPIO_PIN15_INT_TYPE_V 0x7 +#define GPIO_PIN15_INT_TYPE_S 7 +/* GPIO_PIN15_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN15_PAD_DRIVER (BIT(2)) +#define GPIO_PIN15_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN15_PAD_DRIVER_V 0x1 +#define GPIO_PIN15_PAD_DRIVER_S 2 + +#define GPIO_PIN16_REG (DR_REG_GPIO_BASE + 0x00c8) +/* GPIO_PIN16_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN16_INT_ENA 0x0000001F +#define GPIO_PIN16_INT_ENA_M ((GPIO_PIN16_INT_ENA_V)<<(GPIO_PIN16_INT_ENA_S)) +#define GPIO_PIN16_INT_ENA_V 0x1F +#define GPIO_PIN16_INT_ENA_S 13 +/* GPIO_PIN16_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN16_CONFIG 0x00000003 +#define GPIO_PIN16_CONFIG_M ((GPIO_PIN16_CONFIG_V)<<(GPIO_PIN16_CONFIG_S)) +#define GPIO_PIN16_CONFIG_V 0x3 +#define GPIO_PIN16_CONFIG_S 11 +/* GPIO_PIN16_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN16_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN16_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN16_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN16_WAKEUP_ENABLE_S 10 +/* GPIO_PIN16_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN16_INT_TYPE 0x00000007 +#define GPIO_PIN16_INT_TYPE_M ((GPIO_PIN16_INT_TYPE_V)<<(GPIO_PIN16_INT_TYPE_S)) +#define GPIO_PIN16_INT_TYPE_V 0x7 +#define GPIO_PIN16_INT_TYPE_S 7 +/* GPIO_PIN16_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN16_PAD_DRIVER (BIT(2)) +#define GPIO_PIN16_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN16_PAD_DRIVER_V 0x1 +#define GPIO_PIN16_PAD_DRIVER_S 2 + +#define GPIO_PIN17_REG (DR_REG_GPIO_BASE + 0x00cc) +/* GPIO_PIN17_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN17_INT_ENA 0x0000001F +#define GPIO_PIN17_INT_ENA_M ((GPIO_PIN17_INT_ENA_V)<<(GPIO_PIN17_INT_ENA_S)) +#define GPIO_PIN17_INT_ENA_V 0x1F +#define GPIO_PIN17_INT_ENA_S 13 +/* GPIO_PIN17_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN17_CONFIG 0x00000003 +#define GPIO_PIN17_CONFIG_M ((GPIO_PIN17_CONFIG_V)<<(GPIO_PIN17_CONFIG_S)) +#define GPIO_PIN17_CONFIG_V 0x3 +#define GPIO_PIN17_CONFIG_S 11 +/* GPIO_PIN17_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN17_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN17_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN17_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN17_WAKEUP_ENABLE_S 10 +/* GPIO_PIN17_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN17_INT_TYPE 0x00000007 +#define GPIO_PIN17_INT_TYPE_M ((GPIO_PIN17_INT_TYPE_V)<<(GPIO_PIN17_INT_TYPE_S)) +#define GPIO_PIN17_INT_TYPE_V 0x7 +#define GPIO_PIN17_INT_TYPE_S 7 +/* GPIO_PIN17_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN17_PAD_DRIVER (BIT(2)) +#define GPIO_PIN17_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN17_PAD_DRIVER_V 0x1 +#define GPIO_PIN17_PAD_DRIVER_S 2 + +#define GPIO_PIN18_REG (DR_REG_GPIO_BASE + 0x00d0) +/* GPIO_PIN18_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN18_INT_ENA 0x0000001F +#define GPIO_PIN18_INT_ENA_M ((GPIO_PIN18_INT_ENA_V)<<(GPIO_PIN18_INT_ENA_S)) +#define GPIO_PIN18_INT_ENA_V 0x1F +#define GPIO_PIN18_INT_ENA_S 13 +/* GPIO_PIN18_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN18_CONFIG 0x00000003 +#define GPIO_PIN18_CONFIG_M ((GPIO_PIN18_CONFIG_V)<<(GPIO_PIN18_CONFIG_S)) +#define GPIO_PIN18_CONFIG_V 0x3 +#define GPIO_PIN18_CONFIG_S 11 +/* GPIO_PIN18_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN18_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN18_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN18_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN18_WAKEUP_ENABLE_S 10 +/* GPIO_PIN18_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN18_INT_TYPE 0x00000007 +#define GPIO_PIN18_INT_TYPE_M ((GPIO_PIN18_INT_TYPE_V)<<(GPIO_PIN18_INT_TYPE_S)) +#define GPIO_PIN18_INT_TYPE_V 0x7 +#define GPIO_PIN18_INT_TYPE_S 7 +/* GPIO_PIN18_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN18_PAD_DRIVER (BIT(2)) +#define GPIO_PIN18_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN18_PAD_DRIVER_V 0x1 +#define GPIO_PIN18_PAD_DRIVER_S 2 + +#define GPIO_PIN19_REG (DR_REG_GPIO_BASE + 0x00d4) +/* GPIO_PIN19_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN19_INT_ENA 0x0000001F +#define GPIO_PIN19_INT_ENA_M ((GPIO_PIN19_INT_ENA_V)<<(GPIO_PIN19_INT_ENA_S)) +#define GPIO_PIN19_INT_ENA_V 0x1F +#define GPIO_PIN19_INT_ENA_S 13 +/* GPIO_PIN19_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN19_CONFIG 0x00000003 +#define GPIO_PIN19_CONFIG_M ((GPIO_PIN19_CONFIG_V)<<(GPIO_PIN19_CONFIG_S)) +#define GPIO_PIN19_CONFIG_V 0x3 +#define GPIO_PIN19_CONFIG_S 11 +/* GPIO_PIN19_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN19_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN19_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN19_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN19_WAKEUP_ENABLE_S 10 +/* GPIO_PIN19_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN19_INT_TYPE 0x00000007 +#define GPIO_PIN19_INT_TYPE_M ((GPIO_PIN19_INT_TYPE_V)<<(GPIO_PIN19_INT_TYPE_S)) +#define GPIO_PIN19_INT_TYPE_V 0x7 +#define GPIO_PIN19_INT_TYPE_S 7 +/* GPIO_PIN19_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN19_PAD_DRIVER (BIT(2)) +#define GPIO_PIN19_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN19_PAD_DRIVER_V 0x1 +#define GPIO_PIN19_PAD_DRIVER_S 2 + +#define GPIO_PIN20_REG (DR_REG_GPIO_BASE + 0x00d8) +/* GPIO_PIN20_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-mask interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-mask interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN20_INT_ENA 0x0000001F +#define GPIO_PIN20_INT_ENA_M ((GPIO_PIN20_INT_ENA_V)<<(GPIO_PIN20_INT_ENA_S)) +#define GPIO_PIN20_INT_ENA_V 0x1F +#define GPIO_PIN20_INT_ENA_S 13 +/* GPIO_PIN20_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN20_CONFIG 0x00000003 +#define GPIO_PIN20_CONFIG_M ((GPIO_PIN20_CONFIG_V)<<(GPIO_PIN20_CONFIG_S)) +#define GPIO_PIN20_CONFIG_V 0x3 +#define GPIO_PIN20_CONFIG_S 11 +/* GPIO_PIN20_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN20_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN20_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN20_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN20_WAKEUP_ENABLE_S 10 +/* GPIO_PIN20_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN20_INT_TYPE 0x00000007 +#define GPIO_PIN20_INT_TYPE_M ((GPIO_PIN20_INT_TYPE_V)<<(GPIO_PIN20_INT_TYPE_S)) +#define GPIO_PIN20_INT_TYPE_V 0x7 +#define GPIO_PIN20_INT_TYPE_S 7 +/* GPIO_PIN20_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN20_PAD_DRIVER (BIT(2)) +#define GPIO_PIN20_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN20_PAD_DRIVER_V 0x1 +#define GPIO_PIN20_PAD_DRIVER_S 2 + +#define GPIO_PIN21_REG (DR_REG_GPIO_BASE + 0x00dc) +/* GPIO_PIN21_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN21_INT_ENA 0x0000001F +#define GPIO_PIN21_INT_ENA_M ((GPIO_PIN21_INT_ENA_V)<<(GPIO_PIN21_INT_ENA_S)) +#define GPIO_PIN21_INT_ENA_V 0x1F +#define GPIO_PIN21_INT_ENA_S 13 +/* GPIO_PIN21_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN21_CONFIG 0x00000003 +#define GPIO_PIN21_CONFIG_M ((GPIO_PIN21_CONFIG_V)<<(GPIO_PIN21_CONFIG_S)) +#define GPIO_PIN21_CONFIG_V 0x3 +#define GPIO_PIN21_CONFIG_S 11 +/* GPIO_PIN21_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN21_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN21_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN21_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN21_WAKEUP_ENABLE_S 10 +/* GPIO_PIN21_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN21_INT_TYPE 0x00000007 +#define GPIO_PIN21_INT_TYPE_M ((GPIO_PIN21_INT_TYPE_V)<<(GPIO_PIN21_INT_TYPE_S)) +#define GPIO_PIN21_INT_TYPE_V 0x7 +#define GPIO_PIN21_INT_TYPE_S 7 +/* GPIO_PIN21_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN21_PAD_DRIVER (BIT(2)) +#define GPIO_PIN21_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN21_PAD_DRIVER_V 0x1 +#define GPIO_PIN21_PAD_DRIVER_S 2 + +#define GPIO_PIN22_REG (DR_REG_GPIO_BASE + 0x00e0) +/* GPIO_PIN22_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: */ +#define GPIO_PIN22_INT_ENA 0x0000001F +#define GPIO_PIN22_INT_ENA_M ((GPIO_PIN22_INT_ENA_V)<<(GPIO_PIN22_INT_ENA_S)) +#define GPIO_PIN22_INT_ENA_V 0x1F +#define GPIO_PIN22_INT_ENA_S 13 +/* GPIO_PIN22_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN22_CONFIG 0x00000003 +#define GPIO_PIN22_CONFIG_M ((GPIO_PIN22_CONFIG_V)<<(GPIO_PIN22_CONFIG_S)) +#define GPIO_PIN22_CONFIG_V 0x3 +#define GPIO_PIN22_CONFIG_S 11 +/* GPIO_PIN22_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN22_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN22_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN22_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN22_WAKEUP_ENABLE_S 10 +/* GPIO_PIN22_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN22_INT_TYPE 0x00000007 +#define GPIO_PIN22_INT_TYPE_M ((GPIO_PIN22_INT_TYPE_V)<<(GPIO_PIN22_INT_TYPE_S)) +#define GPIO_PIN22_INT_TYPE_V 0x7 +#define GPIO_PIN22_INT_TYPE_S 7 +/* GPIO_PIN22_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: */ +#define GPIO_PIN22_PAD_DRIVER (BIT(2)) +#define GPIO_PIN22_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN22_PAD_DRIVER_V 0x1 +#define GPIO_PIN22_PAD_DRIVER_S 2 + +#define GPIO_PIN23_REG (DR_REG_GPIO_BASE + 0x00e4) +/* GPIO_PIN23_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN23_INT_ENA 0x0000001F +#define GPIO_PIN23_INT_ENA_M ((GPIO_PIN23_INT_ENA_V)<<(GPIO_PIN23_INT_ENA_S)) +#define GPIO_PIN23_INT_ENA_V 0x1F +#define GPIO_PIN23_INT_ENA_S 13 +/* GPIO_PIN23_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN23_CONFIG 0x00000003 +#define GPIO_PIN23_CONFIG_M ((GPIO_PIN23_CONFIG_V)<<(GPIO_PIN23_CONFIG_S)) +#define GPIO_PIN23_CONFIG_V 0x3 +#define GPIO_PIN23_CONFIG_S 11 +/* GPIO_PIN23_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN23_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN23_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN23_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN23_WAKEUP_ENABLE_S 10 +/* GPIO_PIN23_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN23_INT_TYPE 0x00000007 +#define GPIO_PIN23_INT_TYPE_M ((GPIO_PIN23_INT_TYPE_V)<<(GPIO_PIN23_INT_TYPE_S)) +#define GPIO_PIN23_INT_TYPE_V 0x7 +#define GPIO_PIN23_INT_TYPE_S 7 +/* GPIO_PIN23_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN23_PAD_DRIVER (BIT(2)) +#define GPIO_PIN23_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN23_PAD_DRIVER_V 0x1 +#define GPIO_PIN23_PAD_DRIVER_S 2 + +#define GPIO_PIN24_REG (DR_REG_GPIO_BASE + 0x00e8) +/* GPIO_PIN24_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN24_INT_ENA 0x0000001F +#define GPIO_PIN24_INT_ENA_M ((GPIO_PIN24_INT_ENA_V)<<(GPIO_PIN24_INT_ENA_S)) +#define GPIO_PIN24_INT_ENA_V 0x1F +#define GPIO_PIN24_INT_ENA_S 13 +/* GPIO_PIN24_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN24_CONFIG 0x00000003 +#define GPIO_PIN24_CONFIG_M ((GPIO_PIN24_CONFIG_V)<<(GPIO_PIN24_CONFIG_S)) +#define GPIO_PIN24_CONFIG_V 0x3 +#define GPIO_PIN24_CONFIG_S 11 +/* GPIO_PIN24_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN24_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN24_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN24_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN24_WAKEUP_ENABLE_S 10 +/* GPIO_PIN24_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN24_INT_TYPE 0x00000007 +#define GPIO_PIN24_INT_TYPE_M ((GPIO_PIN24_INT_TYPE_V)<<(GPIO_PIN24_INT_TYPE_S)) +#define GPIO_PIN24_INT_TYPE_V 0x7 +#define GPIO_PIN24_INT_TYPE_S 7 +/* GPIO_PIN24_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN24_PAD_DRIVER (BIT(2)) +#define GPIO_PIN24_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN24_PAD_DRIVER_V 0x1 +#define GPIO_PIN24_PAD_DRIVER_S 2 + +#define GPIO_PIN25_REG (DR_REG_GPIO_BASE + 0x00ec) +/* GPIO_PIN25_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN25_INT_ENA 0x0000001F +#define GPIO_PIN25_INT_ENA_M ((GPIO_PIN25_INT_ENA_V)<<(GPIO_PIN25_INT_ENA_S)) +#define GPIO_PIN25_INT_ENA_V 0x1F +#define GPIO_PIN25_INT_ENA_S 13 +/* GPIO_PIN25_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN25_CONFIG 0x00000003 +#define GPIO_PIN25_CONFIG_M ((GPIO_PIN25_CONFIG_V)<<(GPIO_PIN25_CONFIG_S)) +#define GPIO_PIN25_CONFIG_V 0x3 +#define GPIO_PIN25_CONFIG_S 11 +/* GPIO_PIN25_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN25_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN25_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN25_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN25_WAKEUP_ENABLE_S 10 +/* GPIO_PIN25_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN25_INT_TYPE 0x00000007 +#define GPIO_PIN25_INT_TYPE_M ((GPIO_PIN25_INT_TYPE_V)<<(GPIO_PIN25_INT_TYPE_S)) +#define GPIO_PIN25_INT_TYPE_V 0x7 +#define GPIO_PIN25_INT_TYPE_S 7 +/* GPIO_PIN25_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN25_PAD_DRIVER (BIT(2)) +#define GPIO_PIN25_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN25_PAD_DRIVER_V 0x1 +#define GPIO_PIN25_PAD_DRIVER_S 2 + +#define GPIO_PIN26_REG (DR_REG_GPIO_BASE + 0x00f0) +/* GPIO_PIN26_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN26_INT_ENA 0x0000001F +#define GPIO_PIN26_INT_ENA_M ((GPIO_PIN26_INT_ENA_V)<<(GPIO_PIN26_INT_ENA_S)) +#define GPIO_PIN26_INT_ENA_V 0x1F +#define GPIO_PIN26_INT_ENA_S 13 +/* GPIO_PIN26_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN26_CONFIG 0x00000003 +#define GPIO_PIN26_CONFIG_M ((GPIO_PIN26_CONFIG_V)<<(GPIO_PIN26_CONFIG_S)) +#define GPIO_PIN26_CONFIG_V 0x3 +#define GPIO_PIN26_CONFIG_S 11 +/* GPIO_PIN26_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN26_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN26_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN26_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN26_WAKEUP_ENABLE_S 10 +/* GPIO_PIN26_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN26_INT_TYPE 0x00000007 +#define GPIO_PIN26_INT_TYPE_M ((GPIO_PIN26_INT_TYPE_V)<<(GPIO_PIN26_INT_TYPE_S)) +#define GPIO_PIN26_INT_TYPE_V 0x7 +#define GPIO_PIN26_INT_TYPE_S 7 +/* GPIO_PIN26_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN26_PAD_DRIVER (BIT(2)) +#define GPIO_PIN26_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN26_PAD_DRIVER_V 0x1 +#define GPIO_PIN26_PAD_DRIVER_S 2 + +#define GPIO_PIN27_REG (DR_REG_GPIO_BASE + 0x00f4) +/* GPIO_PIN27_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN27_INT_ENA 0x0000001F +#define GPIO_PIN27_INT_ENA_M ((GPIO_PIN27_INT_ENA_V)<<(GPIO_PIN27_INT_ENA_S)) +#define GPIO_PIN27_INT_ENA_V 0x1F +#define GPIO_PIN27_INT_ENA_S 13 +/* GPIO_PIN27_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN27_CONFIG 0x00000003 +#define GPIO_PIN27_CONFIG_M ((GPIO_PIN27_CONFIG_V)<<(GPIO_PIN27_CONFIG_S)) +#define GPIO_PIN27_CONFIG_V 0x3 +#define GPIO_PIN27_CONFIG_S 11 +/* GPIO_PIN27_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN27_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN27_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN27_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN27_WAKEUP_ENABLE_S 10 +/* GPIO_PIN27_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN27_INT_TYPE 0x00000007 +#define GPIO_PIN27_INT_TYPE_M ((GPIO_PIN27_INT_TYPE_V)<<(GPIO_PIN27_INT_TYPE_S)) +#define GPIO_PIN27_INT_TYPE_V 0x7 +#define GPIO_PIN27_INT_TYPE_S 7 +/* GPIO_PIN27_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN27_PAD_DRIVER (BIT(2)) +#define GPIO_PIN27_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN27_PAD_DRIVER_V 0x1 +#define GPIO_PIN27_PAD_DRIVER_S 2 + +#define GPIO_PIN28_REG (DR_REG_GPIO_BASE + 0x00f8) +/* GPIO_PIN28_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN28_INT_ENA 0x0000001F +#define GPIO_PIN28_INT_ENA_M ((GPIO_PIN28_INT_ENA_V)<<(GPIO_PIN28_INT_ENA_S)) +#define GPIO_PIN28_INT_ENA_V 0x1F +#define GPIO_PIN28_INT_ENA_S 13 +/* GPIO_PIN28_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN28_CONFIG 0x00000003 +#define GPIO_PIN28_CONFIG_M ((GPIO_PIN28_CONFIG_V)<<(GPIO_PIN28_CONFIG_S)) +#define GPIO_PIN28_CONFIG_V 0x3 +#define GPIO_PIN28_CONFIG_S 11 +/* GPIO_PIN28_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN28_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN28_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN28_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN28_WAKEUP_ENABLE_S 10 +/* GPIO_PIN28_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN28_INT_TYPE 0x00000007 +#define GPIO_PIN28_INT_TYPE_M ((GPIO_PIN28_INT_TYPE_V)<<(GPIO_PIN28_INT_TYPE_S)) +#define GPIO_PIN28_INT_TYPE_V 0x7 +#define GPIO_PIN28_INT_TYPE_S 7 +/* GPIO_PIN28_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN28_PAD_DRIVER (BIT(2)) +#define GPIO_PIN28_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN28_PAD_DRIVER_V 0x1 +#define GPIO_PIN28_PAD_DRIVER_S 2 + +#define GPIO_PIN29_REG (DR_REG_GPIO_BASE + 0x00fc) +/* GPIO_PIN29_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN29_INT_ENA 0x0000001F +#define GPIO_PIN29_INT_ENA_M ((GPIO_PIN29_INT_ENA_V)<<(GPIO_PIN29_INT_ENA_S)) +#define GPIO_PIN29_INT_ENA_V 0x1F +#define GPIO_PIN29_INT_ENA_S 13 +/* GPIO_PIN29_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN29_CONFIG 0x00000003 +#define GPIO_PIN29_CONFIG_M ((GPIO_PIN29_CONFIG_V)<<(GPIO_PIN29_CONFIG_S)) +#define GPIO_PIN29_CONFIG_V 0x3 +#define GPIO_PIN29_CONFIG_S 11 +/* GPIO_PIN29_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN29_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN29_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN29_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN29_WAKEUP_ENABLE_S 10 +/* GPIO_PIN29_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN29_INT_TYPE 0x00000007 +#define GPIO_PIN29_INT_TYPE_M ((GPIO_PIN29_INT_TYPE_V)<<(GPIO_PIN29_INT_TYPE_S)) +#define GPIO_PIN29_INT_TYPE_V 0x7 +#define GPIO_PIN29_INT_TYPE_S 7 +/* GPIO_PIN29_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN29_PAD_DRIVER (BIT(2)) +#define GPIO_PIN29_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN29_PAD_DRIVER_V 0x1 +#define GPIO_PIN29_PAD_DRIVER_S 2 + +#define GPIO_PIN30_REG (DR_REG_GPIO_BASE + 0x0100) +/* GPIO_PIN30_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN30_INT_ENA 0x0000001F +#define GPIO_PIN30_INT_ENA_M ((GPIO_PIN30_INT_ENA_V)<<(GPIO_PIN30_INT_ENA_S)) +#define GPIO_PIN30_INT_ENA_V 0x1F +#define GPIO_PIN30_INT_ENA_S 13 +/* GPIO_PIN30_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN30_CONFIG 0x00000003 +#define GPIO_PIN30_CONFIG_M ((GPIO_PIN30_CONFIG_V)<<(GPIO_PIN30_CONFIG_S)) +#define GPIO_PIN30_CONFIG_V 0x3 +#define GPIO_PIN30_CONFIG_S 11 +/* GPIO_PIN30_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN30_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN30_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN30_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN30_WAKEUP_ENABLE_S 10 +/* GPIO_PIN30_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN30_INT_TYPE 0x00000007 +#define GPIO_PIN30_INT_TYPE_M ((GPIO_PIN30_INT_TYPE_V)<<(GPIO_PIN30_INT_TYPE_S)) +#define GPIO_PIN30_INT_TYPE_V 0x7 +#define GPIO_PIN30_INT_TYPE_S 7 +/* GPIO_PIN30_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN30_PAD_DRIVER (BIT(2)) +#define GPIO_PIN30_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN30_PAD_DRIVER_V 0x1 +#define GPIO_PIN30_PAD_DRIVER_S 2 + +#define GPIO_PIN31_REG (DR_REG_GPIO_BASE + 0x0104) +/* GPIO_PIN31_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN31_INT_ENA 0x0000001F +#define GPIO_PIN31_INT_ENA_M ((GPIO_PIN31_INT_ENA_V)<<(GPIO_PIN31_INT_ENA_S)) +#define GPIO_PIN31_INT_ENA_V 0x1F +#define GPIO_PIN31_INT_ENA_S 13 +/* GPIO_PIN31_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN31_CONFIG 0x00000003 +#define GPIO_PIN31_CONFIG_M ((GPIO_PIN31_CONFIG_V)<<(GPIO_PIN31_CONFIG_S)) +#define GPIO_PIN31_CONFIG_V 0x3 +#define GPIO_PIN31_CONFIG_S 11 +/* GPIO_PIN31_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN31_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN31_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN31_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN31_WAKEUP_ENABLE_S 10 +/* GPIO_PIN31_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN31_INT_TYPE 0x00000007 +#define GPIO_PIN31_INT_TYPE_M ((GPIO_PIN31_INT_TYPE_V)<<(GPIO_PIN31_INT_TYPE_S)) +#define GPIO_PIN31_INT_TYPE_V 0x7 +#define GPIO_PIN31_INT_TYPE_S 7 +/* GPIO_PIN31_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN31_PAD_DRIVER (BIT(2)) +#define GPIO_PIN31_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN31_PAD_DRIVER_V 0x1 +#define GPIO_PIN31_PAD_DRIVER_S 2 + +#define GPIO_PIN32_REG (DR_REG_GPIO_BASE + 0x0108) +/* GPIO_PIN32_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN32_INT_ENA 0x0000001F +#define GPIO_PIN32_INT_ENA_M ((GPIO_PIN32_INT_ENA_V)<<(GPIO_PIN32_INT_ENA_S)) +#define GPIO_PIN32_INT_ENA_V 0x1F +#define GPIO_PIN32_INT_ENA_S 13 +/* GPIO_PIN32_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN32_CONFIG 0x00000003 +#define GPIO_PIN32_CONFIG_M ((GPIO_PIN32_CONFIG_V)<<(GPIO_PIN32_CONFIG_S)) +#define GPIO_PIN32_CONFIG_V 0x3 +#define GPIO_PIN32_CONFIG_S 11 +/* GPIO_PIN32_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN32_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN32_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN32_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN32_WAKEUP_ENABLE_S 10 +/* GPIO_PIN32_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN32_INT_TYPE 0x00000007 +#define GPIO_PIN32_INT_TYPE_M ((GPIO_PIN32_INT_TYPE_V)<<(GPIO_PIN32_INT_TYPE_S)) +#define GPIO_PIN32_INT_TYPE_V 0x7 +#define GPIO_PIN32_INT_TYPE_S 7 +/* GPIO_PIN32_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN32_PAD_DRIVER (BIT(2)) +#define GPIO_PIN32_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN32_PAD_DRIVER_V 0x1 +#define GPIO_PIN32_PAD_DRIVER_S 2 + +#define GPIO_PIN33_REG (DR_REG_GPIO_BASE + 0x010c) +/* GPIO_PIN33_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN33_INT_ENA 0x0000001F +#define GPIO_PIN33_INT_ENA_M ((GPIO_PIN33_INT_ENA_V)<<(GPIO_PIN33_INT_ENA_S)) +#define GPIO_PIN33_INT_ENA_V 0x1F +#define GPIO_PIN33_INT_ENA_S 13 +/* GPIO_PIN33_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN33_CONFIG 0x00000003 +#define GPIO_PIN33_CONFIG_M ((GPIO_PIN33_CONFIG_V)<<(GPIO_PIN33_CONFIG_S)) +#define GPIO_PIN33_CONFIG_V 0x3 +#define GPIO_PIN33_CONFIG_S 11 +/* GPIO_PIN33_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN33_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN33_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN33_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN33_WAKEUP_ENABLE_S 10 +/* GPIO_PIN33_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN33_INT_TYPE 0x00000007 +#define GPIO_PIN33_INT_TYPE_M ((GPIO_PIN33_INT_TYPE_V)<<(GPIO_PIN33_INT_TYPE_S)) +#define GPIO_PIN33_INT_TYPE_V 0x7 +#define GPIO_PIN33_INT_TYPE_S 7 +/* GPIO_PIN33_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN33_PAD_DRIVER (BIT(2)) +#define GPIO_PIN33_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN33_PAD_DRIVER_V 0x1 +#define GPIO_PIN33_PAD_DRIVER_S 2 + +#define GPIO_PIN34_REG (DR_REG_GPIO_BASE + 0x0110) +/* GPIO_PIN34_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN34_INT_ENA 0x0000001F +#define GPIO_PIN34_INT_ENA_M ((GPIO_PIN34_INT_ENA_V)<<(GPIO_PIN34_INT_ENA_S)) +#define GPIO_PIN34_INT_ENA_V 0x1F +#define GPIO_PIN34_INT_ENA_S 13 +/* GPIO_PIN34_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN34_CONFIG 0x00000003 +#define GPIO_PIN34_CONFIG_M ((GPIO_PIN34_CONFIG_V)<<(GPIO_PIN34_CONFIG_S)) +#define GPIO_PIN34_CONFIG_V 0x3 +#define GPIO_PIN34_CONFIG_S 11 +/* GPIO_PIN34_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN34_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN34_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN34_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN34_WAKEUP_ENABLE_S 10 +/* GPIO_PIN34_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN34_INT_TYPE 0x00000007 +#define GPIO_PIN34_INT_TYPE_M ((GPIO_PIN34_INT_TYPE_V)<<(GPIO_PIN34_INT_TYPE_S)) +#define GPIO_PIN34_INT_TYPE_V 0x7 +#define GPIO_PIN34_INT_TYPE_S 7 +/* GPIO_PIN34_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN34_PAD_DRIVER (BIT(2)) +#define GPIO_PIN34_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN34_PAD_DRIVER_V 0x1 +#define GPIO_PIN34_PAD_DRIVER_S 2 + +#define GPIO_PIN35_REG (DR_REG_GPIO_BASE + 0x0114) +/* GPIO_PIN35_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN35_INT_ENA 0x0000001F +#define GPIO_PIN35_INT_ENA_M ((GPIO_PIN35_INT_ENA_V)<<(GPIO_PIN35_INT_ENA_S)) +#define GPIO_PIN35_INT_ENA_V 0x1F +#define GPIO_PIN35_INT_ENA_S 13 +/* GPIO_PIN35_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN35_CONFIG 0x00000003 +#define GPIO_PIN35_CONFIG_M ((GPIO_PIN35_CONFIG_V)<<(GPIO_PIN35_CONFIG_S)) +#define GPIO_PIN35_CONFIG_V 0x3 +#define GPIO_PIN35_CONFIG_S 11 +/* GPIO_PIN35_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN35_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN35_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN35_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN35_WAKEUP_ENABLE_S 10 +/* GPIO_PIN35_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN35_INT_TYPE 0x00000007 +#define GPIO_PIN35_INT_TYPE_M ((GPIO_PIN35_INT_TYPE_V)<<(GPIO_PIN35_INT_TYPE_S)) +#define GPIO_PIN35_INT_TYPE_V 0x7 +#define GPIO_PIN35_INT_TYPE_S 7 +/* GPIO_PIN35_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN35_PAD_DRIVER (BIT(2)) +#define GPIO_PIN35_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN35_PAD_DRIVER_V 0x1 +#define GPIO_PIN35_PAD_DRIVER_S 2 + +#define GPIO_PIN36_REG (DR_REG_GPIO_BASE + 0x0118) +/* GPIO_PIN36_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN36_INT_ENA 0x0000001F +#define GPIO_PIN36_INT_ENA_M ((GPIO_PIN36_INT_ENA_V)<<(GPIO_PIN36_INT_ENA_S)) +#define GPIO_PIN36_INT_ENA_V 0x1F +#define GPIO_PIN36_INT_ENA_S 13 +/* GPIO_PIN36_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN36_CONFIG 0x00000003 +#define GPIO_PIN36_CONFIG_M ((GPIO_PIN36_CONFIG_V)<<(GPIO_PIN36_CONFIG_S)) +#define GPIO_PIN36_CONFIG_V 0x3 +#define GPIO_PIN36_CONFIG_S 11 +/* GPIO_PIN36_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN36_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN36_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN36_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN36_WAKEUP_ENABLE_S 10 +/* GPIO_PIN36_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN36_INT_TYPE 0x00000007 +#define GPIO_PIN36_INT_TYPE_M ((GPIO_PIN36_INT_TYPE_V)<<(GPIO_PIN36_INT_TYPE_S)) +#define GPIO_PIN36_INT_TYPE_V 0x7 +#define GPIO_PIN36_INT_TYPE_S 7 +/* GPIO_PIN36_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN36_PAD_DRIVER (BIT(2)) +#define GPIO_PIN36_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN36_PAD_DRIVER_V 0x1 +#define GPIO_PIN36_PAD_DRIVER_S 2 + +#define GPIO_PIN37_REG (DR_REG_GPIO_BASE + 0x011c) +/* GPIO_PIN37_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN37_INT_ENA 0x0000001F +#define GPIO_PIN37_INT_ENA_M ((GPIO_PIN37_INT_ENA_V)<<(GPIO_PIN37_INT_ENA_S)) +#define GPIO_PIN37_INT_ENA_V 0x1F +#define GPIO_PIN37_INT_ENA_S 13 +/* GPIO_PIN37_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN37_CONFIG 0x00000003 +#define GPIO_PIN37_CONFIG_M ((GPIO_PIN37_CONFIG_V)<<(GPIO_PIN37_CONFIG_S)) +#define GPIO_PIN37_CONFIG_V 0x3 +#define GPIO_PIN37_CONFIG_S 11 +/* GPIO_PIN37_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN37_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN37_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN37_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN37_WAKEUP_ENABLE_S 10 +/* GPIO_PIN37_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN37_INT_TYPE 0x00000007 +#define GPIO_PIN37_INT_TYPE_M ((GPIO_PIN37_INT_TYPE_V)<<(GPIO_PIN37_INT_TYPE_S)) +#define GPIO_PIN37_INT_TYPE_V 0x7 +#define GPIO_PIN37_INT_TYPE_S 7 +/* GPIO_PIN37_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN37_PAD_DRIVER (BIT(2)) +#define GPIO_PIN37_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN37_PAD_DRIVER_V 0x1 +#define GPIO_PIN37_PAD_DRIVER_S 2 + +#define GPIO_PIN38_REG (DR_REG_GPIO_BASE + 0x0120) +/* GPIO_PIN38_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN38_INT_ENA 0x0000001F +#define GPIO_PIN38_INT_ENA_M ((GPIO_PIN38_INT_ENA_V)<<(GPIO_PIN38_INT_ENA_S)) +#define GPIO_PIN38_INT_ENA_V 0x1F +#define GPIO_PIN38_INT_ENA_S 13 +/* GPIO_PIN38_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN38_CONFIG 0x00000003 +#define GPIO_PIN38_CONFIG_M ((GPIO_PIN38_CONFIG_V)<<(GPIO_PIN38_CONFIG_S)) +#define GPIO_PIN38_CONFIG_V 0x3 +#define GPIO_PIN38_CONFIG_S 11 +/* GPIO_PIN38_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN38_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN38_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN38_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN38_WAKEUP_ENABLE_S 10 +/* GPIO_PIN38_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN38_INT_TYPE 0x00000007 +#define GPIO_PIN38_INT_TYPE_M ((GPIO_PIN38_INT_TYPE_V)<<(GPIO_PIN38_INT_TYPE_S)) +#define GPIO_PIN38_INT_TYPE_V 0x7 +#define GPIO_PIN38_INT_TYPE_S 7 +/* GPIO_PIN38_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN38_PAD_DRIVER (BIT(2)) +#define GPIO_PIN38_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN38_PAD_DRIVER_V 0x1 +#define GPIO_PIN38_PAD_DRIVER_S 2 + +#define GPIO_PIN39_REG (DR_REG_GPIO_BASE + 0x0124) +/* GPIO_PIN39_INT_ENA : R/W ;bitpos:[17:13] ;default: x ; */ +/*description: bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt + enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ +#define GPIO_PIN39_INT_ENA 0x0000001F +#define GPIO_PIN39_INT_ENA_M ((GPIO_PIN39_INT_ENA_V)<<(GPIO_PIN39_INT_ENA_S)) +#define GPIO_PIN39_INT_ENA_V 0x1F +#define GPIO_PIN39_INT_ENA_S 13 +/* GPIO_PIN39_CONFIG : R/W ;bitpos:[12:11] ;default: x ; */ +/*description: NA*/ +#define GPIO_PIN39_CONFIG 0x00000003 +#define GPIO_PIN39_CONFIG_M ((GPIO_PIN39_CONFIG_V)<<(GPIO_PIN39_CONFIG_S)) +#define GPIO_PIN39_CONFIG_V 0x3 +#define GPIO_PIN39_CONFIG_S 11 +/* GPIO_PIN39_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: x ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define GPIO_PIN39_WAKEUP_ENABLE (BIT(10)) +#define GPIO_PIN39_WAKEUP_ENABLE_M (BIT(10)) +#define GPIO_PIN39_WAKEUP_ENABLE_V 0x1 +#define GPIO_PIN39_WAKEUP_ENABLE_S 10 +/* GPIO_PIN39_INT_TYPE : R/W ;bitpos:[9:7] ;default: x ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define GPIO_PIN39_INT_TYPE 0x00000007 +#define GPIO_PIN39_INT_TYPE_M ((GPIO_PIN39_INT_TYPE_V)<<(GPIO_PIN39_INT_TYPE_S)) +#define GPIO_PIN39_INT_TYPE_V 0x7 +#define GPIO_PIN39_INT_TYPE_S 7 +/* GPIO_PIN39_PAD_DRIVER : R/W ;bitpos:[2] ;default: x ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define GPIO_PIN39_PAD_DRIVER (BIT(2)) +#define GPIO_PIN39_PAD_DRIVER_M (BIT(2)) +#define GPIO_PIN39_PAD_DRIVER_V 0x1 +#define GPIO_PIN39_PAD_DRIVER_S 2 + +#define GPIO_cali_conf_REG (DR_REG_GPIO_BASE + 0x0128) +/* GPIO_CALI_START : R/W ;bitpos:[31] ;default: x ; */ +/*description: */ +#define GPIO_CALI_START (BIT(31)) +#define GPIO_CALI_START_M (BIT(31)) +#define GPIO_CALI_START_V 0x1 +#define GPIO_CALI_START_S 31 +/* GPIO_CALI_RTC_MAX : R/W ;bitpos:[9:0] ;default: x ; */ +/*description: */ +#define GPIO_CALI_RTC_MAX 0x000003FF +#define GPIO_CALI_RTC_MAX_M ((GPIO_CALI_RTC_MAX_V)<<(GPIO_CALI_RTC_MAX_S)) +#define GPIO_CALI_RTC_MAX_V 0x3FF +#define GPIO_CALI_RTC_MAX_S 0 + +#define GPIO_cali_data_REG (DR_REG_GPIO_BASE + 0x012c) +/* GPIO_CALI_RDY_SYNC2 : RO ;bitpos:[31] ;default: ; */ +/*description: */ +#define GPIO_CALI_RDY_SYNC2 (BIT(31)) +#define GPIO_CALI_RDY_SYNC2_M (BIT(31)) +#define GPIO_CALI_RDY_SYNC2_V 0x1 +#define GPIO_CALI_RDY_SYNC2_S 31 +/* GPIO_CALI_RDY_REAL : RO ;bitpos:[30] ;default: ; */ +/*description: */ +#define GPIO_CALI_RDY_REAL (BIT(30)) +#define GPIO_CALI_RDY_REAL_M (BIT(30)) +#define GPIO_CALI_RDY_REAL_V 0x1 +#define GPIO_CALI_RDY_REAL_S 30 +/* GPIO_CALI_VALUE_SYNC2 : RO ;bitpos:[19:0] ;default: ; */ +/*description: */ +#define GPIO_CALI_VALUE_SYNC2 0x000FFFFF +#define GPIO_CALI_VALUE_SYNC2_M ((GPIO_CALI_VALUE_SYNC2_V)<<(GPIO_CALI_VALUE_SYNC2_S)) +#define GPIO_CALI_VALUE_SYNC2_V 0xFFFFF +#define GPIO_CALI_VALUE_SYNC2_S 0 + +#define GPIO_FUNC0_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0130) +/* GPIO_SIG0_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG0_IN_SEL (BIT(7)) +#define GPIO_SIG0_IN_SEL_M (BIT(7)) +#define GPIO_SIG0_IN_SEL_V 0x1 +#define GPIO_SIG0_IN_SEL_S 7 +/* GPIO_FUNC0_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC0_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC0_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC0_IN_INV_SEL_V 0x1 +#define GPIO_FUNC0_IN_INV_SEL_S 6 +/* GPIO_FUNC0_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC0_IN_SEL 0x0000003F +#define GPIO_FUNC0_IN_SEL_M ((GPIO_FUNC0_IN_SEL_V)<<(GPIO_FUNC0_IN_SEL_S)) +#define GPIO_FUNC0_IN_SEL_V 0x3F +#define GPIO_FUNC0_IN_SEL_S 0 + +#define GPIO_FUNC1_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0134) +/* GPIO_SIG1_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG1_IN_SEL (BIT(7)) +#define GPIO_SIG1_IN_SEL_M (BIT(7)) +#define GPIO_SIG1_IN_SEL_V 0x1 +#define GPIO_SIG1_IN_SEL_S 7 +/* GPIO_FUNC1_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC1_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC1_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC1_IN_INV_SEL_V 0x1 +#define GPIO_FUNC1_IN_INV_SEL_S 6 +/* GPIO_FUNC1_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC1_IN_SEL 0x0000003F +#define GPIO_FUNC1_IN_SEL_M ((GPIO_FUNC1_IN_SEL_V)<<(GPIO_FUNC1_IN_SEL_S)) +#define GPIO_FUNC1_IN_SEL_V 0x3F +#define GPIO_FUNC1_IN_SEL_S 0 + +#define GPIO_FUNC2_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0138) +/* GPIO_SIG2_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG2_IN_SEL (BIT(7)) +#define GPIO_SIG2_IN_SEL_M (BIT(7)) +#define GPIO_SIG2_IN_SEL_V 0x1 +#define GPIO_SIG2_IN_SEL_S 7 +/* GPIO_FUNC2_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC2_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC2_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC2_IN_INV_SEL_V 0x1 +#define GPIO_FUNC2_IN_INV_SEL_S 6 +/* GPIO_FUNC2_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC2_IN_SEL 0x0000003F +#define GPIO_FUNC2_IN_SEL_M ((GPIO_FUNC2_IN_SEL_V)<<(GPIO_FUNC2_IN_SEL_S)) +#define GPIO_FUNC2_IN_SEL_V 0x3F +#define GPIO_FUNC2_IN_SEL_S 0 + +#define GPIO_FUNC3_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x013c) +/* GPIO_SIG3_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG3_IN_SEL (BIT(7)) +#define GPIO_SIG3_IN_SEL_M (BIT(7)) +#define GPIO_SIG3_IN_SEL_V 0x1 +#define GPIO_SIG3_IN_SEL_S 7 +/* GPIO_FUNC3_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC3_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC3_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC3_IN_INV_SEL_V 0x1 +#define GPIO_FUNC3_IN_INV_SEL_S 6 +/* GPIO_FUNC3_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC3_IN_SEL 0x0000003F +#define GPIO_FUNC3_IN_SEL_M ((GPIO_FUNC3_IN_SEL_V)<<(GPIO_FUNC3_IN_SEL_S)) +#define GPIO_FUNC3_IN_SEL_V 0x3F +#define GPIO_FUNC3_IN_SEL_S 0 + +#define GPIO_FUNC4_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0140) +/* GPIO_SIG4_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG4_IN_SEL (BIT(7)) +#define GPIO_SIG4_IN_SEL_M (BIT(7)) +#define GPIO_SIG4_IN_SEL_V 0x1 +#define GPIO_SIG4_IN_SEL_S 7 +/* GPIO_FUNC4_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC4_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC4_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC4_IN_INV_SEL_V 0x1 +#define GPIO_FUNC4_IN_INV_SEL_S 6 +/* GPIO_FUNC4_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC4_IN_SEL 0x0000003F +#define GPIO_FUNC4_IN_SEL_M ((GPIO_FUNC4_IN_SEL_V)<<(GPIO_FUNC4_IN_SEL_S)) +#define GPIO_FUNC4_IN_SEL_V 0x3F +#define GPIO_FUNC4_IN_SEL_S 0 + +#define GPIO_FUNC5_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0144) +/* GPIO_SIG5_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG5_IN_SEL (BIT(7)) +#define GPIO_SIG5_IN_SEL_M (BIT(7)) +#define GPIO_SIG5_IN_SEL_V 0x1 +#define GPIO_SIG5_IN_SEL_S 7 +/* GPIO_FUNC5_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC5_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC5_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC5_IN_INV_SEL_V 0x1 +#define GPIO_FUNC5_IN_INV_SEL_S 6 +/* GPIO_FUNC5_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC5_IN_SEL 0x0000003F +#define GPIO_FUNC5_IN_SEL_M ((GPIO_FUNC5_IN_SEL_V)<<(GPIO_FUNC5_IN_SEL_S)) +#define GPIO_FUNC5_IN_SEL_V 0x3F +#define GPIO_FUNC5_IN_SEL_S 0 + +#define GPIO_FUNC6_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0148) +/* GPIO_SIG6_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG6_IN_SEL (BIT(7)) +#define GPIO_SIG6_IN_SEL_M (BIT(7)) +#define GPIO_SIG6_IN_SEL_V 0x1 +#define GPIO_SIG6_IN_SEL_S 7 +/* GPIO_FUNC6_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC6_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC6_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC6_IN_INV_SEL_V 0x1 +#define GPIO_FUNC6_IN_INV_SEL_S 6 +/* GPIO_FUNC6_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC6_IN_SEL 0x0000003F +#define GPIO_FUNC6_IN_SEL_M ((GPIO_FUNC6_IN_SEL_V)<<(GPIO_FUNC6_IN_SEL_S)) +#define GPIO_FUNC6_IN_SEL_V 0x3F +#define GPIO_FUNC6_IN_SEL_S 0 + +#define GPIO_FUNC7_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x014c) +/* GPIO_SIG7_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG7_IN_SEL (BIT(7)) +#define GPIO_SIG7_IN_SEL_M (BIT(7)) +#define GPIO_SIG7_IN_SEL_V 0x1 +#define GPIO_SIG7_IN_SEL_S 7 +/* GPIO_FUNC7_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC7_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC7_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC7_IN_INV_SEL_V 0x1 +#define GPIO_FUNC7_IN_INV_SEL_S 6 +/* GPIO_FUNC7_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC7_IN_SEL 0x0000003F +#define GPIO_FUNC7_IN_SEL_M ((GPIO_FUNC7_IN_SEL_V)<<(GPIO_FUNC7_IN_SEL_S)) +#define GPIO_FUNC7_IN_SEL_V 0x3F +#define GPIO_FUNC7_IN_SEL_S 0 + +#define GPIO_FUNC8_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0150) +/* GPIO_SIG8_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG8_IN_SEL (BIT(7)) +#define GPIO_SIG8_IN_SEL_M (BIT(7)) +#define GPIO_SIG8_IN_SEL_V 0x1 +#define GPIO_SIG8_IN_SEL_S 7 +/* GPIO_FUNC8_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC8_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC8_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC8_IN_INV_SEL_V 0x1 +#define GPIO_FUNC8_IN_INV_SEL_S 6 +/* GPIO_FUNC8_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC8_IN_SEL 0x0000003F +#define GPIO_FUNC8_IN_SEL_M ((GPIO_FUNC8_IN_SEL_V)<<(GPIO_FUNC8_IN_SEL_S)) +#define GPIO_FUNC8_IN_SEL_V 0x3F +#define GPIO_FUNC8_IN_SEL_S 0 + +#define GPIO_FUNC9_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0154) +/* GPIO_SIG9_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG9_IN_SEL (BIT(7)) +#define GPIO_SIG9_IN_SEL_M (BIT(7)) +#define GPIO_SIG9_IN_SEL_V 0x1 +#define GPIO_SIG9_IN_SEL_S 7 +/* GPIO_FUNC9_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC9_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC9_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC9_IN_INV_SEL_V 0x1 +#define GPIO_FUNC9_IN_INV_SEL_S 6 +/* GPIO_FUNC9_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC9_IN_SEL 0x0000003F +#define GPIO_FUNC9_IN_SEL_M ((GPIO_FUNC9_IN_SEL_V)<<(GPIO_FUNC9_IN_SEL_S)) +#define GPIO_FUNC9_IN_SEL_V 0x3F +#define GPIO_FUNC9_IN_SEL_S 0 + +#define GPIO_FUNC10_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0158) +/* GPIO_SIG10_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG10_IN_SEL (BIT(7)) +#define GPIO_SIG10_IN_SEL_M (BIT(7)) +#define GPIO_SIG10_IN_SEL_V 0x1 +#define GPIO_SIG10_IN_SEL_S 7 +/* GPIO_FUNC10_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC10_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC10_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC10_IN_INV_SEL_V 0x1 +#define GPIO_FUNC10_IN_INV_SEL_S 6 +/* GPIO_FUNC10_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC10_IN_SEL 0x0000003F +#define GPIO_FUNC10_IN_SEL_M ((GPIO_FUNC10_IN_SEL_V)<<(GPIO_FUNC10_IN_SEL_S)) +#define GPIO_FUNC10_IN_SEL_V 0x3F +#define GPIO_FUNC10_IN_SEL_S 0 + +#define GPIO_FUNC11_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x015c) +/* GPIO_SIG11_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG11_IN_SEL (BIT(7)) +#define GPIO_SIG11_IN_SEL_M (BIT(7)) +#define GPIO_SIG11_IN_SEL_V 0x1 +#define GPIO_SIG11_IN_SEL_S 7 +/* GPIO_FUNC11_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC11_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC11_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC11_IN_INV_SEL_V 0x1 +#define GPIO_FUNC11_IN_INV_SEL_S 6 +/* GPIO_FUNC11_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC11_IN_SEL 0x0000003F +#define GPIO_FUNC11_IN_SEL_M ((GPIO_FUNC11_IN_SEL_V)<<(GPIO_FUNC11_IN_SEL_S)) +#define GPIO_FUNC11_IN_SEL_V 0x3F +#define GPIO_FUNC11_IN_SEL_S 0 + +#define GPIO_FUNC12_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0160) +/* GPIO_SIG12_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG12_IN_SEL (BIT(7)) +#define GPIO_SIG12_IN_SEL_M (BIT(7)) +#define GPIO_SIG12_IN_SEL_V 0x1 +#define GPIO_SIG12_IN_SEL_S 7 +/* GPIO_FUNC12_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC12_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC12_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC12_IN_INV_SEL_V 0x1 +#define GPIO_FUNC12_IN_INV_SEL_S 6 +/* GPIO_FUNC12_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC12_IN_SEL 0x0000003F +#define GPIO_FUNC12_IN_SEL_M ((GPIO_FUNC12_IN_SEL_V)<<(GPIO_FUNC12_IN_SEL_S)) +#define GPIO_FUNC12_IN_SEL_V 0x3F +#define GPIO_FUNC12_IN_SEL_S 0 + +#define GPIO_FUNC13_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0164) +/* GPIO_SIG13_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG13_IN_SEL (BIT(7)) +#define GPIO_SIG13_IN_SEL_M (BIT(7)) +#define GPIO_SIG13_IN_SEL_V 0x1 +#define GPIO_SIG13_IN_SEL_S 7 +/* GPIO_FUNC13_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC13_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC13_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC13_IN_INV_SEL_V 0x1 +#define GPIO_FUNC13_IN_INV_SEL_S 6 +/* GPIO_FUNC13_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC13_IN_SEL 0x0000003F +#define GPIO_FUNC13_IN_SEL_M ((GPIO_FUNC13_IN_SEL_V)<<(GPIO_FUNC13_IN_SEL_S)) +#define GPIO_FUNC13_IN_SEL_V 0x3F +#define GPIO_FUNC13_IN_SEL_S 0 + +#define GPIO_FUNC14_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0168) +/* GPIO_SIG14_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG14_IN_SEL (BIT(7)) +#define GPIO_SIG14_IN_SEL_M (BIT(7)) +#define GPIO_SIG14_IN_SEL_V 0x1 +#define GPIO_SIG14_IN_SEL_S 7 +/* GPIO_FUNC14_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC14_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC14_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC14_IN_INV_SEL_V 0x1 +#define GPIO_FUNC14_IN_INV_SEL_S 6 +/* GPIO_FUNC14_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC14_IN_SEL 0x0000003F +#define GPIO_FUNC14_IN_SEL_M ((GPIO_FUNC14_IN_SEL_V)<<(GPIO_FUNC14_IN_SEL_S)) +#define GPIO_FUNC14_IN_SEL_V 0x3F +#define GPIO_FUNC14_IN_SEL_S 0 + +#define GPIO_FUNC15_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x016c) +/* GPIO_SIG15_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG15_IN_SEL (BIT(7)) +#define GPIO_SIG15_IN_SEL_M (BIT(7)) +#define GPIO_SIG15_IN_SEL_V 0x1 +#define GPIO_SIG15_IN_SEL_S 7 +/* GPIO_FUNC15_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC15_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC15_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC15_IN_INV_SEL_V 0x1 +#define GPIO_FUNC15_IN_INV_SEL_S 6 +/* GPIO_FUNC15_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC15_IN_SEL 0x0000003F +#define GPIO_FUNC15_IN_SEL_M ((GPIO_FUNC15_IN_SEL_V)<<(GPIO_FUNC15_IN_SEL_S)) +#define GPIO_FUNC15_IN_SEL_V 0x3F +#define GPIO_FUNC15_IN_SEL_S 0 + +#define GPIO_FUNC16_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0170) +/* GPIO_SIG16_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG16_IN_SEL (BIT(7)) +#define GPIO_SIG16_IN_SEL_M (BIT(7)) +#define GPIO_SIG16_IN_SEL_V 0x1 +#define GPIO_SIG16_IN_SEL_S 7 +/* GPIO_FUNC16_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC16_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC16_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC16_IN_INV_SEL_V 0x1 +#define GPIO_FUNC16_IN_INV_SEL_S 6 +/* GPIO_FUNC16_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC16_IN_SEL 0x0000003F +#define GPIO_FUNC16_IN_SEL_M ((GPIO_FUNC16_IN_SEL_V)<<(GPIO_FUNC16_IN_SEL_S)) +#define GPIO_FUNC16_IN_SEL_V 0x3F +#define GPIO_FUNC16_IN_SEL_S 0 + +#define GPIO_FUNC17_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0174) +/* GPIO_SIG17_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG17_IN_SEL (BIT(7)) +#define GPIO_SIG17_IN_SEL_M (BIT(7)) +#define GPIO_SIG17_IN_SEL_V 0x1 +#define GPIO_SIG17_IN_SEL_S 7 +/* GPIO_FUNC17_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC17_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC17_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC17_IN_INV_SEL_V 0x1 +#define GPIO_FUNC17_IN_INV_SEL_S 6 +/* GPIO_FUNC17_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC17_IN_SEL 0x0000003F +#define GPIO_FUNC17_IN_SEL_M ((GPIO_FUNC17_IN_SEL_V)<<(GPIO_FUNC17_IN_SEL_S)) +#define GPIO_FUNC17_IN_SEL_V 0x3F +#define GPIO_FUNC17_IN_SEL_S 0 + +#define GPIO_FUNC18_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0178) +/* GPIO_SIG18_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG18_IN_SEL (BIT(7)) +#define GPIO_SIG18_IN_SEL_M (BIT(7)) +#define GPIO_SIG18_IN_SEL_V 0x1 +#define GPIO_SIG18_IN_SEL_S 7 +/* GPIO_FUNC18_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC18_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC18_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC18_IN_INV_SEL_V 0x1 +#define GPIO_FUNC18_IN_INV_SEL_S 6 +/* GPIO_FUNC18_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC18_IN_SEL 0x0000003F +#define GPIO_FUNC18_IN_SEL_M ((GPIO_FUNC18_IN_SEL_V)<<(GPIO_FUNC18_IN_SEL_S)) +#define GPIO_FUNC18_IN_SEL_V 0x3F +#define GPIO_FUNC18_IN_SEL_S 0 + +#define GPIO_FUNC19_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x017c) +/* GPIO_SIG19_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG19_IN_SEL (BIT(7)) +#define GPIO_SIG19_IN_SEL_M (BIT(7)) +#define GPIO_SIG19_IN_SEL_V 0x1 +#define GPIO_SIG19_IN_SEL_S 7 +/* GPIO_FUNC19_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC19_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC19_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC19_IN_INV_SEL_V 0x1 +#define GPIO_FUNC19_IN_INV_SEL_S 6 +/* GPIO_FUNC19_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC19_IN_SEL 0x0000003F +#define GPIO_FUNC19_IN_SEL_M ((GPIO_FUNC19_IN_SEL_V)<<(GPIO_FUNC19_IN_SEL_S)) +#define GPIO_FUNC19_IN_SEL_V 0x3F +#define GPIO_FUNC19_IN_SEL_S 0 + +#define GPIO_FUNC20_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0180) +/* GPIO_SIG20_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG20_IN_SEL (BIT(7)) +#define GPIO_SIG20_IN_SEL_M (BIT(7)) +#define GPIO_SIG20_IN_SEL_V 0x1 +#define GPIO_SIG20_IN_SEL_S 7 +/* GPIO_FUNC20_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC20_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC20_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC20_IN_INV_SEL_V 0x1 +#define GPIO_FUNC20_IN_INV_SEL_S 6 +/* GPIO_FUNC20_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC20_IN_SEL 0x0000003F +#define GPIO_FUNC20_IN_SEL_M ((GPIO_FUNC20_IN_SEL_V)<<(GPIO_FUNC20_IN_SEL_S)) +#define GPIO_FUNC20_IN_SEL_V 0x3F +#define GPIO_FUNC20_IN_SEL_S 0 + +#define GPIO_FUNC21_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0184) +/* GPIO_SIG21_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG21_IN_SEL (BIT(7)) +#define GPIO_SIG21_IN_SEL_M (BIT(7)) +#define GPIO_SIG21_IN_SEL_V 0x1 +#define GPIO_SIG21_IN_SEL_S 7 +/* GPIO_FUNC21_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC21_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC21_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC21_IN_INV_SEL_V 0x1 +#define GPIO_FUNC21_IN_INV_SEL_S 6 +/* GPIO_FUNC21_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC21_IN_SEL 0x0000003F +#define GPIO_FUNC21_IN_SEL_M ((GPIO_FUNC21_IN_SEL_V)<<(GPIO_FUNC21_IN_SEL_S)) +#define GPIO_FUNC21_IN_SEL_V 0x3F +#define GPIO_FUNC21_IN_SEL_S 0 + +#define GPIO_FUNC22_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0188) +/* GPIO_SIG22_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG22_IN_SEL (BIT(7)) +#define GPIO_SIG22_IN_SEL_M (BIT(7)) +#define GPIO_SIG22_IN_SEL_V 0x1 +#define GPIO_SIG22_IN_SEL_S 7 +/* GPIO_FUNC22_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC22_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC22_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC22_IN_INV_SEL_V 0x1 +#define GPIO_FUNC22_IN_INV_SEL_S 6 +/* GPIO_FUNC22_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC22_IN_SEL 0x0000003F +#define GPIO_FUNC22_IN_SEL_M ((GPIO_FUNC22_IN_SEL_V)<<(GPIO_FUNC22_IN_SEL_S)) +#define GPIO_FUNC22_IN_SEL_V 0x3F +#define GPIO_FUNC22_IN_SEL_S 0 + +#define GPIO_FUNC23_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x018c) +/* GPIO_SIG23_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG23_IN_SEL (BIT(7)) +#define GPIO_SIG23_IN_SEL_M (BIT(7)) +#define GPIO_SIG23_IN_SEL_V 0x1 +#define GPIO_SIG23_IN_SEL_S 7 +/* GPIO_FUNC23_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC23_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC23_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC23_IN_INV_SEL_V 0x1 +#define GPIO_FUNC23_IN_INV_SEL_S 6 +/* GPIO_FUNC23_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC23_IN_SEL 0x0000003F +#define GPIO_FUNC23_IN_SEL_M ((GPIO_FUNC23_IN_SEL_V)<<(GPIO_FUNC23_IN_SEL_S)) +#define GPIO_FUNC23_IN_SEL_V 0x3F +#define GPIO_FUNC23_IN_SEL_S 0 + +#define GPIO_FUNC24_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0190) +/* GPIO_SIG24_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG24_IN_SEL (BIT(7)) +#define GPIO_SIG24_IN_SEL_M (BIT(7)) +#define GPIO_SIG24_IN_SEL_V 0x1 +#define GPIO_SIG24_IN_SEL_S 7 +/* GPIO_FUNC24_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC24_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC24_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC24_IN_INV_SEL_V 0x1 +#define GPIO_FUNC24_IN_INV_SEL_S 6 +/* GPIO_FUNC24_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC24_IN_SEL 0x0000003F +#define GPIO_FUNC24_IN_SEL_M ((GPIO_FUNC24_IN_SEL_V)<<(GPIO_FUNC24_IN_SEL_S)) +#define GPIO_FUNC24_IN_SEL_V 0x3F +#define GPIO_FUNC24_IN_SEL_S 0 + +#define GPIO_FUNC25_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0194) +/* GPIO_SIG25_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG25_IN_SEL (BIT(7)) +#define GPIO_SIG25_IN_SEL_M (BIT(7)) +#define GPIO_SIG25_IN_SEL_V 0x1 +#define GPIO_SIG25_IN_SEL_S 7 +/* GPIO_FUNC25_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC25_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC25_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC25_IN_INV_SEL_V 0x1 +#define GPIO_FUNC25_IN_INV_SEL_S 6 +/* GPIO_FUNC25_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC25_IN_SEL 0x0000003F +#define GPIO_FUNC25_IN_SEL_M ((GPIO_FUNC25_IN_SEL_V)<<(GPIO_FUNC25_IN_SEL_S)) +#define GPIO_FUNC25_IN_SEL_V 0x3F +#define GPIO_FUNC25_IN_SEL_S 0 + +#define GPIO_FUNC26_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0198) +/* GPIO_SIG26_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG26_IN_SEL (BIT(7)) +#define GPIO_SIG26_IN_SEL_M (BIT(7)) +#define GPIO_SIG26_IN_SEL_V 0x1 +#define GPIO_SIG26_IN_SEL_S 7 +/* GPIO_FUNC26_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC26_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC26_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC26_IN_INV_SEL_V 0x1 +#define GPIO_FUNC26_IN_INV_SEL_S 6 +/* GPIO_FUNC26_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC26_IN_SEL 0x0000003F +#define GPIO_FUNC26_IN_SEL_M ((GPIO_FUNC26_IN_SEL_V)<<(GPIO_FUNC26_IN_SEL_S)) +#define GPIO_FUNC26_IN_SEL_V 0x3F +#define GPIO_FUNC26_IN_SEL_S 0 + +#define GPIO_FUNC27_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x019c) +/* GPIO_SIG27_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG27_IN_SEL (BIT(7)) +#define GPIO_SIG27_IN_SEL_M (BIT(7)) +#define GPIO_SIG27_IN_SEL_V 0x1 +#define GPIO_SIG27_IN_SEL_S 7 +/* GPIO_FUNC27_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC27_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC27_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC27_IN_INV_SEL_V 0x1 +#define GPIO_FUNC27_IN_INV_SEL_S 6 +/* GPIO_FUNC27_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC27_IN_SEL 0x0000003F +#define GPIO_FUNC27_IN_SEL_M ((GPIO_FUNC27_IN_SEL_V)<<(GPIO_FUNC27_IN_SEL_S)) +#define GPIO_FUNC27_IN_SEL_V 0x3F +#define GPIO_FUNC27_IN_SEL_S 0 + +#define GPIO_FUNC28_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x01a0) +/* GPIO_SIG28_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG28_IN_SEL (BIT(7)) +#define GPIO_SIG28_IN_SEL_M (BIT(7)) +#define GPIO_SIG28_IN_SEL_V 0x1 +#define GPIO_SIG28_IN_SEL_S 7 +/* GPIO_FUNC28_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC28_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC28_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC28_IN_INV_SEL_V 0x1 +#define GPIO_FUNC28_IN_INV_SEL_S 6 +/* GPIO_FUNC28_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC28_IN_SEL 0x0000003F +#define GPIO_FUNC28_IN_SEL_M ((GPIO_FUNC28_IN_SEL_V)<<(GPIO_FUNC28_IN_SEL_S)) +#define GPIO_FUNC28_IN_SEL_V 0x3F +#define GPIO_FUNC28_IN_SEL_S 0 + +#define GPIO_FUNC29_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x01a4) +/* GPIO_SIG29_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG29_IN_SEL (BIT(7)) +#define GPIO_SIG29_IN_SEL_M (BIT(7)) +#define GPIO_SIG29_IN_SEL_V 0x1 +#define GPIO_SIG29_IN_SEL_S 7 +/* GPIO_FUNC29_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC29_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC29_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC29_IN_INV_SEL_V 0x1 +#define GPIO_FUNC29_IN_INV_SEL_S 6 +/* GPIO_FUNC29_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC29_IN_SEL 0x0000003F +#define GPIO_FUNC29_IN_SEL_M ((GPIO_FUNC29_IN_SEL_V)<<(GPIO_FUNC29_IN_SEL_S)) +#define GPIO_FUNC29_IN_SEL_V 0x3F +#define GPIO_FUNC29_IN_SEL_S 0 + +#define GPIO_FUNC30_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x01a8) +/* GPIO_SIG30_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG30_IN_SEL (BIT(7)) +#define GPIO_SIG30_IN_SEL_M (BIT(7)) +#define GPIO_SIG30_IN_SEL_V 0x1 +#define GPIO_SIG30_IN_SEL_S 7 +/* GPIO_FUNC30_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC30_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC30_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC30_IN_INV_SEL_V 0x1 +#define GPIO_FUNC30_IN_INV_SEL_S 6 +/* GPIO_FUNC30_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC30_IN_SEL 0x0000003F +#define GPIO_FUNC30_IN_SEL_M ((GPIO_FUNC30_IN_SEL_V)<<(GPIO_FUNC30_IN_SEL_S)) +#define GPIO_FUNC30_IN_SEL_V 0x3F +#define GPIO_FUNC30_IN_SEL_S 0 + +#define GPIO_FUNC31_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x01ac) +/* GPIO_SIG31_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG31_IN_SEL (BIT(7)) +#define GPIO_SIG31_IN_SEL_M (BIT(7)) +#define GPIO_SIG31_IN_SEL_V 0x1 +#define GPIO_SIG31_IN_SEL_S 7 +/* GPIO_FUNC31_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC31_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC31_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC31_IN_INV_SEL_V 0x1 +#define GPIO_FUNC31_IN_INV_SEL_S 6 +/* GPIO_FUNC31_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC31_IN_SEL 0x0000003F +#define GPIO_FUNC31_IN_SEL_M ((GPIO_FUNC31_IN_SEL_V)<<(GPIO_FUNC31_IN_SEL_S)) +#define GPIO_FUNC31_IN_SEL_V 0x3F +#define GPIO_FUNC31_IN_SEL_S 0 + +#define GPIO_FUNC32_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x01b0) +/* GPIO_SIG32_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG32_IN_SEL (BIT(7)) +#define GPIO_SIG32_IN_SEL_M (BIT(7)) +#define GPIO_SIG32_IN_SEL_V 0x1 +#define GPIO_SIG32_IN_SEL_S 7 +/* GPIO_FUNC32_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC32_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC32_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC32_IN_INV_SEL_V 0x1 +#define GPIO_FUNC32_IN_INV_SEL_S 6 +/* GPIO_FUNC32_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC32_IN_SEL 0x0000003F +#define GPIO_FUNC32_IN_SEL_M ((GPIO_FUNC32_IN_SEL_V)<<(GPIO_FUNC32_IN_SEL_S)) +#define GPIO_FUNC32_IN_SEL_V 0x3F +#define GPIO_FUNC32_IN_SEL_S 0 + +#define GPIO_FUNC33_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x01b4) +/* GPIO_SIG33_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG33_IN_SEL (BIT(7)) +#define GPIO_SIG33_IN_SEL_M (BIT(7)) +#define GPIO_SIG33_IN_SEL_V 0x1 +#define GPIO_SIG33_IN_SEL_S 7 +/* GPIO_FUNC33_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC33_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC33_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC33_IN_INV_SEL_V 0x1 +#define GPIO_FUNC33_IN_INV_SEL_S 6 +/* GPIO_FUNC33_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC33_IN_SEL 0x0000003F +#define GPIO_FUNC33_IN_SEL_M ((GPIO_FUNC33_IN_SEL_V)<<(GPIO_FUNC33_IN_SEL_S)) +#define GPIO_FUNC33_IN_SEL_V 0x3F +#define GPIO_FUNC33_IN_SEL_S 0 + +#define GPIO_FUNC34_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x01b8) +/* GPIO_SIG34_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG34_IN_SEL (BIT(7)) +#define GPIO_SIG34_IN_SEL_M (BIT(7)) +#define GPIO_SIG34_IN_SEL_V 0x1 +#define GPIO_SIG34_IN_SEL_S 7 +/* GPIO_FUNC34_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC34_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC34_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC34_IN_INV_SEL_V 0x1 +#define GPIO_FUNC34_IN_INV_SEL_S 6 +/* GPIO_FUNC34_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC34_IN_SEL 0x0000003F +#define GPIO_FUNC34_IN_SEL_M ((GPIO_FUNC34_IN_SEL_V)<<(GPIO_FUNC34_IN_SEL_S)) +#define GPIO_FUNC34_IN_SEL_V 0x3F +#define GPIO_FUNC34_IN_SEL_S 0 + +#define GPIO_FUNC35_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x01bc) +/* GPIO_SIG35_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG35_IN_SEL (BIT(7)) +#define GPIO_SIG35_IN_SEL_M (BIT(7)) +#define GPIO_SIG35_IN_SEL_V 0x1 +#define GPIO_SIG35_IN_SEL_S 7 +/* GPIO_FUNC35_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC35_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC35_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC35_IN_INV_SEL_V 0x1 +#define GPIO_FUNC35_IN_INV_SEL_S 6 +/* GPIO_FUNC35_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC35_IN_SEL 0x0000003F +#define GPIO_FUNC35_IN_SEL_M ((GPIO_FUNC35_IN_SEL_V)<<(GPIO_FUNC35_IN_SEL_S)) +#define GPIO_FUNC35_IN_SEL_V 0x3F +#define GPIO_FUNC35_IN_SEL_S 0 + +#define GPIO_FUNC36_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x01c0) +/* GPIO_SIG36_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG36_IN_SEL (BIT(7)) +#define GPIO_SIG36_IN_SEL_M (BIT(7)) +#define GPIO_SIG36_IN_SEL_V 0x1 +#define GPIO_SIG36_IN_SEL_S 7 +/* GPIO_FUNC36_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC36_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC36_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC36_IN_INV_SEL_V 0x1 +#define GPIO_FUNC36_IN_INV_SEL_S 6 +/* GPIO_FUNC36_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC36_IN_SEL 0x0000003F +#define GPIO_FUNC36_IN_SEL_M ((GPIO_FUNC36_IN_SEL_V)<<(GPIO_FUNC36_IN_SEL_S)) +#define GPIO_FUNC36_IN_SEL_V 0x3F +#define GPIO_FUNC36_IN_SEL_S 0 + +#define GPIO_FUNC37_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x01c4) +/* GPIO_SIG37_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG37_IN_SEL (BIT(7)) +#define GPIO_SIG37_IN_SEL_M (BIT(7)) +#define GPIO_SIG37_IN_SEL_V 0x1 +#define GPIO_SIG37_IN_SEL_S 7 +/* GPIO_FUNC37_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC37_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC37_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC37_IN_INV_SEL_V 0x1 +#define GPIO_FUNC37_IN_INV_SEL_S 6 +/* GPIO_FUNC37_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC37_IN_SEL 0x0000003F +#define GPIO_FUNC37_IN_SEL_M ((GPIO_FUNC37_IN_SEL_V)<<(GPIO_FUNC37_IN_SEL_S)) +#define GPIO_FUNC37_IN_SEL_V 0x3F +#define GPIO_FUNC37_IN_SEL_S 0 + +#define GPIO_FUNC38_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x01c8) +/* GPIO_SIG38_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG38_IN_SEL (BIT(7)) +#define GPIO_SIG38_IN_SEL_M (BIT(7)) +#define GPIO_SIG38_IN_SEL_V 0x1 +#define GPIO_SIG38_IN_SEL_S 7 +/* GPIO_FUNC38_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC38_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC38_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC38_IN_INV_SEL_V 0x1 +#define GPIO_FUNC38_IN_INV_SEL_S 6 +/* GPIO_FUNC38_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC38_IN_SEL 0x0000003F +#define GPIO_FUNC38_IN_SEL_M ((GPIO_FUNC38_IN_SEL_V)<<(GPIO_FUNC38_IN_SEL_S)) +#define GPIO_FUNC38_IN_SEL_V 0x3F +#define GPIO_FUNC38_IN_SEL_S 0 + +#define GPIO_FUNC39_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x01cc) +/* GPIO_SIG39_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG39_IN_SEL (BIT(7)) +#define GPIO_SIG39_IN_SEL_M (BIT(7)) +#define GPIO_SIG39_IN_SEL_V 0x1 +#define GPIO_SIG39_IN_SEL_S 7 +/* GPIO_FUNC39_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC39_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC39_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC39_IN_INV_SEL_V 0x1 +#define GPIO_FUNC39_IN_INV_SEL_S 6 +/* GPIO_FUNC39_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC39_IN_SEL 0x0000003F +#define GPIO_FUNC39_IN_SEL_M ((GPIO_FUNC39_IN_SEL_V)<<(GPIO_FUNC39_IN_SEL_S)) +#define GPIO_FUNC39_IN_SEL_V 0x3F +#define GPIO_FUNC39_IN_SEL_S 0 + +#define GPIO_FUNC40_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x01d0) +/* GPIO_SIG40_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG40_IN_SEL (BIT(7)) +#define GPIO_SIG40_IN_SEL_M (BIT(7)) +#define GPIO_SIG40_IN_SEL_V 0x1 +#define GPIO_SIG40_IN_SEL_S 7 +/* GPIO_FUNC40_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC40_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC40_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC40_IN_INV_SEL_V 0x1 +#define GPIO_FUNC40_IN_INV_SEL_S 6 +/* GPIO_FUNC40_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC40_IN_SEL 0x0000003F +#define GPIO_FUNC40_IN_SEL_M ((GPIO_FUNC40_IN_SEL_V)<<(GPIO_FUNC40_IN_SEL_S)) +#define GPIO_FUNC40_IN_SEL_V 0x3F +#define GPIO_FUNC40_IN_SEL_S 0 + +#define GPIO_FUNC41_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x01d4) +/* GPIO_SIG41_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG41_IN_SEL (BIT(7)) +#define GPIO_SIG41_IN_SEL_M (BIT(7)) +#define GPIO_SIG41_IN_SEL_V 0x1 +#define GPIO_SIG41_IN_SEL_S 7 +/* GPIO_FUNC41_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC41_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC41_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC41_IN_INV_SEL_V 0x1 +#define GPIO_FUNC41_IN_INV_SEL_S 6 +/* GPIO_FUNC41_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC41_IN_SEL 0x0000003F +#define GPIO_FUNC41_IN_SEL_M ((GPIO_FUNC41_IN_SEL_V)<<(GPIO_FUNC41_IN_SEL_S)) +#define GPIO_FUNC41_IN_SEL_V 0x3F +#define GPIO_FUNC41_IN_SEL_S 0 + +#define GPIO_FUNC42_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x01d8) +/* GPIO_SIG42_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG42_IN_SEL (BIT(7)) +#define GPIO_SIG42_IN_SEL_M (BIT(7)) +#define GPIO_SIG42_IN_SEL_V 0x1 +#define GPIO_SIG42_IN_SEL_S 7 +/* GPIO_FUNC42_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC42_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC42_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC42_IN_INV_SEL_V 0x1 +#define GPIO_FUNC42_IN_INV_SEL_S 6 +/* GPIO_FUNC42_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC42_IN_SEL 0x0000003F +#define GPIO_FUNC42_IN_SEL_M ((GPIO_FUNC42_IN_SEL_V)<<(GPIO_FUNC42_IN_SEL_S)) +#define GPIO_FUNC42_IN_SEL_V 0x3F +#define GPIO_FUNC42_IN_SEL_S 0 + +#define GPIO_FUNC43_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x01dc) +/* GPIO_SIG43_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG43_IN_SEL (BIT(7)) +#define GPIO_SIG43_IN_SEL_M (BIT(7)) +#define GPIO_SIG43_IN_SEL_V 0x1 +#define GPIO_SIG43_IN_SEL_S 7 +/* GPIO_FUNC43_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC43_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC43_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC43_IN_INV_SEL_V 0x1 +#define GPIO_FUNC43_IN_INV_SEL_S 6 +/* GPIO_FUNC43_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC43_IN_SEL 0x0000003F +#define GPIO_FUNC43_IN_SEL_M ((GPIO_FUNC43_IN_SEL_V)<<(GPIO_FUNC43_IN_SEL_S)) +#define GPIO_FUNC43_IN_SEL_V 0x3F +#define GPIO_FUNC43_IN_SEL_S 0 + +#define GPIO_FUNC44_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x01e0) +/* GPIO_SIG44_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG44_IN_SEL (BIT(7)) +#define GPIO_SIG44_IN_SEL_M (BIT(7)) +#define GPIO_SIG44_IN_SEL_V 0x1 +#define GPIO_SIG44_IN_SEL_S 7 +/* GPIO_FUNC44_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC44_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC44_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC44_IN_INV_SEL_V 0x1 +#define GPIO_FUNC44_IN_INV_SEL_S 6 +/* GPIO_FUNC44_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC44_IN_SEL 0x0000003F +#define GPIO_FUNC44_IN_SEL_M ((GPIO_FUNC44_IN_SEL_V)<<(GPIO_FUNC44_IN_SEL_S)) +#define GPIO_FUNC44_IN_SEL_V 0x3F +#define GPIO_FUNC44_IN_SEL_S 0 + +#define GPIO_FUNC45_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x01e4) +/* GPIO_SIG45_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG45_IN_SEL (BIT(7)) +#define GPIO_SIG45_IN_SEL_M (BIT(7)) +#define GPIO_SIG45_IN_SEL_V 0x1 +#define GPIO_SIG45_IN_SEL_S 7 +/* GPIO_FUNC45_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC45_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC45_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC45_IN_INV_SEL_V 0x1 +#define GPIO_FUNC45_IN_INV_SEL_S 6 +/* GPIO_FUNC45_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC45_IN_SEL 0x0000003F +#define GPIO_FUNC45_IN_SEL_M ((GPIO_FUNC45_IN_SEL_V)<<(GPIO_FUNC45_IN_SEL_S)) +#define GPIO_FUNC45_IN_SEL_V 0x3F +#define GPIO_FUNC45_IN_SEL_S 0 + +#define GPIO_FUNC46_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x01e8) +/* GPIO_SIG46_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG46_IN_SEL (BIT(7)) +#define GPIO_SIG46_IN_SEL_M (BIT(7)) +#define GPIO_SIG46_IN_SEL_V 0x1 +#define GPIO_SIG46_IN_SEL_S 7 +/* GPIO_FUNC46_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC46_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC46_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC46_IN_INV_SEL_V 0x1 +#define GPIO_FUNC46_IN_INV_SEL_S 6 +/* GPIO_FUNC46_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC46_IN_SEL 0x0000003F +#define GPIO_FUNC46_IN_SEL_M ((GPIO_FUNC46_IN_SEL_V)<<(GPIO_FUNC46_IN_SEL_S)) +#define GPIO_FUNC46_IN_SEL_V 0x3F +#define GPIO_FUNC46_IN_SEL_S 0 + +#define GPIO_FUNC47_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x01ec) +/* GPIO_SIG47_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG47_IN_SEL (BIT(7)) +#define GPIO_SIG47_IN_SEL_M (BIT(7)) +#define GPIO_SIG47_IN_SEL_V 0x1 +#define GPIO_SIG47_IN_SEL_S 7 +/* GPIO_FUNC47_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC47_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC47_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC47_IN_INV_SEL_V 0x1 +#define GPIO_FUNC47_IN_INV_SEL_S 6 +/* GPIO_FUNC47_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC47_IN_SEL 0x0000003F +#define GPIO_FUNC47_IN_SEL_M ((GPIO_FUNC47_IN_SEL_V)<<(GPIO_FUNC47_IN_SEL_S)) +#define GPIO_FUNC47_IN_SEL_V 0x3F +#define GPIO_FUNC47_IN_SEL_S 0 + +#define GPIO_FUNC48_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x01f0) +/* GPIO_SIG48_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG48_IN_SEL (BIT(7)) +#define GPIO_SIG48_IN_SEL_M (BIT(7)) +#define GPIO_SIG48_IN_SEL_V 0x1 +#define GPIO_SIG48_IN_SEL_S 7 +/* GPIO_FUNC48_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC48_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC48_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC48_IN_INV_SEL_V 0x1 +#define GPIO_FUNC48_IN_INV_SEL_S 6 +/* GPIO_FUNC48_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC48_IN_SEL 0x0000003F +#define GPIO_FUNC48_IN_SEL_M ((GPIO_FUNC48_IN_SEL_V)<<(GPIO_FUNC48_IN_SEL_S)) +#define GPIO_FUNC48_IN_SEL_V 0x3F +#define GPIO_FUNC48_IN_SEL_S 0 + +#define GPIO_FUNC49_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x01f4) +/* GPIO_SIG49_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG49_IN_SEL (BIT(7)) +#define GPIO_SIG49_IN_SEL_M (BIT(7)) +#define GPIO_SIG49_IN_SEL_V 0x1 +#define GPIO_SIG49_IN_SEL_S 7 +/* GPIO_FUNC49_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC49_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC49_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC49_IN_INV_SEL_V 0x1 +#define GPIO_FUNC49_IN_INV_SEL_S 6 +/* GPIO_FUNC49_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC49_IN_SEL 0x0000003F +#define GPIO_FUNC49_IN_SEL_M ((GPIO_FUNC49_IN_SEL_V)<<(GPIO_FUNC49_IN_SEL_S)) +#define GPIO_FUNC49_IN_SEL_V 0x3F +#define GPIO_FUNC49_IN_SEL_S 0 + +#define GPIO_FUNC50_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x01f8) +/* GPIO_SIG50_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG50_IN_SEL (BIT(7)) +#define GPIO_SIG50_IN_SEL_M (BIT(7)) +#define GPIO_SIG50_IN_SEL_V 0x1 +#define GPIO_SIG50_IN_SEL_S 7 +/* GPIO_FUNC50_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC50_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC50_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC50_IN_INV_SEL_V 0x1 +#define GPIO_FUNC50_IN_INV_SEL_S 6 +/* GPIO_FUNC50_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC50_IN_SEL 0x0000003F +#define GPIO_FUNC50_IN_SEL_M ((GPIO_FUNC50_IN_SEL_V)<<(GPIO_FUNC50_IN_SEL_S)) +#define GPIO_FUNC50_IN_SEL_V 0x3F +#define GPIO_FUNC50_IN_SEL_S 0 + +#define GPIO_FUNC51_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x01fc) +/* GPIO_SIG51_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG51_IN_SEL (BIT(7)) +#define GPIO_SIG51_IN_SEL_M (BIT(7)) +#define GPIO_SIG51_IN_SEL_V 0x1 +#define GPIO_SIG51_IN_SEL_S 7 +/* GPIO_FUNC51_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC51_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC51_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC51_IN_INV_SEL_V 0x1 +#define GPIO_FUNC51_IN_INV_SEL_S 6 +/* GPIO_FUNC51_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC51_IN_SEL 0x0000003F +#define GPIO_FUNC51_IN_SEL_M ((GPIO_FUNC51_IN_SEL_V)<<(GPIO_FUNC51_IN_SEL_S)) +#define GPIO_FUNC51_IN_SEL_V 0x3F +#define GPIO_FUNC51_IN_SEL_S 0 + +#define GPIO_FUNC52_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0200) +/* GPIO_SIG52_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG52_IN_SEL (BIT(7)) +#define GPIO_SIG52_IN_SEL_M (BIT(7)) +#define GPIO_SIG52_IN_SEL_V 0x1 +#define GPIO_SIG52_IN_SEL_S 7 +/* GPIO_FUNC52_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC52_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC52_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC52_IN_INV_SEL_V 0x1 +#define GPIO_FUNC52_IN_INV_SEL_S 6 +/* GPIO_FUNC52_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC52_IN_SEL 0x0000003F +#define GPIO_FUNC52_IN_SEL_M ((GPIO_FUNC52_IN_SEL_V)<<(GPIO_FUNC52_IN_SEL_S)) +#define GPIO_FUNC52_IN_SEL_V 0x3F +#define GPIO_FUNC52_IN_SEL_S 0 + +#define GPIO_FUNC53_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0204) +/* GPIO_SIG53_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG53_IN_SEL (BIT(7)) +#define GPIO_SIG53_IN_SEL_M (BIT(7)) +#define GPIO_SIG53_IN_SEL_V 0x1 +#define GPIO_SIG53_IN_SEL_S 7 +/* GPIO_FUNC53_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC53_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC53_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC53_IN_INV_SEL_V 0x1 +#define GPIO_FUNC53_IN_INV_SEL_S 6 +/* GPIO_FUNC53_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC53_IN_SEL 0x0000003F +#define GPIO_FUNC53_IN_SEL_M ((GPIO_FUNC53_IN_SEL_V)<<(GPIO_FUNC53_IN_SEL_S)) +#define GPIO_FUNC53_IN_SEL_V 0x3F +#define GPIO_FUNC53_IN_SEL_S 0 + +#define GPIO_FUNC54_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0208) +/* GPIO_SIG54_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG54_IN_SEL (BIT(7)) +#define GPIO_SIG54_IN_SEL_M (BIT(7)) +#define GPIO_SIG54_IN_SEL_V 0x1 +#define GPIO_SIG54_IN_SEL_S 7 +/* GPIO_FUNC54_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC54_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC54_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC54_IN_INV_SEL_V 0x1 +#define GPIO_FUNC54_IN_INV_SEL_S 6 +/* GPIO_FUNC54_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC54_IN_SEL 0x0000003F +#define GPIO_FUNC54_IN_SEL_M ((GPIO_FUNC54_IN_SEL_V)<<(GPIO_FUNC54_IN_SEL_S)) +#define GPIO_FUNC54_IN_SEL_V 0x3F +#define GPIO_FUNC54_IN_SEL_S 0 + +#define GPIO_FUNC55_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x020c) +/* GPIO_SIG55_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG55_IN_SEL (BIT(7)) +#define GPIO_SIG55_IN_SEL_M (BIT(7)) +#define GPIO_SIG55_IN_SEL_V 0x1 +#define GPIO_SIG55_IN_SEL_S 7 +/* GPIO_FUNC55_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC55_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC55_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC55_IN_INV_SEL_V 0x1 +#define GPIO_FUNC55_IN_INV_SEL_S 6 +/* GPIO_FUNC55_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC55_IN_SEL 0x0000003F +#define GPIO_FUNC55_IN_SEL_M ((GPIO_FUNC55_IN_SEL_V)<<(GPIO_FUNC55_IN_SEL_S)) +#define GPIO_FUNC55_IN_SEL_V 0x3F +#define GPIO_FUNC55_IN_SEL_S 0 + +#define GPIO_FUNC56_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0210) +/* GPIO_SIG56_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG56_IN_SEL (BIT(7)) +#define GPIO_SIG56_IN_SEL_M (BIT(7)) +#define GPIO_SIG56_IN_SEL_V 0x1 +#define GPIO_SIG56_IN_SEL_S 7 +/* GPIO_FUNC56_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC56_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC56_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC56_IN_INV_SEL_V 0x1 +#define GPIO_FUNC56_IN_INV_SEL_S 6 +/* GPIO_FUNC56_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC56_IN_SEL 0x0000003F +#define GPIO_FUNC56_IN_SEL_M ((GPIO_FUNC56_IN_SEL_V)<<(GPIO_FUNC56_IN_SEL_S)) +#define GPIO_FUNC56_IN_SEL_V 0x3F +#define GPIO_FUNC56_IN_SEL_S 0 + +#define GPIO_FUNC57_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0214) +/* GPIO_SIG57_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG57_IN_SEL (BIT(7)) +#define GPIO_SIG57_IN_SEL_M (BIT(7)) +#define GPIO_SIG57_IN_SEL_V 0x1 +#define GPIO_SIG57_IN_SEL_S 7 +/* GPIO_FUNC57_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC57_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC57_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC57_IN_INV_SEL_V 0x1 +#define GPIO_FUNC57_IN_INV_SEL_S 6 +/* GPIO_FUNC57_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC57_IN_SEL 0x0000003F +#define GPIO_FUNC57_IN_SEL_M ((GPIO_FUNC57_IN_SEL_V)<<(GPIO_FUNC57_IN_SEL_S)) +#define GPIO_FUNC57_IN_SEL_V 0x3F +#define GPIO_FUNC57_IN_SEL_S 0 + +#define GPIO_FUNC58_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0218) +/* GPIO_SIG58_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG58_IN_SEL (BIT(7)) +#define GPIO_SIG58_IN_SEL_M (BIT(7)) +#define GPIO_SIG58_IN_SEL_V 0x1 +#define GPIO_SIG58_IN_SEL_S 7 +/* GPIO_FUNC58_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC58_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC58_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC58_IN_INV_SEL_V 0x1 +#define GPIO_FUNC58_IN_INV_SEL_S 6 +/* GPIO_FUNC58_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC58_IN_SEL 0x0000003F +#define GPIO_FUNC58_IN_SEL_M ((GPIO_FUNC58_IN_SEL_V)<<(GPIO_FUNC58_IN_SEL_S)) +#define GPIO_FUNC58_IN_SEL_V 0x3F +#define GPIO_FUNC58_IN_SEL_S 0 + +#define GPIO_FUNC59_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x021c) +/* GPIO_SIG59_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG59_IN_SEL (BIT(7)) +#define GPIO_SIG59_IN_SEL_M (BIT(7)) +#define GPIO_SIG59_IN_SEL_V 0x1 +#define GPIO_SIG59_IN_SEL_S 7 +/* GPIO_FUNC59_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC59_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC59_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC59_IN_INV_SEL_V 0x1 +#define GPIO_FUNC59_IN_INV_SEL_S 6 +/* GPIO_FUNC59_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC59_IN_SEL 0x0000003F +#define GPIO_FUNC59_IN_SEL_M ((GPIO_FUNC59_IN_SEL_V)<<(GPIO_FUNC59_IN_SEL_S)) +#define GPIO_FUNC59_IN_SEL_V 0x3F +#define GPIO_FUNC59_IN_SEL_S 0 + +#define GPIO_FUNC60_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0220) +/* GPIO_SIG60_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG60_IN_SEL (BIT(7)) +#define GPIO_SIG60_IN_SEL_M (BIT(7)) +#define GPIO_SIG60_IN_SEL_V 0x1 +#define GPIO_SIG60_IN_SEL_S 7 +/* GPIO_FUNC60_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC60_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC60_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC60_IN_INV_SEL_V 0x1 +#define GPIO_FUNC60_IN_INV_SEL_S 6 +/* GPIO_FUNC60_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC60_IN_SEL 0x0000003F +#define GPIO_FUNC60_IN_SEL_M ((GPIO_FUNC60_IN_SEL_V)<<(GPIO_FUNC60_IN_SEL_S)) +#define GPIO_FUNC60_IN_SEL_V 0x3F +#define GPIO_FUNC60_IN_SEL_S 0 + +#define GPIO_FUNC61_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0224) +/* GPIO_SIG61_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG61_IN_SEL (BIT(7)) +#define GPIO_SIG61_IN_SEL_M (BIT(7)) +#define GPIO_SIG61_IN_SEL_V 0x1 +#define GPIO_SIG61_IN_SEL_S 7 +/* GPIO_FUNC61_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC61_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC61_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC61_IN_INV_SEL_V 0x1 +#define GPIO_FUNC61_IN_INV_SEL_S 6 +/* GPIO_FUNC61_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC61_IN_SEL 0x0000003F +#define GPIO_FUNC61_IN_SEL_M ((GPIO_FUNC61_IN_SEL_V)<<(GPIO_FUNC61_IN_SEL_S)) +#define GPIO_FUNC61_IN_SEL_V 0x3F +#define GPIO_FUNC61_IN_SEL_S 0 + +#define GPIO_FUNC62_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0228) +/* GPIO_SIG62_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG62_IN_SEL (BIT(7)) +#define GPIO_SIG62_IN_SEL_M (BIT(7)) +#define GPIO_SIG62_IN_SEL_V 0x1 +#define GPIO_SIG62_IN_SEL_S 7 +/* GPIO_FUNC62_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC62_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC62_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC62_IN_INV_SEL_V 0x1 +#define GPIO_FUNC62_IN_INV_SEL_S 6 +/* GPIO_FUNC62_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC62_IN_SEL 0x0000003F +#define GPIO_FUNC62_IN_SEL_M ((GPIO_FUNC62_IN_SEL_V)<<(GPIO_FUNC62_IN_SEL_S)) +#define GPIO_FUNC62_IN_SEL_V 0x3F +#define GPIO_FUNC62_IN_SEL_S 0 + +#define GPIO_FUNC63_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x022c) +/* GPIO_SIG63_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG63_IN_SEL (BIT(7)) +#define GPIO_SIG63_IN_SEL_M (BIT(7)) +#define GPIO_SIG63_IN_SEL_V 0x1 +#define GPIO_SIG63_IN_SEL_S 7 +/* GPIO_FUNC63_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC63_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC63_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC63_IN_INV_SEL_V 0x1 +#define GPIO_FUNC63_IN_INV_SEL_S 6 +/* GPIO_FUNC63_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC63_IN_SEL 0x0000003F +#define GPIO_FUNC63_IN_SEL_M ((GPIO_FUNC63_IN_SEL_V)<<(GPIO_FUNC63_IN_SEL_S)) +#define GPIO_FUNC63_IN_SEL_V 0x3F +#define GPIO_FUNC63_IN_SEL_S 0 + +#define GPIO_FUNC64_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0230) +/* GPIO_SIG64_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG64_IN_SEL (BIT(7)) +#define GPIO_SIG64_IN_SEL_M (BIT(7)) +#define GPIO_SIG64_IN_SEL_V 0x1 +#define GPIO_SIG64_IN_SEL_S 7 +/* GPIO_FUNC64_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC64_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC64_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC64_IN_INV_SEL_V 0x1 +#define GPIO_FUNC64_IN_INV_SEL_S 6 +/* GPIO_FUNC64_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC64_IN_SEL 0x0000003F +#define GPIO_FUNC64_IN_SEL_M ((GPIO_FUNC64_IN_SEL_V)<<(GPIO_FUNC64_IN_SEL_S)) +#define GPIO_FUNC64_IN_SEL_V 0x3F +#define GPIO_FUNC64_IN_SEL_S 0 + +#define GPIO_FUNC65_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0234) +/* GPIO_SIG65_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG65_IN_SEL (BIT(7)) +#define GPIO_SIG65_IN_SEL_M (BIT(7)) +#define GPIO_SIG65_IN_SEL_V 0x1 +#define GPIO_SIG65_IN_SEL_S 7 +/* GPIO_FUNC65_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC65_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC65_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC65_IN_INV_SEL_V 0x1 +#define GPIO_FUNC65_IN_INV_SEL_S 6 +/* GPIO_FUNC65_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC65_IN_SEL 0x0000003F +#define GPIO_FUNC65_IN_SEL_M ((GPIO_FUNC65_IN_SEL_V)<<(GPIO_FUNC65_IN_SEL_S)) +#define GPIO_FUNC65_IN_SEL_V 0x3F +#define GPIO_FUNC65_IN_SEL_S 0 + +#define GPIO_FUNC66_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0238) +/* GPIO_SIG66_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG66_IN_SEL (BIT(7)) +#define GPIO_SIG66_IN_SEL_M (BIT(7)) +#define GPIO_SIG66_IN_SEL_V 0x1 +#define GPIO_SIG66_IN_SEL_S 7 +/* GPIO_FUNC66_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC66_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC66_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC66_IN_INV_SEL_V 0x1 +#define GPIO_FUNC66_IN_INV_SEL_S 6 +/* GPIO_FUNC66_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC66_IN_SEL 0x0000003F +#define GPIO_FUNC66_IN_SEL_M ((GPIO_FUNC66_IN_SEL_V)<<(GPIO_FUNC66_IN_SEL_S)) +#define GPIO_FUNC66_IN_SEL_V 0x3F +#define GPIO_FUNC66_IN_SEL_S 0 + +#define GPIO_FUNC67_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x023c) +/* GPIO_SIG67_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG67_IN_SEL (BIT(7)) +#define GPIO_SIG67_IN_SEL_M (BIT(7)) +#define GPIO_SIG67_IN_SEL_V 0x1 +#define GPIO_SIG67_IN_SEL_S 7 +/* GPIO_FUNC67_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC67_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC67_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC67_IN_INV_SEL_V 0x1 +#define GPIO_FUNC67_IN_INV_SEL_S 6 +/* GPIO_FUNC67_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC67_IN_SEL 0x0000003F +#define GPIO_FUNC67_IN_SEL_M ((GPIO_FUNC67_IN_SEL_V)<<(GPIO_FUNC67_IN_SEL_S)) +#define GPIO_FUNC67_IN_SEL_V 0x3F +#define GPIO_FUNC67_IN_SEL_S 0 + +#define GPIO_FUNC68_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0240) +/* GPIO_SIG68_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG68_IN_SEL (BIT(7)) +#define GPIO_SIG68_IN_SEL_M (BIT(7)) +#define GPIO_SIG68_IN_SEL_V 0x1 +#define GPIO_SIG68_IN_SEL_S 7 +/* GPIO_FUNC68_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC68_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC68_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC68_IN_INV_SEL_V 0x1 +#define GPIO_FUNC68_IN_INV_SEL_S 6 +/* GPIO_FUNC68_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC68_IN_SEL 0x0000003F +#define GPIO_FUNC68_IN_SEL_M ((GPIO_FUNC68_IN_SEL_V)<<(GPIO_FUNC68_IN_SEL_S)) +#define GPIO_FUNC68_IN_SEL_V 0x3F +#define GPIO_FUNC68_IN_SEL_S 0 + +#define GPIO_FUNC69_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0244) +/* GPIO_SIG69_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG69_IN_SEL (BIT(7)) +#define GPIO_SIG69_IN_SEL_M (BIT(7)) +#define GPIO_SIG69_IN_SEL_V 0x1 +#define GPIO_SIG69_IN_SEL_S 7 +/* GPIO_FUNC69_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC69_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC69_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC69_IN_INV_SEL_V 0x1 +#define GPIO_FUNC69_IN_INV_SEL_S 6 +/* GPIO_FUNC69_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC69_IN_SEL 0x0000003F +#define GPIO_FUNC69_IN_SEL_M ((GPIO_FUNC69_IN_SEL_V)<<(GPIO_FUNC69_IN_SEL_S)) +#define GPIO_FUNC69_IN_SEL_V 0x3F +#define GPIO_FUNC69_IN_SEL_S 0 + +#define GPIO_FUNC70_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0248) +/* GPIO_SIG70_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG70_IN_SEL (BIT(7)) +#define GPIO_SIG70_IN_SEL_M (BIT(7)) +#define GPIO_SIG70_IN_SEL_V 0x1 +#define GPIO_SIG70_IN_SEL_S 7 +/* GPIO_FUNC70_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC70_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC70_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC70_IN_INV_SEL_V 0x1 +#define GPIO_FUNC70_IN_INV_SEL_S 6 +/* GPIO_FUNC70_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC70_IN_SEL 0x0000003F +#define GPIO_FUNC70_IN_SEL_M ((GPIO_FUNC70_IN_SEL_V)<<(GPIO_FUNC70_IN_SEL_S)) +#define GPIO_FUNC70_IN_SEL_V 0x3F +#define GPIO_FUNC70_IN_SEL_S 0 + +#define GPIO_FUNC71_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x024c) +/* GPIO_SIG71_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG71_IN_SEL (BIT(7)) +#define GPIO_SIG71_IN_SEL_M (BIT(7)) +#define GPIO_SIG71_IN_SEL_V 0x1 +#define GPIO_SIG71_IN_SEL_S 7 +/* GPIO_FUNC71_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC71_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC71_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC71_IN_INV_SEL_V 0x1 +#define GPIO_FUNC71_IN_INV_SEL_S 6 +/* GPIO_FUNC71_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC71_IN_SEL 0x0000003F +#define GPIO_FUNC71_IN_SEL_M ((GPIO_FUNC71_IN_SEL_V)<<(GPIO_FUNC71_IN_SEL_S)) +#define GPIO_FUNC71_IN_SEL_V 0x3F +#define GPIO_FUNC71_IN_SEL_S 0 + +#define GPIO_FUNC72_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0250) +/* GPIO_SIG72_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG72_IN_SEL (BIT(7)) +#define GPIO_SIG72_IN_SEL_M (BIT(7)) +#define GPIO_SIG72_IN_SEL_V 0x1 +#define GPIO_SIG72_IN_SEL_S 7 +/* GPIO_FUNC72_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC72_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC72_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC72_IN_INV_SEL_V 0x1 +#define GPIO_FUNC72_IN_INV_SEL_S 6 +/* GPIO_FUNC72_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC72_IN_SEL 0x0000003F +#define GPIO_FUNC72_IN_SEL_M ((GPIO_FUNC72_IN_SEL_V)<<(GPIO_FUNC72_IN_SEL_S)) +#define GPIO_FUNC72_IN_SEL_V 0x3F +#define GPIO_FUNC72_IN_SEL_S 0 + +#define GPIO_FUNC73_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0254) +/* GPIO_SIG73_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG73_IN_SEL (BIT(7)) +#define GPIO_SIG73_IN_SEL_M (BIT(7)) +#define GPIO_SIG73_IN_SEL_V 0x1 +#define GPIO_SIG73_IN_SEL_S 7 +/* GPIO_FUNC73_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC73_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC73_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC73_IN_INV_SEL_V 0x1 +#define GPIO_FUNC73_IN_INV_SEL_S 6 +/* GPIO_FUNC73_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC73_IN_SEL 0x0000003F +#define GPIO_FUNC73_IN_SEL_M ((GPIO_FUNC73_IN_SEL_V)<<(GPIO_FUNC73_IN_SEL_S)) +#define GPIO_FUNC73_IN_SEL_V 0x3F +#define GPIO_FUNC73_IN_SEL_S 0 + +#define GPIO_FUNC74_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0258) +/* GPIO_SIG74_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG74_IN_SEL (BIT(7)) +#define GPIO_SIG74_IN_SEL_M (BIT(7)) +#define GPIO_SIG74_IN_SEL_V 0x1 +#define GPIO_SIG74_IN_SEL_S 7 +/* GPIO_FUNC74_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC74_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC74_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC74_IN_INV_SEL_V 0x1 +#define GPIO_FUNC74_IN_INV_SEL_S 6 +/* GPIO_FUNC74_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC74_IN_SEL 0x0000003F +#define GPIO_FUNC74_IN_SEL_M ((GPIO_FUNC74_IN_SEL_V)<<(GPIO_FUNC74_IN_SEL_S)) +#define GPIO_FUNC74_IN_SEL_V 0x3F +#define GPIO_FUNC74_IN_SEL_S 0 + +#define GPIO_FUNC75_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x025c) +/* GPIO_SIG75_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG75_IN_SEL (BIT(7)) +#define GPIO_SIG75_IN_SEL_M (BIT(7)) +#define GPIO_SIG75_IN_SEL_V 0x1 +#define GPIO_SIG75_IN_SEL_S 7 +/* GPIO_FUNC75_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC75_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC75_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC75_IN_INV_SEL_V 0x1 +#define GPIO_FUNC75_IN_INV_SEL_S 6 +/* GPIO_FUNC75_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC75_IN_SEL 0x0000003F +#define GPIO_FUNC75_IN_SEL_M ((GPIO_FUNC75_IN_SEL_V)<<(GPIO_FUNC75_IN_SEL_S)) +#define GPIO_FUNC75_IN_SEL_V 0x3F +#define GPIO_FUNC75_IN_SEL_S 0 + +#define GPIO_FUNC76_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0260) +/* GPIO_SIG76_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG76_IN_SEL (BIT(7)) +#define GPIO_SIG76_IN_SEL_M (BIT(7)) +#define GPIO_SIG76_IN_SEL_V 0x1 +#define GPIO_SIG76_IN_SEL_S 7 +/* GPIO_FUNC76_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC76_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC76_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC76_IN_INV_SEL_V 0x1 +#define GPIO_FUNC76_IN_INV_SEL_S 6 +/* GPIO_FUNC76_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC76_IN_SEL 0x0000003F +#define GPIO_FUNC76_IN_SEL_M ((GPIO_FUNC76_IN_SEL_V)<<(GPIO_FUNC76_IN_SEL_S)) +#define GPIO_FUNC76_IN_SEL_V 0x3F +#define GPIO_FUNC76_IN_SEL_S 0 + +#define GPIO_FUNC77_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0264) +/* GPIO_SIG77_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG77_IN_SEL (BIT(7)) +#define GPIO_SIG77_IN_SEL_M (BIT(7)) +#define GPIO_SIG77_IN_SEL_V 0x1 +#define GPIO_SIG77_IN_SEL_S 7 +/* GPIO_FUNC77_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC77_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC77_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC77_IN_INV_SEL_V 0x1 +#define GPIO_FUNC77_IN_INV_SEL_S 6 +/* GPIO_FUNC77_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC77_IN_SEL 0x0000003F +#define GPIO_FUNC77_IN_SEL_M ((GPIO_FUNC77_IN_SEL_V)<<(GPIO_FUNC77_IN_SEL_S)) +#define GPIO_FUNC77_IN_SEL_V 0x3F +#define GPIO_FUNC77_IN_SEL_S 0 + +#define GPIO_FUNC78_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0268) +/* GPIO_SIG78_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG78_IN_SEL (BIT(7)) +#define GPIO_SIG78_IN_SEL_M (BIT(7)) +#define GPIO_SIG78_IN_SEL_V 0x1 +#define GPIO_SIG78_IN_SEL_S 7 +/* GPIO_FUNC78_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC78_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC78_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC78_IN_INV_SEL_V 0x1 +#define GPIO_FUNC78_IN_INV_SEL_S 6 +/* GPIO_FUNC78_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC78_IN_SEL 0x0000003F +#define GPIO_FUNC78_IN_SEL_M ((GPIO_FUNC78_IN_SEL_V)<<(GPIO_FUNC78_IN_SEL_S)) +#define GPIO_FUNC78_IN_SEL_V 0x3F +#define GPIO_FUNC78_IN_SEL_S 0 + +#define GPIO_FUNC79_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x026c) +/* GPIO_SIG79_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG79_IN_SEL (BIT(7)) +#define GPIO_SIG79_IN_SEL_M (BIT(7)) +#define GPIO_SIG79_IN_SEL_V 0x1 +#define GPIO_SIG79_IN_SEL_S 7 +/* GPIO_FUNC79_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC79_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC79_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC79_IN_INV_SEL_V 0x1 +#define GPIO_FUNC79_IN_INV_SEL_S 6 +/* GPIO_FUNC79_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC79_IN_SEL 0x0000003F +#define GPIO_FUNC79_IN_SEL_M ((GPIO_FUNC79_IN_SEL_V)<<(GPIO_FUNC79_IN_SEL_S)) +#define GPIO_FUNC79_IN_SEL_V 0x3F +#define GPIO_FUNC79_IN_SEL_S 0 + +#define GPIO_FUNC80_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0270) +/* GPIO_SIG80_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG80_IN_SEL (BIT(7)) +#define GPIO_SIG80_IN_SEL_M (BIT(7)) +#define GPIO_SIG80_IN_SEL_V 0x1 +#define GPIO_SIG80_IN_SEL_S 7 +/* GPIO_FUNC80_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC80_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC80_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC80_IN_INV_SEL_V 0x1 +#define GPIO_FUNC80_IN_INV_SEL_S 6 +/* GPIO_FUNC80_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC80_IN_SEL 0x0000003F +#define GPIO_FUNC80_IN_SEL_M ((GPIO_FUNC80_IN_SEL_V)<<(GPIO_FUNC80_IN_SEL_S)) +#define GPIO_FUNC80_IN_SEL_V 0x3F +#define GPIO_FUNC80_IN_SEL_S 0 + +#define GPIO_FUNC81_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0274) +/* GPIO_SIG81_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG81_IN_SEL (BIT(7)) +#define GPIO_SIG81_IN_SEL_M (BIT(7)) +#define GPIO_SIG81_IN_SEL_V 0x1 +#define GPIO_SIG81_IN_SEL_S 7 +/* GPIO_FUNC81_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC81_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC81_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC81_IN_INV_SEL_V 0x1 +#define GPIO_FUNC81_IN_INV_SEL_S 6 +/* GPIO_FUNC81_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC81_IN_SEL 0x0000003F +#define GPIO_FUNC81_IN_SEL_M ((GPIO_FUNC81_IN_SEL_V)<<(GPIO_FUNC81_IN_SEL_S)) +#define GPIO_FUNC81_IN_SEL_V 0x3F +#define GPIO_FUNC81_IN_SEL_S 0 + +#define GPIO_FUNC82_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0278) +/* GPIO_SIG82_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG82_IN_SEL (BIT(7)) +#define GPIO_SIG82_IN_SEL_M (BIT(7)) +#define GPIO_SIG82_IN_SEL_V 0x1 +#define GPIO_SIG82_IN_SEL_S 7 +/* GPIO_FUNC82_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC82_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC82_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC82_IN_INV_SEL_V 0x1 +#define GPIO_FUNC82_IN_INV_SEL_S 6 +/* GPIO_FUNC82_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC82_IN_SEL 0x0000003F +#define GPIO_FUNC82_IN_SEL_M ((GPIO_FUNC82_IN_SEL_V)<<(GPIO_FUNC82_IN_SEL_S)) +#define GPIO_FUNC82_IN_SEL_V 0x3F +#define GPIO_FUNC82_IN_SEL_S 0 + +#define GPIO_FUNC83_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x027c) +/* GPIO_SIG83_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG83_IN_SEL (BIT(7)) +#define GPIO_SIG83_IN_SEL_M (BIT(7)) +#define GPIO_SIG83_IN_SEL_V 0x1 +#define GPIO_SIG83_IN_SEL_S 7 +/* GPIO_FUNC83_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC83_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC83_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC83_IN_INV_SEL_V 0x1 +#define GPIO_FUNC83_IN_INV_SEL_S 6 +/* GPIO_FUNC83_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC83_IN_SEL 0x0000003F +#define GPIO_FUNC83_IN_SEL_M ((GPIO_FUNC83_IN_SEL_V)<<(GPIO_FUNC83_IN_SEL_S)) +#define GPIO_FUNC83_IN_SEL_V 0x3F +#define GPIO_FUNC83_IN_SEL_S 0 + +#define GPIO_FUNC84_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0280) +/* GPIO_SIG84_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG84_IN_SEL (BIT(7)) +#define GPIO_SIG84_IN_SEL_M (BIT(7)) +#define GPIO_SIG84_IN_SEL_V 0x1 +#define GPIO_SIG84_IN_SEL_S 7 +/* GPIO_FUNC84_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC84_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC84_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC84_IN_INV_SEL_V 0x1 +#define GPIO_FUNC84_IN_INV_SEL_S 6 +/* GPIO_FUNC84_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC84_IN_SEL 0x0000003F +#define GPIO_FUNC84_IN_SEL_M ((GPIO_FUNC84_IN_SEL_V)<<(GPIO_FUNC84_IN_SEL_S)) +#define GPIO_FUNC84_IN_SEL_V 0x3F +#define GPIO_FUNC84_IN_SEL_S 0 + +#define GPIO_FUNC85_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0284) +/* GPIO_SIG85_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG85_IN_SEL (BIT(7)) +#define GPIO_SIG85_IN_SEL_M (BIT(7)) +#define GPIO_SIG85_IN_SEL_V 0x1 +#define GPIO_SIG85_IN_SEL_S 7 +/* GPIO_FUNC85_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC85_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC85_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC85_IN_INV_SEL_V 0x1 +#define GPIO_FUNC85_IN_INV_SEL_S 6 +/* GPIO_FUNC85_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC85_IN_SEL 0x0000003F +#define GPIO_FUNC85_IN_SEL_M ((GPIO_FUNC85_IN_SEL_V)<<(GPIO_FUNC85_IN_SEL_S)) +#define GPIO_FUNC85_IN_SEL_V 0x3F +#define GPIO_FUNC85_IN_SEL_S 0 + +#define GPIO_FUNC86_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0288) +/* GPIO_SIG86_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG86_IN_SEL (BIT(7)) +#define GPIO_SIG86_IN_SEL_M (BIT(7)) +#define GPIO_SIG86_IN_SEL_V 0x1 +#define GPIO_SIG86_IN_SEL_S 7 +/* GPIO_FUNC86_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC86_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC86_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC86_IN_INV_SEL_V 0x1 +#define GPIO_FUNC86_IN_INV_SEL_S 6 +/* GPIO_FUNC86_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC86_IN_SEL 0x0000003F +#define GPIO_FUNC86_IN_SEL_M ((GPIO_FUNC86_IN_SEL_V)<<(GPIO_FUNC86_IN_SEL_S)) +#define GPIO_FUNC86_IN_SEL_V 0x3F +#define GPIO_FUNC86_IN_SEL_S 0 + +#define GPIO_FUNC87_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x028c) +/* GPIO_SIG87_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG87_IN_SEL (BIT(7)) +#define GPIO_SIG87_IN_SEL_M (BIT(7)) +#define GPIO_SIG87_IN_SEL_V 0x1 +#define GPIO_SIG87_IN_SEL_S 7 +/* GPIO_FUNC87_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC87_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC87_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC87_IN_INV_SEL_V 0x1 +#define GPIO_FUNC87_IN_INV_SEL_S 6 +/* GPIO_FUNC87_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC87_IN_SEL 0x0000003F +#define GPIO_FUNC87_IN_SEL_M ((GPIO_FUNC87_IN_SEL_V)<<(GPIO_FUNC87_IN_SEL_S)) +#define GPIO_FUNC87_IN_SEL_V 0x3F +#define GPIO_FUNC87_IN_SEL_S 0 + +#define GPIO_FUNC88_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0290) +/* GPIO_SIG88_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG88_IN_SEL (BIT(7)) +#define GPIO_SIG88_IN_SEL_M (BIT(7)) +#define GPIO_SIG88_IN_SEL_V 0x1 +#define GPIO_SIG88_IN_SEL_S 7 +/* GPIO_FUNC88_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC88_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC88_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC88_IN_INV_SEL_V 0x1 +#define GPIO_FUNC88_IN_INV_SEL_S 6 +/* GPIO_FUNC88_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC88_IN_SEL 0x0000003F +#define GPIO_FUNC88_IN_SEL_M ((GPIO_FUNC88_IN_SEL_V)<<(GPIO_FUNC88_IN_SEL_S)) +#define GPIO_FUNC88_IN_SEL_V 0x3F +#define GPIO_FUNC88_IN_SEL_S 0 + +#define GPIO_FUNC89_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0294) +/* GPIO_SIG89_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG89_IN_SEL (BIT(7)) +#define GPIO_SIG89_IN_SEL_M (BIT(7)) +#define GPIO_SIG89_IN_SEL_V 0x1 +#define GPIO_SIG89_IN_SEL_S 7 +/* GPIO_FUNC89_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC89_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC89_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC89_IN_INV_SEL_V 0x1 +#define GPIO_FUNC89_IN_INV_SEL_S 6 +/* GPIO_FUNC89_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC89_IN_SEL 0x0000003F +#define GPIO_FUNC89_IN_SEL_M ((GPIO_FUNC89_IN_SEL_V)<<(GPIO_FUNC89_IN_SEL_S)) +#define GPIO_FUNC89_IN_SEL_V 0x3F +#define GPIO_FUNC89_IN_SEL_S 0 + +#define GPIO_FUNC90_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0298) +/* GPIO_SIG90_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG90_IN_SEL (BIT(7)) +#define GPIO_SIG90_IN_SEL_M (BIT(7)) +#define GPIO_SIG90_IN_SEL_V 0x1 +#define GPIO_SIG90_IN_SEL_S 7 +/* GPIO_FUNC90_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC90_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC90_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC90_IN_INV_SEL_V 0x1 +#define GPIO_FUNC90_IN_INV_SEL_S 6 +/* GPIO_FUNC90_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC90_IN_SEL 0x0000003F +#define GPIO_FUNC90_IN_SEL_M ((GPIO_FUNC90_IN_SEL_V)<<(GPIO_FUNC90_IN_SEL_S)) +#define GPIO_FUNC90_IN_SEL_V 0x3F +#define GPIO_FUNC90_IN_SEL_S 0 + +#define GPIO_FUNC91_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x029c) +/* GPIO_SIG91_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG91_IN_SEL (BIT(7)) +#define GPIO_SIG91_IN_SEL_M (BIT(7)) +#define GPIO_SIG91_IN_SEL_V 0x1 +#define GPIO_SIG91_IN_SEL_S 7 +/* GPIO_FUNC91_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC91_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC91_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC91_IN_INV_SEL_V 0x1 +#define GPIO_FUNC91_IN_INV_SEL_S 6 +/* GPIO_FUNC91_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC91_IN_SEL 0x0000003F +#define GPIO_FUNC91_IN_SEL_M ((GPIO_FUNC91_IN_SEL_V)<<(GPIO_FUNC91_IN_SEL_S)) +#define GPIO_FUNC91_IN_SEL_V 0x3F +#define GPIO_FUNC91_IN_SEL_S 0 + +#define GPIO_FUNC92_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x02a0) +/* GPIO_SIG92_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG92_IN_SEL (BIT(7)) +#define GPIO_SIG92_IN_SEL_M (BIT(7)) +#define GPIO_SIG92_IN_SEL_V 0x1 +#define GPIO_SIG92_IN_SEL_S 7 +/* GPIO_FUNC92_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC92_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC92_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC92_IN_INV_SEL_V 0x1 +#define GPIO_FUNC92_IN_INV_SEL_S 6 +/* GPIO_FUNC92_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC92_IN_SEL 0x0000003F +#define GPIO_FUNC92_IN_SEL_M ((GPIO_FUNC92_IN_SEL_V)<<(GPIO_FUNC92_IN_SEL_S)) +#define GPIO_FUNC92_IN_SEL_V 0x3F +#define GPIO_FUNC92_IN_SEL_S 0 + +#define GPIO_FUNC93_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x02a4) +/* GPIO_SIG93_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG93_IN_SEL (BIT(7)) +#define GPIO_SIG93_IN_SEL_M (BIT(7)) +#define GPIO_SIG93_IN_SEL_V 0x1 +#define GPIO_SIG93_IN_SEL_S 7 +/* GPIO_FUNC93_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC93_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC93_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC93_IN_INV_SEL_V 0x1 +#define GPIO_FUNC93_IN_INV_SEL_S 6 +/* GPIO_FUNC93_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC93_IN_SEL 0x0000003F +#define GPIO_FUNC93_IN_SEL_M ((GPIO_FUNC93_IN_SEL_V)<<(GPIO_FUNC93_IN_SEL_S)) +#define GPIO_FUNC93_IN_SEL_V 0x3F +#define GPIO_FUNC93_IN_SEL_S 0 + +#define GPIO_FUNC94_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x02a8) +/* GPIO_SIG94_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG94_IN_SEL (BIT(7)) +#define GPIO_SIG94_IN_SEL_M (BIT(7)) +#define GPIO_SIG94_IN_SEL_V 0x1 +#define GPIO_SIG94_IN_SEL_S 7 +/* GPIO_FUNC94_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC94_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC94_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC94_IN_INV_SEL_V 0x1 +#define GPIO_FUNC94_IN_INV_SEL_S 6 +/* GPIO_FUNC94_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC94_IN_SEL 0x0000003F +#define GPIO_FUNC94_IN_SEL_M ((GPIO_FUNC94_IN_SEL_V)<<(GPIO_FUNC94_IN_SEL_S)) +#define GPIO_FUNC94_IN_SEL_V 0x3F +#define GPIO_FUNC94_IN_SEL_S 0 + +#define GPIO_FUNC95_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x02ac) +/* GPIO_SIG95_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG95_IN_SEL (BIT(7)) +#define GPIO_SIG95_IN_SEL_M (BIT(7)) +#define GPIO_SIG95_IN_SEL_V 0x1 +#define GPIO_SIG95_IN_SEL_S 7 +/* GPIO_FUNC95_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC95_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC95_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC95_IN_INV_SEL_V 0x1 +#define GPIO_FUNC95_IN_INV_SEL_S 6 +/* GPIO_FUNC95_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC95_IN_SEL 0x0000003F +#define GPIO_FUNC95_IN_SEL_M ((GPIO_FUNC95_IN_SEL_V)<<(GPIO_FUNC95_IN_SEL_S)) +#define GPIO_FUNC95_IN_SEL_V 0x3F +#define GPIO_FUNC95_IN_SEL_S 0 + +#define GPIO_FUNC96_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x02b0) +/* GPIO_SIG96_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG96_IN_SEL (BIT(7)) +#define GPIO_SIG96_IN_SEL_M (BIT(7)) +#define GPIO_SIG96_IN_SEL_V 0x1 +#define GPIO_SIG96_IN_SEL_S 7 +/* GPIO_FUNC96_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC96_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC96_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC96_IN_INV_SEL_V 0x1 +#define GPIO_FUNC96_IN_INV_SEL_S 6 +/* GPIO_FUNC96_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC96_IN_SEL 0x0000003F +#define GPIO_FUNC96_IN_SEL_M ((GPIO_FUNC96_IN_SEL_V)<<(GPIO_FUNC96_IN_SEL_S)) +#define GPIO_FUNC96_IN_SEL_V 0x3F +#define GPIO_FUNC96_IN_SEL_S 0 + +#define GPIO_FUNC97_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x02b4) +/* GPIO_SIG97_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG97_IN_SEL (BIT(7)) +#define GPIO_SIG97_IN_SEL_M (BIT(7)) +#define GPIO_SIG97_IN_SEL_V 0x1 +#define GPIO_SIG97_IN_SEL_S 7 +/* GPIO_FUNC97_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC97_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC97_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC97_IN_INV_SEL_V 0x1 +#define GPIO_FUNC97_IN_INV_SEL_S 6 +/* GPIO_FUNC97_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC97_IN_SEL 0x0000003F +#define GPIO_FUNC97_IN_SEL_M ((GPIO_FUNC97_IN_SEL_V)<<(GPIO_FUNC97_IN_SEL_S)) +#define GPIO_FUNC97_IN_SEL_V 0x3F +#define GPIO_FUNC97_IN_SEL_S 0 + +#define GPIO_FUNC98_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x02b8) +/* GPIO_SIG98_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG98_IN_SEL (BIT(7)) +#define GPIO_SIG98_IN_SEL_M (BIT(7)) +#define GPIO_SIG98_IN_SEL_V 0x1 +#define GPIO_SIG98_IN_SEL_S 7 +/* GPIO_FUNC98_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC98_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC98_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC98_IN_INV_SEL_V 0x1 +#define GPIO_FUNC98_IN_INV_SEL_S 6 +/* GPIO_FUNC98_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC98_IN_SEL 0x0000003F +#define GPIO_FUNC98_IN_SEL_M ((GPIO_FUNC98_IN_SEL_V)<<(GPIO_FUNC98_IN_SEL_S)) +#define GPIO_FUNC98_IN_SEL_V 0x3F +#define GPIO_FUNC98_IN_SEL_S 0 + +#define GPIO_FUNC99_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x02bc) +/* GPIO_SIG99_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG99_IN_SEL (BIT(7)) +#define GPIO_SIG99_IN_SEL_M (BIT(7)) +#define GPIO_SIG99_IN_SEL_V 0x1 +#define GPIO_SIG99_IN_SEL_S 7 +/* GPIO_FUNC99_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC99_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC99_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC99_IN_INV_SEL_V 0x1 +#define GPIO_FUNC99_IN_INV_SEL_S 6 +/* GPIO_FUNC99_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC99_IN_SEL 0x0000003F +#define GPIO_FUNC99_IN_SEL_M ((GPIO_FUNC99_IN_SEL_V)<<(GPIO_FUNC99_IN_SEL_S)) +#define GPIO_FUNC99_IN_SEL_V 0x3F +#define GPIO_FUNC99_IN_SEL_S 0 + +#define GPIO_FUNC100_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x02c0) +/* GPIO_SIG100_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG100_IN_SEL (BIT(7)) +#define GPIO_SIG100_IN_SEL_M (BIT(7)) +#define GPIO_SIG100_IN_SEL_V 0x1 +#define GPIO_SIG100_IN_SEL_S 7 +/* GPIO_FUNC100_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC100_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC100_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC100_IN_INV_SEL_V 0x1 +#define GPIO_FUNC100_IN_INV_SEL_S 6 +/* GPIO_FUNC100_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC100_IN_SEL 0x0000003F +#define GPIO_FUNC100_IN_SEL_M ((GPIO_FUNC100_IN_SEL_V)<<(GPIO_FUNC100_IN_SEL_S)) +#define GPIO_FUNC100_IN_SEL_V 0x3F +#define GPIO_FUNC100_IN_SEL_S 0 + +#define GPIO_FUNC101_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x02c4) +/* GPIO_SIG101_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG101_IN_SEL (BIT(7)) +#define GPIO_SIG101_IN_SEL_M (BIT(7)) +#define GPIO_SIG101_IN_SEL_V 0x1 +#define GPIO_SIG101_IN_SEL_S 7 +/* GPIO_FUNC101_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC101_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC101_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC101_IN_INV_SEL_V 0x1 +#define GPIO_FUNC101_IN_INV_SEL_S 6 +/* GPIO_FUNC101_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC101_IN_SEL 0x0000003F +#define GPIO_FUNC101_IN_SEL_M ((GPIO_FUNC101_IN_SEL_V)<<(GPIO_FUNC101_IN_SEL_S)) +#define GPIO_FUNC101_IN_SEL_V 0x3F +#define GPIO_FUNC101_IN_SEL_S 0 + +#define GPIO_FUNC102_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x02c8) +/* GPIO_SIG102_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG102_IN_SEL (BIT(7)) +#define GPIO_SIG102_IN_SEL_M (BIT(7)) +#define GPIO_SIG102_IN_SEL_V 0x1 +#define GPIO_SIG102_IN_SEL_S 7 +/* GPIO_FUNC102_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC102_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC102_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC102_IN_INV_SEL_V 0x1 +#define GPIO_FUNC102_IN_INV_SEL_S 6 +/* GPIO_FUNC102_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC102_IN_SEL 0x0000003F +#define GPIO_FUNC102_IN_SEL_M ((GPIO_FUNC102_IN_SEL_V)<<(GPIO_FUNC102_IN_SEL_S)) +#define GPIO_FUNC102_IN_SEL_V 0x3F +#define GPIO_FUNC102_IN_SEL_S 0 + +#define GPIO_FUNC103_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x02cc) +/* GPIO_SIG103_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG103_IN_SEL (BIT(7)) +#define GPIO_SIG103_IN_SEL_M (BIT(7)) +#define GPIO_SIG103_IN_SEL_V 0x1 +#define GPIO_SIG103_IN_SEL_S 7 +/* GPIO_FUNC103_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC103_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC103_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC103_IN_INV_SEL_V 0x1 +#define GPIO_FUNC103_IN_INV_SEL_S 6 +/* GPIO_FUNC103_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC103_IN_SEL 0x0000003F +#define GPIO_FUNC103_IN_SEL_M ((GPIO_FUNC103_IN_SEL_V)<<(GPIO_FUNC103_IN_SEL_S)) +#define GPIO_FUNC103_IN_SEL_V 0x3F +#define GPIO_FUNC103_IN_SEL_S 0 + +#define GPIO_FUNC104_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x02d0) +/* GPIO_SIG104_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG104_IN_SEL (BIT(7)) +#define GPIO_SIG104_IN_SEL_M (BIT(7)) +#define GPIO_SIG104_IN_SEL_V 0x1 +#define GPIO_SIG104_IN_SEL_S 7 +/* GPIO_FUNC104_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC104_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC104_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC104_IN_INV_SEL_V 0x1 +#define GPIO_FUNC104_IN_INV_SEL_S 6 +/* GPIO_FUNC104_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC104_IN_SEL 0x0000003F +#define GPIO_FUNC104_IN_SEL_M ((GPIO_FUNC104_IN_SEL_V)<<(GPIO_FUNC104_IN_SEL_S)) +#define GPIO_FUNC104_IN_SEL_V 0x3F +#define GPIO_FUNC104_IN_SEL_S 0 + +#define GPIO_FUNC105_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x02d4) +/* GPIO_SIG105_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG105_IN_SEL (BIT(7)) +#define GPIO_SIG105_IN_SEL_M (BIT(7)) +#define GPIO_SIG105_IN_SEL_V 0x1 +#define GPIO_SIG105_IN_SEL_S 7 +/* GPIO_FUNC105_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC105_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC105_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC105_IN_INV_SEL_V 0x1 +#define GPIO_FUNC105_IN_INV_SEL_S 6 +/* GPIO_FUNC105_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC105_IN_SEL 0x0000003F +#define GPIO_FUNC105_IN_SEL_M ((GPIO_FUNC105_IN_SEL_V)<<(GPIO_FUNC105_IN_SEL_S)) +#define GPIO_FUNC105_IN_SEL_V 0x3F +#define GPIO_FUNC105_IN_SEL_S 0 + +#define GPIO_FUNC106_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x02d8) +/* GPIO_SIG106_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG106_IN_SEL (BIT(7)) +#define GPIO_SIG106_IN_SEL_M (BIT(7)) +#define GPIO_SIG106_IN_SEL_V 0x1 +#define GPIO_SIG106_IN_SEL_S 7 +/* GPIO_FUNC106_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC106_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC106_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC106_IN_INV_SEL_V 0x1 +#define GPIO_FUNC106_IN_INV_SEL_S 6 +/* GPIO_FUNC106_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC106_IN_SEL 0x0000003F +#define GPIO_FUNC106_IN_SEL_M ((GPIO_FUNC106_IN_SEL_V)<<(GPIO_FUNC106_IN_SEL_S)) +#define GPIO_FUNC106_IN_SEL_V 0x3F +#define GPIO_FUNC106_IN_SEL_S 0 + +#define GPIO_FUNC107_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x02dc) +/* GPIO_SIG107_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG107_IN_SEL (BIT(7)) +#define GPIO_SIG107_IN_SEL_M (BIT(7)) +#define GPIO_SIG107_IN_SEL_V 0x1 +#define GPIO_SIG107_IN_SEL_S 7 +/* GPIO_FUNC107_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC107_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC107_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC107_IN_INV_SEL_V 0x1 +#define GPIO_FUNC107_IN_INV_SEL_S 6 +/* GPIO_FUNC107_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC107_IN_SEL 0x0000003F +#define GPIO_FUNC107_IN_SEL_M ((GPIO_FUNC107_IN_SEL_V)<<(GPIO_FUNC107_IN_SEL_S)) +#define GPIO_FUNC107_IN_SEL_V 0x3F +#define GPIO_FUNC107_IN_SEL_S 0 + +#define GPIO_FUNC108_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x02e0) +/* GPIO_SIG108_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG108_IN_SEL (BIT(7)) +#define GPIO_SIG108_IN_SEL_M (BIT(7)) +#define GPIO_SIG108_IN_SEL_V 0x1 +#define GPIO_SIG108_IN_SEL_S 7 +/* GPIO_FUNC108_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC108_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC108_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC108_IN_INV_SEL_V 0x1 +#define GPIO_FUNC108_IN_INV_SEL_S 6 +/* GPIO_FUNC108_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC108_IN_SEL 0x0000003F +#define GPIO_FUNC108_IN_SEL_M ((GPIO_FUNC108_IN_SEL_V)<<(GPIO_FUNC108_IN_SEL_S)) +#define GPIO_FUNC108_IN_SEL_V 0x3F +#define GPIO_FUNC108_IN_SEL_S 0 + +#define GPIO_FUNC109_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x02e4) +/* GPIO_SIG109_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG109_IN_SEL (BIT(7)) +#define GPIO_SIG109_IN_SEL_M (BIT(7)) +#define GPIO_SIG109_IN_SEL_V 0x1 +#define GPIO_SIG109_IN_SEL_S 7 +/* GPIO_FUNC109_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC109_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC109_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC109_IN_INV_SEL_V 0x1 +#define GPIO_FUNC109_IN_INV_SEL_S 6 +/* GPIO_FUNC109_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC109_IN_SEL 0x0000003F +#define GPIO_FUNC109_IN_SEL_M ((GPIO_FUNC109_IN_SEL_V)<<(GPIO_FUNC109_IN_SEL_S)) +#define GPIO_FUNC109_IN_SEL_V 0x3F +#define GPIO_FUNC109_IN_SEL_S 0 + +#define GPIO_FUNC110_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x02e8) +/* GPIO_SIG110_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG110_IN_SEL (BIT(7)) +#define GPIO_SIG110_IN_SEL_M (BIT(7)) +#define GPIO_SIG110_IN_SEL_V 0x1 +#define GPIO_SIG110_IN_SEL_S 7 +/* GPIO_FUNC110_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC110_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC110_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC110_IN_INV_SEL_V 0x1 +#define GPIO_FUNC110_IN_INV_SEL_S 6 +/* GPIO_FUNC110_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC110_IN_SEL 0x0000003F +#define GPIO_FUNC110_IN_SEL_M ((GPIO_FUNC110_IN_SEL_V)<<(GPIO_FUNC110_IN_SEL_S)) +#define GPIO_FUNC110_IN_SEL_V 0x3F +#define GPIO_FUNC110_IN_SEL_S 0 + +#define GPIO_FUNC111_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x02ec) +/* GPIO_SIG111_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG111_IN_SEL (BIT(7)) +#define GPIO_SIG111_IN_SEL_M (BIT(7)) +#define GPIO_SIG111_IN_SEL_V 0x1 +#define GPIO_SIG111_IN_SEL_S 7 +/* GPIO_FUNC111_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC111_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC111_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC111_IN_INV_SEL_V 0x1 +#define GPIO_FUNC111_IN_INV_SEL_S 6 +/* GPIO_FUNC111_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC111_IN_SEL 0x0000003F +#define GPIO_FUNC111_IN_SEL_M ((GPIO_FUNC111_IN_SEL_V)<<(GPIO_FUNC111_IN_SEL_S)) +#define GPIO_FUNC111_IN_SEL_V 0x3F +#define GPIO_FUNC111_IN_SEL_S 0 + +#define GPIO_FUNC112_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x02f0) +/* GPIO_SIG112_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG112_IN_SEL (BIT(7)) +#define GPIO_SIG112_IN_SEL_M (BIT(7)) +#define GPIO_SIG112_IN_SEL_V 0x1 +#define GPIO_SIG112_IN_SEL_S 7 +/* GPIO_FUNC112_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC112_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC112_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC112_IN_INV_SEL_V 0x1 +#define GPIO_FUNC112_IN_INV_SEL_S 6 +/* GPIO_FUNC112_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC112_IN_SEL 0x0000003F +#define GPIO_FUNC112_IN_SEL_M ((GPIO_FUNC112_IN_SEL_V)<<(GPIO_FUNC112_IN_SEL_S)) +#define GPIO_FUNC112_IN_SEL_V 0x3F +#define GPIO_FUNC112_IN_SEL_S 0 + +#define GPIO_FUNC113_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x02f4) +/* GPIO_SIG113_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG113_IN_SEL (BIT(7)) +#define GPIO_SIG113_IN_SEL_M (BIT(7)) +#define GPIO_SIG113_IN_SEL_V 0x1 +#define GPIO_SIG113_IN_SEL_S 7 +/* GPIO_FUNC113_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC113_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC113_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC113_IN_INV_SEL_V 0x1 +#define GPIO_FUNC113_IN_INV_SEL_S 6 +/* GPIO_FUNC113_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC113_IN_SEL 0x0000003F +#define GPIO_FUNC113_IN_SEL_M ((GPIO_FUNC113_IN_SEL_V)<<(GPIO_FUNC113_IN_SEL_S)) +#define GPIO_FUNC113_IN_SEL_V 0x3F +#define GPIO_FUNC113_IN_SEL_S 0 + +#define GPIO_FUNC114_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x02f8) +/* GPIO_SIG114_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG114_IN_SEL (BIT(7)) +#define GPIO_SIG114_IN_SEL_M (BIT(7)) +#define GPIO_SIG114_IN_SEL_V 0x1 +#define GPIO_SIG114_IN_SEL_S 7 +/* GPIO_FUNC114_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC114_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC114_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC114_IN_INV_SEL_V 0x1 +#define GPIO_FUNC114_IN_INV_SEL_S 6 +/* GPIO_FUNC114_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC114_IN_SEL 0x0000003F +#define GPIO_FUNC114_IN_SEL_M ((GPIO_FUNC114_IN_SEL_V)<<(GPIO_FUNC114_IN_SEL_S)) +#define GPIO_FUNC114_IN_SEL_V 0x3F +#define GPIO_FUNC114_IN_SEL_S 0 + +#define GPIO_FUNC115_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x02fc) +/* GPIO_SIG115_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG115_IN_SEL (BIT(7)) +#define GPIO_SIG115_IN_SEL_M (BIT(7)) +#define GPIO_SIG115_IN_SEL_V 0x1 +#define GPIO_SIG115_IN_SEL_S 7 +/* GPIO_FUNC115_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC115_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC115_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC115_IN_INV_SEL_V 0x1 +#define GPIO_FUNC115_IN_INV_SEL_S 6 +/* GPIO_FUNC115_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC115_IN_SEL 0x0000003F +#define GPIO_FUNC115_IN_SEL_M ((GPIO_FUNC115_IN_SEL_V)<<(GPIO_FUNC115_IN_SEL_S)) +#define GPIO_FUNC115_IN_SEL_V 0x3F +#define GPIO_FUNC115_IN_SEL_S 0 + +#define GPIO_FUNC116_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0300) +/* GPIO_SIG116_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG116_IN_SEL (BIT(7)) +#define GPIO_SIG116_IN_SEL_M (BIT(7)) +#define GPIO_SIG116_IN_SEL_V 0x1 +#define GPIO_SIG116_IN_SEL_S 7 +/* GPIO_FUNC116_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC116_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC116_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC116_IN_INV_SEL_V 0x1 +#define GPIO_FUNC116_IN_INV_SEL_S 6 +/* GPIO_FUNC116_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC116_IN_SEL 0x0000003F +#define GPIO_FUNC116_IN_SEL_M ((GPIO_FUNC116_IN_SEL_V)<<(GPIO_FUNC116_IN_SEL_S)) +#define GPIO_FUNC116_IN_SEL_V 0x3F +#define GPIO_FUNC116_IN_SEL_S 0 + +#define GPIO_FUNC117_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0304) +/* GPIO_SIG117_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG117_IN_SEL (BIT(7)) +#define GPIO_SIG117_IN_SEL_M (BIT(7)) +#define GPIO_SIG117_IN_SEL_V 0x1 +#define GPIO_SIG117_IN_SEL_S 7 +/* GPIO_FUNC117_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC117_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC117_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC117_IN_INV_SEL_V 0x1 +#define GPIO_FUNC117_IN_INV_SEL_S 6 +/* GPIO_FUNC117_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC117_IN_SEL 0x0000003F +#define GPIO_FUNC117_IN_SEL_M ((GPIO_FUNC117_IN_SEL_V)<<(GPIO_FUNC117_IN_SEL_S)) +#define GPIO_FUNC117_IN_SEL_V 0x3F +#define GPIO_FUNC117_IN_SEL_S 0 + +#define GPIO_FUNC118_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0308) +/* GPIO_SIG118_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG118_IN_SEL (BIT(7)) +#define GPIO_SIG118_IN_SEL_M (BIT(7)) +#define GPIO_SIG118_IN_SEL_V 0x1 +#define GPIO_SIG118_IN_SEL_S 7 +/* GPIO_FUNC118_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC118_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC118_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC118_IN_INV_SEL_V 0x1 +#define GPIO_FUNC118_IN_INV_SEL_S 6 +/* GPIO_FUNC118_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC118_IN_SEL 0x0000003F +#define GPIO_FUNC118_IN_SEL_M ((GPIO_FUNC118_IN_SEL_V)<<(GPIO_FUNC118_IN_SEL_S)) +#define GPIO_FUNC118_IN_SEL_V 0x3F +#define GPIO_FUNC118_IN_SEL_S 0 + +#define GPIO_FUNC119_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x030c) +/* GPIO_SIG119_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG119_IN_SEL (BIT(7)) +#define GPIO_SIG119_IN_SEL_M (BIT(7)) +#define GPIO_SIG119_IN_SEL_V 0x1 +#define GPIO_SIG119_IN_SEL_S 7 +/* GPIO_FUNC119_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC119_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC119_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC119_IN_INV_SEL_V 0x1 +#define GPIO_FUNC119_IN_INV_SEL_S 6 +/* GPIO_FUNC119_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC119_IN_SEL 0x0000003F +#define GPIO_FUNC119_IN_SEL_M ((GPIO_FUNC119_IN_SEL_V)<<(GPIO_FUNC119_IN_SEL_S)) +#define GPIO_FUNC119_IN_SEL_V 0x3F +#define GPIO_FUNC119_IN_SEL_S 0 + +#define GPIO_FUNC120_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0310) +/* GPIO_SIG120_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG120_IN_SEL (BIT(7)) +#define GPIO_SIG120_IN_SEL_M (BIT(7)) +#define GPIO_SIG120_IN_SEL_V 0x1 +#define GPIO_SIG120_IN_SEL_S 7 +/* GPIO_FUNC120_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC120_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC120_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC120_IN_INV_SEL_V 0x1 +#define GPIO_FUNC120_IN_INV_SEL_S 6 +/* GPIO_FUNC120_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC120_IN_SEL 0x0000003F +#define GPIO_FUNC120_IN_SEL_M ((GPIO_FUNC120_IN_SEL_V)<<(GPIO_FUNC120_IN_SEL_S)) +#define GPIO_FUNC120_IN_SEL_V 0x3F +#define GPIO_FUNC120_IN_SEL_S 0 + +#define GPIO_FUNC121_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0314) +/* GPIO_SIG121_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG121_IN_SEL (BIT(7)) +#define GPIO_SIG121_IN_SEL_M (BIT(7)) +#define GPIO_SIG121_IN_SEL_V 0x1 +#define GPIO_SIG121_IN_SEL_S 7 +/* GPIO_FUNC121_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC121_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC121_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC121_IN_INV_SEL_V 0x1 +#define GPIO_FUNC121_IN_INV_SEL_S 6 +/* GPIO_FUNC121_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC121_IN_SEL 0x0000003F +#define GPIO_FUNC121_IN_SEL_M ((GPIO_FUNC121_IN_SEL_V)<<(GPIO_FUNC121_IN_SEL_S)) +#define GPIO_FUNC121_IN_SEL_V 0x3F +#define GPIO_FUNC121_IN_SEL_S 0 + +#define GPIO_FUNC122_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0318) +/* GPIO_SIG122_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG122_IN_SEL (BIT(7)) +#define GPIO_SIG122_IN_SEL_M (BIT(7)) +#define GPIO_SIG122_IN_SEL_V 0x1 +#define GPIO_SIG122_IN_SEL_S 7 +/* GPIO_FUNC122_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC122_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC122_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC122_IN_INV_SEL_V 0x1 +#define GPIO_FUNC122_IN_INV_SEL_S 6 +/* GPIO_FUNC122_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC122_IN_SEL 0x0000003F +#define GPIO_FUNC122_IN_SEL_M ((GPIO_FUNC122_IN_SEL_V)<<(GPIO_FUNC122_IN_SEL_S)) +#define GPIO_FUNC122_IN_SEL_V 0x3F +#define GPIO_FUNC122_IN_SEL_S 0 + +#define GPIO_FUNC123_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x031c) +/* GPIO_SIG123_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG123_IN_SEL (BIT(7)) +#define GPIO_SIG123_IN_SEL_M (BIT(7)) +#define GPIO_SIG123_IN_SEL_V 0x1 +#define GPIO_SIG123_IN_SEL_S 7 +/* GPIO_FUNC123_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC123_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC123_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC123_IN_INV_SEL_V 0x1 +#define GPIO_FUNC123_IN_INV_SEL_S 6 +/* GPIO_FUNC123_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC123_IN_SEL 0x0000003F +#define GPIO_FUNC123_IN_SEL_M ((GPIO_FUNC123_IN_SEL_V)<<(GPIO_FUNC123_IN_SEL_S)) +#define GPIO_FUNC123_IN_SEL_V 0x3F +#define GPIO_FUNC123_IN_SEL_S 0 + +#define GPIO_FUNC124_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0320) +/* GPIO_SIG124_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG124_IN_SEL (BIT(7)) +#define GPIO_SIG124_IN_SEL_M (BIT(7)) +#define GPIO_SIG124_IN_SEL_V 0x1 +#define GPIO_SIG124_IN_SEL_S 7 +/* GPIO_FUNC124_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC124_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC124_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC124_IN_INV_SEL_V 0x1 +#define GPIO_FUNC124_IN_INV_SEL_S 6 +/* GPIO_FUNC124_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC124_IN_SEL 0x0000003F +#define GPIO_FUNC124_IN_SEL_M ((GPIO_FUNC124_IN_SEL_V)<<(GPIO_FUNC124_IN_SEL_S)) +#define GPIO_FUNC124_IN_SEL_V 0x3F +#define GPIO_FUNC124_IN_SEL_S 0 + +#define GPIO_FUNC125_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0324) +/* GPIO_SIG125_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG125_IN_SEL (BIT(7)) +#define GPIO_SIG125_IN_SEL_M (BIT(7)) +#define GPIO_SIG125_IN_SEL_V 0x1 +#define GPIO_SIG125_IN_SEL_S 7 +/* GPIO_FUNC125_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC125_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC125_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC125_IN_INV_SEL_V 0x1 +#define GPIO_FUNC125_IN_INV_SEL_S 6 +/* GPIO_FUNC125_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC125_IN_SEL 0x0000003F +#define GPIO_FUNC125_IN_SEL_M ((GPIO_FUNC125_IN_SEL_V)<<(GPIO_FUNC125_IN_SEL_S)) +#define GPIO_FUNC125_IN_SEL_V 0x3F +#define GPIO_FUNC125_IN_SEL_S 0 + +#define GPIO_FUNC126_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0328) +/* GPIO_SIG126_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG126_IN_SEL (BIT(7)) +#define GPIO_SIG126_IN_SEL_M (BIT(7)) +#define GPIO_SIG126_IN_SEL_V 0x1 +#define GPIO_SIG126_IN_SEL_S 7 +/* GPIO_FUNC126_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC126_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC126_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC126_IN_INV_SEL_V 0x1 +#define GPIO_FUNC126_IN_INV_SEL_S 6 +/* GPIO_FUNC126_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC126_IN_SEL 0x0000003F +#define GPIO_FUNC126_IN_SEL_M ((GPIO_FUNC126_IN_SEL_V)<<(GPIO_FUNC126_IN_SEL_S)) +#define GPIO_FUNC126_IN_SEL_V 0x3F +#define GPIO_FUNC126_IN_SEL_S 0 + +#define GPIO_FUNC127_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x032c) +/* GPIO_SIG127_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG127_IN_SEL (BIT(7)) +#define GPIO_SIG127_IN_SEL_M (BIT(7)) +#define GPIO_SIG127_IN_SEL_V 0x1 +#define GPIO_SIG127_IN_SEL_S 7 +/* GPIO_FUNC127_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC127_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC127_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC127_IN_INV_SEL_V 0x1 +#define GPIO_FUNC127_IN_INV_SEL_S 6 +/* GPIO_FUNC127_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC127_IN_SEL 0x0000003F +#define GPIO_FUNC127_IN_SEL_M ((GPIO_FUNC127_IN_SEL_V)<<(GPIO_FUNC127_IN_SEL_S)) +#define GPIO_FUNC127_IN_SEL_V 0x3F +#define GPIO_FUNC127_IN_SEL_S 0 + +#define GPIO_FUNC128_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0330) +/* GPIO_SIG128_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG128_IN_SEL (BIT(7)) +#define GPIO_SIG128_IN_SEL_M (BIT(7)) +#define GPIO_SIG128_IN_SEL_V 0x1 +#define GPIO_SIG128_IN_SEL_S 7 +/* GPIO_FUNC128_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC128_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC128_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC128_IN_INV_SEL_V 0x1 +#define GPIO_FUNC128_IN_INV_SEL_S 6 +/* GPIO_FUNC128_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC128_IN_SEL 0x0000003F +#define GPIO_FUNC128_IN_SEL_M ((GPIO_FUNC128_IN_SEL_V)<<(GPIO_FUNC128_IN_SEL_S)) +#define GPIO_FUNC128_IN_SEL_V 0x3F +#define GPIO_FUNC128_IN_SEL_S 0 + +#define GPIO_FUNC129_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0334) +/* GPIO_SIG129_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG129_IN_SEL (BIT(7)) +#define GPIO_SIG129_IN_SEL_M (BIT(7)) +#define GPIO_SIG129_IN_SEL_V 0x1 +#define GPIO_SIG129_IN_SEL_S 7 +/* GPIO_FUNC129_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC129_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC129_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC129_IN_INV_SEL_V 0x1 +#define GPIO_FUNC129_IN_INV_SEL_S 6 +/* GPIO_FUNC129_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC129_IN_SEL 0x0000003F +#define GPIO_FUNC129_IN_SEL_M ((GPIO_FUNC129_IN_SEL_V)<<(GPIO_FUNC129_IN_SEL_S)) +#define GPIO_FUNC129_IN_SEL_V 0x3F +#define GPIO_FUNC129_IN_SEL_S 0 + +#define GPIO_FUNC130_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0338) +/* GPIO_SIG130_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG130_IN_SEL (BIT(7)) +#define GPIO_SIG130_IN_SEL_M (BIT(7)) +#define GPIO_SIG130_IN_SEL_V 0x1 +#define GPIO_SIG130_IN_SEL_S 7 +/* GPIO_FUNC130_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC130_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC130_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC130_IN_INV_SEL_V 0x1 +#define GPIO_FUNC130_IN_INV_SEL_S 6 +/* GPIO_FUNC130_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC130_IN_SEL 0x0000003F +#define GPIO_FUNC130_IN_SEL_M ((GPIO_FUNC130_IN_SEL_V)<<(GPIO_FUNC130_IN_SEL_S)) +#define GPIO_FUNC130_IN_SEL_V 0x3F +#define GPIO_FUNC130_IN_SEL_S 0 + +#define GPIO_FUNC131_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x033c) +/* GPIO_SIG131_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG131_IN_SEL (BIT(7)) +#define GPIO_SIG131_IN_SEL_M (BIT(7)) +#define GPIO_SIG131_IN_SEL_V 0x1 +#define GPIO_SIG131_IN_SEL_S 7 +/* GPIO_FUNC131_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC131_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC131_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC131_IN_INV_SEL_V 0x1 +#define GPIO_FUNC131_IN_INV_SEL_S 6 +/* GPIO_FUNC131_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC131_IN_SEL 0x0000003F +#define GPIO_FUNC131_IN_SEL_M ((GPIO_FUNC131_IN_SEL_V)<<(GPIO_FUNC131_IN_SEL_S)) +#define GPIO_FUNC131_IN_SEL_V 0x3F +#define GPIO_FUNC131_IN_SEL_S 0 + +#define GPIO_FUNC132_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0340) +/* GPIO_SIG132_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG132_IN_SEL (BIT(7)) +#define GPIO_SIG132_IN_SEL_M (BIT(7)) +#define GPIO_SIG132_IN_SEL_V 0x1 +#define GPIO_SIG132_IN_SEL_S 7 +/* GPIO_FUNC132_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC132_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC132_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC132_IN_INV_SEL_V 0x1 +#define GPIO_FUNC132_IN_INV_SEL_S 6 +/* GPIO_FUNC132_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC132_IN_SEL 0x0000003F +#define GPIO_FUNC132_IN_SEL_M ((GPIO_FUNC132_IN_SEL_V)<<(GPIO_FUNC132_IN_SEL_S)) +#define GPIO_FUNC132_IN_SEL_V 0x3F +#define GPIO_FUNC132_IN_SEL_S 0 + +#define GPIO_FUNC133_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0344) +/* GPIO_SIG133_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG133_IN_SEL (BIT(7)) +#define GPIO_SIG133_IN_SEL_M (BIT(7)) +#define GPIO_SIG133_IN_SEL_V 0x1 +#define GPIO_SIG133_IN_SEL_S 7 +/* GPIO_FUNC133_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC133_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC133_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC133_IN_INV_SEL_V 0x1 +#define GPIO_FUNC133_IN_INV_SEL_S 6 +/* GPIO_FUNC133_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC133_IN_SEL 0x0000003F +#define GPIO_FUNC133_IN_SEL_M ((GPIO_FUNC133_IN_SEL_V)<<(GPIO_FUNC133_IN_SEL_S)) +#define GPIO_FUNC133_IN_SEL_V 0x3F +#define GPIO_FUNC133_IN_SEL_S 0 + +#define GPIO_FUNC134_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0348) +/* GPIO_SIG134_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG134_IN_SEL (BIT(7)) +#define GPIO_SIG134_IN_SEL_M (BIT(7)) +#define GPIO_SIG134_IN_SEL_V 0x1 +#define GPIO_SIG134_IN_SEL_S 7 +/* GPIO_FUNC134_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC134_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC134_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC134_IN_INV_SEL_V 0x1 +#define GPIO_FUNC134_IN_INV_SEL_S 6 +/* GPIO_FUNC134_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC134_IN_SEL 0x0000003F +#define GPIO_FUNC134_IN_SEL_M ((GPIO_FUNC134_IN_SEL_V)<<(GPIO_FUNC134_IN_SEL_S)) +#define GPIO_FUNC134_IN_SEL_V 0x3F +#define GPIO_FUNC134_IN_SEL_S 0 + +#define GPIO_FUNC135_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x034c) +/* GPIO_SIG135_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG135_IN_SEL (BIT(7)) +#define GPIO_SIG135_IN_SEL_M (BIT(7)) +#define GPIO_SIG135_IN_SEL_V 0x1 +#define GPIO_SIG135_IN_SEL_S 7 +/* GPIO_FUNC135_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC135_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC135_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC135_IN_INV_SEL_V 0x1 +#define GPIO_FUNC135_IN_INV_SEL_S 6 +/* GPIO_FUNC135_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC135_IN_SEL 0x0000003F +#define GPIO_FUNC135_IN_SEL_M ((GPIO_FUNC135_IN_SEL_V)<<(GPIO_FUNC135_IN_SEL_S)) +#define GPIO_FUNC135_IN_SEL_V 0x3F +#define GPIO_FUNC135_IN_SEL_S 0 + +#define GPIO_FUNC136_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0350) +/* GPIO_SIG136_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG136_IN_SEL (BIT(7)) +#define GPIO_SIG136_IN_SEL_M (BIT(7)) +#define GPIO_SIG136_IN_SEL_V 0x1 +#define GPIO_SIG136_IN_SEL_S 7 +/* GPIO_FUNC136_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC136_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC136_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC136_IN_INV_SEL_V 0x1 +#define GPIO_FUNC136_IN_INV_SEL_S 6 +/* GPIO_FUNC136_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC136_IN_SEL 0x0000003F +#define GPIO_FUNC136_IN_SEL_M ((GPIO_FUNC136_IN_SEL_V)<<(GPIO_FUNC136_IN_SEL_S)) +#define GPIO_FUNC136_IN_SEL_V 0x3F +#define GPIO_FUNC136_IN_SEL_S 0 + +#define GPIO_FUNC137_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0354) +/* GPIO_SIG137_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG137_IN_SEL (BIT(7)) +#define GPIO_SIG137_IN_SEL_M (BIT(7)) +#define GPIO_SIG137_IN_SEL_V 0x1 +#define GPIO_SIG137_IN_SEL_S 7 +/* GPIO_FUNC137_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC137_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC137_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC137_IN_INV_SEL_V 0x1 +#define GPIO_FUNC137_IN_INV_SEL_S 6 +/* GPIO_FUNC137_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC137_IN_SEL 0x0000003F +#define GPIO_FUNC137_IN_SEL_M ((GPIO_FUNC137_IN_SEL_V)<<(GPIO_FUNC137_IN_SEL_S)) +#define GPIO_FUNC137_IN_SEL_V 0x3F +#define GPIO_FUNC137_IN_SEL_S 0 + +#define GPIO_FUNC138_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0358) +/* GPIO_SIG138_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG138_IN_SEL (BIT(7)) +#define GPIO_SIG138_IN_SEL_M (BIT(7)) +#define GPIO_SIG138_IN_SEL_V 0x1 +#define GPIO_SIG138_IN_SEL_S 7 +/* GPIO_FUNC138_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC138_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC138_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC138_IN_INV_SEL_V 0x1 +#define GPIO_FUNC138_IN_INV_SEL_S 6 +/* GPIO_FUNC138_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC138_IN_SEL 0x0000003F +#define GPIO_FUNC138_IN_SEL_M ((GPIO_FUNC138_IN_SEL_V)<<(GPIO_FUNC138_IN_SEL_S)) +#define GPIO_FUNC138_IN_SEL_V 0x3F +#define GPIO_FUNC138_IN_SEL_S 0 + +#define GPIO_FUNC139_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x035c) +/* GPIO_SIG139_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG139_IN_SEL (BIT(7)) +#define GPIO_SIG139_IN_SEL_M (BIT(7)) +#define GPIO_SIG139_IN_SEL_V 0x1 +#define GPIO_SIG139_IN_SEL_S 7 +/* GPIO_FUNC139_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC139_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC139_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC139_IN_INV_SEL_V 0x1 +#define GPIO_FUNC139_IN_INV_SEL_S 6 +/* GPIO_FUNC139_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC139_IN_SEL 0x0000003F +#define GPIO_FUNC139_IN_SEL_M ((GPIO_FUNC139_IN_SEL_V)<<(GPIO_FUNC139_IN_SEL_S)) +#define GPIO_FUNC139_IN_SEL_V 0x3F +#define GPIO_FUNC139_IN_SEL_S 0 + +#define GPIO_FUNC140_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0360) +/* GPIO_SIG140_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG140_IN_SEL (BIT(7)) +#define GPIO_SIG140_IN_SEL_M (BIT(7)) +#define GPIO_SIG140_IN_SEL_V 0x1 +#define GPIO_SIG140_IN_SEL_S 7 +/* GPIO_FUNC140_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC140_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC140_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC140_IN_INV_SEL_V 0x1 +#define GPIO_FUNC140_IN_INV_SEL_S 6 +/* GPIO_FUNC140_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC140_IN_SEL 0x0000003F +#define GPIO_FUNC140_IN_SEL_M ((GPIO_FUNC140_IN_SEL_V)<<(GPIO_FUNC140_IN_SEL_S)) +#define GPIO_FUNC140_IN_SEL_V 0x3F +#define GPIO_FUNC140_IN_SEL_S 0 + +#define GPIO_FUNC141_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0364) +/* GPIO_SIG141_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG141_IN_SEL (BIT(7)) +#define GPIO_SIG141_IN_SEL_M (BIT(7)) +#define GPIO_SIG141_IN_SEL_V 0x1 +#define GPIO_SIG141_IN_SEL_S 7 +/* GPIO_FUNC141_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC141_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC141_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC141_IN_INV_SEL_V 0x1 +#define GPIO_FUNC141_IN_INV_SEL_S 6 +/* GPIO_FUNC141_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC141_IN_SEL 0x0000003F +#define GPIO_FUNC141_IN_SEL_M ((GPIO_FUNC141_IN_SEL_V)<<(GPIO_FUNC141_IN_SEL_S)) +#define GPIO_FUNC141_IN_SEL_V 0x3F +#define GPIO_FUNC141_IN_SEL_S 0 + +#define GPIO_FUNC142_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0368) +/* GPIO_SIG142_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG142_IN_SEL (BIT(7)) +#define GPIO_SIG142_IN_SEL_M (BIT(7)) +#define GPIO_SIG142_IN_SEL_V 0x1 +#define GPIO_SIG142_IN_SEL_S 7 +/* GPIO_FUNC142_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC142_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC142_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC142_IN_INV_SEL_V 0x1 +#define GPIO_FUNC142_IN_INV_SEL_S 6 +/* GPIO_FUNC142_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC142_IN_SEL 0x0000003F +#define GPIO_FUNC142_IN_SEL_M ((GPIO_FUNC142_IN_SEL_V)<<(GPIO_FUNC142_IN_SEL_S)) +#define GPIO_FUNC142_IN_SEL_V 0x3F +#define GPIO_FUNC142_IN_SEL_S 0 + +#define GPIO_FUNC143_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x036c) +/* GPIO_SIG143_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG143_IN_SEL (BIT(7)) +#define GPIO_SIG143_IN_SEL_M (BIT(7)) +#define GPIO_SIG143_IN_SEL_V 0x1 +#define GPIO_SIG143_IN_SEL_S 7 +/* GPIO_FUNC143_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC143_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC143_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC143_IN_INV_SEL_V 0x1 +#define GPIO_FUNC143_IN_INV_SEL_S 6 +/* GPIO_FUNC143_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC143_IN_SEL 0x0000003F +#define GPIO_FUNC143_IN_SEL_M ((GPIO_FUNC143_IN_SEL_V)<<(GPIO_FUNC143_IN_SEL_S)) +#define GPIO_FUNC143_IN_SEL_V 0x3F +#define GPIO_FUNC143_IN_SEL_S 0 + +#define GPIO_FUNC144_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0370) +/* GPIO_SIG144_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG144_IN_SEL (BIT(7)) +#define GPIO_SIG144_IN_SEL_M (BIT(7)) +#define GPIO_SIG144_IN_SEL_V 0x1 +#define GPIO_SIG144_IN_SEL_S 7 +/* GPIO_FUNC144_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC144_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC144_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC144_IN_INV_SEL_V 0x1 +#define GPIO_FUNC144_IN_INV_SEL_S 6 +/* GPIO_FUNC144_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC144_IN_SEL 0x0000003F +#define GPIO_FUNC144_IN_SEL_M ((GPIO_FUNC144_IN_SEL_V)<<(GPIO_FUNC144_IN_SEL_S)) +#define GPIO_FUNC144_IN_SEL_V 0x3F +#define GPIO_FUNC144_IN_SEL_S 0 + +#define GPIO_FUNC145_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0374) +/* GPIO_SIG145_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG145_IN_SEL (BIT(7)) +#define GPIO_SIG145_IN_SEL_M (BIT(7)) +#define GPIO_SIG145_IN_SEL_V 0x1 +#define GPIO_SIG145_IN_SEL_S 7 +/* GPIO_FUNC145_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC145_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC145_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC145_IN_INV_SEL_V 0x1 +#define GPIO_FUNC145_IN_INV_SEL_S 6 +/* GPIO_FUNC145_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC145_IN_SEL 0x0000003F +#define GPIO_FUNC145_IN_SEL_M ((GPIO_FUNC145_IN_SEL_V)<<(GPIO_FUNC145_IN_SEL_S)) +#define GPIO_FUNC145_IN_SEL_V 0x3F +#define GPIO_FUNC145_IN_SEL_S 0 + +#define GPIO_FUNC146_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0378) +/* GPIO_SIG146_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG146_IN_SEL (BIT(7)) +#define GPIO_SIG146_IN_SEL_M (BIT(7)) +#define GPIO_SIG146_IN_SEL_V 0x1 +#define GPIO_SIG146_IN_SEL_S 7 +/* GPIO_FUNC146_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC146_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC146_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC146_IN_INV_SEL_V 0x1 +#define GPIO_FUNC146_IN_INV_SEL_S 6 +/* GPIO_FUNC146_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC146_IN_SEL 0x0000003F +#define GPIO_FUNC146_IN_SEL_M ((GPIO_FUNC146_IN_SEL_V)<<(GPIO_FUNC146_IN_SEL_S)) +#define GPIO_FUNC146_IN_SEL_V 0x3F +#define GPIO_FUNC146_IN_SEL_S 0 + +#define GPIO_FUNC147_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x037c) +/* GPIO_SIG147_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG147_IN_SEL (BIT(7)) +#define GPIO_SIG147_IN_SEL_M (BIT(7)) +#define GPIO_SIG147_IN_SEL_V 0x1 +#define GPIO_SIG147_IN_SEL_S 7 +/* GPIO_FUNC147_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC147_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC147_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC147_IN_INV_SEL_V 0x1 +#define GPIO_FUNC147_IN_INV_SEL_S 6 +/* GPIO_FUNC147_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC147_IN_SEL 0x0000003F +#define GPIO_FUNC147_IN_SEL_M ((GPIO_FUNC147_IN_SEL_V)<<(GPIO_FUNC147_IN_SEL_S)) +#define GPIO_FUNC147_IN_SEL_V 0x3F +#define GPIO_FUNC147_IN_SEL_S 0 + +#define GPIO_FUNC148_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0380) +/* GPIO_SIG148_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG148_IN_SEL (BIT(7)) +#define GPIO_SIG148_IN_SEL_M (BIT(7)) +#define GPIO_SIG148_IN_SEL_V 0x1 +#define GPIO_SIG148_IN_SEL_S 7 +/* GPIO_FUNC148_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC148_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC148_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC148_IN_INV_SEL_V 0x1 +#define GPIO_FUNC148_IN_INV_SEL_S 6 +/* GPIO_FUNC148_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC148_IN_SEL 0x0000003F +#define GPIO_FUNC148_IN_SEL_M ((GPIO_FUNC148_IN_SEL_V)<<(GPIO_FUNC148_IN_SEL_S)) +#define GPIO_FUNC148_IN_SEL_V 0x3F +#define GPIO_FUNC148_IN_SEL_S 0 + +#define GPIO_FUNC149_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0384) +/* GPIO_SIG149_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG149_IN_SEL (BIT(7)) +#define GPIO_SIG149_IN_SEL_M (BIT(7)) +#define GPIO_SIG149_IN_SEL_V 0x1 +#define GPIO_SIG149_IN_SEL_S 7 +/* GPIO_FUNC149_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC149_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC149_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC149_IN_INV_SEL_V 0x1 +#define GPIO_FUNC149_IN_INV_SEL_S 6 +/* GPIO_FUNC149_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC149_IN_SEL 0x0000003F +#define GPIO_FUNC149_IN_SEL_M ((GPIO_FUNC149_IN_SEL_V)<<(GPIO_FUNC149_IN_SEL_S)) +#define GPIO_FUNC149_IN_SEL_V 0x3F +#define GPIO_FUNC149_IN_SEL_S 0 + +#define GPIO_FUNC150_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0388) +/* GPIO_SIG150_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG150_IN_SEL (BIT(7)) +#define GPIO_SIG150_IN_SEL_M (BIT(7)) +#define GPIO_SIG150_IN_SEL_V 0x1 +#define GPIO_SIG150_IN_SEL_S 7 +/* GPIO_FUNC150_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC150_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC150_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC150_IN_INV_SEL_V 0x1 +#define GPIO_FUNC150_IN_INV_SEL_S 6 +/* GPIO_FUNC150_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC150_IN_SEL 0x0000003F +#define GPIO_FUNC150_IN_SEL_M ((GPIO_FUNC150_IN_SEL_V)<<(GPIO_FUNC150_IN_SEL_S)) +#define GPIO_FUNC150_IN_SEL_V 0x3F +#define GPIO_FUNC150_IN_SEL_S 0 + +#define GPIO_FUNC151_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x038c) +/* GPIO_SIG151_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG151_IN_SEL (BIT(7)) +#define GPIO_SIG151_IN_SEL_M (BIT(7)) +#define GPIO_SIG151_IN_SEL_V 0x1 +#define GPIO_SIG151_IN_SEL_S 7 +/* GPIO_FUNC151_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC151_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC151_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC151_IN_INV_SEL_V 0x1 +#define GPIO_FUNC151_IN_INV_SEL_S 6 +/* GPIO_FUNC151_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC151_IN_SEL 0x0000003F +#define GPIO_FUNC151_IN_SEL_M ((GPIO_FUNC151_IN_SEL_V)<<(GPIO_FUNC151_IN_SEL_S)) +#define GPIO_FUNC151_IN_SEL_V 0x3F +#define GPIO_FUNC151_IN_SEL_S 0 + +#define GPIO_FUNC152_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0390) +/* GPIO_SIG152_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG152_IN_SEL (BIT(7)) +#define GPIO_SIG152_IN_SEL_M (BIT(7)) +#define GPIO_SIG152_IN_SEL_V 0x1 +#define GPIO_SIG152_IN_SEL_S 7 +/* GPIO_FUNC152_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC152_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC152_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC152_IN_INV_SEL_V 0x1 +#define GPIO_FUNC152_IN_INV_SEL_S 6 +/* GPIO_FUNC152_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC152_IN_SEL 0x0000003F +#define GPIO_FUNC152_IN_SEL_M ((GPIO_FUNC152_IN_SEL_V)<<(GPIO_FUNC152_IN_SEL_S)) +#define GPIO_FUNC152_IN_SEL_V 0x3F +#define GPIO_FUNC152_IN_SEL_S 0 + +#define GPIO_FUNC153_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0394) +/* GPIO_SIG153_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG153_IN_SEL (BIT(7)) +#define GPIO_SIG153_IN_SEL_M (BIT(7)) +#define GPIO_SIG153_IN_SEL_V 0x1 +#define GPIO_SIG153_IN_SEL_S 7 +/* GPIO_FUNC153_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC153_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC153_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC153_IN_INV_SEL_V 0x1 +#define GPIO_FUNC153_IN_INV_SEL_S 6 +/* GPIO_FUNC153_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC153_IN_SEL 0x0000003F +#define GPIO_FUNC153_IN_SEL_M ((GPIO_FUNC153_IN_SEL_V)<<(GPIO_FUNC153_IN_SEL_S)) +#define GPIO_FUNC153_IN_SEL_V 0x3F +#define GPIO_FUNC153_IN_SEL_S 0 + +#define GPIO_FUNC154_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0398) +/* GPIO_SIG154_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG154_IN_SEL (BIT(7)) +#define GPIO_SIG154_IN_SEL_M (BIT(7)) +#define GPIO_SIG154_IN_SEL_V 0x1 +#define GPIO_SIG154_IN_SEL_S 7 +/* GPIO_FUNC154_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC154_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC154_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC154_IN_INV_SEL_V 0x1 +#define GPIO_FUNC154_IN_INV_SEL_S 6 +/* GPIO_FUNC154_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC154_IN_SEL 0x0000003F +#define GPIO_FUNC154_IN_SEL_M ((GPIO_FUNC154_IN_SEL_V)<<(GPIO_FUNC154_IN_SEL_S)) +#define GPIO_FUNC154_IN_SEL_V 0x3F +#define GPIO_FUNC154_IN_SEL_S 0 + +#define GPIO_FUNC155_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x039c) +/* GPIO_SIG155_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG155_IN_SEL (BIT(7)) +#define GPIO_SIG155_IN_SEL_M (BIT(7)) +#define GPIO_SIG155_IN_SEL_V 0x1 +#define GPIO_SIG155_IN_SEL_S 7 +/* GPIO_FUNC155_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC155_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC155_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC155_IN_INV_SEL_V 0x1 +#define GPIO_FUNC155_IN_INV_SEL_S 6 +/* GPIO_FUNC155_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC155_IN_SEL 0x0000003F +#define GPIO_FUNC155_IN_SEL_M ((GPIO_FUNC155_IN_SEL_V)<<(GPIO_FUNC155_IN_SEL_S)) +#define GPIO_FUNC155_IN_SEL_V 0x3F +#define GPIO_FUNC155_IN_SEL_S 0 + +#define GPIO_FUNC156_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x03a0) +/* GPIO_SIG156_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG156_IN_SEL (BIT(7)) +#define GPIO_SIG156_IN_SEL_M (BIT(7)) +#define GPIO_SIG156_IN_SEL_V 0x1 +#define GPIO_SIG156_IN_SEL_S 7 +/* GPIO_FUNC156_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC156_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC156_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC156_IN_INV_SEL_V 0x1 +#define GPIO_FUNC156_IN_INV_SEL_S 6 +/* GPIO_FUNC156_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC156_IN_SEL 0x0000003F +#define GPIO_FUNC156_IN_SEL_M ((GPIO_FUNC156_IN_SEL_V)<<(GPIO_FUNC156_IN_SEL_S)) +#define GPIO_FUNC156_IN_SEL_V 0x3F +#define GPIO_FUNC156_IN_SEL_S 0 + +#define GPIO_FUNC157_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x03a4) +/* GPIO_SIG157_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG157_IN_SEL (BIT(7)) +#define GPIO_SIG157_IN_SEL_M (BIT(7)) +#define GPIO_SIG157_IN_SEL_V 0x1 +#define GPIO_SIG157_IN_SEL_S 7 +/* GPIO_FUNC157_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC157_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC157_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC157_IN_INV_SEL_V 0x1 +#define GPIO_FUNC157_IN_INV_SEL_S 6 +/* GPIO_FUNC157_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC157_IN_SEL 0x0000003F +#define GPIO_FUNC157_IN_SEL_M ((GPIO_FUNC157_IN_SEL_V)<<(GPIO_FUNC157_IN_SEL_S)) +#define GPIO_FUNC157_IN_SEL_V 0x3F +#define GPIO_FUNC157_IN_SEL_S 0 + +#define GPIO_FUNC158_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x03a8) +/* GPIO_SIG158_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG158_IN_SEL (BIT(7)) +#define GPIO_SIG158_IN_SEL_M (BIT(7)) +#define GPIO_SIG158_IN_SEL_V 0x1 +#define GPIO_SIG158_IN_SEL_S 7 +/* GPIO_FUNC158_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC158_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC158_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC158_IN_INV_SEL_V 0x1 +#define GPIO_FUNC158_IN_INV_SEL_S 6 +/* GPIO_FUNC158_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC158_IN_SEL 0x0000003F +#define GPIO_FUNC158_IN_SEL_M ((GPIO_FUNC158_IN_SEL_V)<<(GPIO_FUNC158_IN_SEL_S)) +#define GPIO_FUNC158_IN_SEL_V 0x3F +#define GPIO_FUNC158_IN_SEL_S 0 + +#define GPIO_FUNC159_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x03ac) +/* GPIO_SIG159_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG159_IN_SEL (BIT(7)) +#define GPIO_SIG159_IN_SEL_M (BIT(7)) +#define GPIO_SIG159_IN_SEL_V 0x1 +#define GPIO_SIG159_IN_SEL_S 7 +/* GPIO_FUNC159_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC159_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC159_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC159_IN_INV_SEL_V 0x1 +#define GPIO_FUNC159_IN_INV_SEL_S 6 +/* GPIO_FUNC159_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC159_IN_SEL 0x0000003F +#define GPIO_FUNC159_IN_SEL_M ((GPIO_FUNC159_IN_SEL_V)<<(GPIO_FUNC159_IN_SEL_S)) +#define GPIO_FUNC159_IN_SEL_V 0x3F +#define GPIO_FUNC159_IN_SEL_S 0 + +#define GPIO_FUNC160_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x03b0) +/* GPIO_SIG160_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG160_IN_SEL (BIT(7)) +#define GPIO_SIG160_IN_SEL_M (BIT(7)) +#define GPIO_SIG160_IN_SEL_V 0x1 +#define GPIO_SIG160_IN_SEL_S 7 +/* GPIO_FUNC160_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC160_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC160_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC160_IN_INV_SEL_V 0x1 +#define GPIO_FUNC160_IN_INV_SEL_S 6 +/* GPIO_FUNC160_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC160_IN_SEL 0x0000003F +#define GPIO_FUNC160_IN_SEL_M ((GPIO_FUNC160_IN_SEL_V)<<(GPIO_FUNC160_IN_SEL_S)) +#define GPIO_FUNC160_IN_SEL_V 0x3F +#define GPIO_FUNC160_IN_SEL_S 0 + +#define GPIO_FUNC161_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x03b4) +/* GPIO_SIG161_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG161_IN_SEL (BIT(7)) +#define GPIO_SIG161_IN_SEL_M (BIT(7)) +#define GPIO_SIG161_IN_SEL_V 0x1 +#define GPIO_SIG161_IN_SEL_S 7 +/* GPIO_FUNC161_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC161_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC161_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC161_IN_INV_SEL_V 0x1 +#define GPIO_FUNC161_IN_INV_SEL_S 6 +/* GPIO_FUNC161_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC161_IN_SEL 0x0000003F +#define GPIO_FUNC161_IN_SEL_M ((GPIO_FUNC161_IN_SEL_V)<<(GPIO_FUNC161_IN_SEL_S)) +#define GPIO_FUNC161_IN_SEL_V 0x3F +#define GPIO_FUNC161_IN_SEL_S 0 + +#define GPIO_FUNC162_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x03b8) +/* GPIO_SIG162_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG162_IN_SEL (BIT(7)) +#define GPIO_SIG162_IN_SEL_M (BIT(7)) +#define GPIO_SIG162_IN_SEL_V 0x1 +#define GPIO_SIG162_IN_SEL_S 7 +/* GPIO_FUNC162_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC162_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC162_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC162_IN_INV_SEL_V 0x1 +#define GPIO_FUNC162_IN_INV_SEL_S 6 +/* GPIO_FUNC162_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC162_IN_SEL 0x0000003F +#define GPIO_FUNC162_IN_SEL_M ((GPIO_FUNC162_IN_SEL_V)<<(GPIO_FUNC162_IN_SEL_S)) +#define GPIO_FUNC162_IN_SEL_V 0x3F +#define GPIO_FUNC162_IN_SEL_S 0 + +#define GPIO_FUNC163_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x03bc) +/* GPIO_SIG163_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG163_IN_SEL (BIT(7)) +#define GPIO_SIG163_IN_SEL_M (BIT(7)) +#define GPIO_SIG163_IN_SEL_V 0x1 +#define GPIO_SIG163_IN_SEL_S 7 +/* GPIO_FUNC163_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC163_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC163_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC163_IN_INV_SEL_V 0x1 +#define GPIO_FUNC163_IN_INV_SEL_S 6 +/* GPIO_FUNC163_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC163_IN_SEL 0x0000003F +#define GPIO_FUNC163_IN_SEL_M ((GPIO_FUNC163_IN_SEL_V)<<(GPIO_FUNC163_IN_SEL_S)) +#define GPIO_FUNC163_IN_SEL_V 0x3F +#define GPIO_FUNC163_IN_SEL_S 0 + +#define GPIO_FUNC164_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x03c0) +/* GPIO_SIG164_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG164_IN_SEL (BIT(7)) +#define GPIO_SIG164_IN_SEL_M (BIT(7)) +#define GPIO_SIG164_IN_SEL_V 0x1 +#define GPIO_SIG164_IN_SEL_S 7 +/* GPIO_FUNC164_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC164_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC164_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC164_IN_INV_SEL_V 0x1 +#define GPIO_FUNC164_IN_INV_SEL_S 6 +/* GPIO_FUNC164_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC164_IN_SEL 0x0000003F +#define GPIO_FUNC164_IN_SEL_M ((GPIO_FUNC164_IN_SEL_V)<<(GPIO_FUNC164_IN_SEL_S)) +#define GPIO_FUNC164_IN_SEL_V 0x3F +#define GPIO_FUNC164_IN_SEL_S 0 + +#define GPIO_FUNC165_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x03c4) +/* GPIO_SIG165_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG165_IN_SEL (BIT(7)) +#define GPIO_SIG165_IN_SEL_M (BIT(7)) +#define GPIO_SIG165_IN_SEL_V 0x1 +#define GPIO_SIG165_IN_SEL_S 7 +/* GPIO_FUNC165_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC165_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC165_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC165_IN_INV_SEL_V 0x1 +#define GPIO_FUNC165_IN_INV_SEL_S 6 +/* GPIO_FUNC165_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC165_IN_SEL 0x0000003F +#define GPIO_FUNC165_IN_SEL_M ((GPIO_FUNC165_IN_SEL_V)<<(GPIO_FUNC165_IN_SEL_S)) +#define GPIO_FUNC165_IN_SEL_V 0x3F +#define GPIO_FUNC165_IN_SEL_S 0 + +#define GPIO_FUNC166_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x03c8) +/* GPIO_SIG166_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG166_IN_SEL (BIT(7)) +#define GPIO_SIG166_IN_SEL_M (BIT(7)) +#define GPIO_SIG166_IN_SEL_V 0x1 +#define GPIO_SIG166_IN_SEL_S 7 +/* GPIO_FUNC166_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC166_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC166_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC166_IN_INV_SEL_V 0x1 +#define GPIO_FUNC166_IN_INV_SEL_S 6 +/* GPIO_FUNC166_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC166_IN_SEL 0x0000003F +#define GPIO_FUNC166_IN_SEL_M ((GPIO_FUNC166_IN_SEL_V)<<(GPIO_FUNC166_IN_SEL_S)) +#define GPIO_FUNC166_IN_SEL_V 0x3F +#define GPIO_FUNC166_IN_SEL_S 0 + +#define GPIO_FUNC167_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x03cc) +/* GPIO_SIG167_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG167_IN_SEL (BIT(7)) +#define GPIO_SIG167_IN_SEL_M (BIT(7)) +#define GPIO_SIG167_IN_SEL_V 0x1 +#define GPIO_SIG167_IN_SEL_S 7 +/* GPIO_FUNC167_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC167_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC167_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC167_IN_INV_SEL_V 0x1 +#define GPIO_FUNC167_IN_INV_SEL_S 6 +/* GPIO_FUNC167_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC167_IN_SEL 0x0000003F +#define GPIO_FUNC167_IN_SEL_M ((GPIO_FUNC167_IN_SEL_V)<<(GPIO_FUNC167_IN_SEL_S)) +#define GPIO_FUNC167_IN_SEL_V 0x3F +#define GPIO_FUNC167_IN_SEL_S 0 + +#define GPIO_FUNC168_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x03d0) +/* GPIO_SIG168_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG168_IN_SEL (BIT(7)) +#define GPIO_SIG168_IN_SEL_M (BIT(7)) +#define GPIO_SIG168_IN_SEL_V 0x1 +#define GPIO_SIG168_IN_SEL_S 7 +/* GPIO_FUNC168_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC168_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC168_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC168_IN_INV_SEL_V 0x1 +#define GPIO_FUNC168_IN_INV_SEL_S 6 +/* GPIO_FUNC168_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC168_IN_SEL 0x0000003F +#define GPIO_FUNC168_IN_SEL_M ((GPIO_FUNC168_IN_SEL_V)<<(GPIO_FUNC168_IN_SEL_S)) +#define GPIO_FUNC168_IN_SEL_V 0x3F +#define GPIO_FUNC168_IN_SEL_S 0 + +#define GPIO_FUNC169_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x03d4) +/* GPIO_SIG169_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG169_IN_SEL (BIT(7)) +#define GPIO_SIG169_IN_SEL_M (BIT(7)) +#define GPIO_SIG169_IN_SEL_V 0x1 +#define GPIO_SIG169_IN_SEL_S 7 +/* GPIO_FUNC169_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC169_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC169_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC169_IN_INV_SEL_V 0x1 +#define GPIO_FUNC169_IN_INV_SEL_S 6 +/* GPIO_FUNC169_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC169_IN_SEL 0x0000003F +#define GPIO_FUNC169_IN_SEL_M ((GPIO_FUNC169_IN_SEL_V)<<(GPIO_FUNC169_IN_SEL_S)) +#define GPIO_FUNC169_IN_SEL_V 0x3F +#define GPIO_FUNC169_IN_SEL_S 0 + +#define GPIO_FUNC170_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x03d8) +/* GPIO_SIG170_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG170_IN_SEL (BIT(7)) +#define GPIO_SIG170_IN_SEL_M (BIT(7)) +#define GPIO_SIG170_IN_SEL_V 0x1 +#define GPIO_SIG170_IN_SEL_S 7 +/* GPIO_FUNC170_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC170_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC170_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC170_IN_INV_SEL_V 0x1 +#define GPIO_FUNC170_IN_INV_SEL_S 6 +/* GPIO_FUNC170_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC170_IN_SEL 0x0000003F +#define GPIO_FUNC170_IN_SEL_M ((GPIO_FUNC170_IN_SEL_V)<<(GPIO_FUNC170_IN_SEL_S)) +#define GPIO_FUNC170_IN_SEL_V 0x3F +#define GPIO_FUNC170_IN_SEL_S 0 + +#define GPIO_FUNC171_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x03dc) +/* GPIO_SIG171_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG171_IN_SEL (BIT(7)) +#define GPIO_SIG171_IN_SEL_M (BIT(7)) +#define GPIO_SIG171_IN_SEL_V 0x1 +#define GPIO_SIG171_IN_SEL_S 7 +/* GPIO_FUNC171_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC171_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC171_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC171_IN_INV_SEL_V 0x1 +#define GPIO_FUNC171_IN_INV_SEL_S 6 +/* GPIO_FUNC171_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC171_IN_SEL 0x0000003F +#define GPIO_FUNC171_IN_SEL_M ((GPIO_FUNC171_IN_SEL_V)<<(GPIO_FUNC171_IN_SEL_S)) +#define GPIO_FUNC171_IN_SEL_V 0x3F +#define GPIO_FUNC171_IN_SEL_S 0 + +#define GPIO_FUNC172_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x03e0) +/* GPIO_SIG172_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG172_IN_SEL (BIT(7)) +#define GPIO_SIG172_IN_SEL_M (BIT(7)) +#define GPIO_SIG172_IN_SEL_V 0x1 +#define GPIO_SIG172_IN_SEL_S 7 +/* GPIO_FUNC172_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC172_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC172_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC172_IN_INV_SEL_V 0x1 +#define GPIO_FUNC172_IN_INV_SEL_S 6 +/* GPIO_FUNC172_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC172_IN_SEL 0x0000003F +#define GPIO_FUNC172_IN_SEL_M ((GPIO_FUNC172_IN_SEL_V)<<(GPIO_FUNC172_IN_SEL_S)) +#define GPIO_FUNC172_IN_SEL_V 0x3F +#define GPIO_FUNC172_IN_SEL_S 0 + +#define GPIO_FUNC173_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x03e4) +/* GPIO_SIG173_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG173_IN_SEL (BIT(7)) +#define GPIO_SIG173_IN_SEL_M (BIT(7)) +#define GPIO_SIG173_IN_SEL_V 0x1 +#define GPIO_SIG173_IN_SEL_S 7 +/* GPIO_FUNC173_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC173_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC173_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC173_IN_INV_SEL_V 0x1 +#define GPIO_FUNC173_IN_INV_SEL_S 6 +/* GPIO_FUNC173_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC173_IN_SEL 0x0000003F +#define GPIO_FUNC173_IN_SEL_M ((GPIO_FUNC173_IN_SEL_V)<<(GPIO_FUNC173_IN_SEL_S)) +#define GPIO_FUNC173_IN_SEL_V 0x3F +#define GPIO_FUNC173_IN_SEL_S 0 + +#define GPIO_FUNC174_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x03e8) +/* GPIO_SIG174_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG174_IN_SEL (BIT(7)) +#define GPIO_SIG174_IN_SEL_M (BIT(7)) +#define GPIO_SIG174_IN_SEL_V 0x1 +#define GPIO_SIG174_IN_SEL_S 7 +/* GPIO_FUNC174_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC174_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC174_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC174_IN_INV_SEL_V 0x1 +#define GPIO_FUNC174_IN_INV_SEL_S 6 +/* GPIO_FUNC174_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC174_IN_SEL 0x0000003F +#define GPIO_FUNC174_IN_SEL_M ((GPIO_FUNC174_IN_SEL_V)<<(GPIO_FUNC174_IN_SEL_S)) +#define GPIO_FUNC174_IN_SEL_V 0x3F +#define GPIO_FUNC174_IN_SEL_S 0 + +#define GPIO_FUNC175_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x03ec) +/* GPIO_SIG175_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG175_IN_SEL (BIT(7)) +#define GPIO_SIG175_IN_SEL_M (BIT(7)) +#define GPIO_SIG175_IN_SEL_V 0x1 +#define GPIO_SIG175_IN_SEL_S 7 +/* GPIO_FUNC175_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC175_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC175_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC175_IN_INV_SEL_V 0x1 +#define GPIO_FUNC175_IN_INV_SEL_S 6 +/* GPIO_FUNC175_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC175_IN_SEL 0x0000003F +#define GPIO_FUNC175_IN_SEL_M ((GPIO_FUNC175_IN_SEL_V)<<(GPIO_FUNC175_IN_SEL_S)) +#define GPIO_FUNC175_IN_SEL_V 0x3F +#define GPIO_FUNC175_IN_SEL_S 0 + +#define GPIO_FUNC176_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x03f0) +/* GPIO_SIG176_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG176_IN_SEL (BIT(7)) +#define GPIO_SIG176_IN_SEL_M (BIT(7)) +#define GPIO_SIG176_IN_SEL_V 0x1 +#define GPIO_SIG176_IN_SEL_S 7 +/* GPIO_FUNC176_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC176_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC176_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC176_IN_INV_SEL_V 0x1 +#define GPIO_FUNC176_IN_INV_SEL_S 6 +/* GPIO_FUNC176_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC176_IN_SEL 0x0000003F +#define GPIO_FUNC176_IN_SEL_M ((GPIO_FUNC176_IN_SEL_V)<<(GPIO_FUNC176_IN_SEL_S)) +#define GPIO_FUNC176_IN_SEL_V 0x3F +#define GPIO_FUNC176_IN_SEL_S 0 + +#define GPIO_FUNC177_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x03f4) +/* GPIO_SIG177_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG177_IN_SEL (BIT(7)) +#define GPIO_SIG177_IN_SEL_M (BIT(7)) +#define GPIO_SIG177_IN_SEL_V 0x1 +#define GPIO_SIG177_IN_SEL_S 7 +/* GPIO_FUNC177_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC177_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC177_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC177_IN_INV_SEL_V 0x1 +#define GPIO_FUNC177_IN_INV_SEL_S 6 +/* GPIO_FUNC177_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC177_IN_SEL 0x0000003F +#define GPIO_FUNC177_IN_SEL_M ((GPIO_FUNC177_IN_SEL_V)<<(GPIO_FUNC177_IN_SEL_S)) +#define GPIO_FUNC177_IN_SEL_V 0x3F +#define GPIO_FUNC177_IN_SEL_S 0 + +#define GPIO_FUNC178_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x03f8) +/* GPIO_SIG178_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG178_IN_SEL (BIT(7)) +#define GPIO_SIG178_IN_SEL_M (BIT(7)) +#define GPIO_SIG178_IN_SEL_V 0x1 +#define GPIO_SIG178_IN_SEL_S 7 +/* GPIO_FUNC178_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC178_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC178_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC178_IN_INV_SEL_V 0x1 +#define GPIO_FUNC178_IN_INV_SEL_S 6 +/* GPIO_FUNC178_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC178_IN_SEL 0x0000003F +#define GPIO_FUNC178_IN_SEL_M ((GPIO_FUNC178_IN_SEL_V)<<(GPIO_FUNC178_IN_SEL_S)) +#define GPIO_FUNC178_IN_SEL_V 0x3F +#define GPIO_FUNC178_IN_SEL_S 0 + +#define GPIO_FUNC179_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x03fc) +/* GPIO_SIG179_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG179_IN_SEL (BIT(7)) +#define GPIO_SIG179_IN_SEL_M (BIT(7)) +#define GPIO_SIG179_IN_SEL_V 0x1 +#define GPIO_SIG179_IN_SEL_S 7 +/* GPIO_FUNC179_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC179_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC179_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC179_IN_INV_SEL_V 0x1 +#define GPIO_FUNC179_IN_INV_SEL_S 6 +/* GPIO_FUNC179_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC179_IN_SEL 0x0000003F +#define GPIO_FUNC179_IN_SEL_M ((GPIO_FUNC179_IN_SEL_V)<<(GPIO_FUNC179_IN_SEL_S)) +#define GPIO_FUNC179_IN_SEL_V 0x3F +#define GPIO_FUNC179_IN_SEL_S 0 + +#define GPIO_FUNC180_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0400) +/* GPIO_SIG180_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG180_IN_SEL (BIT(7)) +#define GPIO_SIG180_IN_SEL_M (BIT(7)) +#define GPIO_SIG180_IN_SEL_V 0x1 +#define GPIO_SIG180_IN_SEL_S 7 +/* GPIO_FUNC180_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC180_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC180_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC180_IN_INV_SEL_V 0x1 +#define GPIO_FUNC180_IN_INV_SEL_S 6 +/* GPIO_FUNC180_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC180_IN_SEL 0x0000003F +#define GPIO_FUNC180_IN_SEL_M ((GPIO_FUNC180_IN_SEL_V)<<(GPIO_FUNC180_IN_SEL_S)) +#define GPIO_FUNC180_IN_SEL_V 0x3F +#define GPIO_FUNC180_IN_SEL_S 0 + +#define GPIO_FUNC181_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0404) +/* GPIO_SIG181_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG181_IN_SEL (BIT(7)) +#define GPIO_SIG181_IN_SEL_M (BIT(7)) +#define GPIO_SIG181_IN_SEL_V 0x1 +#define GPIO_SIG181_IN_SEL_S 7 +/* GPIO_FUNC181_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC181_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC181_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC181_IN_INV_SEL_V 0x1 +#define GPIO_FUNC181_IN_INV_SEL_S 6 +/* GPIO_FUNC181_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC181_IN_SEL 0x0000003F +#define GPIO_FUNC181_IN_SEL_M ((GPIO_FUNC181_IN_SEL_V)<<(GPIO_FUNC181_IN_SEL_S)) +#define GPIO_FUNC181_IN_SEL_V 0x3F +#define GPIO_FUNC181_IN_SEL_S 0 + +#define GPIO_FUNC182_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0408) +/* GPIO_SIG182_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG182_IN_SEL (BIT(7)) +#define GPIO_SIG182_IN_SEL_M (BIT(7)) +#define GPIO_SIG182_IN_SEL_V 0x1 +#define GPIO_SIG182_IN_SEL_S 7 +/* GPIO_FUNC182_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC182_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC182_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC182_IN_INV_SEL_V 0x1 +#define GPIO_FUNC182_IN_INV_SEL_S 6 +/* GPIO_FUNC182_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC182_IN_SEL 0x0000003F +#define GPIO_FUNC182_IN_SEL_M ((GPIO_FUNC182_IN_SEL_V)<<(GPIO_FUNC182_IN_SEL_S)) +#define GPIO_FUNC182_IN_SEL_V 0x3F +#define GPIO_FUNC182_IN_SEL_S 0 + +#define GPIO_FUNC183_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x040c) +/* GPIO_SIG183_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG183_IN_SEL (BIT(7)) +#define GPIO_SIG183_IN_SEL_M (BIT(7)) +#define GPIO_SIG183_IN_SEL_V 0x1 +#define GPIO_SIG183_IN_SEL_S 7 +/* GPIO_FUNC183_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC183_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC183_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC183_IN_INV_SEL_V 0x1 +#define GPIO_FUNC183_IN_INV_SEL_S 6 +/* GPIO_FUNC183_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC183_IN_SEL 0x0000003F +#define GPIO_FUNC183_IN_SEL_M ((GPIO_FUNC183_IN_SEL_V)<<(GPIO_FUNC183_IN_SEL_S)) +#define GPIO_FUNC183_IN_SEL_V 0x3F +#define GPIO_FUNC183_IN_SEL_S 0 + +#define GPIO_FUNC184_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0410) +/* GPIO_SIG184_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG184_IN_SEL (BIT(7)) +#define GPIO_SIG184_IN_SEL_M (BIT(7)) +#define GPIO_SIG184_IN_SEL_V 0x1 +#define GPIO_SIG184_IN_SEL_S 7 +/* GPIO_FUNC184_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC184_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC184_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC184_IN_INV_SEL_V 0x1 +#define GPIO_FUNC184_IN_INV_SEL_S 6 +/* GPIO_FUNC184_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC184_IN_SEL 0x0000003F +#define GPIO_FUNC184_IN_SEL_M ((GPIO_FUNC184_IN_SEL_V)<<(GPIO_FUNC184_IN_SEL_S)) +#define GPIO_FUNC184_IN_SEL_V 0x3F +#define GPIO_FUNC184_IN_SEL_S 0 + +#define GPIO_FUNC185_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0414) +/* GPIO_SIG185_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG185_IN_SEL (BIT(7)) +#define GPIO_SIG185_IN_SEL_M (BIT(7)) +#define GPIO_SIG185_IN_SEL_V 0x1 +#define GPIO_SIG185_IN_SEL_S 7 +/* GPIO_FUNC185_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC185_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC185_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC185_IN_INV_SEL_V 0x1 +#define GPIO_FUNC185_IN_INV_SEL_S 6 +/* GPIO_FUNC185_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC185_IN_SEL 0x0000003F +#define GPIO_FUNC185_IN_SEL_M ((GPIO_FUNC185_IN_SEL_V)<<(GPIO_FUNC185_IN_SEL_S)) +#define GPIO_FUNC185_IN_SEL_V 0x3F +#define GPIO_FUNC185_IN_SEL_S 0 + +#define GPIO_FUNC186_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0418) +/* GPIO_SIG186_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG186_IN_SEL (BIT(7)) +#define GPIO_SIG186_IN_SEL_M (BIT(7)) +#define GPIO_SIG186_IN_SEL_V 0x1 +#define GPIO_SIG186_IN_SEL_S 7 +/* GPIO_FUNC186_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC186_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC186_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC186_IN_INV_SEL_V 0x1 +#define GPIO_FUNC186_IN_INV_SEL_S 6 +/* GPIO_FUNC186_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC186_IN_SEL 0x0000003F +#define GPIO_FUNC186_IN_SEL_M ((GPIO_FUNC186_IN_SEL_V)<<(GPIO_FUNC186_IN_SEL_S)) +#define GPIO_FUNC186_IN_SEL_V 0x3F +#define GPIO_FUNC186_IN_SEL_S 0 + +#define GPIO_FUNC187_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x041c) +/* GPIO_SIG187_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG187_IN_SEL (BIT(7)) +#define GPIO_SIG187_IN_SEL_M (BIT(7)) +#define GPIO_SIG187_IN_SEL_V 0x1 +#define GPIO_SIG187_IN_SEL_S 7 +/* GPIO_FUNC187_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC187_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC187_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC187_IN_INV_SEL_V 0x1 +#define GPIO_FUNC187_IN_INV_SEL_S 6 +/* GPIO_FUNC187_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC187_IN_SEL 0x0000003F +#define GPIO_FUNC187_IN_SEL_M ((GPIO_FUNC187_IN_SEL_V)<<(GPIO_FUNC187_IN_SEL_S)) +#define GPIO_FUNC187_IN_SEL_V 0x3F +#define GPIO_FUNC187_IN_SEL_S 0 + +#define GPIO_FUNC188_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0420) +/* GPIO_SIG188_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG188_IN_SEL (BIT(7)) +#define GPIO_SIG188_IN_SEL_M (BIT(7)) +#define GPIO_SIG188_IN_SEL_V 0x1 +#define GPIO_SIG188_IN_SEL_S 7 +/* GPIO_FUNC188_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC188_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC188_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC188_IN_INV_SEL_V 0x1 +#define GPIO_FUNC188_IN_INV_SEL_S 6 +/* GPIO_FUNC188_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC188_IN_SEL 0x0000003F +#define GPIO_FUNC188_IN_SEL_M ((GPIO_FUNC188_IN_SEL_V)<<(GPIO_FUNC188_IN_SEL_S)) +#define GPIO_FUNC188_IN_SEL_V 0x3F +#define GPIO_FUNC188_IN_SEL_S 0 + +#define GPIO_FUNC189_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0424) +/* GPIO_SIG189_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG189_IN_SEL (BIT(7)) +#define GPIO_SIG189_IN_SEL_M (BIT(7)) +#define GPIO_SIG189_IN_SEL_V 0x1 +#define GPIO_SIG189_IN_SEL_S 7 +/* GPIO_FUNC189_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC189_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC189_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC189_IN_INV_SEL_V 0x1 +#define GPIO_FUNC189_IN_INV_SEL_S 6 +/* GPIO_FUNC189_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC189_IN_SEL 0x0000003F +#define GPIO_FUNC189_IN_SEL_M ((GPIO_FUNC189_IN_SEL_V)<<(GPIO_FUNC189_IN_SEL_S)) +#define GPIO_FUNC189_IN_SEL_V 0x3F +#define GPIO_FUNC189_IN_SEL_S 0 + +#define GPIO_FUNC190_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0428) +/* GPIO_SIG190_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG190_IN_SEL (BIT(7)) +#define GPIO_SIG190_IN_SEL_M (BIT(7)) +#define GPIO_SIG190_IN_SEL_V 0x1 +#define GPIO_SIG190_IN_SEL_S 7 +/* GPIO_FUNC190_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC190_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC190_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC190_IN_INV_SEL_V 0x1 +#define GPIO_FUNC190_IN_INV_SEL_S 6 +/* GPIO_FUNC190_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC190_IN_SEL 0x0000003F +#define GPIO_FUNC190_IN_SEL_M ((GPIO_FUNC190_IN_SEL_V)<<(GPIO_FUNC190_IN_SEL_S)) +#define GPIO_FUNC190_IN_SEL_V 0x3F +#define GPIO_FUNC190_IN_SEL_S 0 + +#define GPIO_FUNC191_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x042c) +/* GPIO_SIG191_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG191_IN_SEL (BIT(7)) +#define GPIO_SIG191_IN_SEL_M (BIT(7)) +#define GPIO_SIG191_IN_SEL_V 0x1 +#define GPIO_SIG191_IN_SEL_S 7 +/* GPIO_FUNC191_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC191_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC191_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC191_IN_INV_SEL_V 0x1 +#define GPIO_FUNC191_IN_INV_SEL_S 6 +/* GPIO_FUNC191_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC191_IN_SEL 0x0000003F +#define GPIO_FUNC191_IN_SEL_M ((GPIO_FUNC191_IN_SEL_V)<<(GPIO_FUNC191_IN_SEL_S)) +#define GPIO_FUNC191_IN_SEL_V 0x3F +#define GPIO_FUNC191_IN_SEL_S 0 + +#define GPIO_FUNC192_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0430) +/* GPIO_SIG192_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG192_IN_SEL (BIT(7)) +#define GPIO_SIG192_IN_SEL_M (BIT(7)) +#define GPIO_SIG192_IN_SEL_V 0x1 +#define GPIO_SIG192_IN_SEL_S 7 +/* GPIO_FUNC192_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC192_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC192_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC192_IN_INV_SEL_V 0x1 +#define GPIO_FUNC192_IN_INV_SEL_S 6 +/* GPIO_FUNC192_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC192_IN_SEL 0x0000003F +#define GPIO_FUNC192_IN_SEL_M ((GPIO_FUNC192_IN_SEL_V)<<(GPIO_FUNC192_IN_SEL_S)) +#define GPIO_FUNC192_IN_SEL_V 0x3F +#define GPIO_FUNC192_IN_SEL_S 0 + +#define GPIO_FUNC193_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0434) +/* GPIO_SIG193_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG193_IN_SEL (BIT(7)) +#define GPIO_SIG193_IN_SEL_M (BIT(7)) +#define GPIO_SIG193_IN_SEL_V 0x1 +#define GPIO_SIG193_IN_SEL_S 7 +/* GPIO_FUNC193_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC193_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC193_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC193_IN_INV_SEL_V 0x1 +#define GPIO_FUNC193_IN_INV_SEL_S 6 +/* GPIO_FUNC193_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC193_IN_SEL 0x0000003F +#define GPIO_FUNC193_IN_SEL_M ((GPIO_FUNC193_IN_SEL_V)<<(GPIO_FUNC193_IN_SEL_S)) +#define GPIO_FUNC193_IN_SEL_V 0x3F +#define GPIO_FUNC193_IN_SEL_S 0 + +#define GPIO_FUNC194_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0438) +/* GPIO_SIG194_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG194_IN_SEL (BIT(7)) +#define GPIO_SIG194_IN_SEL_M (BIT(7)) +#define GPIO_SIG194_IN_SEL_V 0x1 +#define GPIO_SIG194_IN_SEL_S 7 +/* GPIO_FUNC194_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC194_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC194_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC194_IN_INV_SEL_V 0x1 +#define GPIO_FUNC194_IN_INV_SEL_S 6 +/* GPIO_FUNC194_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC194_IN_SEL 0x0000003F +#define GPIO_FUNC194_IN_SEL_M ((GPIO_FUNC194_IN_SEL_V)<<(GPIO_FUNC194_IN_SEL_S)) +#define GPIO_FUNC194_IN_SEL_V 0x3F +#define GPIO_FUNC194_IN_SEL_S 0 + +#define GPIO_FUNC195_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x043c) +/* GPIO_SIG195_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG195_IN_SEL (BIT(7)) +#define GPIO_SIG195_IN_SEL_M (BIT(7)) +#define GPIO_SIG195_IN_SEL_V 0x1 +#define GPIO_SIG195_IN_SEL_S 7 +/* GPIO_FUNC195_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC195_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC195_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC195_IN_INV_SEL_V 0x1 +#define GPIO_FUNC195_IN_INV_SEL_S 6 +/* GPIO_FUNC195_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC195_IN_SEL 0x0000003F +#define GPIO_FUNC195_IN_SEL_M ((GPIO_FUNC195_IN_SEL_V)<<(GPIO_FUNC195_IN_SEL_S)) +#define GPIO_FUNC195_IN_SEL_V 0x3F +#define GPIO_FUNC195_IN_SEL_S 0 + +#define GPIO_FUNC196_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0440) +/* GPIO_SIG196_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG196_IN_SEL (BIT(7)) +#define GPIO_SIG196_IN_SEL_M (BIT(7)) +#define GPIO_SIG196_IN_SEL_V 0x1 +#define GPIO_SIG196_IN_SEL_S 7 +/* GPIO_FUNC196_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC196_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC196_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC196_IN_INV_SEL_V 0x1 +#define GPIO_FUNC196_IN_INV_SEL_S 6 +/* GPIO_FUNC196_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC196_IN_SEL 0x0000003F +#define GPIO_FUNC196_IN_SEL_M ((GPIO_FUNC196_IN_SEL_V)<<(GPIO_FUNC196_IN_SEL_S)) +#define GPIO_FUNC196_IN_SEL_V 0x3F +#define GPIO_FUNC196_IN_SEL_S 0 + +#define GPIO_FUNC197_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0444) +/* GPIO_SIG197_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG197_IN_SEL (BIT(7)) +#define GPIO_SIG197_IN_SEL_M (BIT(7)) +#define GPIO_SIG197_IN_SEL_V 0x1 +#define GPIO_SIG197_IN_SEL_S 7 +/* GPIO_FUNC197_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC197_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC197_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC197_IN_INV_SEL_V 0x1 +#define GPIO_FUNC197_IN_INV_SEL_S 6 +/* GPIO_FUNC197_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC197_IN_SEL 0x0000003F +#define GPIO_FUNC197_IN_SEL_M ((GPIO_FUNC197_IN_SEL_V)<<(GPIO_FUNC197_IN_SEL_S)) +#define GPIO_FUNC197_IN_SEL_V 0x3F +#define GPIO_FUNC197_IN_SEL_S 0 + +#define GPIO_FUNC198_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0448) +/* GPIO_SIG198_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG198_IN_SEL (BIT(7)) +#define GPIO_SIG198_IN_SEL_M (BIT(7)) +#define GPIO_SIG198_IN_SEL_V 0x1 +#define GPIO_SIG198_IN_SEL_S 7 +/* GPIO_FUNC198_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC198_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC198_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC198_IN_INV_SEL_V 0x1 +#define GPIO_FUNC198_IN_INV_SEL_S 6 +/* GPIO_FUNC198_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC198_IN_SEL 0x0000003F +#define GPIO_FUNC198_IN_SEL_M ((GPIO_FUNC198_IN_SEL_V)<<(GPIO_FUNC198_IN_SEL_S)) +#define GPIO_FUNC198_IN_SEL_V 0x3F +#define GPIO_FUNC198_IN_SEL_S 0 + +#define GPIO_FUNC199_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x044c) +/* GPIO_SIG199_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG199_IN_SEL (BIT(7)) +#define GPIO_SIG199_IN_SEL_M (BIT(7)) +#define GPIO_SIG199_IN_SEL_V 0x1 +#define GPIO_SIG199_IN_SEL_S 7 +/* GPIO_FUNC199_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC199_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC199_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC199_IN_INV_SEL_V 0x1 +#define GPIO_FUNC199_IN_INV_SEL_S 6 +/* GPIO_FUNC199_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC199_IN_SEL 0x0000003F +#define GPIO_FUNC199_IN_SEL_M ((GPIO_FUNC199_IN_SEL_V)<<(GPIO_FUNC199_IN_SEL_S)) +#define GPIO_FUNC199_IN_SEL_V 0x3F +#define GPIO_FUNC199_IN_SEL_S 0 + +#define GPIO_FUNC200_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0450) +/* GPIO_SIG200_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG200_IN_SEL (BIT(7)) +#define GPIO_SIG200_IN_SEL_M (BIT(7)) +#define GPIO_SIG200_IN_SEL_V 0x1 +#define GPIO_SIG200_IN_SEL_S 7 +/* GPIO_FUNC200_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC200_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC200_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC200_IN_INV_SEL_V 0x1 +#define GPIO_FUNC200_IN_INV_SEL_S 6 +/* GPIO_FUNC200_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC200_IN_SEL 0x0000003F +#define GPIO_FUNC200_IN_SEL_M ((GPIO_FUNC200_IN_SEL_V)<<(GPIO_FUNC200_IN_SEL_S)) +#define GPIO_FUNC200_IN_SEL_V 0x3F +#define GPIO_FUNC200_IN_SEL_S 0 + +#define GPIO_FUNC201_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0454) +/* GPIO_SIG201_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG201_IN_SEL (BIT(7)) +#define GPIO_SIG201_IN_SEL_M (BIT(7)) +#define GPIO_SIG201_IN_SEL_V 0x1 +#define GPIO_SIG201_IN_SEL_S 7 +/* GPIO_FUNC201_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC201_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC201_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC201_IN_INV_SEL_V 0x1 +#define GPIO_FUNC201_IN_INV_SEL_S 6 +/* GPIO_FUNC201_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC201_IN_SEL 0x0000003F +#define GPIO_FUNC201_IN_SEL_M ((GPIO_FUNC201_IN_SEL_V)<<(GPIO_FUNC201_IN_SEL_S)) +#define GPIO_FUNC201_IN_SEL_V 0x3F +#define GPIO_FUNC201_IN_SEL_S 0 + +#define GPIO_FUNC202_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0458) +/* GPIO_SIG202_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG202_IN_SEL (BIT(7)) +#define GPIO_SIG202_IN_SEL_M (BIT(7)) +#define GPIO_SIG202_IN_SEL_V 0x1 +#define GPIO_SIG202_IN_SEL_S 7 +/* GPIO_FUNC202_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC202_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC202_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC202_IN_INV_SEL_V 0x1 +#define GPIO_FUNC202_IN_INV_SEL_S 6 +/* GPIO_FUNC202_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC202_IN_SEL 0x0000003F +#define GPIO_FUNC202_IN_SEL_M ((GPIO_FUNC202_IN_SEL_V)<<(GPIO_FUNC202_IN_SEL_S)) +#define GPIO_FUNC202_IN_SEL_V 0x3F +#define GPIO_FUNC202_IN_SEL_S 0 + +#define GPIO_FUNC203_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x045c) +/* GPIO_SIG203_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG203_IN_SEL (BIT(7)) +#define GPIO_SIG203_IN_SEL_M (BIT(7)) +#define GPIO_SIG203_IN_SEL_V 0x1 +#define GPIO_SIG203_IN_SEL_S 7 +/* GPIO_FUNC203_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC203_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC203_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC203_IN_INV_SEL_V 0x1 +#define GPIO_FUNC203_IN_INV_SEL_S 6 +/* GPIO_FUNC203_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC203_IN_SEL 0x0000003F +#define GPIO_FUNC203_IN_SEL_M ((GPIO_FUNC203_IN_SEL_V)<<(GPIO_FUNC203_IN_SEL_S)) +#define GPIO_FUNC203_IN_SEL_V 0x3F +#define GPIO_FUNC203_IN_SEL_S 0 + +#define GPIO_FUNC204_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0460) +/* GPIO_SIG204_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG204_IN_SEL (BIT(7)) +#define GPIO_SIG204_IN_SEL_M (BIT(7)) +#define GPIO_SIG204_IN_SEL_V 0x1 +#define GPIO_SIG204_IN_SEL_S 7 +/* GPIO_FUNC204_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC204_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC204_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC204_IN_INV_SEL_V 0x1 +#define GPIO_FUNC204_IN_INV_SEL_S 6 +/* GPIO_FUNC204_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC204_IN_SEL 0x0000003F +#define GPIO_FUNC204_IN_SEL_M ((GPIO_FUNC204_IN_SEL_V)<<(GPIO_FUNC204_IN_SEL_S)) +#define GPIO_FUNC204_IN_SEL_V 0x3F +#define GPIO_FUNC204_IN_SEL_S 0 + +#define GPIO_FUNC205_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0464) +/* GPIO_SIG205_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG205_IN_SEL (BIT(7)) +#define GPIO_SIG205_IN_SEL_M (BIT(7)) +#define GPIO_SIG205_IN_SEL_V 0x1 +#define GPIO_SIG205_IN_SEL_S 7 +/* GPIO_FUNC205_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC205_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC205_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC205_IN_INV_SEL_V 0x1 +#define GPIO_FUNC205_IN_INV_SEL_S 6 +/* GPIO_FUNC205_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC205_IN_SEL 0x0000003F +#define GPIO_FUNC205_IN_SEL_M ((GPIO_FUNC205_IN_SEL_V)<<(GPIO_FUNC205_IN_SEL_S)) +#define GPIO_FUNC205_IN_SEL_V 0x3F +#define GPIO_FUNC205_IN_SEL_S 0 + +#define GPIO_FUNC206_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0468) +/* GPIO_SIG206_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG206_IN_SEL (BIT(7)) +#define GPIO_SIG206_IN_SEL_M (BIT(7)) +#define GPIO_SIG206_IN_SEL_V 0x1 +#define GPIO_SIG206_IN_SEL_S 7 +/* GPIO_FUNC206_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC206_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC206_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC206_IN_INV_SEL_V 0x1 +#define GPIO_FUNC206_IN_INV_SEL_S 6 +/* GPIO_FUNC206_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC206_IN_SEL 0x0000003F +#define GPIO_FUNC206_IN_SEL_M ((GPIO_FUNC206_IN_SEL_V)<<(GPIO_FUNC206_IN_SEL_S)) +#define GPIO_FUNC206_IN_SEL_V 0x3F +#define GPIO_FUNC206_IN_SEL_S 0 + +#define GPIO_FUNC207_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x046c) +/* GPIO_SIG207_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG207_IN_SEL (BIT(7)) +#define GPIO_SIG207_IN_SEL_M (BIT(7)) +#define GPIO_SIG207_IN_SEL_V 0x1 +#define GPIO_SIG207_IN_SEL_S 7 +/* GPIO_FUNC207_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC207_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC207_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC207_IN_INV_SEL_V 0x1 +#define GPIO_FUNC207_IN_INV_SEL_S 6 +/* GPIO_FUNC207_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC207_IN_SEL 0x0000003F +#define GPIO_FUNC207_IN_SEL_M ((GPIO_FUNC207_IN_SEL_V)<<(GPIO_FUNC207_IN_SEL_S)) +#define GPIO_FUNC207_IN_SEL_V 0x3F +#define GPIO_FUNC207_IN_SEL_S 0 + +#define GPIO_FUNC208_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0470) +/* GPIO_SIG208_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG208_IN_SEL (BIT(7)) +#define GPIO_SIG208_IN_SEL_M (BIT(7)) +#define GPIO_SIG208_IN_SEL_V 0x1 +#define GPIO_SIG208_IN_SEL_S 7 +/* GPIO_FUNC208_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC208_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC208_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC208_IN_INV_SEL_V 0x1 +#define GPIO_FUNC208_IN_INV_SEL_S 6 +/* GPIO_FUNC208_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC208_IN_SEL 0x0000003F +#define GPIO_FUNC208_IN_SEL_M ((GPIO_FUNC208_IN_SEL_V)<<(GPIO_FUNC208_IN_SEL_S)) +#define GPIO_FUNC208_IN_SEL_V 0x3F +#define GPIO_FUNC208_IN_SEL_S 0 + +#define GPIO_FUNC209_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0474) +/* GPIO_SIG209_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG209_IN_SEL (BIT(7)) +#define GPIO_SIG209_IN_SEL_M (BIT(7)) +#define GPIO_SIG209_IN_SEL_V 0x1 +#define GPIO_SIG209_IN_SEL_S 7 +/* GPIO_FUNC209_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC209_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC209_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC209_IN_INV_SEL_V 0x1 +#define GPIO_FUNC209_IN_INV_SEL_S 6 +/* GPIO_FUNC209_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC209_IN_SEL 0x0000003F +#define GPIO_FUNC209_IN_SEL_M ((GPIO_FUNC209_IN_SEL_V)<<(GPIO_FUNC209_IN_SEL_S)) +#define GPIO_FUNC209_IN_SEL_V 0x3F +#define GPIO_FUNC209_IN_SEL_S 0 + +#define GPIO_FUNC210_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0478) +/* GPIO_SIG210_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG210_IN_SEL (BIT(7)) +#define GPIO_SIG210_IN_SEL_M (BIT(7)) +#define GPIO_SIG210_IN_SEL_V 0x1 +#define GPIO_SIG210_IN_SEL_S 7 +/* GPIO_FUNC210_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC210_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC210_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC210_IN_INV_SEL_V 0x1 +#define GPIO_FUNC210_IN_INV_SEL_S 6 +/* GPIO_FUNC210_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC210_IN_SEL 0x0000003F +#define GPIO_FUNC210_IN_SEL_M ((GPIO_FUNC210_IN_SEL_V)<<(GPIO_FUNC210_IN_SEL_S)) +#define GPIO_FUNC210_IN_SEL_V 0x3F +#define GPIO_FUNC210_IN_SEL_S 0 + +#define GPIO_FUNC211_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x047c) +/* GPIO_SIG211_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG211_IN_SEL (BIT(7)) +#define GPIO_SIG211_IN_SEL_M (BIT(7)) +#define GPIO_SIG211_IN_SEL_V 0x1 +#define GPIO_SIG211_IN_SEL_S 7 +/* GPIO_FUNC211_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC211_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC211_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC211_IN_INV_SEL_V 0x1 +#define GPIO_FUNC211_IN_INV_SEL_S 6 +/* GPIO_FUNC211_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC211_IN_SEL 0x0000003F +#define GPIO_FUNC211_IN_SEL_M ((GPIO_FUNC211_IN_SEL_V)<<(GPIO_FUNC211_IN_SEL_S)) +#define GPIO_FUNC211_IN_SEL_V 0x3F +#define GPIO_FUNC211_IN_SEL_S 0 + +#define GPIO_FUNC212_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0480) +/* GPIO_SIG212_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG212_IN_SEL (BIT(7)) +#define GPIO_SIG212_IN_SEL_M (BIT(7)) +#define GPIO_SIG212_IN_SEL_V 0x1 +#define GPIO_SIG212_IN_SEL_S 7 +/* GPIO_FUNC212_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC212_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC212_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC212_IN_INV_SEL_V 0x1 +#define GPIO_FUNC212_IN_INV_SEL_S 6 +/* GPIO_FUNC212_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC212_IN_SEL 0x0000003F +#define GPIO_FUNC212_IN_SEL_M ((GPIO_FUNC212_IN_SEL_V)<<(GPIO_FUNC212_IN_SEL_S)) +#define GPIO_FUNC212_IN_SEL_V 0x3F +#define GPIO_FUNC212_IN_SEL_S 0 + +#define GPIO_FUNC213_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0484) +/* GPIO_SIG213_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG213_IN_SEL (BIT(7)) +#define GPIO_SIG213_IN_SEL_M (BIT(7)) +#define GPIO_SIG213_IN_SEL_V 0x1 +#define GPIO_SIG213_IN_SEL_S 7 +/* GPIO_FUNC213_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC213_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC213_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC213_IN_INV_SEL_V 0x1 +#define GPIO_FUNC213_IN_INV_SEL_S 6 +/* GPIO_FUNC213_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC213_IN_SEL 0x0000003F +#define GPIO_FUNC213_IN_SEL_M ((GPIO_FUNC213_IN_SEL_V)<<(GPIO_FUNC213_IN_SEL_S)) +#define GPIO_FUNC213_IN_SEL_V 0x3F +#define GPIO_FUNC213_IN_SEL_S 0 + +#define GPIO_FUNC214_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0488) +/* GPIO_SIG214_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG214_IN_SEL (BIT(7)) +#define GPIO_SIG214_IN_SEL_M (BIT(7)) +#define GPIO_SIG214_IN_SEL_V 0x1 +#define GPIO_SIG214_IN_SEL_S 7 +/* GPIO_FUNC214_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC214_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC214_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC214_IN_INV_SEL_V 0x1 +#define GPIO_FUNC214_IN_INV_SEL_S 6 +/* GPIO_FUNC214_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC214_IN_SEL 0x0000003F +#define GPIO_FUNC214_IN_SEL_M ((GPIO_FUNC214_IN_SEL_V)<<(GPIO_FUNC214_IN_SEL_S)) +#define GPIO_FUNC214_IN_SEL_V 0x3F +#define GPIO_FUNC214_IN_SEL_S 0 + +#define GPIO_FUNC215_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x048c) +/* GPIO_SIG215_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG215_IN_SEL (BIT(7)) +#define GPIO_SIG215_IN_SEL_M (BIT(7)) +#define GPIO_SIG215_IN_SEL_V 0x1 +#define GPIO_SIG215_IN_SEL_S 7 +/* GPIO_FUNC215_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC215_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC215_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC215_IN_INV_SEL_V 0x1 +#define GPIO_FUNC215_IN_INV_SEL_S 6 +/* GPIO_FUNC215_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC215_IN_SEL 0x0000003F +#define GPIO_FUNC215_IN_SEL_M ((GPIO_FUNC215_IN_SEL_V)<<(GPIO_FUNC215_IN_SEL_S)) +#define GPIO_FUNC215_IN_SEL_V 0x3F +#define GPIO_FUNC215_IN_SEL_S 0 + +#define GPIO_FUNC216_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0490) +/* GPIO_SIG216_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG216_IN_SEL (BIT(7)) +#define GPIO_SIG216_IN_SEL_M (BIT(7)) +#define GPIO_SIG216_IN_SEL_V 0x1 +#define GPIO_SIG216_IN_SEL_S 7 +/* GPIO_FUNC216_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC216_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC216_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC216_IN_INV_SEL_V 0x1 +#define GPIO_FUNC216_IN_INV_SEL_S 6 +/* GPIO_FUNC216_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC216_IN_SEL 0x0000003F +#define GPIO_FUNC216_IN_SEL_M ((GPIO_FUNC216_IN_SEL_V)<<(GPIO_FUNC216_IN_SEL_S)) +#define GPIO_FUNC216_IN_SEL_V 0x3F +#define GPIO_FUNC216_IN_SEL_S 0 + +#define GPIO_FUNC217_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0494) +/* GPIO_SIG217_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG217_IN_SEL (BIT(7)) +#define GPIO_SIG217_IN_SEL_M (BIT(7)) +#define GPIO_SIG217_IN_SEL_V 0x1 +#define GPIO_SIG217_IN_SEL_S 7 +/* GPIO_FUNC217_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC217_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC217_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC217_IN_INV_SEL_V 0x1 +#define GPIO_FUNC217_IN_INV_SEL_S 6 +/* GPIO_FUNC217_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC217_IN_SEL 0x0000003F +#define GPIO_FUNC217_IN_SEL_M ((GPIO_FUNC217_IN_SEL_V)<<(GPIO_FUNC217_IN_SEL_S)) +#define GPIO_FUNC217_IN_SEL_V 0x3F +#define GPIO_FUNC217_IN_SEL_S 0 + +#define GPIO_FUNC218_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0498) +/* GPIO_SIG218_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG218_IN_SEL (BIT(7)) +#define GPIO_SIG218_IN_SEL_M (BIT(7)) +#define GPIO_SIG218_IN_SEL_V 0x1 +#define GPIO_SIG218_IN_SEL_S 7 +/* GPIO_FUNC218_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC218_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC218_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC218_IN_INV_SEL_V 0x1 +#define GPIO_FUNC218_IN_INV_SEL_S 6 +/* GPIO_FUNC218_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC218_IN_SEL 0x0000003F +#define GPIO_FUNC218_IN_SEL_M ((GPIO_FUNC218_IN_SEL_V)<<(GPIO_FUNC218_IN_SEL_S)) +#define GPIO_FUNC218_IN_SEL_V 0x3F +#define GPIO_FUNC218_IN_SEL_S 0 + +#define GPIO_FUNC219_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x049c) +/* GPIO_SIG219_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG219_IN_SEL (BIT(7)) +#define GPIO_SIG219_IN_SEL_M (BIT(7)) +#define GPIO_SIG219_IN_SEL_V 0x1 +#define GPIO_SIG219_IN_SEL_S 7 +/* GPIO_FUNC219_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC219_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC219_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC219_IN_INV_SEL_V 0x1 +#define GPIO_FUNC219_IN_INV_SEL_S 6 +/* GPIO_FUNC219_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC219_IN_SEL 0x0000003F +#define GPIO_FUNC219_IN_SEL_M ((GPIO_FUNC219_IN_SEL_V)<<(GPIO_FUNC219_IN_SEL_S)) +#define GPIO_FUNC219_IN_SEL_V 0x3F +#define GPIO_FUNC219_IN_SEL_S 0 + +#define GPIO_FUNC220_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x04a0) +/* GPIO_SIG220_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG220_IN_SEL (BIT(7)) +#define GPIO_SIG220_IN_SEL_M (BIT(7)) +#define GPIO_SIG220_IN_SEL_V 0x1 +#define GPIO_SIG220_IN_SEL_S 7 +/* GPIO_FUNC220_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC220_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC220_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC220_IN_INV_SEL_V 0x1 +#define GPIO_FUNC220_IN_INV_SEL_S 6 +/* GPIO_FUNC220_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC220_IN_SEL 0x0000003F +#define GPIO_FUNC220_IN_SEL_M ((GPIO_FUNC220_IN_SEL_V)<<(GPIO_FUNC220_IN_SEL_S)) +#define GPIO_FUNC220_IN_SEL_V 0x3F +#define GPIO_FUNC220_IN_SEL_S 0 + +#define GPIO_FUNC221_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x04a4) +/* GPIO_SIG221_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG221_IN_SEL (BIT(7)) +#define GPIO_SIG221_IN_SEL_M (BIT(7)) +#define GPIO_SIG221_IN_SEL_V 0x1 +#define GPIO_SIG221_IN_SEL_S 7 +/* GPIO_FUNC221_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC221_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC221_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC221_IN_INV_SEL_V 0x1 +#define GPIO_FUNC221_IN_INV_SEL_S 6 +/* GPIO_FUNC221_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC221_IN_SEL 0x0000003F +#define GPIO_FUNC221_IN_SEL_M ((GPIO_FUNC221_IN_SEL_V)<<(GPIO_FUNC221_IN_SEL_S)) +#define GPIO_FUNC221_IN_SEL_V 0x3F +#define GPIO_FUNC221_IN_SEL_S 0 + +#define GPIO_FUNC222_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x04a8) +/* GPIO_SIG222_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG222_IN_SEL (BIT(7)) +#define GPIO_SIG222_IN_SEL_M (BIT(7)) +#define GPIO_SIG222_IN_SEL_V 0x1 +#define GPIO_SIG222_IN_SEL_S 7 +/* GPIO_FUNC222_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC222_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC222_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC222_IN_INV_SEL_V 0x1 +#define GPIO_FUNC222_IN_INV_SEL_S 6 +/* GPIO_FUNC222_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC222_IN_SEL 0x0000003F +#define GPIO_FUNC222_IN_SEL_M ((GPIO_FUNC222_IN_SEL_V)<<(GPIO_FUNC222_IN_SEL_S)) +#define GPIO_FUNC222_IN_SEL_V 0x3F +#define GPIO_FUNC222_IN_SEL_S 0 + +#define GPIO_FUNC223_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x04ac) +/* GPIO_SIG223_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG223_IN_SEL (BIT(7)) +#define GPIO_SIG223_IN_SEL_M (BIT(7)) +#define GPIO_SIG223_IN_SEL_V 0x1 +#define GPIO_SIG223_IN_SEL_S 7 +/* GPIO_FUNC223_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC223_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC223_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC223_IN_INV_SEL_V 0x1 +#define GPIO_FUNC223_IN_INV_SEL_S 6 +/* GPIO_FUNC223_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC223_IN_SEL 0x0000003F +#define GPIO_FUNC223_IN_SEL_M ((GPIO_FUNC223_IN_SEL_V)<<(GPIO_FUNC223_IN_SEL_S)) +#define GPIO_FUNC223_IN_SEL_V 0x3F +#define GPIO_FUNC223_IN_SEL_S 0 + +#define GPIO_FUNC224_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x04b0) +/* GPIO_SIG224_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG224_IN_SEL (BIT(7)) +#define GPIO_SIG224_IN_SEL_M (BIT(7)) +#define GPIO_SIG224_IN_SEL_V 0x1 +#define GPIO_SIG224_IN_SEL_S 7 +/* GPIO_FUNC224_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC224_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC224_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC224_IN_INV_SEL_V 0x1 +#define GPIO_FUNC224_IN_INV_SEL_S 6 +/* GPIO_FUNC224_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC224_IN_SEL 0x0000003F +#define GPIO_FUNC224_IN_SEL_M ((GPIO_FUNC224_IN_SEL_V)<<(GPIO_FUNC224_IN_SEL_S)) +#define GPIO_FUNC224_IN_SEL_V 0x3F +#define GPIO_FUNC224_IN_SEL_S 0 + +#define GPIO_FUNC225_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x04b4) +/* GPIO_SIG225_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG225_IN_SEL (BIT(7)) +#define GPIO_SIG225_IN_SEL_M (BIT(7)) +#define GPIO_SIG225_IN_SEL_V 0x1 +#define GPIO_SIG225_IN_SEL_S 7 +/* GPIO_FUNC225_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC225_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC225_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC225_IN_INV_SEL_V 0x1 +#define GPIO_FUNC225_IN_INV_SEL_S 6 +/* GPIO_FUNC225_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC225_IN_SEL 0x0000003F +#define GPIO_FUNC225_IN_SEL_M ((GPIO_FUNC225_IN_SEL_V)<<(GPIO_FUNC225_IN_SEL_S)) +#define GPIO_FUNC225_IN_SEL_V 0x3F +#define GPIO_FUNC225_IN_SEL_S 0 + +#define GPIO_FUNC226_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x04b8) +/* GPIO_SIG226_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG226_IN_SEL (BIT(7)) +#define GPIO_SIG226_IN_SEL_M (BIT(7)) +#define GPIO_SIG226_IN_SEL_V 0x1 +#define GPIO_SIG226_IN_SEL_S 7 +/* GPIO_FUNC226_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC226_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC226_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC226_IN_INV_SEL_V 0x1 +#define GPIO_FUNC226_IN_INV_SEL_S 6 +/* GPIO_FUNC226_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC226_IN_SEL 0x0000003F +#define GPIO_FUNC226_IN_SEL_M ((GPIO_FUNC226_IN_SEL_V)<<(GPIO_FUNC226_IN_SEL_S)) +#define GPIO_FUNC226_IN_SEL_V 0x3F +#define GPIO_FUNC226_IN_SEL_S 0 + +#define GPIO_FUNC227_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x04bc) +/* GPIO_SIG227_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG227_IN_SEL (BIT(7)) +#define GPIO_SIG227_IN_SEL_M (BIT(7)) +#define GPIO_SIG227_IN_SEL_V 0x1 +#define GPIO_SIG227_IN_SEL_S 7 +/* GPIO_FUNC227_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC227_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC227_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC227_IN_INV_SEL_V 0x1 +#define GPIO_FUNC227_IN_INV_SEL_S 6 +/* GPIO_FUNC227_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC227_IN_SEL 0x0000003F +#define GPIO_FUNC227_IN_SEL_M ((GPIO_FUNC227_IN_SEL_V)<<(GPIO_FUNC227_IN_SEL_S)) +#define GPIO_FUNC227_IN_SEL_V 0x3F +#define GPIO_FUNC227_IN_SEL_S 0 + +#define GPIO_FUNC228_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x04c0) +/* GPIO_SIG228_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG228_IN_SEL (BIT(7)) +#define GPIO_SIG228_IN_SEL_M (BIT(7)) +#define GPIO_SIG228_IN_SEL_V 0x1 +#define GPIO_SIG228_IN_SEL_S 7 +/* GPIO_FUNC228_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC228_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC228_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC228_IN_INV_SEL_V 0x1 +#define GPIO_FUNC228_IN_INV_SEL_S 6 +/* GPIO_FUNC228_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC228_IN_SEL 0x0000003F +#define GPIO_FUNC228_IN_SEL_M ((GPIO_FUNC228_IN_SEL_V)<<(GPIO_FUNC228_IN_SEL_S)) +#define GPIO_FUNC228_IN_SEL_V 0x3F +#define GPIO_FUNC228_IN_SEL_S 0 + +#define GPIO_FUNC229_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x04c4) +/* GPIO_SIG229_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG229_IN_SEL (BIT(7)) +#define GPIO_SIG229_IN_SEL_M (BIT(7)) +#define GPIO_SIG229_IN_SEL_V 0x1 +#define GPIO_SIG229_IN_SEL_S 7 +/* GPIO_FUNC229_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC229_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC229_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC229_IN_INV_SEL_V 0x1 +#define GPIO_FUNC229_IN_INV_SEL_S 6 +/* GPIO_FUNC229_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC229_IN_SEL 0x0000003F +#define GPIO_FUNC229_IN_SEL_M ((GPIO_FUNC229_IN_SEL_V)<<(GPIO_FUNC229_IN_SEL_S)) +#define GPIO_FUNC229_IN_SEL_V 0x3F +#define GPIO_FUNC229_IN_SEL_S 0 + +#define GPIO_FUNC230_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x04c8) +/* GPIO_SIG230_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG230_IN_SEL (BIT(7)) +#define GPIO_SIG230_IN_SEL_M (BIT(7)) +#define GPIO_SIG230_IN_SEL_V 0x1 +#define GPIO_SIG230_IN_SEL_S 7 +/* GPIO_FUNC230_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC230_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC230_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC230_IN_INV_SEL_V 0x1 +#define GPIO_FUNC230_IN_INV_SEL_S 6 +/* GPIO_FUNC230_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC230_IN_SEL 0x0000003F +#define GPIO_FUNC230_IN_SEL_M ((GPIO_FUNC230_IN_SEL_V)<<(GPIO_FUNC230_IN_SEL_S)) +#define GPIO_FUNC230_IN_SEL_V 0x3F +#define GPIO_FUNC230_IN_SEL_S 0 + +#define GPIO_FUNC231_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x04cc) +/* GPIO_SIG231_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG231_IN_SEL (BIT(7)) +#define GPIO_SIG231_IN_SEL_M (BIT(7)) +#define GPIO_SIG231_IN_SEL_V 0x1 +#define GPIO_SIG231_IN_SEL_S 7 +/* GPIO_FUNC231_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC231_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC231_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC231_IN_INV_SEL_V 0x1 +#define GPIO_FUNC231_IN_INV_SEL_S 6 +/* GPIO_FUNC231_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC231_IN_SEL 0x0000003F +#define GPIO_FUNC231_IN_SEL_M ((GPIO_FUNC231_IN_SEL_V)<<(GPIO_FUNC231_IN_SEL_S)) +#define GPIO_FUNC231_IN_SEL_V 0x3F +#define GPIO_FUNC231_IN_SEL_S 0 + +#define GPIO_FUNC232_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x04d0) +/* GPIO_SIG232_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG232_IN_SEL (BIT(7)) +#define GPIO_SIG232_IN_SEL_M (BIT(7)) +#define GPIO_SIG232_IN_SEL_V 0x1 +#define GPIO_SIG232_IN_SEL_S 7 +/* GPIO_FUNC232_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC232_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC232_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC232_IN_INV_SEL_V 0x1 +#define GPIO_FUNC232_IN_INV_SEL_S 6 +/* GPIO_FUNC232_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC232_IN_SEL 0x0000003F +#define GPIO_FUNC232_IN_SEL_M ((GPIO_FUNC232_IN_SEL_V)<<(GPIO_FUNC232_IN_SEL_S)) +#define GPIO_FUNC232_IN_SEL_V 0x3F +#define GPIO_FUNC232_IN_SEL_S 0 + +#define GPIO_FUNC233_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x04d4) +/* GPIO_SIG233_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG233_IN_SEL (BIT(7)) +#define GPIO_SIG233_IN_SEL_M (BIT(7)) +#define GPIO_SIG233_IN_SEL_V 0x1 +#define GPIO_SIG233_IN_SEL_S 7 +/* GPIO_FUNC233_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC233_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC233_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC233_IN_INV_SEL_V 0x1 +#define GPIO_FUNC233_IN_INV_SEL_S 6 +/* GPIO_FUNC233_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC233_IN_SEL 0x0000003F +#define GPIO_FUNC233_IN_SEL_M ((GPIO_FUNC233_IN_SEL_V)<<(GPIO_FUNC233_IN_SEL_S)) +#define GPIO_FUNC233_IN_SEL_V 0x3F +#define GPIO_FUNC233_IN_SEL_S 0 + +#define GPIO_FUNC234_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x04d8) +/* GPIO_SIG234_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG234_IN_SEL (BIT(7)) +#define GPIO_SIG234_IN_SEL_M (BIT(7)) +#define GPIO_SIG234_IN_SEL_V 0x1 +#define GPIO_SIG234_IN_SEL_S 7 +/* GPIO_FUNC234_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC234_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC234_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC234_IN_INV_SEL_V 0x1 +#define GPIO_FUNC234_IN_INV_SEL_S 6 +/* GPIO_FUNC234_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC234_IN_SEL 0x0000003F +#define GPIO_FUNC234_IN_SEL_M ((GPIO_FUNC234_IN_SEL_V)<<(GPIO_FUNC234_IN_SEL_S)) +#define GPIO_FUNC234_IN_SEL_V 0x3F +#define GPIO_FUNC234_IN_SEL_S 0 + +#define GPIO_FUNC235_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x04dc) +/* GPIO_SIG235_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG235_IN_SEL (BIT(7)) +#define GPIO_SIG235_IN_SEL_M (BIT(7)) +#define GPIO_SIG235_IN_SEL_V 0x1 +#define GPIO_SIG235_IN_SEL_S 7 +/* GPIO_FUNC235_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC235_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC235_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC235_IN_INV_SEL_V 0x1 +#define GPIO_FUNC235_IN_INV_SEL_S 6 +/* GPIO_FUNC235_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC235_IN_SEL 0x0000003F +#define GPIO_FUNC235_IN_SEL_M ((GPIO_FUNC235_IN_SEL_V)<<(GPIO_FUNC235_IN_SEL_S)) +#define GPIO_FUNC235_IN_SEL_V 0x3F +#define GPIO_FUNC235_IN_SEL_S 0 + +#define GPIO_FUNC236_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x04e0) +/* GPIO_SIG236_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG236_IN_SEL (BIT(7)) +#define GPIO_SIG236_IN_SEL_M (BIT(7)) +#define GPIO_SIG236_IN_SEL_V 0x1 +#define GPIO_SIG236_IN_SEL_S 7 +/* GPIO_FUNC236_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC236_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC236_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC236_IN_INV_SEL_V 0x1 +#define GPIO_FUNC236_IN_INV_SEL_S 6 +/* GPIO_FUNC236_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC236_IN_SEL 0x0000003F +#define GPIO_FUNC236_IN_SEL_M ((GPIO_FUNC236_IN_SEL_V)<<(GPIO_FUNC236_IN_SEL_S)) +#define GPIO_FUNC236_IN_SEL_V 0x3F +#define GPIO_FUNC236_IN_SEL_S 0 + +#define GPIO_FUNC237_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x04e4) +/* GPIO_SIG237_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG237_IN_SEL (BIT(7)) +#define GPIO_SIG237_IN_SEL_M (BIT(7)) +#define GPIO_SIG237_IN_SEL_V 0x1 +#define GPIO_SIG237_IN_SEL_S 7 +/* GPIO_FUNC237_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC237_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC237_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC237_IN_INV_SEL_V 0x1 +#define GPIO_FUNC237_IN_INV_SEL_S 6 +/* GPIO_FUNC237_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC237_IN_SEL 0x0000003F +#define GPIO_FUNC237_IN_SEL_M ((GPIO_FUNC237_IN_SEL_V)<<(GPIO_FUNC237_IN_SEL_S)) +#define GPIO_FUNC237_IN_SEL_V 0x3F +#define GPIO_FUNC237_IN_SEL_S 0 + +#define GPIO_FUNC238_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x04e8) +/* GPIO_SIG238_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG238_IN_SEL (BIT(7)) +#define GPIO_SIG238_IN_SEL_M (BIT(7)) +#define GPIO_SIG238_IN_SEL_V 0x1 +#define GPIO_SIG238_IN_SEL_S 7 +/* GPIO_FUNC238_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC238_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC238_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC238_IN_INV_SEL_V 0x1 +#define GPIO_FUNC238_IN_INV_SEL_S 6 +/* GPIO_FUNC238_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC238_IN_SEL 0x0000003F +#define GPIO_FUNC238_IN_SEL_M ((GPIO_FUNC238_IN_SEL_V)<<(GPIO_FUNC238_IN_SEL_S)) +#define GPIO_FUNC238_IN_SEL_V 0x3F +#define GPIO_FUNC238_IN_SEL_S 0 + +#define GPIO_FUNC239_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x04ec) +/* GPIO_SIG239_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG239_IN_SEL (BIT(7)) +#define GPIO_SIG239_IN_SEL_M (BIT(7)) +#define GPIO_SIG239_IN_SEL_V 0x1 +#define GPIO_SIG239_IN_SEL_S 7 +/* GPIO_FUNC239_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC239_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC239_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC239_IN_INV_SEL_V 0x1 +#define GPIO_FUNC239_IN_INV_SEL_S 6 +/* GPIO_FUNC239_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC239_IN_SEL 0x0000003F +#define GPIO_FUNC239_IN_SEL_M ((GPIO_FUNC239_IN_SEL_V)<<(GPIO_FUNC239_IN_SEL_S)) +#define GPIO_FUNC239_IN_SEL_V 0x3F +#define GPIO_FUNC239_IN_SEL_S 0 + +#define GPIO_FUNC240_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x04f0) +/* GPIO_SIG240_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG240_IN_SEL (BIT(7)) +#define GPIO_SIG240_IN_SEL_M (BIT(7)) +#define GPIO_SIG240_IN_SEL_V 0x1 +#define GPIO_SIG240_IN_SEL_S 7 +/* GPIO_FUNC240_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC240_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC240_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC240_IN_INV_SEL_V 0x1 +#define GPIO_FUNC240_IN_INV_SEL_S 6 +/* GPIO_FUNC240_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC240_IN_SEL 0x0000003F +#define GPIO_FUNC240_IN_SEL_M ((GPIO_FUNC240_IN_SEL_V)<<(GPIO_FUNC240_IN_SEL_S)) +#define GPIO_FUNC240_IN_SEL_V 0x3F +#define GPIO_FUNC240_IN_SEL_S 0 + +#define GPIO_FUNC241_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x04f4) +/* GPIO_SIG241_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG241_IN_SEL (BIT(7)) +#define GPIO_SIG241_IN_SEL_M (BIT(7)) +#define GPIO_SIG241_IN_SEL_V 0x1 +#define GPIO_SIG241_IN_SEL_S 7 +/* GPIO_FUNC241_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC241_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC241_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC241_IN_INV_SEL_V 0x1 +#define GPIO_FUNC241_IN_INV_SEL_S 6 +/* GPIO_FUNC241_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC241_IN_SEL 0x0000003F +#define GPIO_FUNC241_IN_SEL_M ((GPIO_FUNC241_IN_SEL_V)<<(GPIO_FUNC241_IN_SEL_S)) +#define GPIO_FUNC241_IN_SEL_V 0x3F +#define GPIO_FUNC241_IN_SEL_S 0 + +#define GPIO_FUNC242_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x04f8) +/* GPIO_SIG242_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG242_IN_SEL (BIT(7)) +#define GPIO_SIG242_IN_SEL_M (BIT(7)) +#define GPIO_SIG242_IN_SEL_V 0x1 +#define GPIO_SIG242_IN_SEL_S 7 +/* GPIO_FUNC242_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC242_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC242_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC242_IN_INV_SEL_V 0x1 +#define GPIO_FUNC242_IN_INV_SEL_S 6 +/* GPIO_FUNC242_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC242_IN_SEL 0x0000003F +#define GPIO_FUNC242_IN_SEL_M ((GPIO_FUNC242_IN_SEL_V)<<(GPIO_FUNC242_IN_SEL_S)) +#define GPIO_FUNC242_IN_SEL_V 0x3F +#define GPIO_FUNC242_IN_SEL_S 0 + +#define GPIO_FUNC243_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x04fc) +/* GPIO_SIG243_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG243_IN_SEL (BIT(7)) +#define GPIO_SIG243_IN_SEL_M (BIT(7)) +#define GPIO_SIG243_IN_SEL_V 0x1 +#define GPIO_SIG243_IN_SEL_S 7 +/* GPIO_FUNC243_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC243_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC243_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC243_IN_INV_SEL_V 0x1 +#define GPIO_FUNC243_IN_INV_SEL_S 6 +/* GPIO_FUNC243_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC243_IN_SEL 0x0000003F +#define GPIO_FUNC243_IN_SEL_M ((GPIO_FUNC243_IN_SEL_V)<<(GPIO_FUNC243_IN_SEL_S)) +#define GPIO_FUNC243_IN_SEL_V 0x3F +#define GPIO_FUNC243_IN_SEL_S 0 + +#define GPIO_FUNC244_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0500) +/* GPIO_SIG244_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG244_IN_SEL (BIT(7)) +#define GPIO_SIG244_IN_SEL_M (BIT(7)) +#define GPIO_SIG244_IN_SEL_V 0x1 +#define GPIO_SIG244_IN_SEL_S 7 +/* GPIO_FUNC244_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC244_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC244_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC244_IN_INV_SEL_V 0x1 +#define GPIO_FUNC244_IN_INV_SEL_S 6 +/* GPIO_FUNC244_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC244_IN_SEL 0x0000003F +#define GPIO_FUNC244_IN_SEL_M ((GPIO_FUNC244_IN_SEL_V)<<(GPIO_FUNC244_IN_SEL_S)) +#define GPIO_FUNC244_IN_SEL_V 0x3F +#define GPIO_FUNC244_IN_SEL_S 0 + +#define GPIO_FUNC245_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0504) +/* GPIO_SIG245_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG245_IN_SEL (BIT(7)) +#define GPIO_SIG245_IN_SEL_M (BIT(7)) +#define GPIO_SIG245_IN_SEL_V 0x1 +#define GPIO_SIG245_IN_SEL_S 7 +/* GPIO_FUNC245_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC245_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC245_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC245_IN_INV_SEL_V 0x1 +#define GPIO_FUNC245_IN_INV_SEL_S 6 +/* GPIO_FUNC245_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC245_IN_SEL 0x0000003F +#define GPIO_FUNC245_IN_SEL_M ((GPIO_FUNC245_IN_SEL_V)<<(GPIO_FUNC245_IN_SEL_S)) +#define GPIO_FUNC245_IN_SEL_V 0x3F +#define GPIO_FUNC245_IN_SEL_S 0 + +#define GPIO_FUNC246_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0508) +/* GPIO_SIG246_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG246_IN_SEL (BIT(7)) +#define GPIO_SIG246_IN_SEL_M (BIT(7)) +#define GPIO_SIG246_IN_SEL_V 0x1 +#define GPIO_SIG246_IN_SEL_S 7 +/* GPIO_FUNC246_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC246_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC246_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC246_IN_INV_SEL_V 0x1 +#define GPIO_FUNC246_IN_INV_SEL_S 6 +/* GPIO_FUNC246_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC246_IN_SEL 0x0000003F +#define GPIO_FUNC246_IN_SEL_M ((GPIO_FUNC246_IN_SEL_V)<<(GPIO_FUNC246_IN_SEL_S)) +#define GPIO_FUNC246_IN_SEL_V 0x3F +#define GPIO_FUNC246_IN_SEL_S 0 + +#define GPIO_FUNC247_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x050c) +/* GPIO_SIG247_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG247_IN_SEL (BIT(7)) +#define GPIO_SIG247_IN_SEL_M (BIT(7)) +#define GPIO_SIG247_IN_SEL_V 0x1 +#define GPIO_SIG247_IN_SEL_S 7 +/* GPIO_FUNC247_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC247_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC247_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC247_IN_INV_SEL_V 0x1 +#define GPIO_FUNC247_IN_INV_SEL_S 6 +/* GPIO_FUNC247_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC247_IN_SEL 0x0000003F +#define GPIO_FUNC247_IN_SEL_M ((GPIO_FUNC247_IN_SEL_V)<<(GPIO_FUNC247_IN_SEL_S)) +#define GPIO_FUNC247_IN_SEL_V 0x3F +#define GPIO_FUNC247_IN_SEL_S 0 + +#define GPIO_FUNC248_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0510) +/* GPIO_SIG248_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG248_IN_SEL (BIT(7)) +#define GPIO_SIG248_IN_SEL_M (BIT(7)) +#define GPIO_SIG248_IN_SEL_V 0x1 +#define GPIO_SIG248_IN_SEL_S 7 +/* GPIO_FUNC248_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC248_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC248_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC248_IN_INV_SEL_V 0x1 +#define GPIO_FUNC248_IN_INV_SEL_S 6 +/* GPIO_FUNC248_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC248_IN_SEL 0x0000003F +#define GPIO_FUNC248_IN_SEL_M ((GPIO_FUNC248_IN_SEL_V)<<(GPIO_FUNC248_IN_SEL_S)) +#define GPIO_FUNC248_IN_SEL_V 0x3F +#define GPIO_FUNC248_IN_SEL_S 0 + +#define GPIO_FUNC249_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0514) +/* GPIO_SIG249_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG249_IN_SEL (BIT(7)) +#define GPIO_SIG249_IN_SEL_M (BIT(7)) +#define GPIO_SIG249_IN_SEL_V 0x1 +#define GPIO_SIG249_IN_SEL_S 7 +/* GPIO_FUNC249_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC249_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC249_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC249_IN_INV_SEL_V 0x1 +#define GPIO_FUNC249_IN_INV_SEL_S 6 +/* GPIO_FUNC249_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC249_IN_SEL 0x0000003F +#define GPIO_FUNC249_IN_SEL_M ((GPIO_FUNC249_IN_SEL_V)<<(GPIO_FUNC249_IN_SEL_S)) +#define GPIO_FUNC249_IN_SEL_V 0x3F +#define GPIO_FUNC249_IN_SEL_S 0 + +#define GPIO_FUNC250_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0518) +/* GPIO_SIG250_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG250_IN_SEL (BIT(7)) +#define GPIO_SIG250_IN_SEL_M (BIT(7)) +#define GPIO_SIG250_IN_SEL_V 0x1 +#define GPIO_SIG250_IN_SEL_S 7 +/* GPIO_FUNC250_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC250_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC250_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC250_IN_INV_SEL_V 0x1 +#define GPIO_FUNC250_IN_INV_SEL_S 6 +/* GPIO_FUNC250_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC250_IN_SEL 0x0000003F +#define GPIO_FUNC250_IN_SEL_M ((GPIO_FUNC250_IN_SEL_V)<<(GPIO_FUNC250_IN_SEL_S)) +#define GPIO_FUNC250_IN_SEL_V 0x3F +#define GPIO_FUNC250_IN_SEL_S 0 + +#define GPIO_FUNC251_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x051c) +/* GPIO_SIG251_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG251_IN_SEL (BIT(7)) +#define GPIO_SIG251_IN_SEL_M (BIT(7)) +#define GPIO_SIG251_IN_SEL_V 0x1 +#define GPIO_SIG251_IN_SEL_S 7 +/* GPIO_FUNC251_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC251_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC251_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC251_IN_INV_SEL_V 0x1 +#define GPIO_FUNC251_IN_INV_SEL_S 6 +/* GPIO_FUNC251_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC251_IN_SEL 0x0000003F +#define GPIO_FUNC251_IN_SEL_M ((GPIO_FUNC251_IN_SEL_V)<<(GPIO_FUNC251_IN_SEL_S)) +#define GPIO_FUNC251_IN_SEL_V 0x3F +#define GPIO_FUNC251_IN_SEL_S 0 + +#define GPIO_FUNC252_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0520) +/* GPIO_SIG252_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG252_IN_SEL (BIT(7)) +#define GPIO_SIG252_IN_SEL_M (BIT(7)) +#define GPIO_SIG252_IN_SEL_V 0x1 +#define GPIO_SIG252_IN_SEL_S 7 +/* GPIO_FUNC252_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC252_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC252_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC252_IN_INV_SEL_V 0x1 +#define GPIO_FUNC252_IN_INV_SEL_S 6 +/* GPIO_FUNC252_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC252_IN_SEL 0x0000003F +#define GPIO_FUNC252_IN_SEL_M ((GPIO_FUNC252_IN_SEL_V)<<(GPIO_FUNC252_IN_SEL_S)) +#define GPIO_FUNC252_IN_SEL_V 0x3F +#define GPIO_FUNC252_IN_SEL_S 0 + +#define GPIO_FUNC253_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0524) +/* GPIO_SIG253_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG253_IN_SEL (BIT(7)) +#define GPIO_SIG253_IN_SEL_M (BIT(7)) +#define GPIO_SIG253_IN_SEL_V 0x1 +#define GPIO_SIG253_IN_SEL_S 7 +/* GPIO_FUNC253_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC253_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC253_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC253_IN_INV_SEL_V 0x1 +#define GPIO_FUNC253_IN_INV_SEL_S 6 +/* GPIO_FUNC253_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC253_IN_SEL 0x0000003F +#define GPIO_FUNC253_IN_SEL_M ((GPIO_FUNC253_IN_SEL_V)<<(GPIO_FUNC253_IN_SEL_S)) +#define GPIO_FUNC253_IN_SEL_V 0x3F +#define GPIO_FUNC253_IN_SEL_S 0 + +#define GPIO_FUNC254_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0528) +/* GPIO_SIG254_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG254_IN_SEL (BIT(7)) +#define GPIO_SIG254_IN_SEL_M (BIT(7)) +#define GPIO_SIG254_IN_SEL_V 0x1 +#define GPIO_SIG254_IN_SEL_S 7 +/* GPIO_FUNC254_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC254_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC254_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC254_IN_INV_SEL_V 0x1 +#define GPIO_FUNC254_IN_INV_SEL_S 6 +/* GPIO_FUNC254_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC254_IN_SEL 0x0000003F +#define GPIO_FUNC254_IN_SEL_M ((GPIO_FUNC254_IN_SEL_V)<<(GPIO_FUNC254_IN_SEL_S)) +#define GPIO_FUNC254_IN_SEL_V 0x3F +#define GPIO_FUNC254_IN_SEL_S 0 + +#define GPIO_FUNC255_IN_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x052c) +/* GPIO_SIG255_IN_SEL : R/W ;bitpos:[7] ;default: x ; */ +/*description: if the slow signal bypass the io matrix or not if you want setting + the value to 1*/ +#define GPIO_SIG255_IN_SEL (BIT(7)) +#define GPIO_SIG255_IN_SEL_M (BIT(7)) +#define GPIO_SIG255_IN_SEL_V 0x1 +#define GPIO_SIG255_IN_SEL_S 7 +/* GPIO_FUNC255_IN_INV_SEL : R/W ;bitpos:[6] ;default: x ; */ +/*description: revert the value of the input if you want to revert please set the value to 1*/ +#define GPIO_FUNC255_IN_INV_SEL (BIT(6)) +#define GPIO_FUNC255_IN_INV_SEL_M (BIT(6)) +#define GPIO_FUNC255_IN_INV_SEL_V 0x1 +#define GPIO_FUNC255_IN_INV_SEL_S 6 +/* GPIO_FUNC255_IN_SEL : R/W ;bitpos:[5:0] ;default: x ; */ +/*description: select one of the 256 inputs*/ +#define GPIO_FUNC255_IN_SEL 0x0000003F +#define GPIO_FUNC255_IN_SEL_M ((GPIO_FUNC255_IN_SEL_V)<<(GPIO_FUNC255_IN_SEL_S)) +#define GPIO_FUNC255_IN_SEL_V 0x3F +#define GPIO_FUNC255_IN_SEL_S 0 + +#define GPIO_FUNC0_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0530) +/* GPIO_FUNC0_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC0_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC0_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC0_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC0_OEN_INV_SEL_S 11 +/* GPIO_FUNC0_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC0_OEN_SEL (BIT(10)) +#define GPIO_FUNC0_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC0_OEN_SEL_V 0x1 +#define GPIO_FUNC0_OEN_SEL_S 10 +/* GPIO_FUNC0_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC0_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC0_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC0_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC0_OUT_INV_SEL_S 9 +/* GPIO_FUNC0_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC0_OUT_SEL 0x000001FF +#define GPIO_FUNC0_OUT_SEL_M ((GPIO_FUNC0_OUT_SEL_V)<<(GPIO_FUNC0_OUT_SEL_S)) +#define GPIO_FUNC0_OUT_SEL_V 0x1FF +#define GPIO_FUNC0_OUT_SEL_S 0 + +#define GPIO_FUNC1_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0534) +/* GPIO_FUNC1_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC1_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC1_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC1_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC1_OEN_INV_SEL_S 11 +/* GPIO_FUNC1_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC1_OEN_SEL (BIT(10)) +#define GPIO_FUNC1_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC1_OEN_SEL_V 0x1 +#define GPIO_FUNC1_OEN_SEL_S 10 +/* GPIO_FUNC1_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC1_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC1_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC1_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC1_OUT_INV_SEL_S 9 +/* GPIO_FUNC1_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC1_OUT_SEL 0x000001FF +#define GPIO_FUNC1_OUT_SEL_M ((GPIO_FUNC1_OUT_SEL_V)<<(GPIO_FUNC1_OUT_SEL_S)) +#define GPIO_FUNC1_OUT_SEL_V 0x1FF +#define GPIO_FUNC1_OUT_SEL_S 0 + +#define GPIO_FUNC2_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0538) +/* GPIO_FUNC2_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC2_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC2_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC2_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC2_OEN_INV_SEL_S 11 +/* GPIO_FUNC2_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC2_OEN_SEL (BIT(10)) +#define GPIO_FUNC2_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC2_OEN_SEL_V 0x1 +#define GPIO_FUNC2_OEN_SEL_S 10 +/* GPIO_FUNC2_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC2_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC2_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC2_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC2_OUT_INV_SEL_S 9 +/* GPIO_FUNC2_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC2_OUT_SEL 0x000001FF +#define GPIO_FUNC2_OUT_SEL_M ((GPIO_FUNC2_OUT_SEL_V)<<(GPIO_FUNC2_OUT_SEL_S)) +#define GPIO_FUNC2_OUT_SEL_V 0x1FF +#define GPIO_FUNC2_OUT_SEL_S 0 + +#define GPIO_FUNC3_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x053c) +/* GPIO_FUNC3_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC3_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC3_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC3_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC3_OEN_INV_SEL_S 11 +/* GPIO_FUNC3_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC3_OEN_SEL (BIT(10)) +#define GPIO_FUNC3_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC3_OEN_SEL_V 0x1 +#define GPIO_FUNC3_OEN_SEL_S 10 +/* GPIO_FUNC3_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC3_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC3_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC3_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC3_OUT_INV_SEL_S 9 +/* GPIO_FUNC3_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC3_OUT_SEL 0x000001FF +#define GPIO_FUNC3_OUT_SEL_M ((GPIO_FUNC3_OUT_SEL_V)<<(GPIO_FUNC3_OUT_SEL_S)) +#define GPIO_FUNC3_OUT_SEL_V 0x1FF +#define GPIO_FUNC3_OUT_SEL_S 0 + +#define GPIO_FUNC4_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0540) +/* GPIO_FUNC4_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC4_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC4_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC4_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC4_OEN_INV_SEL_S 11 +/* GPIO_FUNC4_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC4_OEN_SEL (BIT(10)) +#define GPIO_FUNC4_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC4_OEN_SEL_V 0x1 +#define GPIO_FUNC4_OEN_SEL_S 10 +/* GPIO_FUNC4_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC4_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC4_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC4_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC4_OUT_INV_SEL_S 9 +/* GPIO_FUNC4_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC4_OUT_SEL 0x000001FF +#define GPIO_FUNC4_OUT_SEL_M ((GPIO_FUNC4_OUT_SEL_V)<<(GPIO_FUNC4_OUT_SEL_S)) +#define GPIO_FUNC4_OUT_SEL_V 0x1FF +#define GPIO_FUNC4_OUT_SEL_S 0 + +#define GPIO_FUNC5_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0544) +/* GPIO_FUNC5_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC5_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC5_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC5_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC5_OEN_INV_SEL_S 11 +/* GPIO_FUNC5_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC5_OEN_SEL (BIT(10)) +#define GPIO_FUNC5_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC5_OEN_SEL_V 0x1 +#define GPIO_FUNC5_OEN_SEL_S 10 +/* GPIO_FUNC5_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC5_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC5_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC5_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC5_OUT_INV_SEL_S 9 +/* GPIO_FUNC5_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC5_OUT_SEL 0x000001FF +#define GPIO_FUNC5_OUT_SEL_M ((GPIO_FUNC5_OUT_SEL_V)<<(GPIO_FUNC5_OUT_SEL_S)) +#define GPIO_FUNC5_OUT_SEL_V 0x1FF +#define GPIO_FUNC5_OUT_SEL_S 0 + +#define GPIO_FUNC6_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0548) +/* GPIO_FUNC6_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC6_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC6_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC6_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC6_OEN_INV_SEL_S 11 +/* GPIO_FUNC6_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC6_OEN_SEL (BIT(10)) +#define GPIO_FUNC6_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC6_OEN_SEL_V 0x1 +#define GPIO_FUNC6_OEN_SEL_S 10 +/* GPIO_FUNC6_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC6_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC6_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC6_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC6_OUT_INV_SEL_S 9 +/* GPIO_FUNC6_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC6_OUT_SEL 0x000001FF +#define GPIO_FUNC6_OUT_SEL_M ((GPIO_FUNC6_OUT_SEL_V)<<(GPIO_FUNC6_OUT_SEL_S)) +#define GPIO_FUNC6_OUT_SEL_V 0x1FF +#define GPIO_FUNC6_OUT_SEL_S 0 + +#define GPIO_FUNC7_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x054c) +/* GPIO_FUNC7_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC7_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC7_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC7_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC7_OEN_INV_SEL_S 11 +/* GPIO_FUNC7_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC7_OEN_SEL (BIT(10)) +#define GPIO_FUNC7_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC7_OEN_SEL_V 0x1 +#define GPIO_FUNC7_OEN_SEL_S 10 +/* GPIO_FUNC7_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC7_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC7_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC7_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC7_OUT_INV_SEL_S 9 +/* GPIO_FUNC7_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC7_OUT_SEL 0x000001FF +#define GPIO_FUNC7_OUT_SEL_M ((GPIO_FUNC7_OUT_SEL_V)<<(GPIO_FUNC7_OUT_SEL_S)) +#define GPIO_FUNC7_OUT_SEL_V 0x1FF +#define GPIO_FUNC7_OUT_SEL_S 0 + +#define GPIO_FUNC8_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0550) +/* GPIO_FUNC8_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC8_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC8_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC8_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC8_OEN_INV_SEL_S 11 +/* GPIO_FUNC8_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC8_OEN_SEL (BIT(10)) +#define GPIO_FUNC8_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC8_OEN_SEL_V 0x1 +#define GPIO_FUNC8_OEN_SEL_S 10 +/* GPIO_FUNC8_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC8_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC8_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC8_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC8_OUT_INV_SEL_S 9 +/* GPIO_FUNC8_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC8_OUT_SEL 0x000001FF +#define GPIO_FUNC8_OUT_SEL_M ((GPIO_FUNC8_OUT_SEL_V)<<(GPIO_FUNC8_OUT_SEL_S)) +#define GPIO_FUNC8_OUT_SEL_V 0x1FF +#define GPIO_FUNC8_OUT_SEL_S 0 + +#define GPIO_FUNC9_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0554) +/* GPIO_FUNC9_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC9_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC9_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC9_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC9_OEN_INV_SEL_S 11 +/* GPIO_FUNC9_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC9_OEN_SEL (BIT(10)) +#define GPIO_FUNC9_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC9_OEN_SEL_V 0x1 +#define GPIO_FUNC9_OEN_SEL_S 10 +/* GPIO_FUNC9_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC9_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC9_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC9_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC9_OUT_INV_SEL_S 9 +/* GPIO_FUNC9_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC9_OUT_SEL 0x000001FF +#define GPIO_FUNC9_OUT_SEL_M ((GPIO_FUNC9_OUT_SEL_V)<<(GPIO_FUNC9_OUT_SEL_S)) +#define GPIO_FUNC9_OUT_SEL_V 0x1FF +#define GPIO_FUNC9_OUT_SEL_S 0 + +#define GPIO_FUNC10_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0558) +/* GPIO_FUNC10_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC10_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC10_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC10_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC10_OEN_INV_SEL_S 11 +/* GPIO_FUNC10_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC10_OEN_SEL (BIT(10)) +#define GPIO_FUNC10_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC10_OEN_SEL_V 0x1 +#define GPIO_FUNC10_OEN_SEL_S 10 +/* GPIO_FUNC10_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC10_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC10_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC10_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC10_OUT_INV_SEL_S 9 +/* GPIO_FUNC10_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC10_OUT_SEL 0x000001FF +#define GPIO_FUNC10_OUT_SEL_M ((GPIO_FUNC10_OUT_SEL_V)<<(GPIO_FUNC10_OUT_SEL_S)) +#define GPIO_FUNC10_OUT_SEL_V 0x1FF +#define GPIO_FUNC10_OUT_SEL_S 0 + +#define GPIO_FUNC11_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x055c) +/* GPIO_FUNC11_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC11_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC11_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC11_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC11_OEN_INV_SEL_S 11 +/* GPIO_FUNC11_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC11_OEN_SEL (BIT(10)) +#define GPIO_FUNC11_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC11_OEN_SEL_V 0x1 +#define GPIO_FUNC11_OEN_SEL_S 10 +/* GPIO_FUNC11_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC11_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC11_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC11_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC11_OUT_INV_SEL_S 9 +/* GPIO_FUNC11_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC11_OUT_SEL 0x000001FF +#define GPIO_FUNC11_OUT_SEL_M ((GPIO_FUNC11_OUT_SEL_V)<<(GPIO_FUNC11_OUT_SEL_S)) +#define GPIO_FUNC11_OUT_SEL_V 0x1FF +#define GPIO_FUNC11_OUT_SEL_S 0 + +#define GPIO_FUNC12_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0560) +/* GPIO_FUNC12_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC12_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC12_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC12_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC12_OEN_INV_SEL_S 11 +/* GPIO_FUNC12_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC12_OEN_SEL (BIT(10)) +#define GPIO_FUNC12_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC12_OEN_SEL_V 0x1 +#define GPIO_FUNC12_OEN_SEL_S 10 +/* GPIO_FUNC12_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC12_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC12_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC12_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC12_OUT_INV_SEL_S 9 +/* GPIO_FUNC12_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC12_OUT_SEL 0x000001FF +#define GPIO_FUNC12_OUT_SEL_M ((GPIO_FUNC12_OUT_SEL_V)<<(GPIO_FUNC12_OUT_SEL_S)) +#define GPIO_FUNC12_OUT_SEL_V 0x1FF +#define GPIO_FUNC12_OUT_SEL_S 0 + +#define GPIO_FUNC13_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0564) +/* GPIO_FUNC13_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC13_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC13_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC13_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC13_OEN_INV_SEL_S 11 +/* GPIO_FUNC13_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC13_OEN_SEL (BIT(10)) +#define GPIO_FUNC13_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC13_OEN_SEL_V 0x1 +#define GPIO_FUNC13_OEN_SEL_S 10 +/* GPIO_FUNC13_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC13_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC13_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC13_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC13_OUT_INV_SEL_S 9 +/* GPIO_FUNC13_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC13_OUT_SEL 0x000001FF +#define GPIO_FUNC13_OUT_SEL_M ((GPIO_FUNC13_OUT_SEL_V)<<(GPIO_FUNC13_OUT_SEL_S)) +#define GPIO_FUNC13_OUT_SEL_V 0x1FF +#define GPIO_FUNC13_OUT_SEL_S 0 + +#define GPIO_FUNC14_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0568) +/* GPIO_FUNC14_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC14_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC14_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC14_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC14_OEN_INV_SEL_S 11 +/* GPIO_FUNC14_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC14_OEN_SEL (BIT(10)) +#define GPIO_FUNC14_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC14_OEN_SEL_V 0x1 +#define GPIO_FUNC14_OEN_SEL_S 10 +/* GPIO_FUNC14_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC14_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC14_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC14_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC14_OUT_INV_SEL_S 9 +/* GPIO_FUNC14_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC14_OUT_SEL 0x000001FF +#define GPIO_FUNC14_OUT_SEL_M ((GPIO_FUNC14_OUT_SEL_V)<<(GPIO_FUNC14_OUT_SEL_S)) +#define GPIO_FUNC14_OUT_SEL_V 0x1FF +#define GPIO_FUNC14_OUT_SEL_S 0 + +#define GPIO_FUNC15_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x056c) +/* GPIO_FUNC15_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC15_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC15_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC15_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC15_OEN_INV_SEL_S 11 +/* GPIO_FUNC15_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC15_OEN_SEL (BIT(10)) +#define GPIO_FUNC15_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC15_OEN_SEL_V 0x1 +#define GPIO_FUNC15_OEN_SEL_S 10 +/* GPIO_FUNC15_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC15_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC15_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC15_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC15_OUT_INV_SEL_S 9 +/* GPIO_FUNC15_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC15_OUT_SEL 0x000001FF +#define GPIO_FUNC15_OUT_SEL_M ((GPIO_FUNC15_OUT_SEL_V)<<(GPIO_FUNC15_OUT_SEL_S)) +#define GPIO_FUNC15_OUT_SEL_V 0x1FF +#define GPIO_FUNC15_OUT_SEL_S 0 + +#define GPIO_FUNC16_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0570) +/* GPIO_FUNC16_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC16_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC16_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC16_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC16_OEN_INV_SEL_S 11 +/* GPIO_FUNC16_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC16_OEN_SEL (BIT(10)) +#define GPIO_FUNC16_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC16_OEN_SEL_V 0x1 +#define GPIO_FUNC16_OEN_SEL_S 10 +/* GPIO_FUNC16_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC16_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC16_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC16_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC16_OUT_INV_SEL_S 9 +/* GPIO_FUNC16_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC16_OUT_SEL 0x000001FF +#define GPIO_FUNC16_OUT_SEL_M ((GPIO_FUNC16_OUT_SEL_V)<<(GPIO_FUNC16_OUT_SEL_S)) +#define GPIO_FUNC16_OUT_SEL_V 0x1FF +#define GPIO_FUNC16_OUT_SEL_S 0 + +#define GPIO_FUNC17_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0574) +/* GPIO_FUNC17_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC17_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC17_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC17_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC17_OEN_INV_SEL_S 11 +/* GPIO_FUNC17_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC17_OEN_SEL (BIT(10)) +#define GPIO_FUNC17_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC17_OEN_SEL_V 0x1 +#define GPIO_FUNC17_OEN_SEL_S 10 +/* GPIO_FUNC17_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC17_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC17_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC17_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC17_OUT_INV_SEL_S 9 +/* GPIO_FUNC17_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC17_OUT_SEL 0x000001FF +#define GPIO_FUNC17_OUT_SEL_M ((GPIO_FUNC17_OUT_SEL_V)<<(GPIO_FUNC17_OUT_SEL_S)) +#define GPIO_FUNC17_OUT_SEL_V 0x1FF +#define GPIO_FUNC17_OUT_SEL_S 0 + +#define GPIO_FUNC18_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0578) +/* GPIO_FUNC18_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC18_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC18_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC18_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC18_OEN_INV_SEL_S 11 +/* GPIO_FUNC18_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC18_OEN_SEL (BIT(10)) +#define GPIO_FUNC18_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC18_OEN_SEL_V 0x1 +#define GPIO_FUNC18_OEN_SEL_S 10 +/* GPIO_FUNC18_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC18_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC18_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC18_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC18_OUT_INV_SEL_S 9 +/* GPIO_FUNC18_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC18_OUT_SEL 0x000001FF +#define GPIO_FUNC18_OUT_SEL_M ((GPIO_FUNC18_OUT_SEL_V)<<(GPIO_FUNC18_OUT_SEL_S)) +#define GPIO_FUNC18_OUT_SEL_V 0x1FF +#define GPIO_FUNC18_OUT_SEL_S 0 + +#define GPIO_FUNC19_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x057c) +/* GPIO_FUNC19_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC19_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC19_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC19_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC19_OEN_INV_SEL_S 11 +/* GPIO_FUNC19_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC19_OEN_SEL (BIT(10)) +#define GPIO_FUNC19_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC19_OEN_SEL_V 0x1 +#define GPIO_FUNC19_OEN_SEL_S 10 +/* GPIO_FUNC19_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC19_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC19_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC19_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC19_OUT_INV_SEL_S 9 +/* GPIO_FUNC19_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC19_OUT_SEL 0x000001FF +#define GPIO_FUNC19_OUT_SEL_M ((GPIO_FUNC19_OUT_SEL_V)<<(GPIO_FUNC19_OUT_SEL_S)) +#define GPIO_FUNC19_OUT_SEL_V 0x1FF +#define GPIO_FUNC19_OUT_SEL_S 0 + +#define GPIO_FUNC20_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0580) +/* GPIO_FUNC20_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC20_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC20_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC20_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC20_OEN_INV_SEL_S 11 +/* GPIO_FUNC20_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC20_OEN_SEL (BIT(10)) +#define GPIO_FUNC20_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC20_OEN_SEL_V 0x1 +#define GPIO_FUNC20_OEN_SEL_S 10 +/* GPIO_FUNC20_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC20_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC20_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC20_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC20_OUT_INV_SEL_S 9 +/* GPIO_FUNC20_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC20_OUT_SEL 0x000001FF +#define GPIO_FUNC20_OUT_SEL_M ((GPIO_FUNC20_OUT_SEL_V)<<(GPIO_FUNC20_OUT_SEL_S)) +#define GPIO_FUNC20_OUT_SEL_V 0x1FF +#define GPIO_FUNC20_OUT_SEL_S 0 + +#define GPIO_FUNC21_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0584) +/* GPIO_FUNC21_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC21_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC21_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC21_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC21_OEN_INV_SEL_S 11 +/* GPIO_FUNC21_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC21_OEN_SEL (BIT(10)) +#define GPIO_FUNC21_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC21_OEN_SEL_V 0x1 +#define GPIO_FUNC21_OEN_SEL_S 10 +/* GPIO_FUNC21_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC21_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC21_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC21_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC21_OUT_INV_SEL_S 9 +/* GPIO_FUNC21_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC21_OUT_SEL 0x000001FF +#define GPIO_FUNC21_OUT_SEL_M ((GPIO_FUNC21_OUT_SEL_V)<<(GPIO_FUNC21_OUT_SEL_S)) +#define GPIO_FUNC21_OUT_SEL_V 0x1FF +#define GPIO_FUNC21_OUT_SEL_S 0 + +#define GPIO_FUNC22_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0588) +/* GPIO_FUNC22_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC22_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC22_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC22_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC22_OEN_INV_SEL_S 11 +/* GPIO_FUNC22_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC22_OEN_SEL (BIT(10)) +#define GPIO_FUNC22_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC22_OEN_SEL_V 0x1 +#define GPIO_FUNC22_OEN_SEL_S 10 +/* GPIO_FUNC22_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC22_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC22_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC22_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC22_OUT_INV_SEL_S 9 +/* GPIO_FUNC22_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC22_OUT_SEL 0x000001FF +#define GPIO_FUNC22_OUT_SEL_M ((GPIO_FUNC22_OUT_SEL_V)<<(GPIO_FUNC22_OUT_SEL_S)) +#define GPIO_FUNC22_OUT_SEL_V 0x1FF +#define GPIO_FUNC22_OUT_SEL_S 0 + +#define GPIO_FUNC23_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x058c) +/* GPIO_FUNC23_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC23_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC23_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC23_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC23_OEN_INV_SEL_S 11 +/* GPIO_FUNC23_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC23_OEN_SEL (BIT(10)) +#define GPIO_FUNC23_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC23_OEN_SEL_V 0x1 +#define GPIO_FUNC23_OEN_SEL_S 10 +/* GPIO_FUNC23_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC23_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC23_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC23_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC23_OUT_INV_SEL_S 9 +/* GPIO_FUNC23_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC23_OUT_SEL 0x000001FF +#define GPIO_FUNC23_OUT_SEL_M ((GPIO_FUNC23_OUT_SEL_V)<<(GPIO_FUNC23_OUT_SEL_S)) +#define GPIO_FUNC23_OUT_SEL_V 0x1FF +#define GPIO_FUNC23_OUT_SEL_S 0 + +#define GPIO_FUNC24_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0590) +/* GPIO_FUNC24_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC24_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC24_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC24_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC24_OEN_INV_SEL_S 11 +/* GPIO_FUNC24_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC24_OEN_SEL (BIT(10)) +#define GPIO_FUNC24_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC24_OEN_SEL_V 0x1 +#define GPIO_FUNC24_OEN_SEL_S 10 +/* GPIO_FUNC24_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC24_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC24_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC24_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC24_OUT_INV_SEL_S 9 +/* GPIO_FUNC24_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC24_OUT_SEL 0x000001FF +#define GPIO_FUNC24_OUT_SEL_M ((GPIO_FUNC24_OUT_SEL_V)<<(GPIO_FUNC24_OUT_SEL_S)) +#define GPIO_FUNC24_OUT_SEL_V 0x1FF +#define GPIO_FUNC24_OUT_SEL_S 0 + +#define GPIO_FUNC25_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0594) +/* GPIO_FUNC25_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC25_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC25_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC25_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC25_OEN_INV_SEL_S 11 +/* GPIO_FUNC25_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC25_OEN_SEL (BIT(10)) +#define GPIO_FUNC25_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC25_OEN_SEL_V 0x1 +#define GPIO_FUNC25_OEN_SEL_S 10 +/* GPIO_FUNC25_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC25_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC25_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC25_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC25_OUT_INV_SEL_S 9 +/* GPIO_FUNC25_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC25_OUT_SEL 0x000001FF +#define GPIO_FUNC25_OUT_SEL_M ((GPIO_FUNC25_OUT_SEL_V)<<(GPIO_FUNC25_OUT_SEL_S)) +#define GPIO_FUNC25_OUT_SEL_V 0x1FF +#define GPIO_FUNC25_OUT_SEL_S 0 + +#define GPIO_FUNC26_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x0598) +/* GPIO_FUNC26_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC26_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC26_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC26_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC26_OEN_INV_SEL_S 11 +/* GPIO_FUNC26_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC26_OEN_SEL (BIT(10)) +#define GPIO_FUNC26_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC26_OEN_SEL_V 0x1 +#define GPIO_FUNC26_OEN_SEL_S 10 +/* GPIO_FUNC26_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC26_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC26_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC26_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC26_OUT_INV_SEL_S 9 +/* GPIO_FUNC26_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC26_OUT_SEL 0x000001FF +#define GPIO_FUNC26_OUT_SEL_M ((GPIO_FUNC26_OUT_SEL_V)<<(GPIO_FUNC26_OUT_SEL_S)) +#define GPIO_FUNC26_OUT_SEL_V 0x1FF +#define GPIO_FUNC26_OUT_SEL_S 0 + +#define GPIO_FUNC27_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x059c) +/* GPIO_FUNC27_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC27_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC27_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC27_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC27_OEN_INV_SEL_S 11 +/* GPIO_FUNC27_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC27_OEN_SEL (BIT(10)) +#define GPIO_FUNC27_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC27_OEN_SEL_V 0x1 +#define GPIO_FUNC27_OEN_SEL_S 10 +/* GPIO_FUNC27_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC27_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC27_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC27_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC27_OUT_INV_SEL_S 9 +/* GPIO_FUNC27_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC27_OUT_SEL 0x000001FF +#define GPIO_FUNC27_OUT_SEL_M ((GPIO_FUNC27_OUT_SEL_V)<<(GPIO_FUNC27_OUT_SEL_S)) +#define GPIO_FUNC27_OUT_SEL_V 0x1FF +#define GPIO_FUNC27_OUT_SEL_S 0 + +#define GPIO_FUNC28_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x05a0) +/* GPIO_FUNC28_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC28_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC28_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC28_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC28_OEN_INV_SEL_S 11 +/* GPIO_FUNC28_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC28_OEN_SEL (BIT(10)) +#define GPIO_FUNC28_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC28_OEN_SEL_V 0x1 +#define GPIO_FUNC28_OEN_SEL_S 10 +/* GPIO_FUNC28_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC28_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC28_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC28_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC28_OUT_INV_SEL_S 9 +/* GPIO_FUNC28_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC28_OUT_SEL 0x000001FF +#define GPIO_FUNC28_OUT_SEL_M ((GPIO_FUNC28_OUT_SEL_V)<<(GPIO_FUNC28_OUT_SEL_S)) +#define GPIO_FUNC28_OUT_SEL_V 0x1FF +#define GPIO_FUNC28_OUT_SEL_S 0 + +#define GPIO_FUNC29_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x05a4) +/* GPIO_FUNC29_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC29_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC29_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC29_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC29_OEN_INV_SEL_S 11 +/* GPIO_FUNC29_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC29_OEN_SEL (BIT(10)) +#define GPIO_FUNC29_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC29_OEN_SEL_V 0x1 +#define GPIO_FUNC29_OEN_SEL_S 10 +/* GPIO_FUNC29_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC29_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC29_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC29_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC29_OUT_INV_SEL_S 9 +/* GPIO_FUNC29_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC29_OUT_SEL 0x000001FF +#define GPIO_FUNC29_OUT_SEL_M ((GPIO_FUNC29_OUT_SEL_V)<<(GPIO_FUNC29_OUT_SEL_S)) +#define GPIO_FUNC29_OUT_SEL_V 0x1FF +#define GPIO_FUNC29_OUT_SEL_S 0 + +#define GPIO_FUNC30_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x05a8) +/* GPIO_FUNC30_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC30_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC30_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC30_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC30_OEN_INV_SEL_S 11 +/* GPIO_FUNC30_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC30_OEN_SEL (BIT(10)) +#define GPIO_FUNC30_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC30_OEN_SEL_V 0x1 +#define GPIO_FUNC30_OEN_SEL_S 10 +/* GPIO_FUNC30_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC30_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC30_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC30_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC30_OUT_INV_SEL_S 9 +/* GPIO_FUNC30_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC30_OUT_SEL 0x000001FF +#define GPIO_FUNC30_OUT_SEL_M ((GPIO_FUNC30_OUT_SEL_V)<<(GPIO_FUNC30_OUT_SEL_S)) +#define GPIO_FUNC30_OUT_SEL_V 0x1FF +#define GPIO_FUNC30_OUT_SEL_S 0 + +#define GPIO_FUNC31_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x05ac) +/* GPIO_FUNC31_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC31_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC31_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC31_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC31_OEN_INV_SEL_S 11 +/* GPIO_FUNC31_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC31_OEN_SEL (BIT(10)) +#define GPIO_FUNC31_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC31_OEN_SEL_V 0x1 +#define GPIO_FUNC31_OEN_SEL_S 10 +/* GPIO_FUNC31_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC31_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC31_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC31_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC31_OUT_INV_SEL_S 9 +/* GPIO_FUNC31_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC31_OUT_SEL 0x000001FF +#define GPIO_FUNC31_OUT_SEL_M ((GPIO_FUNC31_OUT_SEL_V)<<(GPIO_FUNC31_OUT_SEL_S)) +#define GPIO_FUNC31_OUT_SEL_V 0x1FF +#define GPIO_FUNC31_OUT_SEL_S 0 + +#define GPIO_FUNC32_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x05b0) +/* GPIO_FUNC32_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC32_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC32_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC32_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC32_OEN_INV_SEL_S 11 +/* GPIO_FUNC32_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC32_OEN_SEL (BIT(10)) +#define GPIO_FUNC32_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC32_OEN_SEL_V 0x1 +#define GPIO_FUNC32_OEN_SEL_S 10 +/* GPIO_FUNC32_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC32_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC32_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC32_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC32_OUT_INV_SEL_S 9 +/* GPIO_FUNC32_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC32_OUT_SEL 0x000001FF +#define GPIO_FUNC32_OUT_SEL_M ((GPIO_FUNC32_OUT_SEL_V)<<(GPIO_FUNC32_OUT_SEL_S)) +#define GPIO_FUNC32_OUT_SEL_V 0x1FF +#define GPIO_FUNC32_OUT_SEL_S 0 + +#define GPIO_FUNC33_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x05b4) +/* GPIO_FUNC33_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC33_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC33_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC33_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC33_OEN_INV_SEL_S 11 +/* GPIO_FUNC33_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC33_OEN_SEL (BIT(10)) +#define GPIO_FUNC33_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC33_OEN_SEL_V 0x1 +#define GPIO_FUNC33_OEN_SEL_S 10 +/* GPIO_FUNC33_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC33_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC33_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC33_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC33_OUT_INV_SEL_S 9 +/* GPIO_FUNC33_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC33_OUT_SEL 0x000001FF +#define GPIO_FUNC33_OUT_SEL_M ((GPIO_FUNC33_OUT_SEL_V)<<(GPIO_FUNC33_OUT_SEL_S)) +#define GPIO_FUNC33_OUT_SEL_V 0x1FF +#define GPIO_FUNC33_OUT_SEL_S 0 + +#define GPIO_FUNC34_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x05b8) +/* GPIO_FUNC34_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC34_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC34_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC34_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC34_OEN_INV_SEL_S 11 +/* GPIO_FUNC34_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC34_OEN_SEL (BIT(10)) +#define GPIO_FUNC34_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC34_OEN_SEL_V 0x1 +#define GPIO_FUNC34_OEN_SEL_S 10 +/* GPIO_FUNC34_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC34_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC34_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC34_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC34_OUT_INV_SEL_S 9 +/* GPIO_FUNC34_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC34_OUT_SEL 0x000001FF +#define GPIO_FUNC34_OUT_SEL_M ((GPIO_FUNC34_OUT_SEL_V)<<(GPIO_FUNC34_OUT_SEL_S)) +#define GPIO_FUNC34_OUT_SEL_V 0x1FF +#define GPIO_FUNC34_OUT_SEL_S 0 + +#define GPIO_FUNC35_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x05bc) +/* GPIO_FUNC35_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC35_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC35_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC35_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC35_OEN_INV_SEL_S 11 +/* GPIO_FUNC35_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC35_OEN_SEL (BIT(10)) +#define GPIO_FUNC35_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC35_OEN_SEL_V 0x1 +#define GPIO_FUNC35_OEN_SEL_S 10 +/* GPIO_FUNC35_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC35_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC35_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC35_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC35_OUT_INV_SEL_S 9 +/* GPIO_FUNC35_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC35_OUT_SEL 0x000001FF +#define GPIO_FUNC35_OUT_SEL_M ((GPIO_FUNC35_OUT_SEL_V)<<(GPIO_FUNC35_OUT_SEL_S)) +#define GPIO_FUNC35_OUT_SEL_V 0x1FF +#define GPIO_FUNC35_OUT_SEL_S 0 + +#define GPIO_FUNC36_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x05c0) +/* GPIO_FUNC36_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC36_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC36_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC36_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC36_OEN_INV_SEL_S 11 +/* GPIO_FUNC36_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC36_OEN_SEL (BIT(10)) +#define GPIO_FUNC36_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC36_OEN_SEL_V 0x1 +#define GPIO_FUNC36_OEN_SEL_S 10 +/* GPIO_FUNC36_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC36_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC36_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC36_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC36_OUT_INV_SEL_S 9 +/* GPIO_FUNC36_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC36_OUT_SEL 0x000001FF +#define GPIO_FUNC36_OUT_SEL_M ((GPIO_FUNC36_OUT_SEL_V)<<(GPIO_FUNC36_OUT_SEL_S)) +#define GPIO_FUNC36_OUT_SEL_V 0x1FF +#define GPIO_FUNC36_OUT_SEL_S 0 + +#define GPIO_FUNC37_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x05c4) +/* GPIO_FUNC37_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC37_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC37_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC37_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC37_OEN_INV_SEL_S 11 +/* GPIO_FUNC37_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC37_OEN_SEL (BIT(10)) +#define GPIO_FUNC37_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC37_OEN_SEL_V 0x1 +#define GPIO_FUNC37_OEN_SEL_S 10 +/* GPIO_FUNC37_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC37_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC37_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC37_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC37_OUT_INV_SEL_S 9 +/* GPIO_FUNC37_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC37_OUT_SEL 0x000001FF +#define GPIO_FUNC37_OUT_SEL_M ((GPIO_FUNC37_OUT_SEL_V)<<(GPIO_FUNC37_OUT_SEL_S)) +#define GPIO_FUNC37_OUT_SEL_V 0x1FF +#define GPIO_FUNC37_OUT_SEL_S 0 + +#define GPIO_FUNC38_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x05c8) +/* GPIO_FUNC38_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC38_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC38_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC38_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC38_OEN_INV_SEL_S 11 +/* GPIO_FUNC38_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC38_OEN_SEL (BIT(10)) +#define GPIO_FUNC38_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC38_OEN_SEL_V 0x1 +#define GPIO_FUNC38_OEN_SEL_S 10 +/* GPIO_FUNC38_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC38_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC38_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC38_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC38_OUT_INV_SEL_S 9 +/* GPIO_FUNC38_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC38_OUT_SEL 0x000001FF +#define GPIO_FUNC38_OUT_SEL_M ((GPIO_FUNC38_OUT_SEL_V)<<(GPIO_FUNC38_OUT_SEL_S)) +#define GPIO_FUNC38_OUT_SEL_V 0x1FF +#define GPIO_FUNC38_OUT_SEL_S 0 + +#define GPIO_FUNC39_OUT_SEL_CFG_REG (DR_REG_GPIO_BASE + 0x05cc) +/* GPIO_FUNC39_OEN_INV_SEL : R/W ;bitpos:[11] ;default: x ; */ +/*description: invert the output enable value if you want to revert the output + enable value setting the value to 1*/ +#define GPIO_FUNC39_OEN_INV_SEL (BIT(11)) +#define GPIO_FUNC39_OEN_INV_SEL_M (BIT(11)) +#define GPIO_FUNC39_OEN_INV_SEL_V 0x1 +#define GPIO_FUNC39_OEN_INV_SEL_S 11 +/* GPIO_FUNC39_OEN_SEL : R/W ;bitpos:[10] ;default: x ; */ +/*description: weather using the logical oen signal or not using the value setting + by the register*/ +#define GPIO_FUNC39_OEN_SEL (BIT(10)) +#define GPIO_FUNC39_OEN_SEL_M (BIT(10)) +#define GPIO_FUNC39_OEN_SEL_V 0x1 +#define GPIO_FUNC39_OEN_SEL_S 10 +/* GPIO_FUNC39_OUT_INV_SEL : R/W ;bitpos:[9] ;default: x ; */ +/*description: invert the output value if you want to revert the output value + setting the value to 1*/ +#define GPIO_FUNC39_OUT_INV_SEL (BIT(9)) +#define GPIO_FUNC39_OUT_INV_SEL_M (BIT(9)) +#define GPIO_FUNC39_OUT_INV_SEL_V 0x1 +#define GPIO_FUNC39_OUT_INV_SEL_S 9 +/* GPIO_FUNC39_OUT_SEL : R/W ;bitpos:[8:0] ;default: x ; */ +/*description: select one of the 256 output to 40 GPIO*/ +#define GPIO_FUNC39_OUT_SEL 0x000001FF +#define GPIO_FUNC39_OUT_SEL_M ((GPIO_FUNC39_OUT_SEL_V)<<(GPIO_FUNC39_OUT_SEL_S)) +#define GPIO_FUNC39_OUT_SEL_V 0x1FF +#define GPIO_FUNC39_OUT_SEL_S 0 + + + + +#endif /*_SOC_GPIO_REG_H_ */ + + diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/gpio_sd_reg.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/gpio_sd_reg.h new file mode 100644 index 0000000000000..be39fcf2c20be --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/gpio_sd_reg.h @@ -0,0 +1,160 @@ +// 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. +#ifndef _SOC_GPIO_SD_REG_H_ +#define _SOC_GPIO_SD_REG_H_ + +#include "soc.h" +#define GPIO_SIGMADELTA0_REG (DR_REG_GPIO_SD_BASE + 0x0000) +/* GPIO_SD0_PRESCALE : R/W ;bitpos:[15:8] ;default: 8'hff ; */ +/*description: */ +#define GPIO_SD0_PRESCALE 0x000000FF +#define GPIO_SD0_PRESCALE_M ((GPIO_SD0_PRESCALE_V)<<(GPIO_SD0_PRESCALE_S)) +#define GPIO_SD0_PRESCALE_V 0xFF +#define GPIO_SD0_PRESCALE_S 8 +/* GPIO_SD0_IN : R/W ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: */ +#define GPIO_SD0_IN 0x000000FF +#define GPIO_SD0_IN_M ((GPIO_SD0_IN_V)<<(GPIO_SD0_IN_S)) +#define GPIO_SD0_IN_V 0xFF +#define GPIO_SD0_IN_S 0 + +#define GPIO_SIGMADELTA1_REG (DR_REG_GPIO_SD_BASE + 0x0004) +/* GPIO_SD1_PRESCALE : R/W ;bitpos:[15:8] ;default: 8'hff ; */ +/*description: */ +#define GPIO_SD1_PRESCALE 0x000000FF +#define GPIO_SD1_PRESCALE_M ((GPIO_SD1_PRESCALE_V)<<(GPIO_SD1_PRESCALE_S)) +#define GPIO_SD1_PRESCALE_V 0xFF +#define GPIO_SD1_PRESCALE_S 8 +/* GPIO_SD1_IN : R/W ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: */ +#define GPIO_SD1_IN 0x000000FF +#define GPIO_SD1_IN_M ((GPIO_SD1_IN_V)<<(GPIO_SD1_IN_S)) +#define GPIO_SD1_IN_V 0xFF +#define GPIO_SD1_IN_S 0 + +#define GPIO_SIGMADELTA2_REG (DR_REG_GPIO_SD_BASE + 0x0008) +/* GPIO_SD2_PRESCALE : R/W ;bitpos:[15:8] ;default: 8'hff ; */ +/*description: */ +#define GPIO_SD2_PRESCALE 0x000000FF +#define GPIO_SD2_PRESCALE_M ((GPIO_SD2_PRESCALE_V)<<(GPIO_SD2_PRESCALE_S)) +#define GPIO_SD2_PRESCALE_V 0xFF +#define GPIO_SD2_PRESCALE_S 8 +/* GPIO_SD2_IN : R/W ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: */ +#define GPIO_SD2_IN 0x000000FF +#define GPIO_SD2_IN_M ((GPIO_SD2_IN_V)<<(GPIO_SD2_IN_S)) +#define GPIO_SD2_IN_V 0xFF +#define GPIO_SD2_IN_S 0 + +#define GPIO_SIGMADELTA3_REG (DR_REG_GPIO_SD_BASE + 0x000c) +/* GPIO_SD3_PRESCALE : R/W ;bitpos:[15:8] ;default: 8'hff ; */ +/*description: */ +#define GPIO_SD3_PRESCALE 0x000000FF +#define GPIO_SD3_PRESCALE_M ((GPIO_SD3_PRESCALE_V)<<(GPIO_SD3_PRESCALE_S)) +#define GPIO_SD3_PRESCALE_V 0xFF +#define GPIO_SD3_PRESCALE_S 8 +/* GPIO_SD3_IN : R/W ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: */ +#define GPIO_SD3_IN 0x000000FF +#define GPIO_SD3_IN_M ((GPIO_SD3_IN_V)<<(GPIO_SD3_IN_S)) +#define GPIO_SD3_IN_V 0xFF +#define GPIO_SD3_IN_S 0 + +#define GPIO_SIGMADELTA4_REG (DR_REG_GPIO_SD_BASE + 0x0010) +/* GPIO_SD4_PRESCALE : R/W ;bitpos:[15:8] ;default: 8'hff ; */ +/*description: */ +#define GPIO_SD4_PRESCALE 0x000000FF +#define GPIO_SD4_PRESCALE_M ((GPIO_SD4_PRESCALE_V)<<(GPIO_SD4_PRESCALE_S)) +#define GPIO_SD4_PRESCALE_V 0xFF +#define GPIO_SD4_PRESCALE_S 8 +/* GPIO_SD4_IN : R/W ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: */ +#define GPIO_SD4_IN 0x000000FF +#define GPIO_SD4_IN_M ((GPIO_SD4_IN_V)<<(GPIO_SD4_IN_S)) +#define GPIO_SD4_IN_V 0xFF +#define GPIO_SD4_IN_S 0 + +#define GPIO_SIGMADELTA5_REG (DR_REG_GPIO_SD_BASE + 0x0014) +/* GPIO_SD5_PRESCALE : R/W ;bitpos:[15:8] ;default: 8'hff ; */ +/*description: */ +#define GPIO_SD5_PRESCALE 0x000000FF +#define GPIO_SD5_PRESCALE_M ((GPIO_SD5_PRESCALE_V)<<(GPIO_SD5_PRESCALE_S)) +#define GPIO_SD5_PRESCALE_V 0xFF +#define GPIO_SD5_PRESCALE_S 8 +/* GPIO_SD5_IN : R/W ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: */ +#define GPIO_SD5_IN 0x000000FF +#define GPIO_SD5_IN_M ((GPIO_SD5_IN_V)<<(GPIO_SD5_IN_S)) +#define GPIO_SD5_IN_V 0xFF +#define GPIO_SD5_IN_S 0 + +#define GPIO_SIGMADELTA6_REG (DR_REG_GPIO_SD_BASE + 0x0018) +/* GPIO_SD6_PRESCALE : R/W ;bitpos:[15:8] ;default: 8'hff ; */ +/*description: */ +#define GPIO_SD6_PRESCALE 0x000000FF +#define GPIO_SD6_PRESCALE_M ((GPIO_SD6_PRESCALE_V)<<(GPIO_SD6_PRESCALE_S)) +#define GPIO_SD6_PRESCALE_V 0xFF +#define GPIO_SD6_PRESCALE_S 8 +/* GPIO_SD6_IN : R/W ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: */ +#define GPIO_SD6_IN 0x000000FF +#define GPIO_SD6_IN_M ((GPIO_SD6_IN_V)<<(GPIO_SD6_IN_S)) +#define GPIO_SD6_IN_V 0xFF +#define GPIO_SD6_IN_S 0 + +#define GPIO_SIGMADELTA7_REG (DR_REG_GPIO_SD_BASE + 0x001c) +/* GPIO_SD7_PRESCALE : R/W ;bitpos:[15:8] ;default: 8'hff ; */ +/*description: */ +#define GPIO_SD7_PRESCALE 0x000000FF +#define GPIO_SD7_PRESCALE_M ((GPIO_SD7_PRESCALE_V)<<(GPIO_SD7_PRESCALE_S)) +#define GPIO_SD7_PRESCALE_V 0xFF +#define GPIO_SD7_PRESCALE_S 8 +/* GPIO_SD7_IN : R/W ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: */ +#define GPIO_SD7_IN 0x000000FF +#define GPIO_SD7_IN_M ((GPIO_SD7_IN_V)<<(GPIO_SD7_IN_S)) +#define GPIO_SD7_IN_V 0xFF +#define GPIO_SD7_IN_S 0 + +#define GPIO_SIGMADELTA_CG_REG (DR_REG_GPIO_SD_BASE + 0x0020) +/* GPIO_SD_CLK_EN : R/W ;bitpos:[31] ;default: 1'h0 ; */ +/*description: */ +#define GPIO_SD_CLK_EN (BIT(31)) +#define GPIO_SD_CLK_EN_M (BIT(31)) +#define GPIO_SD_CLK_EN_V 0x1 +#define GPIO_SD_CLK_EN_S 31 + +#define GPIO_SIGMADELTA_MISC_REG (DR_REG_GPIO_SD_BASE + 0x0024) +/* GPIO_SPI_SWAP : R/W ;bitpos:[31] ;default: 1'h0 ; */ +/*description: */ +#define GPIO_SPI_SWAP (BIT(31)) +#define GPIO_SPI_SWAP_M (BIT(31)) +#define GPIO_SPI_SWAP_V 0x1 +#define GPIO_SPI_SWAP_S 31 + +#define GPIO_SIGMADELTA_VERSION_REG (DR_REG_GPIO_SD_BASE + 0x0028) +/* GPIO_SD_DATE : R/W ;bitpos:[27:0] ;default: 28'h1506190 ; */ +/*description: */ +#define GPIO_SD_DATE 0x0FFFFFFF +#define GPIO_SD_DATE_M ((GPIO_SD_DATE_V)<<(GPIO_SD_DATE_S)) +#define GPIO_SD_DATE_V 0xFFFFFFF +#define GPIO_SD_DATE_S 0 +#define SIGMADELTA_GPIO_SD_DATE_VERSION 0x1506190 + + + + +#endif /*_SOC_GPIO_SD_REG_H_ */ + + diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/gpio_sd_struct.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/gpio_sd_struct.h new file mode 100644 index 0000000000000..9981a2eed7f68 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/gpio_sd_struct.h @@ -0,0 +1,60 @@ +// 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. +#ifndef _SOC_GPIO_SD_STRUCT_H_ +#define _SOC_GPIO_SD_STRUCT_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef volatile struct gpio_sd_dev_s { + union { + struct { + uint32_t duty: 8; + uint32_t prescale: 8; + uint32_t reserved16: 16; + }; + uint32_t val; + } channel[8]; + union { + struct { + uint32_t reserved0: 31; + uint32_t clk_en: 1; + }; + uint32_t val; + } cg; + union { + struct { + uint32_t reserved0: 31; + uint32_t spi_swap: 1; + }; + uint32_t val; + } misc; + union { + struct { + uint32_t date: 28; + uint32_t reserved28: 4; + }; + uint32_t val; + } version; +} gpio_sd_dev_t; +extern gpio_sd_dev_t SIGMADELTA; + +#ifdef __cplusplus +} +#endif + +#endif /* _SOC_GPIO_SD_STRUCT_H_ */ diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/gpio_sig_map.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/gpio_sig_map.h new file mode 100644 index 0000000000000..1d3dc5b04cecf --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/gpio_sig_map.h @@ -0,0 +1,422 @@ +// 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. +#ifndef _SOC_GPIO_SIG_MAP_H_ +#define _SOC_GPIO_SIG_MAP_H_ + +#define SPICLK_IN_IDX 0 +#define SPICLK_OUT_IDX 0 +#define SPIQ_IN_IDX 1 +#define SPIQ_OUT_IDX 1 +#define SPID_IN_IDX 2 +#define SPID_OUT_IDX 2 +#define SPIHD_IN_IDX 3 +#define SPIHD_OUT_IDX 3 +#define SPIWP_IN_IDX 4 +#define SPIWP_OUT_IDX 4 +#define SPICS0_IN_IDX 5 +#define SPICS0_OUT_IDX 5 +#define SPICS1_IN_IDX 6 +#define SPICS1_OUT_IDX 6 +#define SPICS2_IN_IDX 7 +#define SPICS2_OUT_IDX 7 +#define HSPICLK_IN_IDX 8 +#define HSPICLK_OUT_IDX 8 +#define HSPIQ_IN_IDX 9 +#define HSPIQ_OUT_IDX 9 +#define HSPID_IN_IDX 10 +#define HSPID_OUT_IDX 10 +#define HSPICS0_IN_IDX 11 +#define HSPICS0_OUT_IDX 11 +#define HSPIHD_IN_IDX 12 +#define HSPIHD_OUT_IDX 12 +#define HSPIWP_IN_IDX 13 +#define HSPIWP_OUT_IDX 13 +#define U0RXD_IN_IDX 14 +#define U0TXD_OUT_IDX 14 +#define U0CTS_IN_IDX 15 +#define U0RTS_OUT_IDX 15 +#define U0DSR_IN_IDX 16 +#define U0DTR_OUT_IDX 16 +#define U1RXD_IN_IDX 17 +#define U1TXD_OUT_IDX 17 +#define U1CTS_IN_IDX 18 +#define U1RTS_OUT_IDX 18 +#define I2CM_SCL_O_IDX 19 +#define I2CM_SDA_I_IDX 20 +#define I2CM_SDA_O_IDX 20 +#define EXT_I2C_SCL_O_IDX 21 +#define EXT_I2C_SDA_O_IDX 22 +#define EXT_I2C_SDA_I_IDX 22 +#define I2S0O_BCK_IN_IDX 23 +#define I2S0O_BCK_OUT_IDX 23 +#define I2S1O_BCK_IN_IDX 24 +#define I2S1O_BCK_OUT_IDX 24 +#define I2S0O_WS_IN_IDX 25 +#define I2S0O_WS_OUT_IDX 25 +#define I2S1O_WS_IN_IDX 26 +#define I2S1O_WS_OUT_IDX 26 +#define I2S0I_BCK_IN_IDX 27 +#define I2S0I_BCK_OUT_IDX 27 +#define I2S0I_WS_IN_IDX 28 +#define I2S0I_WS_OUT_IDX 28 +#define I2CEXT0_SCL_IN_IDX 29 +#define I2CEXT0_SCL_OUT_IDX 29 +#define I2CEXT0_SDA_IN_IDX 30 +#define I2CEXT0_SDA_OUT_IDX 30 +#define PWM0_SYNC0_IN_IDX 31 +#define SDIO_TOHOST_INT_OUT_IDX 31 +#define PWM0_SYNC1_IN_IDX 32 +#define PWM0_OUT0A_IDX 32 +#define PWM0_SYNC2_IN_IDX 33 +#define PWM0_OUT0B_IDX 33 +#define PWM0_F0_IN_IDX 34 +#define PWM0_OUT1A_IDX 34 +#define PWM0_F1_IN_IDX 35 +#define PWM0_OUT1B_IDX 35 +#define PWM0_F2_IN_IDX 36 +#define PWM0_OUT2A_IDX 36 +#define GPIO_BT_ACTIVE_IDX 37 +#define PWM0_OUT2B_IDX 37 +#define GPIO_BT_PRIORITY_IDX 38 +#define PCNT_SIG_CH0_IN0_IDX 39 +#define PCNT_SIG_CH1_IN0_IDX 40 +#define GPIO_WLAN_ACTIVE_IDX 40 +#define PCNT_CTRL_CH0_IN0_IDX 41 +#define BB_DIAG0_IDX 41 +#define PCNT_CTRL_CH1_IN0_IDX 42 +#define BB_DIAG1_IDX 42 +#define PCNT_SIG_CH0_IN1_IDX 43 +#define BB_DIAG2_IDX 43 +#define PCNT_SIG_CH1_IN1_IDX 44 +#define BB_DIAG3_IDX 44 +#define PCNT_CTRL_CH0_IN1_IDX 45 +#define BB_DIAG4_IDX 45 +#define PCNT_CTRL_CH1_IN1_IDX 46 +#define BB_DIAG5_IDX 46 +#define PCNT_SIG_CH0_IN2_IDX 47 +#define BB_DIAG6_IDX 47 +#define PCNT_SIG_CH1_IN2_IDX 48 +#define BB_DIAG7_IDX 48 +#define PCNT_CTRL_CH0_IN2_IDX 49 +#define BB_DIAG8_IDX 49 +#define PCNT_CTRL_CH1_IN2_IDX 50 +#define BB_DIAG9_IDX 50 +#define PCNT_SIG_CH0_IN3_IDX 51 +#define BB_DIAG10_IDX 51 +#define PCNT_SIG_CH1_IN3_IDX 52 +#define BB_DIAG11_IDX 52 +#define PCNT_CTRL_CH0_IN3_IDX 53 +#define BB_DIAG12_IDX 53 +#define PCNT_CTRL_CH1_IN3_IDX 54 +#define BB_DIAG13_IDX 54 +#define PCNT_SIG_CH0_IN4_IDX 55 +#define BB_DIAG14_IDX 55 +#define PCNT_SIG_CH1_IN4_IDX 56 +#define BB_DIAG15_IDX 56 +#define PCNT_CTRL_CH0_IN4_IDX 57 +#define BB_DIAG16_IDX 57 +#define PCNT_CTRL_CH1_IN4_IDX 58 +#define BB_DIAG17_IDX 58 +#define BB_DIAG18_IDX 59 +#define BB_DIAG19_IDX 60 +#define HSPICS1_IN_IDX 61 +#define HSPICS1_OUT_IDX 61 +#define HSPICS2_IN_IDX 62 +#define HSPICS2_OUT_IDX 62 +#define VSPICLK_IN_IDX 63 +#define VSPICLK_OUT_IDX 63 +#define VSPIQ_IN_IDX 64 +#define VSPIQ_OUT_IDX 64 +#define VSPID_IN_IDX 65 +#define VSPID_OUT_IDX 65 +#define VSPIHD_IN_IDX 66 +#define VSPIHD_OUT_IDX 66 +#define VSPIWP_IN_IDX 67 +#define VSPIWP_OUT_IDX 67 +#define VSPICS0_IN_IDX 68 +#define VSPICS0_OUT_IDX 68 +#define VSPICS1_IN_IDX 69 +#define VSPICS1_OUT_IDX 69 +#define VSPICS2_IN_IDX 70 +#define VSPICS2_OUT_IDX 70 +#define PCNT_SIG_CH0_IN5_IDX 71 +#define LEDC_HS_SIG_OUT0_IDX 71 +#define PCNT_SIG_CH1_IN5_IDX 72 +#define LEDC_HS_SIG_OUT1_IDX 72 +#define PCNT_CTRL_CH0_IN5_IDX 73 +#define LEDC_HS_SIG_OUT2_IDX 73 +#define PCNT_CTRL_CH1_IN5_IDX 74 +#define LEDC_HS_SIG_OUT3_IDX 74 +#define PCNT_SIG_CH0_IN6_IDX 75 +#define LEDC_HS_SIG_OUT4_IDX 75 +#define PCNT_SIG_CH1_IN6_IDX 76 +#define LEDC_HS_SIG_OUT5_IDX 76 +#define PCNT_CTRL_CH0_IN6_IDX 77 +#define LEDC_HS_SIG_OUT6_IDX 77 +#define PCNT_CTRL_CH1_IN6_IDX 78 +#define LEDC_HS_SIG_OUT7_IDX 78 +#define PCNT_SIG_CH0_IN7_IDX 79 +#define LEDC_LS_SIG_OUT0_IDX 79 +#define PCNT_SIG_CH1_IN7_IDX 80 +#define LEDC_LS_SIG_OUT1_IDX 80 +#define PCNT_CTRL_CH0_IN7_IDX 81 +#define LEDC_LS_SIG_OUT2_IDX 81 +#define PCNT_CTRL_CH1_IN7_IDX 82 +#define LEDC_LS_SIG_OUT3_IDX 82 +#define RMT_SIG_IN0_IDX 83 +#define LEDC_LS_SIG_OUT4_IDX 83 +#define RMT_SIG_IN1_IDX 84 +#define LEDC_LS_SIG_OUT5_IDX 84 +#define RMT_SIG_IN2_IDX 85 +#define LEDC_LS_SIG_OUT6_IDX 85 +#define RMT_SIG_IN3_IDX 86 +#define LEDC_LS_SIG_OUT7_IDX 86 +#define RMT_SIG_IN4_IDX 87 +#define RMT_SIG_OUT0_IDX 87 +#define RMT_SIG_IN5_IDX 88 +#define RMT_SIG_OUT1_IDX 88 +#define RMT_SIG_IN6_IDX 89 +#define RMT_SIG_OUT2_IDX 89 +#define RMT_SIG_IN7_IDX 90 +#define RMT_SIG_OUT3_IDX 90 +#define RMT_SIG_OUT4_IDX 91 +#define RMT_SIG_OUT5_IDX 92 +#define EXT_ADC_START_IDX 93 +#define RMT_SIG_OUT6_IDX 93 +#define CAN_RX_IDX 94 +#define RMT_SIG_OUT7_IDX 94 +#define I2CEXT1_SCL_IN_IDX 95 +#define I2CEXT1_SCL_OUT_IDX 95 +#define I2CEXT1_SDA_IN_IDX 96 +#define I2CEXT1_SDA_OUT_IDX 96 +#define HOST_CARD_DETECT_N_1_IDX 97 +#define HOST_CCMD_OD_PULLUP_EN_N_IDX 97 +#define HOST_CARD_DETECT_N_2_IDX 98 +#define HOST_RST_N_1_IDX 98 +#define HOST_CARD_WRITE_PRT_1_IDX 99 +#define HOST_RST_N_2_IDX 99 +#define HOST_CARD_WRITE_PRT_2_IDX 100 +#define GPIO_SD0_OUT_IDX 100 +#define HOST_CARD_INT_N_1_IDX 101 +#define GPIO_SD1_OUT_IDX 101 +#define HOST_CARD_INT_N_2_IDX 102 +#define GPIO_SD2_OUT_IDX 102 +#define PWM1_SYNC0_IN_IDX 103 +#define GPIO_SD3_OUT_IDX 103 +#define PWM1_SYNC1_IN_IDX 104 +#define GPIO_SD4_OUT_IDX 104 +#define PWM1_SYNC2_IN_IDX 105 +#define GPIO_SD5_OUT_IDX 105 +#define PWM1_F0_IN_IDX 106 +#define GPIO_SD6_OUT_IDX 106 +#define PWM1_F1_IN_IDX 107 +#define GPIO_SD7_OUT_IDX 107 +#define PWM1_F2_IN_IDX 108 +#define PWM1_OUT0A_IDX 108 +#define PWM0_CAP0_IN_IDX 109 +#define PWM1_OUT0B_IDX 109 +#define PWM0_CAP1_IN_IDX 110 +#define PWM1_OUT1A_IDX 110 +#define PWM0_CAP2_IN_IDX 111 +#define PWM1_OUT1B_IDX 111 +#define PWM1_CAP0_IN_IDX 112 +#define PWM1_OUT2A_IDX 112 +#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 CAN_TX_IDX 123 +#define PWM3_CAP3_IN_IDX 124 +#define CAN_BUS_OFF_ON_IDX 124 +#define CAN_CLKOUT_IDX 125 +#define SPID4_IN_IDX 128 +#define SPID4_OUT_IDX 128 +#define SPID5_IN_IDX 129 +#define SPID5_OUT_IDX 129 +#define SPID6_IN_IDX 130 +#define SPID6_OUT_IDX 130 +#define SPID7_IN_IDX 131 +#define SPID7_OUT_IDX 131 +#define HSPID4_IN_IDX 132 +#define HSPID4_OUT_IDX 132 +#define HSPID5_IN_IDX 133 +#define HSPID5_OUT_IDX 133 +#define HSPID6_IN_IDX 134 +#define HSPID6_OUT_IDX 134 +#define HSPID7_IN_IDX 135 +#define HSPID7_OUT_IDX 135 +#define VSPID4_IN_IDX 136 +#define VSPID4_OUT_IDX 136 +#define VSPID5_IN_IDX 137 +#define VSPID5_OUT_IDX 137 +#define VSPID6_IN_IDX 138 +#define VSPID6_OUT_IDX 138 +#define VSPID7_IN_IDX 139 +#define VSPID7_OUT_IDX 139 +#define I2S0I_DATA_IN0_IDX 140 +#define I2S0O_DATA_OUT0_IDX 140 +#define I2S0I_DATA_IN1_IDX 141 +#define I2S0O_DATA_OUT1_IDX 141 +#define I2S0I_DATA_IN2_IDX 142 +#define I2S0O_DATA_OUT2_IDX 142 +#define I2S0I_DATA_IN3_IDX 143 +#define I2S0O_DATA_OUT3_IDX 143 +#define I2S0I_DATA_IN4_IDX 144 +#define I2S0O_DATA_OUT4_IDX 144 +#define I2S0I_DATA_IN5_IDX 145 +#define I2S0O_DATA_OUT5_IDX 145 +#define I2S0I_DATA_IN6_IDX 146 +#define I2S0O_DATA_OUT6_IDX 146 +#define I2S0I_DATA_IN7_IDX 147 +#define I2S0O_DATA_OUT7_IDX 147 +#define I2S0I_DATA_IN8_IDX 148 +#define I2S0O_DATA_OUT8_IDX 148 +#define I2S0I_DATA_IN9_IDX 149 +#define I2S0O_DATA_OUT9_IDX 149 +#define I2S0I_DATA_IN10_IDX 150 +#define I2S0O_DATA_OUT10_IDX 150 +#define I2S0I_DATA_IN11_IDX 151 +#define I2S0O_DATA_OUT11_IDX 151 +#define I2S0I_DATA_IN12_IDX 152 +#define I2S0O_DATA_OUT12_IDX 152 +#define I2S0I_DATA_IN13_IDX 153 +#define I2S0O_DATA_OUT13_IDX 153 +#define I2S0I_DATA_IN14_IDX 154 +#define I2S0O_DATA_OUT14_IDX 154 +#define I2S0I_DATA_IN15_IDX 155 +#define I2S0O_DATA_OUT15_IDX 155 +#define I2S0O_DATA_OUT16_IDX 156 +#define I2S0O_DATA_OUT17_IDX 157 +#define I2S0O_DATA_OUT18_IDX 158 +#define I2S0O_DATA_OUT19_IDX 159 +#define I2S0O_DATA_OUT20_IDX 160 +#define I2S0O_DATA_OUT21_IDX 161 +#define I2S0O_DATA_OUT22_IDX 162 +#define I2S0O_DATA_OUT23_IDX 163 +#define I2S1I_BCK_IN_IDX 164 +#define I2S1I_BCK_OUT_IDX 164 +#define I2S1I_WS_IN_IDX 165 +#define I2S1I_WS_OUT_IDX 165 +#define I2S1I_DATA_IN0_IDX 166 +#define I2S1O_DATA_OUT0_IDX 166 +#define I2S1I_DATA_IN1_IDX 167 +#define I2S1O_DATA_OUT1_IDX 167 +#define I2S1I_DATA_IN2_IDX 168 +#define I2S1O_DATA_OUT2_IDX 168 +#define I2S1I_DATA_IN3_IDX 169 +#define I2S1O_DATA_OUT3_IDX 169 +#define I2S1I_DATA_IN4_IDX 170 +#define I2S1O_DATA_OUT4_IDX 170 +#define I2S1I_DATA_IN5_IDX 171 +#define I2S1O_DATA_OUT5_IDX 171 +#define I2S1I_DATA_IN6_IDX 172 +#define I2S1O_DATA_OUT6_IDX 172 +#define I2S1I_DATA_IN7_IDX 173 +#define I2S1O_DATA_OUT7_IDX 173 +#define I2S1I_DATA_IN8_IDX 174 +#define I2S1O_DATA_OUT8_IDX 174 +#define I2S1I_DATA_IN9_IDX 175 +#define I2S1O_DATA_OUT9_IDX 175 +#define I2S1I_DATA_IN10_IDX 176 +#define I2S1O_DATA_OUT10_IDX 176 +#define I2S1I_DATA_IN11_IDX 177 +#define I2S1O_DATA_OUT11_IDX 177 +#define I2S1I_DATA_IN12_IDX 178 +#define I2S1O_DATA_OUT12_IDX 178 +#define I2S1I_DATA_IN13_IDX 179 +#define I2S1O_DATA_OUT13_IDX 179 +#define I2S1I_DATA_IN14_IDX 180 +#define I2S1O_DATA_OUT14_IDX 180 +#define I2S1I_DATA_IN15_IDX 181 +#define I2S1O_DATA_OUT15_IDX 181 +#define I2S1O_DATA_OUT16_IDX 182 +#define I2S1O_DATA_OUT17_IDX 183 +#define I2S1O_DATA_OUT18_IDX 184 +#define I2S1O_DATA_OUT19_IDX 185 +#define I2S1O_DATA_OUT20_IDX 186 +#define I2S1O_DATA_OUT21_IDX 187 +#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 +#define U2RTS_OUT_IDX 199 +#define EMAC_MDC_I_IDX 200 +#define EMAC_MDC_O_IDX 200 +#define EMAC_MDI_I_IDX 201 +#define EMAC_MDO_O_IDX 201 +#define EMAC_CRS_I_IDX 202 +#define EMAC_CRS_O_IDX 202 +#define EMAC_COL_I_IDX 203 +#define EMAC_COL_O_IDX 203 +#define PCMFSYNC_IN_IDX 204 +#define BT_AUDIO0_IRQ_IDX 204 +#define PCMCLK_IN_IDX 205 +#define BT_AUDIO1_IRQ_IDX 205 +#define PCMDIN_IDX 206 +#define BT_AUDIO2_IRQ_IDX 206 +#define BLE_AUDIO0_IRQ_IDX 207 +#define BLE_AUDIO1_IRQ_IDX 208 +#define BLE_AUDIO2_IRQ_IDX 209 +#define PCMFSYNC_OUT_IDX 210 +#define PCMCLK_OUT_IDX 211 +#define PCMDOUT_IDX 212 +#define BLE_AUDIO_SYNC0_P_IDX 213 +#define BLE_AUDIO_SYNC1_P_IDX 214 +#define BLE_AUDIO_SYNC2_P_IDX 215 +#define ANT_SEL0_IDX 216 +#define ANT_SEL1_IDX 217 +#define ANT_SEL2_IDX 218 +#define ANT_SEL3_IDX 219 +#define ANT_SEL4_IDX 220 +#define ANT_SEL5_IDX 221 +#define ANT_SEL6_IDX 222 +#define ANT_SEL7_IDX 223 +#define SIG_IN_FUNC224_IDX 224 +#define SIG_IN_FUNC225_IDX 225 +#define SIG_IN_FUNC226_IDX 226 +#define SIG_IN_FUNC227_IDX 227 +#define SIG_IN_FUNC228_IDX 228 +#define SIG_GPIO_OUT_IDX 256 +#endif /* _SOC_GPIO_SIG_MAP_H_ */ diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/gpio_struct.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/gpio_struct.h new file mode 100644 index 0000000000000..add6e741a6c88 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/gpio_struct.h @@ -0,0 +1,216 @@ +// 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. +#ifndef _SOC_GPIO_STRUCT_H_ +#define _SOC_GPIO_STRUCT_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef volatile struct gpio_dev_s { + uint32_t bt_select; /*NA*/ + uint32_t out; /*GPIO0~31 output value*/ + uint32_t out_w1ts; /*GPIO0~31 output value write 1 to set*/ + uint32_t out_w1tc; /*GPIO0~31 output value write 1 to clear*/ + union { + struct { + uint32_t data: 8; /*GPIO32~39 output value*/ + uint32_t reserved8: 24; + }; + uint32_t val; + } out1; + union { + struct { + uint32_t data: 8; /*GPIO32~39 output value write 1 to set*/ + uint32_t reserved8: 24; + }; + uint32_t val; + } out1_w1ts; + union { + struct { + uint32_t data: 8; /*GPIO32~39 output value write 1 to clear*/ + uint32_t reserved8: 24; + }; + uint32_t val; + } out1_w1tc; + union { + struct { + uint32_t sel: 8; /*SDIO PADS on/off control from outside*/ + uint32_t reserved8: 24; + }; + uint32_t val; + } sdio_select; + uint32_t enable; /*GPIO0~31 output enable*/ + uint32_t enable_w1ts; /*GPIO0~31 output enable write 1 to set*/ + uint32_t enable_w1tc; /*GPIO0~31 output enable write 1 to clear*/ + union { + struct { + uint32_t data: 8; /*GPIO32~39 output enable*/ + uint32_t reserved8: 24; + }; + uint32_t val; + } enable1; + union { + struct { + uint32_t data: 8; /*GPIO32~39 output enable write 1 to set*/ + uint32_t reserved8: 24; + }; + uint32_t val; + } enable1_w1ts; + union { + struct { + uint32_t data: 8; /*GPIO32~39 output enable write 1 to clear*/ + uint32_t reserved8: 24; + }; + uint32_t val; + } enable1_w1tc; + union { + struct { + uint32_t strapping: 16; /*GPIO strapping results: {2'd0 boot_sel_dig[7:1] vsdio_boot_sel boot_sel_chip[5:0]} . Boot_sel_dig[7:1]: {U0RXD SD_CLK SD_CMD SD_DATA0 SD_DATA1 SD_DATA2 SD_DATA3} . vsdio_boot_sel: MTDI. boot_sel_chip[5:0]: {GPIO0 U0TXD GPIO2 GPIO4 MTDO GPIO5} */ + uint32_t reserved16:16; + }; + uint32_t val; + } strap; + uint32_t in; /*GPIO0~31 input value*/ + union { + struct { + uint32_t data: 8; /*GPIO32~39 input value*/ + uint32_t reserved8: 24; + }; + uint32_t val; + } in1; + uint32_t status; /*GPIO0~31 interrupt status*/ + uint32_t status_w1ts; /*GPIO0~31 interrupt status write 1 to set*/ + uint32_t status_w1tc; /*GPIO0~31 interrupt status write 1 to clear*/ + union { + struct { + uint32_t intr_st: 8; /*GPIO32~39 interrupt status*/ + uint32_t reserved8: 24; + }; + uint32_t val; + } status1; + union { + struct { + uint32_t intr_st: 8; /*GPIO32~39 interrupt status write 1 to set*/ + uint32_t reserved8: 24; + }; + uint32_t val; + } status1_w1ts; + union { + struct { + uint32_t intr_st: 8; /*GPIO32~39 interrupt status write 1 to clear*/ + uint32_t reserved8: 24; + }; + uint32_t val; + } status1_w1tc; + uint32_t reserved_5c; + uint32_t acpu_int; /*GPIO0~31 APP CPU interrupt status*/ + uint32_t acpu_nmi_int; /*GPIO0~31 APP CPU non-maskable interrupt status*/ + uint32_t pcpu_int; /*GPIO0~31 PRO CPU interrupt status*/ + uint32_t pcpu_nmi_int; /*GPIO0~31 PRO CPU non-maskable interrupt status*/ + uint32_t cpusdio_int; /*SDIO's extent GPIO0~31 interrupt*/ + union { + struct { + uint32_t intr: 8; /*GPIO32~39 APP CPU interrupt status*/ + uint32_t reserved8: 24; + }; + uint32_t val; + } acpu_int1; + union { + struct { + uint32_t intr: 8; /*GPIO32~39 APP CPU non-maskable interrupt status*/ + uint32_t reserved8: 24; + }; + uint32_t val; + } acpu_nmi_int1; + union { + struct { + uint32_t intr: 8; /*GPIO32~39 PRO CPU interrupt status*/ + uint32_t reserved8: 24; + }; + uint32_t val; + } pcpu_int1; + union { + struct { + uint32_t intr: 8; /*GPIO32~39 PRO CPU non-maskable interrupt status*/ + uint32_t reserved8: 24; + }; + uint32_t val; + } pcpu_nmi_int1; + union { + struct { + uint32_t intr: 8; /*SDIO's extent GPIO32~39 interrupt*/ + uint32_t reserved8: 24; + }; + uint32_t val; + } cpusdio_int1; + union { + struct { + uint32_t reserved0: 2; + uint32_t pad_driver: 1; /*if set to 0: normal output if set to 1: open drain*/ + uint32_t reserved3: 4; + uint32_t int_type: 3; /*if set to 0: GPIO interrupt disable if set to 1: rising edge trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ + uint32_t wakeup_enable: 1; /*GPIO wake up enable only available in light sleep*/ + uint32_t config: 2; /*NA*/ + uint32_t int_ena: 5; /*bit0: APP CPU interrupt enable bit1: APP CPU non-maskable interrupt enable bit3: PRO CPU interrupt enable bit4: PRO CPU non-maskable interrupt enable bit5: SDIO's extent interrupt enable*/ + uint32_t reserved18: 14; + }; + uint32_t val; + } pin[40]; + union { + struct { + uint32_t rtc_max: 10; + uint32_t reserved10: 21; + uint32_t start: 1; + }; + uint32_t val; + } cali_conf; + union { + struct { + uint32_t value_sync2: 20; + uint32_t reserved20: 10; + uint32_t rdy_real: 1; + uint32_t rdy_sync2: 1; + }; + uint32_t val; + } cali_data; + union { + struct { + uint32_t func_sel: 6; /*select one of the 256 inputs*/ + uint32_t sig_in_inv: 1; /*revert the value of the input if you want to revert please set the value to 1*/ + uint32_t sig_in_sel: 1; /*if the slow signal bypass the io matrix or not if you want setting the value to 1*/ + uint32_t reserved8: 24; /*The 256 registers below are selection control for 256 input signals connected to GPIO matrix's 40 GPIO input if GPIO_FUNCx_IN_SEL is set to n(0<=n<40): it means GPIOn input is used for input signal x if GPIO_FUNCx_IN_SEL is set to 0x38: the input signal x is set to 1 if GPIO_FUNCx_IN_SEL is set to 0x30: the input signal x is set to 0*/ + }; + uint32_t val; + } func_in_sel_cfg[256]; + union { + struct { + uint32_t func_sel: 9; /*select one of the 256 output to 40 GPIO*/ + uint32_t inv_sel: 1; /*invert the output value if you want to revert the output value setting the value to 1*/ + uint32_t oen_sel: 1; /*weather using the logical oen signal or not using the value setting by the register*/ + uint32_t oen_inv_sel: 1; /*invert the output enable value if you want to revert the output enable value setting the value to 1*/ + uint32_t reserved12: 20; /*The 40 registers below are selection control for 40 GPIO output if GPIO_FUNCx_OUT_SEL is set to n(0<=n<256): it means GPIOn input is used for output signal x if GPIO_FUNCx_OUT_INV_SEL is set to 1 the output signal x is set to ~value. if GPIO_FUNC0_OUT_SEL is 256 or GPIO_FUNC0_OEN_SEL is 1 using GPIO_ENABLE_DATA[x] for the enable value else using the signal enable*/ + }; + uint32_t val; + } func_out_sel_cfg[40]; +} gpio_dev_t; +extern gpio_dev_t GPIO; + +#ifdef __cplusplus +} +#endif + +#endif /* _SOC_GPIO_STRUCT_H_ */ diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/hinf_reg.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/hinf_reg.h new file mode 100644 index 0000000000000..aad357864eb57 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/hinf_reg.h @@ -0,0 +1,248 @@ +// 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. +#ifndef _SOC_HINF_REG_H_ +#define _SOC_HINF_REG_H_ + + +#include "soc.h" +#define HINF_CFG_DATA0_REG (DR_REG_HINF_BASE + 0x0) +/* HINF_DEVICE_ID_FN1 : R/W ;bitpos:[31:16] ;default: 16'h2222 ; */ +/*description: */ +#define HINF_DEVICE_ID_FN1 0x0000FFFF +#define HINF_DEVICE_ID_FN1_M ((HINF_DEVICE_ID_FN1_V)<<(HINF_DEVICE_ID_FN1_S)) +#define HINF_DEVICE_ID_FN1_V 0xFFFF +#define HINF_DEVICE_ID_FN1_S 16 +/* HINF_USER_ID_FN1 : R/W ;bitpos:[15:0] ;default: 16'h6666 ; */ +/*description: */ +#define HINF_USER_ID_FN1 0x0000FFFF +#define HINF_USER_ID_FN1_M ((HINF_USER_ID_FN1_V)<<(HINF_USER_ID_FN1_S)) +#define HINF_USER_ID_FN1_V 0xFFFF +#define HINF_USER_ID_FN1_S 0 + +#define HINF_CFG_DATA1_REG (DR_REG_HINF_BASE + 0x4) +/* HINF_SDIO20_CONF1 : R/W ;bitpos:[31:29] ;default: 3'h0 ; */ +/*description: */ +#define HINF_SDIO20_CONF1 0x00000007 +#define HINF_SDIO20_CONF1_M ((HINF_SDIO20_CONF1_V)<<(HINF_SDIO20_CONF1_S)) +#define HINF_SDIO20_CONF1_V 0x7 +#define HINF_SDIO20_CONF1_S 29 +/* HINF_FUNC2_EPS : RO ;bitpos:[28] ;default: 1'b0 ; */ +/*description: */ +#define HINF_FUNC2_EPS (BIT(28)) +#define HINF_FUNC2_EPS_M (BIT(28)) +#define HINF_FUNC2_EPS_V 0x1 +#define HINF_FUNC2_EPS_S 28 +/* HINF_SDIO_VER : R/W ;bitpos:[27:16] ;default: 12'h111 ; */ +/*description: */ +#define HINF_SDIO_VER 0x00000FFF +#define HINF_SDIO_VER_M ((HINF_SDIO_VER_V)<<(HINF_SDIO_VER_S)) +#define HINF_SDIO_VER_V 0xFFF +#define HINF_SDIO_VER_S 16 +/* HINF_SDIO20_CONF0 : R/W ;bitpos:[15:12] ;default: 4'b0 ; */ +/*description: */ +#define HINF_SDIO20_CONF0 0x0000000F +#define HINF_SDIO20_CONF0_M ((HINF_SDIO20_CONF0_V)<<(HINF_SDIO20_CONF0_S)) +#define HINF_SDIO20_CONF0_V 0xF +#define HINF_SDIO20_CONF0_S 12 +/* HINF_IOENABLE1 : RO ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define HINF_IOENABLE1 (BIT(11)) +#define HINF_IOENABLE1_M (BIT(11)) +#define HINF_IOENABLE1_V 0x1 +#define HINF_IOENABLE1_S 11 +/* HINF_EMP : RO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define HINF_EMP (BIT(10)) +#define HINF_EMP_M (BIT(10)) +#define HINF_EMP_V 0x1 +#define HINF_EMP_S 10 +/* HINF_FUNC1_EPS : RO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define HINF_FUNC1_EPS (BIT(9)) +#define HINF_FUNC1_EPS_M (BIT(9)) +#define HINF_FUNC1_EPS_V 0x1 +#define HINF_FUNC1_EPS_S 9 +/* HINF_CD_DISABLE : RO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define HINF_CD_DISABLE (BIT(8)) +#define HINF_CD_DISABLE_M (BIT(8)) +#define HINF_CD_DISABLE_V 0x1 +#define HINF_CD_DISABLE_S 8 +/* HINF_IOENABLE2 : RO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define HINF_IOENABLE2 (BIT(7)) +#define HINF_IOENABLE2_M (BIT(7)) +#define HINF_IOENABLE2_V 0x1 +#define HINF_IOENABLE2_S 7 +/* HINF_SDIO_INT_MASK : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define HINF_SDIO_INT_MASK (BIT(6)) +#define HINF_SDIO_INT_MASK_M (BIT(6)) +#define HINF_SDIO_INT_MASK_V 0x1 +#define HINF_SDIO_INT_MASK_S 6 +/* HINF_SDIO_IOREADY2 : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define HINF_SDIO_IOREADY2 (BIT(5)) +#define HINF_SDIO_IOREADY2_M (BIT(5)) +#define HINF_SDIO_IOREADY2_V 0x1 +#define HINF_SDIO_IOREADY2_S 5 +/* HINF_SDIO_CD_ENABLE : R/W ;bitpos:[4] ;default: 1'b1 ; */ +/*description: */ +#define HINF_SDIO_CD_ENABLE (BIT(4)) +#define HINF_SDIO_CD_ENABLE_M (BIT(4)) +#define HINF_SDIO_CD_ENABLE_V 0x1 +#define HINF_SDIO_CD_ENABLE_S 4 +/* HINF_HIGHSPEED_MODE : RO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define HINF_HIGHSPEED_MODE (BIT(3)) +#define HINF_HIGHSPEED_MODE_M (BIT(3)) +#define HINF_HIGHSPEED_MODE_V 0x1 +#define HINF_HIGHSPEED_MODE_S 3 +/* HINF_HIGHSPEED_ENABLE : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define HINF_HIGHSPEED_ENABLE (BIT(2)) +#define HINF_HIGHSPEED_ENABLE_M (BIT(2)) +#define HINF_HIGHSPEED_ENABLE_V 0x1 +#define HINF_HIGHSPEED_ENABLE_S 2 +/* HINF_SDIO_IOREADY1 : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define HINF_SDIO_IOREADY1 (BIT(1)) +#define HINF_SDIO_IOREADY1_M (BIT(1)) +#define HINF_SDIO_IOREADY1_V 0x1 +#define HINF_SDIO_IOREADY1_S 1 +/* HINF_SDIO_ENABLE : R/W ;bitpos:[0] ;default: 1'b1 ; */ +/*description: */ +#define HINF_SDIO_ENABLE (BIT(0)) +#define HINF_SDIO_ENABLE_M (BIT(0)) +#define HINF_SDIO_ENABLE_V 0x1 +#define HINF_SDIO_ENABLE_S 0 + +#define HINF_CFG_DATA7_REG (DR_REG_HINF_BASE + 0x1C) +/* HINF_SDIO_IOREADY0 : R/W ;bitpos:[17] ;default: 1'b1 ; */ +/*description: */ +#define HINF_SDIO_IOREADY0 (BIT(17)) +#define HINF_SDIO_IOREADY0_M (BIT(17)) +#define HINF_SDIO_IOREADY0_V 0x1 +#define HINF_SDIO_IOREADY0_S 17 +/* HINF_SDIO_RST : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define HINF_SDIO_RST (BIT(16)) +#define HINF_SDIO_RST_M (BIT(16)) +#define HINF_SDIO_RST_V 0x1 +#define HINF_SDIO_RST_S 16 +/* HINF_CHIP_STATE : R/W ;bitpos:[15:8] ;default: 8'b0 ; */ +/*description: */ +#define HINF_CHIP_STATE 0x000000FF +#define HINF_CHIP_STATE_M ((HINF_CHIP_STATE_V)<<(HINF_CHIP_STATE_S)) +#define HINF_CHIP_STATE_V 0xFF +#define HINF_CHIP_STATE_S 8 +/* HINF_PIN_STATE : R/W ;bitpos:[7:0] ;default: 8'b0 ; */ +/*description: */ +#define HINF_PIN_STATE 0x000000FF +#define HINF_PIN_STATE_M ((HINF_PIN_STATE_V)<<(HINF_PIN_STATE_S)) +#define HINF_PIN_STATE_V 0xFF +#define HINF_PIN_STATE_S 0 + +#define HINF_CIS_CONF0_REG (DR_REG_HINF_BASE + 0x20) +/* HINF_CIS_CONF_W0 : R/W ;bitpos:[31:0] ;default: 32'hffffffff ; */ +/*description: */ +#define HINF_CIS_CONF_W0 0xFFFFFFFF +#define HINF_CIS_CONF_W0_M ((HINF_CIS_CONF_W0_V)<<(HINF_CIS_CONF_W0_S)) +#define HINF_CIS_CONF_W0_V 0xFFFFFFFF +#define HINF_CIS_CONF_W0_S 0 + +#define HINF_CIS_CONF1_REG (DR_REG_HINF_BASE + 0x24) +/* HINF_CIS_CONF_W1 : R/W ;bitpos:[31:0] ;default: 32'hffffffff ; */ +/*description: */ +#define HINF_CIS_CONF_W1 0xFFFFFFFF +#define HINF_CIS_CONF_W1_M ((HINF_CIS_CONF_W1_V)<<(HINF_CIS_CONF_W1_S)) +#define HINF_CIS_CONF_W1_V 0xFFFFFFFF +#define HINF_CIS_CONF_W1_S 0 + +#define HINF_CIS_CONF2_REG (DR_REG_HINF_BASE + 0x28) +/* HINF_CIS_CONF_W2 : R/W ;bitpos:[31:0] ;default: 32'hffffffff ; */ +/*description: */ +#define HINF_CIS_CONF_W2 0xFFFFFFFF +#define HINF_CIS_CONF_W2_M ((HINF_CIS_CONF_W2_V)<<(HINF_CIS_CONF_W2_S)) +#define HINF_CIS_CONF_W2_V 0xFFFFFFFF +#define HINF_CIS_CONF_W2_S 0 + +#define HINF_CIS_CONF3_REG (DR_REG_HINF_BASE + 0x2C) +/* HINF_CIS_CONF_W3 : R/W ;bitpos:[31:0] ;default: 32'hffffffff ; */ +/*description: */ +#define HINF_CIS_CONF_W3 0xFFFFFFFF +#define HINF_CIS_CONF_W3_M ((HINF_CIS_CONF_W3_V)<<(HINF_CIS_CONF_W3_S)) +#define HINF_CIS_CONF_W3_V 0xFFFFFFFF +#define HINF_CIS_CONF_W3_S 0 + +#define HINF_CIS_CONF4_REG (DR_REG_HINF_BASE + 0x30) +/* HINF_CIS_CONF_W4 : R/W ;bitpos:[31:0] ;default: 32'hffffffff ; */ +/*description: */ +#define HINF_CIS_CONF_W4 0xFFFFFFFF +#define HINF_CIS_CONF_W4_M ((HINF_CIS_CONF_W4_V)<<(HINF_CIS_CONF_W4_S)) +#define HINF_CIS_CONF_W4_V 0xFFFFFFFF +#define HINF_CIS_CONF_W4_S 0 + +#define HINF_CIS_CONF5_REG (DR_REG_HINF_BASE + 0x34) +/* HINF_CIS_CONF_W5 : R/W ;bitpos:[31:0] ;default: 32'hffffffff ; */ +/*description: */ +#define HINF_CIS_CONF_W5 0xFFFFFFFF +#define HINF_CIS_CONF_W5_M ((HINF_CIS_CONF_W5_V)<<(HINF_CIS_CONF_W5_S)) +#define HINF_CIS_CONF_W5_V 0xFFFFFFFF +#define HINF_CIS_CONF_W5_S 0 + +#define HINF_CIS_CONF6_REG (DR_REG_HINF_BASE + 0x38) +/* HINF_CIS_CONF_W6 : R/W ;bitpos:[31:0] ;default: 32'hffffffff ; */ +/*description: */ +#define HINF_CIS_CONF_W6 0xFFFFFFFF +#define HINF_CIS_CONF_W6_M ((HINF_CIS_CONF_W6_V)<<(HINF_CIS_CONF_W6_S)) +#define HINF_CIS_CONF_W6_V 0xFFFFFFFF +#define HINF_CIS_CONF_W6_S 0 + +#define HINF_CIS_CONF7_REG (DR_REG_HINF_BASE + 0x3C) +/* HINF_CIS_CONF_W7 : R/W ;bitpos:[31:0] ;default: 32'hffffffff ; */ +/*description: */ +#define HINF_CIS_CONF_W7 0xFFFFFFFF +#define HINF_CIS_CONF_W7_M ((HINF_CIS_CONF_W7_V)<<(HINF_CIS_CONF_W7_S)) +#define HINF_CIS_CONF_W7_V 0xFFFFFFFF +#define HINF_CIS_CONF_W7_S 0 + +#define HINF_CFG_DATA16_REG (DR_REG_HINF_BASE + 0x40) +/* HINF_DEVICE_ID_FN2 : R/W ;bitpos:[31:16] ;default: 16'h3333 ; */ +/*description: */ +#define HINF_DEVICE_ID_FN2 0x0000FFFF +#define HINF_DEVICE_ID_FN2_M ((HINF_DEVICE_ID_FN2_V)<<(HINF_DEVICE_ID_FN2_S)) +#define HINF_DEVICE_ID_FN2_V 0xFFFF +#define HINF_DEVICE_ID_FN2_S 16 +/* HINF_USER_ID_FN2 : R/W ;bitpos:[15:0] ;default: 16'h6666 ; */ +/*description: */ +#define HINF_USER_ID_FN2 0x0000FFFF +#define HINF_USER_ID_FN2_M ((HINF_USER_ID_FN2_V)<<(HINF_USER_ID_FN2_S)) +#define HINF_USER_ID_FN2_V 0xFFFF +#define HINF_USER_ID_FN2_S 0 + +#define HINF_DATE_REG (DR_REG_HINF_BASE + 0xFC) +/* HINF_SDIO_DATE : R/W ;bitpos:[31:0] ;default: 32'h15030200 ; */ +/*description: */ +#define HINF_SDIO_DATE 0xFFFFFFFF +#define HINF_SDIO_DATE_M ((HINF_SDIO_DATE_V)<<(HINF_SDIO_DATE_S)) +#define HINF_SDIO_DATE_V 0xFFFFFFFF +#define HINF_SDIO_DATE_S 0 + + + + +#endif /*_SOC_HINF_REG_H_ */ + + diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/hinf_struct.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/hinf_struct.h new file mode 100644 index 0000000000000..d04d07ea2e063 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/hinf_struct.h @@ -0,0 +1,136 @@ +// 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. +#ifndef _SOC_HINF_STRUCT_H_ +#define _SOC_HINF_STRUCT_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef volatile struct hinf_dev_s { + union { + struct { + uint32_t user_id_fn1: 16; + uint32_t device_id_fn1:16; + }; + uint32_t val; + } cfg_data0; + union { + struct { + uint32_t sdio_enable: 1; + uint32_t sdio_ioready1: 1; + uint32_t highspeed_enable: 1; + uint32_t highspeed_mode: 1; + uint32_t sdio_cd_enable: 1; + uint32_t sdio_ioready2: 1; + uint32_t sdio_int_mask: 1; + uint32_t ioenable2: 1; + uint32_t cd_disable: 1; + uint32_t func1_eps: 1; + uint32_t emp: 1; + uint32_t ioenable1: 1; + uint32_t sdio20_conf0: 4; + uint32_t sdio_ver: 12; + uint32_t func2_eps: 1; + uint32_t sdio20_conf1: 3; + }; + uint32_t val; + } cfg_data1; + uint32_t reserved_8; + uint32_t reserved_c; + uint32_t reserved_10; + uint32_t reserved_14; + uint32_t reserved_18; + union { + struct { + uint32_t pin_state: 8; + uint32_t chip_state: 8; + uint32_t sdio_rst: 1; + uint32_t sdio_ioready0: 1; + uint32_t reserved18: 14; + }; + uint32_t val; + } cfg_data7; + uint32_t cis_conf0; /**/ + uint32_t cis_conf1; /**/ + uint32_t cis_conf2; /**/ + uint32_t cis_conf3; /**/ + uint32_t cis_conf4; /**/ + uint32_t cis_conf5; /**/ + uint32_t cis_conf6; /**/ + uint32_t cis_conf7; /**/ + union { + struct { + uint32_t user_id_fn2: 16; + uint32_t device_id_fn2:16; + }; + uint32_t val; + } cfg_data16; + 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; + 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; /**/ +} hinf_dev_t; +extern hinf_dev_t HINF; + +#ifdef __cplusplus +} +#endif + +#endif /* _SOC_HINF_STRUCT_H_ */ diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/host_reg.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/host_reg.h new file mode 100644 index 0000000000000..ef556e21cdc47 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/host_reg.h @@ -0,0 +1,3144 @@ +// 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. +#ifndef _SOC_HOST_REG_H_ +#define _SOC_HOST_REG_H_ + + +#include "soc.h" +#define HOST_SLCHOST_FUNC2_0_REG (DR_REG_SLCHOST_BASE + 0x10) +/* HOST_SLC_FUNC2_INT : R/W ;bitpos:[24] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC_FUNC2_INT (BIT(24)) +#define HOST_SLC_FUNC2_INT_M (BIT(24)) +#define HOST_SLC_FUNC2_INT_V 0x1 +#define HOST_SLC_FUNC2_INT_S 24 + +#define HOST_SLCHOST_FUNC2_1_REG (DR_REG_SLCHOST_BASE + 0x14) +/* HOST_SLC_FUNC2_INT_EN : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC_FUNC2_INT_EN (BIT(0)) +#define HOST_SLC_FUNC2_INT_EN_M (BIT(0)) +#define HOST_SLC_FUNC2_INT_EN_V 0x1 +#define HOST_SLC_FUNC2_INT_EN_S 0 + +#define HOST_SLCHOST_FUNC2_2_REG (DR_REG_SLCHOST_BASE + 0x20) +/* HOST_SLC_FUNC1_MDSTAT : R/W ;bitpos:[0] ;default: 1'b1 ; */ +/*description: */ +#define HOST_SLC_FUNC1_MDSTAT (BIT(0)) +#define HOST_SLC_FUNC1_MDSTAT_M (BIT(0)) +#define HOST_SLC_FUNC1_MDSTAT_V 0x1 +#define HOST_SLC_FUNC1_MDSTAT_S 0 + +#define HOST_SLCHOST_GPIO_STATUS0_REG (DR_REG_SLCHOST_BASE + 0x34) +/* HOST_GPIO_SDIO_INT0 : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define HOST_GPIO_SDIO_INT0 0xFFFFFFFF +#define HOST_GPIO_SDIO_INT0_M ((HOST_GPIO_SDIO_INT0_V)<<(HOST_GPIO_SDIO_INT0_S)) +#define HOST_GPIO_SDIO_INT0_V 0xFFFFFFFF +#define HOST_GPIO_SDIO_INT0_S 0 + +#define HOST_SLCHOST_GPIO_STATUS1_REG (DR_REG_SLCHOST_BASE + 0x38) +/* HOST_GPIO_SDIO_INT1 : RO ;bitpos:[7:0] ;default: 8'b0 ; */ +/*description: */ +#define HOST_GPIO_SDIO_INT1 0x000000FF +#define HOST_GPIO_SDIO_INT1_M ((HOST_GPIO_SDIO_INT1_V)<<(HOST_GPIO_SDIO_INT1_S)) +#define HOST_GPIO_SDIO_INT1_V 0xFF +#define HOST_GPIO_SDIO_INT1_S 0 + +#define HOST_SLCHOST_GPIO_IN0_REG (DR_REG_SLCHOST_BASE + 0x3C) +/* HOST_GPIO_SDIO_IN0 : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define HOST_GPIO_SDIO_IN0 0xFFFFFFFF +#define HOST_GPIO_SDIO_IN0_M ((HOST_GPIO_SDIO_IN0_V)<<(HOST_GPIO_SDIO_IN0_S)) +#define HOST_GPIO_SDIO_IN0_V 0xFFFFFFFF +#define HOST_GPIO_SDIO_IN0_S 0 + +#define HOST_SLCHOST_GPIO_IN1_REG (DR_REG_SLCHOST_BASE + 0x40) +/* HOST_GPIO_SDIO_IN1 : RO ;bitpos:[7:0] ;default: 8'b0 ; */ +/*description: */ +#define HOST_GPIO_SDIO_IN1 0x000000FF +#define HOST_GPIO_SDIO_IN1_M ((HOST_GPIO_SDIO_IN1_V)<<(HOST_GPIO_SDIO_IN1_S)) +#define HOST_GPIO_SDIO_IN1_V 0xFF +#define HOST_GPIO_SDIO_IN1_S 0 + +#define HOST_SLC0HOST_TOKEN_RDATA_REG (DR_REG_SLCHOST_BASE + 0x44) +/* HOST_SLC0_RX_PF_EOF : RO ;bitpos:[31:28] ;default: 4'h0 ; */ +/*description: */ +#define HOST_SLC0_RX_PF_EOF 0x0000000F +#define HOST_SLC0_RX_PF_EOF_M ((HOST_SLC0_RX_PF_EOF_V)<<(HOST_SLC0_RX_PF_EOF_S)) +#define HOST_SLC0_RX_PF_EOF_V 0xF +#define HOST_SLC0_RX_PF_EOF_S 28 +/* HOST_HOSTSLC0_TOKEN1 : RO ;bitpos:[27:16] ;default: 12'h0 ; */ +/*description: */ +#define HOST_HOSTSLC0_TOKEN1 0x00000FFF +#define HOST_HOSTSLC0_TOKEN1_M ((HOST_HOSTSLC0_TOKEN1_V)<<(HOST_HOSTSLC0_TOKEN1_S)) +#define HOST_HOSTSLC0_TOKEN1_V 0xFFF +#define HOST_HOSTSLC0_TOKEN1_S 16 +/* HOST_SLC0_RX_PF_VALID : RO ;bitpos:[12] ;default: 4'h0 ; */ +/*description: */ +#define HOST_SLC0_RX_PF_VALID (BIT(12)) +#define HOST_SLC0_RX_PF_VALID_M (BIT(12)) +#define HOST_SLC0_RX_PF_VALID_V 0x1 +#define HOST_SLC0_RX_PF_VALID_S 12 +/* HOST_SLC0_TOKEN0 : RO ;bitpos:[11:0] ;default: 12'h0 ; */ +/*description: */ +#define HOST_SLC0_TOKEN0 0x00000FFF +#define HOST_SLC0_TOKEN0_M ((HOST_SLC0_TOKEN0_V)<<(HOST_SLC0_TOKEN0_S)) +#define HOST_SLC0_TOKEN0_V 0xFFF +#define HOST_SLC0_TOKEN0_S 0 + +#define HOST_SLC0_HOST_PF_REG (DR_REG_SLCHOST_BASE + 0x48) +/* HOST_SLC0_PF_DATA : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define HOST_SLC0_PF_DATA 0xFFFFFFFF +#define HOST_SLC0_PF_DATA_M ((HOST_SLC0_PF_DATA_V)<<(HOST_SLC0_PF_DATA_S)) +#define HOST_SLC0_PF_DATA_V 0xFFFFFFFF +#define HOST_SLC0_PF_DATA_S 0 + +#define HOST_SLC1_HOST_PF_REG (DR_REG_SLCHOST_BASE + 0x4C) +/* HOST_SLC1_PF_DATA : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define HOST_SLC1_PF_DATA 0xFFFFFFFF +#define HOST_SLC1_PF_DATA_M ((HOST_SLC1_PF_DATA_V)<<(HOST_SLC1_PF_DATA_S)) +#define HOST_SLC1_PF_DATA_V 0xFFFFFFFF +#define HOST_SLC1_PF_DATA_S 0 + +#define HOST_SLC0HOST_INT_RAW_REG (DR_REG_SLCHOST_BASE + 0x50) +/* HOST_GPIO_SDIO_INT_RAW : RO ;bitpos:[25] ;default: 1'b0 ; */ +/*description: */ +#define HOST_GPIO_SDIO_INT_RAW (BIT(25)) +#define HOST_GPIO_SDIO_INT_RAW_M (BIT(25)) +#define HOST_GPIO_SDIO_INT_RAW_V 0x1 +#define HOST_GPIO_SDIO_INT_RAW_S 25 +/* HOST_SLC0_HOST_RD_RETRY_INT_RAW : RO ;bitpos:[24] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_HOST_RD_RETRY_INT_RAW (BIT(24)) +#define HOST_SLC0_HOST_RD_RETRY_INT_RAW_M (BIT(24)) +#define HOST_SLC0_HOST_RD_RETRY_INT_RAW_V 0x1 +#define HOST_SLC0_HOST_RD_RETRY_INT_RAW_S 24 +/* HOST_SLC0_RX_NEW_PACKET_INT_RAW : RO ;bitpos:[23] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_RX_NEW_PACKET_INT_RAW (BIT(23)) +#define HOST_SLC0_RX_NEW_PACKET_INT_RAW_M (BIT(23)) +#define HOST_SLC0_RX_NEW_PACKET_INT_RAW_V 0x1 +#define HOST_SLC0_RX_NEW_PACKET_INT_RAW_S 23 +/* HOST_SLC0_EXT_BIT3_INT_RAW : RO ;bitpos:[22] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_EXT_BIT3_INT_RAW (BIT(22)) +#define HOST_SLC0_EXT_BIT3_INT_RAW_M (BIT(22)) +#define HOST_SLC0_EXT_BIT3_INT_RAW_V 0x1 +#define HOST_SLC0_EXT_BIT3_INT_RAW_S 22 +/* HOST_SLC0_EXT_BIT2_INT_RAW : RO ;bitpos:[21] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_EXT_BIT2_INT_RAW (BIT(21)) +#define HOST_SLC0_EXT_BIT2_INT_RAW_M (BIT(21)) +#define HOST_SLC0_EXT_BIT2_INT_RAW_V 0x1 +#define HOST_SLC0_EXT_BIT2_INT_RAW_S 21 +/* HOST_SLC0_EXT_BIT1_INT_RAW : RO ;bitpos:[20] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_EXT_BIT1_INT_RAW (BIT(20)) +#define HOST_SLC0_EXT_BIT1_INT_RAW_M (BIT(20)) +#define HOST_SLC0_EXT_BIT1_INT_RAW_V 0x1 +#define HOST_SLC0_EXT_BIT1_INT_RAW_S 20 +/* HOST_SLC0_EXT_BIT0_INT_RAW : RO ;bitpos:[19] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_EXT_BIT0_INT_RAW (BIT(19)) +#define HOST_SLC0_EXT_BIT0_INT_RAW_M (BIT(19)) +#define HOST_SLC0_EXT_BIT0_INT_RAW_V 0x1 +#define HOST_SLC0_EXT_BIT0_INT_RAW_S 19 +/* HOST_SLC0_RX_PF_VALID_INT_RAW : RO ;bitpos:[18] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_RX_PF_VALID_INT_RAW (BIT(18)) +#define HOST_SLC0_RX_PF_VALID_INT_RAW_M (BIT(18)) +#define HOST_SLC0_RX_PF_VALID_INT_RAW_V 0x1 +#define HOST_SLC0_RX_PF_VALID_INT_RAW_S 18 +/* HOST_SLC0_TX_OVF_INT_RAW : RO ;bitpos:[17] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TX_OVF_INT_RAW (BIT(17)) +#define HOST_SLC0_TX_OVF_INT_RAW_M (BIT(17)) +#define HOST_SLC0_TX_OVF_INT_RAW_V 0x1 +#define HOST_SLC0_TX_OVF_INT_RAW_S 17 +/* HOST_SLC0_RX_UDF_INT_RAW : RO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_RX_UDF_INT_RAW (BIT(16)) +#define HOST_SLC0_RX_UDF_INT_RAW_M (BIT(16)) +#define HOST_SLC0_RX_UDF_INT_RAW_V 0x1 +#define HOST_SLC0_RX_UDF_INT_RAW_S 16 +/* HOST_SLC0HOST_TX_START_INT_RAW : RO ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0HOST_TX_START_INT_RAW (BIT(15)) +#define HOST_SLC0HOST_TX_START_INT_RAW_M (BIT(15)) +#define HOST_SLC0HOST_TX_START_INT_RAW_V 0x1 +#define HOST_SLC0HOST_TX_START_INT_RAW_S 15 +/* HOST_SLC0HOST_RX_START_INT_RAW : RO ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0HOST_RX_START_INT_RAW (BIT(14)) +#define HOST_SLC0HOST_RX_START_INT_RAW_M (BIT(14)) +#define HOST_SLC0HOST_RX_START_INT_RAW_V 0x1 +#define HOST_SLC0HOST_RX_START_INT_RAW_S 14 +/* HOST_SLC0HOST_RX_EOF_INT_RAW : RO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0HOST_RX_EOF_INT_RAW (BIT(13)) +#define HOST_SLC0HOST_RX_EOF_INT_RAW_M (BIT(13)) +#define HOST_SLC0HOST_RX_EOF_INT_RAW_V 0x1 +#define HOST_SLC0HOST_RX_EOF_INT_RAW_S 13 +/* HOST_SLC0HOST_RX_SOF_INT_RAW : RO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0HOST_RX_SOF_INT_RAW (BIT(12)) +#define HOST_SLC0HOST_RX_SOF_INT_RAW_M (BIT(12)) +#define HOST_SLC0HOST_RX_SOF_INT_RAW_V 0x1 +#define HOST_SLC0HOST_RX_SOF_INT_RAW_S 12 +/* HOST_SLC0_TOKEN1_0TO1_INT_RAW : RO ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOKEN1_0TO1_INT_RAW (BIT(11)) +#define HOST_SLC0_TOKEN1_0TO1_INT_RAW_M (BIT(11)) +#define HOST_SLC0_TOKEN1_0TO1_INT_RAW_V 0x1 +#define HOST_SLC0_TOKEN1_0TO1_INT_RAW_S 11 +/* HOST_SLC0_TOKEN0_0TO1_INT_RAW : RO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOKEN0_0TO1_INT_RAW (BIT(10)) +#define HOST_SLC0_TOKEN0_0TO1_INT_RAW_M (BIT(10)) +#define HOST_SLC0_TOKEN0_0TO1_INT_RAW_V 0x1 +#define HOST_SLC0_TOKEN0_0TO1_INT_RAW_S 10 +/* HOST_SLC0_TOKEN1_1TO0_INT_RAW : RO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOKEN1_1TO0_INT_RAW (BIT(9)) +#define HOST_SLC0_TOKEN1_1TO0_INT_RAW_M (BIT(9)) +#define HOST_SLC0_TOKEN1_1TO0_INT_RAW_V 0x1 +#define HOST_SLC0_TOKEN1_1TO0_INT_RAW_S 9 +/* HOST_SLC0_TOKEN0_1TO0_INT_RAW : RO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOKEN0_1TO0_INT_RAW (BIT(8)) +#define HOST_SLC0_TOKEN0_1TO0_INT_RAW_M (BIT(8)) +#define HOST_SLC0_TOKEN0_1TO0_INT_RAW_V 0x1 +#define HOST_SLC0_TOKEN0_1TO0_INT_RAW_S 8 +/* HOST_SLC0_TOHOST_BIT7_INT_RAW : RO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT7_INT_RAW (BIT(7)) +#define HOST_SLC0_TOHOST_BIT7_INT_RAW_M (BIT(7)) +#define HOST_SLC0_TOHOST_BIT7_INT_RAW_V 0x1 +#define HOST_SLC0_TOHOST_BIT7_INT_RAW_S 7 +/* HOST_SLC0_TOHOST_BIT6_INT_RAW : RO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT6_INT_RAW (BIT(6)) +#define HOST_SLC0_TOHOST_BIT6_INT_RAW_M (BIT(6)) +#define HOST_SLC0_TOHOST_BIT6_INT_RAW_V 0x1 +#define HOST_SLC0_TOHOST_BIT6_INT_RAW_S 6 +/* HOST_SLC0_TOHOST_BIT5_INT_RAW : RO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT5_INT_RAW (BIT(5)) +#define HOST_SLC0_TOHOST_BIT5_INT_RAW_M (BIT(5)) +#define HOST_SLC0_TOHOST_BIT5_INT_RAW_V 0x1 +#define HOST_SLC0_TOHOST_BIT5_INT_RAW_S 5 +/* HOST_SLC0_TOHOST_BIT4_INT_RAW : RO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT4_INT_RAW (BIT(4)) +#define HOST_SLC0_TOHOST_BIT4_INT_RAW_M (BIT(4)) +#define HOST_SLC0_TOHOST_BIT4_INT_RAW_V 0x1 +#define HOST_SLC0_TOHOST_BIT4_INT_RAW_S 4 +/* HOST_SLC0_TOHOST_BIT3_INT_RAW : RO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT3_INT_RAW (BIT(3)) +#define HOST_SLC0_TOHOST_BIT3_INT_RAW_M (BIT(3)) +#define HOST_SLC0_TOHOST_BIT3_INT_RAW_V 0x1 +#define HOST_SLC0_TOHOST_BIT3_INT_RAW_S 3 +/* HOST_SLC0_TOHOST_BIT2_INT_RAW : RO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT2_INT_RAW (BIT(2)) +#define HOST_SLC0_TOHOST_BIT2_INT_RAW_M (BIT(2)) +#define HOST_SLC0_TOHOST_BIT2_INT_RAW_V 0x1 +#define HOST_SLC0_TOHOST_BIT2_INT_RAW_S 2 +/* HOST_SLC0_TOHOST_BIT1_INT_RAW : RO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT1_INT_RAW (BIT(1)) +#define HOST_SLC0_TOHOST_BIT1_INT_RAW_M (BIT(1)) +#define HOST_SLC0_TOHOST_BIT1_INT_RAW_V 0x1 +#define HOST_SLC0_TOHOST_BIT1_INT_RAW_S 1 +/* HOST_SLC0_TOHOST_BIT0_INT_RAW : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT0_INT_RAW (BIT(0)) +#define HOST_SLC0_TOHOST_BIT0_INT_RAW_M (BIT(0)) +#define HOST_SLC0_TOHOST_BIT0_INT_RAW_V 0x1 +#define HOST_SLC0_TOHOST_BIT0_INT_RAW_S 0 + +#define HOST_SLC1HOST_INT_RAW_REG (DR_REG_SLCHOST_BASE + 0x54) +/* HOST_SLC1_BT_RX_NEW_PACKET_INT_RAW : RO ;bitpos:[25] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_BT_RX_NEW_PACKET_INT_RAW (BIT(25)) +#define HOST_SLC1_BT_RX_NEW_PACKET_INT_RAW_M (BIT(25)) +#define HOST_SLC1_BT_RX_NEW_PACKET_INT_RAW_V 0x1 +#define HOST_SLC1_BT_RX_NEW_PACKET_INT_RAW_S 25 +/* HOST_SLC1_HOST_RD_RETRY_INT_RAW : RO ;bitpos:[24] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_HOST_RD_RETRY_INT_RAW (BIT(24)) +#define HOST_SLC1_HOST_RD_RETRY_INT_RAW_M (BIT(24)) +#define HOST_SLC1_HOST_RD_RETRY_INT_RAW_V 0x1 +#define HOST_SLC1_HOST_RD_RETRY_INT_RAW_S 24 +/* HOST_SLC1_WIFI_RX_NEW_PACKET_INT_RAW : RO ;bitpos:[23] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_WIFI_RX_NEW_PACKET_INT_RAW (BIT(23)) +#define HOST_SLC1_WIFI_RX_NEW_PACKET_INT_RAW_M (BIT(23)) +#define HOST_SLC1_WIFI_RX_NEW_PACKET_INT_RAW_V 0x1 +#define HOST_SLC1_WIFI_RX_NEW_PACKET_INT_RAW_S 23 +/* HOST_SLC1_EXT_BIT3_INT_RAW : RO ;bitpos:[22] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_EXT_BIT3_INT_RAW (BIT(22)) +#define HOST_SLC1_EXT_BIT3_INT_RAW_M (BIT(22)) +#define HOST_SLC1_EXT_BIT3_INT_RAW_V 0x1 +#define HOST_SLC1_EXT_BIT3_INT_RAW_S 22 +/* HOST_SLC1_EXT_BIT2_INT_RAW : RO ;bitpos:[21] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_EXT_BIT2_INT_RAW (BIT(21)) +#define HOST_SLC1_EXT_BIT2_INT_RAW_M (BIT(21)) +#define HOST_SLC1_EXT_BIT2_INT_RAW_V 0x1 +#define HOST_SLC1_EXT_BIT2_INT_RAW_S 21 +/* HOST_SLC1_EXT_BIT1_INT_RAW : RO ;bitpos:[20] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_EXT_BIT1_INT_RAW (BIT(20)) +#define HOST_SLC1_EXT_BIT1_INT_RAW_M (BIT(20)) +#define HOST_SLC1_EXT_BIT1_INT_RAW_V 0x1 +#define HOST_SLC1_EXT_BIT1_INT_RAW_S 20 +/* HOST_SLC1_EXT_BIT0_INT_RAW : RO ;bitpos:[19] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_EXT_BIT0_INT_RAW (BIT(19)) +#define HOST_SLC1_EXT_BIT0_INT_RAW_M (BIT(19)) +#define HOST_SLC1_EXT_BIT0_INT_RAW_V 0x1 +#define HOST_SLC1_EXT_BIT0_INT_RAW_S 19 +/* HOST_SLC1_RX_PF_VALID_INT_RAW : RO ;bitpos:[18] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_RX_PF_VALID_INT_RAW (BIT(18)) +#define HOST_SLC1_RX_PF_VALID_INT_RAW_M (BIT(18)) +#define HOST_SLC1_RX_PF_VALID_INT_RAW_V 0x1 +#define HOST_SLC1_RX_PF_VALID_INT_RAW_S 18 +/* HOST_SLC1_TX_OVF_INT_RAW : RO ;bitpos:[17] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TX_OVF_INT_RAW (BIT(17)) +#define HOST_SLC1_TX_OVF_INT_RAW_M (BIT(17)) +#define HOST_SLC1_TX_OVF_INT_RAW_V 0x1 +#define HOST_SLC1_TX_OVF_INT_RAW_S 17 +/* HOST_SLC1_RX_UDF_INT_RAW : RO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_RX_UDF_INT_RAW (BIT(16)) +#define HOST_SLC1_RX_UDF_INT_RAW_M (BIT(16)) +#define HOST_SLC1_RX_UDF_INT_RAW_V 0x1 +#define HOST_SLC1_RX_UDF_INT_RAW_S 16 +/* HOST_SLC1HOST_TX_START_INT_RAW : RO ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1HOST_TX_START_INT_RAW (BIT(15)) +#define HOST_SLC1HOST_TX_START_INT_RAW_M (BIT(15)) +#define HOST_SLC1HOST_TX_START_INT_RAW_V 0x1 +#define HOST_SLC1HOST_TX_START_INT_RAW_S 15 +/* HOST_SLC1HOST_RX_START_INT_RAW : RO ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1HOST_RX_START_INT_RAW (BIT(14)) +#define HOST_SLC1HOST_RX_START_INT_RAW_M (BIT(14)) +#define HOST_SLC1HOST_RX_START_INT_RAW_V 0x1 +#define HOST_SLC1HOST_RX_START_INT_RAW_S 14 +/* HOST_SLC1HOST_RX_EOF_INT_RAW : RO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1HOST_RX_EOF_INT_RAW (BIT(13)) +#define HOST_SLC1HOST_RX_EOF_INT_RAW_M (BIT(13)) +#define HOST_SLC1HOST_RX_EOF_INT_RAW_V 0x1 +#define HOST_SLC1HOST_RX_EOF_INT_RAW_S 13 +/* HOST_SLC1HOST_RX_SOF_INT_RAW : RO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1HOST_RX_SOF_INT_RAW (BIT(12)) +#define HOST_SLC1HOST_RX_SOF_INT_RAW_M (BIT(12)) +#define HOST_SLC1HOST_RX_SOF_INT_RAW_V 0x1 +#define HOST_SLC1HOST_RX_SOF_INT_RAW_S 12 +/* HOST_SLC1_TOKEN1_0TO1_INT_RAW : RO ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOKEN1_0TO1_INT_RAW (BIT(11)) +#define HOST_SLC1_TOKEN1_0TO1_INT_RAW_M (BIT(11)) +#define HOST_SLC1_TOKEN1_0TO1_INT_RAW_V 0x1 +#define HOST_SLC1_TOKEN1_0TO1_INT_RAW_S 11 +/* HOST_SLC1_TOKEN0_0TO1_INT_RAW : RO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOKEN0_0TO1_INT_RAW (BIT(10)) +#define HOST_SLC1_TOKEN0_0TO1_INT_RAW_M (BIT(10)) +#define HOST_SLC1_TOKEN0_0TO1_INT_RAW_V 0x1 +#define HOST_SLC1_TOKEN0_0TO1_INT_RAW_S 10 +/* HOST_SLC1_TOKEN1_1TO0_INT_RAW : RO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOKEN1_1TO0_INT_RAW (BIT(9)) +#define HOST_SLC1_TOKEN1_1TO0_INT_RAW_M (BIT(9)) +#define HOST_SLC1_TOKEN1_1TO0_INT_RAW_V 0x1 +#define HOST_SLC1_TOKEN1_1TO0_INT_RAW_S 9 +/* HOST_SLC1_TOKEN0_1TO0_INT_RAW : RO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOKEN0_1TO0_INT_RAW (BIT(8)) +#define HOST_SLC1_TOKEN0_1TO0_INT_RAW_M (BIT(8)) +#define HOST_SLC1_TOKEN0_1TO0_INT_RAW_V 0x1 +#define HOST_SLC1_TOKEN0_1TO0_INT_RAW_S 8 +/* HOST_SLC1_TOHOST_BIT7_INT_RAW : RO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT7_INT_RAW (BIT(7)) +#define HOST_SLC1_TOHOST_BIT7_INT_RAW_M (BIT(7)) +#define HOST_SLC1_TOHOST_BIT7_INT_RAW_V 0x1 +#define HOST_SLC1_TOHOST_BIT7_INT_RAW_S 7 +/* HOST_SLC1_TOHOST_BIT6_INT_RAW : RO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT6_INT_RAW (BIT(6)) +#define HOST_SLC1_TOHOST_BIT6_INT_RAW_M (BIT(6)) +#define HOST_SLC1_TOHOST_BIT6_INT_RAW_V 0x1 +#define HOST_SLC1_TOHOST_BIT6_INT_RAW_S 6 +/* HOST_SLC1_TOHOST_BIT5_INT_RAW : RO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT5_INT_RAW (BIT(5)) +#define HOST_SLC1_TOHOST_BIT5_INT_RAW_M (BIT(5)) +#define HOST_SLC1_TOHOST_BIT5_INT_RAW_V 0x1 +#define HOST_SLC1_TOHOST_BIT5_INT_RAW_S 5 +/* HOST_SLC1_TOHOST_BIT4_INT_RAW : RO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT4_INT_RAW (BIT(4)) +#define HOST_SLC1_TOHOST_BIT4_INT_RAW_M (BIT(4)) +#define HOST_SLC1_TOHOST_BIT4_INT_RAW_V 0x1 +#define HOST_SLC1_TOHOST_BIT4_INT_RAW_S 4 +/* HOST_SLC1_TOHOST_BIT3_INT_RAW : RO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT3_INT_RAW (BIT(3)) +#define HOST_SLC1_TOHOST_BIT3_INT_RAW_M (BIT(3)) +#define HOST_SLC1_TOHOST_BIT3_INT_RAW_V 0x1 +#define HOST_SLC1_TOHOST_BIT3_INT_RAW_S 3 +/* HOST_SLC1_TOHOST_BIT2_INT_RAW : RO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT2_INT_RAW (BIT(2)) +#define HOST_SLC1_TOHOST_BIT2_INT_RAW_M (BIT(2)) +#define HOST_SLC1_TOHOST_BIT2_INT_RAW_V 0x1 +#define HOST_SLC1_TOHOST_BIT2_INT_RAW_S 2 +/* HOST_SLC1_TOHOST_BIT1_INT_RAW : RO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT1_INT_RAW (BIT(1)) +#define HOST_SLC1_TOHOST_BIT1_INT_RAW_M (BIT(1)) +#define HOST_SLC1_TOHOST_BIT1_INT_RAW_V 0x1 +#define HOST_SLC1_TOHOST_BIT1_INT_RAW_S 1 +/* HOST_SLC1_TOHOST_BIT0_INT_RAW : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT0_INT_RAW (BIT(0)) +#define HOST_SLC1_TOHOST_BIT0_INT_RAW_M (BIT(0)) +#define HOST_SLC1_TOHOST_BIT0_INT_RAW_V 0x1 +#define HOST_SLC1_TOHOST_BIT0_INT_RAW_S 0 + +#define HOST_SLC0HOST_INT_ST_REG (DR_REG_SLCHOST_BASE + 0x58) +/* HOST_GPIO_SDIO_INT_ST : RO ;bitpos:[25] ;default: 1'b0 ; */ +/*description: */ +#define HOST_GPIO_SDIO_INT_ST (BIT(25)) +#define HOST_GPIO_SDIO_INT_ST_M (BIT(25)) +#define HOST_GPIO_SDIO_INT_ST_V 0x1 +#define HOST_GPIO_SDIO_INT_ST_S 25 +/* HOST_SLC0_HOST_RD_RETRY_INT_ST : RO ;bitpos:[24] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_HOST_RD_RETRY_INT_ST (BIT(24)) +#define HOST_SLC0_HOST_RD_RETRY_INT_ST_M (BIT(24)) +#define HOST_SLC0_HOST_RD_RETRY_INT_ST_V 0x1 +#define HOST_SLC0_HOST_RD_RETRY_INT_ST_S 24 +/* HOST_SLC0_RX_NEW_PACKET_INT_ST : RO ;bitpos:[23] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_RX_NEW_PACKET_INT_ST (BIT(23)) +#define HOST_SLC0_RX_NEW_PACKET_INT_ST_M (BIT(23)) +#define HOST_SLC0_RX_NEW_PACKET_INT_ST_V 0x1 +#define HOST_SLC0_RX_NEW_PACKET_INT_ST_S 23 +/* HOST_SLC0_EXT_BIT3_INT_ST : RO ;bitpos:[22] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_EXT_BIT3_INT_ST (BIT(22)) +#define HOST_SLC0_EXT_BIT3_INT_ST_M (BIT(22)) +#define HOST_SLC0_EXT_BIT3_INT_ST_V 0x1 +#define HOST_SLC0_EXT_BIT3_INT_ST_S 22 +/* HOST_SLC0_EXT_BIT2_INT_ST : RO ;bitpos:[21] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_EXT_BIT2_INT_ST (BIT(21)) +#define HOST_SLC0_EXT_BIT2_INT_ST_M (BIT(21)) +#define HOST_SLC0_EXT_BIT2_INT_ST_V 0x1 +#define HOST_SLC0_EXT_BIT2_INT_ST_S 21 +/* HOST_SLC0_EXT_BIT1_INT_ST : RO ;bitpos:[20] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_EXT_BIT1_INT_ST (BIT(20)) +#define HOST_SLC0_EXT_BIT1_INT_ST_M (BIT(20)) +#define HOST_SLC0_EXT_BIT1_INT_ST_V 0x1 +#define HOST_SLC0_EXT_BIT1_INT_ST_S 20 +/* HOST_SLC0_EXT_BIT0_INT_ST : RO ;bitpos:[19] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_EXT_BIT0_INT_ST (BIT(19)) +#define HOST_SLC0_EXT_BIT0_INT_ST_M (BIT(19)) +#define HOST_SLC0_EXT_BIT0_INT_ST_V 0x1 +#define HOST_SLC0_EXT_BIT0_INT_ST_S 19 +/* HOST_SLC0_RX_PF_VALID_INT_ST : RO ;bitpos:[18] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_RX_PF_VALID_INT_ST (BIT(18)) +#define HOST_SLC0_RX_PF_VALID_INT_ST_M (BIT(18)) +#define HOST_SLC0_RX_PF_VALID_INT_ST_V 0x1 +#define HOST_SLC0_RX_PF_VALID_INT_ST_S 18 +/* HOST_SLC0_TX_OVF_INT_ST : RO ;bitpos:[17] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TX_OVF_INT_ST (BIT(17)) +#define HOST_SLC0_TX_OVF_INT_ST_M (BIT(17)) +#define HOST_SLC0_TX_OVF_INT_ST_V 0x1 +#define HOST_SLC0_TX_OVF_INT_ST_S 17 +/* HOST_SLC0_RX_UDF_INT_ST : RO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_RX_UDF_INT_ST (BIT(16)) +#define HOST_SLC0_RX_UDF_INT_ST_M (BIT(16)) +#define HOST_SLC0_RX_UDF_INT_ST_V 0x1 +#define HOST_SLC0_RX_UDF_INT_ST_S 16 +/* HOST_SLC0HOST_TX_START_INT_ST : RO ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0HOST_TX_START_INT_ST (BIT(15)) +#define HOST_SLC0HOST_TX_START_INT_ST_M (BIT(15)) +#define HOST_SLC0HOST_TX_START_INT_ST_V 0x1 +#define HOST_SLC0HOST_TX_START_INT_ST_S 15 +/* HOST_SLC0HOST_RX_START_INT_ST : RO ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0HOST_RX_START_INT_ST (BIT(14)) +#define HOST_SLC0HOST_RX_START_INT_ST_M (BIT(14)) +#define HOST_SLC0HOST_RX_START_INT_ST_V 0x1 +#define HOST_SLC0HOST_RX_START_INT_ST_S 14 +/* HOST_SLC0HOST_RX_EOF_INT_ST : RO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0HOST_RX_EOF_INT_ST (BIT(13)) +#define HOST_SLC0HOST_RX_EOF_INT_ST_M (BIT(13)) +#define HOST_SLC0HOST_RX_EOF_INT_ST_V 0x1 +#define HOST_SLC0HOST_RX_EOF_INT_ST_S 13 +/* HOST_SLC0HOST_RX_SOF_INT_ST : RO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0HOST_RX_SOF_INT_ST (BIT(12)) +#define HOST_SLC0HOST_RX_SOF_INT_ST_M (BIT(12)) +#define HOST_SLC0HOST_RX_SOF_INT_ST_V 0x1 +#define HOST_SLC0HOST_RX_SOF_INT_ST_S 12 +/* HOST_SLC0_TOKEN1_0TO1_INT_ST : RO ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOKEN1_0TO1_INT_ST (BIT(11)) +#define HOST_SLC0_TOKEN1_0TO1_INT_ST_M (BIT(11)) +#define HOST_SLC0_TOKEN1_0TO1_INT_ST_V 0x1 +#define HOST_SLC0_TOKEN1_0TO1_INT_ST_S 11 +/* HOST_SLC0_TOKEN0_0TO1_INT_ST : RO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOKEN0_0TO1_INT_ST (BIT(10)) +#define HOST_SLC0_TOKEN0_0TO1_INT_ST_M (BIT(10)) +#define HOST_SLC0_TOKEN0_0TO1_INT_ST_V 0x1 +#define HOST_SLC0_TOKEN0_0TO1_INT_ST_S 10 +/* HOST_SLC0_TOKEN1_1TO0_INT_ST : RO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOKEN1_1TO0_INT_ST (BIT(9)) +#define HOST_SLC0_TOKEN1_1TO0_INT_ST_M (BIT(9)) +#define HOST_SLC0_TOKEN1_1TO0_INT_ST_V 0x1 +#define HOST_SLC0_TOKEN1_1TO0_INT_ST_S 9 +/* HOST_SLC0_TOKEN0_1TO0_INT_ST : RO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOKEN0_1TO0_INT_ST (BIT(8)) +#define HOST_SLC0_TOKEN0_1TO0_INT_ST_M (BIT(8)) +#define HOST_SLC0_TOKEN0_1TO0_INT_ST_V 0x1 +#define HOST_SLC0_TOKEN0_1TO0_INT_ST_S 8 +/* HOST_SLC0_TOHOST_BIT7_INT_ST : RO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT7_INT_ST (BIT(7)) +#define HOST_SLC0_TOHOST_BIT7_INT_ST_M (BIT(7)) +#define HOST_SLC0_TOHOST_BIT7_INT_ST_V 0x1 +#define HOST_SLC0_TOHOST_BIT7_INT_ST_S 7 +/* HOST_SLC0_TOHOST_BIT6_INT_ST : RO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT6_INT_ST (BIT(6)) +#define HOST_SLC0_TOHOST_BIT6_INT_ST_M (BIT(6)) +#define HOST_SLC0_TOHOST_BIT6_INT_ST_V 0x1 +#define HOST_SLC0_TOHOST_BIT6_INT_ST_S 6 +/* HOST_SLC0_TOHOST_BIT5_INT_ST : RO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT5_INT_ST (BIT(5)) +#define HOST_SLC0_TOHOST_BIT5_INT_ST_M (BIT(5)) +#define HOST_SLC0_TOHOST_BIT5_INT_ST_V 0x1 +#define HOST_SLC0_TOHOST_BIT5_INT_ST_S 5 +/* HOST_SLC0_TOHOST_BIT4_INT_ST : RO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT4_INT_ST (BIT(4)) +#define HOST_SLC0_TOHOST_BIT4_INT_ST_M (BIT(4)) +#define HOST_SLC0_TOHOST_BIT4_INT_ST_V 0x1 +#define HOST_SLC0_TOHOST_BIT4_INT_ST_S 4 +/* HOST_SLC0_TOHOST_BIT3_INT_ST : RO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT3_INT_ST (BIT(3)) +#define HOST_SLC0_TOHOST_BIT3_INT_ST_M (BIT(3)) +#define HOST_SLC0_TOHOST_BIT3_INT_ST_V 0x1 +#define HOST_SLC0_TOHOST_BIT3_INT_ST_S 3 +/* HOST_SLC0_TOHOST_BIT2_INT_ST : RO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT2_INT_ST (BIT(2)) +#define HOST_SLC0_TOHOST_BIT2_INT_ST_M (BIT(2)) +#define HOST_SLC0_TOHOST_BIT2_INT_ST_V 0x1 +#define HOST_SLC0_TOHOST_BIT2_INT_ST_S 2 +/* HOST_SLC0_TOHOST_BIT1_INT_ST : RO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT1_INT_ST (BIT(1)) +#define HOST_SLC0_TOHOST_BIT1_INT_ST_M (BIT(1)) +#define HOST_SLC0_TOHOST_BIT1_INT_ST_V 0x1 +#define HOST_SLC0_TOHOST_BIT1_INT_ST_S 1 +/* HOST_SLC0_TOHOST_BIT0_INT_ST : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT0_INT_ST (BIT(0)) +#define HOST_SLC0_TOHOST_BIT0_INT_ST_M (BIT(0)) +#define HOST_SLC0_TOHOST_BIT0_INT_ST_V 0x1 +#define HOST_SLC0_TOHOST_BIT0_INT_ST_S 0 + +#define HOST_SLC1HOST_INT_ST_REG (DR_REG_SLCHOST_BASE + 0x5C) +/* HOST_SLC1_BT_RX_NEW_PACKET_INT_ST : RO ;bitpos:[25] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_BT_RX_NEW_PACKET_INT_ST (BIT(25)) +#define HOST_SLC1_BT_RX_NEW_PACKET_INT_ST_M (BIT(25)) +#define HOST_SLC1_BT_RX_NEW_PACKET_INT_ST_V 0x1 +#define HOST_SLC1_BT_RX_NEW_PACKET_INT_ST_S 25 +/* HOST_SLC1_HOST_RD_RETRY_INT_ST : RO ;bitpos:[24] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_HOST_RD_RETRY_INT_ST (BIT(24)) +#define HOST_SLC1_HOST_RD_RETRY_INT_ST_M (BIT(24)) +#define HOST_SLC1_HOST_RD_RETRY_INT_ST_V 0x1 +#define HOST_SLC1_HOST_RD_RETRY_INT_ST_S 24 +/* HOST_SLC1_WIFI_RX_NEW_PACKET_INT_ST : RO ;bitpos:[23] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_WIFI_RX_NEW_PACKET_INT_ST (BIT(23)) +#define HOST_SLC1_WIFI_RX_NEW_PACKET_INT_ST_M (BIT(23)) +#define HOST_SLC1_WIFI_RX_NEW_PACKET_INT_ST_V 0x1 +#define HOST_SLC1_WIFI_RX_NEW_PACKET_INT_ST_S 23 +/* HOST_SLC1_EXT_BIT3_INT_ST : RO ;bitpos:[22] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_EXT_BIT3_INT_ST (BIT(22)) +#define HOST_SLC1_EXT_BIT3_INT_ST_M (BIT(22)) +#define HOST_SLC1_EXT_BIT3_INT_ST_V 0x1 +#define HOST_SLC1_EXT_BIT3_INT_ST_S 22 +/* HOST_SLC1_EXT_BIT2_INT_ST : RO ;bitpos:[21] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_EXT_BIT2_INT_ST (BIT(21)) +#define HOST_SLC1_EXT_BIT2_INT_ST_M (BIT(21)) +#define HOST_SLC1_EXT_BIT2_INT_ST_V 0x1 +#define HOST_SLC1_EXT_BIT2_INT_ST_S 21 +/* HOST_SLC1_EXT_BIT1_INT_ST : RO ;bitpos:[20] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_EXT_BIT1_INT_ST (BIT(20)) +#define HOST_SLC1_EXT_BIT1_INT_ST_M (BIT(20)) +#define HOST_SLC1_EXT_BIT1_INT_ST_V 0x1 +#define HOST_SLC1_EXT_BIT1_INT_ST_S 20 +/* HOST_SLC1_EXT_BIT0_INT_ST : RO ;bitpos:[19] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_EXT_BIT0_INT_ST (BIT(19)) +#define HOST_SLC1_EXT_BIT0_INT_ST_M (BIT(19)) +#define HOST_SLC1_EXT_BIT0_INT_ST_V 0x1 +#define HOST_SLC1_EXT_BIT0_INT_ST_S 19 +/* HOST_SLC1_RX_PF_VALID_INT_ST : RO ;bitpos:[18] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_RX_PF_VALID_INT_ST (BIT(18)) +#define HOST_SLC1_RX_PF_VALID_INT_ST_M (BIT(18)) +#define HOST_SLC1_RX_PF_VALID_INT_ST_V 0x1 +#define HOST_SLC1_RX_PF_VALID_INT_ST_S 18 +/* HOST_SLC1_TX_OVF_INT_ST : RO ;bitpos:[17] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TX_OVF_INT_ST (BIT(17)) +#define HOST_SLC1_TX_OVF_INT_ST_M (BIT(17)) +#define HOST_SLC1_TX_OVF_INT_ST_V 0x1 +#define HOST_SLC1_TX_OVF_INT_ST_S 17 +/* HOST_SLC1_RX_UDF_INT_ST : RO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_RX_UDF_INT_ST (BIT(16)) +#define HOST_SLC1_RX_UDF_INT_ST_M (BIT(16)) +#define HOST_SLC1_RX_UDF_INT_ST_V 0x1 +#define HOST_SLC1_RX_UDF_INT_ST_S 16 +/* HOST_SLC1HOST_TX_START_INT_ST : RO ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1HOST_TX_START_INT_ST (BIT(15)) +#define HOST_SLC1HOST_TX_START_INT_ST_M (BIT(15)) +#define HOST_SLC1HOST_TX_START_INT_ST_V 0x1 +#define HOST_SLC1HOST_TX_START_INT_ST_S 15 +/* HOST_SLC1HOST_RX_START_INT_ST : RO ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1HOST_RX_START_INT_ST (BIT(14)) +#define HOST_SLC1HOST_RX_START_INT_ST_M (BIT(14)) +#define HOST_SLC1HOST_RX_START_INT_ST_V 0x1 +#define HOST_SLC1HOST_RX_START_INT_ST_S 14 +/* HOST_SLC1HOST_RX_EOF_INT_ST : RO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1HOST_RX_EOF_INT_ST (BIT(13)) +#define HOST_SLC1HOST_RX_EOF_INT_ST_M (BIT(13)) +#define HOST_SLC1HOST_RX_EOF_INT_ST_V 0x1 +#define HOST_SLC1HOST_RX_EOF_INT_ST_S 13 +/* HOST_SLC1HOST_RX_SOF_INT_ST : RO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1HOST_RX_SOF_INT_ST (BIT(12)) +#define HOST_SLC1HOST_RX_SOF_INT_ST_M (BIT(12)) +#define HOST_SLC1HOST_RX_SOF_INT_ST_V 0x1 +#define HOST_SLC1HOST_RX_SOF_INT_ST_S 12 +/* HOST_SLC1_TOKEN1_0TO1_INT_ST : RO ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOKEN1_0TO1_INT_ST (BIT(11)) +#define HOST_SLC1_TOKEN1_0TO1_INT_ST_M (BIT(11)) +#define HOST_SLC1_TOKEN1_0TO1_INT_ST_V 0x1 +#define HOST_SLC1_TOKEN1_0TO1_INT_ST_S 11 +/* HOST_SLC1_TOKEN0_0TO1_INT_ST : RO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOKEN0_0TO1_INT_ST (BIT(10)) +#define HOST_SLC1_TOKEN0_0TO1_INT_ST_M (BIT(10)) +#define HOST_SLC1_TOKEN0_0TO1_INT_ST_V 0x1 +#define HOST_SLC1_TOKEN0_0TO1_INT_ST_S 10 +/* HOST_SLC1_TOKEN1_1TO0_INT_ST : RO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOKEN1_1TO0_INT_ST (BIT(9)) +#define HOST_SLC1_TOKEN1_1TO0_INT_ST_M (BIT(9)) +#define HOST_SLC1_TOKEN1_1TO0_INT_ST_V 0x1 +#define HOST_SLC1_TOKEN1_1TO0_INT_ST_S 9 +/* HOST_SLC1_TOKEN0_1TO0_INT_ST : RO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOKEN0_1TO0_INT_ST (BIT(8)) +#define HOST_SLC1_TOKEN0_1TO0_INT_ST_M (BIT(8)) +#define HOST_SLC1_TOKEN0_1TO0_INT_ST_V 0x1 +#define HOST_SLC1_TOKEN0_1TO0_INT_ST_S 8 +/* HOST_SLC1_TOHOST_BIT7_INT_ST : RO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT7_INT_ST (BIT(7)) +#define HOST_SLC1_TOHOST_BIT7_INT_ST_M (BIT(7)) +#define HOST_SLC1_TOHOST_BIT7_INT_ST_V 0x1 +#define HOST_SLC1_TOHOST_BIT7_INT_ST_S 7 +/* HOST_SLC1_TOHOST_BIT6_INT_ST : RO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT6_INT_ST (BIT(6)) +#define HOST_SLC1_TOHOST_BIT6_INT_ST_M (BIT(6)) +#define HOST_SLC1_TOHOST_BIT6_INT_ST_V 0x1 +#define HOST_SLC1_TOHOST_BIT6_INT_ST_S 6 +/* HOST_SLC1_TOHOST_BIT5_INT_ST : RO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT5_INT_ST (BIT(5)) +#define HOST_SLC1_TOHOST_BIT5_INT_ST_M (BIT(5)) +#define HOST_SLC1_TOHOST_BIT5_INT_ST_V 0x1 +#define HOST_SLC1_TOHOST_BIT5_INT_ST_S 5 +/* HOST_SLC1_TOHOST_BIT4_INT_ST : RO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT4_INT_ST (BIT(4)) +#define HOST_SLC1_TOHOST_BIT4_INT_ST_M (BIT(4)) +#define HOST_SLC1_TOHOST_BIT4_INT_ST_V 0x1 +#define HOST_SLC1_TOHOST_BIT4_INT_ST_S 4 +/* HOST_SLC1_TOHOST_BIT3_INT_ST : RO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT3_INT_ST (BIT(3)) +#define HOST_SLC1_TOHOST_BIT3_INT_ST_M (BIT(3)) +#define HOST_SLC1_TOHOST_BIT3_INT_ST_V 0x1 +#define HOST_SLC1_TOHOST_BIT3_INT_ST_S 3 +/* HOST_SLC1_TOHOST_BIT2_INT_ST : RO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT2_INT_ST (BIT(2)) +#define HOST_SLC1_TOHOST_BIT2_INT_ST_M (BIT(2)) +#define HOST_SLC1_TOHOST_BIT2_INT_ST_V 0x1 +#define HOST_SLC1_TOHOST_BIT2_INT_ST_S 2 +/* HOST_SLC1_TOHOST_BIT1_INT_ST : RO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT1_INT_ST (BIT(1)) +#define HOST_SLC1_TOHOST_BIT1_INT_ST_M (BIT(1)) +#define HOST_SLC1_TOHOST_BIT1_INT_ST_V 0x1 +#define HOST_SLC1_TOHOST_BIT1_INT_ST_S 1 +/* HOST_SLC1_TOHOST_BIT0_INT_ST : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT0_INT_ST (BIT(0)) +#define HOST_SLC1_TOHOST_BIT0_INT_ST_M (BIT(0)) +#define HOST_SLC1_TOHOST_BIT0_INT_ST_V 0x1 +#define HOST_SLC1_TOHOST_BIT0_INT_ST_S 0 + +#define HOST_SLCHOST_PKT_LEN_REG (DR_REG_SLCHOST_BASE + 0x60) +/* HOST_HOSTSLC0_LEN_CHECK : RO ;bitpos:[31:20] ;default: 10'h0 ; */ +/*description: */ +#define HOST_HOSTSLC0_LEN_CHECK 0x00000FFF +#define HOST_HOSTSLC0_LEN_CHECK_M ((HOST_HOSTSLC0_LEN_CHECK_V)<<(HOST_HOSTSLC0_LEN_CHECK_S)) +#define HOST_HOSTSLC0_LEN_CHECK_V 0xFFF +#define HOST_HOSTSLC0_LEN_CHECK_S 20 +/* HOST_HOSTSLC0_LEN : RO ;bitpos:[19:0] ;default: 20'h0 ; */ +/*description: */ +#define HOST_HOSTSLC0_LEN 0x000FFFFF +#define HOST_HOSTSLC0_LEN_M ((HOST_HOSTSLC0_LEN_V)<<(HOST_HOSTSLC0_LEN_S)) +#define HOST_HOSTSLC0_LEN_V 0xFFFFF +#define HOST_HOSTSLC0_LEN_S 0 + +#define HOST_SLCHOST_STATE_W0_REG (DR_REG_SLCHOST_BASE + 0x64) +/* HOST_SLCHOST_STATE3 : RO ;bitpos:[31:24] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_STATE3 0x000000FF +#define HOST_SLCHOST_STATE3_M ((HOST_SLCHOST_STATE3_V)<<(HOST_SLCHOST_STATE3_S)) +#define HOST_SLCHOST_STATE3_V 0xFF +#define HOST_SLCHOST_STATE3_S 24 +/* HOST_SLCHOST_STATE2 : RO ;bitpos:[23:16] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_STATE2 0x000000FF +#define HOST_SLCHOST_STATE2_M ((HOST_SLCHOST_STATE2_V)<<(HOST_SLCHOST_STATE2_S)) +#define HOST_SLCHOST_STATE2_V 0xFF +#define HOST_SLCHOST_STATE2_S 16 +/* HOST_SLCHOST_STATE1 : RO ;bitpos:[15:8] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_STATE1 0x000000FF +#define HOST_SLCHOST_STATE1_M ((HOST_SLCHOST_STATE1_V)<<(HOST_SLCHOST_STATE1_S)) +#define HOST_SLCHOST_STATE1_V 0xFF +#define HOST_SLCHOST_STATE1_S 8 +/* HOST_SLCHOST_STATE0 : RO ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_STATE0 0x000000FF +#define HOST_SLCHOST_STATE0_M ((HOST_SLCHOST_STATE0_V)<<(HOST_SLCHOST_STATE0_S)) +#define HOST_SLCHOST_STATE0_V 0xFF +#define HOST_SLCHOST_STATE0_S 0 + +#define HOST_SLCHOST_STATE_W1_REG (DR_REG_SLCHOST_BASE + 0x68) +/* HOST_SLCHOST_STATE7 : RO ;bitpos:[31:24] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_STATE7 0x000000FF +#define HOST_SLCHOST_STATE7_M ((HOST_SLCHOST_STATE7_V)<<(HOST_SLCHOST_STATE7_S)) +#define HOST_SLCHOST_STATE7_V 0xFF +#define HOST_SLCHOST_STATE7_S 24 +/* HOST_SLCHOST_STATE6 : RO ;bitpos:[23:16] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_STATE6 0x000000FF +#define HOST_SLCHOST_STATE6_M ((HOST_SLCHOST_STATE6_V)<<(HOST_SLCHOST_STATE6_S)) +#define HOST_SLCHOST_STATE6_V 0xFF +#define HOST_SLCHOST_STATE6_S 16 +/* HOST_SLCHOST_STATE5 : RO ;bitpos:[15:8] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_STATE5 0x000000FF +#define HOST_SLCHOST_STATE5_M ((HOST_SLCHOST_STATE5_V)<<(HOST_SLCHOST_STATE5_S)) +#define HOST_SLCHOST_STATE5_V 0xFF +#define HOST_SLCHOST_STATE5_S 8 +/* HOST_SLCHOST_STATE4 : RO ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_STATE4 0x000000FF +#define HOST_SLCHOST_STATE4_M ((HOST_SLCHOST_STATE4_V)<<(HOST_SLCHOST_STATE4_S)) +#define HOST_SLCHOST_STATE4_V 0xFF +#define HOST_SLCHOST_STATE4_S 0 + +#define HOST_SLCHOST_CONF_W_REG(pos) (HOST_SLCHOST_CONF_W0_REG+pos+(pos>23?4:0)+(pos>31?12:0)) + +#define HOST_SLCHOST_CONF_W0_REG (DR_REG_SLCHOST_BASE + 0x6C) +/* HOST_SLCHOST_CONF3 : R/W ;bitpos:[31:24] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF3 0x000000FF +#define HOST_SLCHOST_CONF3_M ((HOST_SLCHOST_CONF3_V)<<(HOST_SLCHOST_CONF3_S)) +#define HOST_SLCHOST_CONF3_V 0xFF +#define HOST_SLCHOST_CONF3_S 24 +/* HOST_SLCHOST_CONF2 : R/W ;bitpos:[23:16] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF2 0x000000FF +#define HOST_SLCHOST_CONF2_M ((HOST_SLCHOST_CONF2_V)<<(HOST_SLCHOST_CONF2_S)) +#define HOST_SLCHOST_CONF2_V 0xFF +#define HOST_SLCHOST_CONF2_S 16 +/* HOST_SLCHOST_CONF1 : R/W ;bitpos:[15:8] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF1 0x000000FF +#define HOST_SLCHOST_CONF1_M ((HOST_SLCHOST_CONF1_V)<<(HOST_SLCHOST_CONF1_S)) +#define HOST_SLCHOST_CONF1_V 0xFF +#define HOST_SLCHOST_CONF1_S 8 +/* HOST_SLCHOST_CONF0 : R/W ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF0 0x000000FF +#define HOST_SLCHOST_CONF0_M ((HOST_SLCHOST_CONF0_V)<<(HOST_SLCHOST_CONF0_S)) +#define HOST_SLCHOST_CONF0_V 0xFF +#define HOST_SLCHOST_CONF0_S 0 + +#define HOST_SLCHOST_CONF_W1_REG (DR_REG_SLCHOST_BASE + 0x70) +/* HOST_SLCHOST_CONF7 : R/W ;bitpos:[31:24] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF7 0x000000FF +#define HOST_SLCHOST_CONF7_M ((HOST_SLCHOST_CONF7_V)<<(HOST_SLCHOST_CONF7_S)) +#define HOST_SLCHOST_CONF7_V 0xFF +#define HOST_SLCHOST_CONF7_S 24 +/* HOST_SLCHOST_CONF6 : R/W ;bitpos:[23:16] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF6 0x000000FF +#define HOST_SLCHOST_CONF6_M ((HOST_SLCHOST_CONF6_V)<<(HOST_SLCHOST_CONF6_S)) +#define HOST_SLCHOST_CONF6_V 0xFF +#define HOST_SLCHOST_CONF6_S 16 +/* HOST_SLCHOST_CONF5 : R/W ;bitpos:[15:8] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF5 0x000000FF +#define HOST_SLCHOST_CONF5_M ((HOST_SLCHOST_CONF5_V)<<(HOST_SLCHOST_CONF5_S)) +#define HOST_SLCHOST_CONF5_V 0xFF +#define HOST_SLCHOST_CONF5_S 8 +/* HOST_SLCHOST_CONF4 : R/W ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF4 0x000000FF +#define HOST_SLCHOST_CONF4_M ((HOST_SLCHOST_CONF4_V)<<(HOST_SLCHOST_CONF4_S)) +#define HOST_SLCHOST_CONF4_V 0xFF +#define HOST_SLCHOST_CONF4_S 0 + +#define HOST_SLCHOST_CONF_W2_REG (DR_REG_SLCHOST_BASE + 0x74) +/* HOST_SLCHOST_CONF11 : R/W ;bitpos:[31:24] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF11 0x000000FF +#define HOST_SLCHOST_CONF11_M ((HOST_SLCHOST_CONF11_V)<<(HOST_SLCHOST_CONF11_S)) +#define HOST_SLCHOST_CONF11_V 0xFF +#define HOST_SLCHOST_CONF11_S 24 +/* HOST_SLCHOST_CONF10 : R/W ;bitpos:[23:16] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF10 0x000000FF +#define HOST_SLCHOST_CONF10_M ((HOST_SLCHOST_CONF10_V)<<(HOST_SLCHOST_CONF10_S)) +#define HOST_SLCHOST_CONF10_V 0xFF +#define HOST_SLCHOST_CONF10_S 16 +/* HOST_SLCHOST_CONF9 : R/W ;bitpos:[15:8] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF9 0x000000FF +#define HOST_SLCHOST_CONF9_M ((HOST_SLCHOST_CONF9_V)<<(HOST_SLCHOST_CONF9_S)) +#define HOST_SLCHOST_CONF9_V 0xFF +#define HOST_SLCHOST_CONF9_S 8 +/* HOST_SLCHOST_CONF8 : R/W ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF8 0x000000FF +#define HOST_SLCHOST_CONF8_M ((HOST_SLCHOST_CONF8_V)<<(HOST_SLCHOST_CONF8_S)) +#define HOST_SLCHOST_CONF8_V 0xFF +#define HOST_SLCHOST_CONF8_S 0 + +#define HOST_SLCHOST_CONF_W3_REG (DR_REG_SLCHOST_BASE + 0x78) +/* HOST_SLCHOST_CONF15 : R/W ;bitpos:[31:24] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF15 0x000000FF +#define HOST_SLCHOST_CONF15_M ((HOST_SLCHOST_CONF15_V)<<(HOST_SLCHOST_CONF15_S)) +#define HOST_SLCHOST_CONF15_V 0xFF +#define HOST_SLCHOST_CONF15_S 24 +/* HOST_SLCHOST_CONF14 : R/W ;bitpos:[23:16] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF14 0x000000FF +#define HOST_SLCHOST_CONF14_M ((HOST_SLCHOST_CONF14_V)<<(HOST_SLCHOST_CONF14_S)) +#define HOST_SLCHOST_CONF14_V 0xFF +#define HOST_SLCHOST_CONF14_S 16 +/* HOST_SLCHOST_CONF13 : R/W ;bitpos:[15:8] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF13 0x000000FF +#define HOST_SLCHOST_CONF13_M ((HOST_SLCHOST_CONF13_V)<<(HOST_SLCHOST_CONF13_S)) +#define HOST_SLCHOST_CONF13_V 0xFF +#define HOST_SLCHOST_CONF13_S 8 +/* HOST_SLCHOST_CONF12 : R/W ;bitpos:[7:0] ;default: 8'hc0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF12 0x000000FF +#define HOST_SLCHOST_CONF12_M ((HOST_SLCHOST_CONF12_V)<<(HOST_SLCHOST_CONF12_S)) +#define HOST_SLCHOST_CONF12_V 0xFF +#define HOST_SLCHOST_CONF12_S 0 + +#define HOST_SLCHOST_CONF_W4_REG (DR_REG_SLCHOST_BASE + 0x7C) +/* HOST_SLCHOST_CONF19 : R/W ;bitpos:[31:24] ;default: 8'h0 ; */ +/*description: Interrupt to target CPU*/ +#define HOST_SLCHOST_CONF19 0x000000FF +#define HOST_SLCHOST_CONF19_M ((HOST_SLCHOST_CONF19_V)<<(HOST_SLCHOST_CONF19_S)) +#define HOST_SLCHOST_CONF19_V 0xFF +#define HOST_SLCHOST_CONF19_S 24 +/* HOST_SLCHOST_CONF18 : R/W ;bitpos:[23:16] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF18 0x000000FF +#define HOST_SLCHOST_CONF18_M ((HOST_SLCHOST_CONF18_V)<<(HOST_SLCHOST_CONF18_S)) +#define HOST_SLCHOST_CONF18_V 0xFF +#define HOST_SLCHOST_CONF18_S 16 +/* HOST_SLCHOST_CONF17 : R/W ;bitpos:[15:8] ;default: 8'h1 ; */ +/*description: SLC timeout enable*/ +#define HOST_SLCHOST_CONF17 0x000000FF +#define HOST_SLCHOST_CONF17_M ((HOST_SLCHOST_CONF17_V)<<(HOST_SLCHOST_CONF17_S)) +#define HOST_SLCHOST_CONF17_V 0xFF +#define HOST_SLCHOST_CONF17_S 8 +/* HOST_SLCHOST_CONF16 : R/W ;bitpos:[7:0] ;default: 8'hFF ; */ +/*description: SLC timeout value*/ +#define HOST_SLCHOST_CONF16 0x000000FF +#define HOST_SLCHOST_CONF16_M ((HOST_SLCHOST_CONF16_V)<<(HOST_SLCHOST_CONF16_S)) +#define HOST_SLCHOST_CONF16_V 0xFF +#define HOST_SLCHOST_CONF16_S 0 + +#define HOST_SLCHOST_CONF_W5_REG (DR_REG_SLCHOST_BASE + 0x80) +/* HOST_SLCHOST_CONF23 : R/W ;bitpos:[31:24] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF23 0x000000FF +#define HOST_SLCHOST_CONF23_M ((HOST_SLCHOST_CONF23_V)<<(HOST_SLCHOST_CONF23_S)) +#define HOST_SLCHOST_CONF23_V 0xFF +#define HOST_SLCHOST_CONF23_S 24 +/* HOST_SLCHOST_CONF22 : R/W ;bitpos:[23:16] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF22 0x000000FF +#define HOST_SLCHOST_CONF22_M ((HOST_SLCHOST_CONF22_V)<<(HOST_SLCHOST_CONF22_S)) +#define HOST_SLCHOST_CONF22_V 0xFF +#define HOST_SLCHOST_CONF22_S 16 +/* HOST_SLCHOST_CONF21 : R/W ;bitpos:[15:8] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF21 0x000000FF +#define HOST_SLCHOST_CONF21_M ((HOST_SLCHOST_CONF21_V)<<(HOST_SLCHOST_CONF21_S)) +#define HOST_SLCHOST_CONF21_V 0xFF +#define HOST_SLCHOST_CONF21_S 8 +/* HOST_SLCHOST_CONF20 : R/W ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF20 0x000000FF +#define HOST_SLCHOST_CONF20_M ((HOST_SLCHOST_CONF20_V)<<(HOST_SLCHOST_CONF20_S)) +#define HOST_SLCHOST_CONF20_V 0xFF +#define HOST_SLCHOST_CONF20_S 0 + +#define HOST_SLCHOST_WIN_CMD_REG (DR_REG_SLCHOST_BASE + 0x84) + +#define HOST_SLCHOST_CONF_W6_REG (DR_REG_SLCHOST_BASE + 0x88) +/* HOST_SLCHOST_CONF27 : R/W ;bitpos:[31:24] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF27 0x000000FF +#define HOST_SLCHOST_CONF27_M ((HOST_SLCHOST_CONF27_V)<<(HOST_SLCHOST_CONF27_S)) +#define HOST_SLCHOST_CONF27_V 0xFF +#define HOST_SLCHOST_CONF27_S 24 +/* HOST_SLCHOST_CONF26 : R/W ;bitpos:[23:16] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF26 0x000000FF +#define HOST_SLCHOST_CONF26_M ((HOST_SLCHOST_CONF26_V)<<(HOST_SLCHOST_CONF26_S)) +#define HOST_SLCHOST_CONF26_V 0xFF +#define HOST_SLCHOST_CONF26_S 16 +/* HOST_SLCHOST_CONF25 : R/W ;bitpos:[15:8] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF25 0x000000FF +#define HOST_SLCHOST_CONF25_M ((HOST_SLCHOST_CONF25_V)<<(HOST_SLCHOST_CONF25_S)) +#define HOST_SLCHOST_CONF25_V 0xFF +#define HOST_SLCHOST_CONF25_S 8 +/* HOST_SLCHOST_CONF24 : R/W ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF24 0x000000FF +#define HOST_SLCHOST_CONF24_M ((HOST_SLCHOST_CONF24_V)<<(HOST_SLCHOST_CONF24_S)) +#define HOST_SLCHOST_CONF24_V 0xFF +#define HOST_SLCHOST_CONF24_S 0 + +#define HOST_SLCHOST_CONF_W7_REG (DR_REG_SLCHOST_BASE + 0x8C) +/* HOST_SLCHOST_CONF31 : R/W ;bitpos:[31:24] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF31 0x000000FF +#define HOST_SLCHOST_CONF31_M ((HOST_SLCHOST_CONF31_V)<<(HOST_SLCHOST_CONF31_S)) +#define HOST_SLCHOST_CONF31_V 0xFF +#define HOST_SLCHOST_CONF31_S 24 +/* HOST_SLCHOST_CONF30 : R/W ;bitpos:[23:16] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF30 0x000000FF +#define HOST_SLCHOST_CONF30_M ((HOST_SLCHOST_CONF30_V)<<(HOST_SLCHOST_CONF30_S)) +#define HOST_SLCHOST_CONF30_V 0xFF +#define HOST_SLCHOST_CONF30_S 16 +/* HOST_SLCHOST_CONF29 : R/W ;bitpos:[15:8] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF29 0x000000FF +#define HOST_SLCHOST_CONF29_M ((HOST_SLCHOST_CONF29_V)<<(HOST_SLCHOST_CONF29_S)) +#define HOST_SLCHOST_CONF29_V 0xFF +#define HOST_SLCHOST_CONF29_S 8 +/* HOST_SLCHOST_CONF28 : R/W ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF28 0x000000FF +#define HOST_SLCHOST_CONF28_M ((HOST_SLCHOST_CONF28_V)<<(HOST_SLCHOST_CONF28_S)) +#define HOST_SLCHOST_CONF28_V 0xFF +#define HOST_SLCHOST_CONF28_S 0 + +#define HOST_SLCHOST_PKT_LEN0_REG (DR_REG_SLCHOST_BASE + 0x90) +/* HOST_HOSTSLC0_LEN0 : RO ;bitpos:[19:0] ;default: 20'h0 ; */ +/*description: */ +#define HOST_HOSTSLC0_LEN0 0x000FFFFF +#define HOST_HOSTSLC0_LEN0_M ((HOST_HOSTSLC0_LEN0_V)<<(HOST_HOSTSLC0_LEN0_S)) +#define HOST_HOSTSLC0_LEN0_V 0xFFFFF +#define HOST_HOSTSLC0_LEN0_S 0 + +#define HOST_SLCHOST_PKT_LEN1_REG (DR_REG_SLCHOST_BASE + 0x94) +/* HOST_HOSTSLC0_LEN1 : RO ;bitpos:[19:0] ;default: 20'h0 ; */ +/*description: */ +#define HOST_HOSTSLC0_LEN1 0x000FFFFF +#define HOST_HOSTSLC0_LEN1_M ((HOST_HOSTSLC0_LEN1_V)<<(HOST_HOSTSLC0_LEN1_S)) +#define HOST_HOSTSLC0_LEN1_V 0xFFFFF +#define HOST_HOSTSLC0_LEN1_S 0 + +#define HOST_SLCHOST_PKT_LEN2_REG (DR_REG_SLCHOST_BASE + 0x98) +/* HOST_HOSTSLC0_LEN2 : RO ;bitpos:[19:0] ;default: 20'h0 ; */ +/*description: */ +#define HOST_HOSTSLC0_LEN2 0x000FFFFF +#define HOST_HOSTSLC0_LEN2_M ((HOST_HOSTSLC0_LEN2_V)<<(HOST_HOSTSLC0_LEN2_S)) +#define HOST_HOSTSLC0_LEN2_V 0xFFFFF +#define HOST_HOSTSLC0_LEN2_S 0 + +#define HOST_SLCHOST_CONF_W8_REG (DR_REG_SLCHOST_BASE + 0x9C) +/* HOST_SLCHOST_CONF35 : R/W ;bitpos:[31:24] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF35 0x000000FF +#define HOST_SLCHOST_CONF35_M ((HOST_SLCHOST_CONF35_V)<<(HOST_SLCHOST_CONF35_S)) +#define HOST_SLCHOST_CONF35_V 0xFF +#define HOST_SLCHOST_CONF35_S 24 +/* HOST_SLCHOST_CONF34 : R/W ;bitpos:[23:16] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF34 0x000000FF +#define HOST_SLCHOST_CONF34_M ((HOST_SLCHOST_CONF34_V)<<(HOST_SLCHOST_CONF34_S)) +#define HOST_SLCHOST_CONF34_V 0xFF +#define HOST_SLCHOST_CONF34_S 16 +/* HOST_SLCHOST_CONF33 : R/W ;bitpos:[15:8] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF33 0x000000FF +#define HOST_SLCHOST_CONF33_M ((HOST_SLCHOST_CONF33_V)<<(HOST_SLCHOST_CONF33_S)) +#define HOST_SLCHOST_CONF33_V 0xFF +#define HOST_SLCHOST_CONF33_S 8 +/* HOST_SLCHOST_CONF32 : R/W ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF32 0x000000FF +#define HOST_SLCHOST_CONF32_M ((HOST_SLCHOST_CONF32_V)<<(HOST_SLCHOST_CONF32_S)) +#define HOST_SLCHOST_CONF32_V 0xFF +#define HOST_SLCHOST_CONF32_S 0 + +#define HOST_SLCHOST_CONF_W9_REG (DR_REG_SLCHOST_BASE + 0xA0) +/* HOST_SLCHOST_CONF39 : R/W ;bitpos:[31:24] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF39 0x000000FF +#define HOST_SLCHOST_CONF39_M ((HOST_SLCHOST_CONF39_V)<<(HOST_SLCHOST_CONF39_S)) +#define HOST_SLCHOST_CONF39_V 0xFF +#define HOST_SLCHOST_CONF39_S 24 +/* HOST_SLCHOST_CONF38 : R/W ;bitpos:[23:16] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF38 0x000000FF +#define HOST_SLCHOST_CONF38_M ((HOST_SLCHOST_CONF38_V)<<(HOST_SLCHOST_CONF38_S)) +#define HOST_SLCHOST_CONF38_V 0xFF +#define HOST_SLCHOST_CONF38_S 16 +/* HOST_SLCHOST_CONF37 : R/W ;bitpos:[15:8] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF37 0x000000FF +#define HOST_SLCHOST_CONF37_M ((HOST_SLCHOST_CONF37_V)<<(HOST_SLCHOST_CONF37_S)) +#define HOST_SLCHOST_CONF37_V 0xFF +#define HOST_SLCHOST_CONF37_S 8 +/* HOST_SLCHOST_CONF36 : R/W ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF36 0x000000FF +#define HOST_SLCHOST_CONF36_M ((HOST_SLCHOST_CONF36_V)<<(HOST_SLCHOST_CONF36_S)) +#define HOST_SLCHOST_CONF36_V 0xFF +#define HOST_SLCHOST_CONF36_S 0 + +#define HOST_SLCHOST_CONF_W10_REG (DR_REG_SLCHOST_BASE + 0xA4) +/* HOST_SLCHOST_CONF43 : R/W ;bitpos:[31:24] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF43 0x000000FF +#define HOST_SLCHOST_CONF43_M ((HOST_SLCHOST_CONF43_V)<<(HOST_SLCHOST_CONF43_S)) +#define HOST_SLCHOST_CONF43_V 0xFF +#define HOST_SLCHOST_CONF43_S 24 +/* HOST_SLCHOST_CONF42 : R/W ;bitpos:[23:16] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF42 0x000000FF +#define HOST_SLCHOST_CONF42_M ((HOST_SLCHOST_CONF42_V)<<(HOST_SLCHOST_CONF42_S)) +#define HOST_SLCHOST_CONF42_V 0xFF +#define HOST_SLCHOST_CONF42_S 16 +/* HOST_SLCHOST_CONF41 : R/W ;bitpos:[15:8] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF41 0x000000FF +#define HOST_SLCHOST_CONF41_M ((HOST_SLCHOST_CONF41_V)<<(HOST_SLCHOST_CONF41_S)) +#define HOST_SLCHOST_CONF41_V 0xFF +#define HOST_SLCHOST_CONF41_S 8 +/* HOST_SLCHOST_CONF40 : R/W ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF40 0x000000FF +#define HOST_SLCHOST_CONF40_M ((HOST_SLCHOST_CONF40_V)<<(HOST_SLCHOST_CONF40_S)) +#define HOST_SLCHOST_CONF40_V 0xFF +#define HOST_SLCHOST_CONF40_S 0 + +#define HOST_SLCHOST_CONF_W11_REG (DR_REG_SLCHOST_BASE + 0xA8) +/* HOST_SLCHOST_CONF47 : R/W ;bitpos:[31:24] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF47 0x000000FF +#define HOST_SLCHOST_CONF47_M ((HOST_SLCHOST_CONF47_V)<<(HOST_SLCHOST_CONF47_S)) +#define HOST_SLCHOST_CONF47_V 0xFF +#define HOST_SLCHOST_CONF47_S 24 +/* HOST_SLCHOST_CONF46 : R/W ;bitpos:[23:16] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF46 0x000000FF +#define HOST_SLCHOST_CONF46_M ((HOST_SLCHOST_CONF46_V)<<(HOST_SLCHOST_CONF46_S)) +#define HOST_SLCHOST_CONF46_V 0xFF +#define HOST_SLCHOST_CONF46_S 16 +/* HOST_SLCHOST_CONF45 : R/W ;bitpos:[15:8] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF45 0x000000FF +#define HOST_SLCHOST_CONF45_M ((HOST_SLCHOST_CONF45_V)<<(HOST_SLCHOST_CONF45_S)) +#define HOST_SLCHOST_CONF45_V 0xFF +#define HOST_SLCHOST_CONF45_S 8 +/* HOST_SLCHOST_CONF44 : R/W ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF44 0x000000FF +#define HOST_SLCHOST_CONF44_M ((HOST_SLCHOST_CONF44_V)<<(HOST_SLCHOST_CONF44_S)) +#define HOST_SLCHOST_CONF44_V 0xFF +#define HOST_SLCHOST_CONF44_S 0 + +#define HOST_SLCHOST_CONF_W12_REG (DR_REG_SLCHOST_BASE + 0xAC) +/* HOST_SLCHOST_CONF51 : R/W ;bitpos:[31:24] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF51 0x000000FF +#define HOST_SLCHOST_CONF51_M ((HOST_SLCHOST_CONF51_V)<<(HOST_SLCHOST_CONF51_S)) +#define HOST_SLCHOST_CONF51_V 0xFF +#define HOST_SLCHOST_CONF51_S 24 +/* HOST_SLCHOST_CONF50 : R/W ;bitpos:[23:16] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF50 0x000000FF +#define HOST_SLCHOST_CONF50_M ((HOST_SLCHOST_CONF50_V)<<(HOST_SLCHOST_CONF50_S)) +#define HOST_SLCHOST_CONF50_V 0xFF +#define HOST_SLCHOST_CONF50_S 16 +/* HOST_SLCHOST_CONF49 : R/W ;bitpos:[15:8] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF49 0x000000FF +#define HOST_SLCHOST_CONF49_M ((HOST_SLCHOST_CONF49_V)<<(HOST_SLCHOST_CONF49_S)) +#define HOST_SLCHOST_CONF49_V 0xFF +#define HOST_SLCHOST_CONF49_S 8 +/* HOST_SLCHOST_CONF48 : R/W ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF48 0x000000FF +#define HOST_SLCHOST_CONF48_M ((HOST_SLCHOST_CONF48_V)<<(HOST_SLCHOST_CONF48_S)) +#define HOST_SLCHOST_CONF48_V 0xFF +#define HOST_SLCHOST_CONF48_S 0 + +#define HOST_SLCHOST_CONF_W13_REG (DR_REG_SLCHOST_BASE + 0xB0) +/* HOST_SLCHOST_CONF55 : R/W ;bitpos:[31:24] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF55 0x000000FF +#define HOST_SLCHOST_CONF55_M ((HOST_SLCHOST_CONF55_V)<<(HOST_SLCHOST_CONF55_S)) +#define HOST_SLCHOST_CONF55_V 0xFF +#define HOST_SLCHOST_CONF55_S 24 +/* HOST_SLCHOST_CONF54 : R/W ;bitpos:[23:16] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF54 0x000000FF +#define HOST_SLCHOST_CONF54_M ((HOST_SLCHOST_CONF54_V)<<(HOST_SLCHOST_CONF54_S)) +#define HOST_SLCHOST_CONF54_V 0xFF +#define HOST_SLCHOST_CONF54_S 16 +/* HOST_SLCHOST_CONF53 : R/W ;bitpos:[15:8] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF53 0x000000FF +#define HOST_SLCHOST_CONF53_M ((HOST_SLCHOST_CONF53_V)<<(HOST_SLCHOST_CONF53_S)) +#define HOST_SLCHOST_CONF53_V 0xFF +#define HOST_SLCHOST_CONF53_S 8 +/* HOST_SLCHOST_CONF52 : R/W ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF52 0x000000FF +#define HOST_SLCHOST_CONF52_M ((HOST_SLCHOST_CONF52_V)<<(HOST_SLCHOST_CONF52_S)) +#define HOST_SLCHOST_CONF52_V 0xFF +#define HOST_SLCHOST_CONF52_S 0 + +#define HOST_SLCHOST_CONF_W14_REG (DR_REG_SLCHOST_BASE + 0xB4) +/* HOST_SLCHOST_CONF59 : R/W ;bitpos:[31:24] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF59 0x000000FF +#define HOST_SLCHOST_CONF59_M ((HOST_SLCHOST_CONF59_V)<<(HOST_SLCHOST_CONF59_S)) +#define HOST_SLCHOST_CONF59_V 0xFF +#define HOST_SLCHOST_CONF59_S 24 +/* HOST_SLCHOST_CONF58 : R/W ;bitpos:[23:16] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF58 0x000000FF +#define HOST_SLCHOST_CONF58_M ((HOST_SLCHOST_CONF58_V)<<(HOST_SLCHOST_CONF58_S)) +#define HOST_SLCHOST_CONF58_V 0xFF +#define HOST_SLCHOST_CONF58_S 16 +/* HOST_SLCHOST_CONF57 : R/W ;bitpos:[15:8] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF57 0x000000FF +#define HOST_SLCHOST_CONF57_M ((HOST_SLCHOST_CONF57_V)<<(HOST_SLCHOST_CONF57_S)) +#define HOST_SLCHOST_CONF57_V 0xFF +#define HOST_SLCHOST_CONF57_S 8 +/* HOST_SLCHOST_CONF56 : R/W ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF56 0x000000FF +#define HOST_SLCHOST_CONF56_M ((HOST_SLCHOST_CONF56_V)<<(HOST_SLCHOST_CONF56_S)) +#define HOST_SLCHOST_CONF56_V 0xFF +#define HOST_SLCHOST_CONF56_S 0 + +#define HOST_SLCHOST_CONF_W15_REG (DR_REG_SLCHOST_BASE + 0xB8) +/* HOST_SLCHOST_CONF63 : R/W ;bitpos:[31:24] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF63 0x000000FF +#define HOST_SLCHOST_CONF63_M ((HOST_SLCHOST_CONF63_V)<<(HOST_SLCHOST_CONF63_S)) +#define HOST_SLCHOST_CONF63_V 0xFF +#define HOST_SLCHOST_CONF63_S 24 +/* HOST_SLCHOST_CONF62 : R/W ;bitpos:[23:16] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF62 0x000000FF +#define HOST_SLCHOST_CONF62_M ((HOST_SLCHOST_CONF62_V)<<(HOST_SLCHOST_CONF62_S)) +#define HOST_SLCHOST_CONF62_V 0xFF +#define HOST_SLCHOST_CONF62_S 16 +/* HOST_SLCHOST_CONF61 : R/W ;bitpos:[15:8] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF61 0x000000FF +#define HOST_SLCHOST_CONF61_M ((HOST_SLCHOST_CONF61_V)<<(HOST_SLCHOST_CONF61_S)) +#define HOST_SLCHOST_CONF61_V 0xFF +#define HOST_SLCHOST_CONF61_S 8 +/* HOST_SLCHOST_CONF60 : R/W ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: */ +#define HOST_SLCHOST_CONF60 0x000000FF +#define HOST_SLCHOST_CONF60_M ((HOST_SLCHOST_CONF60_V)<<(HOST_SLCHOST_CONF60_S)) +#define HOST_SLCHOST_CONF60_V 0xFF +#define HOST_SLCHOST_CONF60_S 0 + +#define HOST_SLCHOST_CHECK_SUM0_REG (DR_REG_SLCHOST_BASE + 0xBC) +/* HOST_SLCHOST_CHECK_SUM0 : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define HOST_SLCHOST_CHECK_SUM0 0xFFFFFFFF +#define HOST_SLCHOST_CHECK_SUM0_M ((HOST_SLCHOST_CHECK_SUM0_V)<<(HOST_SLCHOST_CHECK_SUM0_S)) +#define HOST_SLCHOST_CHECK_SUM0_V 0xFFFFFFFF +#define HOST_SLCHOST_CHECK_SUM0_S 0 + +#define HOST_SLCHOST_CHECK_SUM1_REG (DR_REG_SLCHOST_BASE + 0xC0) +/* HOST_SLCHOST_CHECK_SUM1 : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define HOST_SLCHOST_CHECK_SUM1 0xFFFFFFFF +#define HOST_SLCHOST_CHECK_SUM1_M ((HOST_SLCHOST_CHECK_SUM1_V)<<(HOST_SLCHOST_CHECK_SUM1_S)) +#define HOST_SLCHOST_CHECK_SUM1_V 0xFFFFFFFF +#define HOST_SLCHOST_CHECK_SUM1_S 0 + +#define HOST_SLC1HOST_TOKEN_RDATA_REG (DR_REG_SLCHOST_BASE + 0xC4) +/* HOST_SLC1_RX_PF_EOF : RO ;bitpos:[31:28] ;default: 4'h0 ; */ +/*description: */ +#define HOST_SLC1_RX_PF_EOF 0x0000000F +#define HOST_SLC1_RX_PF_EOF_M ((HOST_SLC1_RX_PF_EOF_V)<<(HOST_SLC1_RX_PF_EOF_S)) +#define HOST_SLC1_RX_PF_EOF_V 0xF +#define HOST_SLC1_RX_PF_EOF_S 28 +/* HOST_HOSTSLC1_TOKEN1 : RO ;bitpos:[27:16] ;default: 12'h0 ; */ +/*description: */ +#define HOST_HOSTSLC1_TOKEN1 0x00000FFF +#define HOST_HOSTSLC1_TOKEN1_M ((HOST_HOSTSLC1_TOKEN1_V)<<(HOST_HOSTSLC1_TOKEN1_S)) +#define HOST_HOSTSLC1_TOKEN1_V 0xFFF +#define HOST_HOSTSLC1_TOKEN1_S 16 +/* HOST_SLC1_RX_PF_VALID : RO ;bitpos:[12] ;default: 1'h0 ; */ +/*description: */ +#define HOST_SLC1_RX_PF_VALID (BIT(12)) +#define HOST_SLC1_RX_PF_VALID_M (BIT(12)) +#define HOST_SLC1_RX_PF_VALID_V 0x1 +#define HOST_SLC1_RX_PF_VALID_S 12 +/* HOST_SLC1_TOKEN0 : RO ;bitpos:[11:0] ;default: 12'h0 ; */ +/*description: */ +#define HOST_SLC1_TOKEN0 0x00000FFF +#define HOST_SLC1_TOKEN0_M ((HOST_SLC1_TOKEN0_V)<<(HOST_SLC1_TOKEN0_S)) +#define HOST_SLC1_TOKEN0_V 0xFFF +#define HOST_SLC1_TOKEN0_S 0 + +#define HOST_SLC0HOST_TOKEN_WDATA_REG (DR_REG_SLCHOST_BASE + 0xC8) +/* HOST_SLC0HOST_TOKEN1_WD : R/W ;bitpos:[27:16] ;default: 12'h0 ; */ +/*description: */ +#define HOST_SLC0HOST_TOKEN1_WD 0x00000FFF +#define HOST_SLC0HOST_TOKEN1_WD_M ((HOST_SLC0HOST_TOKEN1_WD_V)<<(HOST_SLC0HOST_TOKEN1_WD_S)) +#define HOST_SLC0HOST_TOKEN1_WD_V 0xFFF +#define HOST_SLC0HOST_TOKEN1_WD_S 16 +/* HOST_SLC0HOST_TOKEN0_WD : R/W ;bitpos:[11:0] ;default: 12'h0 ; */ +/*description: */ +#define HOST_SLC0HOST_TOKEN0_WD 0x00000FFF +#define HOST_SLC0HOST_TOKEN0_WD_M ((HOST_SLC0HOST_TOKEN0_WD_V)<<(HOST_SLC0HOST_TOKEN0_WD_S)) +#define HOST_SLC0HOST_TOKEN0_WD_V 0xFFF +#define HOST_SLC0HOST_TOKEN0_WD_S 0 + +#define HOST_SLC1HOST_TOKEN_WDATA_REG (DR_REG_SLCHOST_BASE + 0xCC) +/* HOST_SLC1HOST_TOKEN1_WD : R/W ;bitpos:[27:16] ;default: 12'h0 ; */ +/*description: */ +#define HOST_SLC1HOST_TOKEN1_WD 0x00000FFF +#define HOST_SLC1HOST_TOKEN1_WD_M ((HOST_SLC1HOST_TOKEN1_WD_V)<<(HOST_SLC1HOST_TOKEN1_WD_S)) +#define HOST_SLC1HOST_TOKEN1_WD_V 0xFFF +#define HOST_SLC1HOST_TOKEN1_WD_S 16 +/* HOST_SLC1HOST_TOKEN0_WD : R/W ;bitpos:[11:0] ;default: 12'h0 ; */ +/*description: */ +#define HOST_SLC1HOST_TOKEN0_WD 0x00000FFF +#define HOST_SLC1HOST_TOKEN0_WD_M ((HOST_SLC1HOST_TOKEN0_WD_V)<<(HOST_SLC1HOST_TOKEN0_WD_S)) +#define HOST_SLC1HOST_TOKEN0_WD_V 0xFFF +#define HOST_SLC1HOST_TOKEN0_WD_S 0 + +#define HOST_SLCHOST_TOKEN_CON_REG (DR_REG_SLCHOST_BASE + 0xD0) +/* HOST_SLC0HOST_LEN_WR : WO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0HOST_LEN_WR (BIT(8)) +#define HOST_SLC0HOST_LEN_WR_M (BIT(8)) +#define HOST_SLC0HOST_LEN_WR_V 0x1 +#define HOST_SLC0HOST_LEN_WR_S 8 +/* HOST_SLC1HOST_TOKEN1_WR : WO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1HOST_TOKEN1_WR (BIT(7)) +#define HOST_SLC1HOST_TOKEN1_WR_M (BIT(7)) +#define HOST_SLC1HOST_TOKEN1_WR_V 0x1 +#define HOST_SLC1HOST_TOKEN1_WR_S 7 +/* HOST_SLC1HOST_TOKEN0_WR : WO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1HOST_TOKEN0_WR (BIT(6)) +#define HOST_SLC1HOST_TOKEN0_WR_M (BIT(6)) +#define HOST_SLC1HOST_TOKEN0_WR_V 0x1 +#define HOST_SLC1HOST_TOKEN0_WR_S 6 +/* HOST_SLC1HOST_TOKEN1_DEC : WO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1HOST_TOKEN1_DEC (BIT(5)) +#define HOST_SLC1HOST_TOKEN1_DEC_M (BIT(5)) +#define HOST_SLC1HOST_TOKEN1_DEC_V 0x1 +#define HOST_SLC1HOST_TOKEN1_DEC_S 5 +/* HOST_SLC1HOST_TOKEN0_DEC : WO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1HOST_TOKEN0_DEC (BIT(4)) +#define HOST_SLC1HOST_TOKEN0_DEC_M (BIT(4)) +#define HOST_SLC1HOST_TOKEN0_DEC_V 0x1 +#define HOST_SLC1HOST_TOKEN0_DEC_S 4 +/* HOST_SLC0HOST_TOKEN1_WR : WO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0HOST_TOKEN1_WR (BIT(3)) +#define HOST_SLC0HOST_TOKEN1_WR_M (BIT(3)) +#define HOST_SLC0HOST_TOKEN1_WR_V 0x1 +#define HOST_SLC0HOST_TOKEN1_WR_S 3 +/* HOST_SLC0HOST_TOKEN0_WR : WO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0HOST_TOKEN0_WR (BIT(2)) +#define HOST_SLC0HOST_TOKEN0_WR_M (BIT(2)) +#define HOST_SLC0HOST_TOKEN0_WR_V 0x1 +#define HOST_SLC0HOST_TOKEN0_WR_S 2 +/* HOST_SLC0HOST_TOKEN1_DEC : WO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0HOST_TOKEN1_DEC (BIT(1)) +#define HOST_SLC0HOST_TOKEN1_DEC_M (BIT(1)) +#define HOST_SLC0HOST_TOKEN1_DEC_V 0x1 +#define HOST_SLC0HOST_TOKEN1_DEC_S 1 +/* HOST_SLC0HOST_TOKEN0_DEC : WO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0HOST_TOKEN0_DEC (BIT(0)) +#define HOST_SLC0HOST_TOKEN0_DEC_M (BIT(0)) +#define HOST_SLC0HOST_TOKEN0_DEC_V 0x1 +#define HOST_SLC0HOST_TOKEN0_DEC_S 0 + +#define HOST_SLC0HOST_INT_CLR_REG (DR_REG_SLCHOST_BASE + 0xD4) +/* HOST_GPIO_SDIO_INT_CLR : WO ;bitpos:[25] ;default: 1'b0 ; */ +/*description: */ +#define HOST_GPIO_SDIO_INT_CLR (BIT(25)) +#define HOST_GPIO_SDIO_INT_CLR_M (BIT(25)) +#define HOST_GPIO_SDIO_INT_CLR_V 0x1 +#define HOST_GPIO_SDIO_INT_CLR_S 25 +/* HOST_SLC0_HOST_RD_RETRY_INT_CLR : WO ;bitpos:[24] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_HOST_RD_RETRY_INT_CLR (BIT(24)) +#define HOST_SLC0_HOST_RD_RETRY_INT_CLR_M (BIT(24)) +#define HOST_SLC0_HOST_RD_RETRY_INT_CLR_V 0x1 +#define HOST_SLC0_HOST_RD_RETRY_INT_CLR_S 24 +/* HOST_SLC0_RX_NEW_PACKET_INT_CLR : WO ;bitpos:[23] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_RX_NEW_PACKET_INT_CLR (BIT(23)) +#define HOST_SLC0_RX_NEW_PACKET_INT_CLR_M (BIT(23)) +#define HOST_SLC0_RX_NEW_PACKET_INT_CLR_V 0x1 +#define HOST_SLC0_RX_NEW_PACKET_INT_CLR_S 23 +/* HOST_SLC0_EXT_BIT3_INT_CLR : WO ;bitpos:[22] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_EXT_BIT3_INT_CLR (BIT(22)) +#define HOST_SLC0_EXT_BIT3_INT_CLR_M (BIT(22)) +#define HOST_SLC0_EXT_BIT3_INT_CLR_V 0x1 +#define HOST_SLC0_EXT_BIT3_INT_CLR_S 22 +/* HOST_SLC0_EXT_BIT2_INT_CLR : WO ;bitpos:[21] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_EXT_BIT2_INT_CLR (BIT(21)) +#define HOST_SLC0_EXT_BIT2_INT_CLR_M (BIT(21)) +#define HOST_SLC0_EXT_BIT2_INT_CLR_V 0x1 +#define HOST_SLC0_EXT_BIT2_INT_CLR_S 21 +/* HOST_SLC0_EXT_BIT1_INT_CLR : WO ;bitpos:[20] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_EXT_BIT1_INT_CLR (BIT(20)) +#define HOST_SLC0_EXT_BIT1_INT_CLR_M (BIT(20)) +#define HOST_SLC0_EXT_BIT1_INT_CLR_V 0x1 +#define HOST_SLC0_EXT_BIT1_INT_CLR_S 20 +/* HOST_SLC0_EXT_BIT0_INT_CLR : WO ;bitpos:[19] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_EXT_BIT0_INT_CLR (BIT(19)) +#define HOST_SLC0_EXT_BIT0_INT_CLR_M (BIT(19)) +#define HOST_SLC0_EXT_BIT0_INT_CLR_V 0x1 +#define HOST_SLC0_EXT_BIT0_INT_CLR_S 19 +/* HOST_SLC0_RX_PF_VALID_INT_CLR : WO ;bitpos:[18] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_RX_PF_VALID_INT_CLR (BIT(18)) +#define HOST_SLC0_RX_PF_VALID_INT_CLR_M (BIT(18)) +#define HOST_SLC0_RX_PF_VALID_INT_CLR_V 0x1 +#define HOST_SLC0_RX_PF_VALID_INT_CLR_S 18 +/* HOST_SLC0_TX_OVF_INT_CLR : WO ;bitpos:[17] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TX_OVF_INT_CLR (BIT(17)) +#define HOST_SLC0_TX_OVF_INT_CLR_M (BIT(17)) +#define HOST_SLC0_TX_OVF_INT_CLR_V 0x1 +#define HOST_SLC0_TX_OVF_INT_CLR_S 17 +/* HOST_SLC0_RX_UDF_INT_CLR : WO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_RX_UDF_INT_CLR (BIT(16)) +#define HOST_SLC0_RX_UDF_INT_CLR_M (BIT(16)) +#define HOST_SLC0_RX_UDF_INT_CLR_V 0x1 +#define HOST_SLC0_RX_UDF_INT_CLR_S 16 +/* HOST_SLC0HOST_TX_START_INT_CLR : WO ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0HOST_TX_START_INT_CLR (BIT(15)) +#define HOST_SLC0HOST_TX_START_INT_CLR_M (BIT(15)) +#define HOST_SLC0HOST_TX_START_INT_CLR_V 0x1 +#define HOST_SLC0HOST_TX_START_INT_CLR_S 15 +/* HOST_SLC0HOST_RX_START_INT_CLR : WO ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0HOST_RX_START_INT_CLR (BIT(14)) +#define HOST_SLC0HOST_RX_START_INT_CLR_M (BIT(14)) +#define HOST_SLC0HOST_RX_START_INT_CLR_V 0x1 +#define HOST_SLC0HOST_RX_START_INT_CLR_S 14 +/* HOST_SLC0HOST_RX_EOF_INT_CLR : WO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0HOST_RX_EOF_INT_CLR (BIT(13)) +#define HOST_SLC0HOST_RX_EOF_INT_CLR_M (BIT(13)) +#define HOST_SLC0HOST_RX_EOF_INT_CLR_V 0x1 +#define HOST_SLC0HOST_RX_EOF_INT_CLR_S 13 +/* HOST_SLC0HOST_RX_SOF_INT_CLR : WO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0HOST_RX_SOF_INT_CLR (BIT(12)) +#define HOST_SLC0HOST_RX_SOF_INT_CLR_M (BIT(12)) +#define HOST_SLC0HOST_RX_SOF_INT_CLR_V 0x1 +#define HOST_SLC0HOST_RX_SOF_INT_CLR_S 12 +/* HOST_SLC0_TOKEN1_0TO1_INT_CLR : WO ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOKEN1_0TO1_INT_CLR (BIT(11)) +#define HOST_SLC0_TOKEN1_0TO1_INT_CLR_M (BIT(11)) +#define HOST_SLC0_TOKEN1_0TO1_INT_CLR_V 0x1 +#define HOST_SLC0_TOKEN1_0TO1_INT_CLR_S 11 +/* HOST_SLC0_TOKEN0_0TO1_INT_CLR : WO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOKEN0_0TO1_INT_CLR (BIT(10)) +#define HOST_SLC0_TOKEN0_0TO1_INT_CLR_M (BIT(10)) +#define HOST_SLC0_TOKEN0_0TO1_INT_CLR_V 0x1 +#define HOST_SLC0_TOKEN0_0TO1_INT_CLR_S 10 +/* HOST_SLC0_TOKEN1_1TO0_INT_CLR : WO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOKEN1_1TO0_INT_CLR (BIT(9)) +#define HOST_SLC0_TOKEN1_1TO0_INT_CLR_M (BIT(9)) +#define HOST_SLC0_TOKEN1_1TO0_INT_CLR_V 0x1 +#define HOST_SLC0_TOKEN1_1TO0_INT_CLR_S 9 +/* HOST_SLC0_TOKEN0_1TO0_INT_CLR : WO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOKEN0_1TO0_INT_CLR (BIT(8)) +#define HOST_SLC0_TOKEN0_1TO0_INT_CLR_M (BIT(8)) +#define HOST_SLC0_TOKEN0_1TO0_INT_CLR_V 0x1 +#define HOST_SLC0_TOKEN0_1TO0_INT_CLR_S 8 +/* HOST_SLC0_TOHOST_BIT7_INT_CLR : WO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT7_INT_CLR (BIT(7)) +#define HOST_SLC0_TOHOST_BIT7_INT_CLR_M (BIT(7)) +#define HOST_SLC0_TOHOST_BIT7_INT_CLR_V 0x1 +#define HOST_SLC0_TOHOST_BIT7_INT_CLR_S 7 +/* HOST_SLC0_TOHOST_BIT6_INT_CLR : WO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT6_INT_CLR (BIT(6)) +#define HOST_SLC0_TOHOST_BIT6_INT_CLR_M (BIT(6)) +#define HOST_SLC0_TOHOST_BIT6_INT_CLR_V 0x1 +#define HOST_SLC0_TOHOST_BIT6_INT_CLR_S 6 +/* HOST_SLC0_TOHOST_BIT5_INT_CLR : WO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT5_INT_CLR (BIT(5)) +#define HOST_SLC0_TOHOST_BIT5_INT_CLR_M (BIT(5)) +#define HOST_SLC0_TOHOST_BIT5_INT_CLR_V 0x1 +#define HOST_SLC0_TOHOST_BIT5_INT_CLR_S 5 +/* HOST_SLC0_TOHOST_BIT4_INT_CLR : WO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT4_INT_CLR (BIT(4)) +#define HOST_SLC0_TOHOST_BIT4_INT_CLR_M (BIT(4)) +#define HOST_SLC0_TOHOST_BIT4_INT_CLR_V 0x1 +#define HOST_SLC0_TOHOST_BIT4_INT_CLR_S 4 +/* HOST_SLC0_TOHOST_BIT3_INT_CLR : WO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT3_INT_CLR (BIT(3)) +#define HOST_SLC0_TOHOST_BIT3_INT_CLR_M (BIT(3)) +#define HOST_SLC0_TOHOST_BIT3_INT_CLR_V 0x1 +#define HOST_SLC0_TOHOST_BIT3_INT_CLR_S 3 +/* HOST_SLC0_TOHOST_BIT2_INT_CLR : WO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT2_INT_CLR (BIT(2)) +#define HOST_SLC0_TOHOST_BIT2_INT_CLR_M (BIT(2)) +#define HOST_SLC0_TOHOST_BIT2_INT_CLR_V 0x1 +#define HOST_SLC0_TOHOST_BIT2_INT_CLR_S 2 +/* HOST_SLC0_TOHOST_BIT1_INT_CLR : WO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT1_INT_CLR (BIT(1)) +#define HOST_SLC0_TOHOST_BIT1_INT_CLR_M (BIT(1)) +#define HOST_SLC0_TOHOST_BIT1_INT_CLR_V 0x1 +#define HOST_SLC0_TOHOST_BIT1_INT_CLR_S 1 +/* HOST_SLC0_TOHOST_BIT0_INT_CLR : WO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT0_INT_CLR (BIT(0)) +#define HOST_SLC0_TOHOST_BIT0_INT_CLR_M (BIT(0)) +#define HOST_SLC0_TOHOST_BIT0_INT_CLR_V 0x1 +#define HOST_SLC0_TOHOST_BIT0_INT_CLR_S 0 + +#define HOST_SLC1HOST_INT_CLR_REG (DR_REG_SLCHOST_BASE + 0xD8) +/* HOST_SLC1_BT_RX_NEW_PACKET_INT_CLR : WO ;bitpos:[25] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_BT_RX_NEW_PACKET_INT_CLR (BIT(25)) +#define HOST_SLC1_BT_RX_NEW_PACKET_INT_CLR_M (BIT(25)) +#define HOST_SLC1_BT_RX_NEW_PACKET_INT_CLR_V 0x1 +#define HOST_SLC1_BT_RX_NEW_PACKET_INT_CLR_S 25 +/* HOST_SLC1_HOST_RD_RETRY_INT_CLR : WO ;bitpos:[24] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_HOST_RD_RETRY_INT_CLR (BIT(24)) +#define HOST_SLC1_HOST_RD_RETRY_INT_CLR_M (BIT(24)) +#define HOST_SLC1_HOST_RD_RETRY_INT_CLR_V 0x1 +#define HOST_SLC1_HOST_RD_RETRY_INT_CLR_S 24 +/* HOST_SLC1_WIFI_RX_NEW_PACKET_INT_CLR : WO ;bitpos:[23] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_WIFI_RX_NEW_PACKET_INT_CLR (BIT(23)) +#define HOST_SLC1_WIFI_RX_NEW_PACKET_INT_CLR_M (BIT(23)) +#define HOST_SLC1_WIFI_RX_NEW_PACKET_INT_CLR_V 0x1 +#define HOST_SLC1_WIFI_RX_NEW_PACKET_INT_CLR_S 23 +/* HOST_SLC1_EXT_BIT3_INT_CLR : WO ;bitpos:[22] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_EXT_BIT3_INT_CLR (BIT(22)) +#define HOST_SLC1_EXT_BIT3_INT_CLR_M (BIT(22)) +#define HOST_SLC1_EXT_BIT3_INT_CLR_V 0x1 +#define HOST_SLC1_EXT_BIT3_INT_CLR_S 22 +/* HOST_SLC1_EXT_BIT2_INT_CLR : WO ;bitpos:[21] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_EXT_BIT2_INT_CLR (BIT(21)) +#define HOST_SLC1_EXT_BIT2_INT_CLR_M (BIT(21)) +#define HOST_SLC1_EXT_BIT2_INT_CLR_V 0x1 +#define HOST_SLC1_EXT_BIT2_INT_CLR_S 21 +/* HOST_SLC1_EXT_BIT1_INT_CLR : WO ;bitpos:[20] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_EXT_BIT1_INT_CLR (BIT(20)) +#define HOST_SLC1_EXT_BIT1_INT_CLR_M (BIT(20)) +#define HOST_SLC1_EXT_BIT1_INT_CLR_V 0x1 +#define HOST_SLC1_EXT_BIT1_INT_CLR_S 20 +/* HOST_SLC1_EXT_BIT0_INT_CLR : WO ;bitpos:[19] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_EXT_BIT0_INT_CLR (BIT(19)) +#define HOST_SLC1_EXT_BIT0_INT_CLR_M (BIT(19)) +#define HOST_SLC1_EXT_BIT0_INT_CLR_V 0x1 +#define HOST_SLC1_EXT_BIT0_INT_CLR_S 19 +/* HOST_SLC1_RX_PF_VALID_INT_CLR : WO ;bitpos:[18] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_RX_PF_VALID_INT_CLR (BIT(18)) +#define HOST_SLC1_RX_PF_VALID_INT_CLR_M (BIT(18)) +#define HOST_SLC1_RX_PF_VALID_INT_CLR_V 0x1 +#define HOST_SLC1_RX_PF_VALID_INT_CLR_S 18 +/* HOST_SLC1_TX_OVF_INT_CLR : WO ;bitpos:[17] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TX_OVF_INT_CLR (BIT(17)) +#define HOST_SLC1_TX_OVF_INT_CLR_M (BIT(17)) +#define HOST_SLC1_TX_OVF_INT_CLR_V 0x1 +#define HOST_SLC1_TX_OVF_INT_CLR_S 17 +/* HOST_SLC1_RX_UDF_INT_CLR : WO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_RX_UDF_INT_CLR (BIT(16)) +#define HOST_SLC1_RX_UDF_INT_CLR_M (BIT(16)) +#define HOST_SLC1_RX_UDF_INT_CLR_V 0x1 +#define HOST_SLC1_RX_UDF_INT_CLR_S 16 +/* HOST_SLC1HOST_TX_START_INT_CLR : WO ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1HOST_TX_START_INT_CLR (BIT(15)) +#define HOST_SLC1HOST_TX_START_INT_CLR_M (BIT(15)) +#define HOST_SLC1HOST_TX_START_INT_CLR_V 0x1 +#define HOST_SLC1HOST_TX_START_INT_CLR_S 15 +/* HOST_SLC1HOST_RX_START_INT_CLR : WO ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1HOST_RX_START_INT_CLR (BIT(14)) +#define HOST_SLC1HOST_RX_START_INT_CLR_M (BIT(14)) +#define HOST_SLC1HOST_RX_START_INT_CLR_V 0x1 +#define HOST_SLC1HOST_RX_START_INT_CLR_S 14 +/* HOST_SLC1HOST_RX_EOF_INT_CLR : WO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1HOST_RX_EOF_INT_CLR (BIT(13)) +#define HOST_SLC1HOST_RX_EOF_INT_CLR_M (BIT(13)) +#define HOST_SLC1HOST_RX_EOF_INT_CLR_V 0x1 +#define HOST_SLC1HOST_RX_EOF_INT_CLR_S 13 +/* HOST_SLC1HOST_RX_SOF_INT_CLR : WO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1HOST_RX_SOF_INT_CLR (BIT(12)) +#define HOST_SLC1HOST_RX_SOF_INT_CLR_M (BIT(12)) +#define HOST_SLC1HOST_RX_SOF_INT_CLR_V 0x1 +#define HOST_SLC1HOST_RX_SOF_INT_CLR_S 12 +/* HOST_SLC1_TOKEN1_0TO1_INT_CLR : WO ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOKEN1_0TO1_INT_CLR (BIT(11)) +#define HOST_SLC1_TOKEN1_0TO1_INT_CLR_M (BIT(11)) +#define HOST_SLC1_TOKEN1_0TO1_INT_CLR_V 0x1 +#define HOST_SLC1_TOKEN1_0TO1_INT_CLR_S 11 +/* HOST_SLC1_TOKEN0_0TO1_INT_CLR : WO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOKEN0_0TO1_INT_CLR (BIT(10)) +#define HOST_SLC1_TOKEN0_0TO1_INT_CLR_M (BIT(10)) +#define HOST_SLC1_TOKEN0_0TO1_INT_CLR_V 0x1 +#define HOST_SLC1_TOKEN0_0TO1_INT_CLR_S 10 +/* HOST_SLC1_TOKEN1_1TO0_INT_CLR : WO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOKEN1_1TO0_INT_CLR (BIT(9)) +#define HOST_SLC1_TOKEN1_1TO0_INT_CLR_M (BIT(9)) +#define HOST_SLC1_TOKEN1_1TO0_INT_CLR_V 0x1 +#define HOST_SLC1_TOKEN1_1TO0_INT_CLR_S 9 +/* HOST_SLC1_TOKEN0_1TO0_INT_CLR : WO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOKEN0_1TO0_INT_CLR (BIT(8)) +#define HOST_SLC1_TOKEN0_1TO0_INT_CLR_M (BIT(8)) +#define HOST_SLC1_TOKEN0_1TO0_INT_CLR_V 0x1 +#define HOST_SLC1_TOKEN0_1TO0_INT_CLR_S 8 +/* HOST_SLC1_TOHOST_BIT7_INT_CLR : WO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT7_INT_CLR (BIT(7)) +#define HOST_SLC1_TOHOST_BIT7_INT_CLR_M (BIT(7)) +#define HOST_SLC1_TOHOST_BIT7_INT_CLR_V 0x1 +#define HOST_SLC1_TOHOST_BIT7_INT_CLR_S 7 +/* HOST_SLC1_TOHOST_BIT6_INT_CLR : WO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT6_INT_CLR (BIT(6)) +#define HOST_SLC1_TOHOST_BIT6_INT_CLR_M (BIT(6)) +#define HOST_SLC1_TOHOST_BIT6_INT_CLR_V 0x1 +#define HOST_SLC1_TOHOST_BIT6_INT_CLR_S 6 +/* HOST_SLC1_TOHOST_BIT5_INT_CLR : WO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT5_INT_CLR (BIT(5)) +#define HOST_SLC1_TOHOST_BIT5_INT_CLR_M (BIT(5)) +#define HOST_SLC1_TOHOST_BIT5_INT_CLR_V 0x1 +#define HOST_SLC1_TOHOST_BIT5_INT_CLR_S 5 +/* HOST_SLC1_TOHOST_BIT4_INT_CLR : WO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT4_INT_CLR (BIT(4)) +#define HOST_SLC1_TOHOST_BIT4_INT_CLR_M (BIT(4)) +#define HOST_SLC1_TOHOST_BIT4_INT_CLR_V 0x1 +#define HOST_SLC1_TOHOST_BIT4_INT_CLR_S 4 +/* HOST_SLC1_TOHOST_BIT3_INT_CLR : WO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT3_INT_CLR (BIT(3)) +#define HOST_SLC1_TOHOST_BIT3_INT_CLR_M (BIT(3)) +#define HOST_SLC1_TOHOST_BIT3_INT_CLR_V 0x1 +#define HOST_SLC1_TOHOST_BIT3_INT_CLR_S 3 +/* HOST_SLC1_TOHOST_BIT2_INT_CLR : WO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT2_INT_CLR (BIT(2)) +#define HOST_SLC1_TOHOST_BIT2_INT_CLR_M (BIT(2)) +#define HOST_SLC1_TOHOST_BIT2_INT_CLR_V 0x1 +#define HOST_SLC1_TOHOST_BIT2_INT_CLR_S 2 +/* HOST_SLC1_TOHOST_BIT1_INT_CLR : WO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT1_INT_CLR (BIT(1)) +#define HOST_SLC1_TOHOST_BIT1_INT_CLR_M (BIT(1)) +#define HOST_SLC1_TOHOST_BIT1_INT_CLR_V 0x1 +#define HOST_SLC1_TOHOST_BIT1_INT_CLR_S 1 +/* HOST_SLC1_TOHOST_BIT0_INT_CLR : WO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT0_INT_CLR (BIT(0)) +#define HOST_SLC1_TOHOST_BIT0_INT_CLR_M (BIT(0)) +#define HOST_SLC1_TOHOST_BIT0_INT_CLR_V 0x1 +#define HOST_SLC1_TOHOST_BIT0_INT_CLR_S 0 + +#define HOST_SLC0HOST_FUNC1_INT_ENA_REG (DR_REG_SLCHOST_BASE + 0xDC) +/* HOST_FN1_GPIO_SDIO_INT_ENA : R/W ;bitpos:[25] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_GPIO_SDIO_INT_ENA (BIT(25)) +#define HOST_FN1_GPIO_SDIO_INT_ENA_M (BIT(25)) +#define HOST_FN1_GPIO_SDIO_INT_ENA_V 0x1 +#define HOST_FN1_GPIO_SDIO_INT_ENA_S 25 +/* HOST_FN1_SLC0_HOST_RD_RETRY_INT_ENA : R/W ;bitpos:[24] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC0_HOST_RD_RETRY_INT_ENA (BIT(24)) +#define HOST_FN1_SLC0_HOST_RD_RETRY_INT_ENA_M (BIT(24)) +#define HOST_FN1_SLC0_HOST_RD_RETRY_INT_ENA_V 0x1 +#define HOST_FN1_SLC0_HOST_RD_RETRY_INT_ENA_S 24 +/* HOST_FN1_SLC0_RX_NEW_PACKET_INT_ENA : R/W ;bitpos:[23] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC0_RX_NEW_PACKET_INT_ENA (BIT(23)) +#define HOST_FN1_SLC0_RX_NEW_PACKET_INT_ENA_M (BIT(23)) +#define HOST_FN1_SLC0_RX_NEW_PACKET_INT_ENA_V 0x1 +#define HOST_FN1_SLC0_RX_NEW_PACKET_INT_ENA_S 23 +/* HOST_FN1_SLC0_EXT_BIT3_INT_ENA : R/W ;bitpos:[22] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC0_EXT_BIT3_INT_ENA (BIT(22)) +#define HOST_FN1_SLC0_EXT_BIT3_INT_ENA_M (BIT(22)) +#define HOST_FN1_SLC0_EXT_BIT3_INT_ENA_V 0x1 +#define HOST_FN1_SLC0_EXT_BIT3_INT_ENA_S 22 +/* HOST_FN1_SLC0_EXT_BIT2_INT_ENA : R/W ;bitpos:[21] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC0_EXT_BIT2_INT_ENA (BIT(21)) +#define HOST_FN1_SLC0_EXT_BIT2_INT_ENA_M (BIT(21)) +#define HOST_FN1_SLC0_EXT_BIT2_INT_ENA_V 0x1 +#define HOST_FN1_SLC0_EXT_BIT2_INT_ENA_S 21 +/* HOST_FN1_SLC0_EXT_BIT1_INT_ENA : R/W ;bitpos:[20] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC0_EXT_BIT1_INT_ENA (BIT(20)) +#define HOST_FN1_SLC0_EXT_BIT1_INT_ENA_M (BIT(20)) +#define HOST_FN1_SLC0_EXT_BIT1_INT_ENA_V 0x1 +#define HOST_FN1_SLC0_EXT_BIT1_INT_ENA_S 20 +/* HOST_FN1_SLC0_EXT_BIT0_INT_ENA : R/W ;bitpos:[19] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC0_EXT_BIT0_INT_ENA (BIT(19)) +#define HOST_FN1_SLC0_EXT_BIT0_INT_ENA_M (BIT(19)) +#define HOST_FN1_SLC0_EXT_BIT0_INT_ENA_V 0x1 +#define HOST_FN1_SLC0_EXT_BIT0_INT_ENA_S 19 +/* HOST_FN1_SLC0_RX_PF_VALID_INT_ENA : R/W ;bitpos:[18] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC0_RX_PF_VALID_INT_ENA (BIT(18)) +#define HOST_FN1_SLC0_RX_PF_VALID_INT_ENA_M (BIT(18)) +#define HOST_FN1_SLC0_RX_PF_VALID_INT_ENA_V 0x1 +#define HOST_FN1_SLC0_RX_PF_VALID_INT_ENA_S 18 +/* HOST_FN1_SLC0_TX_OVF_INT_ENA : R/W ;bitpos:[17] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC0_TX_OVF_INT_ENA (BIT(17)) +#define HOST_FN1_SLC0_TX_OVF_INT_ENA_M (BIT(17)) +#define HOST_FN1_SLC0_TX_OVF_INT_ENA_V 0x1 +#define HOST_FN1_SLC0_TX_OVF_INT_ENA_S 17 +/* HOST_FN1_SLC0_RX_UDF_INT_ENA : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC0_RX_UDF_INT_ENA (BIT(16)) +#define HOST_FN1_SLC0_RX_UDF_INT_ENA_M (BIT(16)) +#define HOST_FN1_SLC0_RX_UDF_INT_ENA_V 0x1 +#define HOST_FN1_SLC0_RX_UDF_INT_ENA_S 16 +/* HOST_FN1_SLC0HOST_TX_START_INT_ENA : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC0HOST_TX_START_INT_ENA (BIT(15)) +#define HOST_FN1_SLC0HOST_TX_START_INT_ENA_M (BIT(15)) +#define HOST_FN1_SLC0HOST_TX_START_INT_ENA_V 0x1 +#define HOST_FN1_SLC0HOST_TX_START_INT_ENA_S 15 +/* HOST_FN1_SLC0HOST_RX_START_INT_ENA : R/W ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC0HOST_RX_START_INT_ENA (BIT(14)) +#define HOST_FN1_SLC0HOST_RX_START_INT_ENA_M (BIT(14)) +#define HOST_FN1_SLC0HOST_RX_START_INT_ENA_V 0x1 +#define HOST_FN1_SLC0HOST_RX_START_INT_ENA_S 14 +/* HOST_FN1_SLC0HOST_RX_EOF_INT_ENA : R/W ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC0HOST_RX_EOF_INT_ENA (BIT(13)) +#define HOST_FN1_SLC0HOST_RX_EOF_INT_ENA_M (BIT(13)) +#define HOST_FN1_SLC0HOST_RX_EOF_INT_ENA_V 0x1 +#define HOST_FN1_SLC0HOST_RX_EOF_INT_ENA_S 13 +/* HOST_FN1_SLC0HOST_RX_SOF_INT_ENA : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC0HOST_RX_SOF_INT_ENA (BIT(12)) +#define HOST_FN1_SLC0HOST_RX_SOF_INT_ENA_M (BIT(12)) +#define HOST_FN1_SLC0HOST_RX_SOF_INT_ENA_V 0x1 +#define HOST_FN1_SLC0HOST_RX_SOF_INT_ENA_S 12 +/* HOST_FN1_SLC0_TOKEN1_0TO1_INT_ENA : R/W ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC0_TOKEN1_0TO1_INT_ENA (BIT(11)) +#define HOST_FN1_SLC0_TOKEN1_0TO1_INT_ENA_M (BIT(11)) +#define HOST_FN1_SLC0_TOKEN1_0TO1_INT_ENA_V 0x1 +#define HOST_FN1_SLC0_TOKEN1_0TO1_INT_ENA_S 11 +/* HOST_FN1_SLC0_TOKEN0_0TO1_INT_ENA : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC0_TOKEN0_0TO1_INT_ENA (BIT(10)) +#define HOST_FN1_SLC0_TOKEN0_0TO1_INT_ENA_M (BIT(10)) +#define HOST_FN1_SLC0_TOKEN0_0TO1_INT_ENA_V 0x1 +#define HOST_FN1_SLC0_TOKEN0_0TO1_INT_ENA_S 10 +/* HOST_FN1_SLC0_TOKEN1_1TO0_INT_ENA : R/W ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC0_TOKEN1_1TO0_INT_ENA (BIT(9)) +#define HOST_FN1_SLC0_TOKEN1_1TO0_INT_ENA_M (BIT(9)) +#define HOST_FN1_SLC0_TOKEN1_1TO0_INT_ENA_V 0x1 +#define HOST_FN1_SLC0_TOKEN1_1TO0_INT_ENA_S 9 +/* HOST_FN1_SLC0_TOKEN0_1TO0_INT_ENA : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC0_TOKEN0_1TO0_INT_ENA (BIT(8)) +#define HOST_FN1_SLC0_TOKEN0_1TO0_INT_ENA_M (BIT(8)) +#define HOST_FN1_SLC0_TOKEN0_1TO0_INT_ENA_V 0x1 +#define HOST_FN1_SLC0_TOKEN0_1TO0_INT_ENA_S 8 +/* HOST_FN1_SLC0_TOHOST_BIT7_INT_ENA : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC0_TOHOST_BIT7_INT_ENA (BIT(7)) +#define HOST_FN1_SLC0_TOHOST_BIT7_INT_ENA_M (BIT(7)) +#define HOST_FN1_SLC0_TOHOST_BIT7_INT_ENA_V 0x1 +#define HOST_FN1_SLC0_TOHOST_BIT7_INT_ENA_S 7 +/* HOST_FN1_SLC0_TOHOST_BIT6_INT_ENA : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC0_TOHOST_BIT6_INT_ENA (BIT(6)) +#define HOST_FN1_SLC0_TOHOST_BIT6_INT_ENA_M (BIT(6)) +#define HOST_FN1_SLC0_TOHOST_BIT6_INT_ENA_V 0x1 +#define HOST_FN1_SLC0_TOHOST_BIT6_INT_ENA_S 6 +/* HOST_FN1_SLC0_TOHOST_BIT5_INT_ENA : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC0_TOHOST_BIT5_INT_ENA (BIT(5)) +#define HOST_FN1_SLC0_TOHOST_BIT5_INT_ENA_M (BIT(5)) +#define HOST_FN1_SLC0_TOHOST_BIT5_INT_ENA_V 0x1 +#define HOST_FN1_SLC0_TOHOST_BIT5_INT_ENA_S 5 +/* HOST_FN1_SLC0_TOHOST_BIT4_INT_ENA : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC0_TOHOST_BIT4_INT_ENA (BIT(4)) +#define HOST_FN1_SLC0_TOHOST_BIT4_INT_ENA_M (BIT(4)) +#define HOST_FN1_SLC0_TOHOST_BIT4_INT_ENA_V 0x1 +#define HOST_FN1_SLC0_TOHOST_BIT4_INT_ENA_S 4 +/* HOST_FN1_SLC0_TOHOST_BIT3_INT_ENA : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC0_TOHOST_BIT3_INT_ENA (BIT(3)) +#define HOST_FN1_SLC0_TOHOST_BIT3_INT_ENA_M (BIT(3)) +#define HOST_FN1_SLC0_TOHOST_BIT3_INT_ENA_V 0x1 +#define HOST_FN1_SLC0_TOHOST_BIT3_INT_ENA_S 3 +/* HOST_FN1_SLC0_TOHOST_BIT2_INT_ENA : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC0_TOHOST_BIT2_INT_ENA (BIT(2)) +#define HOST_FN1_SLC0_TOHOST_BIT2_INT_ENA_M (BIT(2)) +#define HOST_FN1_SLC0_TOHOST_BIT2_INT_ENA_V 0x1 +#define HOST_FN1_SLC0_TOHOST_BIT2_INT_ENA_S 2 +/* HOST_FN1_SLC0_TOHOST_BIT1_INT_ENA : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC0_TOHOST_BIT1_INT_ENA (BIT(1)) +#define HOST_FN1_SLC0_TOHOST_BIT1_INT_ENA_M (BIT(1)) +#define HOST_FN1_SLC0_TOHOST_BIT1_INT_ENA_V 0x1 +#define HOST_FN1_SLC0_TOHOST_BIT1_INT_ENA_S 1 +/* HOST_FN1_SLC0_TOHOST_BIT0_INT_ENA : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC0_TOHOST_BIT0_INT_ENA (BIT(0)) +#define HOST_FN1_SLC0_TOHOST_BIT0_INT_ENA_M (BIT(0)) +#define HOST_FN1_SLC0_TOHOST_BIT0_INT_ENA_V 0x1 +#define HOST_FN1_SLC0_TOHOST_BIT0_INT_ENA_S 0 + +#define HOST_SLC1HOST_FUNC1_INT_ENA_REG (DR_REG_SLCHOST_BASE + 0xE0) +/* HOST_FN1_SLC1_BT_RX_NEW_PACKET_INT_ENA : R/W ;bitpos:[25] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC1_BT_RX_NEW_PACKET_INT_ENA (BIT(25)) +#define HOST_FN1_SLC1_BT_RX_NEW_PACKET_INT_ENA_M (BIT(25)) +#define HOST_FN1_SLC1_BT_RX_NEW_PACKET_INT_ENA_V 0x1 +#define HOST_FN1_SLC1_BT_RX_NEW_PACKET_INT_ENA_S 25 +/* HOST_FN1_SLC1_HOST_RD_RETRY_INT_ENA : R/W ;bitpos:[24] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC1_HOST_RD_RETRY_INT_ENA (BIT(24)) +#define HOST_FN1_SLC1_HOST_RD_RETRY_INT_ENA_M (BIT(24)) +#define HOST_FN1_SLC1_HOST_RD_RETRY_INT_ENA_V 0x1 +#define HOST_FN1_SLC1_HOST_RD_RETRY_INT_ENA_S 24 +/* HOST_FN1_SLC1_WIFI_RX_NEW_PACKET_INT_ENA : R/W ;bitpos:[23] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC1_WIFI_RX_NEW_PACKET_INT_ENA (BIT(23)) +#define HOST_FN1_SLC1_WIFI_RX_NEW_PACKET_INT_ENA_M (BIT(23)) +#define HOST_FN1_SLC1_WIFI_RX_NEW_PACKET_INT_ENA_V 0x1 +#define HOST_FN1_SLC1_WIFI_RX_NEW_PACKET_INT_ENA_S 23 +/* HOST_FN1_SLC1_EXT_BIT3_INT_ENA : R/W ;bitpos:[22] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC1_EXT_BIT3_INT_ENA (BIT(22)) +#define HOST_FN1_SLC1_EXT_BIT3_INT_ENA_M (BIT(22)) +#define HOST_FN1_SLC1_EXT_BIT3_INT_ENA_V 0x1 +#define HOST_FN1_SLC1_EXT_BIT3_INT_ENA_S 22 +/* HOST_FN1_SLC1_EXT_BIT2_INT_ENA : R/W ;bitpos:[21] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC1_EXT_BIT2_INT_ENA (BIT(21)) +#define HOST_FN1_SLC1_EXT_BIT2_INT_ENA_M (BIT(21)) +#define HOST_FN1_SLC1_EXT_BIT2_INT_ENA_V 0x1 +#define HOST_FN1_SLC1_EXT_BIT2_INT_ENA_S 21 +/* HOST_FN1_SLC1_EXT_BIT1_INT_ENA : R/W ;bitpos:[20] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC1_EXT_BIT1_INT_ENA (BIT(20)) +#define HOST_FN1_SLC1_EXT_BIT1_INT_ENA_M (BIT(20)) +#define HOST_FN1_SLC1_EXT_BIT1_INT_ENA_V 0x1 +#define HOST_FN1_SLC1_EXT_BIT1_INT_ENA_S 20 +/* HOST_FN1_SLC1_EXT_BIT0_INT_ENA : R/W ;bitpos:[19] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC1_EXT_BIT0_INT_ENA (BIT(19)) +#define HOST_FN1_SLC1_EXT_BIT0_INT_ENA_M (BIT(19)) +#define HOST_FN1_SLC1_EXT_BIT0_INT_ENA_V 0x1 +#define HOST_FN1_SLC1_EXT_BIT0_INT_ENA_S 19 +/* HOST_FN1_SLC1_RX_PF_VALID_INT_ENA : R/W ;bitpos:[18] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC1_RX_PF_VALID_INT_ENA (BIT(18)) +#define HOST_FN1_SLC1_RX_PF_VALID_INT_ENA_M (BIT(18)) +#define HOST_FN1_SLC1_RX_PF_VALID_INT_ENA_V 0x1 +#define HOST_FN1_SLC1_RX_PF_VALID_INT_ENA_S 18 +/* HOST_FN1_SLC1_TX_OVF_INT_ENA : R/W ;bitpos:[17] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC1_TX_OVF_INT_ENA (BIT(17)) +#define HOST_FN1_SLC1_TX_OVF_INT_ENA_M (BIT(17)) +#define HOST_FN1_SLC1_TX_OVF_INT_ENA_V 0x1 +#define HOST_FN1_SLC1_TX_OVF_INT_ENA_S 17 +/* HOST_FN1_SLC1_RX_UDF_INT_ENA : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC1_RX_UDF_INT_ENA (BIT(16)) +#define HOST_FN1_SLC1_RX_UDF_INT_ENA_M (BIT(16)) +#define HOST_FN1_SLC1_RX_UDF_INT_ENA_V 0x1 +#define HOST_FN1_SLC1_RX_UDF_INT_ENA_S 16 +/* HOST_FN1_SLC1HOST_TX_START_INT_ENA : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC1HOST_TX_START_INT_ENA (BIT(15)) +#define HOST_FN1_SLC1HOST_TX_START_INT_ENA_M (BIT(15)) +#define HOST_FN1_SLC1HOST_TX_START_INT_ENA_V 0x1 +#define HOST_FN1_SLC1HOST_TX_START_INT_ENA_S 15 +/* HOST_FN1_SLC1HOST_RX_START_INT_ENA : R/W ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC1HOST_RX_START_INT_ENA (BIT(14)) +#define HOST_FN1_SLC1HOST_RX_START_INT_ENA_M (BIT(14)) +#define HOST_FN1_SLC1HOST_RX_START_INT_ENA_V 0x1 +#define HOST_FN1_SLC1HOST_RX_START_INT_ENA_S 14 +/* HOST_FN1_SLC1HOST_RX_EOF_INT_ENA : R/W ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC1HOST_RX_EOF_INT_ENA (BIT(13)) +#define HOST_FN1_SLC1HOST_RX_EOF_INT_ENA_M (BIT(13)) +#define HOST_FN1_SLC1HOST_RX_EOF_INT_ENA_V 0x1 +#define HOST_FN1_SLC1HOST_RX_EOF_INT_ENA_S 13 +/* HOST_FN1_SLC1HOST_RX_SOF_INT_ENA : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC1HOST_RX_SOF_INT_ENA (BIT(12)) +#define HOST_FN1_SLC1HOST_RX_SOF_INT_ENA_M (BIT(12)) +#define HOST_FN1_SLC1HOST_RX_SOF_INT_ENA_V 0x1 +#define HOST_FN1_SLC1HOST_RX_SOF_INT_ENA_S 12 +/* HOST_FN1_SLC1_TOKEN1_0TO1_INT_ENA : R/W ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC1_TOKEN1_0TO1_INT_ENA (BIT(11)) +#define HOST_FN1_SLC1_TOKEN1_0TO1_INT_ENA_M (BIT(11)) +#define HOST_FN1_SLC1_TOKEN1_0TO1_INT_ENA_V 0x1 +#define HOST_FN1_SLC1_TOKEN1_0TO1_INT_ENA_S 11 +/* HOST_FN1_SLC1_TOKEN0_0TO1_INT_ENA : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC1_TOKEN0_0TO1_INT_ENA (BIT(10)) +#define HOST_FN1_SLC1_TOKEN0_0TO1_INT_ENA_M (BIT(10)) +#define HOST_FN1_SLC1_TOKEN0_0TO1_INT_ENA_V 0x1 +#define HOST_FN1_SLC1_TOKEN0_0TO1_INT_ENA_S 10 +/* HOST_FN1_SLC1_TOKEN1_1TO0_INT_ENA : R/W ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC1_TOKEN1_1TO0_INT_ENA (BIT(9)) +#define HOST_FN1_SLC1_TOKEN1_1TO0_INT_ENA_M (BIT(9)) +#define HOST_FN1_SLC1_TOKEN1_1TO0_INT_ENA_V 0x1 +#define HOST_FN1_SLC1_TOKEN1_1TO0_INT_ENA_S 9 +/* HOST_FN1_SLC1_TOKEN0_1TO0_INT_ENA : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC1_TOKEN0_1TO0_INT_ENA (BIT(8)) +#define HOST_FN1_SLC1_TOKEN0_1TO0_INT_ENA_M (BIT(8)) +#define HOST_FN1_SLC1_TOKEN0_1TO0_INT_ENA_V 0x1 +#define HOST_FN1_SLC1_TOKEN0_1TO0_INT_ENA_S 8 +/* HOST_FN1_SLC1_TOHOST_BIT7_INT_ENA : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC1_TOHOST_BIT7_INT_ENA (BIT(7)) +#define HOST_FN1_SLC1_TOHOST_BIT7_INT_ENA_M (BIT(7)) +#define HOST_FN1_SLC1_TOHOST_BIT7_INT_ENA_V 0x1 +#define HOST_FN1_SLC1_TOHOST_BIT7_INT_ENA_S 7 +/* HOST_FN1_SLC1_TOHOST_BIT6_INT_ENA : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC1_TOHOST_BIT6_INT_ENA (BIT(6)) +#define HOST_FN1_SLC1_TOHOST_BIT6_INT_ENA_M (BIT(6)) +#define HOST_FN1_SLC1_TOHOST_BIT6_INT_ENA_V 0x1 +#define HOST_FN1_SLC1_TOHOST_BIT6_INT_ENA_S 6 +/* HOST_FN1_SLC1_TOHOST_BIT5_INT_ENA : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC1_TOHOST_BIT5_INT_ENA (BIT(5)) +#define HOST_FN1_SLC1_TOHOST_BIT5_INT_ENA_M (BIT(5)) +#define HOST_FN1_SLC1_TOHOST_BIT5_INT_ENA_V 0x1 +#define HOST_FN1_SLC1_TOHOST_BIT5_INT_ENA_S 5 +/* HOST_FN1_SLC1_TOHOST_BIT4_INT_ENA : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC1_TOHOST_BIT4_INT_ENA (BIT(4)) +#define HOST_FN1_SLC1_TOHOST_BIT4_INT_ENA_M (BIT(4)) +#define HOST_FN1_SLC1_TOHOST_BIT4_INT_ENA_V 0x1 +#define HOST_FN1_SLC1_TOHOST_BIT4_INT_ENA_S 4 +/* HOST_FN1_SLC1_TOHOST_BIT3_INT_ENA : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC1_TOHOST_BIT3_INT_ENA (BIT(3)) +#define HOST_FN1_SLC1_TOHOST_BIT3_INT_ENA_M (BIT(3)) +#define HOST_FN1_SLC1_TOHOST_BIT3_INT_ENA_V 0x1 +#define HOST_FN1_SLC1_TOHOST_BIT3_INT_ENA_S 3 +/* HOST_FN1_SLC1_TOHOST_BIT2_INT_ENA : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC1_TOHOST_BIT2_INT_ENA (BIT(2)) +#define HOST_FN1_SLC1_TOHOST_BIT2_INT_ENA_M (BIT(2)) +#define HOST_FN1_SLC1_TOHOST_BIT2_INT_ENA_V 0x1 +#define HOST_FN1_SLC1_TOHOST_BIT2_INT_ENA_S 2 +/* HOST_FN1_SLC1_TOHOST_BIT1_INT_ENA : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC1_TOHOST_BIT1_INT_ENA (BIT(1)) +#define HOST_FN1_SLC1_TOHOST_BIT1_INT_ENA_M (BIT(1)) +#define HOST_FN1_SLC1_TOHOST_BIT1_INT_ENA_V 0x1 +#define HOST_FN1_SLC1_TOHOST_BIT1_INT_ENA_S 1 +/* HOST_FN1_SLC1_TOHOST_BIT0_INT_ENA : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN1_SLC1_TOHOST_BIT0_INT_ENA (BIT(0)) +#define HOST_FN1_SLC1_TOHOST_BIT0_INT_ENA_M (BIT(0)) +#define HOST_FN1_SLC1_TOHOST_BIT0_INT_ENA_V 0x1 +#define HOST_FN1_SLC1_TOHOST_BIT0_INT_ENA_S 0 + +#define HOST_SLC0HOST_FUNC2_INT_ENA_REG (DR_REG_SLCHOST_BASE + 0xE4) +/* HOST_FN2_GPIO_SDIO_INT_ENA : R/W ;bitpos:[25] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_GPIO_SDIO_INT_ENA (BIT(25)) +#define HOST_FN2_GPIO_SDIO_INT_ENA_M (BIT(25)) +#define HOST_FN2_GPIO_SDIO_INT_ENA_V 0x1 +#define HOST_FN2_GPIO_SDIO_INT_ENA_S 25 +/* HOST_FN2_SLC0_HOST_RD_RETRY_INT_ENA : R/W ;bitpos:[24] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC0_HOST_RD_RETRY_INT_ENA (BIT(24)) +#define HOST_FN2_SLC0_HOST_RD_RETRY_INT_ENA_M (BIT(24)) +#define HOST_FN2_SLC0_HOST_RD_RETRY_INT_ENA_V 0x1 +#define HOST_FN2_SLC0_HOST_RD_RETRY_INT_ENA_S 24 +/* HOST_FN2_SLC0_RX_NEW_PACKET_INT_ENA : R/W ;bitpos:[23] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC0_RX_NEW_PACKET_INT_ENA (BIT(23)) +#define HOST_FN2_SLC0_RX_NEW_PACKET_INT_ENA_M (BIT(23)) +#define HOST_FN2_SLC0_RX_NEW_PACKET_INT_ENA_V 0x1 +#define HOST_FN2_SLC0_RX_NEW_PACKET_INT_ENA_S 23 +/* HOST_FN2_SLC0_EXT_BIT3_INT_ENA : R/W ;bitpos:[22] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC0_EXT_BIT3_INT_ENA (BIT(22)) +#define HOST_FN2_SLC0_EXT_BIT3_INT_ENA_M (BIT(22)) +#define HOST_FN2_SLC0_EXT_BIT3_INT_ENA_V 0x1 +#define HOST_FN2_SLC0_EXT_BIT3_INT_ENA_S 22 +/* HOST_FN2_SLC0_EXT_BIT2_INT_ENA : R/W ;bitpos:[21] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC0_EXT_BIT2_INT_ENA (BIT(21)) +#define HOST_FN2_SLC0_EXT_BIT2_INT_ENA_M (BIT(21)) +#define HOST_FN2_SLC0_EXT_BIT2_INT_ENA_V 0x1 +#define HOST_FN2_SLC0_EXT_BIT2_INT_ENA_S 21 +/* HOST_FN2_SLC0_EXT_BIT1_INT_ENA : R/W ;bitpos:[20] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC0_EXT_BIT1_INT_ENA (BIT(20)) +#define HOST_FN2_SLC0_EXT_BIT1_INT_ENA_M (BIT(20)) +#define HOST_FN2_SLC0_EXT_BIT1_INT_ENA_V 0x1 +#define HOST_FN2_SLC0_EXT_BIT1_INT_ENA_S 20 +/* HOST_FN2_SLC0_EXT_BIT0_INT_ENA : R/W ;bitpos:[19] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC0_EXT_BIT0_INT_ENA (BIT(19)) +#define HOST_FN2_SLC0_EXT_BIT0_INT_ENA_M (BIT(19)) +#define HOST_FN2_SLC0_EXT_BIT0_INT_ENA_V 0x1 +#define HOST_FN2_SLC0_EXT_BIT0_INT_ENA_S 19 +/* HOST_FN2_SLC0_RX_PF_VALID_INT_ENA : R/W ;bitpos:[18] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC0_RX_PF_VALID_INT_ENA (BIT(18)) +#define HOST_FN2_SLC0_RX_PF_VALID_INT_ENA_M (BIT(18)) +#define HOST_FN2_SLC0_RX_PF_VALID_INT_ENA_V 0x1 +#define HOST_FN2_SLC0_RX_PF_VALID_INT_ENA_S 18 +/* HOST_FN2_SLC0_TX_OVF_INT_ENA : R/W ;bitpos:[17] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC0_TX_OVF_INT_ENA (BIT(17)) +#define HOST_FN2_SLC0_TX_OVF_INT_ENA_M (BIT(17)) +#define HOST_FN2_SLC0_TX_OVF_INT_ENA_V 0x1 +#define HOST_FN2_SLC0_TX_OVF_INT_ENA_S 17 +/* HOST_FN2_SLC0_RX_UDF_INT_ENA : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC0_RX_UDF_INT_ENA (BIT(16)) +#define HOST_FN2_SLC0_RX_UDF_INT_ENA_M (BIT(16)) +#define HOST_FN2_SLC0_RX_UDF_INT_ENA_V 0x1 +#define HOST_FN2_SLC0_RX_UDF_INT_ENA_S 16 +/* HOST_FN2_SLC0HOST_TX_START_INT_ENA : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC0HOST_TX_START_INT_ENA (BIT(15)) +#define HOST_FN2_SLC0HOST_TX_START_INT_ENA_M (BIT(15)) +#define HOST_FN2_SLC0HOST_TX_START_INT_ENA_V 0x1 +#define HOST_FN2_SLC0HOST_TX_START_INT_ENA_S 15 +/* HOST_FN2_SLC0HOST_RX_START_INT_ENA : R/W ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC0HOST_RX_START_INT_ENA (BIT(14)) +#define HOST_FN2_SLC0HOST_RX_START_INT_ENA_M (BIT(14)) +#define HOST_FN2_SLC0HOST_RX_START_INT_ENA_V 0x1 +#define HOST_FN2_SLC0HOST_RX_START_INT_ENA_S 14 +/* HOST_FN2_SLC0HOST_RX_EOF_INT_ENA : R/W ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC0HOST_RX_EOF_INT_ENA (BIT(13)) +#define HOST_FN2_SLC0HOST_RX_EOF_INT_ENA_M (BIT(13)) +#define HOST_FN2_SLC0HOST_RX_EOF_INT_ENA_V 0x1 +#define HOST_FN2_SLC0HOST_RX_EOF_INT_ENA_S 13 +/* HOST_FN2_SLC0HOST_RX_SOF_INT_ENA : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC0HOST_RX_SOF_INT_ENA (BIT(12)) +#define HOST_FN2_SLC0HOST_RX_SOF_INT_ENA_M (BIT(12)) +#define HOST_FN2_SLC0HOST_RX_SOF_INT_ENA_V 0x1 +#define HOST_FN2_SLC0HOST_RX_SOF_INT_ENA_S 12 +/* HOST_FN2_SLC0_TOKEN1_0TO1_INT_ENA : R/W ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC0_TOKEN1_0TO1_INT_ENA (BIT(11)) +#define HOST_FN2_SLC0_TOKEN1_0TO1_INT_ENA_M (BIT(11)) +#define HOST_FN2_SLC0_TOKEN1_0TO1_INT_ENA_V 0x1 +#define HOST_FN2_SLC0_TOKEN1_0TO1_INT_ENA_S 11 +/* HOST_FN2_SLC0_TOKEN0_0TO1_INT_ENA : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC0_TOKEN0_0TO1_INT_ENA (BIT(10)) +#define HOST_FN2_SLC0_TOKEN0_0TO1_INT_ENA_M (BIT(10)) +#define HOST_FN2_SLC0_TOKEN0_0TO1_INT_ENA_V 0x1 +#define HOST_FN2_SLC0_TOKEN0_0TO1_INT_ENA_S 10 +/* HOST_FN2_SLC0_TOKEN1_1TO0_INT_ENA : R/W ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC0_TOKEN1_1TO0_INT_ENA (BIT(9)) +#define HOST_FN2_SLC0_TOKEN1_1TO0_INT_ENA_M (BIT(9)) +#define HOST_FN2_SLC0_TOKEN1_1TO0_INT_ENA_V 0x1 +#define HOST_FN2_SLC0_TOKEN1_1TO0_INT_ENA_S 9 +/* HOST_FN2_SLC0_TOKEN0_1TO0_INT_ENA : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC0_TOKEN0_1TO0_INT_ENA (BIT(8)) +#define HOST_FN2_SLC0_TOKEN0_1TO0_INT_ENA_M (BIT(8)) +#define HOST_FN2_SLC0_TOKEN0_1TO0_INT_ENA_V 0x1 +#define HOST_FN2_SLC0_TOKEN0_1TO0_INT_ENA_S 8 +/* HOST_FN2_SLC0_TOHOST_BIT7_INT_ENA : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC0_TOHOST_BIT7_INT_ENA (BIT(7)) +#define HOST_FN2_SLC0_TOHOST_BIT7_INT_ENA_M (BIT(7)) +#define HOST_FN2_SLC0_TOHOST_BIT7_INT_ENA_V 0x1 +#define HOST_FN2_SLC0_TOHOST_BIT7_INT_ENA_S 7 +/* HOST_FN2_SLC0_TOHOST_BIT6_INT_ENA : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC0_TOHOST_BIT6_INT_ENA (BIT(6)) +#define HOST_FN2_SLC0_TOHOST_BIT6_INT_ENA_M (BIT(6)) +#define HOST_FN2_SLC0_TOHOST_BIT6_INT_ENA_V 0x1 +#define HOST_FN2_SLC0_TOHOST_BIT6_INT_ENA_S 6 +/* HOST_FN2_SLC0_TOHOST_BIT5_INT_ENA : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC0_TOHOST_BIT5_INT_ENA (BIT(5)) +#define HOST_FN2_SLC0_TOHOST_BIT5_INT_ENA_M (BIT(5)) +#define HOST_FN2_SLC0_TOHOST_BIT5_INT_ENA_V 0x1 +#define HOST_FN2_SLC0_TOHOST_BIT5_INT_ENA_S 5 +/* HOST_FN2_SLC0_TOHOST_BIT4_INT_ENA : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC0_TOHOST_BIT4_INT_ENA (BIT(4)) +#define HOST_FN2_SLC0_TOHOST_BIT4_INT_ENA_M (BIT(4)) +#define HOST_FN2_SLC0_TOHOST_BIT4_INT_ENA_V 0x1 +#define HOST_FN2_SLC0_TOHOST_BIT4_INT_ENA_S 4 +/* HOST_FN2_SLC0_TOHOST_BIT3_INT_ENA : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC0_TOHOST_BIT3_INT_ENA (BIT(3)) +#define HOST_FN2_SLC0_TOHOST_BIT3_INT_ENA_M (BIT(3)) +#define HOST_FN2_SLC0_TOHOST_BIT3_INT_ENA_V 0x1 +#define HOST_FN2_SLC0_TOHOST_BIT3_INT_ENA_S 3 +/* HOST_FN2_SLC0_TOHOST_BIT2_INT_ENA : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC0_TOHOST_BIT2_INT_ENA (BIT(2)) +#define HOST_FN2_SLC0_TOHOST_BIT2_INT_ENA_M (BIT(2)) +#define HOST_FN2_SLC0_TOHOST_BIT2_INT_ENA_V 0x1 +#define HOST_FN2_SLC0_TOHOST_BIT2_INT_ENA_S 2 +/* HOST_FN2_SLC0_TOHOST_BIT1_INT_ENA : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC0_TOHOST_BIT1_INT_ENA (BIT(1)) +#define HOST_FN2_SLC0_TOHOST_BIT1_INT_ENA_M (BIT(1)) +#define HOST_FN2_SLC0_TOHOST_BIT1_INT_ENA_V 0x1 +#define HOST_FN2_SLC0_TOHOST_BIT1_INT_ENA_S 1 +/* HOST_FN2_SLC0_TOHOST_BIT0_INT_ENA : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC0_TOHOST_BIT0_INT_ENA (BIT(0)) +#define HOST_FN2_SLC0_TOHOST_BIT0_INT_ENA_M (BIT(0)) +#define HOST_FN2_SLC0_TOHOST_BIT0_INT_ENA_V 0x1 +#define HOST_FN2_SLC0_TOHOST_BIT0_INT_ENA_S 0 + +#define HOST_SLC1HOST_FUNC2_INT_ENA_REG (DR_REG_SLCHOST_BASE + 0xE8) +/* HOST_FN2_SLC1_BT_RX_NEW_PACKET_INT_ENA : R/W ;bitpos:[25] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC1_BT_RX_NEW_PACKET_INT_ENA (BIT(25)) +#define HOST_FN2_SLC1_BT_RX_NEW_PACKET_INT_ENA_M (BIT(25)) +#define HOST_FN2_SLC1_BT_RX_NEW_PACKET_INT_ENA_V 0x1 +#define HOST_FN2_SLC1_BT_RX_NEW_PACKET_INT_ENA_S 25 +/* HOST_FN2_SLC1_HOST_RD_RETRY_INT_ENA : R/W ;bitpos:[24] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC1_HOST_RD_RETRY_INT_ENA (BIT(24)) +#define HOST_FN2_SLC1_HOST_RD_RETRY_INT_ENA_M (BIT(24)) +#define HOST_FN2_SLC1_HOST_RD_RETRY_INT_ENA_V 0x1 +#define HOST_FN2_SLC1_HOST_RD_RETRY_INT_ENA_S 24 +/* HOST_FN2_SLC1_WIFI_RX_NEW_PACKET_INT_ENA : R/W ;bitpos:[23] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC1_WIFI_RX_NEW_PACKET_INT_ENA (BIT(23)) +#define HOST_FN2_SLC1_WIFI_RX_NEW_PACKET_INT_ENA_M (BIT(23)) +#define HOST_FN2_SLC1_WIFI_RX_NEW_PACKET_INT_ENA_V 0x1 +#define HOST_FN2_SLC1_WIFI_RX_NEW_PACKET_INT_ENA_S 23 +/* HOST_FN2_SLC1_EXT_BIT3_INT_ENA : R/W ;bitpos:[22] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC1_EXT_BIT3_INT_ENA (BIT(22)) +#define HOST_FN2_SLC1_EXT_BIT3_INT_ENA_M (BIT(22)) +#define HOST_FN2_SLC1_EXT_BIT3_INT_ENA_V 0x1 +#define HOST_FN2_SLC1_EXT_BIT3_INT_ENA_S 22 +/* HOST_FN2_SLC1_EXT_BIT2_INT_ENA : R/W ;bitpos:[21] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC1_EXT_BIT2_INT_ENA (BIT(21)) +#define HOST_FN2_SLC1_EXT_BIT2_INT_ENA_M (BIT(21)) +#define HOST_FN2_SLC1_EXT_BIT2_INT_ENA_V 0x1 +#define HOST_FN2_SLC1_EXT_BIT2_INT_ENA_S 21 +/* HOST_FN2_SLC1_EXT_BIT1_INT_ENA : R/W ;bitpos:[20] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC1_EXT_BIT1_INT_ENA (BIT(20)) +#define HOST_FN2_SLC1_EXT_BIT1_INT_ENA_M (BIT(20)) +#define HOST_FN2_SLC1_EXT_BIT1_INT_ENA_V 0x1 +#define HOST_FN2_SLC1_EXT_BIT1_INT_ENA_S 20 +/* HOST_FN2_SLC1_EXT_BIT0_INT_ENA : R/W ;bitpos:[19] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC1_EXT_BIT0_INT_ENA (BIT(19)) +#define HOST_FN2_SLC1_EXT_BIT0_INT_ENA_M (BIT(19)) +#define HOST_FN2_SLC1_EXT_BIT0_INT_ENA_V 0x1 +#define HOST_FN2_SLC1_EXT_BIT0_INT_ENA_S 19 +/* HOST_FN2_SLC1_RX_PF_VALID_INT_ENA : R/W ;bitpos:[18] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC1_RX_PF_VALID_INT_ENA (BIT(18)) +#define HOST_FN2_SLC1_RX_PF_VALID_INT_ENA_M (BIT(18)) +#define HOST_FN2_SLC1_RX_PF_VALID_INT_ENA_V 0x1 +#define HOST_FN2_SLC1_RX_PF_VALID_INT_ENA_S 18 +/* HOST_FN2_SLC1_TX_OVF_INT_ENA : R/W ;bitpos:[17] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC1_TX_OVF_INT_ENA (BIT(17)) +#define HOST_FN2_SLC1_TX_OVF_INT_ENA_M (BIT(17)) +#define HOST_FN2_SLC1_TX_OVF_INT_ENA_V 0x1 +#define HOST_FN2_SLC1_TX_OVF_INT_ENA_S 17 +/* HOST_FN2_SLC1_RX_UDF_INT_ENA : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC1_RX_UDF_INT_ENA (BIT(16)) +#define HOST_FN2_SLC1_RX_UDF_INT_ENA_M (BIT(16)) +#define HOST_FN2_SLC1_RX_UDF_INT_ENA_V 0x1 +#define HOST_FN2_SLC1_RX_UDF_INT_ENA_S 16 +/* HOST_FN2_SLC1HOST_TX_START_INT_ENA : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC1HOST_TX_START_INT_ENA (BIT(15)) +#define HOST_FN2_SLC1HOST_TX_START_INT_ENA_M (BIT(15)) +#define HOST_FN2_SLC1HOST_TX_START_INT_ENA_V 0x1 +#define HOST_FN2_SLC1HOST_TX_START_INT_ENA_S 15 +/* HOST_FN2_SLC1HOST_RX_START_INT_ENA : R/W ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC1HOST_RX_START_INT_ENA (BIT(14)) +#define HOST_FN2_SLC1HOST_RX_START_INT_ENA_M (BIT(14)) +#define HOST_FN2_SLC1HOST_RX_START_INT_ENA_V 0x1 +#define HOST_FN2_SLC1HOST_RX_START_INT_ENA_S 14 +/* HOST_FN2_SLC1HOST_RX_EOF_INT_ENA : R/W ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC1HOST_RX_EOF_INT_ENA (BIT(13)) +#define HOST_FN2_SLC1HOST_RX_EOF_INT_ENA_M (BIT(13)) +#define HOST_FN2_SLC1HOST_RX_EOF_INT_ENA_V 0x1 +#define HOST_FN2_SLC1HOST_RX_EOF_INT_ENA_S 13 +/* HOST_FN2_SLC1HOST_RX_SOF_INT_ENA : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC1HOST_RX_SOF_INT_ENA (BIT(12)) +#define HOST_FN2_SLC1HOST_RX_SOF_INT_ENA_M (BIT(12)) +#define HOST_FN2_SLC1HOST_RX_SOF_INT_ENA_V 0x1 +#define HOST_FN2_SLC1HOST_RX_SOF_INT_ENA_S 12 +/* HOST_FN2_SLC1_TOKEN1_0TO1_INT_ENA : R/W ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC1_TOKEN1_0TO1_INT_ENA (BIT(11)) +#define HOST_FN2_SLC1_TOKEN1_0TO1_INT_ENA_M (BIT(11)) +#define HOST_FN2_SLC1_TOKEN1_0TO1_INT_ENA_V 0x1 +#define HOST_FN2_SLC1_TOKEN1_0TO1_INT_ENA_S 11 +/* HOST_FN2_SLC1_TOKEN0_0TO1_INT_ENA : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC1_TOKEN0_0TO1_INT_ENA (BIT(10)) +#define HOST_FN2_SLC1_TOKEN0_0TO1_INT_ENA_M (BIT(10)) +#define HOST_FN2_SLC1_TOKEN0_0TO1_INT_ENA_V 0x1 +#define HOST_FN2_SLC1_TOKEN0_0TO1_INT_ENA_S 10 +/* HOST_FN2_SLC1_TOKEN1_1TO0_INT_ENA : R/W ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC1_TOKEN1_1TO0_INT_ENA (BIT(9)) +#define HOST_FN2_SLC1_TOKEN1_1TO0_INT_ENA_M (BIT(9)) +#define HOST_FN2_SLC1_TOKEN1_1TO0_INT_ENA_V 0x1 +#define HOST_FN2_SLC1_TOKEN1_1TO0_INT_ENA_S 9 +/* HOST_FN2_SLC1_TOKEN0_1TO0_INT_ENA : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC1_TOKEN0_1TO0_INT_ENA (BIT(8)) +#define HOST_FN2_SLC1_TOKEN0_1TO0_INT_ENA_M (BIT(8)) +#define HOST_FN2_SLC1_TOKEN0_1TO0_INT_ENA_V 0x1 +#define HOST_FN2_SLC1_TOKEN0_1TO0_INT_ENA_S 8 +/* HOST_FN2_SLC1_TOHOST_BIT7_INT_ENA : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC1_TOHOST_BIT7_INT_ENA (BIT(7)) +#define HOST_FN2_SLC1_TOHOST_BIT7_INT_ENA_M (BIT(7)) +#define HOST_FN2_SLC1_TOHOST_BIT7_INT_ENA_V 0x1 +#define HOST_FN2_SLC1_TOHOST_BIT7_INT_ENA_S 7 +/* HOST_FN2_SLC1_TOHOST_BIT6_INT_ENA : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC1_TOHOST_BIT6_INT_ENA (BIT(6)) +#define HOST_FN2_SLC1_TOHOST_BIT6_INT_ENA_M (BIT(6)) +#define HOST_FN2_SLC1_TOHOST_BIT6_INT_ENA_V 0x1 +#define HOST_FN2_SLC1_TOHOST_BIT6_INT_ENA_S 6 +/* HOST_FN2_SLC1_TOHOST_BIT5_INT_ENA : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC1_TOHOST_BIT5_INT_ENA (BIT(5)) +#define HOST_FN2_SLC1_TOHOST_BIT5_INT_ENA_M (BIT(5)) +#define HOST_FN2_SLC1_TOHOST_BIT5_INT_ENA_V 0x1 +#define HOST_FN2_SLC1_TOHOST_BIT5_INT_ENA_S 5 +/* HOST_FN2_SLC1_TOHOST_BIT4_INT_ENA : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC1_TOHOST_BIT4_INT_ENA (BIT(4)) +#define HOST_FN2_SLC1_TOHOST_BIT4_INT_ENA_M (BIT(4)) +#define HOST_FN2_SLC1_TOHOST_BIT4_INT_ENA_V 0x1 +#define HOST_FN2_SLC1_TOHOST_BIT4_INT_ENA_S 4 +/* HOST_FN2_SLC1_TOHOST_BIT3_INT_ENA : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC1_TOHOST_BIT3_INT_ENA (BIT(3)) +#define HOST_FN2_SLC1_TOHOST_BIT3_INT_ENA_M (BIT(3)) +#define HOST_FN2_SLC1_TOHOST_BIT3_INT_ENA_V 0x1 +#define HOST_FN2_SLC1_TOHOST_BIT3_INT_ENA_S 3 +/* HOST_FN2_SLC1_TOHOST_BIT2_INT_ENA : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC1_TOHOST_BIT2_INT_ENA (BIT(2)) +#define HOST_FN2_SLC1_TOHOST_BIT2_INT_ENA_M (BIT(2)) +#define HOST_FN2_SLC1_TOHOST_BIT2_INT_ENA_V 0x1 +#define HOST_FN2_SLC1_TOHOST_BIT2_INT_ENA_S 2 +/* HOST_FN2_SLC1_TOHOST_BIT1_INT_ENA : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC1_TOHOST_BIT1_INT_ENA (BIT(1)) +#define HOST_FN2_SLC1_TOHOST_BIT1_INT_ENA_M (BIT(1)) +#define HOST_FN2_SLC1_TOHOST_BIT1_INT_ENA_V 0x1 +#define HOST_FN2_SLC1_TOHOST_BIT1_INT_ENA_S 1 +/* HOST_FN2_SLC1_TOHOST_BIT0_INT_ENA : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define HOST_FN2_SLC1_TOHOST_BIT0_INT_ENA (BIT(0)) +#define HOST_FN2_SLC1_TOHOST_BIT0_INT_ENA_M (BIT(0)) +#define HOST_FN2_SLC1_TOHOST_BIT0_INT_ENA_V 0x1 +#define HOST_FN2_SLC1_TOHOST_BIT0_INT_ENA_S 0 + +#define HOST_SLC0HOST_INT_ENA_REG (DR_REG_SLCHOST_BASE + 0xEC) +/* HOST_GPIO_SDIO_INT_ENA : R/W ;bitpos:[25] ;default: 1'b0 ; */ +/*description: */ +#define HOST_GPIO_SDIO_INT_ENA (BIT(25)) +#define HOST_GPIO_SDIO_INT_ENA_M (BIT(25)) +#define HOST_GPIO_SDIO_INT_ENA_V 0x1 +#define HOST_GPIO_SDIO_INT_ENA_S 25 +/* HOST_SLC0_HOST_RD_RETRY_INT_ENA : R/W ;bitpos:[24] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_HOST_RD_RETRY_INT_ENA (BIT(24)) +#define HOST_SLC0_HOST_RD_RETRY_INT_ENA_M (BIT(24)) +#define HOST_SLC0_HOST_RD_RETRY_INT_ENA_V 0x1 +#define HOST_SLC0_HOST_RD_RETRY_INT_ENA_S 24 +/* HOST_SLC0_RX_NEW_PACKET_INT_ENA : R/W ;bitpos:[23] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_RX_NEW_PACKET_INT_ENA (BIT(23)) +#define HOST_SLC0_RX_NEW_PACKET_INT_ENA_M (BIT(23)) +#define HOST_SLC0_RX_NEW_PACKET_INT_ENA_V 0x1 +#define HOST_SLC0_RX_NEW_PACKET_INT_ENA_S 23 +/* HOST_SLC0_EXT_BIT3_INT_ENA : R/W ;bitpos:[22] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_EXT_BIT3_INT_ENA (BIT(22)) +#define HOST_SLC0_EXT_BIT3_INT_ENA_M (BIT(22)) +#define HOST_SLC0_EXT_BIT3_INT_ENA_V 0x1 +#define HOST_SLC0_EXT_BIT3_INT_ENA_S 22 +/* HOST_SLC0_EXT_BIT2_INT_ENA : R/W ;bitpos:[21] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_EXT_BIT2_INT_ENA (BIT(21)) +#define HOST_SLC0_EXT_BIT2_INT_ENA_M (BIT(21)) +#define HOST_SLC0_EXT_BIT2_INT_ENA_V 0x1 +#define HOST_SLC0_EXT_BIT2_INT_ENA_S 21 +/* HOST_SLC0_EXT_BIT1_INT_ENA : R/W ;bitpos:[20] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_EXT_BIT1_INT_ENA (BIT(20)) +#define HOST_SLC0_EXT_BIT1_INT_ENA_M (BIT(20)) +#define HOST_SLC0_EXT_BIT1_INT_ENA_V 0x1 +#define HOST_SLC0_EXT_BIT1_INT_ENA_S 20 +/* HOST_SLC0_EXT_BIT0_INT_ENA : R/W ;bitpos:[19] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_EXT_BIT0_INT_ENA (BIT(19)) +#define HOST_SLC0_EXT_BIT0_INT_ENA_M (BIT(19)) +#define HOST_SLC0_EXT_BIT0_INT_ENA_V 0x1 +#define HOST_SLC0_EXT_BIT0_INT_ENA_S 19 +/* HOST_SLC0_RX_PF_VALID_INT_ENA : R/W ;bitpos:[18] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_RX_PF_VALID_INT_ENA (BIT(18)) +#define HOST_SLC0_RX_PF_VALID_INT_ENA_M (BIT(18)) +#define HOST_SLC0_RX_PF_VALID_INT_ENA_V 0x1 +#define HOST_SLC0_RX_PF_VALID_INT_ENA_S 18 +/* HOST_SLC0_TX_OVF_INT_ENA : R/W ;bitpos:[17] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TX_OVF_INT_ENA (BIT(17)) +#define HOST_SLC0_TX_OVF_INT_ENA_M (BIT(17)) +#define HOST_SLC0_TX_OVF_INT_ENA_V 0x1 +#define HOST_SLC0_TX_OVF_INT_ENA_S 17 +/* HOST_SLC0_RX_UDF_INT_ENA : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_RX_UDF_INT_ENA (BIT(16)) +#define HOST_SLC0_RX_UDF_INT_ENA_M (BIT(16)) +#define HOST_SLC0_RX_UDF_INT_ENA_V 0x1 +#define HOST_SLC0_RX_UDF_INT_ENA_S 16 +/* HOST_SLC0HOST_TX_START_INT_ENA : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0HOST_TX_START_INT_ENA (BIT(15)) +#define HOST_SLC0HOST_TX_START_INT_ENA_M (BIT(15)) +#define HOST_SLC0HOST_TX_START_INT_ENA_V 0x1 +#define HOST_SLC0HOST_TX_START_INT_ENA_S 15 +/* HOST_SLC0HOST_RX_START_INT_ENA : R/W ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0HOST_RX_START_INT_ENA (BIT(14)) +#define HOST_SLC0HOST_RX_START_INT_ENA_M (BIT(14)) +#define HOST_SLC0HOST_RX_START_INT_ENA_V 0x1 +#define HOST_SLC0HOST_RX_START_INT_ENA_S 14 +/* HOST_SLC0HOST_RX_EOF_INT_ENA : R/W ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0HOST_RX_EOF_INT_ENA (BIT(13)) +#define HOST_SLC0HOST_RX_EOF_INT_ENA_M (BIT(13)) +#define HOST_SLC0HOST_RX_EOF_INT_ENA_V 0x1 +#define HOST_SLC0HOST_RX_EOF_INT_ENA_S 13 +/* HOST_SLC0HOST_RX_SOF_INT_ENA : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0HOST_RX_SOF_INT_ENA (BIT(12)) +#define HOST_SLC0HOST_RX_SOF_INT_ENA_M (BIT(12)) +#define HOST_SLC0HOST_RX_SOF_INT_ENA_V 0x1 +#define HOST_SLC0HOST_RX_SOF_INT_ENA_S 12 +/* HOST_SLC0_TOKEN1_0TO1_INT_ENA : R/W ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOKEN1_0TO1_INT_ENA (BIT(11)) +#define HOST_SLC0_TOKEN1_0TO1_INT_ENA_M (BIT(11)) +#define HOST_SLC0_TOKEN1_0TO1_INT_ENA_V 0x1 +#define HOST_SLC0_TOKEN1_0TO1_INT_ENA_S 11 +/* HOST_SLC0_TOKEN0_0TO1_INT_ENA : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOKEN0_0TO1_INT_ENA (BIT(10)) +#define HOST_SLC0_TOKEN0_0TO1_INT_ENA_M (BIT(10)) +#define HOST_SLC0_TOKEN0_0TO1_INT_ENA_V 0x1 +#define HOST_SLC0_TOKEN0_0TO1_INT_ENA_S 10 +/* HOST_SLC0_TOKEN1_1TO0_INT_ENA : R/W ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOKEN1_1TO0_INT_ENA (BIT(9)) +#define HOST_SLC0_TOKEN1_1TO0_INT_ENA_M (BIT(9)) +#define HOST_SLC0_TOKEN1_1TO0_INT_ENA_V 0x1 +#define HOST_SLC0_TOKEN1_1TO0_INT_ENA_S 9 +/* HOST_SLC0_TOKEN0_1TO0_INT_ENA : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOKEN0_1TO0_INT_ENA (BIT(8)) +#define HOST_SLC0_TOKEN0_1TO0_INT_ENA_M (BIT(8)) +#define HOST_SLC0_TOKEN0_1TO0_INT_ENA_V 0x1 +#define HOST_SLC0_TOKEN0_1TO0_INT_ENA_S 8 +/* HOST_SLC0_TOHOST_BIT7_INT_ENA : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT7_INT_ENA (BIT(7)) +#define HOST_SLC0_TOHOST_BIT7_INT_ENA_M (BIT(7)) +#define HOST_SLC0_TOHOST_BIT7_INT_ENA_V 0x1 +#define HOST_SLC0_TOHOST_BIT7_INT_ENA_S 7 +/* HOST_SLC0_TOHOST_BIT6_INT_ENA : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT6_INT_ENA (BIT(6)) +#define HOST_SLC0_TOHOST_BIT6_INT_ENA_M (BIT(6)) +#define HOST_SLC0_TOHOST_BIT6_INT_ENA_V 0x1 +#define HOST_SLC0_TOHOST_BIT6_INT_ENA_S 6 +/* HOST_SLC0_TOHOST_BIT5_INT_ENA : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT5_INT_ENA (BIT(5)) +#define HOST_SLC0_TOHOST_BIT5_INT_ENA_M (BIT(5)) +#define HOST_SLC0_TOHOST_BIT5_INT_ENA_V 0x1 +#define HOST_SLC0_TOHOST_BIT5_INT_ENA_S 5 +/* HOST_SLC0_TOHOST_BIT4_INT_ENA : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT4_INT_ENA (BIT(4)) +#define HOST_SLC0_TOHOST_BIT4_INT_ENA_M (BIT(4)) +#define HOST_SLC0_TOHOST_BIT4_INT_ENA_V 0x1 +#define HOST_SLC0_TOHOST_BIT4_INT_ENA_S 4 +/* HOST_SLC0_TOHOST_BIT3_INT_ENA : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT3_INT_ENA (BIT(3)) +#define HOST_SLC0_TOHOST_BIT3_INT_ENA_M (BIT(3)) +#define HOST_SLC0_TOHOST_BIT3_INT_ENA_V 0x1 +#define HOST_SLC0_TOHOST_BIT3_INT_ENA_S 3 +/* HOST_SLC0_TOHOST_BIT2_INT_ENA : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT2_INT_ENA (BIT(2)) +#define HOST_SLC0_TOHOST_BIT2_INT_ENA_M (BIT(2)) +#define HOST_SLC0_TOHOST_BIT2_INT_ENA_V 0x1 +#define HOST_SLC0_TOHOST_BIT2_INT_ENA_S 2 +/* HOST_SLC0_TOHOST_BIT1_INT_ENA : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT1_INT_ENA (BIT(1)) +#define HOST_SLC0_TOHOST_BIT1_INT_ENA_M (BIT(1)) +#define HOST_SLC0_TOHOST_BIT1_INT_ENA_V 0x1 +#define HOST_SLC0_TOHOST_BIT1_INT_ENA_S 1 +/* HOST_SLC0_TOHOST_BIT0_INT_ENA : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT0_INT_ENA (BIT(0)) +#define HOST_SLC0_TOHOST_BIT0_INT_ENA_M (BIT(0)) +#define HOST_SLC0_TOHOST_BIT0_INT_ENA_V 0x1 +#define HOST_SLC0_TOHOST_BIT0_INT_ENA_S 0 + +#define HOST_SLC1HOST_INT_ENA_REG (DR_REG_SLCHOST_BASE + 0xF0) +/* HOST_SLC1_BT_RX_NEW_PACKET_INT_ENA : R/W ;bitpos:[25] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_BT_RX_NEW_PACKET_INT_ENA (BIT(25)) +#define HOST_SLC1_BT_RX_NEW_PACKET_INT_ENA_M (BIT(25)) +#define HOST_SLC1_BT_RX_NEW_PACKET_INT_ENA_V 0x1 +#define HOST_SLC1_BT_RX_NEW_PACKET_INT_ENA_S 25 +/* HOST_SLC1_HOST_RD_RETRY_INT_ENA : R/W ;bitpos:[24] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_HOST_RD_RETRY_INT_ENA (BIT(24)) +#define HOST_SLC1_HOST_RD_RETRY_INT_ENA_M (BIT(24)) +#define HOST_SLC1_HOST_RD_RETRY_INT_ENA_V 0x1 +#define HOST_SLC1_HOST_RD_RETRY_INT_ENA_S 24 +/* HOST_SLC1_WIFI_RX_NEW_PACKET_INT_ENA : R/W ;bitpos:[23] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_WIFI_RX_NEW_PACKET_INT_ENA (BIT(23)) +#define HOST_SLC1_WIFI_RX_NEW_PACKET_INT_ENA_M (BIT(23)) +#define HOST_SLC1_WIFI_RX_NEW_PACKET_INT_ENA_V 0x1 +#define HOST_SLC1_WIFI_RX_NEW_PACKET_INT_ENA_S 23 +/* HOST_SLC1_EXT_BIT3_INT_ENA : R/W ;bitpos:[22] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_EXT_BIT3_INT_ENA (BIT(22)) +#define HOST_SLC1_EXT_BIT3_INT_ENA_M (BIT(22)) +#define HOST_SLC1_EXT_BIT3_INT_ENA_V 0x1 +#define HOST_SLC1_EXT_BIT3_INT_ENA_S 22 +/* HOST_SLC1_EXT_BIT2_INT_ENA : R/W ;bitpos:[21] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_EXT_BIT2_INT_ENA (BIT(21)) +#define HOST_SLC1_EXT_BIT2_INT_ENA_M (BIT(21)) +#define HOST_SLC1_EXT_BIT2_INT_ENA_V 0x1 +#define HOST_SLC1_EXT_BIT2_INT_ENA_S 21 +/* HOST_SLC1_EXT_BIT1_INT_ENA : R/W ;bitpos:[20] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_EXT_BIT1_INT_ENA (BIT(20)) +#define HOST_SLC1_EXT_BIT1_INT_ENA_M (BIT(20)) +#define HOST_SLC1_EXT_BIT1_INT_ENA_V 0x1 +#define HOST_SLC1_EXT_BIT1_INT_ENA_S 20 +/* HOST_SLC1_EXT_BIT0_INT_ENA : R/W ;bitpos:[19] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_EXT_BIT0_INT_ENA (BIT(19)) +#define HOST_SLC1_EXT_BIT0_INT_ENA_M (BIT(19)) +#define HOST_SLC1_EXT_BIT0_INT_ENA_V 0x1 +#define HOST_SLC1_EXT_BIT0_INT_ENA_S 19 +/* HOST_SLC1_RX_PF_VALID_INT_ENA : R/W ;bitpos:[18] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_RX_PF_VALID_INT_ENA (BIT(18)) +#define HOST_SLC1_RX_PF_VALID_INT_ENA_M (BIT(18)) +#define HOST_SLC1_RX_PF_VALID_INT_ENA_V 0x1 +#define HOST_SLC1_RX_PF_VALID_INT_ENA_S 18 +/* HOST_SLC1_TX_OVF_INT_ENA : R/W ;bitpos:[17] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TX_OVF_INT_ENA (BIT(17)) +#define HOST_SLC1_TX_OVF_INT_ENA_M (BIT(17)) +#define HOST_SLC1_TX_OVF_INT_ENA_V 0x1 +#define HOST_SLC1_TX_OVF_INT_ENA_S 17 +/* HOST_SLC1_RX_UDF_INT_ENA : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_RX_UDF_INT_ENA (BIT(16)) +#define HOST_SLC1_RX_UDF_INT_ENA_M (BIT(16)) +#define HOST_SLC1_RX_UDF_INT_ENA_V 0x1 +#define HOST_SLC1_RX_UDF_INT_ENA_S 16 +/* HOST_SLC1HOST_TX_START_INT_ENA : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1HOST_TX_START_INT_ENA (BIT(15)) +#define HOST_SLC1HOST_TX_START_INT_ENA_M (BIT(15)) +#define HOST_SLC1HOST_TX_START_INT_ENA_V 0x1 +#define HOST_SLC1HOST_TX_START_INT_ENA_S 15 +/* HOST_SLC1HOST_RX_START_INT_ENA : R/W ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1HOST_RX_START_INT_ENA (BIT(14)) +#define HOST_SLC1HOST_RX_START_INT_ENA_M (BIT(14)) +#define HOST_SLC1HOST_RX_START_INT_ENA_V 0x1 +#define HOST_SLC1HOST_RX_START_INT_ENA_S 14 +/* HOST_SLC1HOST_RX_EOF_INT_ENA : R/W ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1HOST_RX_EOF_INT_ENA (BIT(13)) +#define HOST_SLC1HOST_RX_EOF_INT_ENA_M (BIT(13)) +#define HOST_SLC1HOST_RX_EOF_INT_ENA_V 0x1 +#define HOST_SLC1HOST_RX_EOF_INT_ENA_S 13 +/* HOST_SLC1HOST_RX_SOF_INT_ENA : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1HOST_RX_SOF_INT_ENA (BIT(12)) +#define HOST_SLC1HOST_RX_SOF_INT_ENA_M (BIT(12)) +#define HOST_SLC1HOST_RX_SOF_INT_ENA_V 0x1 +#define HOST_SLC1HOST_RX_SOF_INT_ENA_S 12 +/* HOST_SLC1_TOKEN1_0TO1_INT_ENA : R/W ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOKEN1_0TO1_INT_ENA (BIT(11)) +#define HOST_SLC1_TOKEN1_0TO1_INT_ENA_M (BIT(11)) +#define HOST_SLC1_TOKEN1_0TO1_INT_ENA_V 0x1 +#define HOST_SLC1_TOKEN1_0TO1_INT_ENA_S 11 +/* HOST_SLC1_TOKEN0_0TO1_INT_ENA : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOKEN0_0TO1_INT_ENA (BIT(10)) +#define HOST_SLC1_TOKEN0_0TO1_INT_ENA_M (BIT(10)) +#define HOST_SLC1_TOKEN0_0TO1_INT_ENA_V 0x1 +#define HOST_SLC1_TOKEN0_0TO1_INT_ENA_S 10 +/* HOST_SLC1_TOKEN1_1TO0_INT_ENA : R/W ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOKEN1_1TO0_INT_ENA (BIT(9)) +#define HOST_SLC1_TOKEN1_1TO0_INT_ENA_M (BIT(9)) +#define HOST_SLC1_TOKEN1_1TO0_INT_ENA_V 0x1 +#define HOST_SLC1_TOKEN1_1TO0_INT_ENA_S 9 +/* HOST_SLC1_TOKEN0_1TO0_INT_ENA : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOKEN0_1TO0_INT_ENA (BIT(8)) +#define HOST_SLC1_TOKEN0_1TO0_INT_ENA_M (BIT(8)) +#define HOST_SLC1_TOKEN0_1TO0_INT_ENA_V 0x1 +#define HOST_SLC1_TOKEN0_1TO0_INT_ENA_S 8 +/* HOST_SLC1_TOHOST_BIT7_INT_ENA : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT7_INT_ENA (BIT(7)) +#define HOST_SLC1_TOHOST_BIT7_INT_ENA_M (BIT(7)) +#define HOST_SLC1_TOHOST_BIT7_INT_ENA_V 0x1 +#define HOST_SLC1_TOHOST_BIT7_INT_ENA_S 7 +/* HOST_SLC1_TOHOST_BIT6_INT_ENA : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT6_INT_ENA (BIT(6)) +#define HOST_SLC1_TOHOST_BIT6_INT_ENA_M (BIT(6)) +#define HOST_SLC1_TOHOST_BIT6_INT_ENA_V 0x1 +#define HOST_SLC1_TOHOST_BIT6_INT_ENA_S 6 +/* HOST_SLC1_TOHOST_BIT5_INT_ENA : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT5_INT_ENA (BIT(5)) +#define HOST_SLC1_TOHOST_BIT5_INT_ENA_M (BIT(5)) +#define HOST_SLC1_TOHOST_BIT5_INT_ENA_V 0x1 +#define HOST_SLC1_TOHOST_BIT5_INT_ENA_S 5 +/* HOST_SLC1_TOHOST_BIT4_INT_ENA : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT4_INT_ENA (BIT(4)) +#define HOST_SLC1_TOHOST_BIT4_INT_ENA_M (BIT(4)) +#define HOST_SLC1_TOHOST_BIT4_INT_ENA_V 0x1 +#define HOST_SLC1_TOHOST_BIT4_INT_ENA_S 4 +/* HOST_SLC1_TOHOST_BIT3_INT_ENA : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT3_INT_ENA (BIT(3)) +#define HOST_SLC1_TOHOST_BIT3_INT_ENA_M (BIT(3)) +#define HOST_SLC1_TOHOST_BIT3_INT_ENA_V 0x1 +#define HOST_SLC1_TOHOST_BIT3_INT_ENA_S 3 +/* HOST_SLC1_TOHOST_BIT2_INT_ENA : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT2_INT_ENA (BIT(2)) +#define HOST_SLC1_TOHOST_BIT2_INT_ENA_M (BIT(2)) +#define HOST_SLC1_TOHOST_BIT2_INT_ENA_V 0x1 +#define HOST_SLC1_TOHOST_BIT2_INT_ENA_S 2 +/* HOST_SLC1_TOHOST_BIT1_INT_ENA : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT1_INT_ENA (BIT(1)) +#define HOST_SLC1_TOHOST_BIT1_INT_ENA_M (BIT(1)) +#define HOST_SLC1_TOHOST_BIT1_INT_ENA_V 0x1 +#define HOST_SLC1_TOHOST_BIT1_INT_ENA_S 1 +/* HOST_SLC1_TOHOST_BIT0_INT_ENA : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT0_INT_ENA (BIT(0)) +#define HOST_SLC1_TOHOST_BIT0_INT_ENA_M (BIT(0)) +#define HOST_SLC1_TOHOST_BIT0_INT_ENA_V 0x1 +#define HOST_SLC1_TOHOST_BIT0_INT_ENA_S 0 + +#define HOST_SLC0HOST_RX_INFOR_REG (DR_REG_SLCHOST_BASE + 0xF4) +/* HOST_SLC0HOST_RX_INFOR : R/W ;bitpos:[19:0] ;default: 20'b0 ; */ +/*description: */ +#define HOST_SLC0HOST_RX_INFOR 0x000FFFFF +#define HOST_SLC0HOST_RX_INFOR_M ((HOST_SLC0HOST_RX_INFOR_V)<<(HOST_SLC0HOST_RX_INFOR_S)) +#define HOST_SLC0HOST_RX_INFOR_V 0xFFFFF +#define HOST_SLC0HOST_RX_INFOR_S 0 + +#define HOST_SLC1HOST_RX_INFOR_REG (DR_REG_SLCHOST_BASE + 0xF8) +/* HOST_SLC1HOST_RX_INFOR : R/W ;bitpos:[19:0] ;default: 20'b0 ; */ +/*description: */ +#define HOST_SLC1HOST_RX_INFOR 0x000FFFFF +#define HOST_SLC1HOST_RX_INFOR_M ((HOST_SLC1HOST_RX_INFOR_V)<<(HOST_SLC1HOST_RX_INFOR_S)) +#define HOST_SLC1HOST_RX_INFOR_V 0xFFFFF +#define HOST_SLC1HOST_RX_INFOR_S 0 + +#define HOST_SLC0HOST_LEN_WD_REG (DR_REG_SLCHOST_BASE + 0xFC) +/* HOST_SLC0HOST_LEN_WD : R/W ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define HOST_SLC0HOST_LEN_WD 0xFFFFFFFF +#define HOST_SLC0HOST_LEN_WD_M ((HOST_SLC0HOST_LEN_WD_V)<<(HOST_SLC0HOST_LEN_WD_S)) +#define HOST_SLC0HOST_LEN_WD_V 0xFFFFFFFF +#define HOST_SLC0HOST_LEN_WD_S 0 + +#define HOST_SLC_APBWIN_WDATA_REG (DR_REG_SLCHOST_BASE + 0x100) +/* HOST_SLC_APBWIN_WDATA : R/W ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define HOST_SLC_APBWIN_WDATA 0xFFFFFFFF +#define HOST_SLC_APBWIN_WDATA_M ((HOST_SLC_APBWIN_WDATA_V)<<(HOST_SLC_APBWIN_WDATA_S)) +#define HOST_SLC_APBWIN_WDATA_V 0xFFFFFFFF +#define HOST_SLC_APBWIN_WDATA_S 0 + +#define HOST_SLC_APBWIN_CONF_REG (DR_REG_SLCHOST_BASE + 0x104) +/* HOST_SLC_APBWIN_START : R/W ;bitpos:[29] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC_APBWIN_START (BIT(29)) +#define HOST_SLC_APBWIN_START_M (BIT(29)) +#define HOST_SLC_APBWIN_START_V 0x1 +#define HOST_SLC_APBWIN_START_S 29 +/* HOST_SLC_APBWIN_WR : R/W ;bitpos:[28] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC_APBWIN_WR (BIT(28)) +#define HOST_SLC_APBWIN_WR_M (BIT(28)) +#define HOST_SLC_APBWIN_WR_V 0x1 +#define HOST_SLC_APBWIN_WR_S 28 +/* HOST_SLC_APBWIN_ADDR : R/W ;bitpos:[27:0] ;default: 28'b0 ; */ +/*description: */ +#define HOST_SLC_APBWIN_ADDR 0x0FFFFFFF +#define HOST_SLC_APBWIN_ADDR_M ((HOST_SLC_APBWIN_ADDR_V)<<(HOST_SLC_APBWIN_ADDR_S)) +#define HOST_SLC_APBWIN_ADDR_V 0xFFFFFFF +#define HOST_SLC_APBWIN_ADDR_S 0 + +#define HOST_SLC_APBWIN_RDATA_REG (DR_REG_SLCHOST_BASE + 0x108) +/* HOST_SLC_APBWIN_RDATA : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define HOST_SLC_APBWIN_RDATA 0xFFFFFFFF +#define HOST_SLC_APBWIN_RDATA_M ((HOST_SLC_APBWIN_RDATA_V)<<(HOST_SLC_APBWIN_RDATA_S)) +#define HOST_SLC_APBWIN_RDATA_V 0xFFFFFFFF +#define HOST_SLC_APBWIN_RDATA_S 0 + +#define HOST_SLCHOST_RDCLR0_REG (DR_REG_SLCHOST_BASE + 0x10C) +/* HOST_SLCHOST_SLC0_BIT6_CLRADDR : R/W ;bitpos:[17:9] ;default: 9'h1e0 ; */ +/*description: */ +#define HOST_SLCHOST_SLC0_BIT6_CLRADDR 0x000001FF +#define HOST_SLCHOST_SLC0_BIT6_CLRADDR_M ((HOST_SLCHOST_SLC0_BIT6_CLRADDR_V)<<(HOST_SLCHOST_SLC0_BIT6_CLRADDR_S)) +#define HOST_SLCHOST_SLC0_BIT6_CLRADDR_V 0x1FF +#define HOST_SLCHOST_SLC0_BIT6_CLRADDR_S 9 +/* HOST_SLCHOST_SLC0_BIT7_CLRADDR : R/W ;bitpos:[8:0] ;default: 9'h44 ; */ +/*description: */ +#define HOST_SLCHOST_SLC0_BIT7_CLRADDR 0x000001FF +#define HOST_SLCHOST_SLC0_BIT7_CLRADDR_M ((HOST_SLCHOST_SLC0_BIT7_CLRADDR_V)<<(HOST_SLCHOST_SLC0_BIT7_CLRADDR_S)) +#define HOST_SLCHOST_SLC0_BIT7_CLRADDR_V 0x1FF +#define HOST_SLCHOST_SLC0_BIT7_CLRADDR_S 0 + +#define HOST_SLCHOST_RDCLR1_REG (DR_REG_SLCHOST_BASE + 0x110) +/* HOST_SLCHOST_SLC1_BIT6_CLRADDR : R/W ;bitpos:[17:9] ;default: 9'h1e0 ; */ +/*description: */ +#define HOST_SLCHOST_SLC1_BIT6_CLRADDR 0x000001FF +#define HOST_SLCHOST_SLC1_BIT6_CLRADDR_M ((HOST_SLCHOST_SLC1_BIT6_CLRADDR_V)<<(HOST_SLCHOST_SLC1_BIT6_CLRADDR_S)) +#define HOST_SLCHOST_SLC1_BIT6_CLRADDR_V 0x1FF +#define HOST_SLCHOST_SLC1_BIT6_CLRADDR_S 9 +/* HOST_SLCHOST_SLC1_BIT7_CLRADDR : R/W ;bitpos:[8:0] ;default: 9'h1e0 ; */ +/*description: */ +#define HOST_SLCHOST_SLC1_BIT7_CLRADDR 0x000001FF +#define HOST_SLCHOST_SLC1_BIT7_CLRADDR_M ((HOST_SLCHOST_SLC1_BIT7_CLRADDR_V)<<(HOST_SLCHOST_SLC1_BIT7_CLRADDR_S)) +#define HOST_SLCHOST_SLC1_BIT7_CLRADDR_V 0x1FF +#define HOST_SLCHOST_SLC1_BIT7_CLRADDR_S 0 + +#define HOST_SLC0HOST_INT_ENA1_REG (DR_REG_SLCHOST_BASE + 0x114) +/* HOST_GPIO_SDIO_INT_ENA1 : R/W ;bitpos:[25] ;default: 1'b0 ; */ +/*description: */ +#define HOST_GPIO_SDIO_INT_ENA1 (BIT(25)) +#define HOST_GPIO_SDIO_INT_ENA1_M (BIT(25)) +#define HOST_GPIO_SDIO_INT_ENA1_V 0x1 +#define HOST_GPIO_SDIO_INT_ENA1_S 25 +/* HOST_SLC0_HOST_RD_RETRY_INT_ENA1 : R/W ;bitpos:[24] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_HOST_RD_RETRY_INT_ENA1 (BIT(24)) +#define HOST_SLC0_HOST_RD_RETRY_INT_ENA1_M (BIT(24)) +#define HOST_SLC0_HOST_RD_RETRY_INT_ENA1_V 0x1 +#define HOST_SLC0_HOST_RD_RETRY_INT_ENA1_S 24 +/* HOST_SLC0_RX_NEW_PACKET_INT_ENA1 : R/W ;bitpos:[23] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_RX_NEW_PACKET_INT_ENA1 (BIT(23)) +#define HOST_SLC0_RX_NEW_PACKET_INT_ENA1_M (BIT(23)) +#define HOST_SLC0_RX_NEW_PACKET_INT_ENA1_V 0x1 +#define HOST_SLC0_RX_NEW_PACKET_INT_ENA1_S 23 +/* HOST_SLC0_EXT_BIT3_INT_ENA1 : R/W ;bitpos:[22] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_EXT_BIT3_INT_ENA1 (BIT(22)) +#define HOST_SLC0_EXT_BIT3_INT_ENA1_M (BIT(22)) +#define HOST_SLC0_EXT_BIT3_INT_ENA1_V 0x1 +#define HOST_SLC0_EXT_BIT3_INT_ENA1_S 22 +/* HOST_SLC0_EXT_BIT2_INT_ENA1 : R/W ;bitpos:[21] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_EXT_BIT2_INT_ENA1 (BIT(21)) +#define HOST_SLC0_EXT_BIT2_INT_ENA1_M (BIT(21)) +#define HOST_SLC0_EXT_BIT2_INT_ENA1_V 0x1 +#define HOST_SLC0_EXT_BIT2_INT_ENA1_S 21 +/* HOST_SLC0_EXT_BIT1_INT_ENA1 : R/W ;bitpos:[20] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_EXT_BIT1_INT_ENA1 (BIT(20)) +#define HOST_SLC0_EXT_BIT1_INT_ENA1_M (BIT(20)) +#define HOST_SLC0_EXT_BIT1_INT_ENA1_V 0x1 +#define HOST_SLC0_EXT_BIT1_INT_ENA1_S 20 +/* HOST_SLC0_EXT_BIT0_INT_ENA1 : R/W ;bitpos:[19] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_EXT_BIT0_INT_ENA1 (BIT(19)) +#define HOST_SLC0_EXT_BIT0_INT_ENA1_M (BIT(19)) +#define HOST_SLC0_EXT_BIT0_INT_ENA1_V 0x1 +#define HOST_SLC0_EXT_BIT0_INT_ENA1_S 19 +/* HOST_SLC0_RX_PF_VALID_INT_ENA1 : R/W ;bitpos:[18] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_RX_PF_VALID_INT_ENA1 (BIT(18)) +#define HOST_SLC0_RX_PF_VALID_INT_ENA1_M (BIT(18)) +#define HOST_SLC0_RX_PF_VALID_INT_ENA1_V 0x1 +#define HOST_SLC0_RX_PF_VALID_INT_ENA1_S 18 +/* HOST_SLC0_TX_OVF_INT_ENA1 : R/W ;bitpos:[17] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TX_OVF_INT_ENA1 (BIT(17)) +#define HOST_SLC0_TX_OVF_INT_ENA1_M (BIT(17)) +#define HOST_SLC0_TX_OVF_INT_ENA1_V 0x1 +#define HOST_SLC0_TX_OVF_INT_ENA1_S 17 +/* HOST_SLC0_RX_UDF_INT_ENA1 : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_RX_UDF_INT_ENA1 (BIT(16)) +#define HOST_SLC0_RX_UDF_INT_ENA1_M (BIT(16)) +#define HOST_SLC0_RX_UDF_INT_ENA1_V 0x1 +#define HOST_SLC0_RX_UDF_INT_ENA1_S 16 +/* HOST_SLC0HOST_TX_START_INT_ENA1 : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0HOST_TX_START_INT_ENA1 (BIT(15)) +#define HOST_SLC0HOST_TX_START_INT_ENA1_M (BIT(15)) +#define HOST_SLC0HOST_TX_START_INT_ENA1_V 0x1 +#define HOST_SLC0HOST_TX_START_INT_ENA1_S 15 +/* HOST_SLC0HOST_RX_START_INT_ENA1 : R/W ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0HOST_RX_START_INT_ENA1 (BIT(14)) +#define HOST_SLC0HOST_RX_START_INT_ENA1_M (BIT(14)) +#define HOST_SLC0HOST_RX_START_INT_ENA1_V 0x1 +#define HOST_SLC0HOST_RX_START_INT_ENA1_S 14 +/* HOST_SLC0HOST_RX_EOF_INT_ENA1 : R/W ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0HOST_RX_EOF_INT_ENA1 (BIT(13)) +#define HOST_SLC0HOST_RX_EOF_INT_ENA1_M (BIT(13)) +#define HOST_SLC0HOST_RX_EOF_INT_ENA1_V 0x1 +#define HOST_SLC0HOST_RX_EOF_INT_ENA1_S 13 +/* HOST_SLC0HOST_RX_SOF_INT_ENA1 : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0HOST_RX_SOF_INT_ENA1 (BIT(12)) +#define HOST_SLC0HOST_RX_SOF_INT_ENA1_M (BIT(12)) +#define HOST_SLC0HOST_RX_SOF_INT_ENA1_V 0x1 +#define HOST_SLC0HOST_RX_SOF_INT_ENA1_S 12 +/* HOST_SLC0_TOKEN1_0TO1_INT_ENA1 : R/W ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOKEN1_0TO1_INT_ENA1 (BIT(11)) +#define HOST_SLC0_TOKEN1_0TO1_INT_ENA1_M (BIT(11)) +#define HOST_SLC0_TOKEN1_0TO1_INT_ENA1_V 0x1 +#define HOST_SLC0_TOKEN1_0TO1_INT_ENA1_S 11 +/* HOST_SLC0_TOKEN0_0TO1_INT_ENA1 : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOKEN0_0TO1_INT_ENA1 (BIT(10)) +#define HOST_SLC0_TOKEN0_0TO1_INT_ENA1_M (BIT(10)) +#define HOST_SLC0_TOKEN0_0TO1_INT_ENA1_V 0x1 +#define HOST_SLC0_TOKEN0_0TO1_INT_ENA1_S 10 +/* HOST_SLC0_TOKEN1_1TO0_INT_ENA1 : R/W ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOKEN1_1TO0_INT_ENA1 (BIT(9)) +#define HOST_SLC0_TOKEN1_1TO0_INT_ENA1_M (BIT(9)) +#define HOST_SLC0_TOKEN1_1TO0_INT_ENA1_V 0x1 +#define HOST_SLC0_TOKEN1_1TO0_INT_ENA1_S 9 +/* HOST_SLC0_TOKEN0_1TO0_INT_ENA1 : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOKEN0_1TO0_INT_ENA1 (BIT(8)) +#define HOST_SLC0_TOKEN0_1TO0_INT_ENA1_M (BIT(8)) +#define HOST_SLC0_TOKEN0_1TO0_INT_ENA1_V 0x1 +#define HOST_SLC0_TOKEN0_1TO0_INT_ENA1_S 8 +/* HOST_SLC0_TOHOST_BIT7_INT_ENA1 : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT7_INT_ENA1 (BIT(7)) +#define HOST_SLC0_TOHOST_BIT7_INT_ENA1_M (BIT(7)) +#define HOST_SLC0_TOHOST_BIT7_INT_ENA1_V 0x1 +#define HOST_SLC0_TOHOST_BIT7_INT_ENA1_S 7 +/* HOST_SLC0_TOHOST_BIT6_INT_ENA1 : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT6_INT_ENA1 (BIT(6)) +#define HOST_SLC0_TOHOST_BIT6_INT_ENA1_M (BIT(6)) +#define HOST_SLC0_TOHOST_BIT6_INT_ENA1_V 0x1 +#define HOST_SLC0_TOHOST_BIT6_INT_ENA1_S 6 +/* HOST_SLC0_TOHOST_BIT5_INT_ENA1 : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT5_INT_ENA1 (BIT(5)) +#define HOST_SLC0_TOHOST_BIT5_INT_ENA1_M (BIT(5)) +#define HOST_SLC0_TOHOST_BIT5_INT_ENA1_V 0x1 +#define HOST_SLC0_TOHOST_BIT5_INT_ENA1_S 5 +/* HOST_SLC0_TOHOST_BIT4_INT_ENA1 : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT4_INT_ENA1 (BIT(4)) +#define HOST_SLC0_TOHOST_BIT4_INT_ENA1_M (BIT(4)) +#define HOST_SLC0_TOHOST_BIT4_INT_ENA1_V 0x1 +#define HOST_SLC0_TOHOST_BIT4_INT_ENA1_S 4 +/* HOST_SLC0_TOHOST_BIT3_INT_ENA1 : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT3_INT_ENA1 (BIT(3)) +#define HOST_SLC0_TOHOST_BIT3_INT_ENA1_M (BIT(3)) +#define HOST_SLC0_TOHOST_BIT3_INT_ENA1_V 0x1 +#define HOST_SLC0_TOHOST_BIT3_INT_ENA1_S 3 +/* HOST_SLC0_TOHOST_BIT2_INT_ENA1 : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT2_INT_ENA1 (BIT(2)) +#define HOST_SLC0_TOHOST_BIT2_INT_ENA1_M (BIT(2)) +#define HOST_SLC0_TOHOST_BIT2_INT_ENA1_V 0x1 +#define HOST_SLC0_TOHOST_BIT2_INT_ENA1_S 2 +/* HOST_SLC0_TOHOST_BIT1_INT_ENA1 : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT1_INT_ENA1 (BIT(1)) +#define HOST_SLC0_TOHOST_BIT1_INT_ENA1_M (BIT(1)) +#define HOST_SLC0_TOHOST_BIT1_INT_ENA1_V 0x1 +#define HOST_SLC0_TOHOST_BIT1_INT_ENA1_S 1 +/* HOST_SLC0_TOHOST_BIT0_INT_ENA1 : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC0_TOHOST_BIT0_INT_ENA1 (BIT(0)) +#define HOST_SLC0_TOHOST_BIT0_INT_ENA1_M (BIT(0)) +#define HOST_SLC0_TOHOST_BIT0_INT_ENA1_V 0x1 +#define HOST_SLC0_TOHOST_BIT0_INT_ENA1_S 0 + +#define HOST_SLC1HOST_INT_ENA1_REG (DR_REG_SLCHOST_BASE + 0x118) +/* HOST_SLC1_BT_RX_NEW_PACKET_INT_ENA1 : R/W ;bitpos:[25] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_BT_RX_NEW_PACKET_INT_ENA1 (BIT(25)) +#define HOST_SLC1_BT_RX_NEW_PACKET_INT_ENA1_M (BIT(25)) +#define HOST_SLC1_BT_RX_NEW_PACKET_INT_ENA1_V 0x1 +#define HOST_SLC1_BT_RX_NEW_PACKET_INT_ENA1_S 25 +/* HOST_SLC1_HOST_RD_RETRY_INT_ENA1 : R/W ;bitpos:[24] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_HOST_RD_RETRY_INT_ENA1 (BIT(24)) +#define HOST_SLC1_HOST_RD_RETRY_INT_ENA1_M (BIT(24)) +#define HOST_SLC1_HOST_RD_RETRY_INT_ENA1_V 0x1 +#define HOST_SLC1_HOST_RD_RETRY_INT_ENA1_S 24 +/* HOST_SLC1_WIFI_RX_NEW_PACKET_INT_ENA1 : R/W ;bitpos:[23] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_WIFI_RX_NEW_PACKET_INT_ENA1 (BIT(23)) +#define HOST_SLC1_WIFI_RX_NEW_PACKET_INT_ENA1_M (BIT(23)) +#define HOST_SLC1_WIFI_RX_NEW_PACKET_INT_ENA1_V 0x1 +#define HOST_SLC1_WIFI_RX_NEW_PACKET_INT_ENA1_S 23 +/* HOST_SLC1_EXT_BIT3_INT_ENA1 : R/W ;bitpos:[22] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_EXT_BIT3_INT_ENA1 (BIT(22)) +#define HOST_SLC1_EXT_BIT3_INT_ENA1_M (BIT(22)) +#define HOST_SLC1_EXT_BIT3_INT_ENA1_V 0x1 +#define HOST_SLC1_EXT_BIT3_INT_ENA1_S 22 +/* HOST_SLC1_EXT_BIT2_INT_ENA1 : R/W ;bitpos:[21] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_EXT_BIT2_INT_ENA1 (BIT(21)) +#define HOST_SLC1_EXT_BIT2_INT_ENA1_M (BIT(21)) +#define HOST_SLC1_EXT_BIT2_INT_ENA1_V 0x1 +#define HOST_SLC1_EXT_BIT2_INT_ENA1_S 21 +/* HOST_SLC1_EXT_BIT1_INT_ENA1 : R/W ;bitpos:[20] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_EXT_BIT1_INT_ENA1 (BIT(20)) +#define HOST_SLC1_EXT_BIT1_INT_ENA1_M (BIT(20)) +#define HOST_SLC1_EXT_BIT1_INT_ENA1_V 0x1 +#define HOST_SLC1_EXT_BIT1_INT_ENA1_S 20 +/* HOST_SLC1_EXT_BIT0_INT_ENA1 : R/W ;bitpos:[19] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_EXT_BIT0_INT_ENA1 (BIT(19)) +#define HOST_SLC1_EXT_BIT0_INT_ENA1_M (BIT(19)) +#define HOST_SLC1_EXT_BIT0_INT_ENA1_V 0x1 +#define HOST_SLC1_EXT_BIT0_INT_ENA1_S 19 +/* HOST_SLC1_RX_PF_VALID_INT_ENA1 : R/W ;bitpos:[18] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_RX_PF_VALID_INT_ENA1 (BIT(18)) +#define HOST_SLC1_RX_PF_VALID_INT_ENA1_M (BIT(18)) +#define HOST_SLC1_RX_PF_VALID_INT_ENA1_V 0x1 +#define HOST_SLC1_RX_PF_VALID_INT_ENA1_S 18 +/* HOST_SLC1_TX_OVF_INT_ENA1 : R/W ;bitpos:[17] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TX_OVF_INT_ENA1 (BIT(17)) +#define HOST_SLC1_TX_OVF_INT_ENA1_M (BIT(17)) +#define HOST_SLC1_TX_OVF_INT_ENA1_V 0x1 +#define HOST_SLC1_TX_OVF_INT_ENA1_S 17 +/* HOST_SLC1_RX_UDF_INT_ENA1 : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_RX_UDF_INT_ENA1 (BIT(16)) +#define HOST_SLC1_RX_UDF_INT_ENA1_M (BIT(16)) +#define HOST_SLC1_RX_UDF_INT_ENA1_V 0x1 +#define HOST_SLC1_RX_UDF_INT_ENA1_S 16 +/* HOST_SLC1HOST_TX_START_INT_ENA1 : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1HOST_TX_START_INT_ENA1 (BIT(15)) +#define HOST_SLC1HOST_TX_START_INT_ENA1_M (BIT(15)) +#define HOST_SLC1HOST_TX_START_INT_ENA1_V 0x1 +#define HOST_SLC1HOST_TX_START_INT_ENA1_S 15 +/* HOST_SLC1HOST_RX_START_INT_ENA1 : R/W ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1HOST_RX_START_INT_ENA1 (BIT(14)) +#define HOST_SLC1HOST_RX_START_INT_ENA1_M (BIT(14)) +#define HOST_SLC1HOST_RX_START_INT_ENA1_V 0x1 +#define HOST_SLC1HOST_RX_START_INT_ENA1_S 14 +/* HOST_SLC1HOST_RX_EOF_INT_ENA1 : R/W ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1HOST_RX_EOF_INT_ENA1 (BIT(13)) +#define HOST_SLC1HOST_RX_EOF_INT_ENA1_M (BIT(13)) +#define HOST_SLC1HOST_RX_EOF_INT_ENA1_V 0x1 +#define HOST_SLC1HOST_RX_EOF_INT_ENA1_S 13 +/* HOST_SLC1HOST_RX_SOF_INT_ENA1 : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1HOST_RX_SOF_INT_ENA1 (BIT(12)) +#define HOST_SLC1HOST_RX_SOF_INT_ENA1_M (BIT(12)) +#define HOST_SLC1HOST_RX_SOF_INT_ENA1_V 0x1 +#define HOST_SLC1HOST_RX_SOF_INT_ENA1_S 12 +/* HOST_SLC1_TOKEN1_0TO1_INT_ENA1 : R/W ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOKEN1_0TO1_INT_ENA1 (BIT(11)) +#define HOST_SLC1_TOKEN1_0TO1_INT_ENA1_M (BIT(11)) +#define HOST_SLC1_TOKEN1_0TO1_INT_ENA1_V 0x1 +#define HOST_SLC1_TOKEN1_0TO1_INT_ENA1_S 11 +/* HOST_SLC1_TOKEN0_0TO1_INT_ENA1 : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOKEN0_0TO1_INT_ENA1 (BIT(10)) +#define HOST_SLC1_TOKEN0_0TO1_INT_ENA1_M (BIT(10)) +#define HOST_SLC1_TOKEN0_0TO1_INT_ENA1_V 0x1 +#define HOST_SLC1_TOKEN0_0TO1_INT_ENA1_S 10 +/* HOST_SLC1_TOKEN1_1TO0_INT_ENA1 : R/W ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOKEN1_1TO0_INT_ENA1 (BIT(9)) +#define HOST_SLC1_TOKEN1_1TO0_INT_ENA1_M (BIT(9)) +#define HOST_SLC1_TOKEN1_1TO0_INT_ENA1_V 0x1 +#define HOST_SLC1_TOKEN1_1TO0_INT_ENA1_S 9 +/* HOST_SLC1_TOKEN0_1TO0_INT_ENA1 : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOKEN0_1TO0_INT_ENA1 (BIT(8)) +#define HOST_SLC1_TOKEN0_1TO0_INT_ENA1_M (BIT(8)) +#define HOST_SLC1_TOKEN0_1TO0_INT_ENA1_V 0x1 +#define HOST_SLC1_TOKEN0_1TO0_INT_ENA1_S 8 +/* HOST_SLC1_TOHOST_BIT7_INT_ENA1 : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT7_INT_ENA1 (BIT(7)) +#define HOST_SLC1_TOHOST_BIT7_INT_ENA1_M (BIT(7)) +#define HOST_SLC1_TOHOST_BIT7_INT_ENA1_V 0x1 +#define HOST_SLC1_TOHOST_BIT7_INT_ENA1_S 7 +/* HOST_SLC1_TOHOST_BIT6_INT_ENA1 : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT6_INT_ENA1 (BIT(6)) +#define HOST_SLC1_TOHOST_BIT6_INT_ENA1_M (BIT(6)) +#define HOST_SLC1_TOHOST_BIT6_INT_ENA1_V 0x1 +#define HOST_SLC1_TOHOST_BIT6_INT_ENA1_S 6 +/* HOST_SLC1_TOHOST_BIT5_INT_ENA1 : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT5_INT_ENA1 (BIT(5)) +#define HOST_SLC1_TOHOST_BIT5_INT_ENA1_M (BIT(5)) +#define HOST_SLC1_TOHOST_BIT5_INT_ENA1_V 0x1 +#define HOST_SLC1_TOHOST_BIT5_INT_ENA1_S 5 +/* HOST_SLC1_TOHOST_BIT4_INT_ENA1 : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT4_INT_ENA1 (BIT(4)) +#define HOST_SLC1_TOHOST_BIT4_INT_ENA1_M (BIT(4)) +#define HOST_SLC1_TOHOST_BIT4_INT_ENA1_V 0x1 +#define HOST_SLC1_TOHOST_BIT4_INT_ENA1_S 4 +/* HOST_SLC1_TOHOST_BIT3_INT_ENA1 : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT3_INT_ENA1 (BIT(3)) +#define HOST_SLC1_TOHOST_BIT3_INT_ENA1_M (BIT(3)) +#define HOST_SLC1_TOHOST_BIT3_INT_ENA1_V 0x1 +#define HOST_SLC1_TOHOST_BIT3_INT_ENA1_S 3 +/* HOST_SLC1_TOHOST_BIT2_INT_ENA1 : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT2_INT_ENA1 (BIT(2)) +#define HOST_SLC1_TOHOST_BIT2_INT_ENA1_M (BIT(2)) +#define HOST_SLC1_TOHOST_BIT2_INT_ENA1_V 0x1 +#define HOST_SLC1_TOHOST_BIT2_INT_ENA1_S 2 +/* HOST_SLC1_TOHOST_BIT1_INT_ENA1 : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT1_INT_ENA1 (BIT(1)) +#define HOST_SLC1_TOHOST_BIT1_INT_ENA1_M (BIT(1)) +#define HOST_SLC1_TOHOST_BIT1_INT_ENA1_V 0x1 +#define HOST_SLC1_TOHOST_BIT1_INT_ENA1_S 1 +/* HOST_SLC1_TOHOST_BIT0_INT_ENA1 : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SLC1_TOHOST_BIT0_INT_ENA1 (BIT(0)) +#define HOST_SLC1_TOHOST_BIT0_INT_ENA1_M (BIT(0)) +#define HOST_SLC1_TOHOST_BIT0_INT_ENA1_V 0x1 +#define HOST_SLC1_TOHOST_BIT0_INT_ENA1_S 0 + +#define HOST_SLCHOSTDATE_REG (DR_REG_SLCHOST_BASE + 0x178) +/* HOST_SLCHOST_DATE : R/W ;bitpos:[31:0] ;default: 32'h16022500 ; */ +/*description: */ +#define HOST_SLCHOST_DATE 0xFFFFFFFF +#define HOST_SLCHOST_DATE_M ((HOST_SLCHOST_DATE_V)<<(HOST_SLCHOST_DATE_S)) +#define HOST_SLCHOST_DATE_V 0xFFFFFFFF +#define HOST_SLCHOST_DATE_S 0 + +#define HOST_SLCHOSTID_REG (DR_REG_SLCHOST_BASE + 0x17C) +/* HOST_SLCHOST_ID : R/W ;bitpos:[31:0] ;default: 32'h0600 ; */ +/*description: */ +#define HOST_SLCHOST_ID 0xFFFFFFFF +#define HOST_SLCHOST_ID_M ((HOST_SLCHOST_ID_V)<<(HOST_SLCHOST_ID_S)) +#define HOST_SLCHOST_ID_V 0xFFFFFFFF +#define HOST_SLCHOST_ID_S 0 + +#define HOST_SLCHOST_CONF_REG (DR_REG_SLCHOST_BASE + 0x1F0) +/* HOST_HSPEED_CON_EN : R/W ;bitpos:[27] ;default: 1'b0 ; */ +/*description: */ +#define HOST_HSPEED_CON_EN (BIT(27)) +#define HOST_HSPEED_CON_EN_M (BIT(27)) +#define HOST_HSPEED_CON_EN_V 0x1 +#define HOST_HSPEED_CON_EN_S 27 +/* HOST_SDIO_PAD_PULLUP : R/W ;bitpos:[26] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SDIO_PAD_PULLUP (BIT(26)) +#define HOST_SDIO_PAD_PULLUP_M (BIT(26)) +#define HOST_SDIO_PAD_PULLUP_V 0x1 +#define HOST_SDIO_PAD_PULLUP_S 26 +/* HOST_SDIO20_INT_DELAY : R/W ;bitpos:[25] ;default: 1'b0 ; */ +/*description: */ +#define HOST_SDIO20_INT_DELAY (BIT(25)) +#define HOST_SDIO20_INT_DELAY_M (BIT(25)) +#define HOST_SDIO20_INT_DELAY_V 0x1 +#define HOST_SDIO20_INT_DELAY_S 25 +/* HOST_FRC_QUICK_IN : R/W ;bitpos:[24:20] ;default: 5'b0 ; */ +/*description: */ +#define HOST_FRC_QUICK_IN 0x0000001F +#define HOST_FRC_QUICK_IN_M ((HOST_FRC_QUICK_IN_V)<<(HOST_FRC_QUICK_IN_S)) +#define HOST_FRC_QUICK_IN_V 0x1F +#define HOST_FRC_QUICK_IN_S 20 +/* HOST_FRC_POS_SAMP : R/W ;bitpos:[19:15] ;default: 5'b0 ; */ +/*description: */ +#define HOST_FRC_POS_SAMP 0x0000001F +#define HOST_FRC_POS_SAMP_M ((HOST_FRC_POS_SAMP_V)<<(HOST_FRC_POS_SAMP_S)) +#define HOST_FRC_POS_SAMP_V 0x1F +#define HOST_FRC_POS_SAMP_S 15 +/* HOST_FRC_NEG_SAMP : R/W ;bitpos:[14:10] ;default: 5'b0 ; */ +/*description: */ +#define HOST_FRC_NEG_SAMP 0x0000001F +#define HOST_FRC_NEG_SAMP_M ((HOST_FRC_NEG_SAMP_V)<<(HOST_FRC_NEG_SAMP_S)) +#define HOST_FRC_NEG_SAMP_V 0x1F +#define HOST_FRC_NEG_SAMP_S 10 +/* HOST_FRC_SDIO20 : R/W ;bitpos:[9:5] ;default: 5'b0 ; */ +/*description: */ +#define HOST_FRC_SDIO20 0x0000001F +#define HOST_FRC_SDIO20_M ((HOST_FRC_SDIO20_V)<<(HOST_FRC_SDIO20_S)) +#define HOST_FRC_SDIO20_V 0x1F +#define HOST_FRC_SDIO20_S 5 +/* HOST_FRC_SDIO11 : R/W ;bitpos:[4:0] ;default: 5'b0 ; */ +/*description: */ +#define HOST_FRC_SDIO11 0x0000001F +#define HOST_FRC_SDIO11_M ((HOST_FRC_SDIO11_V)<<(HOST_FRC_SDIO11_S)) +#define HOST_FRC_SDIO11_V 0x1F +#define HOST_FRC_SDIO11_S 0 + +#define HOST_SLCHOST_INF_ST_REG (DR_REG_SLCHOST_BASE + 0x1F4) +/* HOST_SDIO_QUICK_IN : RO ;bitpos:[14:10] ;default: 5'b0 ; */ +/*description: */ +#define HOST_SDIO_QUICK_IN 0x0000001F +#define HOST_SDIO_QUICK_IN_M ((HOST_SDIO_QUICK_IN_V)<<(HOST_SDIO_QUICK_IN_S)) +#define HOST_SDIO_QUICK_IN_V 0x1F +#define HOST_SDIO_QUICK_IN_S 10 +/* HOST_SDIO_NEG_SAMP : RO ;bitpos:[9:5] ;default: 5'b0 ; */ +/*description: */ +#define HOST_SDIO_NEG_SAMP 0x0000001F +#define HOST_SDIO_NEG_SAMP_M ((HOST_SDIO_NEG_SAMP_V)<<(HOST_SDIO_NEG_SAMP_S)) +#define HOST_SDIO_NEG_SAMP_V 0x1F +#define HOST_SDIO_NEG_SAMP_S 5 +/* HOST_SDIO20_MODE : RO ;bitpos:[4:0] ;default: 5'b0 ; */ +/*description: */ +#define HOST_SDIO20_MODE 0x0000001F +#define HOST_SDIO20_MODE_M ((HOST_SDIO20_MODE_V)<<(HOST_SDIO20_MODE_S)) +#define HOST_SDIO20_MODE_V 0x1F +#define HOST_SDIO20_MODE_S 0 + + + + +#endif /*_SOC_HOST_REG_H_ */ + + diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/host_struct.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/host_struct.h new file mode 100644 index 0000000000000..057d009baf2ae --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/host_struct.h @@ -0,0 +1,893 @@ +// 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. +#ifndef _SOC_HOST_STRUCT_H_ +#define _SOC_HOST_STRUCT_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef volatile struct host_dev_s { + uint32_t reserved_0; + uint32_t reserved_4; + uint32_t reserved_8; + uint32_t reserved_c; + union { + struct { + uint32_t reserved0: 24; + uint32_t func2_int: 1; + uint32_t reserved25: 7; + }; + uint32_t val; + } func2_0; + union { + struct { + uint32_t func2_int_en: 1; + uint32_t reserved1: 31; + }; + uint32_t val; + } func2_1; + uint32_t reserved_18; + uint32_t reserved_1c; + union { + struct { + uint32_t func1_mdstat: 1; + uint32_t reserved1: 31; + }; + uint32_t val; + } func2_2; + uint32_t reserved_24; + uint32_t reserved_28; + uint32_t reserved_2c; + uint32_t reserved_30; + uint32_t gpio_status0; /**/ + union { + struct { + uint32_t sdio_int1: 8; + uint32_t reserved8: 24; + }; + uint32_t val; + } gpio_status1; + uint32_t gpio_in0; /**/ + union { + struct { + uint32_t sdio_in1: 8; + uint32_t reserved8: 24; + }; + uint32_t val; + } gpio_in1; + union { + struct { + uint32_t token0: 12; + uint32_t rx_pf_valid: 1; + uint32_t reserved13: 3; + uint32_t reg_token1: 12; + uint32_t rx_pf_eof: 4; + }; + uint32_t val; + } slc0_token_rdata; + uint32_t slc0_pf; /**/ + uint32_t slc1_pf; /**/ + union { + struct { + uint32_t tohost_bit0: 1; + uint32_t tohost_bit1: 1; + uint32_t tohost_bit2: 1; + uint32_t tohost_bit3: 1; + uint32_t tohost_bit4: 1; + uint32_t tohost_bit5: 1; + uint32_t tohost_bit6: 1; + uint32_t tohost_bit7: 1; + uint32_t token0_1to0: 1; + uint32_t token1_1to0: 1; + uint32_t token0_0to1: 1; + uint32_t token1_0to1: 1; + uint32_t rx_sof: 1; + uint32_t rx_eof: 1; + uint32_t rx_start: 1; + uint32_t tx_start: 1; + uint32_t rx_udf: 1; + uint32_t tx_ovf: 1; + uint32_t rx_pf_valid: 1; + uint32_t ext_bit0: 1; + uint32_t ext_bit1: 1; + uint32_t ext_bit2: 1; + uint32_t ext_bit3: 1; + uint32_t rx_new_packet: 1; + uint32_t rd_retry: 1; + uint32_t gpio_sdio: 1; + uint32_t reserved26: 6; + }; + uint32_t val; + } slc0_int_raw; + union { + struct { + uint32_t tohost_bit0: 1; + uint32_t tohost_bit1: 1; + uint32_t tohost_bit2: 1; + uint32_t tohost_bit3: 1; + uint32_t tohost_bit4: 1; + uint32_t tohost_bit5: 1; + uint32_t tohost_bit6: 1; + uint32_t tohost_bit7: 1; + uint32_t token0_1to0: 1; + uint32_t token1_1to0: 1; + uint32_t token0_0to1: 1; + uint32_t token1_0to1: 1; + uint32_t rx_sof: 1; + uint32_t rx_eof: 1; + uint32_t rx_start: 1; + uint32_t tx_start: 1; + uint32_t rx_udf: 1; + uint32_t tx_ovf: 1; + uint32_t rx_pf_valid: 1; + uint32_t ext_bit0: 1; + uint32_t ext_bit1: 1; + uint32_t ext_bit2: 1; + uint32_t ext_bit3: 1; + uint32_t wifi_rx_new_packet: 1; + uint32_t rd_retry: 1; + uint32_t bt_rx_new_packet: 1; + uint32_t reserved26: 6; + }; + uint32_t val; + } slc1_int_raw; + union { + struct { + uint32_t tohost_bit0: 1; + uint32_t tohost_bit1: 1; + uint32_t tohost_bit2: 1; + uint32_t tohost_bit3: 1; + uint32_t tohost_bit4: 1; + uint32_t tohost_bit5: 1; + uint32_t tohost_bit6: 1; + uint32_t tohost_bit7: 1; + uint32_t token0_1to0: 1; + uint32_t token1_1to0: 1; + uint32_t token0_0to1: 1; + uint32_t token1_0to1: 1; + uint32_t rx_sof: 1; + uint32_t rx_eof: 1; + uint32_t rx_start: 1; + uint32_t tx_start: 1; + uint32_t rx_udf: 1; + uint32_t tx_ovf: 1; + uint32_t rx_pf_valid: 1; + uint32_t ext_bit0: 1; + uint32_t ext_bit1: 1; + uint32_t ext_bit2: 1; + uint32_t ext_bit3: 1; + uint32_t rx_new_packet: 1; + uint32_t rd_retry: 1; + uint32_t gpio_sdio: 1; + uint32_t reserved26: 6; + }; + uint32_t val; + } slc0_int_st; + union { + struct { + uint32_t tohost_bit0: 1; + uint32_t tohost_bit1: 1; + uint32_t tohost_bit2: 1; + uint32_t tohost_bit3: 1; + uint32_t tohost_bit4: 1; + uint32_t tohost_bit5: 1; + uint32_t tohost_bit6: 1; + uint32_t tohost_bit7: 1; + uint32_t token0_1to0: 1; + uint32_t token1_1to0: 1; + uint32_t token0_0to1: 1; + uint32_t token1_0to1: 1; + uint32_t rx_sof: 1; + uint32_t rx_eof: 1; + uint32_t rx_start: 1; + uint32_t tx_start: 1; + uint32_t rx_udf: 1; + uint32_t tx_ovf: 1; + uint32_t rx_pf_valid: 1; + uint32_t ext_bit0: 1; + uint32_t ext_bit1: 1; + uint32_t ext_bit2: 1; + uint32_t ext_bit3: 1; + uint32_t wifi_rx_new_packet: 1; + uint32_t rd_retry: 1; + uint32_t bt_rx_new_packet: 1; + uint32_t reserved26: 6; + }; + uint32_t val; + } slc1_int_st; + union { + struct { + uint32_t reg_slc0_len: 20; + uint32_t reg_slc0_len_check:12; + }; + uint32_t val; + } pkt_len; + union { + struct { + uint32_t state0: 8; + uint32_t state1: 8; + uint32_t state2: 8; + uint32_t state3: 8; + }; + uint32_t val; + } state_w0; + union { + struct { + uint32_t state4: 8; + uint32_t state5: 8; + uint32_t state6: 8; + uint32_t state7: 8; + }; + uint32_t val; + } state_w1; + union { + struct { + uint32_t conf0: 8; + uint32_t conf1: 8; + uint32_t conf2: 8; + uint32_t conf3: 8; + }; + uint32_t val; + } conf_w0; + union { + struct { + uint32_t conf4: 8; + uint32_t conf5: 8; + uint32_t conf6: 8; + uint32_t conf7: 8; + }; + uint32_t val; + } conf_w1; + union { + struct { + uint32_t conf8: 8; + uint32_t conf9: 8; + uint32_t conf10: 8; + uint32_t conf11: 8; + }; + uint32_t val; + } conf_w2; + union { + struct { + uint32_t conf12: 8; + uint32_t conf13: 8; + uint32_t conf14: 8; + uint32_t conf15: 8; + }; + uint32_t val; + } conf_w3; + union { + struct { + uint32_t conf16: 8; /*SLC timeout value*/ + uint32_t conf17: 8; /*SLC timeout enable*/ + uint32_t conf18: 8; + uint32_t conf19: 8; /*Interrupt to target CPU*/ + }; + uint32_t val; + } conf_w4; + union { + struct { + uint32_t conf20: 8; + uint32_t conf21: 8; + uint32_t conf22: 8; + uint32_t conf23: 8; + }; + uint32_t val; + } conf_w5; + uint32_t win_cmd; /**/ + union { + struct { + uint32_t conf24: 8; + uint32_t conf25: 8; + uint32_t conf26: 8; + uint32_t conf27: 8; + }; + uint32_t val; + } conf_w6; + union { + struct { + uint32_t conf28: 8; + uint32_t conf29: 8; + uint32_t conf30: 8; + uint32_t conf31: 8; + }; + uint32_t val; + } conf_w7; + union { + struct { + uint32_t reg_slc0_len0:20; + uint32_t reserved20: 12; + }; + uint32_t val; + } pkt_len0; + union { + struct { + uint32_t reg_slc0_len1:20; + uint32_t reserved20: 12; + }; + uint32_t val; + } pkt_len1; + union { + struct { + uint32_t reg_slc0_len2:20; + uint32_t reserved20: 12; + }; + uint32_t val; + } pkt_len2; + union { + struct { + uint32_t conf32: 8; + uint32_t conf33: 8; + uint32_t conf34: 8; + uint32_t conf35: 8; + }; + uint32_t val; + } conf_w8; + union { + struct { + uint32_t conf36: 8; + uint32_t conf37: 8; + uint32_t conf38: 8; + uint32_t conf39: 8; + }; + uint32_t val; + } conf_w9; + union { + struct { + uint32_t conf40: 8; + uint32_t conf41: 8; + uint32_t conf42: 8; + uint32_t conf43: 8; + }; + uint32_t val; + } conf_w10; + union { + struct { + uint32_t conf44: 8; + uint32_t conf45: 8; + uint32_t conf46: 8; + uint32_t conf47: 8; + }; + uint32_t val; + } conf_w11; + union { + struct { + uint32_t conf48: 8; + uint32_t conf49: 8; + uint32_t conf50: 8; + uint32_t conf51: 8; + }; + uint32_t val; + } conf_w12; + union { + struct { + uint32_t conf52: 8; + uint32_t conf53: 8; + uint32_t conf54: 8; + uint32_t conf55: 8; + }; + uint32_t val; + } conf_w13; + union { + struct { + uint32_t conf56: 8; + uint32_t conf57: 8; + uint32_t conf58: 8; + uint32_t conf59: 8; + }; + uint32_t val; + } conf_w14; + union { + struct { + uint32_t conf60: 8; + uint32_t conf61: 8; + uint32_t conf62: 8; + uint32_t conf63: 8; + }; + uint32_t val; + } conf_w15; + uint32_t check_sum0; /**/ + uint32_t check_sum1; /**/ + union { + struct { + uint32_t token0: 12; + uint32_t rx_pf_valid: 1; + uint32_t reserved13: 3; + uint32_t reg_token1: 12; + uint32_t rx_pf_eof: 4; + }; + uint32_t val; + } slc1_token_rdata; + union { + struct { + uint32_t token0_wd: 12; + uint32_t reserved12: 4; + uint32_t token1_wd: 12; + uint32_t reserved28: 4; + }; + uint32_t val; + } slc0_token_wdata; + union { + struct { + uint32_t token0_wd: 12; + uint32_t reserved12: 4; + uint32_t token1_wd: 12; + uint32_t reserved28: 4; + }; + uint32_t val; + } slc1_token_wdata; + union { + struct { + uint32_t slc0_token0_dec: 1; + uint32_t slc0_token1_dec: 1; + uint32_t slc0_token0_wr: 1; + uint32_t slc0_token1_wr: 1; + uint32_t slc1_token0_dec: 1; + uint32_t slc1_token1_dec: 1; + uint32_t slc1_token0_wr: 1; + uint32_t slc1_token1_wr: 1; + uint32_t slc0_len_wr: 1; + uint32_t reserved9: 23; + }; + uint32_t val; + } token_con; + union { + struct { + uint32_t tohost_bit0: 1; + uint32_t tohost_bit1: 1; + uint32_t tohost_bit2: 1; + uint32_t tohost_bit3: 1; + uint32_t tohost_bit4: 1; + uint32_t tohost_bit5: 1; + uint32_t tohost_bit6: 1; + uint32_t tohost_bit7: 1; + uint32_t token0_1to0: 1; + uint32_t token1_1to0: 1; + uint32_t token0_0to1: 1; + uint32_t token1_0to1: 1; + uint32_t rx_sof: 1; + uint32_t rx_eof: 1; + uint32_t rx_start: 1; + uint32_t tx_start: 1; + uint32_t rx_udf: 1; + uint32_t tx_ovf: 1; + uint32_t rx_pf_valid: 1; + uint32_t ext_bit0: 1; + uint32_t ext_bit1: 1; + uint32_t ext_bit2: 1; + uint32_t ext_bit3: 1; + uint32_t rx_new_packet: 1; + uint32_t rd_retry: 1; + uint32_t gpio_sdio: 1; + uint32_t reserved26: 6; + }; + uint32_t val; + } slc0_int_clr; + union { + struct { + uint32_t tohost_bit0: 1; + uint32_t tohost_bit1: 1; + uint32_t tohost_bit2: 1; + uint32_t tohost_bit3: 1; + uint32_t tohost_bit4: 1; + uint32_t tohost_bit5: 1; + uint32_t tohost_bit6: 1; + uint32_t tohost_bit7: 1; + uint32_t token0_1to0: 1; + uint32_t token1_1to0: 1; + uint32_t token0_0to1: 1; + uint32_t token1_0to1: 1; + uint32_t rx_sof: 1; + uint32_t rx_eof: 1; + uint32_t rx_start: 1; + uint32_t tx_start: 1; + uint32_t rx_udf: 1; + uint32_t tx_ovf: 1; + uint32_t rx_pf_valid: 1; + uint32_t ext_bit0: 1; + uint32_t ext_bit1: 1; + uint32_t ext_bit2: 1; + uint32_t ext_bit3: 1; + uint32_t wifi_rx_new_packet: 1; + uint32_t rd_retry: 1; + uint32_t bt_rx_new_packet: 1; + uint32_t reserved26: 6; + }; + uint32_t val; + } slc1_int_clr; + union { + struct { + uint32_t tohost_bit0: 1; + uint32_t tohost_bit1: 1; + uint32_t tohost_bit2: 1; + uint32_t tohost_bit3: 1; + uint32_t tohost_bit4: 1; + uint32_t tohost_bit5: 1; + uint32_t tohost_bit6: 1; + uint32_t tohost_bit7: 1; + uint32_t token0_1to0: 1; + uint32_t token1_1to0: 1; + uint32_t token0_0to1: 1; + uint32_t token1_0to1: 1; + uint32_t rx_sof: 1; + uint32_t rx_eof: 1; + uint32_t rx_start: 1; + uint32_t tx_start: 1; + uint32_t rx_udf: 1; + uint32_t tx_ovf: 1; + uint32_t rx_pf_valid: 1; + uint32_t ext_bit0: 1; + uint32_t ext_bit1: 1; + uint32_t ext_bit2: 1; + uint32_t ext_bit3: 1; + uint32_t rx_new_packet: 1; + uint32_t rd_retry: 1; + uint32_t gpio_sdio: 1; + uint32_t reserved26: 6; + }; + uint32_t val; + } slc0_func1_int_ena; + union { + struct { + uint32_t tohost_bit0: 1; + uint32_t tohost_bit1: 1; + uint32_t tohost_bit2: 1; + uint32_t tohost_bit3: 1; + uint32_t tohost_bit4: 1; + uint32_t tohost_bit5: 1; + uint32_t tohost_bit6: 1; + uint32_t tohost_bit7: 1; + uint32_t token0_1to0: 1; + uint32_t token1_1to0: 1; + uint32_t token0_0to1: 1; + uint32_t token1_0to1: 1; + uint32_t rx_sof: 1; + uint32_t rx_eof: 1; + uint32_t rx_start: 1; + uint32_t tx_start: 1; + uint32_t rx_udf: 1; + uint32_t tx_ovf: 1; + uint32_t rx_pf_valid: 1; + uint32_t ext_bit0: 1; + uint32_t ext_bit1: 1; + uint32_t ext_bit2: 1; + uint32_t ext_bit3: 1; + uint32_t wifi_rx_new_packet: 1; + uint32_t rd_retry: 1; + uint32_t bt_rx_new_packet: 1; + uint32_t reserved26: 6; + }; + uint32_t val; + } slc1_func1_int_ena; + union { + struct { + uint32_t tohost_bit0: 1; + uint32_t tohost_bit1: 1; + uint32_t tohost_bit2: 1; + uint32_t tohost_bit3: 1; + uint32_t tohost_bit4: 1; + uint32_t tohost_bit5: 1; + uint32_t tohost_bit6: 1; + uint32_t tohost_bit7: 1; + uint32_t token0_1to0: 1; + uint32_t token1_1to0: 1; + uint32_t token0_0to1: 1; + uint32_t token1_0to1: 1; + uint32_t rx_sof: 1; + uint32_t rx_eof: 1; + uint32_t rx_start: 1; + uint32_t tx_start: 1; + uint32_t rx_udf: 1; + uint32_t tx_ovf: 1; + uint32_t rx_pf_valid: 1; + uint32_t ext_bit0: 1; + uint32_t ext_bit1: 1; + uint32_t ext_bit2: 1; + uint32_t ext_bit3: 1; + uint32_t rx_new_packet: 1; + uint32_t rd_retry: 1; + uint32_t gpio_sdio: 1; + uint32_t reserved26: 6; + }; + uint32_t val; + } slc0_func2_int_ena; + union { + struct { + uint32_t tohost_bit0: 1; + uint32_t tohost_bit1: 1; + uint32_t tohost_bit2: 1; + uint32_t tohost_bit3: 1; + uint32_t tohost_bit4: 1; + uint32_t tohost_bit5: 1; + uint32_t tohost_bit6: 1; + uint32_t tohost_bit7: 1; + uint32_t token0_1to0: 1; + uint32_t token1_1to0: 1; + uint32_t token0_0to1: 1; + uint32_t token1_0to1: 1; + uint32_t rx_sof: 1; + uint32_t rx_eof: 1; + uint32_t rx_start: 1; + uint32_t tx_start: 1; + uint32_t rx_udf: 1; + uint32_t tx_ovf: 1; + uint32_t rx_pf_valid: 1; + uint32_t ext_bit0: 1; + uint32_t ext_bit1: 1; + uint32_t ext_bit2: 1; + uint32_t ext_bit3: 1; + uint32_t wifi_rx_new_packet: 1; + uint32_t rd_retry: 1; + uint32_t bt_rx_new_packet: 1; + uint32_t reserved26: 6; + }; + uint32_t val; + } slc1_func2_int_ena; + union { + struct { + uint32_t tohost_bit0: 1; + uint32_t tohost_bit1: 1; + uint32_t tohost_bit2: 1; + uint32_t tohost_bit3: 1; + uint32_t tohost_bit4: 1; + uint32_t tohost_bit5: 1; + uint32_t tohost_bit6: 1; + uint32_t tohost_bit7: 1; + uint32_t token0_1to0: 1; + uint32_t token1_1to0: 1; + uint32_t token0_0to1: 1; + uint32_t token1_0to1: 1; + uint32_t rx_sof: 1; + uint32_t rx_eof: 1; + uint32_t rx_start: 1; + uint32_t tx_start: 1; + uint32_t rx_udf: 1; + uint32_t tx_ovf: 1; + uint32_t rx_pf_valid: 1; + uint32_t ext_bit0: 1; + uint32_t ext_bit1: 1; + uint32_t ext_bit2: 1; + uint32_t ext_bit3: 1; + uint32_t rx_new_packet: 1; + uint32_t rd_retry: 1; + uint32_t gpio_sdio: 1; + uint32_t reserved26: 6; + }; + uint32_t val; + } slc0_int_ena; + union { + struct { + uint32_t tohost_bit0: 1; + uint32_t tohost_bit1: 1; + uint32_t tohost_bit2: 1; + uint32_t tohost_bit3: 1; + uint32_t tohost_bit4: 1; + uint32_t tohost_bit5: 1; + uint32_t tohost_bit6: 1; + uint32_t tohost_bit7: 1; + uint32_t token0_1to0: 1; + uint32_t token1_1to0: 1; + uint32_t token0_0to1: 1; + uint32_t token1_0to1: 1; + uint32_t rx_sof: 1; + uint32_t rx_eof: 1; + uint32_t rx_start: 1; + uint32_t tx_start: 1; + uint32_t rx_udf: 1; + uint32_t tx_ovf: 1; + uint32_t rx_pf_valid: 1; + uint32_t ext_bit0: 1; + uint32_t ext_bit1: 1; + uint32_t ext_bit2: 1; + uint32_t ext_bit3: 1; + uint32_t wifi_rx_new_packet: 1; + uint32_t rd_retry: 1; + uint32_t bt_rx_new_packet: 1; + uint32_t reserved26: 6; + }; + uint32_t val; + } slc1_int_ena; + union { + struct { + uint32_t infor: 20; + uint32_t reserved20: 12; + }; + uint32_t val; + } slc0_rx_infor; + union { + struct { + uint32_t infor: 20; + uint32_t reserved20: 12; + }; + uint32_t val; + } slc1_rx_infor; + uint32_t slc0_len_wd; /**/ + uint32_t apbwin_wdata; /**/ + union { + struct { + uint32_t addr: 28; + uint32_t wr: 1; + uint32_t start: 1; + uint32_t reserved30: 2; + }; + uint32_t val; + } apbwin_conf; + uint32_t apbwin_rdata; /**/ + union { + struct { + uint32_t bit7_clraddr: 9; + uint32_t bit6_clraddr: 9; + uint32_t reserved18: 14; + }; + uint32_t val; + } slc0_rdclr; + union { + struct { + uint32_t bit7_clraddr: 9; + uint32_t bit6_clraddr: 9; + uint32_t reserved18: 14; + }; + uint32_t val; + } slc1_rdclr; + union { + struct { + uint32_t tohost_bit01: 1; + uint32_t tohost_bit11: 1; + uint32_t tohost_bit21: 1; + uint32_t tohost_bit31: 1; + uint32_t tohost_bit41: 1; + uint32_t tohost_bit51: 1; + uint32_t tohost_bit61: 1; + uint32_t tohost_bit71: 1; + uint32_t token0_1to01: 1; + uint32_t token1_1to01: 1; + uint32_t token0_0to11: 1; + uint32_t token1_0to11: 1; + uint32_t rx_sof1: 1; + uint32_t rx_eof1: 1; + uint32_t rx_start1: 1; + uint32_t tx_start1: 1; + uint32_t rx_udf1: 1; + uint32_t tx_ovf1: 1; + uint32_t rx_pf_valid1: 1; + uint32_t ext_bit01: 1; + uint32_t ext_bit11: 1; + uint32_t ext_bit21: 1; + uint32_t ext_bit31: 1; + uint32_t rx_new_packet1: 1; + uint32_t rd_retry1: 1; + uint32_t gpio_sdio1: 1; + uint32_t reserved26: 6; + }; + uint32_t val; + } slc0_int_ena1; + union { + struct { + uint32_t tohost_bit01: 1; + uint32_t tohost_bit11: 1; + uint32_t tohost_bit21: 1; + uint32_t tohost_bit31: 1; + uint32_t tohost_bit41: 1; + uint32_t tohost_bit51: 1; + uint32_t tohost_bit61: 1; + uint32_t tohost_bit71: 1; + uint32_t token0_1to01: 1; + uint32_t token1_1to01: 1; + uint32_t token0_0to11: 1; + uint32_t token1_0to11: 1; + uint32_t rx_sof1: 1; + uint32_t rx_eof1: 1; + uint32_t rx_start1: 1; + uint32_t tx_start1: 1; + uint32_t rx_udf1: 1; + uint32_t tx_ovf1: 1; + uint32_t rx_pf_valid1: 1; + uint32_t ext_bit01: 1; + uint32_t ext_bit11: 1; + uint32_t ext_bit21: 1; + uint32_t ext_bit31: 1; + uint32_t wifi_rx_new_packet1: 1; + uint32_t rd_retry1: 1; + uint32_t bt_rx_new_packet1: 1; + uint32_t reserved26: 6; + }; + uint32_t val; + } slc1_int_ena1; + 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 date; /**/ + uint32_t id; /**/ + uint32_t reserved_180; + uint32_t reserved_184; + uint32_t reserved_188; + uint32_t reserved_18c; + uint32_t reserved_190; + uint32_t reserved_194; + uint32_t reserved_198; + uint32_t reserved_19c; + uint32_t reserved_1a0; + uint32_t reserved_1a4; + uint32_t reserved_1a8; + uint32_t reserved_1ac; + uint32_t reserved_1b0; + uint32_t reserved_1b4; + uint32_t reserved_1b8; + uint32_t reserved_1bc; + uint32_t reserved_1c0; + uint32_t reserved_1c4; + uint32_t reserved_1c8; + uint32_t reserved_1cc; + uint32_t reserved_1d0; + uint32_t reserved_1d4; + uint32_t reserved_1d8; + uint32_t reserved_1dc; + uint32_t reserved_1e0; + uint32_t reserved_1e4; + uint32_t reserved_1e8; + uint32_t reserved_1ec; + union { + struct { + uint32_t frc_sdio11: 5; + uint32_t frc_sdio20: 5; + uint32_t frc_neg_samp: 5; + uint32_t frc_pos_samp: 5; + uint32_t frc_quick_in: 5; + uint32_t sdio20_int_delay: 1; + uint32_t sdio_pad_pullup: 1; + uint32_t hspeed_con_en: 1; + uint32_t reserved28: 4; + }; + uint32_t val; + } conf; + union { + struct { + uint32_t sdio20_mode: 5; + uint32_t sdio_neg_samp: 5; + uint32_t sdio_quick_in: 5; + uint32_t reserved15: 17; + }; + uint32_t val; + } inf_st; +} host_dev_t; +extern host_dev_t HOST; + +#ifdef __cplusplus +} +#endif + +#endif /* _SOC_HOST_STRUCT_H_ */ diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/hwcrypto_reg.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/hwcrypto_reg.h new file mode 100644 index 0000000000000..1db081f2b1577 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/hwcrypto_reg.h @@ -0,0 +1,74 @@ +// 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. +#ifndef __HWCRYPTO_REG_H__ +#define __HWCRYPTO_REG_H__ + +#include "soc.h" + +/* registers for RSA acceleration via Multiple Precision Integer ops */ +#define RSA_MEM_M_BLOCK_BASE ((DR_REG_RSA_BASE)+0x000) +/* RB & Z use the same memory block, depending on phase of operation */ +#define RSA_MEM_RB_BLOCK_BASE ((DR_REG_RSA_BASE)+0x200) +#define RSA_MEM_Z_BLOCK_BASE ((DR_REG_RSA_BASE)+0x200) +#define RSA_MEM_Y_BLOCK_BASE ((DR_REG_RSA_BASE)+0x400) +#define RSA_MEM_X_BLOCK_BASE ((DR_REG_RSA_BASE)+0x600) + +#define RSA_M_DASH_REG (DR_REG_RSA_BASE + 0x800) +#define RSA_MODEXP_MODE_REG (DR_REG_RSA_BASE + 0x804) +#define RSA_MODEXP_START_REG (DR_REG_RSA_BASE + 0x808) +#define RSA_MULT_MODE_REG (DR_REG_RSA_BASE + 0x80c) +#define RSA_MULT_START_REG (DR_REG_RSA_BASE + 0x810) + +#define RSA_CLEAR_INTERRUPT_REG (DR_REG_RSA_BASE + 0x814) +#define RSA_QUERY_INTERRUPT_REG (DR_REG_RSA_BASE + 0x814) /* same */ + +#define RSA_QUERY_CLEAN_REG (DR_REG_RSA_BASE + 0x818) + +/* Backwards compatibility register names used pre-ESP32S2 */ +#define RSA_CLEAN_REG (RSA_QUERY_CLEAN_REG) +#define RSA_INTERRUPT_REG (RSA_CLEAR_INTERRUPT_REG) +#define RSA_START_MODEXP_REG (RSA_MODEXP_START_REG) + +/* SHA acceleration registers */ +#define SHA_TEXT_BASE ((DR_REG_SHA_BASE) + 0x00) + +#define SHA_1_START_REG ((DR_REG_SHA_BASE) + 0x80) +#define SHA_1_CONTINUE_REG ((DR_REG_SHA_BASE) + 0x84) +#define SHA_1_LOAD_REG ((DR_REG_SHA_BASE) + 0x88) +#define SHA_1_BUSY_REG ((DR_REG_SHA_BASE) + 0x8c) + +#define SHA_256_START_REG ((DR_REG_SHA_BASE) + 0x90) +#define SHA_256_CONTINUE_REG ((DR_REG_SHA_BASE) + 0x94) +#define SHA_256_LOAD_REG ((DR_REG_SHA_BASE) + 0x98) +#define SHA_256_BUSY_REG ((DR_REG_SHA_BASE) + 0x9c) + +#define SHA_384_START_REG ((DR_REG_SHA_BASE) + 0xa0) +#define SHA_384_CONTINUE_REG ((DR_REG_SHA_BASE) + 0xa4) +#define SHA_384_LOAD_REG ((DR_REG_SHA_BASE) + 0xa8) +#define SHA_384_BUSY_REG ((DR_REG_SHA_BASE) + 0xac) + +#define SHA_512_START_REG ((DR_REG_SHA_BASE) + 0xb0) +#define SHA_512_CONTINUE_REG ((DR_REG_SHA_BASE) + 0xb4) +#define SHA_512_LOAD_REG ((DR_REG_SHA_BASE) + 0xb8) +#define SHA_512_BUSY_REG ((DR_REG_SHA_BASE) + 0xbc) + +/* AES acceleration registers */ +#define AES_START_REG ((DR_REG_AES_BASE) + 0x00) +#define AES_IDLE_REG ((DR_REG_AES_BASE) + 0x04) +#define AES_MODE_REG ((DR_REG_AES_BASE) + 0x08) +#define AES_KEY_BASE ((DR_REG_AES_BASE) + 0x10) +#define AES_TEXT_BASE ((DR_REG_AES_BASE) + 0x30) +#define AES_ENDIAN ((DR_REG_AES_BASE) + 0x40) + +#endif diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/i2c_caps.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/i2c_caps.h new file mode 100644 index 0000000000000..d2fec80990ca7 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/i2c_caps.h @@ -0,0 +1,36 @@ +// Copyright 2010-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 + +#ifdef __cplusplus +extern "C" { +#endif + +// ESP32 have 2 I2C. +#define SOC_I2C_NUM (2) + +#define SOC_I2C_FIFO_LEN (32) /*!< I2C hardware FIFO depth */ +#define I2C_INTR_MASK (0x3fff) /*!< I2C all interrupt bitmap */ + +//ESP32 do not support hardware FSM reset +#define I2C_SUPPORT_HW_FSM_RST (0) +//ESP32 do not support hardware clear bus +#define I2C_SUPPORT_HW_CLR_BUS (0) + +#ifdef __cplusplus +} +#endif + + diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/i2c_reg.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/i2c_reg.h new file mode 100644 index 0000000000000..292695eb7f35c --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/i2c_reg.h @@ -0,0 +1,951 @@ +// 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. +#ifndef _SOC_I2C_REG_H_ +#define _SOC_I2C_REG_H_ + + +#include "soc.h" + +#define REG_I2C_BASE(i) (DR_REG_I2C_EXT_BASE + (i) * 0x14000 ) + +#define I2C_SCL_LOW_PERIOD_REG(i) (REG_I2C_BASE(i) + 0x0000) +/* I2C_SCL_LOW_PERIOD : R/W ;bitpos:[13:0] ;default: 14'b0 ; */ +/*description: This register is used to configure the low level width of SCL clock.*/ +#define I2C_SCL_LOW_PERIOD 0x00003FFF +#define I2C_SCL_LOW_PERIOD_M ((I2C_SCL_LOW_PERIOD_V)<<(I2C_SCL_LOW_PERIOD_S)) +#define I2C_SCL_LOW_PERIOD_V 0x3FFF +#define I2C_SCL_LOW_PERIOD_S 0 + +#define I2C_CTR_REG(i) (REG_I2C_BASE(i) + 0x0004) +/* I2C_CLK_EN : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: This is the clock gating control bit for reading or writing registers.*/ +#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 datas. + 1: receive data from most significant bit 0: receive data from least 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 need to + be send. 1: receive data from most significant bit 0: receive data from least 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 : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: Set this bit to start sending 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 i2c master clear this + bit to configure the module as 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_SAMPLE_SCL_LEVEL : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: Set this bit to sample data in SCL low level. clear this bit + to sample data in 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: 1: normally ouput scl clock 0: exchange the function of scl_o + and scl_oe (scl_o is the original internal output scl signal scl_oe is the enable bit for the internal output scl signal)*/ +#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: 1: normally ouput sda data 0: exchange the function of sda_o + and sda_oe (sda_o is the original internal output sda signal sda_oe is the enable bit for the internal output sda signal)*/ +#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_S 0 + +#define I2C_SR_REG(i) (REG_I2C_BASE(i) + 0x0008) +/* I2C_SCL_STATE_LAST : RO ;bitpos:[30:28] ;default: 3'b0 ; */ +/*description: This register stores the value of state machine to produce SCL. + 3'h0: SCL_IDLE 3'h1:SCL_START 3'h2:SCL_LOW_EDGE 3'h3: SCL_LOW 3'h4:SCL_HIGH_EDGE 3'h5:SCL_HIGH 3'h6:SCL_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 register stores the value of state machine for i2c module. + 3'h0: SCL_MAIN_IDLE 3'h1: SCL_ADDRESS_SHIFT 3'h2: SCL_ACK_ADDRESS 3'h3: SCL_RX_DATA 3'h4 SCL_TX_DATA 3'h5:SCL_SEND_ACK 3'h6:SCL_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 register 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_RXFIFO_CNT : RO ;bitpos:[13:8] ;default: 6'b0 ; */ +/*description: This register represent the amount of data need to send.*/ +#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_BYTE_TRANS : RO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: This register changes to high level when one byte is transferred.*/ +#define I2C_BYTE_TRANS (BIT(6)) +#define I2C_BYTE_TRANS_M (BIT(6)) +#define I2C_BYTE_TRANS_V 0x1 +#define I2C_BYTE_TRANS_S 6 +/* I2C_SLAVE_ADDRESSED : RO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: when configured as i2c slave and the address send by master + is equal to slave's address then this bit will be 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:I2C bus is busy transferring data. 0: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 I2C lost control of SDA line this register changes to high level.*/ +#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_TIME_OUT : RO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: when I2C takes more than time_out_reg clocks to receive a data + then this register changes to high level.*/ +#define I2C_TIME_OUT (BIT(2)) +#define I2C_TIME_OUT_M (BIT(2)) +#define I2C_TIME_OUT_V 0x1 +#define I2C_TIME_OUT_S 2 +/* I2C_SLAVE_RW : RO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: when in slave mode 1: master read slave 0: master write 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_ACK_REC : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: This register stores the value of ACK bit.*/ +#define I2C_ACK_REC (BIT(0)) +#define I2C_ACK_REC_M (BIT(0)) +#define I2C_ACK_REC_V 0x1 +#define I2C_ACK_REC_S 0 + +#define I2C_TO_REG(i) (REG_I2C_BASE(i) + 0x000c) +/* I2C_TIME_OUT_REG : R/W ;bitpos:[19:0] ;default: 20'b0 ; */ +/*description: This register is used to configure the max clock number of receiving a data.*/ +#define I2C_TIME_OUT_REG 0x000FFFFF +#define I2C_TIME_OUT_REG_M ((I2C_TIME_OUT_REG_V)<<(I2C_TIME_OUT_REG_S)) +#define I2C_TIME_OUT_REG_V 0xFFFFF +#define I2C_TIME_OUT_REG_S 0 + +#define I2C_SLAVE_ADDR_REG(i) (REG_I2C_BASE(i) + 0x0010) +/* I2C_ADDR_10BIT_EN : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: This register is used to enable slave 10bit address 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 i2c slave this register is used to configure + slave's address.*/ +#define I2C_SLAVE_ADDR 0x00007FFF +#define I2C_SLAVE_ADDR_M ((I2C_SLAVE_ADDR_V)<<(I2C_SLAVE_ADDR_S)) +#define I2C_SLAVE_ADDR_V 0x7FFF +#define I2C_SLAVE_ADDR_S 0 + +#define I2C_RXFIFO_ST_REG(i) (REG_I2C_BASE(i) + 0x0014) +/* I2C_TXFIFO_END_ADDR : RO ;bitpos:[19:15] ;default: 5'b0 ; */ +/*description: This is the offset address of the last sending data as described + in nonfifo_tx_thres register.*/ +#define I2C_TXFIFO_END_ADDR 0x0000001F +#define I2C_TXFIFO_END_ADDR_M ((I2C_TXFIFO_END_ADDR_V)<<(I2C_TXFIFO_END_ADDR_S)) +#define I2C_TXFIFO_END_ADDR_V 0x1F +#define I2C_TXFIFO_END_ADDR_S 15 +/* I2C_TXFIFO_START_ADDR : RO ;bitpos:[14:10] ;default: 5'b0 ; */ +/*description: This is the offset address of the first sending data as described + in nonfifo_tx_thres register.*/ +#define I2C_TXFIFO_START_ADDR 0x0000001F +#define I2C_TXFIFO_START_ADDR_M ((I2C_TXFIFO_START_ADDR_V)<<(I2C_TXFIFO_START_ADDR_S)) +#define I2C_TXFIFO_START_ADDR_V 0x1F +#define I2C_TXFIFO_START_ADDR_S 10 +/* I2C_RXFIFO_END_ADDR : RO ;bitpos:[9:5] ;default: 5'b0 ; */ +/*description: This is the offset address of the first receiving data as described + in nonfifo_rx_thres_register.*/ +#define I2C_RXFIFO_END_ADDR 0x0000001F +#define I2C_RXFIFO_END_ADDR_M ((I2C_RXFIFO_END_ADDR_V)<<(I2C_RXFIFO_END_ADDR_S)) +#define I2C_RXFIFO_END_ADDR_V 0x1F +#define I2C_RXFIFO_END_ADDR_S 5 +/* I2C_RXFIFO_START_ADDR : RO ;bitpos:[4:0] ;default: 5'b0 ; */ +/*description: This is the offset address of the last receiving data as described + in nonfifo_rx_thres_register.*/ +#define I2C_RXFIFO_START_ADDR 0x0000001F +#define I2C_RXFIFO_START_ADDR_M ((I2C_RXFIFO_START_ADDR_V)<<(I2C_RXFIFO_START_ADDR_S)) +#define I2C_RXFIFO_START_ADDR_V 0x1F +#define I2C_RXFIFO_START_ADDR_S 0 + +#define I2C_FIFO_CONF_REG(i) (REG_I2C_BASE(i) + 0x0018) +/* I2C_NONFIFO_TX_THRES : R/W ;bitpos:[25:20] ;default: 6'h15 ; */ +/*description: when I2C sends more than nonfifo_tx_thres data it will produce + tx_send_empty_int_raw interrupt and update the current offset address of the sending data.*/ +#define I2C_NONFIFO_TX_THRES 0x0000003F +#define I2C_NONFIFO_TX_THRES_M ((I2C_NONFIFO_TX_THRES_V)<<(I2C_NONFIFO_TX_THRES_S)) +#define I2C_NONFIFO_TX_THRES_V 0x3F +#define I2C_NONFIFO_TX_THRES_S 20 +/* I2C_NONFIFO_RX_THRES : R/W ;bitpos:[19:14] ;default: 6'h15 ; */ +/*description: when I2C receives more than nonfifo_rx_thres data it will produce + rx_send_full_int_raw interrupt and update the current offset address of the receiving data.*/ +#define I2C_NONFIFO_RX_THRES 0x0000003F +#define I2C_NONFIFO_RX_THRES_M ((I2C_NONFIFO_RX_THRES_V)<<(I2C_NONFIFO_RX_THRES_S)) +#define I2C_NONFIFO_RX_THRES_V 0x3F +#define I2C_NONFIFO_RX_THRES_S 14 +/* I2C_TX_FIFO_RST : R/W ;bitpos:[13] ;default: 1'b0 ; */ +/*description: Set this bit to reset tx fifo when using apb fifo access.*/ +#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 when using apb fifo access.*/ +#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 then the byte after address represent + the offset address of I2C Slave's 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 enble 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_EMPTY_THRHD : R/W ;bitpos:[9:5] ;default: 5'h4 ; */ +/*description: Config txfifo empty threhd value when using apb fifo access*/ +#define I2C_TXFIFO_EMPTY_THRHD 0x0000001F +#define I2C_TXFIFO_EMPTY_THRHD_M ((I2C_TXFIFO_EMPTY_THRHD_V)<<(I2C_TXFIFO_EMPTY_THRHD_S)) +#define I2C_TXFIFO_EMPTY_THRHD_V 0x1F +#define I2C_TXFIFO_EMPTY_THRHD_S 5 +/* I2C_RXFIFO_FULL_THRHD : R/W ;bitpos:[4:0] ;default: 5'hb ; */ +/*description: */ +#define I2C_RXFIFO_FULL_THRHD 0x0000001F +#define I2C_RXFIFO_FULL_THRHD_M ((I2C_RXFIFO_FULL_THRHD_V)<<(I2C_RXFIFO_FULL_THRHD_S)) +#define I2C_RXFIFO_FULL_THRHD_V 0x1F +#define I2C_RXFIFO_FULL_THRHD_S 0 + +#define I2C_DATA_APB_REG(i) (0x60013000 + (i) * 0x14000 + 0x001c) + +#define I2C_DATA_REG(i) (REG_I2C_BASE(i) + 0x001c) +/* I2C_FIFO_RDATA : RO ;bitpos:[7:0] ;default: 8'b0 ; */ +/*description: The register represent the byte data read from rxfifo when use apb fifo access*/ +#define I2C_FIFO_RDATA 0x000000FF +#define I2C_FIFO_RDATA_M ((I2C_FIFO_RDATA_V)<<(I2C_FIFO_RDATA_S)) +#define I2C_FIFO_RDATA_V 0xFF +#define I2C_FIFO_RDATA_S 0 + +#define I2C_INT_RAW_REG(i) (REG_I2C_BASE(i) + 0x0020) +/* I2C_TX_SEND_EMPTY_INT_RAW : RO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: The raw interrupt status bit for tx_send_empty_int interrupt.when + I2C sends more data than nonfifo_tx_thres it will produce tx_send_empty_int interrupt..*/ +#define I2C_TX_SEND_EMPTY_INT_RAW (BIT(12)) +#define I2C_TX_SEND_EMPTY_INT_RAW_M (BIT(12)) +#define I2C_TX_SEND_EMPTY_INT_RAW_V 0x1 +#define I2C_TX_SEND_EMPTY_INT_RAW_S 12 +/* I2C_RX_REC_FULL_INT_RAW : RO ;bitpos:[11] ;default: 1'b0 ; */ +/*description: The raw interrupt status bit for rx_rec_full_int interrupt. when + I2C receives more data than nonfifo_rx_thres it will produce rx_rec_full_int interrupt.*/ +#define I2C_RX_REC_FULL_INT_RAW (BIT(11)) +#define I2C_RX_REC_FULL_INT_RAW_M (BIT(11)) +#define I2C_RX_REC_FULL_INT_RAW_V 0x1 +#define I2C_RX_REC_FULL_INT_RAW_S 11 +/* I2C_ACK_ERR_INT_RAW : RO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: The raw interrupt status bit for ack_err_int interrupt. when + I2C receives a wrong ACK bit it will produce ack_err_int interrupt..*/ +#define I2C_ACK_ERR_INT_RAW (BIT(10)) +#define I2C_ACK_ERR_INT_RAW_M (BIT(10)) +#define I2C_ACK_ERR_INT_RAW_V 0x1 +#define I2C_ACK_ERR_INT_RAW_S 10 +/* I2C_TRANS_START_INT_RAW : RO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: The raw interrupt status bit for trans_start_int interrupt. when + I2C sends the START bit it will produce 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 : RO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: The raw interrupt status bit for time_out_int interrupt. when + I2C takes a lot of time to receive a data it will produce 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 : RO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: The raw interrupt status bit for trans_complete_int interrupt. + when I2C Master finished STOP command it will produce 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_MASTER_TRAN_COMP_INT_RAW : RO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: The raw interrupt status bit for master_tra_comp_int interrupt. + when I2C Master sends or receives a byte it will produce master_tran_comp_int interrupt.*/ +#define I2C_MASTER_TRAN_COMP_INT_RAW (BIT(6)) +#define I2C_MASTER_TRAN_COMP_INT_RAW_M (BIT(6)) +#define I2C_MASTER_TRAN_COMP_INT_RAW_V 0x1 +#define I2C_MASTER_TRAN_COMP_INT_RAW_S 6 +/* I2C_ARBITRATION_LOST_INT_RAW : RO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: The raw interrupt status bit for arbitration_lost_int interrupt.when + I2C lost the usage right of I2C BUS it will produce 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_SLAVE_TRAN_COMP_INT_RAW : RO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: The raw interrupt status bit for slave_tran_comp_int interrupt. + when I2C Slave detectsthe STOP bit it will produce slave_tran_comp_int interrupt.*/ +#define I2C_SLAVE_TRAN_COMP_INT_RAW (BIT(4)) +#define I2C_SLAVE_TRAN_COMP_INT_RAW_M (BIT(4)) +#define I2C_SLAVE_TRAN_COMP_INT_RAW_V 0x1 +#define I2C_SLAVE_TRAN_COMP_INT_RAW_S 4 +/* I2C_END_DETECT_INT_RAW : RO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: The raw interrupt status bit for end_detect_int interrupt. when + I2C deals with the END command it will produce 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 : RO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: The raw interrupt status bit for receiving data overflow when + use apb fifo access.*/ +#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_EMPTY_INT_RAW : RO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: The raw interrupt status bit for txfifo empty when use apb fifo access.*/ +#define I2C_TXFIFO_EMPTY_INT_RAW (BIT(1)) +#define I2C_TXFIFO_EMPTY_INT_RAW_M (BIT(1)) +#define I2C_TXFIFO_EMPTY_INT_RAW_V 0x1 +#define I2C_TXFIFO_EMPTY_INT_RAW_S 1 +/* I2C_RXFIFO_FULL_INT_RAW : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: The raw interrupt status bit for rxfifo full when use apb fifo access.*/ +#define I2C_RXFIFO_FULL_INT_RAW (BIT(0)) +#define I2C_RXFIFO_FULL_INT_RAW_M (BIT(0)) +#define I2C_RXFIFO_FULL_INT_RAW_V 0x1 +#define I2C_RXFIFO_FULL_INT_RAW_S 0 + +#define I2C_INT_CLR_REG(i) (REG_I2C_BASE(i) + 0x0024) +/* I2C_TX_SEND_EMPTY_INT_CLR : WO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: Set this bit to clear the tx_send_empty_int interrupt.*/ +#define I2C_TX_SEND_EMPTY_INT_CLR (BIT(12)) +#define I2C_TX_SEND_EMPTY_INT_CLR_M (BIT(12)) +#define I2C_TX_SEND_EMPTY_INT_CLR_V 0x1 +#define I2C_TX_SEND_EMPTY_INT_CLR_S 12 +/* I2C_RX_REC_FULL_INT_CLR : WO ;bitpos:[11] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rx_rec_full_int interrupt.*/ +#define I2C_RX_REC_FULL_INT_CLR (BIT(11)) +#define I2C_RX_REC_FULL_INT_CLR_M (BIT(11)) +#define I2C_RX_REC_FULL_INT_CLR_V 0x1 +#define I2C_RX_REC_FULL_INT_CLR_S 11 +/* I2C_ACK_ERR_INT_CLR : WO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: Set this bit to clear the ack_err_int interrupt.*/ +#define I2C_ACK_ERR_INT_CLR (BIT(10)) +#define I2C_ACK_ERR_INT_CLR_M (BIT(10)) +#define I2C_ACK_ERR_INT_CLR_V 0x1 +#define I2C_ACK_ERR_INT_CLR_S 10 +/* I2C_TRANS_START_INT_CLR : WO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: Set this bit to clear the 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 : WO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: Set this bit to clear the 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 : WO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: Set this bit to clear the 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_MASTER_TRAN_COMP_INT_CLR : WO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: Set this bit to clear the master_tran_comp interrupt.*/ +#define I2C_MASTER_TRAN_COMP_INT_CLR (BIT(6)) +#define I2C_MASTER_TRAN_COMP_INT_CLR_M (BIT(6)) +#define I2C_MASTER_TRAN_COMP_INT_CLR_V 0x1 +#define I2C_MASTER_TRAN_COMP_INT_CLR_S 6 +/* I2C_ARBITRATION_LOST_INT_CLR : WO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: Set this bit to clear the 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_SLAVE_TRAN_COMP_INT_CLR : WO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: Set this bit to clear the slave_tran_comp_int interrupt.*/ +#define I2C_SLAVE_TRAN_COMP_INT_CLR (BIT(4)) +#define I2C_SLAVE_TRAN_COMP_INT_CLR_M (BIT(4)) +#define I2C_SLAVE_TRAN_COMP_INT_CLR_V 0x1 +#define I2C_SLAVE_TRAN_COMP_INT_CLR_S 4 +/* I2C_END_DETECT_INT_CLR : WO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: Set this bit to clear the 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 : WO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: Set this bit to clear the 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_EMPTY_INT_CLR : WO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: Set this bit to clear the txfifo_empty_int interrupt.*/ +#define I2C_TXFIFO_EMPTY_INT_CLR (BIT(1)) +#define I2C_TXFIFO_EMPTY_INT_CLR_M (BIT(1)) +#define I2C_TXFIFO_EMPTY_INT_CLR_V 0x1 +#define I2C_TXFIFO_EMPTY_INT_CLR_S 1 +/* I2C_RXFIFO_FULL_INT_CLR : WO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rxfifo_full_int interrupt.*/ +#define I2C_RXFIFO_FULL_INT_CLR (BIT(0)) +#define I2C_RXFIFO_FULL_INT_CLR_M (BIT(0)) +#define I2C_RXFIFO_FULL_INT_CLR_V 0x1 +#define I2C_RXFIFO_FULL_INT_CLR_S 0 + +#define I2C_INT_ENA_REG(i) (REG_I2C_BASE(i) + 0x0028) +/* I2C_TX_SEND_EMPTY_INT_ENA : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: The enable bit for tx_send_empty_int interrupt.*/ +#define I2C_TX_SEND_EMPTY_INT_ENA (BIT(12)) +#define I2C_TX_SEND_EMPTY_INT_ENA_M (BIT(12)) +#define I2C_TX_SEND_EMPTY_INT_ENA_V 0x1 +#define I2C_TX_SEND_EMPTY_INT_ENA_S 12 +/* I2C_RX_REC_FULL_INT_ENA : R/W ;bitpos:[11] ;default: 1'b0 ; */ +/*description: The enable bit for rx_rec_full_int interrupt.*/ +#define I2C_RX_REC_FULL_INT_ENA (BIT(11)) +#define I2C_RX_REC_FULL_INT_ENA_M (BIT(11)) +#define I2C_RX_REC_FULL_INT_ENA_V 0x1 +#define I2C_RX_REC_FULL_INT_ENA_S 11 +/* I2C_ACK_ERR_INT_ENA : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: The enable bit for ack_err_int interrupt.*/ +#define I2C_ACK_ERR_INT_ENA (BIT(10)) +#define I2C_ACK_ERR_INT_ENA_M (BIT(10)) +#define I2C_ACK_ERR_INT_ENA_V 0x1 +#define I2C_ACK_ERR_INT_ENA_S 10 +/* I2C_TRANS_START_INT_ENA : R/W ;bitpos:[9] ;default: 1'b0 ; */ +/*description: The enable bit for 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 enable bit for 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 enable bit for 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_MASTER_TRAN_COMP_INT_ENA : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: The enable bit for master_tran_comp_int interrupt.*/ +#define I2C_MASTER_TRAN_COMP_INT_ENA (BIT(6)) +#define I2C_MASTER_TRAN_COMP_INT_ENA_M (BIT(6)) +#define I2C_MASTER_TRAN_COMP_INT_ENA_V 0x1 +#define I2C_MASTER_TRAN_COMP_INT_ENA_S 6 +/* I2C_ARBITRATION_LOST_INT_ENA : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: The enable bit for 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_SLAVE_TRAN_COMP_INT_ENA : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: The enable bit for slave_tran_comp_int interrupt.*/ +#define I2C_SLAVE_TRAN_COMP_INT_ENA (BIT(4)) +#define I2C_SLAVE_TRAN_COMP_INT_ENA_M (BIT(4)) +#define I2C_SLAVE_TRAN_COMP_INT_ENA_V 0x1 +#define I2C_SLAVE_TRAN_COMP_INT_ENA_S 4 +/* I2C_END_DETECT_INT_ENA : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: The enable bit for 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 enable bit for 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_EMPTY_INT_ENA : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: The enable bit for txfifo_empty_int interrupt.*/ +#define I2C_TXFIFO_EMPTY_INT_ENA (BIT(1)) +#define I2C_TXFIFO_EMPTY_INT_ENA_M (BIT(1)) +#define I2C_TXFIFO_EMPTY_INT_ENA_V 0x1 +#define I2C_TXFIFO_EMPTY_INT_ENA_S 1 +/* I2C_RXFIFO_FULL_INT_ENA : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: The enable bit for rxfifo_full_int interrupt.*/ +#define I2C_RXFIFO_FULL_INT_ENA (BIT(0)) +#define I2C_RXFIFO_FULL_INT_ENA_M (BIT(0)) +#define I2C_RXFIFO_FULL_INT_ENA_V 0x1 +#define I2C_RXFIFO_FULL_INT_ENA_S 0 + +#define I2C_INT_STATUS_REG(i) (REG_I2C_BASE(i) + 0x002c) +/* I2C_TX_SEND_EMPTY_INT_ST : RO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: The masked interrupt status for tx_send_empty_int interrupt.*/ +#define I2C_TX_SEND_EMPTY_INT_ST (BIT(12)) +#define I2C_TX_SEND_EMPTY_INT_ST_M (BIT(12)) +#define I2C_TX_SEND_EMPTY_INT_ST_V 0x1 +#define I2C_TX_SEND_EMPTY_INT_ST_S 12 +/* I2C_RX_REC_FULL_INT_ST : RO ;bitpos:[11] ;default: 1'b0 ; */ +/*description: The masked interrupt status for rx_rec_full_int interrupt.*/ +#define I2C_RX_REC_FULL_INT_ST (BIT(11)) +#define I2C_RX_REC_FULL_INT_ST_M (BIT(11)) +#define I2C_RX_REC_FULL_INT_ST_V 0x1 +#define I2C_RX_REC_FULL_INT_ST_S 11 +/* I2C_ACK_ERR_INT_ST : RO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: The masked interrupt status for ack_err_int interrupt.*/ +#define I2C_ACK_ERR_INT_ST (BIT(10)) +#define I2C_ACK_ERR_INT_ST_M (BIT(10)) +#define I2C_ACK_ERR_INT_ST_V 0x1 +#define I2C_ACK_ERR_INT_ST_S 10 +/* I2C_TRANS_START_INT_ST : RO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: The masked interrupt status for 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 for 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 for 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_MASTER_TRAN_COMP_INT_ST : RO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: The masked interrupt status for master_tran_comp_int interrupt.*/ +#define I2C_MASTER_TRAN_COMP_INT_ST (BIT(6)) +#define I2C_MASTER_TRAN_COMP_INT_ST_M (BIT(6)) +#define I2C_MASTER_TRAN_COMP_INT_ST_V 0x1 +#define I2C_MASTER_TRAN_COMP_INT_ST_S 6 +/* I2C_ARBITRATION_LOST_INT_ST : RO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: The masked interrupt status for 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_SLAVE_TRAN_COMP_INT_ST : RO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: The masked interrupt status for slave_tran_comp_int interrupt.*/ +#define I2C_SLAVE_TRAN_COMP_INT_ST (BIT(4)) +#define I2C_SLAVE_TRAN_COMP_INT_ST_M (BIT(4)) +#define I2C_SLAVE_TRAN_COMP_INT_ST_V 0x1 +#define I2C_SLAVE_TRAN_COMP_INT_ST_S 4 +/* I2C_END_DETECT_INT_ST : RO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: The masked interrupt status for 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 for 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_EMPTY_INT_ST : RO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: The masked interrupt status for txfifo_empty_int interrupt.*/ +#define I2C_TXFIFO_EMPTY_INT_ST (BIT(1)) +#define I2C_TXFIFO_EMPTY_INT_ST_M (BIT(1)) +#define I2C_TXFIFO_EMPTY_INT_ST_V 0x1 +#define I2C_TXFIFO_EMPTY_INT_ST_S 1 +/* I2C_RXFIFO_FULL_INT_ST : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: The masked interrupt status for rxfifo_full_int interrupt.*/ +#define I2C_RXFIFO_FULL_INT_ST (BIT(0)) +#define I2C_RXFIFO_FULL_INT_ST_M (BIT(0)) +#define I2C_RXFIFO_FULL_INT_ST_V 0x1 +#define I2C_RXFIFO_FULL_INT_ST_S 0 + +#define I2C_SDA_HOLD_REG(i) (REG_I2C_BASE(i) + 0x0030) +/* I2C_SDA_HOLD_TIME : R/W ;bitpos:[9:0] ;default: 10'b0 ; */ +/*description: This register is used to configure the clock num I2C used to + hold the data after the negedge of SCL.*/ +#define I2C_SDA_HOLD_TIME 0x000003FF +#define I2C_SDA_HOLD_TIME_M ((I2C_SDA_HOLD_TIME_V)<<(I2C_SDA_HOLD_TIME_S)) +#define I2C_SDA_HOLD_TIME_V 0x3FF +#define I2C_SDA_HOLD_TIME_S 0 + +#define I2C_SDA_SAMPLE_REG(i) (REG_I2C_BASE(i) + 0x0034) +/* I2C_SDA_SAMPLE_TIME : R/W ;bitpos:[9:0] ;default: 10'b0 ; */ +/*description: This register is used to configure the clock num I2C used to + sample data on SDA after the posedge of SCL*/ +#define I2C_SDA_SAMPLE_TIME 0x000003FF +#define I2C_SDA_SAMPLE_TIME_M ((I2C_SDA_SAMPLE_TIME_V)<<(I2C_SDA_SAMPLE_TIME_S)) +#define I2C_SDA_SAMPLE_TIME_V 0x3FF +#define I2C_SDA_SAMPLE_TIME_S 0 + +#define I2C_SCL_HIGH_PERIOD_REG(i) (REG_I2C_BASE(i) + 0x0038) +/* I2C_SCL_HIGH_PERIOD : R/W ;bitpos:[13:0] ;default: 14'b0 ; */ +/*description: This register is used to configure the clock num during SCL is low level.*/ +#define I2C_SCL_HIGH_PERIOD 0x00003FFF +#define I2C_SCL_HIGH_PERIOD_M ((I2C_SCL_HIGH_PERIOD_V)<<(I2C_SCL_HIGH_PERIOD_S)) +#define I2C_SCL_HIGH_PERIOD_V 0x3FFF +#define I2C_SCL_HIGH_PERIOD_S 0 + +#define I2C_SCL_START_HOLD_REG(i) (REG_I2C_BASE(i) + 0x0040) +/* I2C_SCL_START_HOLD_TIME : R/W ;bitpos:[9:0] ;default: 10'b1000 ; */ +/*description: This register is used to configure the clock num between the + negedge of SDA and negedge of SCL for start mark.*/ +#define I2C_SCL_START_HOLD_TIME 0x000003FF +#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 0x3FF +#define I2C_SCL_START_HOLD_TIME_S 0 + +#define I2C_SCL_RSTART_SETUP_REG(i) (REG_I2C_BASE(i) + 0x0044) +/* I2C_SCL_RSTART_SETUP_TIME : R/W ;bitpos:[9:0] ;default: 10'b1000 ; */ +/*description: This register is used to configure the clock num between the + posedge of SCL and the negedge of SDA for restart mark.*/ +#define I2C_SCL_RSTART_SETUP_TIME 0x000003FF +#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 0x3FF +#define I2C_SCL_RSTART_SETUP_TIME_S 0 + +#define I2C_SCL_STOP_HOLD_REG(i) (REG_I2C_BASE(i) + 0x0048) +/* I2C_SCL_STOP_HOLD_TIME : R/W ;bitpos:[13:0] ;default: 14'b0 ; */ +/*description: This register is used to configure the clock num after the STOP bit's posedge.*/ +#define I2C_SCL_STOP_HOLD_TIME 0x00003FFF +#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 0x3FFF +#define I2C_SCL_STOP_HOLD_TIME_S 0 + +#define I2C_SCL_STOP_SETUP_REG(i) (REG_I2C_BASE(i) + 0x004C) +/* I2C_SCL_STOP_SETUP_TIME : R/W ;bitpos:[9:0] ;default: 10'b0 ; */ +/*description: This register is used to configure the clock num between the + posedge of SCL and the posedge of SDA.*/ +#define I2C_SCL_STOP_SETUP_TIME 0x000003FF +#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 0x3FF +#define I2C_SCL_STOP_SETUP_TIME_S 0 + +#define I2C_SCL_FILTER_CFG_REG(i) (REG_I2C_BASE(i) + 0x0050) +/* I2C_SCL_FILTER_EN : R/W ;bitpos:[3] ;default: 1'b1 ; */ +/*description: This is the filter enable bit for SCL.*/ +#define I2C_SCL_FILTER_EN (BIT(3)) +#define I2C_SCL_FILTER_EN_M (BIT(3)) +#define I2C_SCL_FILTER_EN_V 0x1 +#define I2C_SCL_FILTER_EN_S 3 +/* I2C_SCL_FILTER_THRES : R/W ;bitpos:[2:0] ;default: 3'b0 ; */ +/*description: When input SCL's pulse width is smaller than this register value + I2C ignores this pulse.*/ +#define I2C_SCL_FILTER_THRES 0x00000007 +#define I2C_SCL_FILTER_THRES_M ((I2C_SCL_FILTER_THRES_V)<<(I2C_SCL_FILTER_THRES_S)) +#define I2C_SCL_FILTER_THRES_V 0x7 +#define I2C_SCL_FILTER_THRES_S 0 + +#define I2C_SDA_FILTER_CFG_REG(i) (REG_I2C_BASE(i) + 0x0054) +/* I2C_SDA_FILTER_EN : R/W ;bitpos:[3] ;default: 1'b1 ; */ +/*description: This is the filter enable bit for SDA.*/ +#define I2C_SDA_FILTER_EN (BIT(3)) +#define I2C_SDA_FILTER_EN_M (BIT(3)) +#define I2C_SDA_FILTER_EN_V 0x1 +#define I2C_SDA_FILTER_EN_S 3 +/* I2C_SDA_FILTER_THRES : R/W ;bitpos:[2:0] ;default: 3'b0 ; */ +/*description: When input SCL's pulse width is smaller than this register value + I2C ignores this pulse.*/ +#define I2C_SDA_FILTER_THRES 0x00000007 +#define I2C_SDA_FILTER_THRES_M ((I2C_SDA_FILTER_THRES_V)<<(I2C_SDA_FILTER_THRES_S)) +#define I2C_SDA_FILTER_THRES_V 0x7 +#define I2C_SDA_FILTER_THRES_S 0 + +#define I2C_COMD0_REG(i) (REG_I2C_BASE(i) + 0x0058) +/* I2C_COMMAND0_DONE : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: When command0 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 command0. It consists of three part. op_code + is the command 0: RSTART 1: WRITE 2: READ 3: STOP . 4:END. Byte_num represent the number of data need to be send or data need to be received. ack_check_en ack_exp and ack value are used to control the ack bit.*/ +#define I2C_COMMAND0 0x00003FFF +#define I2C_COMMAND0_M ((I2C_COMMAND0_V)<<(I2C_COMMAND0_S)) +#define I2C_COMMAND0_V 0x3FFF +#define I2C_COMMAND0_S 0 + +#define I2C_COMD1_REG(i) (REG_I2C_BASE(i) + 0x005C) +/* I2C_COMMAND1_DONE : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: When command1 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 command1. It consists of three part. op_code + is the command 0: RSTART 1: WRITE 2: READ 3: STOP . 4:END. Byte_num represent the number of data need to be send or data need to be received. ack_check_en ack_exp and ack value are used to control the ack bit.*/ +#define I2C_COMMAND1 0x00003FFF +#define I2C_COMMAND1_M ((I2C_COMMAND1_V)<<(I2C_COMMAND1_S)) +#define I2C_COMMAND1_V 0x3FFF +#define I2C_COMMAND1_S 0 + +#define I2C_COMD2_REG(i) (REG_I2C_BASE(i) + 0x0060) +/* I2C_COMMAND2_DONE : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: When command2 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 command2. It consists of three part. op_code + is the command 0: RSTART 1: WRITE 2: READ 3: STOP . 4:END. Byte_num represent the number of data need to be send or data need to be received. ack_check_en ack_exp and ack value are used to control the ack bit.*/ +#define I2C_COMMAND2 0x00003FFF +#define I2C_COMMAND2_M ((I2C_COMMAND2_V)<<(I2C_COMMAND2_S)) +#define I2C_COMMAND2_V 0x3FFF +#define I2C_COMMAND2_S 0 + +#define I2C_COMD3_REG(i) (REG_I2C_BASE(i) + 0x0064) +/* I2C_COMMAND3_DONE : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: When command3 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 command3. It consists of three part. op_code + is the command 0: RSTART 1: WRITE 2: READ 3: STOP . 4:END. Byte_num represent the number of data need to be send or data need to be received. ack_check_en ack_exp and ack value are used to control the ack bit.*/ +#define I2C_COMMAND3 0x00003FFF +#define I2C_COMMAND3_M ((I2C_COMMAND3_V)<<(I2C_COMMAND3_S)) +#define I2C_COMMAND3_V 0x3FFF +#define I2C_COMMAND3_S 0 + +#define I2C_COMD4_REG(i) (REG_I2C_BASE(i) + 0x0068) +/* I2C_COMMAND4_DONE : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: When command4 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 command4. It consists of three part. op_code + is the command 0: RSTART 1: WRITE 2: READ 3: STOP . 4:END. Byte_num represent the number of data need to be send or data need to be received. ack_check_en ack_exp and ack value are used to control the ack bit.*/ +#define I2C_COMMAND4 0x00003FFF +#define I2C_COMMAND4_M ((I2C_COMMAND4_V)<<(I2C_COMMAND4_S)) +#define I2C_COMMAND4_V 0x3FFF +#define I2C_COMMAND4_S 0 + +#define I2C_COMD5_REG(i) (REG_I2C_BASE(i) + 0x006C) +/* I2C_COMMAND5_DONE : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: When command5 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 command5. It consists of three part. op_code + is the command 0: RSTART 1: WRITE 2: READ 3: STOP . 4:END. Byte_num represent the number of data need to be send or data need to be received. ack_check_en ack_exp and ack value are used to control the ack bit.*/ +#define I2C_COMMAND5 0x00003FFF +#define I2C_COMMAND5_M ((I2C_COMMAND5_V)<<(I2C_COMMAND5_S)) +#define I2C_COMMAND5_V 0x3FFF +#define I2C_COMMAND5_S 0 + +#define I2C_COMD6_REG(i) (REG_I2C_BASE(i) + 0x0070) +/* I2C_COMMAND6_DONE : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: When command6 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 command6. It consists of three part. op_code + is the command 0: RSTART 1: WRITE 2: READ 3: STOP . 4:END. Byte_num represent the number of data need to be send or data need to be received. ack_check_en ack_exp and ack value are used to control the ack bit.*/ +#define I2C_COMMAND6 0x00003FFF +#define I2C_COMMAND6_M ((I2C_COMMAND6_V)<<(I2C_COMMAND6_S)) +#define I2C_COMMAND6_V 0x3FFF +#define I2C_COMMAND6_S 0 + +#define I2C_COMD7_REG(i) (REG_I2C_BASE(i) + 0x0074) +/* I2C_COMMAND7_DONE : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: When command7 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 command7. It consists of three part. op_code + is the command 0: RSTART 1: WRITE 2: READ 3: STOP . 4:END. Byte_num represent the number of data need to be send or data need to be received. ack_check_en ack_exp and ack value are used to control the ack bit.*/ +#define I2C_COMMAND7 0x00003FFF +#define I2C_COMMAND7_M ((I2C_COMMAND7_V)<<(I2C_COMMAND7_S)) +#define I2C_COMMAND7_V 0x3FFF +#define I2C_COMMAND7_S 0 + +#define I2C_COMD8_REG(i) (REG_I2C_BASE(i) + 0x0078) +/* I2C_COMMAND8_DONE : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: When command8 is done in I2C Master mode this bit changes to high level.*/ +#define I2C_COMMAND8_DONE (BIT(31)) +#define I2C_COMMAND8_DONE_M (BIT(31)) +#define I2C_COMMAND8_DONE_V 0x1 +#define I2C_COMMAND8_DONE_S 31 +/* I2C_COMMAND8 : R/W ;bitpos:[13:0] ;default: 14'b0 ; */ +/*description: This is the content of command8. It consists of three part. op_code + is the command 0: RSTART 1: WRITE 2: READ 3: STOP . 4:END. Byte_num represent the number of data need to be send or data need to be received. ack_check_en ack_exp and ack value are used to control the ack bit.*/ +#define I2C_COMMAND8 0x00003FFF +#define I2C_COMMAND8_M ((I2C_COMMAND8_V)<<(I2C_COMMAND8_S)) +#define I2C_COMMAND8_V 0x3FFF +#define I2C_COMMAND8_S 0 + +#define I2C_COMD9_REG(i) (REG_I2C_BASE(i) + 0x007C) +/* I2C_COMMAND9_DONE : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: When command9 is done in I2C Master mode this bit changes to high level.*/ +#define I2C_COMMAND9_DONE (BIT(31)) +#define I2C_COMMAND9_DONE_M (BIT(31)) +#define I2C_COMMAND9_DONE_V 0x1 +#define I2C_COMMAND9_DONE_S 31 +/* I2C_COMMAND9 : R/W ;bitpos:[13:0] ;default: 14'b0 ; */ +/*description: This is the content of command9. It consists of three part. op_code + is the command 0: RSTART 1: WRITE 2: READ 3: STOP . 4:END. Byte_num represent the number of data need to be send or data need to be received. ack_check_en ack_exp and ack value are used to control the ack bit.*/ +#define I2C_COMMAND9 0x00003FFF +#define I2C_COMMAND9_M ((I2C_COMMAND9_V)<<(I2C_COMMAND9_S)) +#define I2C_COMMAND9_V 0x3FFF +#define I2C_COMMAND9_S 0 + +#define I2C_COMD10_REG(i) (REG_I2C_BASE(i) + 0x0080) +/* I2C_COMMAND10_DONE : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: When command10 is done in I2C Master mode this bit changes to high level.*/ +#define I2C_COMMAND10_DONE (BIT(31)) +#define I2C_COMMAND10_DONE_M (BIT(31)) +#define I2C_COMMAND10_DONE_V 0x1 +#define I2C_COMMAND10_DONE_S 31 +/* I2C_COMMAND10 : R/W ;bitpos:[13:0] ;default: 14'b0 ; */ +/*description: This is the content of command10. It consists of three part. + op_code is the command 0: RSTART 1: WRITE 2: READ 3: STOP . 4:END. Byte_num represent the number of data need to be send or data need to be received. ack_check_en ack_exp and ack value are used to control the ack bit.*/ +#define I2C_COMMAND10 0x00003FFF +#define I2C_COMMAND10_M ((I2C_COMMAND10_V)<<(I2C_COMMAND10_S)) +#define I2C_COMMAND10_V 0x3FFF +#define I2C_COMMAND10_S 0 + +#define I2C_COMD11_REG(i) (REG_I2C_BASE(i) + 0x0084) +/* I2C_COMMAND11_DONE : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: When command11 is done in I2C Master mode this bit changes to high level.*/ +#define I2C_COMMAND11_DONE (BIT(31)) +#define I2C_COMMAND11_DONE_M (BIT(31)) +#define I2C_COMMAND11_DONE_V 0x1 +#define I2C_COMMAND11_DONE_S 31 +/* I2C_COMMAND11 : R/W ;bitpos:[13:0] ;default: 14'b0 ; */ +/*description: This is the content of command11. It consists of three part. + op_code is the command 0: RSTART 1: WRITE 2: READ 3: STOP . 4:END. Byte_num represent the number of data need to be send or data need to be received. ack_check_en ack_exp and ack value are used to control the ack bit.*/ +#define I2C_COMMAND11 0x00003FFF +#define I2C_COMMAND11_M ((I2C_COMMAND11_V)<<(I2C_COMMAND11_S)) +#define I2C_COMMAND11_V 0x3FFF +#define I2C_COMMAND11_S 0 + +#define I2C_COMD12_REG(i) (REG_I2C_BASE(i) + 0x0088) +/* I2C_COMMAND12_DONE : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: When command12 is done in I2C Master mode this bit changes to high level.*/ +#define I2C_COMMAND12_DONE (BIT(31)) +#define I2C_COMMAND12_DONE_M (BIT(31)) +#define I2C_COMMAND12_DONE_V 0x1 +#define I2C_COMMAND12_DONE_S 31 +/* I2C_COMMAND12 : R/W ;bitpos:[13:0] ;default: 14'b0 ; */ +/*description: This is the content of command12. It consists of three part. + op_code is the command 0: RSTART 1: WRITE 2: READ 3: STOP . 4:END. Byte_num represent the number of data need to be send or data need to be received. ack_check_en ack_exp and ack value are used to control the ack bit.*/ +#define I2C_COMMAND12 0x00003FFF +#define I2C_COMMAND12_M ((I2C_COMMAND12_V)<<(I2C_COMMAND12_S)) +#define I2C_COMMAND12_V 0x3FFF +#define I2C_COMMAND12_S 0 + +#define I2C_COMD13_REG(i) (REG_I2C_BASE(i) + 0x008C) +/* I2C_COMMAND13_DONE : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: When command13 is done in I2C Master mode this bit changes to high level.*/ +#define I2C_COMMAND13_DONE (BIT(31)) +#define I2C_COMMAND13_DONE_M (BIT(31)) +#define I2C_COMMAND13_DONE_V 0x1 +#define I2C_COMMAND13_DONE_S 31 +/* I2C_COMMAND13 : R/W ;bitpos:[13:0] ;default: 14'b0 ; */ +/*description: This is the content of command13. It consists of three part. + op_code is the command 0: RSTART 1: WRITE 2: READ 3: STOP . 4:END. Byte_num represent the number of data need to be send or data need to be received. ack_check_en ack_exp and ack value are used to control the ack bit.*/ +#define I2C_COMMAND13 0x00003FFF +#define I2C_COMMAND13_M ((I2C_COMMAND13_V)<<(I2C_COMMAND13_S)) +#define I2C_COMMAND13_V 0x3FFF +#define I2C_COMMAND13_S 0 + +#define I2C_COMD14_REG(i) (REG_I2C_BASE(i) + 0x0090) +/* I2C_COMMAND14_DONE : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: When command14 is done in I2C Master mode this bit changes to high level.*/ +#define I2C_COMMAND14_DONE (BIT(31)) +#define I2C_COMMAND14_DONE_M (BIT(31)) +#define I2C_COMMAND14_DONE_V 0x1 +#define I2C_COMMAND14_DONE_S 31 +/* I2C_COMMAND14 : R/W ;bitpos:[13:0] ;default: 14'b0 ; */ +/*description: This is the content of command14. It consists of three part. + op_code is the command 0: RSTART 1: WRITE 2: READ 3: STOP . 4:END. Byte_num represent the number of data need to be send or data need to be received. ack_check_en ack_exp and ack value are used to control the ack bit.*/ +#define I2C_COMMAND14 0x00003FFF +#define I2C_COMMAND14_M ((I2C_COMMAND14_V)<<(I2C_COMMAND14_S)) +#define I2C_COMMAND14_V 0x3FFF +#define I2C_COMMAND14_S 0 + +#define I2C_COMD15_REG(i) (REG_I2C_BASE(i) + 0x0094) +/* I2C_COMMAND15_DONE : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: When command15 is done in I2C Master mode this bit changes to high level.*/ +#define I2C_COMMAND15_DONE (BIT(31)) +#define I2C_COMMAND15_DONE_M (BIT(31)) +#define I2C_COMMAND15_DONE_V 0x1 +#define I2C_COMMAND15_DONE_S 31 +/* I2C_COMMAND15 : R/W ;bitpos:[13:0] ;default: 14'b0 ; */ +/*description: This is the content of command15. It consists of three part. + op_code is the command 0: RSTART 1: WRITE 2: READ 3: STOP . 4:END. Byte_num represent the number of data need to be send or data need to be received. ack_check_en ack_exp and ack value are used to control the ack bit.*/ +#define I2C_COMMAND15 0x00003FFF +#define I2C_COMMAND15_M ((I2C_COMMAND15_V)<<(I2C_COMMAND15_S)) +#define I2C_COMMAND15_V 0x3FFF +#define I2C_COMMAND15_S 0 + +#define I2C_DATE_REG(i) (REG_I2C_BASE(i) + 0x00F8) +/* I2C_DATE : R/W ;bitpos:[31:0] ;default: 32'h16042000 ; */ +/*description: */ +#define I2C_DATE 0xFFFFFFFF +#define I2C_DATE_M ((I2C_DATE_V)<<(I2C_DATE_S)) +#define I2C_DATE_V 0xFFFFFFFF +#define I2C_DATE_S 0 + +#define I2C_FIFO_START_ADDR_REG(i) (REG_I2C_BASE(i) + 0x0100) + + + + +#endif /*_SOC_I2C_REG_H_ */ + + diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/i2c_struct.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/i2c_struct.h new file mode 100644 index 0000000000000..3b17aeb463fd2 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/i2c_struct.h @@ -0,0 +1,301 @@ +// 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. +#ifndef _SOC_I2C_STRUCT_H_ +#define _SOC_I2C_STRUCT_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef volatile struct i2c_dev_s { + union { + struct { + uint32_t period:14; /*This register is used to configure the low level width of SCL clock.*/ + uint32_t reserved14: 18; + }; + uint32_t val; + } scl_low_period; + union { + struct { + uint32_t sda_force_out: 1; /*1:normally output sda data 0: exchange the function of sda_o and sda_oe (sda_o is the original internal output sda signal sda_oe is the enable bit for the internal output sda signal)*/ + uint32_t scl_force_out: 1; /*1:normally output scl clock 0: exchange the function of scl_o and scl_oe (scl_o is the original internal output scl signal scl_oe is the enable bit for the internal output scl signal)*/ + uint32_t sample_scl_level: 1; /*Set this bit to sample data in SCL low level. clear this bit to sample data in SCL high level.*/ + uint32_t reserved3: 1; + uint32_t ms_mode: 1; /*Set this bit to configure the module as i2c master clear this bit to configure the module as i2c slave.*/ + uint32_t trans_start: 1; /*Set this bit to start sending data in tx_fifo.*/ + uint32_t tx_lsb_first: 1; /*This bit is used to control the sending mode for data need to be send. 1:receive data from most significant bit 0:receive data from least significant bit*/ + uint32_t rx_lsb_first: 1; /*This bit is used to control the storage mode for received data. 1:receive data from most significant bit 0:receive data from least significant bit*/ + uint32_t clk_en: 1; /*This is the clock gating control bit for reading or writing registers.*/ + uint32_t reserved9: 23; + }; + uint32_t val; + } ctr; + union { + struct { + uint32_t ack_rec: 1; /*This register stores the value of ACK bit.*/ + uint32_t slave_rw: 1; /*when in slave mode 1:master read slave 0: master write slave.*/ + uint32_t time_out: 1; /*when I2C takes more than time_out_reg clocks to receive a data then this register changes to high level.*/ + uint32_t arb_lost: 1; /*when I2C lost control of SDA line this register changes to high level.*/ + uint32_t bus_busy: 1; /*1:I2C bus is busy transferring data. 0:I2C bus is in idle state.*/ + uint32_t slave_addressed: 1; /*when configured as i2c slave and the address send by master is equal to slave's address then this bit will be high level.*/ + uint32_t byte_trans: 1; /*This register changes to high level when one byte is transferred.*/ + uint32_t reserved7: 1; + uint32_t rx_fifo_cnt: 6; /*This register represent the amount of data need to send.*/ + uint32_t reserved14: 4; + uint32_t tx_fifo_cnt: 6; /*This register stores the amount of received data in ram.*/ + uint32_t scl_main_state_last: 3; /*This register stores the value of state machine for i2c module. 3'h0: SCL_MAIN_IDLE 3'h1: SCL_ADDRESS_SHIFT 3'h2: SCL_ACK_ADDRESS 3'h3: SCL_RX_DATA 3'h4 SCL_TX_DATA 3'h5:SCL_SEND_ACK 3'h6:SCL_WAIT_ACK*/ + uint32_t reserved27: 1; + uint32_t scl_state_last: 3; /*This register stores the value of state machine to produce SCL. 3'h0: SCL_IDLE 3'h1:SCL_START 3'h2:SCL_LOW_EDGE 3'h3: SCL_LOW 3'h4:SCL_HIGH_EDGE 3'h5:SCL_HIGH 3'h6:SCL_STOP*/ + uint32_t reserved31: 1; + }; + uint32_t val; + } status_reg; + union { + struct { + uint32_t tout: 20; /*This register is used to configure the max clock number of receiving a data, unit: APB clock cycle.*/ + uint32_t reserved20:12; + }; + uint32_t val; + } timeout; + union { + struct { + uint32_t addr: 15; /*when configured as i2c slave this register is used to configure slave's address.*/ + uint32_t reserved15: 16; + uint32_t en_10bit: 1; /*This register is used to enable slave 10bit address mode.*/ + }; + uint32_t val; + } slave_addr; + union { + struct { + uint32_t rx_fifo_start_addr: 5; /*This is the offset address of the last receiving data as described in nonfifo_rx_thres_register.*/ + uint32_t rx_fifo_end_addr: 5; /*This is the offset address of the first receiving data as described in nonfifo_rx_thres_register.*/ + uint32_t tx_fifo_start_addr: 5; /*This is the offset address of the first sending data as described in nonfifo_tx_thres register.*/ + uint32_t tx_fifo_end_addr: 5; /*This is the offset address of the last sending data as described in nonfifo_tx_thres register.*/ + uint32_t reserved20: 12; + }; + uint32_t val; + } fifo_st; + union { + struct { + uint32_t rx_fifo_full_thrhd: 5; + uint32_t tx_fifo_empty_thrhd:5; /*Config tx_fifo empty threhd value when using apb fifo access*/ + uint32_t nonfifo_en: 1; /*Set this bit to enble apb nonfifo access.*/ + uint32_t fifo_addr_cfg_en: 1; /*When this bit is set to 1 then the byte after address represent the offset address of I2C Slave's ram.*/ + uint32_t rx_fifo_rst: 1; /*Set this bit to reset rx fifo when using apb fifo access.*/ + uint32_t tx_fifo_rst: 1; /*Set this bit to reset tx fifo when using apb fifo access.*/ + uint32_t nonfifo_rx_thres: 6; /*when I2C receives more than nonfifo_rx_thres data it will produce rx_send_full_int_raw interrupt and update the current offset address of the receiving data.*/ + uint32_t nonfifo_tx_thres: 6; /*when I2C sends more than nonfifo_tx_thres data it will produce tx_send_empty_int_raw interrupt and update the current offset address of the sending data.*/ + uint32_t reserved26: 6; + }; + uint32_t val; + } fifo_conf; + union { + struct { + uint8_t data; /*The register represent the byte data read from rx_fifo when use apb fifo access*/ + uint8_t reserved[3]; + }; + uint32_t val; + } fifo_data; + union { + struct { + uint32_t rx_fifo_full: 1; /*The raw interrupt status bit for rx_fifo full when use apb fifo access.*/ + uint32_t tx_fifo_empty: 1; /*The raw interrupt status bit for tx_fifo empty when use apb fifo access.*/ + uint32_t rx_fifo_ovf: 1; /*The raw interrupt status bit for receiving data overflow when use apb fifo access.*/ + uint32_t end_detect: 1; /*The raw interrupt status bit for end_detect_int interrupt. when I2C deals with the END command it will produce end_detect_int interrupt.*/ + uint32_t slave_tran_comp: 1; /*The raw interrupt status bit for slave_tran_comp_int interrupt. when I2C Slave detects the STOP bit it will produce slave_tran_comp_int interrupt.*/ + uint32_t arbitration_lost: 1; /*The raw interrupt status bit for arbitration_lost_int interrupt.when I2C lost the usage right of I2C BUS it will produce arbitration_lost_int interrupt.*/ + uint32_t master_tran_comp: 1; /*The raw interrupt status bit for master_tra_comp_int interrupt. when I2C Master sends or receives a byte it will produce master_tran_comp_int interrupt.*/ + uint32_t trans_complete: 1; /*The raw interrupt status bit for trans_complete_int interrupt. when I2C Master finished STOP command it will produce trans_complete_int interrupt.*/ + uint32_t time_out: 1; /*The raw interrupt status bit for time_out_int interrupt. when I2C takes a lot of time to receive a data it will produce time_out_int interrupt.*/ + uint32_t trans_start: 1; /*The raw interrupt status bit for trans_start_int interrupt. when I2C sends the START bit it will produce trans_start_int interrupt.*/ + uint32_t ack_err: 1; /*The raw interrupt status bit for ack_err_int interrupt. when I2C receives a wrong ACK bit it will produce ack_err_int interrupt..*/ + uint32_t rx_rec_full: 1; /*The raw interrupt status bit for rx_rec_full_int interrupt. when I2C receives more data than nonfifo_rx_thres it will produce rx_rec_full_int interrupt.*/ + uint32_t tx_send_empty: 1; /*The raw interrupt status bit for tx_send_empty_int interrupt.when I2C sends more data than nonfifo_tx_thres it will produce tx_send_empty_int interrupt..*/ + uint32_t reserved13: 19; + }; + uint32_t val; + } int_raw; + union { + struct { + uint32_t rx_fifo_full: 1; /*Set this bit to clear the rx_fifo_full_int interrupt.*/ + uint32_t tx_fifo_empty: 1; /*Set this bit to clear the tx_fifo_empty_int interrupt.*/ + uint32_t rx_fifo_ovf: 1; /*Set this bit to clear the rx_fifo_ovf_int interrupt.*/ + uint32_t end_detect: 1; /*Set this bit to clear the end_detect_int interrupt.*/ + uint32_t slave_tran_comp: 1; /*Set this bit to clear the slave_tran_comp_int interrupt.*/ + uint32_t arbitration_lost: 1; /*Set this bit to clear the arbitration_lost_int interrupt.*/ + uint32_t master_tran_comp: 1; /*Set this bit to clear the master_tran_comp interrupt.*/ + uint32_t trans_complete: 1; /*Set this bit to clear the trans_complete_int interrupt.*/ + uint32_t time_out: 1; /*Set this bit to clear the time_out_int interrupt.*/ + uint32_t trans_start: 1; /*Set this bit to clear the trans_start_int interrupt.*/ + uint32_t ack_err: 1; /*Set this bit to clear the ack_err_int interrupt.*/ + uint32_t rx_rec_full: 1; /*Set this bit to clear the rx_rec_full_int interrupt.*/ + uint32_t tx_send_empty: 1; /*Set this bit to clear the tx_send_empty_int interrupt.*/ + uint32_t reserved13: 19; + }; + uint32_t val; + } int_clr; + union { + struct { + uint32_t rx_fifo_full: 1; /*The enable bit for rx_fifo_full_int interrupt.*/ + uint32_t tx_fifo_empty: 1; /*The enable bit for tx_fifo_empty_int interrupt.*/ + uint32_t rx_fifo_ovf: 1; /*The enable bit for rx_fifo_ovf_int interrupt.*/ + uint32_t end_detect: 1; /*The enable bit for end_detect_int interrupt.*/ + uint32_t slave_tran_comp: 1; /*The enable bit for slave_tran_comp_int interrupt.*/ + uint32_t arbitration_lost: 1; /*The enable bit for arbitration_lost_int interrupt.*/ + uint32_t master_tran_comp: 1; /*The enable bit for master_tran_comp_int interrupt.*/ + uint32_t trans_complete: 1; /*The enable bit for trans_complete_int interrupt.*/ + uint32_t time_out: 1; /*The enable bit for time_out_int interrupt.*/ + uint32_t trans_start: 1; /*The enable bit for trans_start_int interrupt.*/ + uint32_t ack_err: 1; /*The enable bit for ack_err_int interrupt.*/ + uint32_t rx_rec_full: 1; /*The enable bit for rx_rec_full_int interrupt.*/ + uint32_t tx_send_empty: 1; /*The enable bit for tx_send_empty_int interrupt.*/ + uint32_t reserved13: 19; + }; + uint32_t val; + } int_ena; + union { + struct { + uint32_t rx_fifo_full: 1; /*The masked interrupt status for rx_fifo_full_int interrupt.*/ + uint32_t tx_fifo_empty: 1; /*The masked interrupt status for tx_fifo_empty_int interrupt.*/ + uint32_t rx_fifo_ovf: 1; /*The masked interrupt status for rx_fifo_ovf_int interrupt.*/ + uint32_t end_detect: 1; /*The masked interrupt status for end_detect_int interrupt.*/ + uint32_t slave_tran_comp: 1; /*The masked interrupt status for slave_tran_comp_int interrupt.*/ + uint32_t arbitration_lost: 1; /*The masked interrupt status for arbitration_lost_int interrupt.*/ + uint32_t master_tran_comp: 1; /*The masked interrupt status for master_tran_comp_int interrupt.*/ + uint32_t trans_complete: 1; /*The masked interrupt status for trans_complete_int interrupt.*/ + uint32_t time_out: 1; /*The masked interrupt status for time_out_int interrupt.*/ + uint32_t trans_start: 1; /*The masked interrupt status for trans_start_int interrupt.*/ + uint32_t ack_err: 1; /*The masked interrupt status for ack_err_int interrupt.*/ + uint32_t rx_rec_full: 1; /*The masked interrupt status for rx_rec_full_int interrupt.*/ + uint32_t tx_send_empty: 1; /*The masked interrupt status for tx_send_empty_int interrupt.*/ + uint32_t reserved13: 19; + }; + uint32_t val; + } int_status; + union { + struct { + uint32_t time: 10; /*This register is used to configure the clock num I2C used to hold the data after the negedge of SCL.*/ + uint32_t reserved10: 22; + }; + uint32_t val; + } sda_hold; + union { + struct { + uint32_t time: 10; /*This register is used to configure the clock num I2C used to sample data on SDA after the posedge of SCL*/ + uint32_t reserved10: 22; + }; + uint32_t val; + } sda_sample; + union { + struct { + uint32_t period: 14; /*This register is used to configure the clock num during SCL is low level.*/ + uint32_t reserved14: 18; + }; + uint32_t val; + } scl_high_period; + uint32_t reserved_3c; + union { + struct { + uint32_t time: 10; /*This register is used to configure the clock num between the negedge of SDA and negedge of SCL for start mark.*/ + uint32_t reserved10: 22; + }; + uint32_t val; + } scl_start_hold; + union { + struct { + uint32_t time: 10; /*This register is used to configure the clock num between the posedge of SCL and the negedge of SDA for restart mark.*/ + uint32_t reserved10: 22; + }; + uint32_t val; + } scl_rstart_setup; + union { + struct { + uint32_t time: 14; /*This register is used to configure the clock num after the STOP bit's posedge.*/ + uint32_t reserved14: 18; + }; + uint32_t val; + } scl_stop_hold; + union { + struct { + uint32_t time: 10; /*This register is used to configure the clock num between the posedge of SCL and the posedge of SDA.*/ + uint32_t reserved10: 22; + }; + uint32_t val; + } scl_stop_setup; + union { + struct { + uint32_t thres: 3; /*When input SCL's pulse width is smaller than this register value I2C ignores this pulse.*/ + uint32_t en: 1; /*This is the filter enable bit for SCL.*/ + uint32_t reserved4: 28; + }; + uint32_t val; + } scl_filter_cfg; + union { + struct { + uint32_t thres: 3; /*When input SCL's pulse width is smaller than this register value I2C ignores this pulse.*/ + uint32_t en: 1; /*This is the filter enable bit for SDA.*/ + uint32_t reserved4: 28; + }; + uint32_t val; + } sda_filter_cfg; + 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; /*When command0 is done in I2C Master mode this bit changes to high level.*/ + }; + uint32_t val; + } command[16]; + 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 ram_data[32]; /*This the start address for ram when use apb nonfifo access.*/ +} i2c_dev_t; +extern i2c_dev_t I2C0; +extern i2c_dev_t I2C1; + +#ifdef __cplusplus +} +#endif + +#endif /* _SOC_I2C_STRUCT_H_ */ diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/i2s_caps.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/i2s_caps.h new file mode 100644 index 0000000000000..fff916d7e7cc6 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/i2s_caps.h @@ -0,0 +1,38 @@ +// 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. + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#define APLL_MIN_FREQ (250000000) +#define APLL_MAX_FREQ (500000000) +#define APLL_I2S_MIN_RATE (10675) //in Hz, I2S Clock rate limited by hardware +#define I2S_AD_BCK_FACTOR (2) +#define I2S_PDM_BCK_FACTOR (64) +#define I2S_MAX_BUFFER_SIZE (4 * 1024 * 1024) //the maximum RAM can be allocated +#define I2S_BASE_CLK (2*APB_CLK_FREQ) + +// ESP32 have 2 I2S +#define I2S_NUM_0 (0) /*!< I2S port 0 */ +#define I2S_NUM_1 (1) /*!< I2S port 1 */ +#define I2S_NUM_MAX (2) /*!< I2S port max */ +#define SOC_I2S_NUM (I2S_NUM_MAX) + +#define SOC_I2S_SUPPORT_PDM (1) //ESP32 support PDM + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/i2s_reg.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/i2s_reg.h new file mode 100644 index 0000000000000..3473c087cae0c --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/i2s_reg.h @@ -0,0 +1,1527 @@ +// 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. +#ifndef _SOC_I2S_REG_H_ +#define _SOC_I2S_REG_H_ + +#include "soc.h" + +#define REG_I2S_BASE( i ) ( DR_REG_I2S_BASE + ((i)*0x1E000)) + + +#define I2S_CONF_REG(i) (REG_I2S_BASE(i) + 0x0008) +/* I2S_SIG_LOOPBACK : R/W ;bitpos:[18] ;default: 1'b0 ; */ +/*description: */ +#define I2S_SIG_LOOPBACK (BIT(18)) +#define I2S_SIG_LOOPBACK_M (BIT(18)) +#define I2S_SIG_LOOPBACK_V 0x1 +#define I2S_SIG_LOOPBACK_S 18 +/* I2S_RX_MSB_RIGHT : R/W ;bitpos:[17] ;default: 1'b1 ; */ +/*description: */ +#define I2S_RX_MSB_RIGHT (BIT(17)) +#define I2S_RX_MSB_RIGHT_M (BIT(17)) +#define I2S_RX_MSB_RIGHT_V 0x1 +#define I2S_RX_MSB_RIGHT_S 17 +/* I2S_TX_MSB_RIGHT : R/W ;bitpos:[16] ;default: 1'b1 ; */ +/*description: */ +#define I2S_TX_MSB_RIGHT (BIT(16)) +#define I2S_TX_MSB_RIGHT_M (BIT(16)) +#define I2S_TX_MSB_RIGHT_V 0x1 +#define I2S_TX_MSB_RIGHT_S 16 +/* I2S_RX_MONO : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define I2S_RX_MONO (BIT(15)) +#define I2S_RX_MONO_M (BIT(15)) +#define I2S_RX_MONO_V 0x1 +#define I2S_RX_MONO_S 15 +/* I2S_TX_MONO : R/W ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define I2S_TX_MONO (BIT(14)) +#define I2S_TX_MONO_M (BIT(14)) +#define I2S_TX_MONO_V 0x1 +#define I2S_TX_MONO_S 14 +/* I2S_RX_SHORT_SYNC : R/W ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define I2S_RX_SHORT_SYNC (BIT(13)) +#define I2S_RX_SHORT_SYNC_M (BIT(13)) +#define I2S_RX_SHORT_SYNC_V 0x1 +#define I2S_RX_SHORT_SYNC_S 13 +/* I2S_TX_SHORT_SYNC : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define I2S_TX_SHORT_SYNC (BIT(12)) +#define I2S_TX_SHORT_SYNC_M (BIT(12)) +#define I2S_TX_SHORT_SYNC_V 0x1 +#define I2S_TX_SHORT_SYNC_S 12 +/* I2S_RX_MSB_SHIFT : R/W ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define I2S_RX_MSB_SHIFT (BIT(11)) +#define I2S_RX_MSB_SHIFT_M (BIT(11)) +#define I2S_RX_MSB_SHIFT_V 0x1 +#define I2S_RX_MSB_SHIFT_S 11 +/* I2S_TX_MSB_SHIFT : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define I2S_TX_MSB_SHIFT (BIT(10)) +#define I2S_TX_MSB_SHIFT_M (BIT(10)) +#define I2S_TX_MSB_SHIFT_V 0x1 +#define I2S_TX_MSB_SHIFT_S 10 +/* I2S_RX_RIGHT_FIRST : R/W ;bitpos:[9] ;default: 1'b1 ; */ +/*description: */ +#define I2S_RX_RIGHT_FIRST (BIT(9)) +#define I2S_RX_RIGHT_FIRST_M (BIT(9)) +#define I2S_RX_RIGHT_FIRST_V 0x1 +#define I2S_RX_RIGHT_FIRST_S 9 +/* I2S_TX_RIGHT_FIRST : R/W ;bitpos:[8] ;default: 1'b1 ; */ +/*description: */ +#define I2S_TX_RIGHT_FIRST (BIT(8)) +#define I2S_TX_RIGHT_FIRST_M (BIT(8)) +#define I2S_TX_RIGHT_FIRST_V 0x1 +#define I2S_TX_RIGHT_FIRST_S 8 +/* I2S_RX_SLAVE_MOD : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define I2S_RX_SLAVE_MOD (BIT(7)) +#define I2S_RX_SLAVE_MOD_M (BIT(7)) +#define I2S_RX_SLAVE_MOD_V 0x1 +#define I2S_RX_SLAVE_MOD_S 7 +/* I2S_TX_SLAVE_MOD : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define I2S_TX_SLAVE_MOD (BIT(6)) +#define I2S_TX_SLAVE_MOD_M (BIT(6)) +#define I2S_TX_SLAVE_MOD_V 0x1 +#define I2S_TX_SLAVE_MOD_S 6 +/* I2S_RX_START : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define I2S_RX_START (BIT(5)) +#define I2S_RX_START_M (BIT(5)) +#define I2S_RX_START_V 0x1 +#define I2S_RX_START_S 5 +/* I2S_TX_START : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define I2S_TX_START (BIT(4)) +#define I2S_TX_START_M (BIT(4)) +#define I2S_TX_START_V 0x1 +#define I2S_TX_START_S 4 +/* I2S_RX_FIFO_RESET : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define I2S_RX_FIFO_RESET (BIT(3)) +#define I2S_RX_FIFO_RESET_M (BIT(3)) +#define I2S_RX_FIFO_RESET_V 0x1 +#define I2S_RX_FIFO_RESET_S 3 +/* I2S_TX_FIFO_RESET : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define I2S_TX_FIFO_RESET (BIT(2)) +#define I2S_TX_FIFO_RESET_M (BIT(2)) +#define I2S_TX_FIFO_RESET_V 0x1 +#define I2S_TX_FIFO_RESET_S 2 +/* I2S_RX_RESET : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define I2S_RX_RESET (BIT(1)) +#define I2S_RX_RESET_M (BIT(1)) +#define I2S_RX_RESET_V 0x1 +#define I2S_RX_RESET_S 1 +/* I2S_TX_RESET : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define I2S_TX_RESET (BIT(0)) +#define I2S_TX_RESET_M (BIT(0)) +#define I2S_TX_RESET_V 0x1 +#define I2S_TX_RESET_S 0 + +#define I2S_INT_RAW_REG(i) (REG_I2S_BASE(i) + 0x000c) +/* I2S_OUT_TOTAL_EOF_INT_RAW : RO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define I2S_OUT_TOTAL_EOF_INT_RAW (BIT(16)) +#define I2S_OUT_TOTAL_EOF_INT_RAW_M (BIT(16)) +#define I2S_OUT_TOTAL_EOF_INT_RAW_V 0x1 +#define I2S_OUT_TOTAL_EOF_INT_RAW_S 16 +/* I2S_IN_DSCR_EMPTY_INT_RAW : RO ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define I2S_IN_DSCR_EMPTY_INT_RAW (BIT(15)) +#define I2S_IN_DSCR_EMPTY_INT_RAW_M (BIT(15)) +#define I2S_IN_DSCR_EMPTY_INT_RAW_V 0x1 +#define I2S_IN_DSCR_EMPTY_INT_RAW_S 15 +/* I2S_OUT_DSCR_ERR_INT_RAW : RO ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define I2S_OUT_DSCR_ERR_INT_RAW (BIT(14)) +#define I2S_OUT_DSCR_ERR_INT_RAW_M (BIT(14)) +#define I2S_OUT_DSCR_ERR_INT_RAW_V 0x1 +#define I2S_OUT_DSCR_ERR_INT_RAW_S 14 +/* I2S_IN_DSCR_ERR_INT_RAW : RO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define I2S_IN_DSCR_ERR_INT_RAW (BIT(13)) +#define I2S_IN_DSCR_ERR_INT_RAW_M (BIT(13)) +#define I2S_IN_DSCR_ERR_INT_RAW_V 0x1 +#define I2S_IN_DSCR_ERR_INT_RAW_S 13 +/* I2S_OUT_EOF_INT_RAW : RO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define I2S_OUT_EOF_INT_RAW (BIT(12)) +#define I2S_OUT_EOF_INT_RAW_M (BIT(12)) +#define I2S_OUT_EOF_INT_RAW_V 0x1 +#define I2S_OUT_EOF_INT_RAW_S 12 +/* I2S_OUT_DONE_INT_RAW : RO ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define I2S_OUT_DONE_INT_RAW (BIT(11)) +#define I2S_OUT_DONE_INT_RAW_M (BIT(11)) +#define I2S_OUT_DONE_INT_RAW_V 0x1 +#define I2S_OUT_DONE_INT_RAW_S 11 +/* I2S_IN_ERR_EOF_INT_RAW : RO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define I2S_IN_ERR_EOF_INT_RAW (BIT(10)) +#define I2S_IN_ERR_EOF_INT_RAW_M (BIT(10)) +#define I2S_IN_ERR_EOF_INT_RAW_V 0x1 +#define I2S_IN_ERR_EOF_INT_RAW_S 10 +/* I2S_IN_SUC_EOF_INT_RAW : RO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define I2S_IN_SUC_EOF_INT_RAW (BIT(9)) +#define I2S_IN_SUC_EOF_INT_RAW_M (BIT(9)) +#define I2S_IN_SUC_EOF_INT_RAW_V 0x1 +#define I2S_IN_SUC_EOF_INT_RAW_S 9 +/* I2S_IN_DONE_INT_RAW : RO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define I2S_IN_DONE_INT_RAW (BIT(8)) +#define I2S_IN_DONE_INT_RAW_M (BIT(8)) +#define I2S_IN_DONE_INT_RAW_V 0x1 +#define I2S_IN_DONE_INT_RAW_S 8 +/* I2S_TX_HUNG_INT_RAW : RO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define I2S_TX_HUNG_INT_RAW (BIT(7)) +#define I2S_TX_HUNG_INT_RAW_M (BIT(7)) +#define I2S_TX_HUNG_INT_RAW_V 0x1 +#define I2S_TX_HUNG_INT_RAW_S 7 +/* I2S_RX_HUNG_INT_RAW : RO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define I2S_RX_HUNG_INT_RAW (BIT(6)) +#define I2S_RX_HUNG_INT_RAW_M (BIT(6)) +#define I2S_RX_HUNG_INT_RAW_V 0x1 +#define I2S_RX_HUNG_INT_RAW_S 6 +/* I2S_TX_REMPTY_INT_RAW : RO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define I2S_TX_REMPTY_INT_RAW (BIT(5)) +#define I2S_TX_REMPTY_INT_RAW_M (BIT(5)) +#define I2S_TX_REMPTY_INT_RAW_V 0x1 +#define I2S_TX_REMPTY_INT_RAW_S 5 +/* I2S_TX_WFULL_INT_RAW : RO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define I2S_TX_WFULL_INT_RAW (BIT(4)) +#define I2S_TX_WFULL_INT_RAW_M (BIT(4)) +#define I2S_TX_WFULL_INT_RAW_V 0x1 +#define I2S_TX_WFULL_INT_RAW_S 4 +/* I2S_RX_REMPTY_INT_RAW : RO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define I2S_RX_REMPTY_INT_RAW (BIT(3)) +#define I2S_RX_REMPTY_INT_RAW_M (BIT(3)) +#define I2S_RX_REMPTY_INT_RAW_V 0x1 +#define I2S_RX_REMPTY_INT_RAW_S 3 +/* I2S_RX_WFULL_INT_RAW : RO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define I2S_RX_WFULL_INT_RAW (BIT(2)) +#define I2S_RX_WFULL_INT_RAW_M (BIT(2)) +#define I2S_RX_WFULL_INT_RAW_V 0x1 +#define I2S_RX_WFULL_INT_RAW_S 2 +/* I2S_TX_PUT_DATA_INT_RAW : RO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define I2S_TX_PUT_DATA_INT_RAW (BIT(1)) +#define I2S_TX_PUT_DATA_INT_RAW_M (BIT(1)) +#define I2S_TX_PUT_DATA_INT_RAW_V 0x1 +#define I2S_TX_PUT_DATA_INT_RAW_S 1 +/* I2S_RX_TAKE_DATA_INT_RAW : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define I2S_RX_TAKE_DATA_INT_RAW (BIT(0)) +#define I2S_RX_TAKE_DATA_INT_RAW_M (BIT(0)) +#define I2S_RX_TAKE_DATA_INT_RAW_V 0x1 +#define I2S_RX_TAKE_DATA_INT_RAW_S 0 + +#define I2S_INT_ST_REG(i) (REG_I2S_BASE(i) + 0x0010) +/* I2S_OUT_TOTAL_EOF_INT_ST : RO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define I2S_OUT_TOTAL_EOF_INT_ST (BIT(16)) +#define I2S_OUT_TOTAL_EOF_INT_ST_M (BIT(16)) +#define I2S_OUT_TOTAL_EOF_INT_ST_V 0x1 +#define I2S_OUT_TOTAL_EOF_INT_ST_S 16 +/* I2S_IN_DSCR_EMPTY_INT_ST : RO ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define I2S_IN_DSCR_EMPTY_INT_ST (BIT(15)) +#define I2S_IN_DSCR_EMPTY_INT_ST_M (BIT(15)) +#define I2S_IN_DSCR_EMPTY_INT_ST_V 0x1 +#define I2S_IN_DSCR_EMPTY_INT_ST_S 15 +/* I2S_OUT_DSCR_ERR_INT_ST : RO ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define I2S_OUT_DSCR_ERR_INT_ST (BIT(14)) +#define I2S_OUT_DSCR_ERR_INT_ST_M (BIT(14)) +#define I2S_OUT_DSCR_ERR_INT_ST_V 0x1 +#define I2S_OUT_DSCR_ERR_INT_ST_S 14 +/* I2S_IN_DSCR_ERR_INT_ST : RO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define I2S_IN_DSCR_ERR_INT_ST (BIT(13)) +#define I2S_IN_DSCR_ERR_INT_ST_M (BIT(13)) +#define I2S_IN_DSCR_ERR_INT_ST_V 0x1 +#define I2S_IN_DSCR_ERR_INT_ST_S 13 +/* I2S_OUT_EOF_INT_ST : RO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define I2S_OUT_EOF_INT_ST (BIT(12)) +#define I2S_OUT_EOF_INT_ST_M (BIT(12)) +#define I2S_OUT_EOF_INT_ST_V 0x1 +#define I2S_OUT_EOF_INT_ST_S 12 +/* I2S_OUT_DONE_INT_ST : RO ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define I2S_OUT_DONE_INT_ST (BIT(11)) +#define I2S_OUT_DONE_INT_ST_M (BIT(11)) +#define I2S_OUT_DONE_INT_ST_V 0x1 +#define I2S_OUT_DONE_INT_ST_S 11 +/* I2S_IN_ERR_EOF_INT_ST : RO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define I2S_IN_ERR_EOF_INT_ST (BIT(10)) +#define I2S_IN_ERR_EOF_INT_ST_M (BIT(10)) +#define I2S_IN_ERR_EOF_INT_ST_V 0x1 +#define I2S_IN_ERR_EOF_INT_ST_S 10 +/* I2S_IN_SUC_EOF_INT_ST : RO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define I2S_IN_SUC_EOF_INT_ST (BIT(9)) +#define I2S_IN_SUC_EOF_INT_ST_M (BIT(9)) +#define I2S_IN_SUC_EOF_INT_ST_V 0x1 +#define I2S_IN_SUC_EOF_INT_ST_S 9 +/* I2S_IN_DONE_INT_ST : RO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define I2S_IN_DONE_INT_ST (BIT(8)) +#define I2S_IN_DONE_INT_ST_M (BIT(8)) +#define I2S_IN_DONE_INT_ST_V 0x1 +#define I2S_IN_DONE_INT_ST_S 8 +/* I2S_TX_HUNG_INT_ST : RO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define I2S_TX_HUNG_INT_ST (BIT(7)) +#define I2S_TX_HUNG_INT_ST_M (BIT(7)) +#define I2S_TX_HUNG_INT_ST_V 0x1 +#define I2S_TX_HUNG_INT_ST_S 7 +/* I2S_RX_HUNG_INT_ST : RO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define I2S_RX_HUNG_INT_ST (BIT(6)) +#define I2S_RX_HUNG_INT_ST_M (BIT(6)) +#define I2S_RX_HUNG_INT_ST_V 0x1 +#define I2S_RX_HUNG_INT_ST_S 6 +/* I2S_TX_REMPTY_INT_ST : RO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define I2S_TX_REMPTY_INT_ST (BIT(5)) +#define I2S_TX_REMPTY_INT_ST_M (BIT(5)) +#define I2S_TX_REMPTY_INT_ST_V 0x1 +#define I2S_TX_REMPTY_INT_ST_S 5 +/* I2S_TX_WFULL_INT_ST : RO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define I2S_TX_WFULL_INT_ST (BIT(4)) +#define I2S_TX_WFULL_INT_ST_M (BIT(4)) +#define I2S_TX_WFULL_INT_ST_V 0x1 +#define I2S_TX_WFULL_INT_ST_S 4 +/* I2S_RX_REMPTY_INT_ST : RO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define I2S_RX_REMPTY_INT_ST (BIT(3)) +#define I2S_RX_REMPTY_INT_ST_M (BIT(3)) +#define I2S_RX_REMPTY_INT_ST_V 0x1 +#define I2S_RX_REMPTY_INT_ST_S 3 +/* I2S_RX_WFULL_INT_ST : RO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define I2S_RX_WFULL_INT_ST (BIT(2)) +#define I2S_RX_WFULL_INT_ST_M (BIT(2)) +#define I2S_RX_WFULL_INT_ST_V 0x1 +#define I2S_RX_WFULL_INT_ST_S 2 +/* I2S_TX_PUT_DATA_INT_ST : RO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define I2S_TX_PUT_DATA_INT_ST (BIT(1)) +#define I2S_TX_PUT_DATA_INT_ST_M (BIT(1)) +#define I2S_TX_PUT_DATA_INT_ST_V 0x1 +#define I2S_TX_PUT_DATA_INT_ST_S 1 +/* I2S_RX_TAKE_DATA_INT_ST : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define I2S_RX_TAKE_DATA_INT_ST (BIT(0)) +#define I2S_RX_TAKE_DATA_INT_ST_M (BIT(0)) +#define I2S_RX_TAKE_DATA_INT_ST_V 0x1 +#define I2S_RX_TAKE_DATA_INT_ST_S 0 + +#define I2S_INT_ENA_REG(i) (REG_I2S_BASE(i) + 0x0014) +/* I2S_OUT_TOTAL_EOF_INT_ENA : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define I2S_OUT_TOTAL_EOF_INT_ENA (BIT(16)) +#define I2S_OUT_TOTAL_EOF_INT_ENA_M (BIT(16)) +#define I2S_OUT_TOTAL_EOF_INT_ENA_V 0x1 +#define I2S_OUT_TOTAL_EOF_INT_ENA_S 16 +/* I2S_IN_DSCR_EMPTY_INT_ENA : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define I2S_IN_DSCR_EMPTY_INT_ENA (BIT(15)) +#define I2S_IN_DSCR_EMPTY_INT_ENA_M (BIT(15)) +#define I2S_IN_DSCR_EMPTY_INT_ENA_V 0x1 +#define I2S_IN_DSCR_EMPTY_INT_ENA_S 15 +/* I2S_OUT_DSCR_ERR_INT_ENA : R/W ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define I2S_OUT_DSCR_ERR_INT_ENA (BIT(14)) +#define I2S_OUT_DSCR_ERR_INT_ENA_M (BIT(14)) +#define I2S_OUT_DSCR_ERR_INT_ENA_V 0x1 +#define I2S_OUT_DSCR_ERR_INT_ENA_S 14 +/* I2S_IN_DSCR_ERR_INT_ENA : R/W ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define I2S_IN_DSCR_ERR_INT_ENA (BIT(13)) +#define I2S_IN_DSCR_ERR_INT_ENA_M (BIT(13)) +#define I2S_IN_DSCR_ERR_INT_ENA_V 0x1 +#define I2S_IN_DSCR_ERR_INT_ENA_S 13 +/* I2S_OUT_EOF_INT_ENA : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define I2S_OUT_EOF_INT_ENA (BIT(12)) +#define I2S_OUT_EOF_INT_ENA_M (BIT(12)) +#define I2S_OUT_EOF_INT_ENA_V 0x1 +#define I2S_OUT_EOF_INT_ENA_S 12 +/* I2S_OUT_DONE_INT_ENA : R/W ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define I2S_OUT_DONE_INT_ENA (BIT(11)) +#define I2S_OUT_DONE_INT_ENA_M (BIT(11)) +#define I2S_OUT_DONE_INT_ENA_V 0x1 +#define I2S_OUT_DONE_INT_ENA_S 11 +/* I2S_IN_ERR_EOF_INT_ENA : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define I2S_IN_ERR_EOF_INT_ENA (BIT(10)) +#define I2S_IN_ERR_EOF_INT_ENA_M (BIT(10)) +#define I2S_IN_ERR_EOF_INT_ENA_V 0x1 +#define I2S_IN_ERR_EOF_INT_ENA_S 10 +/* I2S_IN_SUC_EOF_INT_ENA : R/W ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define I2S_IN_SUC_EOF_INT_ENA (BIT(9)) +#define I2S_IN_SUC_EOF_INT_ENA_M (BIT(9)) +#define I2S_IN_SUC_EOF_INT_ENA_V 0x1 +#define I2S_IN_SUC_EOF_INT_ENA_S 9 +/* I2S_IN_DONE_INT_ENA : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define I2S_IN_DONE_INT_ENA (BIT(8)) +#define I2S_IN_DONE_INT_ENA_M (BIT(8)) +#define I2S_IN_DONE_INT_ENA_V 0x1 +#define I2S_IN_DONE_INT_ENA_S 8 +/* I2S_TX_HUNG_INT_ENA : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define I2S_TX_HUNG_INT_ENA (BIT(7)) +#define I2S_TX_HUNG_INT_ENA_M (BIT(7)) +#define I2S_TX_HUNG_INT_ENA_V 0x1 +#define I2S_TX_HUNG_INT_ENA_S 7 +/* I2S_RX_HUNG_INT_ENA : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define I2S_RX_HUNG_INT_ENA (BIT(6)) +#define I2S_RX_HUNG_INT_ENA_M (BIT(6)) +#define I2S_RX_HUNG_INT_ENA_V 0x1 +#define I2S_RX_HUNG_INT_ENA_S 6 +/* I2S_TX_REMPTY_INT_ENA : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define I2S_TX_REMPTY_INT_ENA (BIT(5)) +#define I2S_TX_REMPTY_INT_ENA_M (BIT(5)) +#define I2S_TX_REMPTY_INT_ENA_V 0x1 +#define I2S_TX_REMPTY_INT_ENA_S 5 +/* I2S_TX_WFULL_INT_ENA : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define I2S_TX_WFULL_INT_ENA (BIT(4)) +#define I2S_TX_WFULL_INT_ENA_M (BIT(4)) +#define I2S_TX_WFULL_INT_ENA_V 0x1 +#define I2S_TX_WFULL_INT_ENA_S 4 +/* I2S_RX_REMPTY_INT_ENA : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define I2S_RX_REMPTY_INT_ENA (BIT(3)) +#define I2S_RX_REMPTY_INT_ENA_M (BIT(3)) +#define I2S_RX_REMPTY_INT_ENA_V 0x1 +#define I2S_RX_REMPTY_INT_ENA_S 3 +/* I2S_RX_WFULL_INT_ENA : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define I2S_RX_WFULL_INT_ENA (BIT(2)) +#define I2S_RX_WFULL_INT_ENA_M (BIT(2)) +#define I2S_RX_WFULL_INT_ENA_V 0x1 +#define I2S_RX_WFULL_INT_ENA_S 2 +/* I2S_TX_PUT_DATA_INT_ENA : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define I2S_TX_PUT_DATA_INT_ENA (BIT(1)) +#define I2S_TX_PUT_DATA_INT_ENA_M (BIT(1)) +#define I2S_TX_PUT_DATA_INT_ENA_V 0x1 +#define I2S_TX_PUT_DATA_INT_ENA_S 1 +/* I2S_RX_TAKE_DATA_INT_ENA : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define I2S_RX_TAKE_DATA_INT_ENA (BIT(0)) +#define I2S_RX_TAKE_DATA_INT_ENA_M (BIT(0)) +#define I2S_RX_TAKE_DATA_INT_ENA_V 0x1 +#define I2S_RX_TAKE_DATA_INT_ENA_S 0 + +#define I2S_INT_CLR_REG(i) (REG_I2S_BASE(i) + 0x0018) +/* I2S_OUT_TOTAL_EOF_INT_CLR : WO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define I2S_OUT_TOTAL_EOF_INT_CLR (BIT(16)) +#define I2S_OUT_TOTAL_EOF_INT_CLR_M (BIT(16)) +#define I2S_OUT_TOTAL_EOF_INT_CLR_V 0x1 +#define I2S_OUT_TOTAL_EOF_INT_CLR_S 16 +/* I2S_IN_DSCR_EMPTY_INT_CLR : WO ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define I2S_IN_DSCR_EMPTY_INT_CLR (BIT(15)) +#define I2S_IN_DSCR_EMPTY_INT_CLR_M (BIT(15)) +#define I2S_IN_DSCR_EMPTY_INT_CLR_V 0x1 +#define I2S_IN_DSCR_EMPTY_INT_CLR_S 15 +/* I2S_OUT_DSCR_ERR_INT_CLR : WO ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define I2S_OUT_DSCR_ERR_INT_CLR (BIT(14)) +#define I2S_OUT_DSCR_ERR_INT_CLR_M (BIT(14)) +#define I2S_OUT_DSCR_ERR_INT_CLR_V 0x1 +#define I2S_OUT_DSCR_ERR_INT_CLR_S 14 +/* I2S_IN_DSCR_ERR_INT_CLR : WO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define I2S_IN_DSCR_ERR_INT_CLR (BIT(13)) +#define I2S_IN_DSCR_ERR_INT_CLR_M (BIT(13)) +#define I2S_IN_DSCR_ERR_INT_CLR_V 0x1 +#define I2S_IN_DSCR_ERR_INT_CLR_S 13 +/* I2S_OUT_EOF_INT_CLR : WO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define I2S_OUT_EOF_INT_CLR (BIT(12)) +#define I2S_OUT_EOF_INT_CLR_M (BIT(12)) +#define I2S_OUT_EOF_INT_CLR_V 0x1 +#define I2S_OUT_EOF_INT_CLR_S 12 +/* I2S_OUT_DONE_INT_CLR : WO ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define I2S_OUT_DONE_INT_CLR (BIT(11)) +#define I2S_OUT_DONE_INT_CLR_M (BIT(11)) +#define I2S_OUT_DONE_INT_CLR_V 0x1 +#define I2S_OUT_DONE_INT_CLR_S 11 +/* I2S_IN_ERR_EOF_INT_CLR : WO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define I2S_IN_ERR_EOF_INT_CLR (BIT(10)) +#define I2S_IN_ERR_EOF_INT_CLR_M (BIT(10)) +#define I2S_IN_ERR_EOF_INT_CLR_V 0x1 +#define I2S_IN_ERR_EOF_INT_CLR_S 10 +/* I2S_IN_SUC_EOF_INT_CLR : WO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define I2S_IN_SUC_EOF_INT_CLR (BIT(9)) +#define I2S_IN_SUC_EOF_INT_CLR_M (BIT(9)) +#define I2S_IN_SUC_EOF_INT_CLR_V 0x1 +#define I2S_IN_SUC_EOF_INT_CLR_S 9 +/* I2S_IN_DONE_INT_CLR : WO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define I2S_IN_DONE_INT_CLR (BIT(8)) +#define I2S_IN_DONE_INT_CLR_M (BIT(8)) +#define I2S_IN_DONE_INT_CLR_V 0x1 +#define I2S_IN_DONE_INT_CLR_S 8 +/* I2S_TX_HUNG_INT_CLR : WO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define I2S_TX_HUNG_INT_CLR (BIT(7)) +#define I2S_TX_HUNG_INT_CLR_M (BIT(7)) +#define I2S_TX_HUNG_INT_CLR_V 0x1 +#define I2S_TX_HUNG_INT_CLR_S 7 +/* I2S_RX_HUNG_INT_CLR : WO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define I2S_RX_HUNG_INT_CLR (BIT(6)) +#define I2S_RX_HUNG_INT_CLR_M (BIT(6)) +#define I2S_RX_HUNG_INT_CLR_V 0x1 +#define I2S_RX_HUNG_INT_CLR_S 6 +/* I2S_TX_REMPTY_INT_CLR : WO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define I2S_TX_REMPTY_INT_CLR (BIT(5)) +#define I2S_TX_REMPTY_INT_CLR_M (BIT(5)) +#define I2S_TX_REMPTY_INT_CLR_V 0x1 +#define I2S_TX_REMPTY_INT_CLR_S 5 +/* I2S_TX_WFULL_INT_CLR : WO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define I2S_TX_WFULL_INT_CLR (BIT(4)) +#define I2S_TX_WFULL_INT_CLR_M (BIT(4)) +#define I2S_TX_WFULL_INT_CLR_V 0x1 +#define I2S_TX_WFULL_INT_CLR_S 4 +/* I2S_RX_REMPTY_INT_CLR : WO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define I2S_RX_REMPTY_INT_CLR (BIT(3)) +#define I2S_RX_REMPTY_INT_CLR_M (BIT(3)) +#define I2S_RX_REMPTY_INT_CLR_V 0x1 +#define I2S_RX_REMPTY_INT_CLR_S 3 +/* I2S_RX_WFULL_INT_CLR : WO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define I2S_RX_WFULL_INT_CLR (BIT(2)) +#define I2S_RX_WFULL_INT_CLR_M (BIT(2)) +#define I2S_RX_WFULL_INT_CLR_V 0x1 +#define I2S_RX_WFULL_INT_CLR_S 2 +/* I2S_PUT_DATA_INT_CLR : WO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define I2S_PUT_DATA_INT_CLR (BIT(1)) +#define I2S_PUT_DATA_INT_CLR_M (BIT(1)) +#define I2S_PUT_DATA_INT_CLR_V 0x1 +#define I2S_PUT_DATA_INT_CLR_S 1 +/* I2S_TAKE_DATA_INT_CLR : WO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define I2S_TAKE_DATA_INT_CLR (BIT(0)) +#define I2S_TAKE_DATA_INT_CLR_M (BIT(0)) +#define I2S_TAKE_DATA_INT_CLR_V 0x1 +#define I2S_TAKE_DATA_INT_CLR_S 0 + +#define I2S_TIMING_REG(i) (REG_I2S_BASE(i) + 0x001c) +/* I2S_TX_BCK_IN_INV : R/W ;bitpos:[24] ;default: 1'b0 ; */ +/*description: */ +#define I2S_TX_BCK_IN_INV (BIT(24)) +#define I2S_TX_BCK_IN_INV_M (BIT(24)) +#define I2S_TX_BCK_IN_INV_V 0x1 +#define I2S_TX_BCK_IN_INV_S 24 +/* I2S_DATA_ENABLE_DELAY : R/W ;bitpos:[23:22] ;default: 2'b0 ; */ +/*description: */ +#define I2S_DATA_ENABLE_DELAY 0x00000003 +#define I2S_DATA_ENABLE_DELAY_M ((I2S_DATA_ENABLE_DELAY_V)<<(I2S_DATA_ENABLE_DELAY_S)) +#define I2S_DATA_ENABLE_DELAY_V 0x3 +#define I2S_DATA_ENABLE_DELAY_S 22 +/* I2S_RX_DSYNC_SW : R/W ;bitpos:[21] ;default: 1'b0 ; */ +/*description: */ +#define I2S_RX_DSYNC_SW (BIT(21)) +#define I2S_RX_DSYNC_SW_M (BIT(21)) +#define I2S_RX_DSYNC_SW_V 0x1 +#define I2S_RX_DSYNC_SW_S 21 +/* I2S_TX_DSYNC_SW : R/W ;bitpos:[20] ;default: 1'b0 ; */ +/*description: */ +#define I2S_TX_DSYNC_SW (BIT(20)) +#define I2S_TX_DSYNC_SW_M (BIT(20)) +#define I2S_TX_DSYNC_SW_V 0x1 +#define I2S_TX_DSYNC_SW_S 20 +/* I2S_RX_BCK_OUT_DELAY : R/W ;bitpos:[19:18] ;default: 2'b0 ; */ +/*description: */ +#define I2S_RX_BCK_OUT_DELAY 0x00000003 +#define I2S_RX_BCK_OUT_DELAY_M ((I2S_RX_BCK_OUT_DELAY_V)<<(I2S_RX_BCK_OUT_DELAY_S)) +#define I2S_RX_BCK_OUT_DELAY_V 0x3 +#define I2S_RX_BCK_OUT_DELAY_S 18 +/* I2S_RX_WS_OUT_DELAY : R/W ;bitpos:[17:16] ;default: 2'b0 ; */ +/*description: */ +#define I2S_RX_WS_OUT_DELAY 0x00000003 +#define I2S_RX_WS_OUT_DELAY_M ((I2S_RX_WS_OUT_DELAY_V)<<(I2S_RX_WS_OUT_DELAY_S)) +#define I2S_RX_WS_OUT_DELAY_V 0x3 +#define I2S_RX_WS_OUT_DELAY_S 16 +/* I2S_TX_SD_OUT_DELAY : R/W ;bitpos:[15:14] ;default: 2'b0 ; */ +/*description: */ +#define I2S_TX_SD_OUT_DELAY 0x00000003 +#define I2S_TX_SD_OUT_DELAY_M ((I2S_TX_SD_OUT_DELAY_V)<<(I2S_TX_SD_OUT_DELAY_S)) +#define I2S_TX_SD_OUT_DELAY_V 0x3 +#define I2S_TX_SD_OUT_DELAY_S 14 +/* I2S_TX_WS_OUT_DELAY : R/W ;bitpos:[13:12] ;default: 2'b0 ; */ +/*description: */ +#define I2S_TX_WS_OUT_DELAY 0x00000003 +#define I2S_TX_WS_OUT_DELAY_M ((I2S_TX_WS_OUT_DELAY_V)<<(I2S_TX_WS_OUT_DELAY_S)) +#define I2S_TX_WS_OUT_DELAY_V 0x3 +#define I2S_TX_WS_OUT_DELAY_S 12 +/* I2S_TX_BCK_OUT_DELAY : R/W ;bitpos:[11:10] ;default: 2'b0 ; */ +/*description: */ +#define I2S_TX_BCK_OUT_DELAY 0x00000003 +#define I2S_TX_BCK_OUT_DELAY_M ((I2S_TX_BCK_OUT_DELAY_V)<<(I2S_TX_BCK_OUT_DELAY_S)) +#define I2S_TX_BCK_OUT_DELAY_V 0x3 +#define I2S_TX_BCK_OUT_DELAY_S 10 +/* I2S_RX_SD_IN_DELAY : R/W ;bitpos:[9:8] ;default: 2'b0 ; */ +/*description: */ +#define I2S_RX_SD_IN_DELAY 0x00000003 +#define I2S_RX_SD_IN_DELAY_M ((I2S_RX_SD_IN_DELAY_V)<<(I2S_RX_SD_IN_DELAY_S)) +#define I2S_RX_SD_IN_DELAY_V 0x3 +#define I2S_RX_SD_IN_DELAY_S 8 +/* I2S_RX_WS_IN_DELAY : R/W ;bitpos:[7:6] ;default: 2'b0 ; */ +/*description: */ +#define I2S_RX_WS_IN_DELAY 0x00000003 +#define I2S_RX_WS_IN_DELAY_M ((I2S_RX_WS_IN_DELAY_V)<<(I2S_RX_WS_IN_DELAY_S)) +#define I2S_RX_WS_IN_DELAY_V 0x3 +#define I2S_RX_WS_IN_DELAY_S 6 +/* I2S_RX_BCK_IN_DELAY : R/W ;bitpos:[5:4] ;default: 2'b0 ; */ +/*description: */ +#define I2S_RX_BCK_IN_DELAY 0x00000003 +#define I2S_RX_BCK_IN_DELAY_M ((I2S_RX_BCK_IN_DELAY_V)<<(I2S_RX_BCK_IN_DELAY_S)) +#define I2S_RX_BCK_IN_DELAY_V 0x3 +#define I2S_RX_BCK_IN_DELAY_S 4 +/* I2S_TX_WS_IN_DELAY : R/W ;bitpos:[3:2] ;default: 2'b0 ; */ +/*description: */ +#define I2S_TX_WS_IN_DELAY 0x00000003 +#define I2S_TX_WS_IN_DELAY_M ((I2S_TX_WS_IN_DELAY_V)<<(I2S_TX_WS_IN_DELAY_S)) +#define I2S_TX_WS_IN_DELAY_V 0x3 +#define I2S_TX_WS_IN_DELAY_S 2 +/* I2S_TX_BCK_IN_DELAY : R/W ;bitpos:[1:0] ;default: 2'b0 ; */ +/*description: */ +#define I2S_TX_BCK_IN_DELAY 0x00000003 +#define I2S_TX_BCK_IN_DELAY_M ((I2S_TX_BCK_IN_DELAY_V)<<(I2S_TX_BCK_IN_DELAY_S)) +#define I2S_TX_BCK_IN_DELAY_V 0x3 +#define I2S_TX_BCK_IN_DELAY_S 0 + +#define I2S_FIFO_CONF_REG(i) (REG_I2S_BASE(i) + 0x0020) +/* I2S_RX_FIFO_MOD_FORCE_EN : R/W ;bitpos:[20] ;default: 1'b0 ; */ +/*description: */ +#define I2S_RX_FIFO_MOD_FORCE_EN (BIT(20)) +#define I2S_RX_FIFO_MOD_FORCE_EN_M (BIT(20)) +#define I2S_RX_FIFO_MOD_FORCE_EN_V 0x1 +#define I2S_RX_FIFO_MOD_FORCE_EN_S 20 +/* I2S_TX_FIFO_MOD_FORCE_EN : R/W ;bitpos:[19] ;default: 1'b0 ; */ +/*description: */ +#define I2S_TX_FIFO_MOD_FORCE_EN (BIT(19)) +#define I2S_TX_FIFO_MOD_FORCE_EN_M (BIT(19)) +#define I2S_TX_FIFO_MOD_FORCE_EN_V 0x1 +#define I2S_TX_FIFO_MOD_FORCE_EN_S 19 +/* I2S_RX_FIFO_MOD : R/W ;bitpos:[18:16] ;default: 3'b0 ; */ +/*description: */ +#define I2S_RX_FIFO_MOD 0x00000007 +#define I2S_RX_FIFO_MOD_M ((I2S_RX_FIFO_MOD_V)<<(I2S_RX_FIFO_MOD_S)) +#define I2S_RX_FIFO_MOD_V 0x7 +#define I2S_RX_FIFO_MOD_S 16 +/* I2S_TX_FIFO_MOD : R/W ;bitpos:[15:13] ;default: 3'b0 ; */ +/*description: */ +#define I2S_TX_FIFO_MOD 0x00000007 +#define I2S_TX_FIFO_MOD_M ((I2S_TX_FIFO_MOD_V)<<(I2S_TX_FIFO_MOD_S)) +#define I2S_TX_FIFO_MOD_V 0x7 +#define I2S_TX_FIFO_MOD_S 13 +/* I2S_DSCR_EN : R/W ;bitpos:[12] ;default: 1'd1 ; */ +/*description: */ +#define I2S_DSCR_EN (BIT(12)) +#define I2S_DSCR_EN_M (BIT(12)) +#define I2S_DSCR_EN_V 0x1 +#define I2S_DSCR_EN_S 12 +/* I2S_TX_DATA_NUM : R/W ;bitpos:[11:6] ;default: 6'd32 ; */ +/*description: */ +#define I2S_TX_DATA_NUM 0x0000003F +#define I2S_TX_DATA_NUM_M ((I2S_TX_DATA_NUM_V)<<(I2S_TX_DATA_NUM_S)) +#define I2S_TX_DATA_NUM_V 0x3F +#define I2S_TX_DATA_NUM_S 6 +/* I2S_RX_DATA_NUM : R/W ;bitpos:[5:0] ;default: 6'd32 ; */ +/*description: */ +#define I2S_RX_DATA_NUM 0x0000003F +#define I2S_RX_DATA_NUM_M ((I2S_RX_DATA_NUM_V)<<(I2S_RX_DATA_NUM_S)) +#define I2S_RX_DATA_NUM_V 0x3F +#define I2S_RX_DATA_NUM_S 0 + +#define I2S_RXEOF_NUM_REG(i) (REG_I2S_BASE(i) + 0x0024) +/* I2S_RX_EOF_NUM : R/W ;bitpos:[31:0] ;default: 32'd64 ; */ +/*description: */ +#define I2S_RX_EOF_NUM 0xFFFFFFFF +#define I2S_RX_EOF_NUM_M ((I2S_RX_EOF_NUM_V)<<(I2S_RX_EOF_NUM_S)) +#define I2S_RX_EOF_NUM_V 0xFFFFFFFF +#define I2S_RX_EOF_NUM_S 0 + +#define I2S_CONF_SIGLE_DATA_REG(i) (REG_I2S_BASE(i) + 0x0028) +/* I2S_SIGLE_DATA : R/W ;bitpos:[31:0] ;default: 32'd0 ; */ +/*description: */ +#define I2S_SIGLE_DATA 0xFFFFFFFF +#define I2S_SIGLE_DATA_M ((I2S_SIGLE_DATA_V)<<(I2S_SIGLE_DATA_S)) +#define I2S_SIGLE_DATA_V 0xFFFFFFFF +#define I2S_SIGLE_DATA_S 0 + +#define I2S_CONF_CHAN_REG(i) (REG_I2S_BASE(i) + 0x002c) +/* I2S_RX_CHAN_MOD : R/W ;bitpos:[4:3] ;default: 2'b0 ; */ +/*description: */ +#define I2S_RX_CHAN_MOD 0x00000003 +#define I2S_RX_CHAN_MOD_M ((I2S_RX_CHAN_MOD_V)<<(I2S_RX_CHAN_MOD_S)) +#define I2S_RX_CHAN_MOD_V 0x3 +#define I2S_RX_CHAN_MOD_S 3 +/* I2S_TX_CHAN_MOD : R/W ;bitpos:[2:0] ;default: 3'b0 ; */ +/*description: */ +#define I2S_TX_CHAN_MOD 0x00000007 +#define I2S_TX_CHAN_MOD_M ((I2S_TX_CHAN_MOD_V)<<(I2S_TX_CHAN_MOD_S)) +#define I2S_TX_CHAN_MOD_V 0x7 +#define I2S_TX_CHAN_MOD_S 0 + +#define I2S_OUT_LINK_REG(i) (REG_I2S_BASE(i) + 0x0030) +/* I2S_OUTLINK_PARK : RO ;bitpos:[31] ;default: 1'h0 ; */ +/*description: */ +#define I2S_OUTLINK_PARK (BIT(31)) +#define I2S_OUTLINK_PARK_M (BIT(31)) +#define I2S_OUTLINK_PARK_V 0x1 +#define I2S_OUTLINK_PARK_S 31 +/* I2S_OUTLINK_RESTART : R/W ;bitpos:[30] ;default: 1'b0 ; */ +/*description: */ +#define I2S_OUTLINK_RESTART (BIT(30)) +#define I2S_OUTLINK_RESTART_M (BIT(30)) +#define I2S_OUTLINK_RESTART_V 0x1 +#define I2S_OUTLINK_RESTART_S 30 +/* I2S_OUTLINK_START : R/W ;bitpos:[29] ;default: 1'b0 ; */ +/*description: */ +#define I2S_OUTLINK_START (BIT(29)) +#define I2S_OUTLINK_START_M (BIT(29)) +#define I2S_OUTLINK_START_V 0x1 +#define I2S_OUTLINK_START_S 29 +/* I2S_OUTLINK_STOP : R/W ;bitpos:[28] ;default: 1'b0 ; */ +/*description: */ +#define I2S_OUTLINK_STOP (BIT(28)) +#define I2S_OUTLINK_STOP_M (BIT(28)) +#define I2S_OUTLINK_STOP_V 0x1 +#define I2S_OUTLINK_STOP_S 28 +/* I2S_OUTLINK_ADDR : R/W ;bitpos:[19:0] ;default: 20'h0 ; */ +/*description: */ +#define I2S_OUTLINK_ADDR 0x000FFFFF +#define I2S_OUTLINK_ADDR_M ((I2S_OUTLINK_ADDR_V)<<(I2S_OUTLINK_ADDR_S)) +#define I2S_OUTLINK_ADDR_V 0xFFFFF +#define I2S_OUTLINK_ADDR_S 0 + +#define I2S_IN_LINK_REG(i) (REG_I2S_BASE(i) + 0x0034) +/* I2S_INLINK_PARK : RO ;bitpos:[31] ;default: 1'h0 ; */ +/*description: */ +#define I2S_INLINK_PARK (BIT(31)) +#define I2S_INLINK_PARK_M (BIT(31)) +#define I2S_INLINK_PARK_V 0x1 +#define I2S_INLINK_PARK_S 31 +/* I2S_INLINK_RESTART : R/W ;bitpos:[30] ;default: 1'b0 ; */ +/*description: */ +#define I2S_INLINK_RESTART (BIT(30)) +#define I2S_INLINK_RESTART_M (BIT(30)) +#define I2S_INLINK_RESTART_V 0x1 +#define I2S_INLINK_RESTART_S 30 +/* I2S_INLINK_START : R/W ;bitpos:[29] ;default: 1'b0 ; */ +/*description: */ +#define I2S_INLINK_START (BIT(29)) +#define I2S_INLINK_START_M (BIT(29)) +#define I2S_INLINK_START_V 0x1 +#define I2S_INLINK_START_S 29 +/* I2S_INLINK_STOP : R/W ;bitpos:[28] ;default: 1'b0 ; */ +/*description: */ +#define I2S_INLINK_STOP (BIT(28)) +#define I2S_INLINK_STOP_M (BIT(28)) +#define I2S_INLINK_STOP_V 0x1 +#define I2S_INLINK_STOP_S 28 +/* I2S_INLINK_ADDR : R/W ;bitpos:[19:0] ;default: 20'h0 ; */ +/*description: */ +#define I2S_INLINK_ADDR 0x000FFFFF +#define I2S_INLINK_ADDR_M ((I2S_INLINK_ADDR_V)<<(I2S_INLINK_ADDR_S)) +#define I2S_INLINK_ADDR_V 0xFFFFF +#define I2S_INLINK_ADDR_S 0 + +#define I2S_OUT_EOF_DES_ADDR_REG(i) (REG_I2S_BASE(i) + 0x0038) +/* I2S_OUT_EOF_DES_ADDR : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define I2S_OUT_EOF_DES_ADDR 0xFFFFFFFF +#define I2S_OUT_EOF_DES_ADDR_M ((I2S_OUT_EOF_DES_ADDR_V)<<(I2S_OUT_EOF_DES_ADDR_S)) +#define I2S_OUT_EOF_DES_ADDR_V 0xFFFFFFFF +#define I2S_OUT_EOF_DES_ADDR_S 0 + +#define I2S_IN_EOF_DES_ADDR_REG(i) (REG_I2S_BASE(i) + 0x003c) +/* I2S_IN_SUC_EOF_DES_ADDR : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define I2S_IN_SUC_EOF_DES_ADDR 0xFFFFFFFF +#define I2S_IN_SUC_EOF_DES_ADDR_M ((I2S_IN_SUC_EOF_DES_ADDR_V)<<(I2S_IN_SUC_EOF_DES_ADDR_S)) +#define I2S_IN_SUC_EOF_DES_ADDR_V 0xFFFFFFFF +#define I2S_IN_SUC_EOF_DES_ADDR_S 0 + +#define I2S_OUT_EOF_BFR_DES_ADDR_REG(i) (REG_I2S_BASE(i) + 0x0040) +/* I2S_OUT_EOF_BFR_DES_ADDR : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define I2S_OUT_EOF_BFR_DES_ADDR 0xFFFFFFFF +#define I2S_OUT_EOF_BFR_DES_ADDR_M ((I2S_OUT_EOF_BFR_DES_ADDR_V)<<(I2S_OUT_EOF_BFR_DES_ADDR_S)) +#define I2S_OUT_EOF_BFR_DES_ADDR_V 0xFFFFFFFF +#define I2S_OUT_EOF_BFR_DES_ADDR_S 0 + +#define I2S_AHB_TEST_REG(i) (REG_I2S_BASE(i) + 0x0044) +/* I2S_AHB_TESTADDR : R/W ;bitpos:[5:4] ;default: 2'b0 ; */ +/*description: */ +#define I2S_AHB_TESTADDR 0x00000003 +#define I2S_AHB_TESTADDR_M ((I2S_AHB_TESTADDR_V)<<(I2S_AHB_TESTADDR_S)) +#define I2S_AHB_TESTADDR_V 0x3 +#define I2S_AHB_TESTADDR_S 4 +/* I2S_AHB_TESTMODE : R/W ;bitpos:[2:0] ;default: 3'b0 ; */ +/*description: */ +#define I2S_AHB_TESTMODE 0x00000007 +#define I2S_AHB_TESTMODE_M ((I2S_AHB_TESTMODE_V)<<(I2S_AHB_TESTMODE_S)) +#define I2S_AHB_TESTMODE_V 0x7 +#define I2S_AHB_TESTMODE_S 0 + +#define I2S_INLINK_DSCR_REG(i) (REG_I2S_BASE(i) + 0x0048) +/* I2S_INLINK_DSCR : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define I2S_INLINK_DSCR 0xFFFFFFFF +#define I2S_INLINK_DSCR_M ((I2S_INLINK_DSCR_V)<<(I2S_INLINK_DSCR_S)) +#define I2S_INLINK_DSCR_V 0xFFFFFFFF +#define I2S_INLINK_DSCR_S 0 + +#define I2S_INLINK_DSCR_BF0_REG(i) (REG_I2S_BASE(i) + 0x004C) +/* I2S_INLINK_DSCR_BF0 : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define I2S_INLINK_DSCR_BF0 0xFFFFFFFF +#define I2S_INLINK_DSCR_BF0_M ((I2S_INLINK_DSCR_BF0_V)<<(I2S_INLINK_DSCR_BF0_S)) +#define I2S_INLINK_DSCR_BF0_V 0xFFFFFFFF +#define I2S_INLINK_DSCR_BF0_S 0 + +#define I2S_INLINK_DSCR_BF1_REG(i) (REG_I2S_BASE(i) + 0x0050) +/* I2S_INLINK_DSCR_BF1 : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define I2S_INLINK_DSCR_BF1 0xFFFFFFFF +#define I2S_INLINK_DSCR_BF1_M ((I2S_INLINK_DSCR_BF1_V)<<(I2S_INLINK_DSCR_BF1_S)) +#define I2S_INLINK_DSCR_BF1_V 0xFFFFFFFF +#define I2S_INLINK_DSCR_BF1_S 0 + +#define I2S_OUTLINK_DSCR_REG(i) (REG_I2S_BASE(i) + 0x0054) +/* I2S_OUTLINK_DSCR : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define I2S_OUTLINK_DSCR 0xFFFFFFFF +#define I2S_OUTLINK_DSCR_M ((I2S_OUTLINK_DSCR_V)<<(I2S_OUTLINK_DSCR_S)) +#define I2S_OUTLINK_DSCR_V 0xFFFFFFFF +#define I2S_OUTLINK_DSCR_S 0 + +#define I2S_OUTLINK_DSCR_BF0_REG(i) (REG_I2S_BASE(i) + 0x0058) +/* I2S_OUTLINK_DSCR_BF0 : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define I2S_OUTLINK_DSCR_BF0 0xFFFFFFFF +#define I2S_OUTLINK_DSCR_BF0_M ((I2S_OUTLINK_DSCR_BF0_V)<<(I2S_OUTLINK_DSCR_BF0_S)) +#define I2S_OUTLINK_DSCR_BF0_V 0xFFFFFFFF +#define I2S_OUTLINK_DSCR_BF0_S 0 + +#define I2S_OUTLINK_DSCR_BF1_REG(i) (REG_I2S_BASE(i) + 0x005C) +/* I2S_OUTLINK_DSCR_BF1 : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define I2S_OUTLINK_DSCR_BF1 0xFFFFFFFF +#define I2S_OUTLINK_DSCR_BF1_M ((I2S_OUTLINK_DSCR_BF1_V)<<(I2S_OUTLINK_DSCR_BF1_S)) +#define I2S_OUTLINK_DSCR_BF1_V 0xFFFFFFFF +#define I2S_OUTLINK_DSCR_BF1_S 0 + +#define I2S_LC_CONF_REG(i) (REG_I2S_BASE(i) + 0x0060) +/* I2S_MEM_TRANS_EN : R/W ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define I2S_MEM_TRANS_EN (BIT(13)) +#define I2S_MEM_TRANS_EN_M (BIT(13)) +#define I2S_MEM_TRANS_EN_V 0x1 +#define I2S_MEM_TRANS_EN_S 13 +/* I2S_CHECK_OWNER : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define I2S_CHECK_OWNER (BIT(12)) +#define I2S_CHECK_OWNER_M (BIT(12)) +#define I2S_CHECK_OWNER_V 0x1 +#define I2S_CHECK_OWNER_S 12 +/* I2S_OUT_DATA_BURST_EN : R/W ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define I2S_OUT_DATA_BURST_EN (BIT(11)) +#define I2S_OUT_DATA_BURST_EN_M (BIT(11)) +#define I2S_OUT_DATA_BURST_EN_V 0x1 +#define I2S_OUT_DATA_BURST_EN_S 11 +/* I2S_INDSCR_BURST_EN : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define I2S_INDSCR_BURST_EN (BIT(10)) +#define I2S_INDSCR_BURST_EN_M (BIT(10)) +#define I2S_INDSCR_BURST_EN_V 0x1 +#define I2S_INDSCR_BURST_EN_S 10 +/* I2S_OUTDSCR_BURST_EN : R/W ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define I2S_OUTDSCR_BURST_EN (BIT(9)) +#define I2S_OUTDSCR_BURST_EN_M (BIT(9)) +#define I2S_OUTDSCR_BURST_EN_V 0x1 +#define I2S_OUTDSCR_BURST_EN_S 9 +/* I2S_OUT_EOF_MODE : R/W ;bitpos:[8] ;default: 1'b1 ; */ +/*description: */ +#define I2S_OUT_EOF_MODE (BIT(8)) +#define I2S_OUT_EOF_MODE_M (BIT(8)) +#define I2S_OUT_EOF_MODE_V 0x1 +#define I2S_OUT_EOF_MODE_S 8 +/* I2S_OUT_NO_RESTART_CLR : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define I2S_OUT_NO_RESTART_CLR (BIT(7)) +#define I2S_OUT_NO_RESTART_CLR_M (BIT(7)) +#define I2S_OUT_NO_RESTART_CLR_V 0x1 +#define I2S_OUT_NO_RESTART_CLR_S 7 +/* I2S_OUT_AUTO_WRBACK : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define I2S_OUT_AUTO_WRBACK (BIT(6)) +#define I2S_OUT_AUTO_WRBACK_M (BIT(6)) +#define I2S_OUT_AUTO_WRBACK_V 0x1 +#define I2S_OUT_AUTO_WRBACK_S 6 +/* I2S_IN_LOOP_TEST : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define I2S_IN_LOOP_TEST (BIT(5)) +#define I2S_IN_LOOP_TEST_M (BIT(5)) +#define I2S_IN_LOOP_TEST_V 0x1 +#define I2S_IN_LOOP_TEST_S 5 +/* I2S_OUT_LOOP_TEST : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define I2S_OUT_LOOP_TEST (BIT(4)) +#define I2S_OUT_LOOP_TEST_M (BIT(4)) +#define I2S_OUT_LOOP_TEST_V 0x1 +#define I2S_OUT_LOOP_TEST_S 4 +/* I2S_AHBM_RST : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define I2S_AHBM_RST (BIT(3)) +#define I2S_AHBM_RST_M (BIT(3)) +#define I2S_AHBM_RST_V 0x1 +#define I2S_AHBM_RST_S 3 +/* I2S_AHBM_FIFO_RST : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define I2S_AHBM_FIFO_RST (BIT(2)) +#define I2S_AHBM_FIFO_RST_M (BIT(2)) +#define I2S_AHBM_FIFO_RST_V 0x1 +#define I2S_AHBM_FIFO_RST_S 2 +/* I2S_OUT_RST : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define I2S_OUT_RST (BIT(1)) +#define I2S_OUT_RST_M (BIT(1)) +#define I2S_OUT_RST_V 0x1 +#define I2S_OUT_RST_S 1 +/* I2S_IN_RST : R/W ;bitpos:[0] ;default: 1'h0 ; */ +/*description: */ +#define I2S_IN_RST (BIT(0)) +#define I2S_IN_RST_M (BIT(0)) +#define I2S_IN_RST_V 0x1 +#define I2S_IN_RST_S 0 + +#define I2S_OUTFIFO_PUSH_REG(i) (REG_I2S_BASE(i) + 0x0064) +/* I2S_OUTFIFO_PUSH : R/W ;bitpos:[16] ;default: 1'h0 ; */ +/*description: */ +#define I2S_OUTFIFO_PUSH (BIT(16)) +#define I2S_OUTFIFO_PUSH_M (BIT(16)) +#define I2S_OUTFIFO_PUSH_V 0x1 +#define I2S_OUTFIFO_PUSH_S 16 +/* I2S_OUTFIFO_WDATA : R/W ;bitpos:[8:0] ;default: 9'h0 ; */ +/*description: */ +#define I2S_OUTFIFO_WDATA 0x000001FF +#define I2S_OUTFIFO_WDATA_M ((I2S_OUTFIFO_WDATA_V)<<(I2S_OUTFIFO_WDATA_S)) +#define I2S_OUTFIFO_WDATA_V 0x1FF +#define I2S_OUTFIFO_WDATA_S 0 + +#define I2S_INFIFO_POP_REG(i) (REG_I2S_BASE(i) + 0x0068) +/* I2S_INFIFO_POP : R/W ;bitpos:[16] ;default: 1'h0 ; */ +/*description: */ +#define I2S_INFIFO_POP (BIT(16)) +#define I2S_INFIFO_POP_M (BIT(16)) +#define I2S_INFIFO_POP_V 0x1 +#define I2S_INFIFO_POP_S 16 +/* I2S_INFIFO_RDATA : RO ;bitpos:[11:0] ;default: 12'h0 ; */ +/*description: */ +#define I2S_INFIFO_RDATA 0x00000FFF +#define I2S_INFIFO_RDATA_M ((I2S_INFIFO_RDATA_V)<<(I2S_INFIFO_RDATA_S)) +#define I2S_INFIFO_RDATA_V 0xFFF +#define I2S_INFIFO_RDATA_S 0 + +#define I2S_LC_STATE0_REG(i) (REG_I2S_BASE(i) + 0x006C) +/* I2S_LC_STATE0 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define I2S_LC_STATE0 0xFFFFFFFF +#define I2S_LC_STATE0_M ((I2S_LC_STATE0_V)<<(I2S_LC_STATE0_S)) +#define I2S_LC_STATE0_V 0xFFFFFFFF +#define I2S_LC_STATE0_S 0 + +#define I2S_LC_STATE1_REG(i) (REG_I2S_BASE(i) + 0x0070) +/* I2S_LC_STATE1 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define I2S_LC_STATE1 0xFFFFFFFF +#define I2S_LC_STATE1_M ((I2S_LC_STATE1_V)<<(I2S_LC_STATE1_S)) +#define I2S_LC_STATE1_V 0xFFFFFFFF +#define I2S_LC_STATE1_S 0 + +#define I2S_LC_HUNG_CONF_REG(i) (REG_I2S_BASE(i) + 0x0074) +/* I2S_LC_FIFO_TIMEOUT_ENA : R/W ;bitpos:[11] ;default: 1'b1 ; */ +/*description: */ +#define I2S_LC_FIFO_TIMEOUT_ENA (BIT(11)) +#define I2S_LC_FIFO_TIMEOUT_ENA_M (BIT(11)) +#define I2S_LC_FIFO_TIMEOUT_ENA_V 0x1 +#define I2S_LC_FIFO_TIMEOUT_ENA_S 11 +/* I2S_LC_FIFO_TIMEOUT_SHIFT : R/W ;bitpos:[10:8] ;default: 3'b0 ; */ +/*description: */ +#define I2S_LC_FIFO_TIMEOUT_SHIFT 0x00000007 +#define I2S_LC_FIFO_TIMEOUT_SHIFT_M ((I2S_LC_FIFO_TIMEOUT_SHIFT_V)<<(I2S_LC_FIFO_TIMEOUT_SHIFT_S)) +#define I2S_LC_FIFO_TIMEOUT_SHIFT_V 0x7 +#define I2S_LC_FIFO_TIMEOUT_SHIFT_S 8 +/* I2S_LC_FIFO_TIMEOUT : R/W ;bitpos:[7:0] ;default: 8'h10 ; */ +/*description: */ +#define I2S_LC_FIFO_TIMEOUT 0x000000FF +#define I2S_LC_FIFO_TIMEOUT_M ((I2S_LC_FIFO_TIMEOUT_V)<<(I2S_LC_FIFO_TIMEOUT_S)) +#define I2S_LC_FIFO_TIMEOUT_V 0xFF +#define I2S_LC_FIFO_TIMEOUT_S 0 + +#define I2S_CVSD_CONF0_REG(i) (REG_I2S_BASE(i) + 0x0080) +/* I2S_CVSD_Y_MIN : R/W ;bitpos:[31:16] ;default: 16'h8000 ; */ +/*description: */ +#define I2S_CVSD_Y_MIN 0x0000FFFF +#define I2S_CVSD_Y_MIN_M ((I2S_CVSD_Y_MIN_V)<<(I2S_CVSD_Y_MIN_S)) +#define I2S_CVSD_Y_MIN_V 0xFFFF +#define I2S_CVSD_Y_MIN_S 16 +/* I2S_CVSD_Y_MAX : R/W ;bitpos:[15:0] ;default: 16'h7fff ; */ +/*description: */ +#define I2S_CVSD_Y_MAX 0x0000FFFF +#define I2S_CVSD_Y_MAX_M ((I2S_CVSD_Y_MAX_V)<<(I2S_CVSD_Y_MAX_S)) +#define I2S_CVSD_Y_MAX_V 0xFFFF +#define I2S_CVSD_Y_MAX_S 0 + +#define I2S_CVSD_CONF1_REG(i) (REG_I2S_BASE(i) + 0x0084) +/* I2S_CVSD_SIGMA_MIN : R/W ;bitpos:[31:16] ;default: 16'd10 ; */ +/*description: */ +#define I2S_CVSD_SIGMA_MIN 0x0000FFFF +#define I2S_CVSD_SIGMA_MIN_M ((I2S_CVSD_SIGMA_MIN_V)<<(I2S_CVSD_SIGMA_MIN_S)) +#define I2S_CVSD_SIGMA_MIN_V 0xFFFF +#define I2S_CVSD_SIGMA_MIN_S 16 +/* I2S_CVSD_SIGMA_MAX : R/W ;bitpos:[15:0] ;default: 16'd1280 ; */ +/*description: */ +#define I2S_CVSD_SIGMA_MAX 0x0000FFFF +#define I2S_CVSD_SIGMA_MAX_M ((I2S_CVSD_SIGMA_MAX_V)<<(I2S_CVSD_SIGMA_MAX_S)) +#define I2S_CVSD_SIGMA_MAX_V 0xFFFF +#define I2S_CVSD_SIGMA_MAX_S 0 + +#define I2S_CVSD_CONF2_REG(i) (REG_I2S_BASE(i) + 0x0088) +/* I2S_CVSD_H : R/W ;bitpos:[18:16] ;default: 3'd5 ; */ +/*description: */ +#define I2S_CVSD_H 0x00000007 +#define I2S_CVSD_H_M ((I2S_CVSD_H_V)<<(I2S_CVSD_H_S)) +#define I2S_CVSD_H_V 0x7 +#define I2S_CVSD_H_S 16 +/* I2S_CVSD_BETA : R/W ;bitpos:[15:6] ;default: 10'd10 ; */ +/*description: */ +#define I2S_CVSD_BETA 0x000003FF +#define I2S_CVSD_BETA_M ((I2S_CVSD_BETA_V)<<(I2S_CVSD_BETA_S)) +#define I2S_CVSD_BETA_V 0x3FF +#define I2S_CVSD_BETA_S 6 +/* I2S_CVSD_J : R/W ;bitpos:[5:3] ;default: 3'h4 ; */ +/*description: */ +#define I2S_CVSD_J 0x00000007 +#define I2S_CVSD_J_M ((I2S_CVSD_J_V)<<(I2S_CVSD_J_S)) +#define I2S_CVSD_J_V 0x7 +#define I2S_CVSD_J_S 3 +/* I2S_CVSD_K : R/W ;bitpos:[2:0] ;default: 3'h4 ; */ +/*description: */ +#define I2S_CVSD_K 0x00000007 +#define I2S_CVSD_K_M ((I2S_CVSD_K_V)<<(I2S_CVSD_K_S)) +#define I2S_CVSD_K_V 0x7 +#define I2S_CVSD_K_S 0 + +#define I2S_PLC_CONF0_REG(i) (REG_I2S_BASE(i) + 0x008C) +/* I2S_N_MIN_ERR : R/W ;bitpos:[27:25] ;default: 3'd4 ; */ +/*description: */ +#define I2S_N_MIN_ERR 0x00000007 +#define I2S_N_MIN_ERR_M ((I2S_N_MIN_ERR_V)<<(I2S_N_MIN_ERR_S)) +#define I2S_N_MIN_ERR_V 0x7 +#define I2S_N_MIN_ERR_S 25 +/* I2S_PACK_LEN_8K : R/W ;bitpos:[24:20] ;default: 5'd10 ; */ +/*description: */ +#define I2S_PACK_LEN_8K 0x0000001F +#define I2S_PACK_LEN_8K_M ((I2S_PACK_LEN_8K_V)<<(I2S_PACK_LEN_8K_S)) +#define I2S_PACK_LEN_8K_V 0x1F +#define I2S_PACK_LEN_8K_S 20 +/* I2S_MAX_SLIDE_SAMPLE : R/W ;bitpos:[19:12] ;default: 8'd128 ; */ +/*description: */ +#define I2S_MAX_SLIDE_SAMPLE 0x000000FF +#define I2S_MAX_SLIDE_SAMPLE_M ((I2S_MAX_SLIDE_SAMPLE_V)<<(I2S_MAX_SLIDE_SAMPLE_S)) +#define I2S_MAX_SLIDE_SAMPLE_V 0xFF +#define I2S_MAX_SLIDE_SAMPLE_S 12 +/* I2S_SHIFT_RATE : R/W ;bitpos:[11:9] ;default: 3'h1 ; */ +/*description: */ +#define I2S_SHIFT_RATE 0x00000007 +#define I2S_SHIFT_RATE_M ((I2S_SHIFT_RATE_V)<<(I2S_SHIFT_RATE_S)) +#define I2S_SHIFT_RATE_V 0x7 +#define I2S_SHIFT_RATE_S 9 +/* I2S_N_ERR_SEG : R/W ;bitpos:[8:6] ;default: 3'h4 ; */ +/*description: */ +#define I2S_N_ERR_SEG 0x00000007 +#define I2S_N_ERR_SEG_M ((I2S_N_ERR_SEG_V)<<(I2S_N_ERR_SEG_S)) +#define I2S_N_ERR_SEG_V 0x7 +#define I2S_N_ERR_SEG_S 6 +/* I2S_GOOD_PACK_MAX : R/W ;bitpos:[5:0] ;default: 6'h39 ; */ +/*description: */ +#define I2S_GOOD_PACK_MAX 0x0000003F +#define I2S_GOOD_PACK_MAX_M ((I2S_GOOD_PACK_MAX_V)<<(I2S_GOOD_PACK_MAX_S)) +#define I2S_GOOD_PACK_MAX_V 0x3F +#define I2S_GOOD_PACK_MAX_S 0 + +#define I2S_PLC_CONF1_REG(i) (REG_I2S_BASE(i) + 0x0090) +/* I2S_SLIDE_WIN_LEN : R/W ;bitpos:[31:24] ;default: 8'd160 ; */ +/*description: */ +#define I2S_SLIDE_WIN_LEN 0x000000FF +#define I2S_SLIDE_WIN_LEN_M ((I2S_SLIDE_WIN_LEN_V)<<(I2S_SLIDE_WIN_LEN_S)) +#define I2S_SLIDE_WIN_LEN_V 0xFF +#define I2S_SLIDE_WIN_LEN_S 24 +/* I2S_BAD_OLA_WIN2_PARA : R/W ;bitpos:[23:16] ;default: 8'd23 ; */ +/*description: */ +#define I2S_BAD_OLA_WIN2_PARA 0x000000FF +#define I2S_BAD_OLA_WIN2_PARA_M ((I2S_BAD_OLA_WIN2_PARA_V)<<(I2S_BAD_OLA_WIN2_PARA_S)) +#define I2S_BAD_OLA_WIN2_PARA_V 0xFF +#define I2S_BAD_OLA_WIN2_PARA_S 16 +/* I2S_BAD_OLA_WIN2_PARA_SHIFT : R/W ;bitpos:[15:12] ;default: 4'd8 ; */ +/*description: */ +#define I2S_BAD_OLA_WIN2_PARA_SHIFT 0x0000000F +#define I2S_BAD_OLA_WIN2_PARA_SHIFT_M ((I2S_BAD_OLA_WIN2_PARA_SHIFT_V)<<(I2S_BAD_OLA_WIN2_PARA_SHIFT_S)) +#define I2S_BAD_OLA_WIN2_PARA_SHIFT_V 0xF +#define I2S_BAD_OLA_WIN2_PARA_SHIFT_S 12 +/* I2S_BAD_CEF_ATTEN_PARA_SHIFT : R/W ;bitpos:[11:8] ;default: 4'd10 ; */ +/*description: */ +#define I2S_BAD_CEF_ATTEN_PARA_SHIFT 0x0000000F +#define I2S_BAD_CEF_ATTEN_PARA_SHIFT_M ((I2S_BAD_CEF_ATTEN_PARA_SHIFT_V)<<(I2S_BAD_CEF_ATTEN_PARA_SHIFT_S)) +#define I2S_BAD_CEF_ATTEN_PARA_SHIFT_V 0xF +#define I2S_BAD_CEF_ATTEN_PARA_SHIFT_S 8 +/* I2S_BAD_CEF_ATTEN_PARA : R/W ;bitpos:[7:0] ;default: 8'd5 ; */ +/*description: */ +#define I2S_BAD_CEF_ATTEN_PARA 0x000000FF +#define I2S_BAD_CEF_ATTEN_PARA_M ((I2S_BAD_CEF_ATTEN_PARA_V)<<(I2S_BAD_CEF_ATTEN_PARA_S)) +#define I2S_BAD_CEF_ATTEN_PARA_V 0xFF +#define I2S_BAD_CEF_ATTEN_PARA_S 0 + +#define I2S_PLC_CONF2_REG(i) (REG_I2S_BASE(i) + 0x0094) +/* I2S_MIN_PERIOD : R/W ;bitpos:[6:2] ;default: 5'd10 ; */ +/*description: */ +#define I2S_MIN_PERIOD 0x0000001F +#define I2S_MIN_PERIOD_M ((I2S_MIN_PERIOD_V)<<(I2S_MIN_PERIOD_S)) +#define I2S_MIN_PERIOD_V 0x1F +#define I2S_MIN_PERIOD_S 2 +/* I2S_CVSD_SEG_MOD : R/W ;bitpos:[1:0] ;default: 2'd0 ; */ +/*description: */ +#define I2S_CVSD_SEG_MOD 0x00000003 +#define I2S_CVSD_SEG_MOD_M ((I2S_CVSD_SEG_MOD_V)<<(I2S_CVSD_SEG_MOD_S)) +#define I2S_CVSD_SEG_MOD_V 0x3 +#define I2S_CVSD_SEG_MOD_S 0 + +#define I2S_ESCO_CONF0_REG(i) (REG_I2S_BASE(i) + 0x0098) +/* I2S_PLC2DMA_EN : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define I2S_PLC2DMA_EN (BIT(12)) +#define I2S_PLC2DMA_EN_M (BIT(12)) +#define I2S_PLC2DMA_EN_V 0x1 +#define I2S_PLC2DMA_EN_S 12 +/* I2S_PLC_EN : R/W ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define I2S_PLC_EN (BIT(11)) +#define I2S_PLC_EN_M (BIT(11)) +#define I2S_PLC_EN_V 0x1 +#define I2S_PLC_EN_S 11 +/* I2S_CVSD_DEC_RESET : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define I2S_CVSD_DEC_RESET (BIT(10)) +#define I2S_CVSD_DEC_RESET_M (BIT(10)) +#define I2S_CVSD_DEC_RESET_V 0x1 +#define I2S_CVSD_DEC_RESET_S 10 +/* I2S_CVSD_DEC_START : R/W ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define I2S_CVSD_DEC_START (BIT(9)) +#define I2S_CVSD_DEC_START_M (BIT(9)) +#define I2S_CVSD_DEC_START_V 0x1 +#define I2S_CVSD_DEC_START_S 9 +/* I2S_ESCO_CVSD_INF_EN : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define I2S_ESCO_CVSD_INF_EN (BIT(8)) +#define I2S_ESCO_CVSD_INF_EN_M (BIT(8)) +#define I2S_ESCO_CVSD_INF_EN_V 0x1 +#define I2S_ESCO_CVSD_INF_EN_S 8 +/* I2S_ESCO_CVSD_PACK_LEN_8K : R/W ;bitpos:[7:3] ;default: 5'b0 ; */ +/*description: */ +#define I2S_ESCO_CVSD_PACK_LEN_8K 0x0000001F +#define I2S_ESCO_CVSD_PACK_LEN_8K_M ((I2S_ESCO_CVSD_PACK_LEN_8K_V)<<(I2S_ESCO_CVSD_PACK_LEN_8K_S)) +#define I2S_ESCO_CVSD_PACK_LEN_8K_V 0x1F +#define I2S_ESCO_CVSD_PACK_LEN_8K_S 3 +/* I2S_ESCO_CVSD_DEC_PACK_ERR : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define I2S_ESCO_CVSD_DEC_PACK_ERR (BIT(2)) +#define I2S_ESCO_CVSD_DEC_PACK_ERR_M (BIT(2)) +#define I2S_ESCO_CVSD_DEC_PACK_ERR_V 0x1 +#define I2S_ESCO_CVSD_DEC_PACK_ERR_S 2 +/* I2S_ESCO_CHAN_MOD : R/W ;bitpos:[1] ;default: 1'd0 ; */ +/*description: */ +#define I2S_ESCO_CHAN_MOD (BIT(1)) +#define I2S_ESCO_CHAN_MOD_M (BIT(1)) +#define I2S_ESCO_CHAN_MOD_V 0x1 +#define I2S_ESCO_CHAN_MOD_S 1 +/* I2S_ESCO_EN : R/W ;bitpos:[0] ;default: 1'd0 ; */ +/*description: */ +#define I2S_ESCO_EN (BIT(0)) +#define I2S_ESCO_EN_M (BIT(0)) +#define I2S_ESCO_EN_V 0x1 +#define I2S_ESCO_EN_S 0 + +#define I2S_SCO_CONF0_REG(i) (REG_I2S_BASE(i) + 0x009c) +/* I2S_CVSD_ENC_RESET : R/W ;bitpos:[3] ;default: 1'd0 ; */ +/*description: */ +#define I2S_CVSD_ENC_RESET (BIT(3)) +#define I2S_CVSD_ENC_RESET_M (BIT(3)) +#define I2S_CVSD_ENC_RESET_V 0x1 +#define I2S_CVSD_ENC_RESET_S 3 +/* I2S_CVSD_ENC_START : R/W ;bitpos:[2] ;default: 1'd0 ; */ +/*description: */ +#define I2S_CVSD_ENC_START (BIT(2)) +#define I2S_CVSD_ENC_START_M (BIT(2)) +#define I2S_CVSD_ENC_START_V 0x1 +#define I2S_CVSD_ENC_START_S 2 +/* I2S_SCO_NO_I2S_EN : R/W ;bitpos:[1] ;default: 1'd0 ; */ +/*description: */ +#define I2S_SCO_NO_I2S_EN (BIT(1)) +#define I2S_SCO_NO_I2S_EN_M (BIT(1)) +#define I2S_SCO_NO_I2S_EN_V 0x1 +#define I2S_SCO_NO_I2S_EN_S 1 +/* I2S_SCO_WITH_I2S_EN : R/W ;bitpos:[0] ;default: 1'd0 ; */ +/*description: */ +#define I2S_SCO_WITH_I2S_EN (BIT(0)) +#define I2S_SCO_WITH_I2S_EN_M (BIT(0)) +#define I2S_SCO_WITH_I2S_EN_V 0x1 +#define I2S_SCO_WITH_I2S_EN_S 0 + +#define I2S_CONF1_REG(i) (REG_I2S_BASE(i) + 0x00a0) +/* I2S_TX_ZEROS_RM_EN : R/W ;bitpos:[9] ;default: 1'd0 ; */ +/*description: */ +#define I2S_TX_ZEROS_RM_EN (BIT(9)) +#define I2S_TX_ZEROS_RM_EN_M (BIT(9)) +#define I2S_TX_ZEROS_RM_EN_V 0x1 +#define I2S_TX_ZEROS_RM_EN_S 9 +/* I2S_TX_STOP_EN : R/W ;bitpos:[8] ;default: 1'd0 ; */ +/*description: */ +#define I2S_TX_STOP_EN (BIT(8)) +#define I2S_TX_STOP_EN_M (BIT(8)) +#define I2S_TX_STOP_EN_V 0x1 +#define I2S_TX_STOP_EN_S 8 +/* I2S_RX_PCM_BYPASS : R/W ;bitpos:[7] ;default: 1'h1 ; */ +/*description: */ +#define I2S_RX_PCM_BYPASS (BIT(7)) +#define I2S_RX_PCM_BYPASS_M (BIT(7)) +#define I2S_RX_PCM_BYPASS_V 0x1 +#define I2S_RX_PCM_BYPASS_S 7 +/* I2S_RX_PCM_CONF : R/W ;bitpos:[6:4] ;default: 3'h0 ; */ +/*description: */ +#define I2S_RX_PCM_CONF 0x00000007 +#define I2S_RX_PCM_CONF_M ((I2S_RX_PCM_CONF_V)<<(I2S_RX_PCM_CONF_S)) +#define I2S_RX_PCM_CONF_V 0x7 +#define I2S_RX_PCM_CONF_S 4 +/* I2S_TX_PCM_BYPASS : R/W ;bitpos:[3] ;default: 1'h1 ; */ +/*description: */ +#define I2S_TX_PCM_BYPASS (BIT(3)) +#define I2S_TX_PCM_BYPASS_M (BIT(3)) +#define I2S_TX_PCM_BYPASS_V 0x1 +#define I2S_TX_PCM_BYPASS_S 3 +/* I2S_TX_PCM_CONF : R/W ;bitpos:[2:0] ;default: 3'h1 ; */ +/*description: */ +#define I2S_TX_PCM_CONF 0x00000007 +#define I2S_TX_PCM_CONF_M ((I2S_TX_PCM_CONF_V)<<(I2S_TX_PCM_CONF_S)) +#define I2S_TX_PCM_CONF_V 0x7 +#define I2S_TX_PCM_CONF_S 0 + +#define I2S_PD_CONF_REG(i) (REG_I2S_BASE(i) + 0x00a4) +/* I2S_PLC_MEM_FORCE_PU : R/W ;bitpos:[3] ;default: 1'h1 ; */ +/*description: */ +#define I2S_PLC_MEM_FORCE_PU (BIT(3)) +#define I2S_PLC_MEM_FORCE_PU_M (BIT(3)) +#define I2S_PLC_MEM_FORCE_PU_V 0x1 +#define I2S_PLC_MEM_FORCE_PU_S 3 +/* I2S_PLC_MEM_FORCE_PD : R/W ;bitpos:[2] ;default: 1'h0 ; */ +/*description: */ +#define I2S_PLC_MEM_FORCE_PD (BIT(2)) +#define I2S_PLC_MEM_FORCE_PD_M (BIT(2)) +#define I2S_PLC_MEM_FORCE_PD_V 0x1 +#define I2S_PLC_MEM_FORCE_PD_S 2 +/* I2S_FIFO_FORCE_PU : R/W ;bitpos:[1] ;default: 1'h1 ; */ +/*description: */ +#define I2S_FIFO_FORCE_PU (BIT(1)) +#define I2S_FIFO_FORCE_PU_M (BIT(1)) +#define I2S_FIFO_FORCE_PU_V 0x1 +#define I2S_FIFO_FORCE_PU_S 1 +/* I2S_FIFO_FORCE_PD : R/W ;bitpos:[0] ;default: 1'h0 ; */ +/*description: */ +#define I2S_FIFO_FORCE_PD (BIT(0)) +#define I2S_FIFO_FORCE_PD_M (BIT(0)) +#define I2S_FIFO_FORCE_PD_V 0x1 +#define I2S_FIFO_FORCE_PD_S 0 + +#define I2S_CONF2_REG(i) (REG_I2S_BASE(i) + 0x00a8) +/* I2S_INTER_VALID_EN : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define I2S_INTER_VALID_EN (BIT(7)) +#define I2S_INTER_VALID_EN_M (BIT(7)) +#define I2S_INTER_VALID_EN_V 0x1 +#define I2S_INTER_VALID_EN_S 7 +/* I2S_EXT_ADC_START_EN : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define I2S_EXT_ADC_START_EN (BIT(6)) +#define I2S_EXT_ADC_START_EN_M (BIT(6)) +#define I2S_EXT_ADC_START_EN_V 0x1 +#define I2S_EXT_ADC_START_EN_S 6 +/* I2S_LCD_EN : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define I2S_LCD_EN (BIT(5)) +#define I2S_LCD_EN_M (BIT(5)) +#define I2S_LCD_EN_V 0x1 +#define I2S_LCD_EN_S 5 +/* I2S_DATA_ENABLE : R/W ;bitpos:[4] ;default: 1'h0 ; */ +/*description: */ +#define I2S_DATA_ENABLE (BIT(4)) +#define I2S_DATA_ENABLE_M (BIT(4)) +#define I2S_DATA_ENABLE_V 0x1 +#define I2S_DATA_ENABLE_S 4 +/* I2S_DATA_ENABLE_TEST_EN : R/W ;bitpos:[3] ;default: 1'h0 ; */ +/*description: */ +#define I2S_DATA_ENABLE_TEST_EN (BIT(3)) +#define I2S_DATA_ENABLE_TEST_EN_M (BIT(3)) +#define I2S_DATA_ENABLE_TEST_EN_V 0x1 +#define I2S_DATA_ENABLE_TEST_EN_S 3 +/* I2S_LCD_TX_SDX2_EN : R/W ;bitpos:[2] ;default: 1'h0 ; */ +/*description: */ +#define I2S_LCD_TX_SDX2_EN (BIT(2)) +#define I2S_LCD_TX_SDX2_EN_M (BIT(2)) +#define I2S_LCD_TX_SDX2_EN_V 0x1 +#define I2S_LCD_TX_SDX2_EN_S 2 +/* I2S_LCD_TX_WRX2_EN : R/W ;bitpos:[1] ;default: 1'h0 ; */ +/*description: */ +#define I2S_LCD_TX_WRX2_EN (BIT(1)) +#define I2S_LCD_TX_WRX2_EN_M (BIT(1)) +#define I2S_LCD_TX_WRX2_EN_V 0x1 +#define I2S_LCD_TX_WRX2_EN_S 1 +/* I2S_CAMERA_EN : R/W ;bitpos:[0] ;default: 1'h0 ; */ +/*description: */ +#define I2S_CAMERA_EN (BIT(0)) +#define I2S_CAMERA_EN_M (BIT(0)) +#define I2S_CAMERA_EN_V 0x1 +#define I2S_CAMERA_EN_S 0 + +#define I2S_CLKM_CONF_REG(i) (REG_I2S_BASE(i) + 0x00ac) +/* I2S_CLKA_ENA : R/W ;bitpos:[21] ;default: 1'b0 ; */ +/*description: */ +#define I2S_CLKA_ENA (BIT(21)) +#define I2S_CLKA_ENA_M (BIT(21)) +#define I2S_CLKA_ENA_V 0x1 +#define I2S_CLKA_ENA_S 21 +/* I2S_CLK_EN : R/W ;bitpos:[20] ;default: 1'b0 ; */ +/*description: */ +#define I2S_CLK_EN (BIT(20)) +#define I2S_CLK_EN_M (BIT(20)) +#define I2S_CLK_EN_V 0x1 +#define I2S_CLK_EN_S 20 +/* I2S_CLKM_DIV_A : R/W ;bitpos:[19:14] ;default: 6'h0 ; */ +/*description: */ +#define I2S_CLKM_DIV_A 0x0000003F +#define I2S_CLKM_DIV_A_M ((I2S_CLKM_DIV_A_V)<<(I2S_CLKM_DIV_A_S)) +#define I2S_CLKM_DIV_A_V 0x3F +#define I2S_CLKM_DIV_A_S 14 +/* I2S_CLKM_DIV_B : R/W ;bitpos:[13:8] ;default: 6'h0 ; */ +/*description: */ +#define I2S_CLKM_DIV_B 0x0000003F +#define I2S_CLKM_DIV_B_M ((I2S_CLKM_DIV_B_V)<<(I2S_CLKM_DIV_B_S)) +#define I2S_CLKM_DIV_B_V 0x3F +#define I2S_CLKM_DIV_B_S 8 +/* I2S_CLKM_DIV_NUM : R/W ;bitpos:[7:0] ;default: 8'd4 ; */ +/*description: */ +#define I2S_CLKM_DIV_NUM 0x000000FF +#define I2S_CLKM_DIV_NUM_M ((I2S_CLKM_DIV_NUM_V)<<(I2S_CLKM_DIV_NUM_S)) +#define I2S_CLKM_DIV_NUM_V 0xFF +#define I2S_CLKM_DIV_NUM_S 0 + +#define I2S_SAMPLE_RATE_CONF_REG(i) (REG_I2S_BASE(i) + 0x00b0) +/* I2S_RX_BITS_MOD : R/W ;bitpos:[23:18] ;default: 6'd16 ; */ +/*description: */ +#define I2S_RX_BITS_MOD 0x0000003F +#define I2S_RX_BITS_MOD_M ((I2S_RX_BITS_MOD_V)<<(I2S_RX_BITS_MOD_S)) +#define I2S_RX_BITS_MOD_V 0x3F +#define I2S_RX_BITS_MOD_S 18 +/* I2S_TX_BITS_MOD : R/W ;bitpos:[17:12] ;default: 6'd16 ; */ +/*description: */ +#define I2S_TX_BITS_MOD 0x0000003F +#define I2S_TX_BITS_MOD_M ((I2S_TX_BITS_MOD_V)<<(I2S_TX_BITS_MOD_S)) +#define I2S_TX_BITS_MOD_V 0x3F +#define I2S_TX_BITS_MOD_S 12 +/* I2S_RX_BCK_DIV_NUM : R/W ;bitpos:[11:6] ;default: 6'd6 ; */ +/*description: */ +#define I2S_RX_BCK_DIV_NUM 0x0000003F +#define I2S_RX_BCK_DIV_NUM_M ((I2S_RX_BCK_DIV_NUM_V)<<(I2S_RX_BCK_DIV_NUM_S)) +#define I2S_RX_BCK_DIV_NUM_V 0x3F +#define I2S_RX_BCK_DIV_NUM_S 6 +/* I2S_TX_BCK_DIV_NUM : R/W ;bitpos:[5:0] ;default: 6'd6 ; */ +/*description: */ +#define I2S_TX_BCK_DIV_NUM 0x0000003F +#define I2S_TX_BCK_DIV_NUM_M ((I2S_TX_BCK_DIV_NUM_V)<<(I2S_TX_BCK_DIV_NUM_S)) +#define I2S_TX_BCK_DIV_NUM_V 0x3F +#define I2S_TX_BCK_DIV_NUM_S 0 + +#define I2S_PDM_CONF_REG(i) (REG_I2S_BASE(i) + 0x00b4) +/* I2S_TX_PDM_HP_BYPASS : R/W ;bitpos:[25] ;default: 1'h0 ; */ +/*description: */ +#define I2S_TX_PDM_HP_BYPASS (BIT(25)) +#define I2S_TX_PDM_HP_BYPASS_M (BIT(25)) +#define I2S_TX_PDM_HP_BYPASS_V 0x1 +#define I2S_TX_PDM_HP_BYPASS_S 25 +/* I2S_RX_PDM_SINC_DSR_16_EN : R/W ;bitpos:[24] ;default: 1'h1 ; */ +/*description: */ +#define I2S_RX_PDM_SINC_DSR_16_EN (BIT(24)) +#define I2S_RX_PDM_SINC_DSR_16_EN_M (BIT(24)) +#define I2S_RX_PDM_SINC_DSR_16_EN_V 0x1 +#define I2S_RX_PDM_SINC_DSR_16_EN_S 24 +/* I2S_TX_PDM_SIGMADELTA_IN_SHIFT : R/W ;bitpos:[23:22] ;default: 2'h1 ; */ +/*description: */ +#define I2S_TX_PDM_SIGMADELTA_IN_SHIFT 0x00000003 +#define I2S_TX_PDM_SIGMADELTA_IN_SHIFT_M ((I2S_TX_PDM_SIGMADELTA_IN_SHIFT_V)<<(I2S_TX_PDM_SIGMADELTA_IN_SHIFT_S)) +#define I2S_TX_PDM_SIGMADELTA_IN_SHIFT_V 0x3 +#define I2S_TX_PDM_SIGMADELTA_IN_SHIFT_S 22 +/* I2S_TX_PDM_SINC_IN_SHIFT : R/W ;bitpos:[21:20] ;default: 2'h1 ; */ +/*description: */ +#define I2S_TX_PDM_SINC_IN_SHIFT 0x00000003 +#define I2S_TX_PDM_SINC_IN_SHIFT_M ((I2S_TX_PDM_SINC_IN_SHIFT_V)<<(I2S_TX_PDM_SINC_IN_SHIFT_S)) +#define I2S_TX_PDM_SINC_IN_SHIFT_V 0x3 +#define I2S_TX_PDM_SINC_IN_SHIFT_S 20 +/* I2S_TX_PDM_LP_IN_SHIFT : R/W ;bitpos:[19:18] ;default: 2'h1 ; */ +/*description: */ +#define I2S_TX_PDM_LP_IN_SHIFT 0x00000003 +#define I2S_TX_PDM_LP_IN_SHIFT_M ((I2S_TX_PDM_LP_IN_SHIFT_V)<<(I2S_TX_PDM_LP_IN_SHIFT_S)) +#define I2S_TX_PDM_LP_IN_SHIFT_V 0x3 +#define I2S_TX_PDM_LP_IN_SHIFT_S 18 +/* I2S_TX_PDM_HP_IN_SHIFT : R/W ;bitpos:[17:16] ;default: 2'h1 ; */ +/*description: */ +#define I2S_TX_PDM_HP_IN_SHIFT 0x00000003 +#define I2S_TX_PDM_HP_IN_SHIFT_M ((I2S_TX_PDM_HP_IN_SHIFT_V)<<(I2S_TX_PDM_HP_IN_SHIFT_S)) +#define I2S_TX_PDM_HP_IN_SHIFT_V 0x3 +#define I2S_TX_PDM_HP_IN_SHIFT_S 16 +/* I2S_TX_PDM_PRESCALE : R/W ;bitpos:[15:8] ;default: 8'h0 ; */ +/*description: */ +#define I2S_TX_PDM_PRESCALE 0x000000FF +#define I2S_TX_PDM_PRESCALE_M ((I2S_TX_PDM_PRESCALE_V)<<(I2S_TX_PDM_PRESCALE_S)) +#define I2S_TX_PDM_PRESCALE_V 0xFF +#define I2S_TX_PDM_PRESCALE_S 8 +/* I2S_TX_PDM_SINC_OSR2 : R/W ;bitpos:[7:4] ;default: 4'h2 ; */ +/*description: */ +#define I2S_TX_PDM_SINC_OSR2 0x0000000F +#define I2S_TX_PDM_SINC_OSR2_M ((I2S_TX_PDM_SINC_OSR2_V)<<(I2S_TX_PDM_SINC_OSR2_S)) +#define I2S_TX_PDM_SINC_OSR2_V 0xF +#define I2S_TX_PDM_SINC_OSR2_S 4 +/* I2S_PDM2PCM_CONV_EN : R/W ;bitpos:[3] ;default: 1'h0 ; */ +/*description: */ +#define I2S_PDM2PCM_CONV_EN (BIT(3)) +#define I2S_PDM2PCM_CONV_EN_M (BIT(3)) +#define I2S_PDM2PCM_CONV_EN_V 0x1 +#define I2S_PDM2PCM_CONV_EN_S 3 +/* I2S_PCM2PDM_CONV_EN : R/W ;bitpos:[2] ;default: 1'h0 ; */ +/*description: */ +#define I2S_PCM2PDM_CONV_EN (BIT(2)) +#define I2S_PCM2PDM_CONV_EN_M (BIT(2)) +#define I2S_PCM2PDM_CONV_EN_V 0x1 +#define I2S_PCM2PDM_CONV_EN_S 2 +/* I2S_RX_PDM_EN : R/W ;bitpos:[1] ;default: 1'h0 ; */ +/*description: */ +#define I2S_RX_PDM_EN (BIT(1)) +#define I2S_RX_PDM_EN_M (BIT(1)) +#define I2S_RX_PDM_EN_V 0x1 +#define I2S_RX_PDM_EN_S 1 +/* I2S_TX_PDM_EN : R/W ;bitpos:[0] ;default: 1'h0 ; */ +/*description: */ +#define I2S_TX_PDM_EN (BIT(0)) +#define I2S_TX_PDM_EN_M (BIT(0)) +#define I2S_TX_PDM_EN_V 0x1 +#define I2S_TX_PDM_EN_S 0 + +#define I2S_PDM_FREQ_CONF_REG(i) (REG_I2S_BASE(i) + 0x00b8) +/* I2S_TX_PDM_FP : R/W ;bitpos:[19:10] ;default: 10'd960 ; */ +/*description: */ +#define I2S_TX_PDM_FP 0x000003FF +#define I2S_TX_PDM_FP_M ((I2S_TX_PDM_FP_V)<<(I2S_TX_PDM_FP_S)) +#define I2S_TX_PDM_FP_V 0x3FF +#define I2S_TX_PDM_FP_S 10 +/* I2S_TX_PDM_FS : R/W ;bitpos:[9:0] ;default: 10'd480 ; */ +/*description: */ +#define I2S_TX_PDM_FS 0x000003FF +#define I2S_TX_PDM_FS_M ((I2S_TX_PDM_FS_V)<<(I2S_TX_PDM_FS_S)) +#define I2S_TX_PDM_FS_V 0x3FF +#define I2S_TX_PDM_FS_S 0 + +#define I2S_STATE_REG(i) (REG_I2S_BASE(i) + 0x00bc) +/* I2S_RX_FIFO_RESET_BACK : RO ;bitpos:[2] ;default: 1'b1 ; */ +/*description: */ +#define I2S_RX_FIFO_RESET_BACK (BIT(2)) +#define I2S_RX_FIFO_RESET_BACK_M (BIT(2)) +#define I2S_RX_FIFO_RESET_BACK_V 0x1 +#define I2S_RX_FIFO_RESET_BACK_S 2 +/* I2S_TX_FIFO_RESET_BACK : RO ;bitpos:[1] ;default: 1'b1 ; */ +/*description: */ +#define I2S_TX_FIFO_RESET_BACK (BIT(1)) +#define I2S_TX_FIFO_RESET_BACK_M (BIT(1)) +#define I2S_TX_FIFO_RESET_BACK_V 0x1 +#define I2S_TX_FIFO_RESET_BACK_S 1 +/* I2S_TX_IDLE : RO ;bitpos:[0] ;default: 1'b1 ; */ +/*description: */ +#define I2S_TX_IDLE (BIT(0)) +#define I2S_TX_IDLE_M (BIT(0)) +#define I2S_TX_IDLE_V 0x1 +#define I2S_TX_IDLE_S 0 + +#define I2S_DATE_REG(i) (REG_I2S_BASE(i) + 0x00fc) +/* I2S_I2SDATE : R/W ;bitpos:[31:0] ;default: 32'h1604201 ; */ +/*description: */ +#define I2S_I2SDATE 0xFFFFFFFF +#define I2S_I2SDATE_M ((I2S_I2SDATE_V)<<(I2S_I2SDATE_S)) +#define I2S_I2SDATE_V 0xFFFFFFFF +#define I2S_I2SDATE_S 0 + + + + +#endif /*_SOC_I2S_REG_H_ */ + + diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/i2s_struct.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/i2s_struct.h new file mode 100644 index 0000000000000..df8baf1dace9d --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/i2s_struct.h @@ -0,0 +1,472 @@ +// 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. +#ifndef _SOC_I2S_STRUCT_H_ +#define _SOC_I2S_STRUCT_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef volatile struct i2s_dev_s { + uint32_t reserved_0; + uint32_t reserved_4; + union { + struct { + uint32_t tx_reset: 1; + uint32_t rx_reset: 1; + uint32_t tx_fifo_reset: 1; + uint32_t rx_fifo_reset: 1; + uint32_t tx_start: 1; + uint32_t rx_start: 1; + uint32_t tx_slave_mod: 1; + uint32_t rx_slave_mod: 1; + uint32_t tx_right_first: 1; + uint32_t rx_right_first: 1; + uint32_t tx_msb_shift: 1; + uint32_t rx_msb_shift: 1; + uint32_t tx_short_sync: 1; + uint32_t rx_short_sync: 1; + uint32_t tx_mono: 1; + uint32_t rx_mono: 1; + uint32_t tx_msb_right: 1; + uint32_t rx_msb_right: 1; + uint32_t sig_loopback: 1; + uint32_t reserved19: 13; + }; + uint32_t val; + } conf; + union { + struct { + uint32_t rx_take_data: 1; + uint32_t tx_put_data: 1; + uint32_t rx_wfull: 1; + uint32_t rx_rempty: 1; + uint32_t tx_wfull: 1; + uint32_t tx_rempty: 1; + uint32_t rx_hung: 1; + uint32_t tx_hung: 1; + uint32_t in_done: 1; + uint32_t in_suc_eof: 1; + uint32_t in_err_eof: 1; + uint32_t out_done: 1; + uint32_t out_eof: 1; + uint32_t in_dscr_err: 1; + uint32_t out_dscr_err: 1; + uint32_t in_dscr_empty: 1; + uint32_t out_total_eof: 1; + uint32_t reserved17: 15; + }; + uint32_t val; + } int_raw; + union { + struct { + uint32_t rx_take_data: 1; + uint32_t tx_put_data: 1; + uint32_t rx_wfull: 1; + uint32_t rx_rempty: 1; + uint32_t tx_wfull: 1; + uint32_t tx_rempty: 1; + uint32_t rx_hung: 1; + uint32_t tx_hung: 1; + uint32_t in_done: 1; + uint32_t in_suc_eof: 1; + uint32_t in_err_eof: 1; + uint32_t out_done: 1; + uint32_t out_eof: 1; + uint32_t in_dscr_err: 1; + uint32_t out_dscr_err: 1; + uint32_t in_dscr_empty: 1; + uint32_t out_total_eof: 1; + uint32_t reserved17: 15; + }; + uint32_t val; + } int_st; + union { + struct { + uint32_t rx_take_data: 1; + uint32_t tx_put_data: 1; + uint32_t rx_wfull: 1; + uint32_t rx_rempty: 1; + uint32_t tx_wfull: 1; + uint32_t tx_rempty: 1; + uint32_t rx_hung: 1; + uint32_t tx_hung: 1; + uint32_t in_done: 1; + uint32_t in_suc_eof: 1; + uint32_t in_err_eof: 1; + uint32_t out_done: 1; + uint32_t out_eof: 1; + uint32_t in_dscr_err: 1; + uint32_t out_dscr_err: 1; + uint32_t in_dscr_empty: 1; + uint32_t out_total_eof: 1; + uint32_t reserved17: 15; + }; + uint32_t val; + } int_ena; + union { + struct { + uint32_t take_data: 1; + uint32_t put_data: 1; + uint32_t rx_wfull: 1; + uint32_t rx_rempty: 1; + uint32_t tx_wfull: 1; + uint32_t tx_rempty: 1; + uint32_t rx_hung: 1; + uint32_t tx_hung: 1; + uint32_t in_done: 1; + uint32_t in_suc_eof: 1; + uint32_t in_err_eof: 1; + uint32_t out_done: 1; + uint32_t out_eof: 1; + uint32_t in_dscr_err: 1; + uint32_t out_dscr_err: 1; + uint32_t in_dscr_empty: 1; + uint32_t out_total_eof: 1; + uint32_t reserved17: 15; + }; + uint32_t val; + } int_clr; + union { + struct { + uint32_t tx_bck_in_delay: 2; + uint32_t tx_ws_in_delay: 2; + uint32_t rx_bck_in_delay: 2; + uint32_t rx_ws_in_delay: 2; + uint32_t rx_sd_in_delay: 2; + uint32_t tx_bck_out_delay: 2; + uint32_t tx_ws_out_delay: 2; + uint32_t tx_sd_out_delay: 2; + uint32_t rx_ws_out_delay: 2; + uint32_t rx_bck_out_delay: 2; + uint32_t tx_dsync_sw: 1; + uint32_t rx_dsync_sw: 1; + uint32_t data_enable_delay: 2; + uint32_t tx_bck_in_inv: 1; + uint32_t reserved25: 7; + }; + uint32_t val; + } timing; + union { + struct { + uint32_t rx_data_num: 6; + uint32_t tx_data_num: 6; + uint32_t dscr_en: 1; + uint32_t tx_fifo_mod: 3; + uint32_t rx_fifo_mod: 3; + uint32_t tx_fifo_mod_force_en: 1; + uint32_t rx_fifo_mod_force_en: 1; + uint32_t reserved21: 11; + }; + uint32_t val; + } fifo_conf; + uint32_t rx_eof_num; + uint32_t conf_single_data; + union { + struct { + uint32_t tx_chan_mod: 3; + uint32_t rx_chan_mod: 2; + uint32_t reserved5: 27; + }; + uint32_t val; + } conf_chan; + union { + struct { + uint32_t addr: 20; + uint32_t reserved20: 8; + uint32_t stop: 1; + uint32_t start: 1; + uint32_t restart: 1; + uint32_t park: 1; + }; + uint32_t val; + } out_link; + union { + struct { + uint32_t addr: 20; + uint32_t reserved20: 8; + uint32_t stop: 1; + uint32_t start: 1; + uint32_t restart: 1; + uint32_t park: 1; + }; + uint32_t val; + } in_link; + uint32_t out_eof_des_addr; + uint32_t in_eof_des_addr; + uint32_t out_eof_bfr_des_addr; + union { + struct { + uint32_t mode: 3; + uint32_t reserved3: 1; + uint32_t addr: 2; + uint32_t reserved6: 26; + }; + uint32_t val; + } ahb_test; + uint32_t in_link_dscr; + uint32_t in_link_dscr_bf0; + uint32_t in_link_dscr_bf1; + uint32_t out_link_dscr; + uint32_t out_link_dscr_bf0; + uint32_t out_link_dscr_bf1; + union { + struct { + uint32_t in_rst: 1; + uint32_t out_rst: 1; + uint32_t ahbm_fifo_rst: 1; + uint32_t ahbm_rst: 1; + uint32_t out_loop_test: 1; + uint32_t in_loop_test: 1; + uint32_t out_auto_wrback: 1; + uint32_t out_no_restart_clr: 1; + uint32_t out_eof_mode: 1; + uint32_t outdscr_burst_en: 1; + uint32_t indscr_burst_en: 1; + uint32_t out_data_burst_en: 1; + uint32_t check_owner: 1; + uint32_t mem_trans_en: 1; + uint32_t reserved14: 18; + }; + uint32_t val; + } lc_conf; + union { + struct { + uint32_t wdata: 9; + uint32_t reserved9: 7; + uint32_t push: 1; + uint32_t reserved17: 15; + }; + uint32_t val; + } out_fifo_push; + union { + struct { + uint32_t rdata: 12; + uint32_t reserved12: 4; + uint32_t pop: 1; + uint32_t reserved17: 15; + }; + uint32_t val; + } in_fifo_pop; + uint32_t lc_state0; + uint32_t lc_state1; + union { + struct { + uint32_t fifo_timeout: 8; + uint32_t fifo_timeout_shift: 3; + uint32_t fifo_timeout_ena: 1; + uint32_t reserved12: 20; + }; + uint32_t val; + } lc_hung_conf; + uint32_t reserved_78; + uint32_t reserved_7c; + union { + struct { + uint32_t y_max:16; + uint32_t y_min:16; + }; + uint32_t val; + } cvsd_conf0; + union { + struct { + uint32_t sigma_max:16; + uint32_t sigma_min:16; + }; + uint32_t val; + } cvsd_conf1; + union { + struct { + uint32_t cvsd_k: 3; + uint32_t cvsd_j: 3; + uint32_t cvsd_beta: 10; + uint32_t cvsd_h: 3; + uint32_t reserved19:13; + }; + uint32_t val; + } cvsd_conf2; + union { + struct { + uint32_t good_pack_max: 6; + uint32_t n_err_seg: 3; + uint32_t shift_rate: 3; + uint32_t max_slide_sample: 8; + uint32_t pack_len_8k: 5; + uint32_t n_min_err: 3; + uint32_t reserved28: 4; + }; + uint32_t val; + } plc_conf0; + union { + struct { + uint32_t bad_cef_atten_para: 8; + uint32_t bad_cef_atten_para_shift: 4; + uint32_t bad_ola_win2_para_shift: 4; + uint32_t bad_ola_win2_para: 8; + uint32_t slide_win_len: 8; + }; + uint32_t val; + } plc_conf1; + union { + struct { + uint32_t cvsd_seg_mod: 2; + uint32_t min_period: 5; + uint32_t reserved7: 25; + }; + uint32_t val; + } plc_conf2; + union { + struct { + uint32_t en: 1; + uint32_t chan_mod: 1; + uint32_t cvsd_dec_pack_err: 1; + uint32_t cvsd_pack_len_8k: 5; + uint32_t cvsd_inf_en: 1; + uint32_t cvsd_dec_start: 1; + uint32_t cvsd_dec_reset: 1; + uint32_t plc_en: 1; + uint32_t plc2dma_en: 1; + uint32_t reserved13: 19; + }; + uint32_t val; + } esco_conf0; + union { + struct { + uint32_t with_en: 1; + uint32_t no_en: 1; + uint32_t cvsd_enc_start: 1; + uint32_t cvsd_enc_reset: 1; + uint32_t reserved4: 28; + }; + uint32_t val; + } sco_conf0; + union { + struct { + uint32_t tx_pcm_conf: 3; + uint32_t tx_pcm_bypass: 1; + uint32_t rx_pcm_conf: 3; + uint32_t rx_pcm_bypass: 1; + uint32_t tx_stop_en: 1; + uint32_t tx_zeros_rm_en: 1; + uint32_t reserved10: 22; + }; + uint32_t val; + } conf1; + union { + struct { + uint32_t fifo_force_pd: 1; + uint32_t fifo_force_pu: 1; + uint32_t plc_mem_force_pd: 1; + uint32_t plc_mem_force_pu: 1; + uint32_t reserved4: 28; + }; + uint32_t val; + } pd_conf; + union { + struct { + uint32_t camera_en: 1; + uint32_t lcd_tx_wrx2_en: 1; + uint32_t lcd_tx_sdx2_en: 1; + uint32_t data_enable_test_en: 1; + uint32_t data_enable: 1; + uint32_t lcd_en: 1; + uint32_t ext_adc_start_en: 1; + uint32_t inter_valid_en: 1; + uint32_t reserved8: 24; + }; + uint32_t val; + } conf2; + union { + struct { + uint32_t clkm_div_num: 8; + uint32_t clkm_div_b: 6; + uint32_t clkm_div_a: 6; + uint32_t clk_en: 1; + uint32_t clka_en: 1; + uint32_t reserved22: 10; + }; + uint32_t val; + } clkm_conf; + union { + struct { + uint32_t tx_bck_div_num: 6; + uint32_t rx_bck_div_num: 6; + uint32_t tx_bits_mod: 6; + uint32_t rx_bits_mod: 6; + uint32_t reserved24: 8; + }; + uint32_t val; + } sample_rate_conf; + union { + struct { + uint32_t tx_pdm_en: 1; + uint32_t rx_pdm_en: 1; + uint32_t pcm2pdm_conv_en: 1; + uint32_t pdm2pcm_conv_en: 1; + uint32_t tx_sinc_osr2: 4; + uint32_t tx_prescale: 8; + uint32_t tx_hp_in_shift: 2; + uint32_t tx_lp_in_shift: 2; + uint32_t tx_sinc_in_shift: 2; + uint32_t tx_sigmadelta_in_shift: 2; + uint32_t rx_sinc_dsr_16_en: 1; + uint32_t txhp_bypass: 1; + uint32_t reserved26: 6; + }; + uint32_t val; + } pdm_conf; + union { + struct { + uint32_t tx_pdm_fs: 10; + uint32_t tx_pdm_fp: 10; + uint32_t reserved20:12; + }; + uint32_t val; + } pdm_freq_conf; + union { + struct { + uint32_t tx_idle: 1; + uint32_t tx_fifo_reset_back: 1; + uint32_t rx_fifo_reset_back: 1; + uint32_t reserved3: 29; + }; + uint32_t val; + } state; + 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; /**/ +} i2s_dev_t; +extern i2s_dev_t I2S0; +extern i2s_dev_t I2S1; + +#ifdef __cplusplus +} +#endif + +#endif /* _SOC_I2S_STRUCT_H_ */ diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/io_mux_reg.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/io_mux_reg.h new file mode 100644 index 0000000000000..22ea25b91f913 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/io_mux_reg.h @@ -0,0 +1,355 @@ +// 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. +#ifndef _SOC_IO_MUX_REG_H_ +#define _SOC_IO_MUX_REG_H_ + +#include "soc.h" + +/* The following are the bit fields for PERIPHS_IO_MUX_x_U registers */ +/* Output enable in sleep mode */ +#define SLP_OE (BIT(0)) +#define SLP_OE_M (BIT(0)) +#define SLP_OE_V 1 +#define SLP_OE_S 0 +/* Pin used for wakeup from sleep */ +#define SLP_SEL (BIT(1)) +#define SLP_SEL_M (BIT(1)) +#define SLP_SEL_V 1 +#define SLP_SEL_S 1 +/* Pulldown enable in sleep mode */ +#define SLP_PD (BIT(2)) +#define SLP_PD_M (BIT(2)) +#define SLP_PD_V 1 +#define SLP_PD_S 2 +/* Pullup enable in sleep mode */ +#define SLP_PU (BIT(3)) +#define SLP_PU_M (BIT(3)) +#define SLP_PU_V 1 +#define SLP_PU_S 3 +/* Input enable in sleep mode */ +#define SLP_IE (BIT(4)) +#define SLP_IE_M (BIT(4)) +#define SLP_IE_V 1 +#define SLP_IE_S 4 +/* Drive strength in sleep mode */ +#define SLP_DRV 0x3 +#define SLP_DRV_M (SLP_DRV_V << SLP_DRV_S) +#define SLP_DRV_V 0x3 +#define SLP_DRV_S 5 +/* Pulldown enable */ +#define FUN_PD (BIT(7)) +#define FUN_PD_M (BIT(7)) +#define FUN_PD_V 1 +#define FUN_PD_S 7 +/* Pullup enable */ +#define FUN_PU (BIT(8)) +#define FUN_PU_M (BIT(8)) +#define FUN_PU_V 1 +#define FUN_PU_S 8 +/* Input enable */ +#define FUN_IE (BIT(9)) +#define FUN_IE_M (FUN_IE_V << FUN_IE_S) +#define FUN_IE_V 1 +#define FUN_IE_S 9 +/* Drive strength */ +#define FUN_DRV 0x3 +#define FUN_DRV_M (FUN_DRV_V << FUN_DRV_S) +#define FUN_DRV_V 0x3 +#define FUN_DRV_S 10 +/* Function select (possible values are defined for each pin as FUNC_pinname_function below) */ +#define MCU_SEL 0x7 +#define MCU_SEL_M (MCU_SEL_V << MCU_SEL_S) +#define MCU_SEL_V 0x7 +#define MCU_SEL_S 12 + +#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)); + +#define PIN_FUNC_SELECT(PIN_NAME, FUNC) REG_SET_FIELD(PIN_NAME, MCU_SEL, FUNC) + +#define PIN_FUNC_GPIO 2 + +#define SPI_CLK_GPIO_NUM 6 +#define SPI_CS0_GPIO_NUM 11 +#define SPI_Q_GPIO_NUM 7 +#define SPI_D_GPIO_NUM 8 +#define SPI_WP_GPIO_NUM 10 +#define SPI_HD_GPIO_NUM 9 + +#define PIN_CTRL (DR_REG_IO_MUX_BASE +0x00) +#define CLK_OUT3 0xf +#define CLK_OUT3_V CLK_OUT3 +#define CLK_OUT3_S 8 +#define CLK_OUT3_M (CLK_OUT3_V << CLK_OUT3_S) +#define CLK_OUT2 0xf +#define CLK_OUT2_V CLK_OUT2 +#define CLK_OUT2_S 4 +#define CLK_OUT2_M (CLK_OUT2_V << CLK_OUT2_S) +#define CLK_OUT1 0xf +#define CLK_OUT1_V CLK_OUT1 +#define CLK_OUT1_S 0 +#define CLK_OUT1_M (CLK_OUT1_V << CLK_OUT1_S) + +#define PERIPHS_IO_MUX_GPIO0_U (DR_REG_IO_MUX_BASE +0x44) +#define IO_MUX_GPIO0_REG PERIPHS_IO_MUX_GPIO0_U +#define FUNC_GPIO0_EMAC_TX_CLK 5 +#define FUNC_GPIO0_GPIO0 2 +#define FUNC_GPIO0_CLK_OUT1 1 +#define FUNC_GPIO0_GPIO0_0 0 + +#define PERIPHS_IO_MUX_U0TXD_U (DR_REG_IO_MUX_BASE +0x88) +#define IO_MUX_GPIO1_REG PERIPHS_IO_MUX_U0TXD_U +#define FUNC_U0TXD_EMAC_RXD2 5 +#define FUNC_U0TXD_GPIO1 2 +#define FUNC_U0TXD_CLK_OUT3 1 +#define FUNC_U0TXD_U0TXD 0 + +#define PERIPHS_IO_MUX_GPIO2_U (DR_REG_IO_MUX_BASE +0x40) +#define IO_MUX_GPIO2_REG PERIPHS_IO_MUX_GPIO2_U +#define FUNC_GPIO2_SD_DATA0 4 +#define FUNC_GPIO2_HS2_DATA0 3 +#define FUNC_GPIO2_GPIO2 2 +#define FUNC_GPIO2_HSPIWP 1 +#define FUNC_GPIO2_GPIO2_0 0 + +#define PERIPHS_IO_MUX_U0RXD_U (DR_REG_IO_MUX_BASE +0x84) +#define IO_MUX_GPIO3_REG PERIPHS_IO_MUX_U0RXD_U +#define FUNC_U0RXD_GPIO3 2 +#define FUNC_U0RXD_CLK_OUT2 1 +#define FUNC_U0RXD_U0RXD 0 + +#define PERIPHS_IO_MUX_GPIO4_U (DR_REG_IO_MUX_BASE +0x48) +#define IO_MUX_GPIO4_REG PERIPHS_IO_MUX_GPIO4_U +#define FUNC_GPIO4_EMAC_TX_ER 5 +#define FUNC_GPIO4_SD_DATA1 4 +#define FUNC_GPIO4_HS2_DATA1 3 +#define FUNC_GPIO4_GPIO4 2 +#define FUNC_GPIO4_HSPIHD 1 +#define FUNC_GPIO4_GPIO4_0 0 + +#define PERIPHS_IO_MUX_GPIO5_U (DR_REG_IO_MUX_BASE +0x6c) +#define IO_MUX_GPIO5_REG PERIPHS_IO_MUX_GPIO5_U +#define FUNC_GPIO5_EMAC_RX_CLK 5 +#define FUNC_GPIO5_HS1_DATA6 3 +#define FUNC_GPIO5_GPIO5 2 +#define FUNC_GPIO5_VSPICS0 1 +#define FUNC_GPIO5_GPIO5_0 0 + +#define PERIPHS_IO_MUX_SD_CLK_U (DR_REG_IO_MUX_BASE +0x60) +#define IO_MUX_GPIO6_REG PERIPHS_IO_MUX_SD_CLK_U +#define FUNC_SD_CLK_U1CTS 4 +#define FUNC_SD_CLK_HS1_CLK 3 +#define FUNC_SD_CLK_GPIO6 2 +#define FUNC_SD_CLK_SPICLK 1 +#define FUNC_SD_CLK_SD_CLK 0 + +#define PERIPHS_IO_MUX_SD_DATA0_U (DR_REG_IO_MUX_BASE +0x64) +#define IO_MUX_GPIO7_REG PERIPHS_IO_MUX_SD_DATA0_U +#define FUNC_SD_DATA0_U2RTS 4 +#define FUNC_SD_DATA0_HS1_DATA0 3 +#define FUNC_SD_DATA0_GPIO7 2 +#define FUNC_SD_DATA0_SPIQ 1 +#define FUNC_SD_DATA0_SD_DATA0 0 + +#define PERIPHS_IO_MUX_SD_DATA1_U (DR_REG_IO_MUX_BASE +0x68) +#define IO_MUX_GPIO8_REG PERIPHS_IO_MUX_SD_DATA1_U +#define FUNC_SD_DATA1_U2CTS 4 +#define FUNC_SD_DATA1_HS1_DATA1 3 +#define FUNC_SD_DATA1_GPIO8 2 +#define FUNC_SD_DATA1_SPID 1 +#define FUNC_SD_DATA1_SD_DATA1 0 + +#define PERIPHS_IO_MUX_SD_DATA2_U (DR_REG_IO_MUX_BASE +0x54) +#define IO_MUX_GPIO9_REG PERIPHS_IO_MUX_SD_DATA2_U +#define FUNC_SD_DATA2_U1RXD 4 +#define FUNC_SD_DATA2_HS1_DATA2 3 +#define FUNC_SD_DATA2_GPIO9 2 +#define FUNC_SD_DATA2_SPIHD 1 +#define FUNC_SD_DATA2_SD_DATA2 0 + +#define PERIPHS_IO_MUX_SD_DATA3_U (DR_REG_IO_MUX_BASE +0x58) +#define IO_MUX_GPIO10_REG PERIPHS_IO_MUX_SD_DATA3_U +#define FUNC_SD_DATA3_U1TXD 4 +#define FUNC_SD_DATA3_HS1_DATA3 3 +#define FUNC_SD_DATA3_GPIO10 2 +#define FUNC_SD_DATA3_SPIWP 1 +#define FUNC_SD_DATA3_SD_DATA3 0 + +#define PERIPHS_IO_MUX_SD_CMD_U (DR_REG_IO_MUX_BASE +0x5c) +#define IO_MUX_GPIO11_REG PERIPHS_IO_MUX_SD_CMD_U +#define FUNC_SD_CMD_U1RTS 4 +#define FUNC_SD_CMD_HS1_CMD 3 +#define FUNC_SD_CMD_GPIO11 2 +#define FUNC_SD_CMD_SPICS0 1 +#define FUNC_SD_CMD_SD_CMD 0 + +#define PERIPHS_IO_MUX_MTDI_U (DR_REG_IO_MUX_BASE +0x34) +#define IO_MUX_GPIO12_REG PERIPHS_IO_MUX_MTDI_U +#define FUNC_MTDI_EMAC_TXD3 5 +#define FUNC_MTDI_SD_DATA2 4 +#define FUNC_MTDI_HS2_DATA2 3 +#define FUNC_MTDI_GPIO12 2 +#define FUNC_MTDI_HSPIQ 1 +#define FUNC_MTDI_MTDI 0 + +#define PERIPHS_IO_MUX_MTCK_U (DR_REG_IO_MUX_BASE +0x38) +#define IO_MUX_GPIO13_REG PERIPHS_IO_MUX_MTCK_U +#define FUNC_MTCK_EMAC_RX_ER 5 +#define FUNC_MTCK_SD_DATA3 4 +#define FUNC_MTCK_HS2_DATA3 3 +#define FUNC_MTCK_GPIO13 2 +#define FUNC_MTCK_HSPID 1 +#define FUNC_MTCK_MTCK 0 + +#define PERIPHS_IO_MUX_MTMS_U (DR_REG_IO_MUX_BASE +0x30) +#define IO_MUX_GPIO14_REG PERIPHS_IO_MUX_MTMS_U +#define FUNC_MTMS_EMAC_TXD2 5 +#define FUNC_MTMS_SD_CLK 4 +#define FUNC_MTMS_HS2_CLK 3 +#define FUNC_MTMS_GPIO14 2 +#define FUNC_MTMS_HSPICLK 1 +#define FUNC_MTMS_MTMS 0 + +#define PERIPHS_IO_MUX_MTDO_U (DR_REG_IO_MUX_BASE +0x3c) +#define IO_MUX_GPIO15_REG PERIPHS_IO_MUX_MTDO_U +#define FUNC_MTDO_EMAC_RXD3 5 +#define FUNC_MTDO_SD_CMD 4 +#define FUNC_MTDO_HS2_CMD 3 +#define FUNC_MTDO_GPIO15 2 +#define FUNC_MTDO_HSPICS0 1 +#define FUNC_MTDO_MTDO 0 + +#define PERIPHS_IO_MUX_GPIO16_U (DR_REG_IO_MUX_BASE +0x4c) +#define IO_MUX_GPIO16_REG PERIPHS_IO_MUX_GPIO16_U +#define FUNC_GPIO16_EMAC_CLK_OUT 5 +#define FUNC_GPIO16_U2RXD 4 +#define FUNC_GPIO16_HS1_DATA4 3 +#define FUNC_GPIO16_GPIO16 2 +#define FUNC_GPIO16_GPIO16_0 0 + +#define PERIPHS_IO_MUX_GPIO17_U (DR_REG_IO_MUX_BASE +0x50) +#define IO_MUX_GPIO17_REG PERIPHS_IO_MUX_GPIO17_U +#define FUNC_GPIO17_EMAC_CLK_OUT_180 5 +#define FUNC_GPIO17_U2TXD 4 +#define FUNC_GPIO17_HS1_DATA5 3 +#define FUNC_GPIO17_GPIO17 2 +#define FUNC_GPIO17_GPIO17_0 0 + +#define PERIPHS_IO_MUX_GPIO18_U (DR_REG_IO_MUX_BASE +0x70) +#define IO_MUX_GPIO18_REG PERIPHS_IO_MUX_GPIO18_U +#define FUNC_GPIO18_HS1_DATA7 3 +#define FUNC_GPIO18_GPIO18 2 +#define FUNC_GPIO18_VSPICLK 1 +#define FUNC_GPIO18_GPIO18_0 0 + +#define PERIPHS_IO_MUX_GPIO19_U (DR_REG_IO_MUX_BASE +0x74) +#define IO_MUX_GPIO19_REG PERIPHS_IO_MUX_GPIO19_U +#define FUNC_GPIO19_EMAC_TXD0 5 +#define FUNC_GPIO19_U0CTS 3 +#define FUNC_GPIO19_GPIO19 2 +#define FUNC_GPIO19_VSPIQ 1 +#define FUNC_GPIO19_GPIO19_0 0 + +#define PERIPHS_IO_MUX_GPIO20_U (DR_REG_IO_MUX_BASE +0x78) +#define IO_MUX_GPIO20_REG PERIPHS_IO_MUX_GPIO20_U +#define FUNC_GPIO20_GPIO20 2 +#define FUNC_GPIO20_GPIO20_0 0 + +#define PERIPHS_IO_MUX_GPIO21_U (DR_REG_IO_MUX_BASE +0x7c) +#define IO_MUX_GPIO21_REG PERIPHS_IO_MUX_GPIO21_U +#define FUNC_GPIO21_EMAC_TX_EN 5 +#define FUNC_GPIO21_GPIO21 2 +#define FUNC_GPIO21_VSPIHD 1 +#define FUNC_GPIO21_GPIO21_0 0 + +#define PERIPHS_IO_MUX_GPIO22_U (DR_REG_IO_MUX_BASE +0x80) +#define IO_MUX_GPIO22_REG PERIPHS_IO_MUX_GPIO22_U +#define FUNC_GPIO22_EMAC_TXD1 5 +#define FUNC_GPIO22_U0RTS 3 +#define FUNC_GPIO22_GPIO22 2 +#define FUNC_GPIO22_VSPIWP 1 +#define FUNC_GPIO22_GPIO22_0 0 + +#define PERIPHS_IO_MUX_GPIO23_U (DR_REG_IO_MUX_BASE +0x8c) +#define IO_MUX_GPIO23_REG PERIPHS_IO_MUX_GPIO23_U +#define FUNC_GPIO23_HS1_STROBE 3 +#define FUNC_GPIO23_GPIO23 2 +#define FUNC_GPIO23_VSPID 1 +#define FUNC_GPIO23_GPIO23_0 0 + +#define PERIPHS_IO_MUX_GPIO24_U (DR_REG_IO_MUX_BASE +0x90) +#define IO_MUX_GPIO24_REG PERIPHS_IO_MUX_GPIO24_U +#define FUNC_GPIO24_GPIO24 2 +#define FUNC_GPIO24_GPIO24_0 0 + +#define PERIPHS_IO_MUX_GPIO25_U (DR_REG_IO_MUX_BASE +0x24) +#define IO_MUX_GPIO25_REG PERIPHS_IO_MUX_GPIO25_U +#define FUNC_GPIO25_EMAC_RXD0 5 +#define FUNC_GPIO25_GPIO25 2 +#define FUNC_GPIO25_GPIO25_0 0 + +#define PERIPHS_IO_MUX_GPIO26_U (DR_REG_IO_MUX_BASE +0x28) +#define IO_MUX_GPIO26_REG PERIPHS_IO_MUX_GPIO26_U +#define FUNC_GPIO26_EMAC_RXD1 5 +#define FUNC_GPIO26_GPIO26 2 +#define FUNC_GPIO26_GPIO26_0 0 + +#define PERIPHS_IO_MUX_GPIO27_U (DR_REG_IO_MUX_BASE +0x2c) +#define IO_MUX_GPIO27_REG PERIPHS_IO_MUX_GPIO27_U +#define FUNC_GPIO27_EMAC_RX_DV 5 +#define FUNC_GPIO27_GPIO27 2 +#define FUNC_GPIO27_GPIO27_0 0 + +#define PERIPHS_IO_MUX_GPIO32_U (DR_REG_IO_MUX_BASE +0x1c) +#define IO_MUX_GPIO32_REG PERIPHS_IO_MUX_GPIO32_U +#define FUNC_GPIO32_GPIO32 2 +#define FUNC_GPIO32_GPIO32_0 0 + +#define PERIPHS_IO_MUX_GPIO33_U (DR_REG_IO_MUX_BASE +0x20) +#define IO_MUX_GPIO33_REG PERIPHS_IO_MUX_GPIO33_U +#define FUNC_GPIO33_GPIO33 2 +#define FUNC_GPIO33_GPIO33_0 0 + +#define PERIPHS_IO_MUX_GPIO34_U (DR_REG_IO_MUX_BASE +0x14) +#define IO_MUX_GPIO34_REG PERIPHS_IO_MUX_GPIO34_U +#define FUNC_GPIO34_GPIO34 2 +#define FUNC_GPIO34_GPIO34_0 0 + +#define PERIPHS_IO_MUX_GPIO35_U (DR_REG_IO_MUX_BASE +0x18) +#define IO_MUX_GPIO35_REG PERIPHS_IO_MUX_GPIO35_U +#define FUNC_GPIO35_GPIO35 2 +#define FUNC_GPIO35_GPIO35_0 0 + +#define PERIPHS_IO_MUX_GPIO36_U (DR_REG_IO_MUX_BASE +0x04) +#define IO_MUX_GPIO36_REG PERIPHS_IO_MUX_GPIO36_U +#define FUNC_GPIO36_GPIO36 2 +#define FUNC_GPIO36_GPIO36_0 0 + +#define PERIPHS_IO_MUX_GPIO37_U (DR_REG_IO_MUX_BASE +0x08) +#define IO_MUX_GPIO37_REG PERIPHS_IO_MUX_GPIO37_U +#define FUNC_GPIO37_GPIO37 2 +#define FUNC_GPIO37_GPIO37_0 0 + +#define PERIPHS_IO_MUX_GPIO38_U (DR_REG_IO_MUX_BASE +0x0c) +#define IO_MUX_GPIO38_REG PERIPHS_IO_MUX_GPIO38_U +#define FUNC_GPIO38_GPIO38 2 +#define FUNC_GPIO38_GPIO38_0 0 + +#define PERIPHS_IO_MUX_GPIO39_U (DR_REG_IO_MUX_BASE +0x10) +#define IO_MUX_GPIO39_REG PERIPHS_IO_MUX_GPIO39_U +#define FUNC_GPIO39_GPIO39 2 +#define FUNC_GPIO39_GPIO39_0 0 + +#endif /* _SOC_IO_MUX_REG_H_ */ diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/ledc_caps.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/ledc_caps.h new file mode 100644 index 0000000000000..e7283424bc87a --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/ledc_caps.h @@ -0,0 +1,24 @@ +// 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. + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#define SOC_LEDC_SUPPORT_HS_MODE (1) + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/ledc_reg.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/ledc_reg.h new file mode 100644 index 0000000000000..559be87361efe --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/ledc_reg.h @@ -0,0 +1,2463 @@ +// 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. +#ifndef _SOC_LEDC_REG_H_ +#define _SOC_LEDC_REG_H_ + + +#include "soc.h" +#define LEDC_HSCH0_CONF0_REG (DR_REG_LEDC_BASE + 0x0000) +/* LEDC_CLK_EN : R/W ;bitpos:[31] ;default: 1'h0 ; */ +/*description: This bit is clock gating control signal. when software config + LED_PWM internal registers it controls the register clock.*/ +#define LEDC_CLK_EN (BIT(31)) +#define LEDC_CLK_EN_M (BIT(31)) +#define LEDC_CLK_EN_V 0x1 +#define LEDC_CLK_EN_S 31 +/* LEDC_IDLE_LV_HSCH0 : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: This bit is used to control the output value when high speed channel0 is off.*/ +#define LEDC_IDLE_LV_HSCH0 (BIT(3)) +#define LEDC_IDLE_LV_HSCH0_M (BIT(3)) +#define LEDC_IDLE_LV_HSCH0_V 0x1 +#define LEDC_IDLE_LV_HSCH0_S 3 +/* LEDC_SIG_OUT_EN_HSCH0 : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: This is the output enable control bit for high speed channel0*/ +#define LEDC_SIG_OUT_EN_HSCH0 (BIT(2)) +#define LEDC_SIG_OUT_EN_HSCH0_M (BIT(2)) +#define LEDC_SIG_OUT_EN_HSCH0_V 0x1 +#define LEDC_SIG_OUT_EN_HSCH0_S 2 +/* LEDC_TIMER_SEL_HSCH0 : R/W ;bitpos:[1:0] ;default: 2'd0 ; */ +/*description: There are four high speed timers the two bits are used to select + one of them for high speed channel0. 2'b00: seletc hstimer0. 2'b01: select hstimer1. 2'b10: select hstimer2. 2'b11: select hstimer3.*/ +#define LEDC_TIMER_SEL_HSCH0 0x00000003 +#define LEDC_TIMER_SEL_HSCH0_M ((LEDC_TIMER_SEL_HSCH0_V)<<(LEDC_TIMER_SEL_HSCH0_S)) +#define LEDC_TIMER_SEL_HSCH0_V 0x3 +#define LEDC_TIMER_SEL_HSCH0_S 0 + +#define LEDC_HSCH0_HPOINT_REG (DR_REG_LEDC_BASE + 0x0004) +/* LEDC_HPOINT_HSCH0 : R/W ;bitpos:[19:0] ;default: 20'h0 ; */ +/*description: The output value changes to high when htimerx(x=[0 3]) selected + by high speed channel0 has reached reg_hpoint_hsch0[19:0]*/ +#define LEDC_HPOINT_HSCH0 0x000FFFFF +#define LEDC_HPOINT_HSCH0_M ((LEDC_HPOINT_HSCH0_V)<<(LEDC_HPOINT_HSCH0_S)) +#define LEDC_HPOINT_HSCH0_V 0xFFFFF +#define LEDC_HPOINT_HSCH0_S 0 + +#define LEDC_HSCH0_DUTY_REG (DR_REG_LEDC_BASE + 0x0008) +/* LEDC_DUTY_HSCH0 : R/W ;bitpos:[24:0] ;default: 25'h0 ; */ +/*description: The register is used to control output duty. When hstimerx(x=[0 + 3]) choosed by high speed channel0 has reached reg_lpoint_hsch0 the output signal changes to low. reg_lpoint_hsch0=(reg_hpoint_hsch0[19:0]+reg_duty_hsch0[24:4]) (1) reg_lpoint_hsch0=(reg_hpoint_hsch0[19:0]+reg_duty_hsch0[24:4] +1) (2) The least four bits in this register represent the decimal part and determines when to choose (1) or (2)*/ +#define LEDC_DUTY_HSCH0 0x01FFFFFF +#define LEDC_DUTY_HSCH0_M ((LEDC_DUTY_HSCH0_V)<<(LEDC_DUTY_HSCH0_S)) +#define LEDC_DUTY_HSCH0_V 0x1FFFFFF +#define LEDC_DUTY_HSCH0_S 0 + +#define LEDC_HSCH0_CONF1_REG (DR_REG_LEDC_BASE + 0x000C) +/* LEDC_DUTY_START_HSCH0 : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: When reg_duty_num_hsch0 reg_duty_cycle_hsch0 and reg_duty_scale_hsch0 + has been configured. these register won't take effect until set reg_duty_start_hsch0. this bit is automatically cleared by hardware.*/ +#define LEDC_DUTY_START_HSCH0 (BIT(31)) +#define LEDC_DUTY_START_HSCH0_M (BIT(31)) +#define LEDC_DUTY_START_HSCH0_V 0x1 +#define LEDC_DUTY_START_HSCH0_S 31 +/* LEDC_DUTY_INC_HSCH0 : R/W ;bitpos:[30] ;default: 1'b1 ; */ +/*description: This register is used to increase the duty of output signal or + decrease the duty of output signal for high speed channel0.*/ +#define LEDC_DUTY_INC_HSCH0 (BIT(30)) +#define LEDC_DUTY_INC_HSCH0_M (BIT(30)) +#define LEDC_DUTY_INC_HSCH0_V 0x1 +#define LEDC_DUTY_INC_HSCH0_S 30 +/* LEDC_DUTY_NUM_HSCH0 : R/W ;bitpos:[29:20] ;default: 10'h0 ; */ +/*description: This register is used to control the num of increased or decreased + times for high speed channel0.*/ +#define LEDC_DUTY_NUM_HSCH0 0x000003FF +#define LEDC_DUTY_NUM_HSCH0_M ((LEDC_DUTY_NUM_HSCH0_V)<<(LEDC_DUTY_NUM_HSCH0_S)) +#define LEDC_DUTY_NUM_HSCH0_V 0x3FF +#define LEDC_DUTY_NUM_HSCH0_S 20 +/* LEDC_DUTY_CYCLE_HSCH0 : R/W ;bitpos:[19:10] ;default: 10'h0 ; */ +/*description: This register is used to increase or decrease the duty every + reg_duty_cycle_hsch0 cycles for high speed channel0.*/ +#define LEDC_DUTY_CYCLE_HSCH0 0x000003FF +#define LEDC_DUTY_CYCLE_HSCH0_M ((LEDC_DUTY_CYCLE_HSCH0_V)<<(LEDC_DUTY_CYCLE_HSCH0_S)) +#define LEDC_DUTY_CYCLE_HSCH0_V 0x3FF +#define LEDC_DUTY_CYCLE_HSCH0_S 10 +/* LEDC_DUTY_SCALE_HSCH0 : R/W ;bitpos:[9:0] ;default: 10'h0 ; */ +/*description: This register controls the increase or decrease step scale for + high speed channel0.*/ +#define LEDC_DUTY_SCALE_HSCH0 0x000003FF +#define LEDC_DUTY_SCALE_HSCH0_M ((LEDC_DUTY_SCALE_HSCH0_V)<<(LEDC_DUTY_SCALE_HSCH0_S)) +#define LEDC_DUTY_SCALE_HSCH0_V 0x3FF +#define LEDC_DUTY_SCALE_HSCH0_S 0 + +#define LEDC_HSCH0_DUTY_R_REG (DR_REG_LEDC_BASE + 0x0010) +/* LEDC_DUTY_HSCH0 : RO ;bitpos:[24:0] ;default: 25'h0 ; */ +/*description: This register represents the current duty of the output signal + for high speed channel0.*/ +#define LEDC_DUTY_HSCH0 0x01FFFFFF +#define LEDC_DUTY_HSCH0_M ((LEDC_DUTY_HSCH0_V)<<(LEDC_DUTY_HSCH0_S)) +#define LEDC_DUTY_HSCH0_V 0x1FFFFFF +#define LEDC_DUTY_HSCH0_S 0 + +#define LEDC_HSCH1_CONF0_REG (DR_REG_LEDC_BASE + 0x0014) +/* LEDC_IDLE_LV_HSCH1 : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: This bit is used to control the output value when high speed channel1 is off.*/ +#define LEDC_IDLE_LV_HSCH1 (BIT(3)) +#define LEDC_IDLE_LV_HSCH1_M (BIT(3)) +#define LEDC_IDLE_LV_HSCH1_V 0x1 +#define LEDC_IDLE_LV_HSCH1_S 3 +/* LEDC_SIG_OUT_EN_HSCH1 : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: This is the output enable control bit for high speed channel1*/ +#define LEDC_SIG_OUT_EN_HSCH1 (BIT(2)) +#define LEDC_SIG_OUT_EN_HSCH1_M (BIT(2)) +#define LEDC_SIG_OUT_EN_HSCH1_V 0x1 +#define LEDC_SIG_OUT_EN_HSCH1_S 2 +/* LEDC_TIMER_SEL_HSCH1 : R/W ;bitpos:[1:0] ;default: 2'd0 ; */ +/*description: There are four high speed timers the two bits are used to select + one of them for high speed channel1. 2'b00: seletc hstimer0. 2'b01: select hstimer1. 2'b10: select hstimer2. 2'b11: select hstimer3.*/ +#define LEDC_TIMER_SEL_HSCH1 0x00000003 +#define LEDC_TIMER_SEL_HSCH1_M ((LEDC_TIMER_SEL_HSCH1_V)<<(LEDC_TIMER_SEL_HSCH1_S)) +#define LEDC_TIMER_SEL_HSCH1_V 0x3 +#define LEDC_TIMER_SEL_HSCH1_S 0 + +#define LEDC_HSCH1_HPOINT_REG (DR_REG_LEDC_BASE + 0x0018) +/* LEDC_HPOINT_HSCH1 : R/W ;bitpos:[19:0] ;default: 20'h0 ; */ +/*description: The output value changes to high when htimerx(x=[0 3]) selected + by high speed channel1 has reached reg_hpoint_hsch1[19:0]*/ +#define LEDC_HPOINT_HSCH1 0x000FFFFF +#define LEDC_HPOINT_HSCH1_M ((LEDC_HPOINT_HSCH1_V)<<(LEDC_HPOINT_HSCH1_S)) +#define LEDC_HPOINT_HSCH1_V 0xFFFFF +#define LEDC_HPOINT_HSCH1_S 0 + +#define LEDC_HSCH1_DUTY_REG (DR_REG_LEDC_BASE + 0x001C) +/* LEDC_DUTY_HSCH1 : R/W ;bitpos:[24:0] ;default: 25'h0 ; */ +/*description: The register is used to control output duty. When hstimerx(x=[0 + 3]) choosed by high speed channel1 has reached reg_lpoint_hsch1 the output signal changes to low. reg_lpoint_hsch1=(reg_hpoint_hsch1[19:0]+reg_duty_hsch1[24:4]) (1) reg_lpoint_hsch1=(reg_hpoint_hsch1[19:0]+reg_duty_hsch1[24:4] +1) (2) The least four bits in this register represent the decimal part and determines when to choose (1) or (2)*/ +#define LEDC_DUTY_HSCH1 0x01FFFFFF +#define LEDC_DUTY_HSCH1_M ((LEDC_DUTY_HSCH1_V)<<(LEDC_DUTY_HSCH1_S)) +#define LEDC_DUTY_HSCH1_V 0x1FFFFFF +#define LEDC_DUTY_HSCH1_S 0 + +#define LEDC_HSCH1_CONF1_REG (DR_REG_LEDC_BASE + 0x0020) +/* LEDC_DUTY_START_HSCH1 : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: When reg_duty_num_hsch1 reg_duty_cycle_hsch1 and reg_duty_scale_hsch1 + has been configured. these register won't take effect until set reg_duty_start_hsch1. this bit is automatically cleared by hardware.*/ +#define LEDC_DUTY_START_HSCH1 (BIT(31)) +#define LEDC_DUTY_START_HSCH1_M (BIT(31)) +#define LEDC_DUTY_START_HSCH1_V 0x1 +#define LEDC_DUTY_START_HSCH1_S 31 +/* LEDC_DUTY_INC_HSCH1 : R/W ;bitpos:[30] ;default: 1'b1 ; */ +/*description: This register is used to increase the duty of output signal or + decrease the duty of output signal for high speed channel1.*/ +#define LEDC_DUTY_INC_HSCH1 (BIT(30)) +#define LEDC_DUTY_INC_HSCH1_M (BIT(30)) +#define LEDC_DUTY_INC_HSCH1_V 0x1 +#define LEDC_DUTY_INC_HSCH1_S 30 +/* LEDC_DUTY_NUM_HSCH1 : R/W ;bitpos:[29:20] ;default: 10'h0 ; */ +/*description: This register is used to control the num of increased or decreased + times for high speed channel1.*/ +#define LEDC_DUTY_NUM_HSCH1 0x000003FF +#define LEDC_DUTY_NUM_HSCH1_M ((LEDC_DUTY_NUM_HSCH1_V)<<(LEDC_DUTY_NUM_HSCH1_S)) +#define LEDC_DUTY_NUM_HSCH1_V 0x3FF +#define LEDC_DUTY_NUM_HSCH1_S 20 +/* LEDC_DUTY_CYCLE_HSCH1 : R/W ;bitpos:[19:10] ;default: 10'h0 ; */ +/*description: This register is used to increase or decrease the duty every + reg_duty_cycle_hsch1 cycles for high speed channel1.*/ +#define LEDC_DUTY_CYCLE_HSCH1 0x000003FF +#define LEDC_DUTY_CYCLE_HSCH1_M ((LEDC_DUTY_CYCLE_HSCH1_V)<<(LEDC_DUTY_CYCLE_HSCH1_S)) +#define LEDC_DUTY_CYCLE_HSCH1_V 0x3FF +#define LEDC_DUTY_CYCLE_HSCH1_S 10 +/* LEDC_DUTY_SCALE_HSCH1 : R/W ;bitpos:[9:0] ;default: 10'h0 ; */ +/*description: This register controls the increase or decrease step scale for + high speed channel1.*/ +#define LEDC_DUTY_SCALE_HSCH1 0x000003FF +#define LEDC_DUTY_SCALE_HSCH1_M ((LEDC_DUTY_SCALE_HSCH1_V)<<(LEDC_DUTY_SCALE_HSCH1_S)) +#define LEDC_DUTY_SCALE_HSCH1_V 0x3FF +#define LEDC_DUTY_SCALE_HSCH1_S 0 + +#define LEDC_HSCH1_DUTY_R_REG (DR_REG_LEDC_BASE + 0x0024) +/* LEDC_DUTY_HSCH1 : RO ;bitpos:[24:0] ;default: 25'h0 ; */ +/*description: This register represents the current duty of the output signal + for high speed channel1.*/ +#define LEDC_DUTY_HSCH1 0x01FFFFFF +#define LEDC_DUTY_HSCH1_M ((LEDC_DUTY_HSCH1_V)<<(LEDC_DUTY_HSCH1_S)) +#define LEDC_DUTY_HSCH1_V 0x1FFFFFF +#define LEDC_DUTY_HSCH1_S 0 + +#define LEDC_HSCH2_CONF0_REG (DR_REG_LEDC_BASE + 0x0028) +/* LEDC_IDLE_LV_HSCH2 : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: This bit is used to control the output value when high speed channel2 is off.*/ +#define LEDC_IDLE_LV_HSCH2 (BIT(3)) +#define LEDC_IDLE_LV_HSCH2_M (BIT(3)) +#define LEDC_IDLE_LV_HSCH2_V 0x1 +#define LEDC_IDLE_LV_HSCH2_S 3 +/* LEDC_SIG_OUT_EN_HSCH2 : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: This is the output enable control bit for high speed channel2*/ +#define LEDC_SIG_OUT_EN_HSCH2 (BIT(2)) +#define LEDC_SIG_OUT_EN_HSCH2_M (BIT(2)) +#define LEDC_SIG_OUT_EN_HSCH2_V 0x1 +#define LEDC_SIG_OUT_EN_HSCH2_S 2 +/* LEDC_TIMER_SEL_HSCH2 : R/W ;bitpos:[1:0] ;default: 2'd0 ; */ +/*description: There are four high speed timers the two bits are used to select + one of them for high speed channel2. 2'b00: seletc hstimer0. 2'b01: select hstimer1. 2'b10: select hstimer2. 2'b11: select hstimer3.*/ +#define LEDC_TIMER_SEL_HSCH2 0x00000003 +#define LEDC_TIMER_SEL_HSCH2_M ((LEDC_TIMER_SEL_HSCH2_V)<<(LEDC_TIMER_SEL_HSCH2_S)) +#define LEDC_TIMER_SEL_HSCH2_V 0x3 +#define LEDC_TIMER_SEL_HSCH2_S 0 + +#define LEDC_HSCH2_HPOINT_REG (DR_REG_LEDC_BASE + 0x002C) +/* LEDC_HPOINT_HSCH2 : R/W ;bitpos:[19:0] ;default: 20'h0 ; */ +/*description: The output value changes to high when htimerx(x=[0 3]) selected + by high speed channel2 has reached reg_hpoint_hsch2[19:0]*/ +#define LEDC_HPOINT_HSCH2 0x000FFFFF +#define LEDC_HPOINT_HSCH2_M ((LEDC_HPOINT_HSCH2_V)<<(LEDC_HPOINT_HSCH2_S)) +#define LEDC_HPOINT_HSCH2_V 0xFFFFF +#define LEDC_HPOINT_HSCH2_S 0 + +#define LEDC_HSCH2_DUTY_REG (DR_REG_LEDC_BASE + 0x0030) +/* LEDC_DUTY_HSCH2 : R/W ;bitpos:[24:0] ;default: 25'h0 ; */ +/*description: The register is used to control output duty. When hstimerx(x=[0 + 3]) choosed by high speed channel2 has reached reg_lpoint_hsch2 the output signal changes to low. reg_lpoint_hsch2=(reg_hpoint_hsch2[19:0]+reg_duty_hsch2[24:4]) (1) reg_lpoint_hsch2=(reg_hpoint_hsch2[19:0]+reg_duty_hsch2[24:4] +1) (2) The least four bits in this register represent the decimal part and determines when to choose (1) or (2)*/ +#define LEDC_DUTY_HSCH2 0x01FFFFFF +#define LEDC_DUTY_HSCH2_M ((LEDC_DUTY_HSCH2_V)<<(LEDC_DUTY_HSCH2_S)) +#define LEDC_DUTY_HSCH2_V 0x1FFFFFF +#define LEDC_DUTY_HSCH2_S 0 + +#define LEDC_HSCH2_CONF1_REG (DR_REG_LEDC_BASE + 0x0034) +/* LEDC_DUTY_START_HSCH2 : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: When reg_duty_num_hsch2 reg_duty_cycle_hsch2 and reg_duty_scale_hsch2 + has been configured. these register won't take effect until set reg_duty_start_hsch2. this bit is automatically cleared by hardware.*/ +#define LEDC_DUTY_START_HSCH2 (BIT(31)) +#define LEDC_DUTY_START_HSCH2_M (BIT(31)) +#define LEDC_DUTY_START_HSCH2_V 0x1 +#define LEDC_DUTY_START_HSCH2_S 31 +/* LEDC_DUTY_INC_HSCH2 : R/W ;bitpos:[30] ;default: 1'b1 ; */ +/*description: This register is used to increase the duty of output signal or + decrease the duty of output signal for high speed channel2.*/ +#define LEDC_DUTY_INC_HSCH2 (BIT(30)) +#define LEDC_DUTY_INC_HSCH2_M (BIT(30)) +#define LEDC_DUTY_INC_HSCH2_V 0x1 +#define LEDC_DUTY_INC_HSCH2_S 30 +/* LEDC_DUTY_NUM_HSCH2 : R/W ;bitpos:[29:20] ;default: 10'h0 ; */ +/*description: This register is used to control the num of increased or decreased + times for high speed channel2.*/ +#define LEDC_DUTY_NUM_HSCH2 0x000003FF +#define LEDC_DUTY_NUM_HSCH2_M ((LEDC_DUTY_NUM_HSCH2_V)<<(LEDC_DUTY_NUM_HSCH2_S)) +#define LEDC_DUTY_NUM_HSCH2_V 0x3FF +#define LEDC_DUTY_NUM_HSCH2_S 20 +/* LEDC_DUTY_CYCLE_HSCH2 : R/W ;bitpos:[19:10] ;default: 10'h0 ; */ +/*description: This register is used to increase or decrease the duty every + reg_duty_cycle_hsch2 cycles for high speed channel2.*/ +#define LEDC_DUTY_CYCLE_HSCH2 0x000003FF +#define LEDC_DUTY_CYCLE_HSCH2_M ((LEDC_DUTY_CYCLE_HSCH2_V)<<(LEDC_DUTY_CYCLE_HSCH2_S)) +#define LEDC_DUTY_CYCLE_HSCH2_V 0x3FF +#define LEDC_DUTY_CYCLE_HSCH2_S 10 +/* LEDC_DUTY_SCALE_HSCH2 : R/W ;bitpos:[9:0] ;default: 10'h0 ; */ +/*description: This register controls the increase or decrease step scale for + high speed channel2.*/ +#define LEDC_DUTY_SCALE_HSCH2 0x000003FF +#define LEDC_DUTY_SCALE_HSCH2_M ((LEDC_DUTY_SCALE_HSCH2_V)<<(LEDC_DUTY_SCALE_HSCH2_S)) +#define LEDC_DUTY_SCALE_HSCH2_V 0x3FF +#define LEDC_DUTY_SCALE_HSCH2_S 0 + +#define LEDC_HSCH2_DUTY_R_REG (DR_REG_LEDC_BASE + 0x0038) +/* LEDC_DUTY_HSCH2 : RO ;bitpos:[24:0] ;default: 25'h0 ; */ +/*description: This register represents the current duty of the output signal + for high speed channel2.*/ +#define LEDC_DUTY_HSCH2 0x01FFFFFF +#define LEDC_DUTY_HSCH2_M ((LEDC_DUTY_HSCH2_V)<<(LEDC_DUTY_HSCH2_S)) +#define LEDC_DUTY_HSCH2_V 0x1FFFFFF +#define LEDC_DUTY_HSCH2_S 0 + +#define LEDC_HSCH3_CONF0_REG (DR_REG_LEDC_BASE + 0x003C) +/* LEDC_IDLE_LV_HSCH3 : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: This bit is used to control the output value when high speed channel3 is off.*/ +#define LEDC_IDLE_LV_HSCH3 (BIT(3)) +#define LEDC_IDLE_LV_HSCH3_M (BIT(3)) +#define LEDC_IDLE_LV_HSCH3_V 0x1 +#define LEDC_IDLE_LV_HSCH3_S 3 +/* LEDC_SIG_OUT_EN_HSCH3 : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: This is the output enable control bit for high speed channel3*/ +#define LEDC_SIG_OUT_EN_HSCH3 (BIT(2)) +#define LEDC_SIG_OUT_EN_HSCH3_M (BIT(2)) +#define LEDC_SIG_OUT_EN_HSCH3_V 0x1 +#define LEDC_SIG_OUT_EN_HSCH3_S 2 +/* LEDC_TIMER_SEL_HSCH3 : R/W ;bitpos:[1:0] ;default: 2'd0 ; */ +/*description: There are four high speed timers the two bits are used to select + one of them for high speed channel3. 2'b00: seletc hstimer0. 2'b01: select hstimer1. 2'b10: select hstimer2. 2'b11: select hstimer3.*/ +#define LEDC_TIMER_SEL_HSCH3 0x00000003 +#define LEDC_TIMER_SEL_HSCH3_M ((LEDC_TIMER_SEL_HSCH3_V)<<(LEDC_TIMER_SEL_HSCH3_S)) +#define LEDC_TIMER_SEL_HSCH3_V 0x3 +#define LEDC_TIMER_SEL_HSCH3_S 0 + +#define LEDC_HSCH3_HPOINT_REG (DR_REG_LEDC_BASE + 0x0040) +/* LEDC_HPOINT_HSCH3 : R/W ;bitpos:[19:0] ;default: 20'h0 ; */ +/*description: The output value changes to high when htimerx(x=[0 3]) selected + by high speed channel3 has reached reg_hpoint_hsch3[19:0]*/ +#define LEDC_HPOINT_HSCH3 0x000FFFFF +#define LEDC_HPOINT_HSCH3_M ((LEDC_HPOINT_HSCH3_V)<<(LEDC_HPOINT_HSCH3_S)) +#define LEDC_HPOINT_HSCH3_V 0xFFFFF +#define LEDC_HPOINT_HSCH3_S 0 + +#define LEDC_HSCH3_DUTY_REG (DR_REG_LEDC_BASE + 0x0044) +/* LEDC_DUTY_HSCH3 : R/W ;bitpos:[24:0] ;default: 25'h0 ; */ +/*description: The register is used to control output duty. When hstimerx(x=[0 + 3]) choosed by high speed channel3 has reached reg_lpoint_hsch3 the output signal changes to low. reg_lpoint_hsch3=(reg_hpoint_hsch3[19:0]+reg_duty_hsch3[24:4]) (1) reg_lpoint_hsch3=(reg_hpoint_hsch3[19:0]+reg_duty_hsch3[24:4] +1) (2) The least four bits in this register represent the decimal part and determines when to choose (1) or (2)*/ +#define LEDC_DUTY_HSCH3 0x01FFFFFF +#define LEDC_DUTY_HSCH3_M ((LEDC_DUTY_HSCH3_V)<<(LEDC_DUTY_HSCH3_S)) +#define LEDC_DUTY_HSCH3_V 0x1FFFFFF +#define LEDC_DUTY_HSCH3_S 0 + +#define LEDC_HSCH3_CONF1_REG (DR_REG_LEDC_BASE + 0x0048) +/* LEDC_DUTY_START_HSCH3 : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: When reg_duty_num_hsch3 reg_duty_cycle_hsch3 and reg_duty_scale_hsch3 + has been configured. these register won't take effect until set reg_duty_start_hsch3. this bit is automatically cleared by hardware.*/ +#define LEDC_DUTY_START_HSCH3 (BIT(31)) +#define LEDC_DUTY_START_HSCH3_M (BIT(31)) +#define LEDC_DUTY_START_HSCH3_V 0x1 +#define LEDC_DUTY_START_HSCH3_S 31 +/* LEDC_DUTY_INC_HSCH3 : R/W ;bitpos:[30] ;default: 1'b1 ; */ +/*description: This register is used to increase the duty of output signal or + decrease the duty of output signal for high speed channel3.*/ +#define LEDC_DUTY_INC_HSCH3 (BIT(30)) +#define LEDC_DUTY_INC_HSCH3_M (BIT(30)) +#define LEDC_DUTY_INC_HSCH3_V 0x1 +#define LEDC_DUTY_INC_HSCH3_S 30 +/* LEDC_DUTY_NUM_HSCH3 : R/W ;bitpos:[29:20] ;default: 10'h0 ; */ +/*description: This register is used to control the num of increased or decreased + times for high speed channel3.*/ +#define LEDC_DUTY_NUM_HSCH3 0x000003FF +#define LEDC_DUTY_NUM_HSCH3_M ((LEDC_DUTY_NUM_HSCH3_V)<<(LEDC_DUTY_NUM_HSCH3_S)) +#define LEDC_DUTY_NUM_HSCH3_V 0x3FF +#define LEDC_DUTY_NUM_HSCH3_S 20 +/* LEDC_DUTY_CYCLE_HSCH3 : R/W ;bitpos:[19:10] ;default: 10'h0 ; */ +/*description: This register is used to increase or decrease the duty every + reg_duty_cycle_hsch3 cycles for high speed channel3.*/ +#define LEDC_DUTY_CYCLE_HSCH3 0x000003FF +#define LEDC_DUTY_CYCLE_HSCH3_M ((LEDC_DUTY_CYCLE_HSCH3_V)<<(LEDC_DUTY_CYCLE_HSCH3_S)) +#define LEDC_DUTY_CYCLE_HSCH3_V 0x3FF +#define LEDC_DUTY_CYCLE_HSCH3_S 10 +/* LEDC_DUTY_SCALE_HSCH3 : R/W ;bitpos:[9:0] ;default: 10'h0 ; */ +/*description: This register controls the increase or decrease step scale for + high speed channel3.*/ +#define LEDC_DUTY_SCALE_HSCH3 0x000003FF +#define LEDC_DUTY_SCALE_HSCH3_M ((LEDC_DUTY_SCALE_HSCH3_V)<<(LEDC_DUTY_SCALE_HSCH3_S)) +#define LEDC_DUTY_SCALE_HSCH3_V 0x3FF +#define LEDC_DUTY_SCALE_HSCH3_S 0 + +#define LEDC_HSCH3_DUTY_R_REG (DR_REG_LEDC_BASE + 0x004C) +/* LEDC_DUTY_HSCH3 : RO ;bitpos:[24:0] ;default: 25'h0 ; */ +/*description: This register represents the current duty of the output signal + for high speed channel3.*/ +#define LEDC_DUTY_HSCH3 0x01FFFFFF +#define LEDC_DUTY_HSCH3_M ((LEDC_DUTY_HSCH3_V)<<(LEDC_DUTY_HSCH3_S)) +#define LEDC_DUTY_HSCH3_V 0x1FFFFFF +#define LEDC_DUTY_HSCH3_S 0 + +#define LEDC_HSCH4_CONF0_REG (DR_REG_LEDC_BASE + 0x0050) +/* LEDC_IDLE_LV_HSCH4 : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: This bit is used to control the output value when high speed channel4 is off.*/ +#define LEDC_IDLE_LV_HSCH4 (BIT(3)) +#define LEDC_IDLE_LV_HSCH4_M (BIT(3)) +#define LEDC_IDLE_LV_HSCH4_V 0x1 +#define LEDC_IDLE_LV_HSCH4_S 3 +/* LEDC_SIG_OUT_EN_HSCH4 : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: This is the output enable control bit for high speed channel4*/ +#define LEDC_SIG_OUT_EN_HSCH4 (BIT(2)) +#define LEDC_SIG_OUT_EN_HSCH4_M (BIT(2)) +#define LEDC_SIG_OUT_EN_HSCH4_V 0x1 +#define LEDC_SIG_OUT_EN_HSCH4_S 2 +/* LEDC_TIMER_SEL_HSCH4 : R/W ;bitpos:[1:0] ;default: 2'd0 ; */ +/*description: There are four high speed timers the two bits are used to select + one of them for high speed channel4. 2'b00: seletc hstimer0. 2'b01: select hstimer1. 2'b10: select hstimer2. 2'b11: select hstimer3.*/ +#define LEDC_TIMER_SEL_HSCH4 0x00000003 +#define LEDC_TIMER_SEL_HSCH4_M ((LEDC_TIMER_SEL_HSCH4_V)<<(LEDC_TIMER_SEL_HSCH4_S)) +#define LEDC_TIMER_SEL_HSCH4_V 0x3 +#define LEDC_TIMER_SEL_HSCH4_S 0 + +#define LEDC_HSCH4_HPOINT_REG (DR_REG_LEDC_BASE + 0x0054) +/* LEDC_HPOINT_HSCH4 : R/W ;bitpos:[19:0] ;default: 20'h0 ; */ +/*description: The output value changes to high when htimerx(x=[0 3]) selected + by high speed channel4 has reached reg_hpoint_hsch4[19:0]*/ +#define LEDC_HPOINT_HSCH4 0x000FFFFF +#define LEDC_HPOINT_HSCH4_M ((LEDC_HPOINT_HSCH4_V)<<(LEDC_HPOINT_HSCH4_S)) +#define LEDC_HPOINT_HSCH4_V 0xFFFFF +#define LEDC_HPOINT_HSCH4_S 0 + +#define LEDC_HSCH4_DUTY_REG (DR_REG_LEDC_BASE + 0x0058) +/* LEDC_DUTY_HSCH4 : R/W ;bitpos:[24:0] ;default: 25'h0 ; */ +/*description: The register is used to control output duty. When hstimerx(x=[0 + 3]) choosed by high speed channel4 has reached reg_lpoint_hsch4 the output signal changes to low. reg_lpoint_hsch4=(reg_hpoint_hsch4[19:0]+reg_duty_hsch4[24:4]) (1) reg_lpoint_hsch4=(reg_hpoint_hsch4[19:0]+reg_duty_hsch4[24:4] +1) (2) The least four bits in this register represent the decimal part and determines when to choose (1) or (2)*/ +#define LEDC_DUTY_HSCH4 0x01FFFFFF +#define LEDC_DUTY_HSCH4_M ((LEDC_DUTY_HSCH4_V)<<(LEDC_DUTY_HSCH4_S)) +#define LEDC_DUTY_HSCH4_V 0x1FFFFFF +#define LEDC_DUTY_HSCH4_S 0 + +#define LEDC_HSCH4_CONF1_REG (DR_REG_LEDC_BASE + 0x005C) +/* LEDC_DUTY_START_HSCH4 : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: When reg_duty_num_hsch1 reg_duty_cycle_hsch1 and reg_duty_scale_hsch1 + has been configured. these register won't take effect until set reg_duty_start_hsch1. this bit is automatically cleared by hardware.*/ +#define LEDC_DUTY_START_HSCH4 (BIT(31)) +#define LEDC_DUTY_START_HSCH4_M (BIT(31)) +#define LEDC_DUTY_START_HSCH4_V 0x1 +#define LEDC_DUTY_START_HSCH4_S 31 +/* LEDC_DUTY_INC_HSCH4 : R/W ;bitpos:[30] ;default: 1'b1 ; */ +/*description: This register is used to increase the duty of output signal or + decrease the duty of output signal for high speed channel4.*/ +#define LEDC_DUTY_INC_HSCH4 (BIT(30)) +#define LEDC_DUTY_INC_HSCH4_M (BIT(30)) +#define LEDC_DUTY_INC_HSCH4_V 0x1 +#define LEDC_DUTY_INC_HSCH4_S 30 +/* LEDC_DUTY_NUM_HSCH4 : R/W ;bitpos:[29:20] ;default: 10'h0 ; */ +/*description: This register is used to control the num of increased or decreased + times for high speed channel1.*/ +#define LEDC_DUTY_NUM_HSCH4 0x000003FF +#define LEDC_DUTY_NUM_HSCH4_M ((LEDC_DUTY_NUM_HSCH4_V)<<(LEDC_DUTY_NUM_HSCH4_S)) +#define LEDC_DUTY_NUM_HSCH4_V 0x3FF +#define LEDC_DUTY_NUM_HSCH4_S 20 +/* LEDC_DUTY_CYCLE_HSCH4 : R/W ;bitpos:[19:10] ;default: 10'h0 ; */ +/*description: This register is used to increase or decrease the duty every + reg_duty_cycle_hsch4 cycles for high speed channel4.*/ +#define LEDC_DUTY_CYCLE_HSCH4 0x000003FF +#define LEDC_DUTY_CYCLE_HSCH4_M ((LEDC_DUTY_CYCLE_HSCH4_V)<<(LEDC_DUTY_CYCLE_HSCH4_S)) +#define LEDC_DUTY_CYCLE_HSCH4_V 0x3FF +#define LEDC_DUTY_CYCLE_HSCH4_S 10 +/* LEDC_DUTY_SCALE_HSCH4 : R/W ;bitpos:[9:0] ;default: 10'h0 ; */ +/*description: This register controls the increase or decrease step scale for + high speed channel4.*/ +#define LEDC_DUTY_SCALE_HSCH4 0x000003FF +#define LEDC_DUTY_SCALE_HSCH4_M ((LEDC_DUTY_SCALE_HSCH4_V)<<(LEDC_DUTY_SCALE_HSCH4_S)) +#define LEDC_DUTY_SCALE_HSCH4_V 0x3FF +#define LEDC_DUTY_SCALE_HSCH4_S 0 + +#define LEDC_HSCH4_DUTY_R_REG (DR_REG_LEDC_BASE + 0x0060) +/* LEDC_DUTY_HSCH4 : RO ;bitpos:[24:0] ;default: 25'h0 ; */ +/*description: This register represents the current duty of the output signal + for high speed channel4.*/ +#define LEDC_DUTY_HSCH4 0x01FFFFFF +#define LEDC_DUTY_HSCH4_M ((LEDC_DUTY_HSCH4_V)<<(LEDC_DUTY_HSCH4_S)) +#define LEDC_DUTY_HSCH4_V 0x1FFFFFF +#define LEDC_DUTY_HSCH4_S 0 + +#define LEDC_HSCH5_CONF0_REG (DR_REG_LEDC_BASE + 0x0064) +/* LEDC_IDLE_LV_HSCH5 : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: This bit is used to control the output value when high speed channel5 is off.*/ +#define LEDC_IDLE_LV_HSCH5 (BIT(3)) +#define LEDC_IDLE_LV_HSCH5_M (BIT(3)) +#define LEDC_IDLE_LV_HSCH5_V 0x1 +#define LEDC_IDLE_LV_HSCH5_S 3 +/* LEDC_SIG_OUT_EN_HSCH5 : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: This is the output enable control bit for high speed channel5.*/ +#define LEDC_SIG_OUT_EN_HSCH5 (BIT(2)) +#define LEDC_SIG_OUT_EN_HSCH5_M (BIT(2)) +#define LEDC_SIG_OUT_EN_HSCH5_V 0x1 +#define LEDC_SIG_OUT_EN_HSCH5_S 2 +/* LEDC_TIMER_SEL_HSCH5 : R/W ;bitpos:[1:0] ;default: 2'd0 ; */ +/*description: There are four high speed timers the two bits are used to select + one of them for high speed channel5. 2'b00: seletc hstimer0. 2'b01: select hstimer1. 2'b10: select hstimer2. 2'b11: select hstimer3.*/ +#define LEDC_TIMER_SEL_HSCH5 0x00000003 +#define LEDC_TIMER_SEL_HSCH5_M ((LEDC_TIMER_SEL_HSCH5_V)<<(LEDC_TIMER_SEL_HSCH5_S)) +#define LEDC_TIMER_SEL_HSCH5_V 0x3 +#define LEDC_TIMER_SEL_HSCH5_S 0 + +#define LEDC_HSCH5_HPOINT_REG (DR_REG_LEDC_BASE + 0x0068) +/* LEDC_HPOINT_HSCH5 : R/W ;bitpos:[19:0] ;default: 20'h0 ; */ +/*description: The output value changes to high when htimerx(x=[0 3]) selected + by high speed channel5 has reached reg_hpoint_hsch5[19:0]*/ +#define LEDC_HPOINT_HSCH5 0x000FFFFF +#define LEDC_HPOINT_HSCH5_M ((LEDC_HPOINT_HSCH5_V)<<(LEDC_HPOINT_HSCH5_S)) +#define LEDC_HPOINT_HSCH5_V 0xFFFFF +#define LEDC_HPOINT_HSCH5_S 0 + +#define LEDC_HSCH5_DUTY_REG (DR_REG_LEDC_BASE + 0x006C) +/* LEDC_DUTY_HSCH5 : R/W ;bitpos:[24:0] ;default: 25'h0 ; */ +/*description: The register is used to control output duty. When hstimerx(x=[0 + 3]) choosed by high speed channel5 has reached reg_lpoint_hsch5 the output signal changes to low. reg_lpoint_hsch5=(reg_hpoint_hsch5[19:0]+reg_duty_hsch5[24:4]) (1) reg_lpoint_hsch5=(reg_hpoint_hsch5[19:0]+reg_duty_hsch5[24:4] +1) (2) The least four bits in this register represent the decimal part and determines when to choose (1) or (2)*/ +#define LEDC_DUTY_HSCH5 0x01FFFFFF +#define LEDC_DUTY_HSCH5_M ((LEDC_DUTY_HSCH5_V)<<(LEDC_DUTY_HSCH5_S)) +#define LEDC_DUTY_HSCH5_V 0x1FFFFFF +#define LEDC_DUTY_HSCH5_S 0 + +#define LEDC_HSCH5_CONF1_REG (DR_REG_LEDC_BASE + 0x0070) +/* LEDC_DUTY_START_HSCH5 : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: When reg_duty_num_hsch5 reg_duty_cycle_hsch5 and reg_duty_scale_hsch5 + has been configured. these register won't take effect until set reg_duty_start_hsch5. this bit is automatically cleared by hardware.*/ +#define LEDC_DUTY_START_HSCH5 (BIT(31)) +#define LEDC_DUTY_START_HSCH5_M (BIT(31)) +#define LEDC_DUTY_START_HSCH5_V 0x1 +#define LEDC_DUTY_START_HSCH5_S 31 +/* LEDC_DUTY_INC_HSCH5 : R/W ;bitpos:[30] ;default: 1'b1 ; */ +/*description: This register is used to increase the duty of output signal or + decrease the duty of output signal for high speed channel5.*/ +#define LEDC_DUTY_INC_HSCH5 (BIT(30)) +#define LEDC_DUTY_INC_HSCH5_M (BIT(30)) +#define LEDC_DUTY_INC_HSCH5_V 0x1 +#define LEDC_DUTY_INC_HSCH5_S 30 +/* LEDC_DUTY_NUM_HSCH5 : R/W ;bitpos:[29:20] ;default: 10'h0 ; */ +/*description: This register is used to control the num of increased or decreased + times for high speed channel5.*/ +#define LEDC_DUTY_NUM_HSCH5 0x000003FF +#define LEDC_DUTY_NUM_HSCH5_M ((LEDC_DUTY_NUM_HSCH5_V)<<(LEDC_DUTY_NUM_HSCH5_S)) +#define LEDC_DUTY_NUM_HSCH5_V 0x3FF +#define LEDC_DUTY_NUM_HSCH5_S 20 +/* LEDC_DUTY_CYCLE_HSCH5 : R/W ;bitpos:[19:10] ;default: 10'h0 ; */ +/*description: This register is used to increase or decrease the duty every + reg_duty_cycle_hsch5 cycles for high speed channel5.*/ +#define LEDC_DUTY_CYCLE_HSCH5 0x000003FF +#define LEDC_DUTY_CYCLE_HSCH5_M ((LEDC_DUTY_CYCLE_HSCH5_V)<<(LEDC_DUTY_CYCLE_HSCH5_S)) +#define LEDC_DUTY_CYCLE_HSCH5_V 0x3FF +#define LEDC_DUTY_CYCLE_HSCH5_S 10 +/* LEDC_DUTY_SCALE_HSCH5 : R/W ;bitpos:[9:0] ;default: 10'h0 ; */ +/*description: This register controls the increase or decrease step scale for + high speed channel5.*/ +#define LEDC_DUTY_SCALE_HSCH5 0x000003FF +#define LEDC_DUTY_SCALE_HSCH5_M ((LEDC_DUTY_SCALE_HSCH5_V)<<(LEDC_DUTY_SCALE_HSCH5_S)) +#define LEDC_DUTY_SCALE_HSCH5_V 0x3FF +#define LEDC_DUTY_SCALE_HSCH5_S 0 + +#define LEDC_HSCH5_DUTY_R_REG (DR_REG_LEDC_BASE + 0x0074) +/* LEDC_DUTY_HSCH5 : RO ;bitpos:[24:0] ;default: 25'h0 ; */ +/*description: This register represents the current duty of the output signal + for high speed channel5.*/ +#define LEDC_DUTY_HSCH5 0x01FFFFFF +#define LEDC_DUTY_HSCH5_M ((LEDC_DUTY_HSCH5_V)<<(LEDC_DUTY_HSCH5_S)) +#define LEDC_DUTY_HSCH5_V 0x1FFFFFF +#define LEDC_DUTY_HSCH5_S 0 + +#define LEDC_HSCH6_CONF0_REG (DR_REG_LEDC_BASE + 0x0078) +/* LEDC_IDLE_LV_HSCH6 : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: This bit is used to control the output value when high speed channel6 is off.*/ +#define LEDC_IDLE_LV_HSCH6 (BIT(3)) +#define LEDC_IDLE_LV_HSCH6_M (BIT(3)) +#define LEDC_IDLE_LV_HSCH6_V 0x1 +#define LEDC_IDLE_LV_HSCH6_S 3 +/* LEDC_SIG_OUT_EN_HSCH6 : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: This is the output enable control bit for high speed channel6*/ +#define LEDC_SIG_OUT_EN_HSCH6 (BIT(2)) +#define LEDC_SIG_OUT_EN_HSCH6_M (BIT(2)) +#define LEDC_SIG_OUT_EN_HSCH6_V 0x1 +#define LEDC_SIG_OUT_EN_HSCH6_S 2 +/* LEDC_TIMER_SEL_HSCH6 : R/W ;bitpos:[1:0] ;default: 2'd0 ; */ +/*description: There are four high speed timers the two bits are used to select + one of them for high speed channel6. 2'b00: seletc hstimer0. 2'b01: select hstimer1. 2'b10: select hstimer2. 2'b11: select hstimer3.*/ +#define LEDC_TIMER_SEL_HSCH6 0x00000003 +#define LEDC_TIMER_SEL_HSCH6_M ((LEDC_TIMER_SEL_HSCH6_V)<<(LEDC_TIMER_SEL_HSCH6_S)) +#define LEDC_TIMER_SEL_HSCH6_V 0x3 +#define LEDC_TIMER_SEL_HSCH6_S 0 + +#define LEDC_HSCH6_HPOINT_REG (DR_REG_LEDC_BASE + 0x007C) +/* LEDC_HPOINT_HSCH6 : R/W ;bitpos:[19:0] ;default: 20'h0 ; */ +/*description: The output value changes to high when htimerx(x=[0 3]) selected + by high speed channel6 has reached reg_hpoint_hsch6[19:0]*/ +#define LEDC_HPOINT_HSCH6 0x000FFFFF +#define LEDC_HPOINT_HSCH6_M ((LEDC_HPOINT_HSCH6_V)<<(LEDC_HPOINT_HSCH6_S)) +#define LEDC_HPOINT_HSCH6_V 0xFFFFF +#define LEDC_HPOINT_HSCH6_S 0 + +#define LEDC_HSCH6_DUTY_REG (DR_REG_LEDC_BASE + 0x0080) +/* LEDC_DUTY_HSCH6 : R/W ;bitpos:[24:0] ;default: 25'h0 ; */ +/*description: The register is used to control output duty. When hstimerx(x=[0 + 3]) choosed by high speed channel6 has reached reg_lpoint_hsch6 the output signal changes to low. reg_lpoint_hsch6=(reg_hpoint_hsch6[19:0]+reg_duty_hsch6[24:4]) (1) reg_lpoint_hsch6=(reg_hpoint_hsch6[19:0]+reg_duty_hsch6[24:4] +1) (2) The least four bits in this register represent the decimal part and determines when to choose (1) or (2)*/ +#define LEDC_DUTY_HSCH6 0x01FFFFFF +#define LEDC_DUTY_HSCH6_M ((LEDC_DUTY_HSCH6_V)<<(LEDC_DUTY_HSCH6_S)) +#define LEDC_DUTY_HSCH6_V 0x1FFFFFF +#define LEDC_DUTY_HSCH6_S 0 + +#define LEDC_HSCH6_CONF1_REG (DR_REG_LEDC_BASE + 0x0084) +/* LEDC_DUTY_START_HSCH6 : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: When reg_duty_num_hsch1 reg_duty_cycle_hsch1 and reg_duty_scale_hsch1 + has been configured. these register won't take effect until set reg_duty_start_hsch1. this bit is automatically cleared by hardware.*/ +#define LEDC_DUTY_START_HSCH6 (BIT(31)) +#define LEDC_DUTY_START_HSCH6_M (BIT(31)) +#define LEDC_DUTY_START_HSCH6_V 0x1 +#define LEDC_DUTY_START_HSCH6_S 31 +/* LEDC_DUTY_INC_HSCH6 : R/W ;bitpos:[30] ;default: 1'b1 ; */ +/*description: This register is used to increase the duty of output signal or + decrease the duty of output signal for high speed channel6.*/ +#define LEDC_DUTY_INC_HSCH6 (BIT(30)) +#define LEDC_DUTY_INC_HSCH6_M (BIT(30)) +#define LEDC_DUTY_INC_HSCH6_V 0x1 +#define LEDC_DUTY_INC_HSCH6_S 30 +/* LEDC_DUTY_NUM_HSCH6 : R/W ;bitpos:[29:20] ;default: 10'h0 ; */ +/*description: This register is used to control the num of increased or decreased + times for high speed channel6.*/ +#define LEDC_DUTY_NUM_HSCH6 0x000003FF +#define LEDC_DUTY_NUM_HSCH6_M ((LEDC_DUTY_NUM_HSCH6_V)<<(LEDC_DUTY_NUM_HSCH6_S)) +#define LEDC_DUTY_NUM_HSCH6_V 0x3FF +#define LEDC_DUTY_NUM_HSCH6_S 20 +/* LEDC_DUTY_CYCLE_HSCH6 : R/W ;bitpos:[19:10] ;default: 10'h0 ; */ +/*description: This register is used to increase or decrease the duty every + reg_duty_cycle_hsch6 cycles for high speed channel6.*/ +#define LEDC_DUTY_CYCLE_HSCH6 0x000003FF +#define LEDC_DUTY_CYCLE_HSCH6_M ((LEDC_DUTY_CYCLE_HSCH6_V)<<(LEDC_DUTY_CYCLE_HSCH6_S)) +#define LEDC_DUTY_CYCLE_HSCH6_V 0x3FF +#define LEDC_DUTY_CYCLE_HSCH6_S 10 +/* LEDC_DUTY_SCALE_HSCH6 : R/W ;bitpos:[9:0] ;default: 10'h0 ; */ +/*description: This register controls the increase or decrease step scale for + high speed channel6.*/ +#define LEDC_DUTY_SCALE_HSCH6 0x000003FF +#define LEDC_DUTY_SCALE_HSCH6_M ((LEDC_DUTY_SCALE_HSCH6_V)<<(LEDC_DUTY_SCALE_HSCH6_S)) +#define LEDC_DUTY_SCALE_HSCH6_V 0x3FF +#define LEDC_DUTY_SCALE_HSCH6_S 0 + +#define LEDC_HSCH6_DUTY_R_REG (DR_REG_LEDC_BASE + 0x0088) +/* LEDC_DUTY_HSCH6 : RO ;bitpos:[24:0] ;default: 25'h0 ; */ +/*description: This register represents the current duty of the output signal + for high speed channel6.*/ +#define LEDC_DUTY_HSCH6 0x01FFFFFF +#define LEDC_DUTY_HSCH6_M ((LEDC_DUTY_HSCH6_V)<<(LEDC_DUTY_HSCH6_S)) +#define LEDC_DUTY_HSCH6_V 0x1FFFFFF +#define LEDC_DUTY_HSCH6_S 0 + +#define LEDC_HSCH7_CONF0_REG (DR_REG_LEDC_BASE + 0x008C) +/* LEDC_IDLE_LV_HSCH7 : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: This bit is used to control the output value when high speed channel7 is off.*/ +#define LEDC_IDLE_LV_HSCH7 (BIT(3)) +#define LEDC_IDLE_LV_HSCH7_M (BIT(3)) +#define LEDC_IDLE_LV_HSCH7_V 0x1 +#define LEDC_IDLE_LV_HSCH7_S 3 +/* LEDC_SIG_OUT_EN_HSCH7 : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: This is the output enable control bit for high speed channel7.*/ +#define LEDC_SIG_OUT_EN_HSCH7 (BIT(2)) +#define LEDC_SIG_OUT_EN_HSCH7_M (BIT(2)) +#define LEDC_SIG_OUT_EN_HSCH7_V 0x1 +#define LEDC_SIG_OUT_EN_HSCH7_S 2 +/* LEDC_TIMER_SEL_HSCH7 : R/W ;bitpos:[1:0] ;default: 2'd0 ; */ +/*description: There are four high speed timers the two bits are used to select + one of them for high speed channel7. 2'b00: seletc hstimer0. 2'b01: select hstimer1. 2'b10: select hstimer2. 2'b11: select hstimer3.*/ +#define LEDC_TIMER_SEL_HSCH7 0x00000003 +#define LEDC_TIMER_SEL_HSCH7_M ((LEDC_TIMER_SEL_HSCH7_V)<<(LEDC_TIMER_SEL_HSCH7_S)) +#define LEDC_TIMER_SEL_HSCH7_V 0x3 +#define LEDC_TIMER_SEL_HSCH7_S 0 + +#define LEDC_HSCH7_HPOINT_REG (DR_REG_LEDC_BASE + 0x0090) +/* LEDC_HPOINT_HSCH7 : R/W ;bitpos:[19:0] ;default: 20'h0 ; */ +/*description: The output value changes to high when htimerx(x=[0 3]) selected + by high speed channel7 has reached reg_hpoint_hsch7[19:0]*/ +#define LEDC_HPOINT_HSCH7 0x000FFFFF +#define LEDC_HPOINT_HSCH7_M ((LEDC_HPOINT_HSCH7_V)<<(LEDC_HPOINT_HSCH7_S)) +#define LEDC_HPOINT_HSCH7_V 0xFFFFF +#define LEDC_HPOINT_HSCH7_S 0 + +#define LEDC_HSCH7_DUTY_REG (DR_REG_LEDC_BASE + 0x0094) +/* LEDC_DUTY_HSCH7 : R/W ;bitpos:[24:0] ;default: 25'h0 ; */ +/*description: The register is used to control output duty. When hstimerx(x=[0 + 3]) choosed by high speed channel7 has reached reg_lpoint_hsch7 the output signal changes to low. reg_lpoint_hsch7=(reg_hpoint_hsch7[19:0]+reg_duty_hsch7[24:4]) (1) reg_lpoint_hsch7=(reg_hpoint_hsch7[19:0]+reg_duty_hsch7[24:4] +1) (2) The least four bits in this register represent the decimal part and determines when to choose (1) or (2)*/ +#define LEDC_DUTY_HSCH7 0x01FFFFFF +#define LEDC_DUTY_HSCH7_M ((LEDC_DUTY_HSCH7_V)<<(LEDC_DUTY_HSCH7_S)) +#define LEDC_DUTY_HSCH7_V 0x1FFFFFF +#define LEDC_DUTY_HSCH7_S 0 + +#define LEDC_HSCH7_CONF1_REG (DR_REG_LEDC_BASE + 0x0098) +/* LEDC_DUTY_START_HSCH7 : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: When reg_duty_num_hsch1 reg_duty_cycle_hsch1 and reg_duty_scale_hsch1 + has been configured. these register won't take effect until set reg_duty_start_hsch1. this bit is automatically cleared by hardware.*/ +#define LEDC_DUTY_START_HSCH7 (BIT(31)) +#define LEDC_DUTY_START_HSCH7_M (BIT(31)) +#define LEDC_DUTY_START_HSCH7_V 0x1 +#define LEDC_DUTY_START_HSCH7_S 31 +/* LEDC_DUTY_INC_HSCH7 : R/W ;bitpos:[30] ;default: 1'b1 ; */ +/*description: This register is used to increase the duty of output signal or + decrease the duty of output signal for high speed channel6.*/ +#define LEDC_DUTY_INC_HSCH7 (BIT(30)) +#define LEDC_DUTY_INC_HSCH7_M (BIT(30)) +#define LEDC_DUTY_INC_HSCH7_V 0x1 +#define LEDC_DUTY_INC_HSCH7_S 30 +/* LEDC_DUTY_NUM_HSCH7 : R/W ;bitpos:[29:20] ;default: 10'h0 ; */ +/*description: This register is used to control the num of increased or decreased + times for high speed channel6.*/ +#define LEDC_DUTY_NUM_HSCH7 0x000003FF +#define LEDC_DUTY_NUM_HSCH7_M ((LEDC_DUTY_NUM_HSCH7_V)<<(LEDC_DUTY_NUM_HSCH7_S)) +#define LEDC_DUTY_NUM_HSCH7_V 0x3FF +#define LEDC_DUTY_NUM_HSCH7_S 20 +/* LEDC_DUTY_CYCLE_HSCH7 : R/W ;bitpos:[19:10] ;default: 10'h0 ; */ +/*description: This register is used to increase or decrease the duty every + reg_duty_cycle_hsch7 cycles for high speed channel7.*/ +#define LEDC_DUTY_CYCLE_HSCH7 0x000003FF +#define LEDC_DUTY_CYCLE_HSCH7_M ((LEDC_DUTY_CYCLE_HSCH7_V)<<(LEDC_DUTY_CYCLE_HSCH7_S)) +#define LEDC_DUTY_CYCLE_HSCH7_V 0x3FF +#define LEDC_DUTY_CYCLE_HSCH7_S 10 +/* LEDC_DUTY_SCALE_HSCH7 : R/W ;bitpos:[9:0] ;default: 10'h0 ; */ +/*description: This register controls the increase or decrease step scale for + high speed channel7.*/ +#define LEDC_DUTY_SCALE_HSCH7 0x000003FF +#define LEDC_DUTY_SCALE_HSCH7_M ((LEDC_DUTY_SCALE_HSCH7_V)<<(LEDC_DUTY_SCALE_HSCH7_S)) +#define LEDC_DUTY_SCALE_HSCH7_V 0x3FF +#define LEDC_DUTY_SCALE_HSCH7_S 0 + +#define LEDC_HSCH7_DUTY_R_REG (DR_REG_LEDC_BASE + 0x009C) +/* LEDC_DUTY_HSCH7 : RO ;bitpos:[24:0] ;default: 25'h0 ; */ +/*description: This register represents the current duty of the output signal + for high speed channel7.*/ +#define LEDC_DUTY_HSCH7 0x01FFFFFF +#define LEDC_DUTY_HSCH7_M ((LEDC_DUTY_HSCH7_V)<<(LEDC_DUTY_HSCH7_S)) +#define LEDC_DUTY_HSCH7_V 0x1FFFFFF +#define LEDC_DUTY_HSCH7_S 0 + +#define LEDC_LSCH0_CONF0_REG (DR_REG_LEDC_BASE + 0x00A0) +/* LEDC_PARA_UP_LSCH0 : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: This bit is used to update register LEDC_LSCH0_HPOINT and LEDC_LSCH0_DUTY + for low speed channel0.*/ +#define LEDC_PARA_UP_LSCH0 (BIT(4)) +#define LEDC_PARA_UP_LSCH0_M (BIT(4)) +#define LEDC_PARA_UP_LSCH0_V 0x1 +#define LEDC_PARA_UP_LSCH0_S 4 +/* LEDC_IDLE_LV_LSCH0 : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: This bit is used to control the output value when low speed channel0 is off.*/ +#define LEDC_IDLE_LV_LSCH0 (BIT(3)) +#define LEDC_IDLE_LV_LSCH0_M (BIT(3)) +#define LEDC_IDLE_LV_LSCH0_V 0x1 +#define LEDC_IDLE_LV_LSCH0_S 3 +/* LEDC_SIG_OUT_EN_LSCH0 : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: This is the output enable control bit for low speed channel0.*/ +#define LEDC_SIG_OUT_EN_LSCH0 (BIT(2)) +#define LEDC_SIG_OUT_EN_LSCH0_M (BIT(2)) +#define LEDC_SIG_OUT_EN_LSCH0_V 0x1 +#define LEDC_SIG_OUT_EN_LSCH0_S 2 +/* LEDC_TIMER_SEL_LSCH0 : R/W ;bitpos:[1:0] ;default: 2'd0 ; */ +/*description: There are four low speed timers the two bits are used to select + one of them for low speed channel0. 2'b00: seletc lstimer0. 2'b01: select lstimer1. 2'b10: select lstimer2. 2'b11: select lstimer3.*/ +#define LEDC_TIMER_SEL_LSCH0 0x00000003 +#define LEDC_TIMER_SEL_LSCH0_M ((LEDC_TIMER_SEL_LSCH0_V)<<(LEDC_TIMER_SEL_LSCH0_S)) +#define LEDC_TIMER_SEL_LSCH0_V 0x3 +#define LEDC_TIMER_SEL_LSCH0_S 0 + +#define LEDC_LSCH0_HPOINT_REG (DR_REG_LEDC_BASE + 0x00A4) +/* LEDC_HPOINT_LSCH0 : R/W ;bitpos:[19:0] ;default: 20'h0 ; */ +/*description: The output value changes to high when lstimerx(x=[0 3]) selected + by low speed channel0 has reached reg_hpoint_lsch0[19:0]*/ +#define LEDC_HPOINT_LSCH0 0x000FFFFF +#define LEDC_HPOINT_LSCH0_M ((LEDC_HPOINT_LSCH0_V)<<(LEDC_HPOINT_LSCH0_S)) +#define LEDC_HPOINT_LSCH0_V 0xFFFFF +#define LEDC_HPOINT_LSCH0_S 0 + +#define LEDC_LSCH0_DUTY_REG (DR_REG_LEDC_BASE + 0x00A8) +/* LEDC_DUTY_LSCH0 : R/W ;bitpos:[24:0] ;default: 25'h0 ; */ +/*description: The register is used to control output duty. When lstimerx(x=[0 + 3]) choosed by low speed channel0 has reached reg_lpoint_lsch0 the output signal changes to low. reg_lpoint_lsch0=(reg_hpoint_lsch0[19:0]+reg_duty_lsch0[24:4]) (1) reg_lpoint_lsch0=(reg_hpoint_lsch0[19:0]+reg_duty_lsch0[24:4] +1) (2) The least four bits in this register represent the decimal part and determines when to choose (1) or (2)*/ +#define LEDC_DUTY_LSCH0 0x01FFFFFF +#define LEDC_DUTY_LSCH0_M ((LEDC_DUTY_LSCH0_V)<<(LEDC_DUTY_LSCH0_S)) +#define LEDC_DUTY_LSCH0_V 0x1FFFFFF +#define LEDC_DUTY_LSCH0_S 0 + +#define LEDC_LSCH0_CONF1_REG (DR_REG_LEDC_BASE + 0x00AC) +/* LEDC_DUTY_START_LSCH0 : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: When reg_duty_num_hsch1 reg_duty_cycle_hsch1 and reg_duty_scale_hsch1 + has been configured. these register won't take effect until set reg_duty_start_hsch1. this bit is automatically cleared by hardware.*/ +#define LEDC_DUTY_START_LSCH0 (BIT(31)) +#define LEDC_DUTY_START_LSCH0_M (BIT(31)) +#define LEDC_DUTY_START_LSCH0_V 0x1 +#define LEDC_DUTY_START_LSCH0_S 31 +/* LEDC_DUTY_INC_LSCH0 : R/W ;bitpos:[30] ;default: 1'b1 ; */ +/*description: This register is used to increase the duty of output signal or + decrease the duty of output signal for low speed channel6.*/ +#define LEDC_DUTY_INC_LSCH0 (BIT(30)) +#define LEDC_DUTY_INC_LSCH0_M (BIT(30)) +#define LEDC_DUTY_INC_LSCH0_V 0x1 +#define LEDC_DUTY_INC_LSCH0_S 30 +/* LEDC_DUTY_NUM_LSCH0 : R/W ;bitpos:[29:20] ;default: 10'h0 ; */ +/*description: This register is used to control the num of increased or decreased + times for low speed channel6.*/ +#define LEDC_DUTY_NUM_LSCH0 0x000003FF +#define LEDC_DUTY_NUM_LSCH0_M ((LEDC_DUTY_NUM_LSCH0_V)<<(LEDC_DUTY_NUM_LSCH0_S)) +#define LEDC_DUTY_NUM_LSCH0_V 0x3FF +#define LEDC_DUTY_NUM_LSCH0_S 20 +/* LEDC_DUTY_CYCLE_LSCH0 : R/W ;bitpos:[19:10] ;default: 10'h0 ; */ +/*description: This register is used to increase or decrease the duty every + reg_duty_cycle_lsch0 cycles for low speed channel0.*/ +#define LEDC_DUTY_CYCLE_LSCH0 0x000003FF +#define LEDC_DUTY_CYCLE_LSCH0_M ((LEDC_DUTY_CYCLE_LSCH0_V)<<(LEDC_DUTY_CYCLE_LSCH0_S)) +#define LEDC_DUTY_CYCLE_LSCH0_V 0x3FF +#define LEDC_DUTY_CYCLE_LSCH0_S 10 +/* LEDC_DUTY_SCALE_LSCH0 : R/W ;bitpos:[9:0] ;default: 10'h0 ; */ +/*description: This register controls the increase or decrease step scale for + low speed channel0.*/ +#define LEDC_DUTY_SCALE_LSCH0 0x000003FF +#define LEDC_DUTY_SCALE_LSCH0_M ((LEDC_DUTY_SCALE_LSCH0_V)<<(LEDC_DUTY_SCALE_LSCH0_S)) +#define LEDC_DUTY_SCALE_LSCH0_V 0x3FF +#define LEDC_DUTY_SCALE_LSCH0_S 0 + +#define LEDC_LSCH0_DUTY_R_REG (DR_REG_LEDC_BASE + 0x00B0) +/* LEDC_DUTY_LSCH0 : RO ;bitpos:[24:0] ;default: 25'h0 ; */ +/*description: This register represents the current duty of the output signal + for low speed channel0.*/ +#define LEDC_DUTY_LSCH0 0x01FFFFFF +#define LEDC_DUTY_LSCH0_M ((LEDC_DUTY_LSCH0_V)<<(LEDC_DUTY_LSCH0_S)) +#define LEDC_DUTY_LSCH0_V 0x1FFFFFF +#define LEDC_DUTY_LSCH0_S 0 + +#define LEDC_LSCH1_CONF0_REG (DR_REG_LEDC_BASE + 0x00B4) +/* LEDC_PARA_UP_LSCH1 : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: This bit is used to update register LEDC_LSCH1_HPOINT and LEDC_LSCH1_DUTY + for low speed channel1.*/ +#define LEDC_PARA_UP_LSCH1 (BIT(4)) +#define LEDC_PARA_UP_LSCH1_M (BIT(4)) +#define LEDC_PARA_UP_LSCH1_V 0x1 +#define LEDC_PARA_UP_LSCH1_S 4 +/* LEDC_IDLE_LV_LSCH1 : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: This bit is used to control the output value when low speed channel1 is off.*/ +#define LEDC_IDLE_LV_LSCH1 (BIT(3)) +#define LEDC_IDLE_LV_LSCH1_M (BIT(3)) +#define LEDC_IDLE_LV_LSCH1_V 0x1 +#define LEDC_IDLE_LV_LSCH1_S 3 +/* LEDC_SIG_OUT_EN_LSCH1 : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: This is the output enable control bit for low speed channel1.*/ +#define LEDC_SIG_OUT_EN_LSCH1 (BIT(2)) +#define LEDC_SIG_OUT_EN_LSCH1_M (BIT(2)) +#define LEDC_SIG_OUT_EN_LSCH1_V 0x1 +#define LEDC_SIG_OUT_EN_LSCH1_S 2 +/* LEDC_TIMER_SEL_LSCH1 : R/W ;bitpos:[1:0] ;default: 2'd0 ; */ +/*description: There are four low speed timers the two bits are used to select + one of them for low speed channel1. 2'b00: seletc lstimer0. 2'b01: select lstimer1. 2'b10: select lstimer2. 2'b11: select lstimer3.*/ +#define LEDC_TIMER_SEL_LSCH1 0x00000003 +#define LEDC_TIMER_SEL_LSCH1_M ((LEDC_TIMER_SEL_LSCH1_V)<<(LEDC_TIMER_SEL_LSCH1_S)) +#define LEDC_TIMER_SEL_LSCH1_V 0x3 +#define LEDC_TIMER_SEL_LSCH1_S 0 + +#define LEDC_LSCH1_HPOINT_REG (DR_REG_LEDC_BASE + 0x00B8) +/* LEDC_HPOINT_LSCH1 : R/W ;bitpos:[19:0] ;default: 20'h0 ; */ +/*description: The output value changes to high when lstimerx(x=[0 3]) selected + by low speed channel1 has reached reg_hpoint_lsch1[19:0]*/ +#define LEDC_HPOINT_LSCH1 0x000FFFFF +#define LEDC_HPOINT_LSCH1_M ((LEDC_HPOINT_LSCH1_V)<<(LEDC_HPOINT_LSCH1_S)) +#define LEDC_HPOINT_LSCH1_V 0xFFFFF +#define LEDC_HPOINT_LSCH1_S 0 + +#define LEDC_LSCH1_DUTY_REG (DR_REG_LEDC_BASE + 0x00BC) +/* LEDC_DUTY_LSCH1 : R/W ;bitpos:[24:0] ;default: 25'h0 ; */ +/*description: The register is used to control output duty. When lstimerx(x=[0 + 3]) choosed by low speed channel1 has reached reg_lpoint_lsch1 the output signal changes to low. reg_lpoint_lsch1=(reg_hpoint_lsch1[19:0]+reg_duty_lsch1[24:4]) (1) reg_lpoint_lsch1=(reg_hpoint_lsch1[19:0]+reg_duty_lsch1[24:4] +1) (2) The least four bits in this register represent the decimal part and determines when to choose (1) or (2)*/ +#define LEDC_DUTY_LSCH1 0x01FFFFFF +#define LEDC_DUTY_LSCH1_M ((LEDC_DUTY_LSCH1_V)<<(LEDC_DUTY_LSCH1_S)) +#define LEDC_DUTY_LSCH1_V 0x1FFFFFF +#define LEDC_DUTY_LSCH1_S 0 + +#define LEDC_LSCH1_CONF1_REG (DR_REG_LEDC_BASE + 0x00C0) +/* LEDC_DUTY_START_LSCH1 : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: When reg_duty_num_hsch1 reg_duty_cycle_hsch1 and reg_duty_scale_hsch1 + has been configured. these register won't take effect until set reg_duty_start_hsch1. this bit is automatically cleared by hardware.*/ +#define LEDC_DUTY_START_LSCH1 (BIT(31)) +#define LEDC_DUTY_START_LSCH1_M (BIT(31)) +#define LEDC_DUTY_START_LSCH1_V 0x1 +#define LEDC_DUTY_START_LSCH1_S 31 +/* LEDC_DUTY_INC_LSCH1 : R/W ;bitpos:[30] ;default: 1'b1 ; */ +/*description: This register is used to increase the duty of output signal or + decrease the duty of output signal for low speed channel1.*/ +#define LEDC_DUTY_INC_LSCH1 (BIT(30)) +#define LEDC_DUTY_INC_LSCH1_M (BIT(30)) +#define LEDC_DUTY_INC_LSCH1_V 0x1 +#define LEDC_DUTY_INC_LSCH1_S 30 +/* LEDC_DUTY_NUM_LSCH1 : R/W ;bitpos:[29:20] ;default: 10'h0 ; */ +/*description: This register is used to control the num of increased or decreased + times for low speed channel1.*/ +#define LEDC_DUTY_NUM_LSCH1 0x000003FF +#define LEDC_DUTY_NUM_LSCH1_M ((LEDC_DUTY_NUM_LSCH1_V)<<(LEDC_DUTY_NUM_LSCH1_S)) +#define LEDC_DUTY_NUM_LSCH1_V 0x3FF +#define LEDC_DUTY_NUM_LSCH1_S 20 +/* LEDC_DUTY_CYCLE_LSCH1 : R/W ;bitpos:[19:10] ;default: 10'h0 ; */ +/*description: This register is used to increase or decrease the duty every + reg_duty_cycle_lsch1 cycles for low speed channel1.*/ +#define LEDC_DUTY_CYCLE_LSCH1 0x000003FF +#define LEDC_DUTY_CYCLE_LSCH1_M ((LEDC_DUTY_CYCLE_LSCH1_V)<<(LEDC_DUTY_CYCLE_LSCH1_S)) +#define LEDC_DUTY_CYCLE_LSCH1_V 0x3FF +#define LEDC_DUTY_CYCLE_LSCH1_S 10 +/* LEDC_DUTY_SCALE_LSCH1 : R/W ;bitpos:[9:0] ;default: 10'h0 ; */ +/*description: This register controls the increase or decrease step scale for + low speed channel1.*/ +#define LEDC_DUTY_SCALE_LSCH1 0x000003FF +#define LEDC_DUTY_SCALE_LSCH1_M ((LEDC_DUTY_SCALE_LSCH1_V)<<(LEDC_DUTY_SCALE_LSCH1_S)) +#define LEDC_DUTY_SCALE_LSCH1_V 0x3FF +#define LEDC_DUTY_SCALE_LSCH1_S 0 + +#define LEDC_LSCH1_DUTY_R_REG (DR_REG_LEDC_BASE + 0x00C4) +/* LEDC_DUTY_LSCH1 : RO ;bitpos:[24:0] ;default: 25'h0 ; */ +/*description: This register represents the current duty of the output signal + for low speed channel1.*/ +#define LEDC_DUTY_LSCH1 0x01FFFFFF +#define LEDC_DUTY_LSCH1_M ((LEDC_DUTY_LSCH1_V)<<(LEDC_DUTY_LSCH1_S)) +#define LEDC_DUTY_LSCH1_V 0x1FFFFFF +#define LEDC_DUTY_LSCH1_S 0 + +#define LEDC_LSCH2_CONF0_REG (DR_REG_LEDC_BASE + 0x00C8) +/* LEDC_PARA_UP_LSCH2 : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: This bit is used to update register LEDC_LSCH2_HPOINT and LEDC_LSCH2_DUTY + for low speed channel2.*/ +#define LEDC_PARA_UP_LSCH2 (BIT(4)) +#define LEDC_PARA_UP_LSCH2_M (BIT(4)) +#define LEDC_PARA_UP_LSCH2_V 0x1 +#define LEDC_PARA_UP_LSCH2_S 4 +/* LEDC_IDLE_LV_LSCH2 : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: This bit is used to control the output value when low speed channel2 is off.*/ +#define LEDC_IDLE_LV_LSCH2 (BIT(3)) +#define LEDC_IDLE_LV_LSCH2_M (BIT(3)) +#define LEDC_IDLE_LV_LSCH2_V 0x1 +#define LEDC_IDLE_LV_LSCH2_S 3 +/* LEDC_SIG_OUT_EN_LSCH2 : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: This is the output enable control bit for low speed channel2.*/ +#define LEDC_SIG_OUT_EN_LSCH2 (BIT(2)) +#define LEDC_SIG_OUT_EN_LSCH2_M (BIT(2)) +#define LEDC_SIG_OUT_EN_LSCH2_V 0x1 +#define LEDC_SIG_OUT_EN_LSCH2_S 2 +/* LEDC_TIMER_SEL_LSCH2 : R/W ;bitpos:[1:0] ;default: 2'd0 ; */ +/*description: There are four low speed timers the two bits are used to select + one of them for low speed channel2. 2'b00: seletc lstimer0. 2'b01: select lstimer1. 2'b10: select lstimer2. 2'b11: select lstimer3.*/ +#define LEDC_TIMER_SEL_LSCH2 0x00000003 +#define LEDC_TIMER_SEL_LSCH2_M ((LEDC_TIMER_SEL_LSCH2_V)<<(LEDC_TIMER_SEL_LSCH2_S)) +#define LEDC_TIMER_SEL_LSCH2_V 0x3 +#define LEDC_TIMER_SEL_LSCH2_S 0 + +#define LEDC_LSCH2_HPOINT_REG (DR_REG_LEDC_BASE + 0x00CC) +/* LEDC_HPOINT_LSCH2 : R/W ;bitpos:[19:0] ;default: 20'h0 ; */ +/*description: The output value changes to high when lstimerx(x=[0 3]) selected + by low speed channel2 has reached reg_hpoint_lsch2[19:0]*/ +#define LEDC_HPOINT_LSCH2 0x000FFFFF +#define LEDC_HPOINT_LSCH2_M ((LEDC_HPOINT_LSCH2_V)<<(LEDC_HPOINT_LSCH2_S)) +#define LEDC_HPOINT_LSCH2_V 0xFFFFF +#define LEDC_HPOINT_LSCH2_S 0 + +#define LEDC_LSCH2_DUTY_REG (DR_REG_LEDC_BASE + 0x00D0) +/* LEDC_DUTY_LSCH2 : R/W ;bitpos:[24:0] ;default: 25'h0 ; */ +/*description: The register is used to control output duty. When lstimerx(x=[0 + 3]) choosed by low speed channel2 has reached reg_lpoint_lsch2 the output signal changes to low. reg_lpoint_lsch2=(reg_hpoint_lsch2[19:0]+reg_duty_lsch2[24:4]) (1) reg_lpoint_lsch2=(reg_hpoint_lsch2[19:0]+reg_duty_lsch2[24:4] +1) (2) The least four bits in this register represent the decimal part and determines when to choose (1) or (2)*/ +#define LEDC_DUTY_LSCH2 0x01FFFFFF +#define LEDC_DUTY_LSCH2_M ((LEDC_DUTY_LSCH2_V)<<(LEDC_DUTY_LSCH2_S)) +#define LEDC_DUTY_LSCH2_V 0x1FFFFFF +#define LEDC_DUTY_LSCH2_S 0 + +#define LEDC_LSCH2_CONF1_REG (DR_REG_LEDC_BASE + 0x00D4) +/* LEDC_DUTY_START_LSCH2 : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: When reg_duty_num_hsch2 reg_duty_cycle_hsch2 and reg_duty_scale_hsch2 + has been configured. these register won't take effect until set reg_duty_start_hsch2. this bit is automatically cleared by hardware.*/ +#define LEDC_DUTY_START_LSCH2 (BIT(31)) +#define LEDC_DUTY_START_LSCH2_M (BIT(31)) +#define LEDC_DUTY_START_LSCH2_V 0x1 +#define LEDC_DUTY_START_LSCH2_S 31 +/* LEDC_DUTY_INC_LSCH2 : R/W ;bitpos:[30] ;default: 1'b1 ; */ +/*description: This register is used to increase the duty of output signal or + decrease the duty of output signal for low speed channel2.*/ +#define LEDC_DUTY_INC_LSCH2 (BIT(30)) +#define LEDC_DUTY_INC_LSCH2_M (BIT(30)) +#define LEDC_DUTY_INC_LSCH2_V 0x1 +#define LEDC_DUTY_INC_LSCH2_S 30 +/* LEDC_DUTY_NUM_LSCH2 : R/W ;bitpos:[29:20] ;default: 10'h0 ; */ +/*description: This register is used to control the num of increased or decreased + times for low speed channel2.*/ +#define LEDC_DUTY_NUM_LSCH2 0x000003FF +#define LEDC_DUTY_NUM_LSCH2_M ((LEDC_DUTY_NUM_LSCH2_V)<<(LEDC_DUTY_NUM_LSCH2_S)) +#define LEDC_DUTY_NUM_LSCH2_V 0x3FF +#define LEDC_DUTY_NUM_LSCH2_S 20 +/* LEDC_DUTY_CYCLE_LSCH2 : R/W ;bitpos:[19:10] ;default: 10'h0 ; */ +/*description: This register is used to increase or decrease the duty every + reg_duty_cycle_lsch2 cycles for low speed channel2.*/ +#define LEDC_DUTY_CYCLE_LSCH2 0x000003FF +#define LEDC_DUTY_CYCLE_LSCH2_M ((LEDC_DUTY_CYCLE_LSCH2_V)<<(LEDC_DUTY_CYCLE_LSCH2_S)) +#define LEDC_DUTY_CYCLE_LSCH2_V 0x3FF +#define LEDC_DUTY_CYCLE_LSCH2_S 10 +/* LEDC_DUTY_SCALE_LSCH2 : R/W ;bitpos:[9:0] ;default: 10'h0 ; */ +/*description: This register controls the increase or decrease step scale for + low speed channel2.*/ +#define LEDC_DUTY_SCALE_LSCH2 0x000003FF +#define LEDC_DUTY_SCALE_LSCH2_M ((LEDC_DUTY_SCALE_LSCH2_V)<<(LEDC_DUTY_SCALE_LSCH2_S)) +#define LEDC_DUTY_SCALE_LSCH2_V 0x3FF +#define LEDC_DUTY_SCALE_LSCH2_S 0 + +#define LEDC_LSCH2_DUTY_R_REG (DR_REG_LEDC_BASE + 0x00D8) +/* LEDC_DUTY_LSCH2 : RO ;bitpos:[24:0] ;default: 25'h0 ; */ +/*description: This register represents the current duty of the output signal + for low speed channel2.*/ +#define LEDC_DUTY_LSCH2 0x01FFFFFF +#define LEDC_DUTY_LSCH2_M ((LEDC_DUTY_LSCH2_V)<<(LEDC_DUTY_LSCH2_S)) +#define LEDC_DUTY_LSCH2_V 0x1FFFFFF +#define LEDC_DUTY_LSCH2_S 0 + +#define LEDC_LSCH3_CONF0_REG (DR_REG_LEDC_BASE + 0x00DC) +/* LEDC_PARA_UP_LSCH3 : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: This bit is used to update register LEDC_LSCH3_HPOINT and LEDC_LSCH3_DUTY + for low speed channel3.*/ +#define LEDC_PARA_UP_LSCH3 (BIT(4)) +#define LEDC_PARA_UP_LSCH3_M (BIT(4)) +#define LEDC_PARA_UP_LSCH3_V 0x1 +#define LEDC_PARA_UP_LSCH3_S 4 +/* LEDC_IDLE_LV_LSCH3 : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: This bit is used to control the output value when low speed channel3 is off.*/ +#define LEDC_IDLE_LV_LSCH3 (BIT(3)) +#define LEDC_IDLE_LV_LSCH3_M (BIT(3)) +#define LEDC_IDLE_LV_LSCH3_V 0x1 +#define LEDC_IDLE_LV_LSCH3_S 3 +/* LEDC_SIG_OUT_EN_LSCH3 : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: This is the output enable control bit for low speed channel3.*/ +#define LEDC_SIG_OUT_EN_LSCH3 (BIT(2)) +#define LEDC_SIG_OUT_EN_LSCH3_M (BIT(2)) +#define LEDC_SIG_OUT_EN_LSCH3_V 0x1 +#define LEDC_SIG_OUT_EN_LSCH3_S 2 +/* LEDC_TIMER_SEL_LSCH3 : R/W ;bitpos:[1:0] ;default: 2'd0 ; */ +/*description: There are four low speed timers the two bits are used to select + one of them for low speed channel3. 2'b00: seletc lstimer0. 2'b01: select lstimer1. 2'b10: select lstimer2. 2'b11: select lstimer3.*/ +#define LEDC_TIMER_SEL_LSCH3 0x00000003 +#define LEDC_TIMER_SEL_LSCH3_M ((LEDC_TIMER_SEL_LSCH3_V)<<(LEDC_TIMER_SEL_LSCH3_S)) +#define LEDC_TIMER_SEL_LSCH3_V 0x3 +#define LEDC_TIMER_SEL_LSCH3_S 0 + +#define LEDC_LSCH3_HPOINT_REG (DR_REG_LEDC_BASE + 0x00E0) +/* LEDC_HPOINT_LSCH3 : R/W ;bitpos:[19:0] ;default: 20'h0 ; */ +/*description: The output value changes to high when lstimerx(x=[0 3]) selected + by low speed channel3 has reached reg_hpoint_lsch3[19:0]*/ +#define LEDC_HPOINT_LSCH3 0x000FFFFF +#define LEDC_HPOINT_LSCH3_M ((LEDC_HPOINT_LSCH3_V)<<(LEDC_HPOINT_LSCH3_S)) +#define LEDC_HPOINT_LSCH3_V 0xFFFFF +#define LEDC_HPOINT_LSCH3_S 0 + +#define LEDC_LSCH3_DUTY_REG (DR_REG_LEDC_BASE + 0x00E4) +/* LEDC_DUTY_LSCH3 : R/W ;bitpos:[24:0] ;default: 25'h0 ; */ +/*description: The register is used to control output duty. When lstimerx(x=[0 + 3]) choosed by low speed channel3 has reached reg_lpoint_lsch3 the output signal changes to low. reg_lpoint_lsch3=(reg_hpoint_lsch3[19:0]+reg_duty_lsch3[24:4]) (1) reg_lpoint_lsch3=(reg_hpoint_lsch3[19:0]+reg_duty_lsch3[24:4] +1) (2) The least four bits in this register represent the decimal part and determines when to choose (1) or (2)*/ +#define LEDC_DUTY_LSCH3 0x01FFFFFF +#define LEDC_DUTY_LSCH3_M ((LEDC_DUTY_LSCH3_V)<<(LEDC_DUTY_LSCH3_S)) +#define LEDC_DUTY_LSCH3_V 0x1FFFFFF +#define LEDC_DUTY_LSCH3_S 0 + +#define LEDC_LSCH3_CONF1_REG (DR_REG_LEDC_BASE + 0x00E8) +/* LEDC_DUTY_START_LSCH3 : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: When reg_duty_num_hsch3 reg_duty_cycle_hsch3 and reg_duty_scale_hsch3 + has been configured. these register won't take effect until set reg_duty_start_hsch3. this bit is automatically cleared by hardware.*/ +#define LEDC_DUTY_START_LSCH3 (BIT(31)) +#define LEDC_DUTY_START_LSCH3_M (BIT(31)) +#define LEDC_DUTY_START_LSCH3_V 0x1 +#define LEDC_DUTY_START_LSCH3_S 31 +/* LEDC_DUTY_INC_LSCH3 : R/W ;bitpos:[30] ;default: 1'b1 ; */ +/*description: This register is used to increase the duty of output signal or + decrease the duty of output signal for low speed channel3.*/ +#define LEDC_DUTY_INC_LSCH3 (BIT(30)) +#define LEDC_DUTY_INC_LSCH3_M (BIT(30)) +#define LEDC_DUTY_INC_LSCH3_V 0x1 +#define LEDC_DUTY_INC_LSCH3_S 30 +/* LEDC_DUTY_NUM_LSCH3 : R/W ;bitpos:[29:20] ;default: 10'h0 ; */ +/*description: This register is used to control the num of increased or decreased + times for low speed channel3.*/ +#define LEDC_DUTY_NUM_LSCH3 0x000003FF +#define LEDC_DUTY_NUM_LSCH3_M ((LEDC_DUTY_NUM_LSCH3_V)<<(LEDC_DUTY_NUM_LSCH3_S)) +#define LEDC_DUTY_NUM_LSCH3_V 0x3FF +#define LEDC_DUTY_NUM_LSCH3_S 20 +/* LEDC_DUTY_CYCLE_LSCH3 : R/W ;bitpos:[19:10] ;default: 10'h0 ; */ +/*description: This register is used to increase or decrease the duty every + reg_duty_cycle_lsch3 cycles for low speed channel3.*/ +#define LEDC_DUTY_CYCLE_LSCH3 0x000003FF +#define LEDC_DUTY_CYCLE_LSCH3_M ((LEDC_DUTY_CYCLE_LSCH3_V)<<(LEDC_DUTY_CYCLE_LSCH3_S)) +#define LEDC_DUTY_CYCLE_LSCH3_V 0x3FF +#define LEDC_DUTY_CYCLE_LSCH3_S 10 +/* LEDC_DUTY_SCALE_LSCH3 : R/W ;bitpos:[9:0] ;default: 10'h0 ; */ +/*description: This register controls the increase or decrease step scale for + low speed channel3.*/ +#define LEDC_DUTY_SCALE_LSCH3 0x000003FF +#define LEDC_DUTY_SCALE_LSCH3_M ((LEDC_DUTY_SCALE_LSCH3_V)<<(LEDC_DUTY_SCALE_LSCH3_S)) +#define LEDC_DUTY_SCALE_LSCH3_V 0x3FF +#define LEDC_DUTY_SCALE_LSCH3_S 0 + +#define LEDC_LSCH3_DUTY_R_REG (DR_REG_LEDC_BASE + 0x00EC) +/* LEDC_DUTY_LSCH3 : RO ;bitpos:[24:0] ;default: 25'h0 ; */ +/*description: This register represents the current duty of the output signal + for low speed channel3.*/ +#define LEDC_DUTY_LSCH3 0x01FFFFFF +#define LEDC_DUTY_LSCH3_M ((LEDC_DUTY_LSCH3_V)<<(LEDC_DUTY_LSCH3_S)) +#define LEDC_DUTY_LSCH3_V 0x1FFFFFF +#define LEDC_DUTY_LSCH3_S 0 + +#define LEDC_LSCH4_CONF0_REG (DR_REG_LEDC_BASE + 0x00F0) +/* LEDC_PARA_UP_LSCH4 : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: This bit is used to update register LEDC_LSCH4_HPOINT and LEDC_LSCH4_DUTY + for low speed channel4.*/ +#define LEDC_PARA_UP_LSCH4 (BIT(4)) +#define LEDC_PARA_UP_LSCH4_M (BIT(4)) +#define LEDC_PARA_UP_LSCH4_V 0x1 +#define LEDC_PARA_UP_LSCH4_S 4 +/* LEDC_IDLE_LV_LSCH4 : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: This bit is used to control the output value when low speed channel4 is off.*/ +#define LEDC_IDLE_LV_LSCH4 (BIT(3)) +#define LEDC_IDLE_LV_LSCH4_M (BIT(3)) +#define LEDC_IDLE_LV_LSCH4_V 0x1 +#define LEDC_IDLE_LV_LSCH4_S 3 +/* LEDC_SIG_OUT_EN_LSCH4 : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: This is the output enable control bit for low speed channel4.*/ +#define LEDC_SIG_OUT_EN_LSCH4 (BIT(2)) +#define LEDC_SIG_OUT_EN_LSCH4_M (BIT(2)) +#define LEDC_SIG_OUT_EN_LSCH4_V 0x1 +#define LEDC_SIG_OUT_EN_LSCH4_S 2 +/* LEDC_TIMER_SEL_LSCH4 : R/W ;bitpos:[1:0] ;default: 2'd0 ; */ +/*description: There are four low speed timers the two bits are used to select + one of them for low speed channel4. 2'b00: seletc lstimer0. 2'b01: select lstimer1. 2'b10: select lstimer2. 2'b11: select lstimer3.*/ +#define LEDC_TIMER_SEL_LSCH4 0x00000003 +#define LEDC_TIMER_SEL_LSCH4_M ((LEDC_TIMER_SEL_LSCH4_V)<<(LEDC_TIMER_SEL_LSCH4_S)) +#define LEDC_TIMER_SEL_LSCH4_V 0x3 +#define LEDC_TIMER_SEL_LSCH4_S 0 + +#define LEDC_LSCH4_HPOINT_REG (DR_REG_LEDC_BASE + 0x00F4) +/* LEDC_HPOINT_LSCH4 : R/W ;bitpos:[19:0] ;default: 20'h0 ; */ +/*description: The output value changes to high when lstimerx(x=[0 3]) selected + by low speed channel4 has reached reg_hpoint_lsch4[19:0]*/ +#define LEDC_HPOINT_LSCH4 0x000FFFFF +#define LEDC_HPOINT_LSCH4_M ((LEDC_HPOINT_LSCH4_V)<<(LEDC_HPOINT_LSCH4_S)) +#define LEDC_HPOINT_LSCH4_V 0xFFFFF +#define LEDC_HPOINT_LSCH4_S 0 + +#define LEDC_LSCH4_DUTY_REG (DR_REG_LEDC_BASE + 0x00F8) +/* LEDC_DUTY_LSCH4 : R/W ;bitpos:[24:0] ;default: 25'h0 ; */ +/*description: The register is used to control output duty. When lstimerx(x=[0 + 3]) choosed by low speed channel4 has reached reg_lpoint_lsch4 the output signal changes to low. reg_lpoint_lsch4=(reg_hpoint_lsch4[19:0]+reg_duty_lsch4[24:4]) (1) reg_lpoint_lsch4=(reg_hpoint_lsch4[19:0]+reg_duty_lsch4[24:4] +1) (2) The least four bits in this register represent the decimal part and determines when to choose (1) or (2)*/ +#define LEDC_DUTY_LSCH4 0x01FFFFFF +#define LEDC_DUTY_LSCH4_M ((LEDC_DUTY_LSCH4_V)<<(LEDC_DUTY_LSCH4_S)) +#define LEDC_DUTY_LSCH4_V 0x1FFFFFF +#define LEDC_DUTY_LSCH4_S 0 + +#define LEDC_LSCH4_CONF1_REG (DR_REG_LEDC_BASE + 0x00FC) +/* LEDC_DUTY_START_LSCH4 : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: When reg_duty_num_hsch4 reg_duty_cycle_hsch4 and reg_duty_scale_hsch4 + has been configured. these register won't take effect until set reg_duty_start_hsch4. this bit is automatically cleared by hardware.*/ +#define LEDC_DUTY_START_LSCH4 (BIT(31)) +#define LEDC_DUTY_START_LSCH4_M (BIT(31)) +#define LEDC_DUTY_START_LSCH4_V 0x1 +#define LEDC_DUTY_START_LSCH4_S 31 +/* LEDC_DUTY_INC_LSCH4 : R/W ;bitpos:[30] ;default: 1'b1 ; */ +/*description: This register is used to increase the duty of output signal or + decrease the duty of output signal for low speed channel4.*/ +#define LEDC_DUTY_INC_LSCH4 (BIT(30)) +#define LEDC_DUTY_INC_LSCH4_M (BIT(30)) +#define LEDC_DUTY_INC_LSCH4_V 0x1 +#define LEDC_DUTY_INC_LSCH4_S 30 +/* LEDC_DUTY_NUM_LSCH4 : R/W ;bitpos:[29:20] ;default: 10'h0 ; */ +/*description: This register is used to control the num of increased or decreased + times for low speed channel4.*/ +#define LEDC_DUTY_NUM_LSCH4 0x000003FF +#define LEDC_DUTY_NUM_LSCH4_M ((LEDC_DUTY_NUM_LSCH4_V)<<(LEDC_DUTY_NUM_LSCH4_S)) +#define LEDC_DUTY_NUM_LSCH4_V 0x3FF +#define LEDC_DUTY_NUM_LSCH4_S 20 +/* LEDC_DUTY_CYCLE_LSCH4 : R/W ;bitpos:[19:10] ;default: 10'h0 ; */ +/*description: This register is used to increase or decrease the duty every + reg_duty_cycle_lsch4 cycles for low speed channel4.*/ +#define LEDC_DUTY_CYCLE_LSCH4 0x000003FF +#define LEDC_DUTY_CYCLE_LSCH4_M ((LEDC_DUTY_CYCLE_LSCH4_V)<<(LEDC_DUTY_CYCLE_LSCH4_S)) +#define LEDC_DUTY_CYCLE_LSCH4_V 0x3FF +#define LEDC_DUTY_CYCLE_LSCH4_S 10 +/* LEDC_DUTY_SCALE_LSCH4 : R/W ;bitpos:[9:0] ;default: 10'h0 ; */ +/*description: This register controls the increase or decrease step scale for + low speed channel4.*/ +#define LEDC_DUTY_SCALE_LSCH4 0x000003FF +#define LEDC_DUTY_SCALE_LSCH4_M ((LEDC_DUTY_SCALE_LSCH4_V)<<(LEDC_DUTY_SCALE_LSCH4_S)) +#define LEDC_DUTY_SCALE_LSCH4_V 0x3FF +#define LEDC_DUTY_SCALE_LSCH4_S 0 + +#define LEDC_LSCH4_DUTY_R_REG (DR_REG_LEDC_BASE + 0x0100) +/* LEDC_DUTY_LSCH4 : RO ;bitpos:[24:0] ;default: 25'h0 ; */ +/*description: This register represents the current duty of the output signal + for low speed channel4.*/ +#define LEDC_DUTY_LSCH4 0x01FFFFFF +#define LEDC_DUTY_LSCH4_M ((LEDC_DUTY_LSCH4_V)<<(LEDC_DUTY_LSCH4_S)) +#define LEDC_DUTY_LSCH4_V 0x1FFFFFF +#define LEDC_DUTY_LSCH4_S 0 + +#define LEDC_LSCH5_CONF0_REG (DR_REG_LEDC_BASE + 0x0104) +/* LEDC_PARA_UP_LSCH5 : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: This bit is used to update register LEDC_LSCH5_HPOINT and LEDC_LSCH5_DUTY + for low speed channel5.*/ +#define LEDC_PARA_UP_LSCH5 (BIT(4)) +#define LEDC_PARA_UP_LSCH5_M (BIT(4)) +#define LEDC_PARA_UP_LSCH5_V 0x1 +#define LEDC_PARA_UP_LSCH5_S 4 +/* LEDC_IDLE_LV_LSCH5 : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: This bit is used to control the output value when low speed channel5 is off.*/ +#define LEDC_IDLE_LV_LSCH5 (BIT(3)) +#define LEDC_IDLE_LV_LSCH5_M (BIT(3)) +#define LEDC_IDLE_LV_LSCH5_V 0x1 +#define LEDC_IDLE_LV_LSCH5_S 3 +/* LEDC_SIG_OUT_EN_LSCH5 : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: This is the output enable control bit for low speed channel5.*/ +#define LEDC_SIG_OUT_EN_LSCH5 (BIT(2)) +#define LEDC_SIG_OUT_EN_LSCH5_M (BIT(2)) +#define LEDC_SIG_OUT_EN_LSCH5_V 0x1 +#define LEDC_SIG_OUT_EN_LSCH5_S 2 +/* LEDC_TIMER_SEL_LSCH5 : R/W ;bitpos:[1:0] ;default: 2'd0 ; */ +/*description: There are four low speed timers the two bits are used to select + one of them for low speed channel5. 2'b00: seletc lstimer0. 2'b01: select lstimer1. 2'b10: select lstimer2. 2'b11: select lstimer3.*/ +#define LEDC_TIMER_SEL_LSCH5 0x00000003 +#define LEDC_TIMER_SEL_LSCH5_M ((LEDC_TIMER_SEL_LSCH5_V)<<(LEDC_TIMER_SEL_LSCH5_S)) +#define LEDC_TIMER_SEL_LSCH5_V 0x3 +#define LEDC_TIMER_SEL_LSCH5_S 0 + +#define LEDC_LSCH5_HPOINT_REG (DR_REG_LEDC_BASE + 0x0108) +/* LEDC_HPOINT_LSCH5 : R/W ;bitpos:[19:0] ;default: 20'h0 ; */ +/*description: The output value changes to high when lstimerx(x=[0 3]) selected + by low speed channel5 has reached reg_hpoint_lsch5[19:0]*/ +#define LEDC_HPOINT_LSCH5 0x000FFFFF +#define LEDC_HPOINT_LSCH5_M ((LEDC_HPOINT_LSCH5_V)<<(LEDC_HPOINT_LSCH5_S)) +#define LEDC_HPOINT_LSCH5_V 0xFFFFF +#define LEDC_HPOINT_LSCH5_S 0 + +#define LEDC_LSCH5_DUTY_REG (DR_REG_LEDC_BASE + 0x010C) +/* LEDC_DUTY_LSCH5 : R/W ;bitpos:[24:0] ;default: 25'h0 ; */ +/*description: The register is used to control output duty. When lstimerx(x=[0 + 3]) choosed by low speed channel5 has reached reg_lpoint_lsch5 the output signal changes to low. reg_lpoint_lsch5=(reg_hpoint_lsch5[19:0]+reg_duty_lsch5[24:4]) (1) reg_lpoint_lsch5=(reg_hpoint_lsch5[19:0]+reg_duty_lsch5[24:4] +1) (2) The least four bits in this register represent the decimal part and determines when to choose (1) or (2)*/ +#define LEDC_DUTY_LSCH5 0x01FFFFFF +#define LEDC_DUTY_LSCH5_M ((LEDC_DUTY_LSCH5_V)<<(LEDC_DUTY_LSCH5_S)) +#define LEDC_DUTY_LSCH5_V 0x1FFFFFF +#define LEDC_DUTY_LSCH5_S 0 + +#define LEDC_LSCH5_CONF1_REG (DR_REG_LEDC_BASE + 0x0110) +/* LEDC_DUTY_START_LSCH5 : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: When reg_duty_num_hsch4 reg_duty_cycle_hsch4 and reg_duty_scale_hsch4 + has been configured. these register won't take effect until set reg_duty_start_hsch4. this bit is automatically cleared by hardware.*/ +#define LEDC_DUTY_START_LSCH5 (BIT(31)) +#define LEDC_DUTY_START_LSCH5_M (BIT(31)) +#define LEDC_DUTY_START_LSCH5_V 0x1 +#define LEDC_DUTY_START_LSCH5_S 31 +/* LEDC_DUTY_INC_LSCH5 : R/W ;bitpos:[30] ;default: 1'b1 ; */ +/*description: This register is used to increase the duty of output signal or + decrease the duty of output signal for low speed channel5.*/ +#define LEDC_DUTY_INC_LSCH5 (BIT(30)) +#define LEDC_DUTY_INC_LSCH5_M (BIT(30)) +#define LEDC_DUTY_INC_LSCH5_V 0x1 +#define LEDC_DUTY_INC_LSCH5_S 30 +/* LEDC_DUTY_NUM_LSCH5 : R/W ;bitpos:[29:20] ;default: 10'h0 ; */ +/*description: This register is used to control the num of increased or decreased + times for low speed channel5.*/ +#define LEDC_DUTY_NUM_LSCH5 0x000003FF +#define LEDC_DUTY_NUM_LSCH5_M ((LEDC_DUTY_NUM_LSCH5_V)<<(LEDC_DUTY_NUM_LSCH5_S)) +#define LEDC_DUTY_NUM_LSCH5_V 0x3FF +#define LEDC_DUTY_NUM_LSCH5_S 20 +/* LEDC_DUTY_CYCLE_LSCH5 : R/W ;bitpos:[19:10] ;default: 10'h0 ; */ +/*description: This register is used to increase or decrease the duty every + reg_duty_cycle_lsch5 cycles for low speed channel4.*/ +#define LEDC_DUTY_CYCLE_LSCH5 0x000003FF +#define LEDC_DUTY_CYCLE_LSCH5_M ((LEDC_DUTY_CYCLE_LSCH5_V)<<(LEDC_DUTY_CYCLE_LSCH5_S)) +#define LEDC_DUTY_CYCLE_LSCH5_V 0x3FF +#define LEDC_DUTY_CYCLE_LSCH5_S 10 +/* LEDC_DUTY_SCALE_LSCH5 : R/W ;bitpos:[9:0] ;default: 10'h0 ; */ +/*description: This register controls the increase or decrease step scale for + low speed channel5.*/ +#define LEDC_DUTY_SCALE_LSCH5 0x000003FF +#define LEDC_DUTY_SCALE_LSCH5_M ((LEDC_DUTY_SCALE_LSCH5_V)<<(LEDC_DUTY_SCALE_LSCH5_S)) +#define LEDC_DUTY_SCALE_LSCH5_V 0x3FF +#define LEDC_DUTY_SCALE_LSCH5_S 0 + +#define LEDC_LSCH5_DUTY_R_REG (DR_REG_LEDC_BASE + 0x0114) +/* LEDC_DUTY_LSCH5 : RO ;bitpos:[24:0] ;default: 25'h0 ; */ +/*description: This register represents the current duty of the output signal + for low speed channel5.*/ +#define LEDC_DUTY_LSCH5 0x01FFFFFF +#define LEDC_DUTY_LSCH5_M ((LEDC_DUTY_LSCH5_V)<<(LEDC_DUTY_LSCH5_S)) +#define LEDC_DUTY_LSCH5_V 0x1FFFFFF +#define LEDC_DUTY_LSCH5_S 0 + +#define LEDC_LSCH6_CONF0_REG (DR_REG_LEDC_BASE + 0x0118) +/* LEDC_PARA_UP_LSCH6 : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: This bit is used to update register LEDC_LSCH6_HPOINT and LEDC_LSCH6_DUTY + for low speed channel6.*/ +#define LEDC_PARA_UP_LSCH6 (BIT(4)) +#define LEDC_PARA_UP_LSCH6_M (BIT(4)) +#define LEDC_PARA_UP_LSCH6_V 0x1 +#define LEDC_PARA_UP_LSCH6_S 4 +/* LEDC_IDLE_LV_LSCH6 : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: This bit is used to control the output value when low speed channel6 is off.*/ +#define LEDC_IDLE_LV_LSCH6 (BIT(3)) +#define LEDC_IDLE_LV_LSCH6_M (BIT(3)) +#define LEDC_IDLE_LV_LSCH6_V 0x1 +#define LEDC_IDLE_LV_LSCH6_S 3 +/* LEDC_SIG_OUT_EN_LSCH6 : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: This is the output enable control bit for low speed channel6.*/ +#define LEDC_SIG_OUT_EN_LSCH6 (BIT(2)) +#define LEDC_SIG_OUT_EN_LSCH6_M (BIT(2)) +#define LEDC_SIG_OUT_EN_LSCH6_V 0x1 +#define LEDC_SIG_OUT_EN_LSCH6_S 2 +/* LEDC_TIMER_SEL_LSCH6 : R/W ;bitpos:[1:0] ;default: 2'd0 ; */ +/*description: There are four low speed timers the two bits are used to select + one of them for low speed channel6. 2'b00: seletc lstimer0. 2'b01: select lstimer1. 2'b10: select lstimer2. 2'b11: select lstimer3.*/ +#define LEDC_TIMER_SEL_LSCH6 0x00000003 +#define LEDC_TIMER_SEL_LSCH6_M ((LEDC_TIMER_SEL_LSCH6_V)<<(LEDC_TIMER_SEL_LSCH6_S)) +#define LEDC_TIMER_SEL_LSCH6_V 0x3 +#define LEDC_TIMER_SEL_LSCH6_S 0 + +#define LEDC_LSCH6_HPOINT_REG (DR_REG_LEDC_BASE + 0x011C) +/* LEDC_HPOINT_LSCH6 : R/W ;bitpos:[19:0] ;default: 20'h0 ; */ +/*description: The output value changes to high when lstimerx(x=[0 3]) selected + by low speed channel6 has reached reg_hpoint_lsch6[19:0]*/ +#define LEDC_HPOINT_LSCH6 0x000FFFFF +#define LEDC_HPOINT_LSCH6_M ((LEDC_HPOINT_LSCH6_V)<<(LEDC_HPOINT_LSCH6_S)) +#define LEDC_HPOINT_LSCH6_V 0xFFFFF +#define LEDC_HPOINT_LSCH6_S 0 + +#define LEDC_LSCH6_DUTY_REG (DR_REG_LEDC_BASE + 0x0120) +/* LEDC_DUTY_LSCH6 : R/W ;bitpos:[24:0] ;default: 25'h0 ; */ +/*description: The register is used to control output duty. When lstimerx(x=[0 + 3]) choosed by low speed channel6 has reached reg_lpoint_lsch6 the output signal changes to low. reg_lpoint_lsch6=(reg_hpoint_lsch6[19:0]+reg_duty_lsch6[24:4]) (1) reg_lpoint_lsch6=(reg_hpoint_lsch6[19:0]+reg_duty_lsch6[24:4] +1) (2) The least four bits in this register represent the decimal part and determines when to choose (1) or (2)*/ +#define LEDC_DUTY_LSCH6 0x01FFFFFF +#define LEDC_DUTY_LSCH6_M ((LEDC_DUTY_LSCH6_V)<<(LEDC_DUTY_LSCH6_S)) +#define LEDC_DUTY_LSCH6_V 0x1FFFFFF +#define LEDC_DUTY_LSCH6_S 0 + +#define LEDC_LSCH6_CONF1_REG (DR_REG_LEDC_BASE + 0x0124) +/* LEDC_DUTY_START_LSCH6 : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: When reg_duty_num_hsch6 reg_duty_cycle_hsch6 and reg_duty_scale_hsch6 + has been configured. these register won't take effect until set reg_duty_start_hsch6. this bit is automatically cleared by hardware.*/ +#define LEDC_DUTY_START_LSCH6 (BIT(31)) +#define LEDC_DUTY_START_LSCH6_M (BIT(31)) +#define LEDC_DUTY_START_LSCH6_V 0x1 +#define LEDC_DUTY_START_LSCH6_S 31 +/* LEDC_DUTY_INC_LSCH6 : R/W ;bitpos:[30] ;default: 1'b1 ; */ +/*description: This register is used to increase the duty of output signal or + decrease the duty of output signal for low speed channel6.*/ +#define LEDC_DUTY_INC_LSCH6 (BIT(30)) +#define LEDC_DUTY_INC_LSCH6_M (BIT(30)) +#define LEDC_DUTY_INC_LSCH6_V 0x1 +#define LEDC_DUTY_INC_LSCH6_S 30 +/* LEDC_DUTY_NUM_LSCH6 : R/W ;bitpos:[29:20] ;default: 10'h0 ; */ +/*description: This register is used to control the num of increased or decreased + times for low speed channel6.*/ +#define LEDC_DUTY_NUM_LSCH6 0x000003FF +#define LEDC_DUTY_NUM_LSCH6_M ((LEDC_DUTY_NUM_LSCH6_V)<<(LEDC_DUTY_NUM_LSCH6_S)) +#define LEDC_DUTY_NUM_LSCH6_V 0x3FF +#define LEDC_DUTY_NUM_LSCH6_S 20 +/* LEDC_DUTY_CYCLE_LSCH6 : R/W ;bitpos:[19:10] ;default: 10'h0 ; */ +/*description: This register is used to increase or decrease the duty every + reg_duty_cycle_lsch6 cycles for low speed channel6.*/ +#define LEDC_DUTY_CYCLE_LSCH6 0x000003FF +#define LEDC_DUTY_CYCLE_LSCH6_M ((LEDC_DUTY_CYCLE_LSCH6_V)<<(LEDC_DUTY_CYCLE_LSCH6_S)) +#define LEDC_DUTY_CYCLE_LSCH6_V 0x3FF +#define LEDC_DUTY_CYCLE_LSCH6_S 10 +/* LEDC_DUTY_SCALE_LSCH6 : R/W ;bitpos:[9:0] ;default: 10'h0 ; */ +/*description: This register controls the increase or decrease step scale for + low speed channel6.*/ +#define LEDC_DUTY_SCALE_LSCH6 0x000003FF +#define LEDC_DUTY_SCALE_LSCH6_M ((LEDC_DUTY_SCALE_LSCH6_V)<<(LEDC_DUTY_SCALE_LSCH6_S)) +#define LEDC_DUTY_SCALE_LSCH6_V 0x3FF +#define LEDC_DUTY_SCALE_LSCH6_S 0 + +#define LEDC_LSCH6_DUTY_R_REG (DR_REG_LEDC_BASE + 0x0128) +/* LEDC_DUTY_LSCH6 : RO ;bitpos:[24:0] ;default: 25'h0 ; */ +/*description: This register represents the current duty of the output signal + for low speed channel6.*/ +#define LEDC_DUTY_LSCH6 0x01FFFFFF +#define LEDC_DUTY_LSCH6_M ((LEDC_DUTY_LSCH6_V)<<(LEDC_DUTY_LSCH6_S)) +#define LEDC_DUTY_LSCH6_V 0x1FFFFFF +#define LEDC_DUTY_LSCH6_S 0 + +#define LEDC_LSCH7_CONF0_REG (DR_REG_LEDC_BASE + 0x012C) +/* LEDC_PARA_UP_LSCH7 : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: This bit is used to update register LEDC_LSCH7_HPOINT and LEDC_LSCH7_DUTY + for low speed channel7.*/ +#define LEDC_PARA_UP_LSCH7 (BIT(4)) +#define LEDC_PARA_UP_LSCH7_M (BIT(4)) +#define LEDC_PARA_UP_LSCH7_V 0x1 +#define LEDC_PARA_UP_LSCH7_S 4 +/* LEDC_IDLE_LV_LSCH7 : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: This bit is used to control the output value when low speed channel7 is off.*/ +#define LEDC_IDLE_LV_LSCH7 (BIT(3)) +#define LEDC_IDLE_LV_LSCH7_M (BIT(3)) +#define LEDC_IDLE_LV_LSCH7_V 0x1 +#define LEDC_IDLE_LV_LSCH7_S 3 +/* LEDC_SIG_OUT_EN_LSCH7 : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: This is the output enable control bit for low speed channel7.*/ +#define LEDC_SIG_OUT_EN_LSCH7 (BIT(2)) +#define LEDC_SIG_OUT_EN_LSCH7_M (BIT(2)) +#define LEDC_SIG_OUT_EN_LSCH7_V 0x1 +#define LEDC_SIG_OUT_EN_LSCH7_S 2 +/* LEDC_TIMER_SEL_LSCH7 : R/W ;bitpos:[1:0] ;default: 2'd0 ; */ +/*description: There are four low speed timers the two bits are used to select + one of them for low speed channel7. 2'b00: seletc lstimer0. 2'b01: select lstimer1. 2'b10: select lstimer2. 2'b11: select lstimer3.*/ +#define LEDC_TIMER_SEL_LSCH7 0x00000003 +#define LEDC_TIMER_SEL_LSCH7_M ((LEDC_TIMER_SEL_LSCH7_V)<<(LEDC_TIMER_SEL_LSCH7_S)) +#define LEDC_TIMER_SEL_LSCH7_V 0x3 +#define LEDC_TIMER_SEL_LSCH7_S 0 + +#define LEDC_LSCH7_HPOINT_REG (DR_REG_LEDC_BASE + 0x0130) +/* LEDC_HPOINT_LSCH7 : R/W ;bitpos:[19:0] ;default: 20'h0 ; */ +/*description: The output value changes to high when lstimerx(x=[0 3]) selected + by low speed channel7 has reached reg_hpoint_lsch7[19:0]*/ +#define LEDC_HPOINT_LSCH7 0x000FFFFF +#define LEDC_HPOINT_LSCH7_M ((LEDC_HPOINT_LSCH7_V)<<(LEDC_HPOINT_LSCH7_S)) +#define LEDC_HPOINT_LSCH7_V 0xFFFFF +#define LEDC_HPOINT_LSCH7_S 0 + +#define LEDC_LSCH7_DUTY_REG (DR_REG_LEDC_BASE + 0x0134) +/* LEDC_DUTY_LSCH7 : R/W ;bitpos:[24:0] ;default: 25'h0 ; */ +/*description: The register is used to control output duty. When lstimerx(x=[0 + 3]) choosed by low speed channel7 has reached reg_lpoint_lsch7 the output signal changes to low. reg_lpoint_lsch7=(reg_hpoint_lsch7[19:0]+reg_duty_lsch7[24:4]) (1) reg_lpoint_lsch7=(reg_hpoint_lsch7[19:0]+reg_duty_lsch7[24:4] +1) (2) The least four bits in this register represent the decimal part and determines when to choose (1) or (2)*/ +#define LEDC_DUTY_LSCH7 0x01FFFFFF +#define LEDC_DUTY_LSCH7_M ((LEDC_DUTY_LSCH7_V)<<(LEDC_DUTY_LSCH7_S)) +#define LEDC_DUTY_LSCH7_V 0x1FFFFFF +#define LEDC_DUTY_LSCH7_S 0 + +#define LEDC_LSCH7_CONF1_REG (DR_REG_LEDC_BASE + 0x0138) +/* LEDC_DUTY_START_LSCH7 : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: When reg_duty_num_hsch4 reg_duty_cycle_hsch4 and reg_duty_scale_hsch4 + has been configured. these register won't take effect until set reg_duty_start_hsch4. this bit is automatically cleared by hardware.*/ +#define LEDC_DUTY_START_LSCH7 (BIT(31)) +#define LEDC_DUTY_START_LSCH7_M (BIT(31)) +#define LEDC_DUTY_START_LSCH7_V 0x1 +#define LEDC_DUTY_START_LSCH7_S 31 +/* LEDC_DUTY_INC_LSCH7 : R/W ;bitpos:[30] ;default: 1'b1 ; */ +/*description: This register is used to increase the duty of output signal or + decrease the duty of output signal for low speed channel4.*/ +#define LEDC_DUTY_INC_LSCH7 (BIT(30)) +#define LEDC_DUTY_INC_LSCH7_M (BIT(30)) +#define LEDC_DUTY_INC_LSCH7_V 0x1 +#define LEDC_DUTY_INC_LSCH7_S 30 +/* LEDC_DUTY_NUM_LSCH7 : R/W ;bitpos:[29:20] ;default: 10'h0 ; */ +/*description: This register is used to control the num of increased or decreased + times for low speed channel4.*/ +#define LEDC_DUTY_NUM_LSCH7 0x000003FF +#define LEDC_DUTY_NUM_LSCH7_M ((LEDC_DUTY_NUM_LSCH7_V)<<(LEDC_DUTY_NUM_LSCH7_S)) +#define LEDC_DUTY_NUM_LSCH7_V 0x3FF +#define LEDC_DUTY_NUM_LSCH7_S 20 +/* LEDC_DUTY_CYCLE_LSCH7 : R/W ;bitpos:[19:10] ;default: 10'h0 ; */ +/*description: This register is used to increase or decrease the duty every + reg_duty_cycle_lsch7 cycles for low speed channel7.*/ +#define LEDC_DUTY_CYCLE_LSCH7 0x000003FF +#define LEDC_DUTY_CYCLE_LSCH7_M ((LEDC_DUTY_CYCLE_LSCH7_V)<<(LEDC_DUTY_CYCLE_LSCH7_S)) +#define LEDC_DUTY_CYCLE_LSCH7_V 0x3FF +#define LEDC_DUTY_CYCLE_LSCH7_S 10 +/* LEDC_DUTY_SCALE_LSCH7 : R/W ;bitpos:[9:0] ;default: 10'h0 ; */ +/*description: This register controls the increase or decrease step scale for + low speed channel7.*/ +#define LEDC_DUTY_SCALE_LSCH7 0x000003FF +#define LEDC_DUTY_SCALE_LSCH7_M ((LEDC_DUTY_SCALE_LSCH7_V)<<(LEDC_DUTY_SCALE_LSCH7_S)) +#define LEDC_DUTY_SCALE_LSCH7_V 0x3FF +#define LEDC_DUTY_SCALE_LSCH7_S 0 + +#define LEDC_LSCH7_DUTY_R_REG (DR_REG_LEDC_BASE + 0x013C) +/* LEDC_DUTY_LSCH7 : RO ;bitpos:[24:0] ;default: 25'h0 ; */ +/*description: This register represents the current duty of the output signal + for low speed channel7.*/ +#define LEDC_DUTY_LSCH7 0x01FFFFFF +#define LEDC_DUTY_LSCH7_M ((LEDC_DUTY_LSCH7_V)<<(LEDC_DUTY_LSCH7_S)) +#define LEDC_DUTY_LSCH7_V 0x1FFFFFF +#define LEDC_DUTY_LSCH7_S 0 + +#define LEDC_HSTIMER0_CONF_REG (DR_REG_LEDC_BASE + 0x0140) +/* LEDC_TICK_SEL_HSTIMER0 : R/W ;bitpos:[25] ;default: 1'b0 ; */ +/*description: This bit is used to choose apb_clk or ref_tick for high speed + timer0. 1'b1:apb_clk 0:ref_tick*/ +#define LEDC_TICK_SEL_HSTIMER0 (BIT(25)) +#define LEDC_TICK_SEL_HSTIMER0_M (BIT(25)) +#define LEDC_TICK_SEL_HSTIMER0_V 0x1 +#define LEDC_TICK_SEL_HSTIMER0_S 25 +/* LEDC_HSTIMER0_RST : R/W ;bitpos:[24] ;default: 1'b1 ; */ +/*description: This bit is used to reset high speed timer0 the counter will be 0 after reset.*/ +#define LEDC_HSTIMER0_RST (BIT(24)) +#define LEDC_HSTIMER0_RST_M (BIT(24)) +#define LEDC_HSTIMER0_RST_V 0x1 +#define LEDC_HSTIMER0_RST_S 24 +/* LEDC_HSTIMER0_PAUSE : R/W ;bitpos:[23] ;default: 1'b0 ; */ +/*description: This bit is used to pause the counter in high speed timer0*/ +#define LEDC_HSTIMER0_PAUSE (BIT(23)) +#define LEDC_HSTIMER0_PAUSE_M (BIT(23)) +#define LEDC_HSTIMER0_PAUSE_V 0x1 +#define LEDC_HSTIMER0_PAUSE_S 23 +/* LEDC_DIV_NUM_HSTIMER0 : R/W ;bitpos:[22:5] ;default: 18'h0 ; */ +/*description: This register is used to configure parameter for divider in high + speed timer0 the least significant eight bits represent the decimal part.*/ +#define LEDC_DIV_NUM_HSTIMER0 0x0003FFFF +#define LEDC_DIV_NUM_HSTIMER0_M ((LEDC_DIV_NUM_HSTIMER0_V)<<(LEDC_DIV_NUM_HSTIMER0_S)) +#define LEDC_DIV_NUM_HSTIMER0_V 0x3FFFF +#define LEDC_DIV_NUM_HSTIMER0_S 5 +/* LEDC_HSTIMER0_LIM : R/W ;bitpos:[4:0] ;default: 5'h0 ; */ +/*description: This register controls the range of the counter in high speed + timer0. the counter range is [0 2**reg_hstimer0_lim] the max bit width for counter is 20.*/ +#define LEDC_HSTIMER0_DUTY_RES 0x0000001F +#define LEDC_HSTIMER0_DUTY_RES_M ((LEDC_HSTIMER0_DUTY_RES_V)<<(LEDC_HSTIMER0_DUTY_RES_S)) +#define LEDC_HSTIMER0_DUTY_RES_V 0x1F +#define LEDC_HSTIMER0_DUTY_RES_S 0 +// Keep the definitions below to be compatible with previous version +#define LEDC_HSTIMER0_LIM LEDC_HSTIMER0_DUTY_RES +#define LEDC_HSTIMER0_LIM_M LEDC_HSTIMER0_DUTY_RES_M +#define LEDC_HSTIMER0_LIM_V LEDC_HSTIMER0_DUTY_RES_V +#define LEDC_HSTIMER0_LIM_S LEDC_HSTIMER0_DUTY_RES_S + +#define LEDC_HSTIMER0_VALUE_REG (DR_REG_LEDC_BASE + 0x0144) +/* LEDC_HSTIMER0_CNT : RO ;bitpos:[19:0] ;default: 20'b0 ; */ +/*description: software can read this register to get the current counter value + in high speed timer0*/ +#define LEDC_HSTIMER0_CNT 0x000FFFFF +#define LEDC_HSTIMER0_CNT_M ((LEDC_HSTIMER0_CNT_V)<<(LEDC_HSTIMER0_CNT_S)) +#define LEDC_HSTIMER0_CNT_V 0xFFFFF +#define LEDC_HSTIMER0_CNT_S 0 + +#define LEDC_HSTIMER1_CONF_REG (DR_REG_LEDC_BASE + 0x0148) +/* LEDC_TICK_SEL_HSTIMER1 : R/W ;bitpos:[25] ;default: 1'b0 ; */ +/*description: This bit is used to choose apb_clk or ref_tick for high speed + timer1. 1'b1:apb_clk 0:ref_tick*/ +#define LEDC_TICK_SEL_HSTIMER1 (BIT(25)) +#define LEDC_TICK_SEL_HSTIMER1_M (BIT(25)) +#define LEDC_TICK_SEL_HSTIMER1_V 0x1 +#define LEDC_TICK_SEL_HSTIMER1_S 25 +/* LEDC_HSTIMER1_RST : R/W ;bitpos:[24] ;default: 1'b1 ; */ +/*description: This bit is used to reset high speed timer1 the counter will be 0 after reset.*/ +#define LEDC_HSTIMER1_RST (BIT(24)) +#define LEDC_HSTIMER1_RST_M (BIT(24)) +#define LEDC_HSTIMER1_RST_V 0x1 +#define LEDC_HSTIMER1_RST_S 24 +/* LEDC_HSTIMER1_PAUSE : R/W ;bitpos:[23] ;default: 1'b0 ; */ +/*description: This bit is used to pause the counter in high speed timer1*/ +#define LEDC_HSTIMER1_PAUSE (BIT(23)) +#define LEDC_HSTIMER1_PAUSE_M (BIT(23)) +#define LEDC_HSTIMER1_PAUSE_V 0x1 +#define LEDC_HSTIMER1_PAUSE_S 23 +/* LEDC_DIV_NUM_HSTIMER1 : R/W ;bitpos:[22:5] ;default: 18'h0 ; */ +/*description: This register is used to configure parameter for divider in high + speed timer1 the least significant eight bits represent the decimal part.*/ +#define LEDC_DIV_NUM_HSTIMER1 0x0003FFFF +#define LEDC_DIV_NUM_HSTIMER1_M ((LEDC_DIV_NUM_HSTIMER1_V)<<(LEDC_DIV_NUM_HSTIMER1_S)) +#define LEDC_DIV_NUM_HSTIMER1_V 0x3FFFF +#define LEDC_DIV_NUM_HSTIMER1_S 5 +/* LEDC_HSTIMER1_LIM : R/W ;bitpos:[4:0] ;default: 5'h0 ; */ +/*description: This register controls the range of the counter in high speed + timer1. the counter range is [0 2**reg_hstimer1_lim] the max bit width for counter is 20.*/ +#define LEDC_HSTIMER1_DUTY_RES 0x0000001F +#define LEDC_HSTIMER1_DUTY_RES_M ((LEDC_HSTIMER1_DUTY_RES_V)<<(LEDC_HSTIMER1_DUTY_RES_S)) +#define LEDC_HSTIMER1_DUTY_RES_V 0x1F +#define LEDC_HSTIMER1_DUTY_RES_S 0 +// Keep the definitions below to be compatible with previous version +#define LEDC_HSTIMER1_LIM LEDC_HSTIMER1_DUTY_RES +#define LEDC_HSTIMER1_LIM_M LEDC_HSTIMER1_DUTY_RES_M +#define LEDC_HSTIMER1_LIM_V LEDC_HSTIMER1_DUTY_RES_V +#define LEDC_HSTIMER1_LIM_S LEDC_HSTIMER1_DUTY_RES_S + +#define LEDC_HSTIMER1_VALUE_REG (DR_REG_LEDC_BASE + 0x014C) +/* LEDC_HSTIMER1_CNT : RO ;bitpos:[19:0] ;default: 20'b0 ; */ +/*description: software can read this register to get the current counter value + in high speed timer1.*/ +#define LEDC_HSTIMER1_CNT 0x000FFFFF +#define LEDC_HSTIMER1_CNT_M ((LEDC_HSTIMER1_CNT_V)<<(LEDC_HSTIMER1_CNT_S)) +#define LEDC_HSTIMER1_CNT_V 0xFFFFF +#define LEDC_HSTIMER1_CNT_S 0 + +#define LEDC_HSTIMER2_CONF_REG (DR_REG_LEDC_BASE + 0x0150) +/* LEDC_TICK_SEL_HSTIMER2 : R/W ;bitpos:[25] ;default: 1'b0 ; */ +/*description: This bit is used to choose apb_clk or ref_tick for high speed + timer2. 1'b1:apb_clk 0:ref_tick*/ +#define LEDC_TICK_SEL_HSTIMER2 (BIT(25)) +#define LEDC_TICK_SEL_HSTIMER2_M (BIT(25)) +#define LEDC_TICK_SEL_HSTIMER2_V 0x1 +#define LEDC_TICK_SEL_HSTIMER2_S 25 +/* LEDC_HSTIMER2_RST : R/W ;bitpos:[24] ;default: 1'b1 ; */ +/*description: This bit is used to reset high speed timer2 the counter will be 0 after reset.*/ +#define LEDC_HSTIMER2_RST (BIT(24)) +#define LEDC_HSTIMER2_RST_M (BIT(24)) +#define LEDC_HSTIMER2_RST_V 0x1 +#define LEDC_HSTIMER2_RST_S 24 +/* LEDC_HSTIMER2_PAUSE : R/W ;bitpos:[23] ;default: 1'b0 ; */ +/*description: This bit is used to pause the counter in high speed timer2*/ +#define LEDC_HSTIMER2_PAUSE (BIT(23)) +#define LEDC_HSTIMER2_PAUSE_M (BIT(23)) +#define LEDC_HSTIMER2_PAUSE_V 0x1 +#define LEDC_HSTIMER2_PAUSE_S 23 +/* LEDC_DIV_NUM_HSTIMER2 : R/W ;bitpos:[22:5] ;default: 18'h0 ; */ +/*description: This register is used to configure parameter for divider in high + speed timer2 the least significant eight bits represent the decimal part.*/ +#define LEDC_DIV_NUM_HSTIMER2 0x0003FFFF +#define LEDC_DIV_NUM_HSTIMER2_M ((LEDC_DIV_NUM_HSTIMER2_V)<<(LEDC_DIV_NUM_HSTIMER2_S)) +#define LEDC_DIV_NUM_HSTIMER2_V 0x3FFFF +#define LEDC_DIV_NUM_HSTIMER2_S 5 +/* LEDC_HSTIMER2_LIM : R/W ;bitpos:[4:0] ;default: 5'h0 ; */ +/*description: This register controls the range of the counter in high speed + timer2. the counter range is [0 2**reg_hstimer2_lim] the max bit width for counter is 20.*/ +#define LEDC_HSTIMER2_DUTY_RES 0x0000001F +#define LEDC_HSTIMER2_DUTY_RES_M ((LEDC_HSTIMER2_DUTY_RES_V)<<(LEDC_HSTIMER2_DUTY_RES_S)) +#define LEDC_HSTIMER2_DUTY_RES_V 0x1F +#define LEDC_HSTIMER2_DUTY_RES_S 0 +// Keep the definitions below to be compatible with previous version +#define LEDC_HSTIMER2_LIM LEDC_HSTIMER2_DUTY_RES +#define LEDC_HSTIMER2_LIM_M LEDC_HSTIMER2_DUTY_RES_M +#define LEDC_HSTIMER2_LIM_V LEDC_HSTIMER2_DUTY_RES_V +#define LEDC_HSTIMER2_LIM_S LEDC_HSTIMER2_DUTY_RES_S + +#define LEDC_HSTIMER2_VALUE_REG (DR_REG_LEDC_BASE + 0x0154) +/* LEDC_HSTIMER2_CNT : RO ;bitpos:[19:0] ;default: 20'b0 ; */ +/*description: software can read this register to get the current counter value + in high speed timer2*/ +#define LEDC_HSTIMER2_CNT 0x000FFFFF +#define LEDC_HSTIMER2_CNT_M ((LEDC_HSTIMER2_CNT_V)<<(LEDC_HSTIMER2_CNT_S)) +#define LEDC_HSTIMER2_CNT_V 0xFFFFF +#define LEDC_HSTIMER2_CNT_S 0 + +#define LEDC_HSTIMER3_CONF_REG (DR_REG_LEDC_BASE + 0x0158) +/* LEDC_TICK_SEL_HSTIMER3 : R/W ;bitpos:[25] ;default: 1'b0 ; */ +/*description: This bit is used to choose apb_clk or ref_tick for high speed + timer3. 1'b1:apb_clk 0:ref_tick*/ +#define LEDC_TICK_SEL_HSTIMER3 (BIT(25)) +#define LEDC_TICK_SEL_HSTIMER3_M (BIT(25)) +#define LEDC_TICK_SEL_HSTIMER3_V 0x1 +#define LEDC_TICK_SEL_HSTIMER3_S 25 +/* LEDC_HSTIMER3_RST : R/W ;bitpos:[24] ;default: 1'b1 ; */ +/*description: This bit is used to reset high speed timer3 the counter will be 0 after reset.*/ +#define LEDC_HSTIMER3_RST (BIT(24)) +#define LEDC_HSTIMER3_RST_M (BIT(24)) +#define LEDC_HSTIMER3_RST_V 0x1 +#define LEDC_HSTIMER3_RST_S 24 +/* LEDC_HSTIMER3_PAUSE : R/W ;bitpos:[23] ;default: 1'b0 ; */ +/*description: This bit is used to pause the counter in high speed timer3*/ +#define LEDC_HSTIMER3_PAUSE (BIT(23)) +#define LEDC_HSTIMER3_PAUSE_M (BIT(23)) +#define LEDC_HSTIMER3_PAUSE_V 0x1 +#define LEDC_HSTIMER3_PAUSE_S 23 +/* LEDC_DIV_NUM_HSTIMER3 : R/W ;bitpos:[22:5] ;default: 18'h0 ; */ +/*description: This register is used to configure parameter for divider in high + speed timer3 the least significant eight bits represent the decimal part.*/ +#define LEDC_DIV_NUM_HSTIMER3 0x0003FFFF +#define LEDC_DIV_NUM_HSTIMER3_M ((LEDC_DIV_NUM_HSTIMER3_V)<<(LEDC_DIV_NUM_HSTIMER3_S)) +#define LEDC_DIV_NUM_HSTIMER3_V 0x3FFFF +#define LEDC_DIV_NUM_HSTIMER3_S 5 +/* LEDC_HSTIMER3_LIM : R/W ;bitpos:[4:0] ;default: 5'h0 ; */ +/*description: This register controls the range of the counter in high speed + timer3. the counter range is [0 2**reg_hstimer3_lim] the max bit width for counter is 20.*/ +#define LEDC_HSTIMER3_DUTY_RES 0x0000001F +#define LEDC_HSTIMER3_DUTY_RES_M ((LEDC_HSTIMER3_DUTY_RES_V)<<(LEDC_HSTIMER3_DUTY_RES_S)) +#define LEDC_HSTIMER3_DUTY_RES_V 0x1F +#define LEDC_HSTIMER3_DUTY_RES_S 0 +// Keep the definitions below to be compatible with previous version +#define LEDC_HSTIMER3_LIM LEDC_HSTIMER3_DUTY_RES +#define LEDC_HSTIMER3_LIM_M LEDC_HSTIMER3_DUTY_RES_M +#define LEDC_HSTIMER3_LIM_V LEDC_HSTIMER3_DUTY_RES_V +#define LEDC_HSTIMER3_LIM_S LEDC_HSTIMER3_DUTY_RES_S + +#define LEDC_HSTIMER3_VALUE_REG (DR_REG_LEDC_BASE + 0x015C) +/* LEDC_HSTIMER3_CNT : RO ;bitpos:[19:0] ;default: 20'b0 ; */ +/*description: software can read this register to get the current counter value + in high speed timer3*/ +#define LEDC_HSTIMER3_CNT 0x000FFFFF +#define LEDC_HSTIMER3_CNT_M ((LEDC_HSTIMER3_CNT_V)<<(LEDC_HSTIMER3_CNT_S)) +#define LEDC_HSTIMER3_CNT_V 0xFFFFF +#define LEDC_HSTIMER3_CNT_S 0 + +#define LEDC_LSTIMER0_CONF_REG (DR_REG_LEDC_BASE + 0x0160) +/* LEDC_LSTIMER0_PARA_UP : R/W ;bitpos:[26] ;default: 1'h0 ; */ +/*description: Set this bit to update reg_div_num_lstime0 and reg_lstimer0_lim.*/ +#define LEDC_LSTIMER0_PARA_UP (BIT(26)) +#define LEDC_LSTIMER0_PARA_UP_M (BIT(26)) +#define LEDC_LSTIMER0_PARA_UP_V 0x1 +#define LEDC_LSTIMER0_PARA_UP_S 26 +/* LEDC_TICK_SEL_LSTIMER0 : R/W ;bitpos:[25] ;default: 1'b0 ; */ +/*description: This bit is used to choose slow_clk or ref_tick for low speed + timer0. 1'b1:slow_clk 0:ref_tick*/ +#define LEDC_TICK_SEL_LSTIMER0 (BIT(25)) +#define LEDC_TICK_SEL_LSTIMER0_M (BIT(25)) +#define LEDC_TICK_SEL_LSTIMER0_V 0x1 +#define LEDC_TICK_SEL_LSTIMER0_S 25 +/* LEDC_LSTIMER0_RST : R/W ;bitpos:[24] ;default: 1'b1 ; */ +/*description: This bit is used to reset low speed timer0 the counter will be 0 after reset.*/ +#define LEDC_LSTIMER0_RST (BIT(24)) +#define LEDC_LSTIMER0_RST_M (BIT(24)) +#define LEDC_LSTIMER0_RST_V 0x1 +#define LEDC_LSTIMER0_RST_S 24 +/* LEDC_LSTIMER0_PAUSE : R/W ;bitpos:[23] ;default: 1'b0 ; */ +/*description: This bit is used to pause the counter in low speed timer0.*/ +#define LEDC_LSTIMER0_PAUSE (BIT(23)) +#define LEDC_LSTIMER0_PAUSE_M (BIT(23)) +#define LEDC_LSTIMER0_PAUSE_V 0x1 +#define LEDC_LSTIMER0_PAUSE_S 23 +/* LEDC_DIV_NUM_LSTIMER0 : R/W ;bitpos:[22:5] ;default: 18'h0 ; */ +/*description: This register is used to configure parameter for divider in low + speed timer0 the least significant eight bits represent the decimal part.*/ +#define LEDC_DIV_NUM_LSTIMER0 0x0003FFFF +#define LEDC_DIV_NUM_LSTIMER0_M ((LEDC_DIV_NUM_LSTIMER0_V)<<(LEDC_DIV_NUM_LSTIMER0_S)) +#define LEDC_DIV_NUM_LSTIMER0_V 0x3FFFF +#define LEDC_DIV_NUM_LSTIMER0_S 5 +/* LEDC_LSTIMER0_LIM : R/W ;bitpos:[4:0] ;default: 5'h0 ; */ +/*description: This register controls the range of the counter in low speed + timer0. the counter range is [0 2**reg_lstimer0_lim] the max bit width for counter is 20.*/ +#define LEDC_LSTIMER0_DUTY_RES 0x0000001F +#define LEDC_LSTIMER0_DUTY_RES_M ((LEDC_LSTIMER0_DUTY_RES_V)<<(LEDC_LSTIMER0_DUTY_RES_S)) +#define LEDC_LSTIMER0_DUTY_RES_V 0x1F +#define LEDC_LSTIMER0_DUTY_RES_S 0 +// Keep the definitions below to be compatible with previous version +#define LEDC_LSTIMER0_LIM LEDC_LSTIMER0_DUTY_RES +#define LEDC_LSTIMER0_LIM_M LEDC_LSTIMER0_DUTY_RES_M +#define LEDC_LSTIMER0_LIM_V LEDC_LSTIMER0_DUTY_RES_V +#define LEDC_LSTIMER0_LIM_S LEDC_LSTIMER0_DUTY_RES_S + +#define LEDC_LSTIMER0_VALUE_REG (DR_REG_LEDC_BASE + 0x0164) +/* LEDC_LSTIMER0_CNT : RO ;bitpos:[19:0] ;default: 20'b0 ; */ +/*description: software can read this register to get the current counter value + in low speed timer0.*/ +#define LEDC_LSTIMER0_CNT 0x000FFFFF +#define LEDC_LSTIMER0_CNT_M ((LEDC_LSTIMER0_CNT_V)<<(LEDC_LSTIMER0_CNT_S)) +#define LEDC_LSTIMER0_CNT_V 0xFFFFF +#define LEDC_LSTIMER0_CNT_S 0 + +#define LEDC_LSTIMER1_CONF_REG (DR_REG_LEDC_BASE + 0x0168) +/* LEDC_LSTIMER1_PARA_UP : R/W ;bitpos:[26] ;default: 1'h0 ; */ +/*description: Set this bit to update reg_div_num_lstime1 and reg_lstimer1_lim.*/ +#define LEDC_LSTIMER1_PARA_UP (BIT(26)) +#define LEDC_LSTIMER1_PARA_UP_M (BIT(26)) +#define LEDC_LSTIMER1_PARA_UP_V 0x1 +#define LEDC_LSTIMER1_PARA_UP_S 26 +/* LEDC_TICK_SEL_LSTIMER1 : R/W ;bitpos:[25] ;default: 1'b0 ; */ +/*description: This bit is used to choose slow_clk or ref_tick for low speed + timer1. 1'b1:slow_clk 0:ref_tick*/ +#define LEDC_TICK_SEL_LSTIMER1 (BIT(25)) +#define LEDC_TICK_SEL_LSTIMER1_M (BIT(25)) +#define LEDC_TICK_SEL_LSTIMER1_V 0x1 +#define LEDC_TICK_SEL_LSTIMER1_S 25 +/* LEDC_LSTIMER1_RST : R/W ;bitpos:[24] ;default: 1'b1 ; */ +/*description: This bit is used to reset low speed timer1 the counter will be 0 after reset.*/ +#define LEDC_LSTIMER1_RST (BIT(24)) +#define LEDC_LSTIMER1_RST_M (BIT(24)) +#define LEDC_LSTIMER1_RST_V 0x1 +#define LEDC_LSTIMER1_RST_S 24 +/* LEDC_LSTIMER1_PAUSE : R/W ;bitpos:[23] ;default: 1'b0 ; */ +/*description: This bit is used to pause the counter in low speed timer1.*/ +#define LEDC_LSTIMER1_PAUSE (BIT(23)) +#define LEDC_LSTIMER1_PAUSE_M (BIT(23)) +#define LEDC_LSTIMER1_PAUSE_V 0x1 +#define LEDC_LSTIMER1_PAUSE_S 23 +/* LEDC_DIV_NUM_LSTIMER1 : R/W ;bitpos:[22:5] ;default: 18'h0 ; */ +/*description: This register is used to configure parameter for divider in low + speed timer1 the least significant eight bits represent the decimal part.*/ +#define LEDC_DIV_NUM_LSTIMER1 0x0003FFFF +#define LEDC_DIV_NUM_LSTIMER1_M ((LEDC_DIV_NUM_LSTIMER1_V)<<(LEDC_DIV_NUM_LSTIMER1_S)) +#define LEDC_DIV_NUM_LSTIMER1_V 0x3FFFF +#define LEDC_DIV_NUM_LSTIMER1_S 5 +/* LEDC_LSTIMER1_LIM : R/W ;bitpos:[4:0] ;default: 5'h0 ; */ +/*description: This register controls the range of the counter in low speed + timer1. the counter range is [0 2**reg_lstimer1_lim] the max bit width for counter is 20.*/ +#define LEDC_LSTIMER1_DUTY_RES 0x0000001F +#define LEDC_LSTIMER1_DUTY_RES_M ((LEDC_LSTIMER1_DUTY_RES_V)<<(LEDC_LSTIMER1_DUTY_RES_S)) +#define LEDC_LSTIMER1_DUTY_RES_V 0x1F +#define LEDC_LSTIMER1_DUTY_RES_S 0 +// Keep the definitions below to be compatible with previous version +#define LEDC_LSTIMER1_LIM LEDC_LSTIMER1_DUTY_RES +#define LEDC_LSTIMER1_LIM_M LEDC_LSTIMER1_DUTY_RES_M +#define LEDC_LSTIMER1_LIM_V LEDC_LSTIMER1_DUTY_RES_V +#define LEDC_LSTIMER1_LIM_S LEDC_LSTIMER1_DUTY_RES_S + +#define LEDC_LSTIMER1_VALUE_REG (DR_REG_LEDC_BASE + 0x016C) +/* LEDC_LSTIMER1_CNT : RO ;bitpos:[19:0] ;default: 20'b0 ; */ +/*description: software can read this register to get the current counter value + in low speed timer1.*/ +#define LEDC_LSTIMER1_CNT 0x000FFFFF +#define LEDC_LSTIMER1_CNT_M ((LEDC_LSTIMER1_CNT_V)<<(LEDC_LSTIMER1_CNT_S)) +#define LEDC_LSTIMER1_CNT_V 0xFFFFF +#define LEDC_LSTIMER1_CNT_S 0 + +#define LEDC_LSTIMER2_CONF_REG (DR_REG_LEDC_BASE + 0x0170) +/* LEDC_LSTIMER2_PARA_UP : R/W ;bitpos:[26] ;default: 1'h0 ; */ +/*description: Set this bit to update reg_div_num_lstime2 and reg_lstimer2_lim.*/ +#define LEDC_LSTIMER2_PARA_UP (BIT(26)) +#define LEDC_LSTIMER2_PARA_UP_M (BIT(26)) +#define LEDC_LSTIMER2_PARA_UP_V 0x1 +#define LEDC_LSTIMER2_PARA_UP_S 26 +/* LEDC_TICK_SEL_LSTIMER2 : R/W ;bitpos:[25] ;default: 1'b0 ; */ +/*description: This bit is used to choose slow_clk or ref_tick for low speed + timer2. 1'b1:slow_clk 0:ref_tick*/ +#define LEDC_TICK_SEL_LSTIMER2 (BIT(25)) +#define LEDC_TICK_SEL_LSTIMER2_M (BIT(25)) +#define LEDC_TICK_SEL_LSTIMER2_V 0x1 +#define LEDC_TICK_SEL_LSTIMER2_S 25 +/* LEDC_LSTIMER2_RST : R/W ;bitpos:[24] ;default: 1'b1 ; */ +/*description: This bit is used to reset low speed timer2 the counter will be 0 after reset.*/ +#define LEDC_LSTIMER2_RST (BIT(24)) +#define LEDC_LSTIMER2_RST_M (BIT(24)) +#define LEDC_LSTIMER2_RST_V 0x1 +#define LEDC_LSTIMER2_RST_S 24 +/* LEDC_LSTIMER2_PAUSE : R/W ;bitpos:[23] ;default: 1'b0 ; */ +/*description: This bit is used to pause the counter in low speed timer2.*/ +#define LEDC_LSTIMER2_PAUSE (BIT(23)) +#define LEDC_LSTIMER2_PAUSE_M (BIT(23)) +#define LEDC_LSTIMER2_PAUSE_V 0x1 +#define LEDC_LSTIMER2_PAUSE_S 23 +/* LEDC_DIV_NUM_LSTIMER2 : R/W ;bitpos:[22:5] ;default: 18'h0 ; */ +/*description: This register is used to configure parameter for divider in low + speed timer2 the least significant eight bits represent the decimal part.*/ +#define LEDC_DIV_NUM_LSTIMER2 0x0003FFFF +#define LEDC_DIV_NUM_LSTIMER2_M ((LEDC_DIV_NUM_LSTIMER2_V)<<(LEDC_DIV_NUM_LSTIMER2_S)) +#define LEDC_DIV_NUM_LSTIMER2_V 0x3FFFF +#define LEDC_DIV_NUM_LSTIMER2_S 5 +/* LEDC_LSTIMER2_LIM : R/W ;bitpos:[4:0] ;default: 5'h0 ; */ +/*description: This register controls the range of the counter in low speed + timer2. the counter range is [0 2**reg_lstimer2_lim] the max bit width for counter is 20.*/ +#define LEDC_LSTIMER2_DUTY_RES 0x0000001F +#define LEDC_LSTIMER2_DUTY_RES_M ((LEDC_LSTIMER2_DUTY_RES_V)<<(LEDC_LSTIMER2_DUTY_RES_S)) +#define LEDC_LSTIMER2_DUTY_RES_V 0x1F +#define LEDC_LSTIMER2_DUTY_RES_S 0 +// Keep the definitions below to be compatible with previous version +#define LEDC_LSTIMER2_LIM LEDC_LSTIMER2_DUTY_RES +#define LEDC_LSTIMER2_LIM_M LEDC_LSTIMER2_DUTY_RES_M +#define LEDC_LSTIMER2_LIM_V LEDC_LSTIMER2_DUTY_RES_V +#define LEDC_LSTIMER2_LIM_S LEDC_LSTIMER2_DUTY_RES_S + +#define LEDC_LSTIMER2_VALUE_REG (DR_REG_LEDC_BASE + 0x0174) +/* LEDC_LSTIMER2_CNT : RO ;bitpos:[19:0] ;default: 20'b0 ; */ +/*description: software can read this register to get the current counter value + in low speed timer2.*/ +#define LEDC_LSTIMER2_CNT 0x000FFFFF +#define LEDC_LSTIMER2_CNT_M ((LEDC_LSTIMER2_CNT_V)<<(LEDC_LSTIMER2_CNT_S)) +#define LEDC_LSTIMER2_CNT_V 0xFFFFF +#define LEDC_LSTIMER2_CNT_S 0 + +#define LEDC_LSTIMER3_CONF_REG (DR_REG_LEDC_BASE + 0x0178) +/* LEDC_LSTIMER3_PARA_UP : R/W ;bitpos:[26] ;default: 1'h0 ; */ +/*description: Set this bit to update reg_div_num_lstime3 and reg_lstimer3_lim.*/ +#define LEDC_LSTIMER3_PARA_UP (BIT(26)) +#define LEDC_LSTIMER3_PARA_UP_M (BIT(26)) +#define LEDC_LSTIMER3_PARA_UP_V 0x1 +#define LEDC_LSTIMER3_PARA_UP_S 26 +/* LEDC_TICK_SEL_LSTIMER3 : R/W ;bitpos:[25] ;default: 1'b0 ; */ +/*description: This bit is used to choose slow_clk or ref_tick for low speed + timer3. 1'b1:slow_clk 0:ref_tick*/ +#define LEDC_TICK_SEL_LSTIMER3 (BIT(25)) +#define LEDC_TICK_SEL_LSTIMER3_M (BIT(25)) +#define LEDC_TICK_SEL_LSTIMER3_V 0x1 +#define LEDC_TICK_SEL_LSTIMER3_S 25 +/* LEDC_LSTIMER3_RST : R/W ;bitpos:[24] ;default: 1'b1 ; */ +/*description: This bit is used to reset low speed timer3 the counter will be 0 after reset.*/ +#define LEDC_LSTIMER3_RST (BIT(24)) +#define LEDC_LSTIMER3_RST_M (BIT(24)) +#define LEDC_LSTIMER3_RST_V 0x1 +#define LEDC_LSTIMER3_RST_S 24 +/* LEDC_LSTIMER3_PAUSE : R/W ;bitpos:[23] ;default: 1'b0 ; */ +/*description: This bit is used to pause the counter in low speed timer3.*/ +#define LEDC_LSTIMER3_PAUSE (BIT(23)) +#define LEDC_LSTIMER3_PAUSE_M (BIT(23)) +#define LEDC_LSTIMER3_PAUSE_V 0x1 +#define LEDC_LSTIMER3_PAUSE_S 23 +/* LEDC_DIV_NUM_LSTIMER3 : R/W ;bitpos:[22:5] ;default: 18'h0 ; */ +/*description: This register is used to configure parameter for divider in low + speed timer3 the least significant eight bits represent the decimal part.*/ +#define LEDC_DIV_NUM_LSTIMER3 0x0003FFFF +#define LEDC_DIV_NUM_LSTIMER3_M ((LEDC_DIV_NUM_LSTIMER3_V)<<(LEDC_DIV_NUM_LSTIMER3_S)) +#define LEDC_DIV_NUM_LSTIMER3_V 0x3FFFF +#define LEDC_DIV_NUM_LSTIMER3_S 5 +/* LEDC_LSTIMER3_LIM : R/W ;bitpos:[4:0] ;default: 5'h0 ; */ +/*description: This register controls the range of the counter in low speed + timer3. the counter range is [0 2**reg_lstimer3_lim] the max bit width for counter is 20.*/ +#define LEDC_LSTIMER3_DUTY_RES 0x0000001F +#define LEDC_LSTIMER3_DUTY_RES_M ((LEDC_LSTIMER3_DUTY_RES_V)<<(LEDC_LSTIMER3_DUTY_RES_S)) +#define LEDC_LSTIMER3_DUTY_RES_V 0x1F +#define LEDC_LSTIMER3_DUTY_RES_S 0 +// Keep the definitions below to be compatible with previous version +#define LEDC_LSTIMER3_LIM LEDC_LSTIMER3_DUTY_RES +#define LEDC_LSTIMER3_LIM_M LEDC_LSTIMER3_DUTY_RES_M +#define LEDC_LSTIMER3_LIM_V LEDC_LSTIMER3_DUTY_RES_V +#define LEDC_LSTIMER3_LIM_S LEDC_LSTIMER3_DUTY_RES_S + +#define LEDC_LSTIMER3_VALUE_REG (DR_REG_LEDC_BASE + 0x017C) +/* LEDC_LSTIMER3_CNT : RO ;bitpos:[19:0] ;default: 20'b0 ; */ +/*description: software can read this register to get the current counter value + in low speed timer3.*/ +#define LEDC_LSTIMER3_CNT 0x000FFFFF +#define LEDC_LSTIMER3_CNT_M ((LEDC_LSTIMER3_CNT_V)<<(LEDC_LSTIMER3_CNT_S)) +#define LEDC_LSTIMER3_CNT_V 0xFFFFF +#define LEDC_LSTIMER3_CNT_S 0 + +#define LEDC_INT_RAW_REG (DR_REG_LEDC_BASE + 0x0180) +/* LEDC_DUTY_CHNG_END_LSCH7_INT_RAW : RO ;bitpos:[23] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for low speed channel 7 duty change done.*/ +#define LEDC_DUTY_CHNG_END_LSCH7_INT_RAW (BIT(23)) +#define LEDC_DUTY_CHNG_END_LSCH7_INT_RAW_M (BIT(23)) +#define LEDC_DUTY_CHNG_END_LSCH7_INT_RAW_V 0x1 +#define LEDC_DUTY_CHNG_END_LSCH7_INT_RAW_S 23 +/* LEDC_DUTY_CHNG_END_LSCH6_INT_RAW : RO ;bitpos:[22] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for low speed channel 6 duty change done.*/ +#define LEDC_DUTY_CHNG_END_LSCH6_INT_RAW (BIT(22)) +#define LEDC_DUTY_CHNG_END_LSCH6_INT_RAW_M (BIT(22)) +#define LEDC_DUTY_CHNG_END_LSCH6_INT_RAW_V 0x1 +#define LEDC_DUTY_CHNG_END_LSCH6_INT_RAW_S 22 +/* LEDC_DUTY_CHNG_END_LSCH5_INT_RAW : RO ;bitpos:[21] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for low speed channel 5 duty change done.*/ +#define LEDC_DUTY_CHNG_END_LSCH5_INT_RAW (BIT(21)) +#define LEDC_DUTY_CHNG_END_LSCH5_INT_RAW_M (BIT(21)) +#define LEDC_DUTY_CHNG_END_LSCH5_INT_RAW_V 0x1 +#define LEDC_DUTY_CHNG_END_LSCH5_INT_RAW_S 21 +/* LEDC_DUTY_CHNG_END_LSCH4_INT_RAW : RO ;bitpos:[20] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for low speed channel 4 duty change done.*/ +#define LEDC_DUTY_CHNG_END_LSCH4_INT_RAW (BIT(20)) +#define LEDC_DUTY_CHNG_END_LSCH4_INT_RAW_M (BIT(20)) +#define LEDC_DUTY_CHNG_END_LSCH4_INT_RAW_V 0x1 +#define LEDC_DUTY_CHNG_END_LSCH4_INT_RAW_S 20 +/* LEDC_DUTY_CHNG_END_LSCH3_INT_RAW : RO ;bitpos:[19] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for low speed channel 3 duty change done.*/ +#define LEDC_DUTY_CHNG_END_LSCH3_INT_RAW (BIT(19)) +#define LEDC_DUTY_CHNG_END_LSCH3_INT_RAW_M (BIT(19)) +#define LEDC_DUTY_CHNG_END_LSCH3_INT_RAW_V 0x1 +#define LEDC_DUTY_CHNG_END_LSCH3_INT_RAW_S 19 +/* LEDC_DUTY_CHNG_END_LSCH2_INT_RAW : RO ;bitpos:[18] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for low speed channel 2 duty change done.*/ +#define LEDC_DUTY_CHNG_END_LSCH2_INT_RAW (BIT(18)) +#define LEDC_DUTY_CHNG_END_LSCH2_INT_RAW_M (BIT(18)) +#define LEDC_DUTY_CHNG_END_LSCH2_INT_RAW_V 0x1 +#define LEDC_DUTY_CHNG_END_LSCH2_INT_RAW_S 18 +/* LEDC_DUTY_CHNG_END_LSCH1_INT_RAW : RO ;bitpos:[17] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for low speed channel 1 duty change done.*/ +#define LEDC_DUTY_CHNG_END_LSCH1_INT_RAW (BIT(17)) +#define LEDC_DUTY_CHNG_END_LSCH1_INT_RAW_M (BIT(17)) +#define LEDC_DUTY_CHNG_END_LSCH1_INT_RAW_V 0x1 +#define LEDC_DUTY_CHNG_END_LSCH1_INT_RAW_S 17 +/* LEDC_DUTY_CHNG_END_LSCH0_INT_RAW : RO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for low speed channel 0 duty change done.*/ +#define LEDC_DUTY_CHNG_END_LSCH0_INT_RAW (BIT(16)) +#define LEDC_DUTY_CHNG_END_LSCH0_INT_RAW_M (BIT(16)) +#define LEDC_DUTY_CHNG_END_LSCH0_INT_RAW_V 0x1 +#define LEDC_DUTY_CHNG_END_LSCH0_INT_RAW_S 16 +/* LEDC_DUTY_CHNG_END_HSCH7_INT_RAW : RO ;bitpos:[15] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for high speed channel 7 duty change done.*/ +#define LEDC_DUTY_CHNG_END_HSCH7_INT_RAW (BIT(15)) +#define LEDC_DUTY_CHNG_END_HSCH7_INT_RAW_M (BIT(15)) +#define LEDC_DUTY_CHNG_END_HSCH7_INT_RAW_V 0x1 +#define LEDC_DUTY_CHNG_END_HSCH7_INT_RAW_S 15 +/* LEDC_DUTY_CHNG_END_HSCH6_INT_RAW : RO ;bitpos:[14] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for high speed channel 6 duty change done.*/ +#define LEDC_DUTY_CHNG_END_HSCH6_INT_RAW (BIT(14)) +#define LEDC_DUTY_CHNG_END_HSCH6_INT_RAW_M (BIT(14)) +#define LEDC_DUTY_CHNG_END_HSCH6_INT_RAW_V 0x1 +#define LEDC_DUTY_CHNG_END_HSCH6_INT_RAW_S 14 +/* LEDC_DUTY_CHNG_END_HSCH5_INT_RAW : RO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for high speed channel 5 duty change done.*/ +#define LEDC_DUTY_CHNG_END_HSCH5_INT_RAW (BIT(13)) +#define LEDC_DUTY_CHNG_END_HSCH5_INT_RAW_M (BIT(13)) +#define LEDC_DUTY_CHNG_END_HSCH5_INT_RAW_V 0x1 +#define LEDC_DUTY_CHNG_END_HSCH5_INT_RAW_S 13 +/* LEDC_DUTY_CHNG_END_HSCH4_INT_RAW : RO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for high speed channel 4 duty change done.*/ +#define LEDC_DUTY_CHNG_END_HSCH4_INT_RAW (BIT(12)) +#define LEDC_DUTY_CHNG_END_HSCH4_INT_RAW_M (BIT(12)) +#define LEDC_DUTY_CHNG_END_HSCH4_INT_RAW_V 0x1 +#define LEDC_DUTY_CHNG_END_HSCH4_INT_RAW_S 12 +/* LEDC_DUTY_CHNG_END_HSCH3_INT_RAW : RO ;bitpos:[11] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for high speed channel 3 duty change done.*/ +#define LEDC_DUTY_CHNG_END_HSCH3_INT_RAW (BIT(11)) +#define LEDC_DUTY_CHNG_END_HSCH3_INT_RAW_M (BIT(11)) +#define LEDC_DUTY_CHNG_END_HSCH3_INT_RAW_V 0x1 +#define LEDC_DUTY_CHNG_END_HSCH3_INT_RAW_S 11 +/* LEDC_DUTY_CHNG_END_HSCH2_INT_RAW : RO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for high speed channel 2 duty change done.*/ +#define LEDC_DUTY_CHNG_END_HSCH2_INT_RAW (BIT(10)) +#define LEDC_DUTY_CHNG_END_HSCH2_INT_RAW_M (BIT(10)) +#define LEDC_DUTY_CHNG_END_HSCH2_INT_RAW_V 0x1 +#define LEDC_DUTY_CHNG_END_HSCH2_INT_RAW_S 10 +/* LEDC_DUTY_CHNG_END_HSCH1_INT_RAW : RO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for high speed channel 1 duty change done.*/ +#define LEDC_DUTY_CHNG_END_HSCH1_INT_RAW (BIT(9)) +#define LEDC_DUTY_CHNG_END_HSCH1_INT_RAW_M (BIT(9)) +#define LEDC_DUTY_CHNG_END_HSCH1_INT_RAW_V 0x1 +#define LEDC_DUTY_CHNG_END_HSCH1_INT_RAW_S 9 +/* LEDC_DUTY_CHNG_END_HSCH0_INT_RAW : RO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for high speed channel 0 duty change done.*/ +#define LEDC_DUTY_CHNG_END_HSCH0_INT_RAW (BIT(8)) +#define LEDC_DUTY_CHNG_END_HSCH0_INT_RAW_M (BIT(8)) +#define LEDC_DUTY_CHNG_END_HSCH0_INT_RAW_V 0x1 +#define LEDC_DUTY_CHNG_END_HSCH0_INT_RAW_S 8 +/* LEDC_LSTIMER3_OVF_INT_RAW : RO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for low speed channel3 counter overflow.*/ +#define LEDC_LSTIMER3_OVF_INT_RAW (BIT(7)) +#define LEDC_LSTIMER3_OVF_INT_RAW_M (BIT(7)) +#define LEDC_LSTIMER3_OVF_INT_RAW_V 0x1 +#define LEDC_LSTIMER3_OVF_INT_RAW_S 7 +/* LEDC_LSTIMER2_OVF_INT_RAW : RO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for low speed channel2 counter overflow.*/ +#define LEDC_LSTIMER2_OVF_INT_RAW (BIT(6)) +#define LEDC_LSTIMER2_OVF_INT_RAW_M (BIT(6)) +#define LEDC_LSTIMER2_OVF_INT_RAW_V 0x1 +#define LEDC_LSTIMER2_OVF_INT_RAW_S 6 +/* LEDC_LSTIMER1_OVF_INT_RAW : RO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for low speed channel1 counter overflow.*/ +#define LEDC_LSTIMER1_OVF_INT_RAW (BIT(5)) +#define LEDC_LSTIMER1_OVF_INT_RAW_M (BIT(5)) +#define LEDC_LSTIMER1_OVF_INT_RAW_V 0x1 +#define LEDC_LSTIMER1_OVF_INT_RAW_S 5 +/* LEDC_LSTIMER0_OVF_INT_RAW : RO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for low speed channel0 counter overflow.*/ +#define LEDC_LSTIMER0_OVF_INT_RAW (BIT(4)) +#define LEDC_LSTIMER0_OVF_INT_RAW_M (BIT(4)) +#define LEDC_LSTIMER0_OVF_INT_RAW_V 0x1 +#define LEDC_LSTIMER0_OVF_INT_RAW_S 4 +/* LEDC_HSTIMER3_OVF_INT_RAW : RO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for high speed channel3 counter overflow.*/ +#define LEDC_HSTIMER3_OVF_INT_RAW (BIT(3)) +#define LEDC_HSTIMER3_OVF_INT_RAW_M (BIT(3)) +#define LEDC_HSTIMER3_OVF_INT_RAW_V 0x1 +#define LEDC_HSTIMER3_OVF_INT_RAW_S 3 +/* LEDC_HSTIMER2_OVF_INT_RAW : RO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for high speed channel2 counter overflow.*/ +#define LEDC_HSTIMER2_OVF_INT_RAW (BIT(2)) +#define LEDC_HSTIMER2_OVF_INT_RAW_M (BIT(2)) +#define LEDC_HSTIMER2_OVF_INT_RAW_V 0x1 +#define LEDC_HSTIMER2_OVF_INT_RAW_S 2 +/* LEDC_HSTIMER1_OVF_INT_RAW : RO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for high speed channel1 counter overflow.*/ +#define LEDC_HSTIMER1_OVF_INT_RAW (BIT(1)) +#define LEDC_HSTIMER1_OVF_INT_RAW_M (BIT(1)) +#define LEDC_HSTIMER1_OVF_INT_RAW_V 0x1 +#define LEDC_HSTIMER1_OVF_INT_RAW_S 1 +/* LEDC_HSTIMER0_OVF_INT_RAW : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for high speed channel0 counter overflow.*/ +#define LEDC_HSTIMER0_OVF_INT_RAW (BIT(0)) +#define LEDC_HSTIMER0_OVF_INT_RAW_M (BIT(0)) +#define LEDC_HSTIMER0_OVF_INT_RAW_V 0x1 +#define LEDC_HSTIMER0_OVF_INT_RAW_S 0 + +#define LEDC_INT_ST_REG (DR_REG_LEDC_BASE + 0x0184) +/* LEDC_DUTY_CHNG_END_LSCH7_INT_ST : RO ;bitpos:[23] ;default: 1'h0 ; */ +/*description: The interrupt status bit for low speed channel 7 duty change done event*/ +#define LEDC_DUTY_CHNG_END_LSCH7_INT_ST (BIT(23)) +#define LEDC_DUTY_CHNG_END_LSCH7_INT_ST_M (BIT(23)) +#define LEDC_DUTY_CHNG_END_LSCH7_INT_ST_V 0x1 +#define LEDC_DUTY_CHNG_END_LSCH7_INT_ST_S 23 +/* LEDC_DUTY_CHNG_END_LSCH6_INT_ST : RO ;bitpos:[22] ;default: 1'b0 ; */ +/*description: The interrupt status bit for low speed channel 6 duty change done event.*/ +#define LEDC_DUTY_CHNG_END_LSCH6_INT_ST (BIT(22)) +#define LEDC_DUTY_CHNG_END_LSCH6_INT_ST_M (BIT(22)) +#define LEDC_DUTY_CHNG_END_LSCH6_INT_ST_V 0x1 +#define LEDC_DUTY_CHNG_END_LSCH6_INT_ST_S 22 +/* LEDC_DUTY_CHNG_END_LSCH5_INT_ST : RO ;bitpos:[21] ;default: 1'b0 ; */ +/*description: The interrupt status bit for low speed channel 5 duty change done event.*/ +#define LEDC_DUTY_CHNG_END_LSCH5_INT_ST (BIT(21)) +#define LEDC_DUTY_CHNG_END_LSCH5_INT_ST_M (BIT(21)) +#define LEDC_DUTY_CHNG_END_LSCH5_INT_ST_V 0x1 +#define LEDC_DUTY_CHNG_END_LSCH5_INT_ST_S 21 +/* LEDC_DUTY_CHNG_END_LSCH4_INT_ST : RO ;bitpos:[20] ;default: 1'b0 ; */ +/*description: The interrupt status bit for low speed channel 4 duty change done event.*/ +#define LEDC_DUTY_CHNG_END_LSCH4_INT_ST (BIT(20)) +#define LEDC_DUTY_CHNG_END_LSCH4_INT_ST_M (BIT(20)) +#define LEDC_DUTY_CHNG_END_LSCH4_INT_ST_V 0x1 +#define LEDC_DUTY_CHNG_END_LSCH4_INT_ST_S 20 +/* LEDC_DUTY_CHNG_END_LSCH3_INT_ST : RO ;bitpos:[19] ;default: 1'b0 ; */ +/*description: The interrupt status bit for low speed channel 3 duty change done event.*/ +#define LEDC_DUTY_CHNG_END_LSCH3_INT_ST (BIT(19)) +#define LEDC_DUTY_CHNG_END_LSCH3_INT_ST_M (BIT(19)) +#define LEDC_DUTY_CHNG_END_LSCH3_INT_ST_V 0x1 +#define LEDC_DUTY_CHNG_END_LSCH3_INT_ST_S 19 +/* LEDC_DUTY_CHNG_END_LSCH2_INT_ST : RO ;bitpos:[18] ;default: 1'b0 ; */ +/*description: The interrupt status bit for low speed channel 2 duty change done event.*/ +#define LEDC_DUTY_CHNG_END_LSCH2_INT_ST (BIT(18)) +#define LEDC_DUTY_CHNG_END_LSCH2_INT_ST_M (BIT(18)) +#define LEDC_DUTY_CHNG_END_LSCH2_INT_ST_V 0x1 +#define LEDC_DUTY_CHNG_END_LSCH2_INT_ST_S 18 +/* LEDC_DUTY_CHNG_END_LSCH1_INT_ST : RO ;bitpos:[17] ;default: 1'b0 ; */ +/*description: The interrupt status bit for low speed channel 1 duty change done event.*/ +#define LEDC_DUTY_CHNG_END_LSCH1_INT_ST (BIT(17)) +#define LEDC_DUTY_CHNG_END_LSCH1_INT_ST_M (BIT(17)) +#define LEDC_DUTY_CHNG_END_LSCH1_INT_ST_V 0x1 +#define LEDC_DUTY_CHNG_END_LSCH1_INT_ST_S 17 +/* LEDC_DUTY_CHNG_END_LSCH0_INT_ST : RO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: The interrupt status bit for low speed channel 0 duty change done event.*/ +#define LEDC_DUTY_CHNG_END_LSCH0_INT_ST (BIT(16)) +#define LEDC_DUTY_CHNG_END_LSCH0_INT_ST_M (BIT(16)) +#define LEDC_DUTY_CHNG_END_LSCH0_INT_ST_V 0x1 +#define LEDC_DUTY_CHNG_END_LSCH0_INT_ST_S 16 +/* LEDC_DUTY_CHNG_END_HSCH7_INT_ST : RO ;bitpos:[15] ;default: 1'b0 ; */ +/*description: The interrupt status bit for high speed channel 7 duty change done event.*/ +#define LEDC_DUTY_CHNG_END_HSCH7_INT_ST (BIT(15)) +#define LEDC_DUTY_CHNG_END_HSCH7_INT_ST_M (BIT(15)) +#define LEDC_DUTY_CHNG_END_HSCH7_INT_ST_V 0x1 +#define LEDC_DUTY_CHNG_END_HSCH7_INT_ST_S 15 +/* LEDC_DUTY_CHNG_END_HSCH6_INT_ST : RO ;bitpos:[14] ;default: 1'b0 ; */ +/*description: The interrupt status bit for high speed channel 6 duty change done event.*/ +#define LEDC_DUTY_CHNG_END_HSCH6_INT_ST (BIT(14)) +#define LEDC_DUTY_CHNG_END_HSCH6_INT_ST_M (BIT(14)) +#define LEDC_DUTY_CHNG_END_HSCH6_INT_ST_V 0x1 +#define LEDC_DUTY_CHNG_END_HSCH6_INT_ST_S 14 +/* LEDC_DUTY_CHNG_END_HSCH5_INT_ST : RO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: The interrupt status bit for high speed channel 5 duty change done event.*/ +#define LEDC_DUTY_CHNG_END_HSCH5_INT_ST (BIT(13)) +#define LEDC_DUTY_CHNG_END_HSCH5_INT_ST_M (BIT(13)) +#define LEDC_DUTY_CHNG_END_HSCH5_INT_ST_V 0x1 +#define LEDC_DUTY_CHNG_END_HSCH5_INT_ST_S 13 +/* LEDC_DUTY_CHNG_END_HSCH4_INT_ST : RO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: The interrupt status bit for high speed channel 4 duty change done event.*/ +#define LEDC_DUTY_CHNG_END_HSCH4_INT_ST (BIT(12)) +#define LEDC_DUTY_CHNG_END_HSCH4_INT_ST_M (BIT(12)) +#define LEDC_DUTY_CHNG_END_HSCH4_INT_ST_V 0x1 +#define LEDC_DUTY_CHNG_END_HSCH4_INT_ST_S 12 +/* LEDC_DUTY_CHNG_END_HSCH3_INT_ST : RO ;bitpos:[11] ;default: 1'b0 ; */ +/*description: The interrupt status bit for high speed channel 3 duty change done event.*/ +#define LEDC_DUTY_CHNG_END_HSCH3_INT_ST (BIT(11)) +#define LEDC_DUTY_CHNG_END_HSCH3_INT_ST_M (BIT(11)) +#define LEDC_DUTY_CHNG_END_HSCH3_INT_ST_V 0x1 +#define LEDC_DUTY_CHNG_END_HSCH3_INT_ST_S 11 +/* LEDC_DUTY_CHNG_END_HSCH2_INT_ST : RO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: The interrupt status bit for high speed channel 2 duty change done event.*/ +#define LEDC_DUTY_CHNG_END_HSCH2_INT_ST (BIT(10)) +#define LEDC_DUTY_CHNG_END_HSCH2_INT_ST_M (BIT(10)) +#define LEDC_DUTY_CHNG_END_HSCH2_INT_ST_V 0x1 +#define LEDC_DUTY_CHNG_END_HSCH2_INT_ST_S 10 +/* LEDC_DUTY_CHNG_END_HSCH1_INT_ST : RO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: The interrupt status bit for high speed channel 1 duty change done event.*/ +#define LEDC_DUTY_CHNG_END_HSCH1_INT_ST (BIT(9)) +#define LEDC_DUTY_CHNG_END_HSCH1_INT_ST_M (BIT(9)) +#define LEDC_DUTY_CHNG_END_HSCH1_INT_ST_V 0x1 +#define LEDC_DUTY_CHNG_END_HSCH1_INT_ST_S 9 +/* LEDC_DUTY_CHNG_END_HSCH0_INT_ST : RO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: The interrupt status bit for high speed channel 0 duty change done event.*/ +#define LEDC_DUTY_CHNG_END_HSCH0_INT_ST (BIT(8)) +#define LEDC_DUTY_CHNG_END_HSCH0_INT_ST_M (BIT(8)) +#define LEDC_DUTY_CHNG_END_HSCH0_INT_ST_V 0x1 +#define LEDC_DUTY_CHNG_END_HSCH0_INT_ST_S 8 +/* LEDC_LSTIMER3_OVF_INT_ST : RO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: The interrupt status bit for low speed channel3 counter overflow event.*/ +#define LEDC_LSTIMER3_OVF_INT_ST (BIT(7)) +#define LEDC_LSTIMER3_OVF_INT_ST_M (BIT(7)) +#define LEDC_LSTIMER3_OVF_INT_ST_V 0x1 +#define LEDC_LSTIMER3_OVF_INT_ST_S 7 +/* LEDC_LSTIMER2_OVF_INT_ST : RO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: The interrupt status bit for low speed channel2 counter overflow event.*/ +#define LEDC_LSTIMER2_OVF_INT_ST (BIT(6)) +#define LEDC_LSTIMER2_OVF_INT_ST_M (BIT(6)) +#define LEDC_LSTIMER2_OVF_INT_ST_V 0x1 +#define LEDC_LSTIMER2_OVF_INT_ST_S 6 +/* LEDC_LSTIMER1_OVF_INT_ST : RO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: The interrupt status bit for low speed channel1 counter overflow event.*/ +#define LEDC_LSTIMER1_OVF_INT_ST (BIT(5)) +#define LEDC_LSTIMER1_OVF_INT_ST_M (BIT(5)) +#define LEDC_LSTIMER1_OVF_INT_ST_V 0x1 +#define LEDC_LSTIMER1_OVF_INT_ST_S 5 +/* LEDC_LSTIMER0_OVF_INT_ST : RO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: The interrupt status bit for low speed channel0 counter overflow event.*/ +#define LEDC_LSTIMER0_OVF_INT_ST (BIT(4)) +#define LEDC_LSTIMER0_OVF_INT_ST_M (BIT(4)) +#define LEDC_LSTIMER0_OVF_INT_ST_V 0x1 +#define LEDC_LSTIMER0_OVF_INT_ST_S 4 +/* LEDC_HSTIMER3_OVF_INT_ST : RO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: The interrupt status bit for high speed channel3 counter overflow event.*/ +#define LEDC_HSTIMER3_OVF_INT_ST (BIT(3)) +#define LEDC_HSTIMER3_OVF_INT_ST_M (BIT(3)) +#define LEDC_HSTIMER3_OVF_INT_ST_V 0x1 +#define LEDC_HSTIMER3_OVF_INT_ST_S 3 +/* LEDC_HSTIMER2_OVF_INT_ST : RO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: The interrupt status bit for high speed channel2 counter overflow event.*/ +#define LEDC_HSTIMER2_OVF_INT_ST (BIT(2)) +#define LEDC_HSTIMER2_OVF_INT_ST_M (BIT(2)) +#define LEDC_HSTIMER2_OVF_INT_ST_V 0x1 +#define LEDC_HSTIMER2_OVF_INT_ST_S 2 +/* LEDC_HSTIMER1_OVF_INT_ST : RO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: The interrupt status bit for high speed channel1 counter overflow event.*/ +#define LEDC_HSTIMER1_OVF_INT_ST (BIT(1)) +#define LEDC_HSTIMER1_OVF_INT_ST_M (BIT(1)) +#define LEDC_HSTIMER1_OVF_INT_ST_V 0x1 +#define LEDC_HSTIMER1_OVF_INT_ST_S 1 +/* LEDC_HSTIMER0_OVF_INT_ST : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: The interrupt status bit for high speed channel0 counter overflow event.*/ +#define LEDC_HSTIMER0_OVF_INT_ST (BIT(0)) +#define LEDC_HSTIMER0_OVF_INT_ST_M (BIT(0)) +#define LEDC_HSTIMER0_OVF_INT_ST_V 0x1 +#define LEDC_HSTIMER0_OVF_INT_ST_S 0 + +#define LEDC_INT_ENA_REG (DR_REG_LEDC_BASE + 0x0188) +/* LEDC_DUTY_CHNG_END_LSCH7_INT_ENA : R/W ;bitpos:[23] ;default: 1'h0 ; */ +/*description: The interrupt enable bit for low speed channel 7 duty change done interrupt.*/ +#define LEDC_DUTY_CHNG_END_LSCH7_INT_ENA (BIT(23)) +#define LEDC_DUTY_CHNG_END_LSCH7_INT_ENA_M (BIT(23)) +#define LEDC_DUTY_CHNG_END_LSCH7_INT_ENA_V 0x1 +#define LEDC_DUTY_CHNG_END_LSCH7_INT_ENA_S 23 +/* LEDC_DUTY_CHNG_END_LSCH6_INT_ENA : R/W ;bitpos:[22] ;default: 1'b0 ; */ +/*description: The interrupt enable bit for low speed channel 6 duty change done interrupt.*/ +#define LEDC_DUTY_CHNG_END_LSCH6_INT_ENA (BIT(22)) +#define LEDC_DUTY_CHNG_END_LSCH6_INT_ENA_M (BIT(22)) +#define LEDC_DUTY_CHNG_END_LSCH6_INT_ENA_V 0x1 +#define LEDC_DUTY_CHNG_END_LSCH6_INT_ENA_S 22 +/* LEDC_DUTY_CHNG_END_LSCH5_INT_ENA : R/W ;bitpos:[21] ;default: 1'b0 ; */ +/*description: The interrupt enable bit for low speed channel 5 duty change done interrupt.*/ +#define LEDC_DUTY_CHNG_END_LSCH5_INT_ENA (BIT(21)) +#define LEDC_DUTY_CHNG_END_LSCH5_INT_ENA_M (BIT(21)) +#define LEDC_DUTY_CHNG_END_LSCH5_INT_ENA_V 0x1 +#define LEDC_DUTY_CHNG_END_LSCH5_INT_ENA_S 21 +/* LEDC_DUTY_CHNG_END_LSCH4_INT_ENA : R/W ;bitpos:[20] ;default: 1'b0 ; */ +/*description: The interrupt enable bit for low speed channel 4 duty change done interrupt.*/ +#define LEDC_DUTY_CHNG_END_LSCH4_INT_ENA (BIT(20)) +#define LEDC_DUTY_CHNG_END_LSCH4_INT_ENA_M (BIT(20)) +#define LEDC_DUTY_CHNG_END_LSCH4_INT_ENA_V 0x1 +#define LEDC_DUTY_CHNG_END_LSCH4_INT_ENA_S 20 +/* LEDC_DUTY_CHNG_END_LSCH3_INT_ENA : R/W ;bitpos:[19] ;default: 1'b0 ; */ +/*description: The interrupt enable bit for low speed channel 3 duty change done interrupt.*/ +#define LEDC_DUTY_CHNG_END_LSCH3_INT_ENA (BIT(19)) +#define LEDC_DUTY_CHNG_END_LSCH3_INT_ENA_M (BIT(19)) +#define LEDC_DUTY_CHNG_END_LSCH3_INT_ENA_V 0x1 +#define LEDC_DUTY_CHNG_END_LSCH3_INT_ENA_S 19 +/* LEDC_DUTY_CHNG_END_LSCH2_INT_ENA : R/W ;bitpos:[18] ;default: 1'b0 ; */ +/*description: The interrupt enable bit for low speed channel 2 duty change done interrupt.*/ +#define LEDC_DUTY_CHNG_END_LSCH2_INT_ENA (BIT(18)) +#define LEDC_DUTY_CHNG_END_LSCH2_INT_ENA_M (BIT(18)) +#define LEDC_DUTY_CHNG_END_LSCH2_INT_ENA_V 0x1 +#define LEDC_DUTY_CHNG_END_LSCH2_INT_ENA_S 18 +/* LEDC_DUTY_CHNG_END_LSCH1_INT_ENA : R/W ;bitpos:[17] ;default: 1'b0 ; */ +/*description: The interrupt enable bit for low speed channel 1 duty change done interrupt.*/ +#define LEDC_DUTY_CHNG_END_LSCH1_INT_ENA (BIT(17)) +#define LEDC_DUTY_CHNG_END_LSCH1_INT_ENA_M (BIT(17)) +#define LEDC_DUTY_CHNG_END_LSCH1_INT_ENA_V 0x1 +#define LEDC_DUTY_CHNG_END_LSCH1_INT_ENA_S 17 +/* LEDC_DUTY_CHNG_END_LSCH0_INT_ENA : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: The interrupt enable bit for low speed channel 0 duty change done interrupt.*/ +#define LEDC_DUTY_CHNG_END_LSCH0_INT_ENA (BIT(16)) +#define LEDC_DUTY_CHNG_END_LSCH0_INT_ENA_M (BIT(16)) +#define LEDC_DUTY_CHNG_END_LSCH0_INT_ENA_V 0x1 +#define LEDC_DUTY_CHNG_END_LSCH0_INT_ENA_S 16 +/* LEDC_DUTY_CHNG_END_HSCH7_INT_ENA : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: The interrupt enable bit for high speed channel 7 duty change done interrupt.*/ +#define LEDC_DUTY_CHNG_END_HSCH7_INT_ENA (BIT(15)) +#define LEDC_DUTY_CHNG_END_HSCH7_INT_ENA_M (BIT(15)) +#define LEDC_DUTY_CHNG_END_HSCH7_INT_ENA_V 0x1 +#define LEDC_DUTY_CHNG_END_HSCH7_INT_ENA_S 15 +/* LEDC_DUTY_CHNG_END_HSCH6_INT_ENA : R/W ;bitpos:[14] ;default: 1'b0 ; */ +/*description: The interrupt enable bit for high speed channel 6 duty change done interrupt.*/ +#define LEDC_DUTY_CHNG_END_HSCH6_INT_ENA (BIT(14)) +#define LEDC_DUTY_CHNG_END_HSCH6_INT_ENA_M (BIT(14)) +#define LEDC_DUTY_CHNG_END_HSCH6_INT_ENA_V 0x1 +#define LEDC_DUTY_CHNG_END_HSCH6_INT_ENA_S 14 +/* LEDC_DUTY_CHNG_END_HSCH5_INT_ENA : R/W ;bitpos:[13] ;default: 1'b0 ; */ +/*description: The interrupt enable bit for high speed channel 5 duty change done interrupt.*/ +#define LEDC_DUTY_CHNG_END_HSCH5_INT_ENA (BIT(13)) +#define LEDC_DUTY_CHNG_END_HSCH5_INT_ENA_M (BIT(13)) +#define LEDC_DUTY_CHNG_END_HSCH5_INT_ENA_V 0x1 +#define LEDC_DUTY_CHNG_END_HSCH5_INT_ENA_S 13 +/* LEDC_DUTY_CHNG_END_HSCH4_INT_ENA : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: The interrupt enable bit for high speed channel 4 duty change done interrupt.*/ +#define LEDC_DUTY_CHNG_END_HSCH4_INT_ENA (BIT(12)) +#define LEDC_DUTY_CHNG_END_HSCH4_INT_ENA_M (BIT(12)) +#define LEDC_DUTY_CHNG_END_HSCH4_INT_ENA_V 0x1 +#define LEDC_DUTY_CHNG_END_HSCH4_INT_ENA_S 12 +/* LEDC_DUTY_CHNG_END_HSCH3_INT_ENA : R/W ;bitpos:[11] ;default: 1'b0 ; */ +/*description: The interrupt enable bit for high speed channel 3 duty change done interrupt.*/ +#define LEDC_DUTY_CHNG_END_HSCH3_INT_ENA (BIT(11)) +#define LEDC_DUTY_CHNG_END_HSCH3_INT_ENA_M (BIT(11)) +#define LEDC_DUTY_CHNG_END_HSCH3_INT_ENA_V 0x1 +#define LEDC_DUTY_CHNG_END_HSCH3_INT_ENA_S 11 +/* LEDC_DUTY_CHNG_END_HSCH2_INT_ENA : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: The interrupt enable bit for high speed channel 2 duty change done interrupt.*/ +#define LEDC_DUTY_CHNG_END_HSCH2_INT_ENA (BIT(10)) +#define LEDC_DUTY_CHNG_END_HSCH2_INT_ENA_M (BIT(10)) +#define LEDC_DUTY_CHNG_END_HSCH2_INT_ENA_V 0x1 +#define LEDC_DUTY_CHNG_END_HSCH2_INT_ENA_S 10 +/* LEDC_DUTY_CHNG_END_HSCH1_INT_ENA : R/W ;bitpos:[9] ;default: 1'b0 ; */ +/*description: The interrupt enable bit for high speed channel 1 duty change done interrupt.*/ +#define LEDC_DUTY_CHNG_END_HSCH1_INT_ENA (BIT(9)) +#define LEDC_DUTY_CHNG_END_HSCH1_INT_ENA_M (BIT(9)) +#define LEDC_DUTY_CHNG_END_HSCH1_INT_ENA_V 0x1 +#define LEDC_DUTY_CHNG_END_HSCH1_INT_ENA_S 9 +/* LEDC_DUTY_CHNG_END_HSCH0_INT_ENA : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: The interrupt enable bit for high speed channel 0 duty change done interrupt.*/ +#define LEDC_DUTY_CHNG_END_HSCH0_INT_ENA (BIT(8)) +#define LEDC_DUTY_CHNG_END_HSCH0_INT_ENA_M (BIT(8)) +#define LEDC_DUTY_CHNG_END_HSCH0_INT_ENA_V 0x1 +#define LEDC_DUTY_CHNG_END_HSCH0_INT_ENA_S 8 +/* LEDC_LSTIMER3_OVF_INT_ENA : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: The interrupt enable bit for low speed channel3 counter overflow interrupt.*/ +#define LEDC_LSTIMER3_OVF_INT_ENA (BIT(7)) +#define LEDC_LSTIMER3_OVF_INT_ENA_M (BIT(7)) +#define LEDC_LSTIMER3_OVF_INT_ENA_V 0x1 +#define LEDC_LSTIMER3_OVF_INT_ENA_S 7 +/* LEDC_LSTIMER2_OVF_INT_ENA : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: The interrupt enable bit for low speed channel2 counter overflow interrupt.*/ +#define LEDC_LSTIMER2_OVF_INT_ENA (BIT(6)) +#define LEDC_LSTIMER2_OVF_INT_ENA_M (BIT(6)) +#define LEDC_LSTIMER2_OVF_INT_ENA_V 0x1 +#define LEDC_LSTIMER2_OVF_INT_ENA_S 6 +/* LEDC_LSTIMER1_OVF_INT_ENA : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: The interrupt enable bit for low speed channel1 counter overflow interrupt.*/ +#define LEDC_LSTIMER1_OVF_INT_ENA (BIT(5)) +#define LEDC_LSTIMER1_OVF_INT_ENA_M (BIT(5)) +#define LEDC_LSTIMER1_OVF_INT_ENA_V 0x1 +#define LEDC_LSTIMER1_OVF_INT_ENA_S 5 +/* LEDC_LSTIMER0_OVF_INT_ENA : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: The interrupt enable bit for low speed channel0 counter overflow interrupt.*/ +#define LEDC_LSTIMER0_OVF_INT_ENA (BIT(4)) +#define LEDC_LSTIMER0_OVF_INT_ENA_M (BIT(4)) +#define LEDC_LSTIMER0_OVF_INT_ENA_V 0x1 +#define LEDC_LSTIMER0_OVF_INT_ENA_S 4 +/* LEDC_HSTIMER3_OVF_INT_ENA : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: The interrupt enable bit for high speed channel3 counter overflow interrupt.*/ +#define LEDC_HSTIMER3_OVF_INT_ENA (BIT(3)) +#define LEDC_HSTIMER3_OVF_INT_ENA_M (BIT(3)) +#define LEDC_HSTIMER3_OVF_INT_ENA_V 0x1 +#define LEDC_HSTIMER3_OVF_INT_ENA_S 3 +/* LEDC_HSTIMER2_OVF_INT_ENA : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: The interrupt enable bit for high speed channel2 counter overflow interrupt.*/ +#define LEDC_HSTIMER2_OVF_INT_ENA (BIT(2)) +#define LEDC_HSTIMER2_OVF_INT_ENA_M (BIT(2)) +#define LEDC_HSTIMER2_OVF_INT_ENA_V 0x1 +#define LEDC_HSTIMER2_OVF_INT_ENA_S 2 +/* LEDC_HSTIMER1_OVF_INT_ENA : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: The interrupt enable bit for high speed channel1 counter overflow interrupt.*/ +#define LEDC_HSTIMER1_OVF_INT_ENA (BIT(1)) +#define LEDC_HSTIMER1_OVF_INT_ENA_M (BIT(1)) +#define LEDC_HSTIMER1_OVF_INT_ENA_V 0x1 +#define LEDC_HSTIMER1_OVF_INT_ENA_S 1 +/* LEDC_HSTIMER0_OVF_INT_ENA : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: The interrupt enable bit for high speed channel0 counter overflow interrupt.*/ +#define LEDC_HSTIMER0_OVF_INT_ENA (BIT(0)) +#define LEDC_HSTIMER0_OVF_INT_ENA_M (BIT(0)) +#define LEDC_HSTIMER0_OVF_INT_ENA_V 0x1 +#define LEDC_HSTIMER0_OVF_INT_ENA_S 0 + +#define LEDC_INT_CLR_REG (DR_REG_LEDC_BASE + 0x018C) +/* LEDC_DUTY_CHNG_END_LSCH7_INT_CLR : WO ;bitpos:[23] ;default: 1'h0 ; */ +/*description: Set this bit to clear low speed channel 7 duty change done interrupt.*/ +#define LEDC_DUTY_CHNG_END_LSCH7_INT_CLR (BIT(23)) +#define LEDC_DUTY_CHNG_END_LSCH7_INT_CLR_M (BIT(23)) +#define LEDC_DUTY_CHNG_END_LSCH7_INT_CLR_V 0x1 +#define LEDC_DUTY_CHNG_END_LSCH7_INT_CLR_S 23 +/* LEDC_DUTY_CHNG_END_LSCH6_INT_CLR : WO ;bitpos:[22] ;default: 1'b0 ; */ +/*description: Set this bit to clear low speed channel 6 duty change done interrupt.*/ +#define LEDC_DUTY_CHNG_END_LSCH6_INT_CLR (BIT(22)) +#define LEDC_DUTY_CHNG_END_LSCH6_INT_CLR_M (BIT(22)) +#define LEDC_DUTY_CHNG_END_LSCH6_INT_CLR_V 0x1 +#define LEDC_DUTY_CHNG_END_LSCH6_INT_CLR_S 22 +/* LEDC_DUTY_CHNG_END_LSCH5_INT_CLR : WO ;bitpos:[21] ;default: 1'b0 ; */ +/*description: Set this bit to clear low speed channel 5 duty change done interrupt.*/ +#define LEDC_DUTY_CHNG_END_LSCH5_INT_CLR (BIT(21)) +#define LEDC_DUTY_CHNG_END_LSCH5_INT_CLR_M (BIT(21)) +#define LEDC_DUTY_CHNG_END_LSCH5_INT_CLR_V 0x1 +#define LEDC_DUTY_CHNG_END_LSCH5_INT_CLR_S 21 +/* LEDC_DUTY_CHNG_END_LSCH4_INT_CLR : WO ;bitpos:[20] ;default: 1'b0 ; */ +/*description: Set this bit to clear low speed channel 4 duty change done interrupt.*/ +#define LEDC_DUTY_CHNG_END_LSCH4_INT_CLR (BIT(20)) +#define LEDC_DUTY_CHNG_END_LSCH4_INT_CLR_M (BIT(20)) +#define LEDC_DUTY_CHNG_END_LSCH4_INT_CLR_V 0x1 +#define LEDC_DUTY_CHNG_END_LSCH4_INT_CLR_S 20 +/* LEDC_DUTY_CHNG_END_LSCH3_INT_CLR : WO ;bitpos:[19] ;default: 1'b0 ; */ +/*description: Set this bit to clear low speed channel 3 duty change done interrupt.*/ +#define LEDC_DUTY_CHNG_END_LSCH3_INT_CLR (BIT(19)) +#define LEDC_DUTY_CHNG_END_LSCH3_INT_CLR_M (BIT(19)) +#define LEDC_DUTY_CHNG_END_LSCH3_INT_CLR_V 0x1 +#define LEDC_DUTY_CHNG_END_LSCH3_INT_CLR_S 19 +/* LEDC_DUTY_CHNG_END_LSCH2_INT_CLR : WO ;bitpos:[18] ;default: 1'b0 ; */ +/*description: Set this bit to clear low speed channel 2 duty change done interrupt.*/ +#define LEDC_DUTY_CHNG_END_LSCH2_INT_CLR (BIT(18)) +#define LEDC_DUTY_CHNG_END_LSCH2_INT_CLR_M (BIT(18)) +#define LEDC_DUTY_CHNG_END_LSCH2_INT_CLR_V 0x1 +#define LEDC_DUTY_CHNG_END_LSCH2_INT_CLR_S 18 +/* LEDC_DUTY_CHNG_END_LSCH1_INT_CLR : WO ;bitpos:[17] ;default: 1'b0 ; */ +/*description: Set this bit to clear low speed channel 1 duty change done interrupt.*/ +#define LEDC_DUTY_CHNG_END_LSCH1_INT_CLR (BIT(17)) +#define LEDC_DUTY_CHNG_END_LSCH1_INT_CLR_M (BIT(17)) +#define LEDC_DUTY_CHNG_END_LSCH1_INT_CLR_V 0x1 +#define LEDC_DUTY_CHNG_END_LSCH1_INT_CLR_S 17 +/* LEDC_DUTY_CHNG_END_LSCH0_INT_CLR : WO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: Set this bit to clear low speed channel 0 duty change done interrupt.*/ +#define LEDC_DUTY_CHNG_END_LSCH0_INT_CLR (BIT(16)) +#define LEDC_DUTY_CHNG_END_LSCH0_INT_CLR_M (BIT(16)) +#define LEDC_DUTY_CHNG_END_LSCH0_INT_CLR_V 0x1 +#define LEDC_DUTY_CHNG_END_LSCH0_INT_CLR_S 16 +/* LEDC_DUTY_CHNG_END_HSCH7_INT_CLR : WO ;bitpos:[15] ;default: 1'b0 ; */ +/*description: Set this bit to clear high speed channel 7 duty change done interrupt.*/ +#define LEDC_DUTY_CHNG_END_HSCH7_INT_CLR (BIT(15)) +#define LEDC_DUTY_CHNG_END_HSCH7_INT_CLR_M (BIT(15)) +#define LEDC_DUTY_CHNG_END_HSCH7_INT_CLR_V 0x1 +#define LEDC_DUTY_CHNG_END_HSCH7_INT_CLR_S 15 +/* LEDC_DUTY_CHNG_END_HSCH6_INT_CLR : WO ;bitpos:[14] ;default: 1'b0 ; */ +/*description: Set this bit to clear high speed channel 6 duty change done interrupt.*/ +#define LEDC_DUTY_CHNG_END_HSCH6_INT_CLR (BIT(14)) +#define LEDC_DUTY_CHNG_END_HSCH6_INT_CLR_M (BIT(14)) +#define LEDC_DUTY_CHNG_END_HSCH6_INT_CLR_V 0x1 +#define LEDC_DUTY_CHNG_END_HSCH6_INT_CLR_S 14 +/* LEDC_DUTY_CHNG_END_HSCH5_INT_CLR : WO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: Set this bit to clear high speed channel 5 duty change done interrupt.*/ +#define LEDC_DUTY_CHNG_END_HSCH5_INT_CLR (BIT(13)) +#define LEDC_DUTY_CHNG_END_HSCH5_INT_CLR_M (BIT(13)) +#define LEDC_DUTY_CHNG_END_HSCH5_INT_CLR_V 0x1 +#define LEDC_DUTY_CHNG_END_HSCH5_INT_CLR_S 13 +/* LEDC_DUTY_CHNG_END_HSCH4_INT_CLR : WO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: Set this bit to clear high speed channel 4 duty change done interrupt.*/ +#define LEDC_DUTY_CHNG_END_HSCH4_INT_CLR (BIT(12)) +#define LEDC_DUTY_CHNG_END_HSCH4_INT_CLR_M (BIT(12)) +#define LEDC_DUTY_CHNG_END_HSCH4_INT_CLR_V 0x1 +#define LEDC_DUTY_CHNG_END_HSCH4_INT_CLR_S 12 +/* LEDC_DUTY_CHNG_END_HSCH3_INT_CLR : WO ;bitpos:[11] ;default: 1'b0 ; */ +/*description: Set this bit to clear high speed channel 3 duty change done interrupt.*/ +#define LEDC_DUTY_CHNG_END_HSCH3_INT_CLR (BIT(11)) +#define LEDC_DUTY_CHNG_END_HSCH3_INT_CLR_M (BIT(11)) +#define LEDC_DUTY_CHNG_END_HSCH3_INT_CLR_V 0x1 +#define LEDC_DUTY_CHNG_END_HSCH3_INT_CLR_S 11 +/* LEDC_DUTY_CHNG_END_HSCH2_INT_CLR : WO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: Set this bit to clear high speed channel 2 duty change done interrupt.*/ +#define LEDC_DUTY_CHNG_END_HSCH2_INT_CLR (BIT(10)) +#define LEDC_DUTY_CHNG_END_HSCH2_INT_CLR_M (BIT(10)) +#define LEDC_DUTY_CHNG_END_HSCH2_INT_CLR_V 0x1 +#define LEDC_DUTY_CHNG_END_HSCH2_INT_CLR_S 10 +/* LEDC_DUTY_CHNG_END_HSCH1_INT_CLR : WO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: Set this bit to clear high speed channel 1 duty change done interrupt.*/ +#define LEDC_DUTY_CHNG_END_HSCH1_INT_CLR (BIT(9)) +#define LEDC_DUTY_CHNG_END_HSCH1_INT_CLR_M (BIT(9)) +#define LEDC_DUTY_CHNG_END_HSCH1_INT_CLR_V 0x1 +#define LEDC_DUTY_CHNG_END_HSCH1_INT_CLR_S 9 +/* LEDC_DUTY_CHNG_END_HSCH0_INT_CLR : WO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: Set this bit to clear high speed channel 0 duty change done interrupt.*/ +#define LEDC_DUTY_CHNG_END_HSCH0_INT_CLR (BIT(8)) +#define LEDC_DUTY_CHNG_END_HSCH0_INT_CLR_M (BIT(8)) +#define LEDC_DUTY_CHNG_END_HSCH0_INT_CLR_V 0x1 +#define LEDC_DUTY_CHNG_END_HSCH0_INT_CLR_S 8 +/* LEDC_LSTIMER3_OVF_INT_CLR : WO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: Set this bit to clear low speed channel3 counter overflow interrupt.*/ +#define LEDC_LSTIMER3_OVF_INT_CLR (BIT(7)) +#define LEDC_LSTIMER3_OVF_INT_CLR_M (BIT(7)) +#define LEDC_LSTIMER3_OVF_INT_CLR_V 0x1 +#define LEDC_LSTIMER3_OVF_INT_CLR_S 7 +/* LEDC_LSTIMER2_OVF_INT_CLR : WO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: Set this bit to clear low speed channel2 counter overflow interrupt.*/ +#define LEDC_LSTIMER2_OVF_INT_CLR (BIT(6)) +#define LEDC_LSTIMER2_OVF_INT_CLR_M (BIT(6)) +#define LEDC_LSTIMER2_OVF_INT_CLR_V 0x1 +#define LEDC_LSTIMER2_OVF_INT_CLR_S 6 +/* LEDC_LSTIMER1_OVF_INT_CLR : WO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: Set this bit to clear low speed channel1 counter overflow interrupt.*/ +#define LEDC_LSTIMER1_OVF_INT_CLR (BIT(5)) +#define LEDC_LSTIMER1_OVF_INT_CLR_M (BIT(5)) +#define LEDC_LSTIMER1_OVF_INT_CLR_V 0x1 +#define LEDC_LSTIMER1_OVF_INT_CLR_S 5 +/* LEDC_LSTIMER0_OVF_INT_CLR : WO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: Set this bit to clear low speed channel0 counter overflow interrupt.*/ +#define LEDC_LSTIMER0_OVF_INT_CLR (BIT(4)) +#define LEDC_LSTIMER0_OVF_INT_CLR_M (BIT(4)) +#define LEDC_LSTIMER0_OVF_INT_CLR_V 0x1 +#define LEDC_LSTIMER0_OVF_INT_CLR_S 4 +/* LEDC_HSTIMER3_OVF_INT_CLR : WO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: Set this bit to clear high speed channel3 counter overflow interrupt.*/ +#define LEDC_HSTIMER3_OVF_INT_CLR (BIT(3)) +#define LEDC_HSTIMER3_OVF_INT_CLR_M (BIT(3)) +#define LEDC_HSTIMER3_OVF_INT_CLR_V 0x1 +#define LEDC_HSTIMER3_OVF_INT_CLR_S 3 +/* LEDC_HSTIMER2_OVF_INT_CLR : WO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: Set this bit to clear high speed channel2 counter overflow interrupt.*/ +#define LEDC_HSTIMER2_OVF_INT_CLR (BIT(2)) +#define LEDC_HSTIMER2_OVF_INT_CLR_M (BIT(2)) +#define LEDC_HSTIMER2_OVF_INT_CLR_V 0x1 +#define LEDC_HSTIMER2_OVF_INT_CLR_S 2 +/* LEDC_HSTIMER1_OVF_INT_CLR : WO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: Set this bit to clear high speed channel1 counter overflow interrupt.*/ +#define LEDC_HSTIMER1_OVF_INT_CLR (BIT(1)) +#define LEDC_HSTIMER1_OVF_INT_CLR_M (BIT(1)) +#define LEDC_HSTIMER1_OVF_INT_CLR_V 0x1 +#define LEDC_HSTIMER1_OVF_INT_CLR_S 1 +/* LEDC_HSTIMER0_OVF_INT_CLR : WO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: Set this bit to clear high speed channel0 counter overflow interrupt.*/ +#define LEDC_HSTIMER0_OVF_INT_CLR (BIT(0)) +#define LEDC_HSTIMER0_OVF_INT_CLR_M (BIT(0)) +#define LEDC_HSTIMER0_OVF_INT_CLR_V 0x1 +#define LEDC_HSTIMER0_OVF_INT_CLR_S 0 + +#define LEDC_CONF_REG (DR_REG_LEDC_BASE + 0x0190) +/* LEDC_APB_CLK_SEL : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: This bit is used to set the frequency of slow_clk. 1'b1:80mhz 1'b0:8mhz*/ +#define LEDC_APB_CLK_SEL (BIT(0)) +#define LEDC_APB_CLK_SEL_M (BIT(0)) +#define LEDC_APB_CLK_SEL_V 0x1 +#define LEDC_APB_CLK_SEL_S 0 + +#define LEDC_DATE_REG (DR_REG_LEDC_BASE + 0x01FC) +/* LEDC_DATE : R/W ;bitpos:[31:0] ;default: 32'h16031700 ; */ +/*description: This register represents the version .*/ +#define LEDC_DATE 0xFFFFFFFF +#define LEDC_DATE_M ((LEDC_DATE_V)<<(LEDC_DATE_S)) +#define LEDC_DATE_V 0xFFFFFFFF +#define LEDC_DATE_S 0 + + + + +#endif /*_SOC_LEDC_REG_H_ */ + + diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/ledc_struct.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/ledc_struct.h new file mode 100644 index 0000000000000..36c8303f897ed --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/ledc_struct.h @@ -0,0 +1,258 @@ +// 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. +#ifndef _SOC_LEDC_STRUCT_H_ +#define _SOC_LEDC_STRUCT_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef volatile struct ledc_dev_s { + struct { + struct { + union { + struct { + uint32_t timer_sel: 2; /*There are four high speed timers the two bits are used to select one of them for high speed channel. 2'b00: seletc hstimer0. 2'b01: select hstimer1. 2'b10: select hstimer2. 2'b11: select hstimer3.*/ + uint32_t sig_out_en: 1; /*This is the output enable control bit for high speed channel*/ + uint32_t idle_lv: 1; /*This bit is used to control the output value when high speed channel is off.*/ + uint32_t low_speed_update: 1; /*This bit is only useful for low speed timer channels, reserved for high speed timers*/ + uint32_t reserved4: 26; + uint32_t clk_en: 1; /*This bit is clock gating control signal. when software configure LED_PWM internal registers it controls the register clock.*/ + }; + uint32_t val; + } conf0; + union { + struct { + uint32_t hpoint: 20; /*The output value changes to high when htimerx(x=[0 3]) selected by high speed channel has reached reg_hpoint_hsch0[19:0]*/ + uint32_t reserved20: 12; + }; + uint32_t val; + } hpoint; + union { + struct { + uint32_t duty: 25; /*The register is used to control output duty. When hstimerx(x=[0 3]) chosen by high speed channel has reached reg_lpoint_hsch0 the output signal changes to low. reg_lpoint_hsch0=(reg_hpoint_hsch0[19:0]+reg_duty_hsch0[24:4]) (1) reg_lpoint_hsch0=(reg_hpoint_hsch0[19:0]+reg_duty_hsch0[24:4] +1) (2) The least four bits in this register represent the decimal part and determines when to choose (1) or (2)*/ + uint32_t reserved25: 7; + }; + uint32_t val; + } duty; + union { + struct { + uint32_t duty_scale:10; /*This register controls the increase or decrease step scale for high speed channel.*/ + uint32_t duty_cycle:10; /*This register is used to increase or decrease the duty every reg_duty_cycle_hsch0 cycles for high speed channel.*/ + uint32_t duty_num: 10; /*This register is used to control the number of increased or decreased times for high speed channel.*/ + uint32_t duty_inc: 1; /*This register is used to increase the duty of output signal or decrease the duty of output signal for high speed channel.*/ + uint32_t duty_start: 1; /*When reg_duty_num_hsch0 reg_duty_cycle_hsch0 and reg_duty_scale_hsch0 has been configured. these register won't take effect until set reg_duty_start_hsch0. this bit is automatically cleared by hardware.*/ + }; + uint32_t val; + } conf1; + union { + struct { + uint32_t duty_read: 25; /*This register represents the current duty of the output signal for high speed channel.*/ + uint32_t reserved25: 7; + }; + uint32_t val; + } duty_rd; + } channel[8]; + } channel_group[2]; /*two channel groups : 0: high-speed channels; 1: low-speed channels*/ + struct { + struct { + union { + struct { + uint32_t duty_resolution: 5; /*This register controls resolution of PWN duty by defining the bit width of timer's counter. The max bit width of the counter is 20.*/ + uint32_t clock_divider: 18; /*This register is used to configure the divider of clock at the entry of timer. The least significant eight bits represent the decimal part.*/ + uint32_t pause: 1; /*This bit is used to pause the counter in high speed timer*/ + uint32_t rst: 1; /*This bit is used to reset high speed timer the counter will be 0 after reset.*/ + uint32_t tick_sel: 1; /*This bit is used to choose apb_clk or ref_tick for high speed timer. 1'b1:apb_clk 0:ref_tick*/ + uint32_t low_speed_update: 1; /*This bit is only useful for low speed timer channels, reserved for high speed timers*/ + uint32_t reserved26: 5; + }; + uint32_t val; + } conf; + union { + struct { + uint32_t timer_cnt: 20; /*software can read this register to get the current counter value in high speed timer*/ + uint32_t reserved20: 12; + }; + uint32_t val; + } value; + } timer[4]; + } timer_group[2]; /*two channel groups : 0: high-speed channels; 1: low-speed channels*/ + union { + struct { + uint32_t hstimer0_ovf: 1; /*The interrupt raw bit for high speed channel0 counter overflow.*/ + uint32_t hstimer1_ovf: 1; /*The interrupt raw bit for high speed channel1 counter overflow.*/ + uint32_t hstimer2_ovf: 1; /*The interrupt raw bit for high speed channel2 counter overflow.*/ + uint32_t hstimer3_ovf: 1; /*The interrupt raw bit for high speed channel3 counter overflow.*/ + uint32_t lstimer0_ovf: 1; /*The interrupt raw bit for low speed channel0 counter overflow.*/ + uint32_t lstimer1_ovf: 1; /*The interrupt raw bit for low speed channel1 counter overflow.*/ + uint32_t lstimer2_ovf: 1; /*The interrupt raw bit for low speed channel2 counter overflow.*/ + uint32_t lstimer3_ovf: 1; /*The interrupt raw bit for low speed channel3 counter overflow.*/ + uint32_t duty_chng_end_hsch0: 1; /*The interrupt raw bit for high speed channel 0 duty change done.*/ + uint32_t duty_chng_end_hsch1: 1; /*The interrupt raw bit for high speed channel 1 duty change done.*/ + uint32_t duty_chng_end_hsch2: 1; /*The interrupt raw bit for high speed channel 2 duty change done.*/ + uint32_t duty_chng_end_hsch3: 1; /*The interrupt raw bit for high speed channel 3 duty change done.*/ + uint32_t duty_chng_end_hsch4: 1; /*The interrupt raw bit for high speed channel 4 duty change done.*/ + uint32_t duty_chng_end_hsch5: 1; /*The interrupt raw bit for high speed channel 5 duty change done.*/ + uint32_t duty_chng_end_hsch6: 1; /*The interrupt raw bit for high speed channel 6 duty change done.*/ + uint32_t duty_chng_end_hsch7: 1; /*The interrupt raw bit for high speed channel 7 duty change done.*/ + uint32_t duty_chng_end_lsch0: 1; /*The interrupt raw bit for low speed channel 0 duty change done.*/ + uint32_t duty_chng_end_lsch1: 1; /*The interrupt raw bit for low speed channel 1 duty change done.*/ + uint32_t duty_chng_end_lsch2: 1; /*The interrupt raw bit for low speed channel 2 duty change done.*/ + uint32_t duty_chng_end_lsch3: 1; /*The interrupt raw bit for low speed channel 3 duty change done.*/ + uint32_t duty_chng_end_lsch4: 1; /*The interrupt raw bit for low speed channel 4 duty change done.*/ + uint32_t duty_chng_end_lsch5: 1; /*The interrupt raw bit for low speed channel 5 duty change done.*/ + uint32_t duty_chng_end_lsch6: 1; /*The interrupt raw bit for low speed channel 6 duty change done.*/ + uint32_t duty_chng_end_lsch7: 1; /*The interrupt raw bit for low speed channel 7 duty change done.*/ + uint32_t reserved24: 8; + }; + uint32_t val; + } int_raw; + union { + struct { + uint32_t hstimer0_ovf: 1; /*The interrupt status bit for high speed channel0 counter overflow event.*/ + uint32_t hstimer1_ovf: 1; /*The interrupt status bit for high speed channel1 counter overflow event.*/ + uint32_t hstimer2_ovf: 1; /*The interrupt status bit for high speed channel2 counter overflow event.*/ + uint32_t hstimer3_ovf: 1; /*The interrupt status bit for high speed channel3 counter overflow event.*/ + uint32_t lstimer0_ovf: 1; /*The interrupt status bit for low speed channel0 counter overflow event.*/ + uint32_t lstimer1_ovf: 1; /*The interrupt status bit for low speed channel1 counter overflow event.*/ + uint32_t lstimer2_ovf: 1; /*The interrupt status bit for low speed channel2 counter overflow event.*/ + uint32_t lstimer3_ovf: 1; /*The interrupt status bit for low speed channel3 counter overflow event.*/ + uint32_t duty_chng_end_hsch0: 1; /*The interrupt enable bit for high speed channel 0 duty change done event.*/ + uint32_t duty_chng_end_hsch1: 1; /*The interrupt status bit for high speed channel 1 duty change done event.*/ + uint32_t duty_chng_end_hsch2: 1; /*The interrupt status bit for high speed channel 2 duty change done event.*/ + uint32_t duty_chng_end_hsch3: 1; /*The interrupt status bit for high speed channel 3 duty change done event.*/ + uint32_t duty_chng_end_hsch4: 1; /*The interrupt status bit for high speed channel 4 duty change done event.*/ + uint32_t duty_chng_end_hsch5: 1; /*The interrupt status bit for high speed channel 5 duty change done event.*/ + uint32_t duty_chng_end_hsch6: 1; /*The interrupt status bit for high speed channel 6 duty change done event.*/ + uint32_t duty_chng_end_hsch7: 1; /*The interrupt status bit for high speed channel 7 duty change done event.*/ + uint32_t duty_chng_end_lsch0: 1; /*The interrupt status bit for low speed channel 0 duty change done event.*/ + uint32_t duty_chng_end_lsch1: 1; /*The interrupt status bit for low speed channel 1 duty change done event.*/ + uint32_t duty_chng_end_lsch2: 1; /*The interrupt status bit for low speed channel 2 duty change done event.*/ + uint32_t duty_chng_end_lsch3: 1; /*The interrupt status bit for low speed channel 3 duty change done event.*/ + uint32_t duty_chng_end_lsch4: 1; /*The interrupt status bit for low speed channel 4 duty change done event.*/ + uint32_t duty_chng_end_lsch5: 1; /*The interrupt status bit for low speed channel 5 duty change done event.*/ + uint32_t duty_chng_end_lsch6: 1; /*The interrupt status bit for low speed channel 6 duty change done event.*/ + uint32_t duty_chng_end_lsch7: 1; /*The interrupt status bit for low speed channel 7 duty change done event*/ + uint32_t reserved24: 8; + }; + uint32_t val; + } int_st; + union { + struct { + uint32_t hstimer0_ovf: 1; /*The interrupt enable bit for high speed channel0 counter overflow interrupt.*/ + uint32_t hstimer1_ovf: 1; /*The interrupt enable bit for high speed channel1 counter overflow interrupt.*/ + uint32_t hstimer2_ovf: 1; /*The interrupt enable bit for high speed channel2 counter overflow interrupt.*/ + uint32_t hstimer3_ovf: 1; /*The interrupt enable bit for high speed channel3 counter overflow interrupt.*/ + uint32_t lstimer0_ovf: 1; /*The interrupt enable bit for low speed channel0 counter overflow interrupt.*/ + uint32_t lstimer1_ovf: 1; /*The interrupt enable bit for low speed channel1 counter overflow interrupt.*/ + uint32_t lstimer2_ovf: 1; /*The interrupt enable bit for low speed channel2 counter overflow interrupt.*/ + uint32_t lstimer3_ovf: 1; /*The interrupt enable bit for low speed channel3 counter overflow interrupt.*/ + uint32_t duty_chng_end_hsch0: 1; /*The interrupt enable bit for high speed channel 0 duty change done interrupt.*/ + uint32_t duty_chng_end_hsch1: 1; /*The interrupt enable bit for high speed channel 1 duty change done interrupt.*/ + uint32_t duty_chng_end_hsch2: 1; /*The interrupt enable bit for high speed channel 2 duty change done interrupt.*/ + uint32_t duty_chng_end_hsch3: 1; /*The interrupt enable bit for high speed channel 3 duty change done interrupt.*/ + uint32_t duty_chng_end_hsch4: 1; /*The interrupt enable bit for high speed channel 4 duty change done interrupt.*/ + uint32_t duty_chng_end_hsch5: 1; /*The interrupt enable bit for high speed channel 5 duty change done interrupt.*/ + uint32_t duty_chng_end_hsch6: 1; /*The interrupt enable bit for high speed channel 6 duty change done interrupt.*/ + uint32_t duty_chng_end_hsch7: 1; /*The interrupt enable bit for high speed channel 7 duty change done interrupt.*/ + uint32_t duty_chng_end_lsch0: 1; /*The interrupt enable bit for low speed channel 0 duty change done interrupt.*/ + uint32_t duty_chng_end_lsch1: 1; /*The interrupt enable bit for low speed channel 1 duty change done interrupt.*/ + uint32_t duty_chng_end_lsch2: 1; /*The interrupt enable bit for low speed channel 2 duty change done interrupt.*/ + uint32_t duty_chng_end_lsch3: 1; /*The interrupt enable bit for low speed channel 3 duty change done interrupt.*/ + uint32_t duty_chng_end_lsch4: 1; /*The interrupt enable bit for low speed channel 4 duty change done interrupt.*/ + uint32_t duty_chng_end_lsch5: 1; /*The interrupt enable bit for low speed channel 5 duty change done interrupt.*/ + uint32_t duty_chng_end_lsch6: 1; /*The interrupt enable bit for low speed channel 6 duty change done interrupt.*/ + uint32_t duty_chng_end_lsch7: 1; /*The interrupt enable bit for low speed channel 7 duty change done interrupt.*/ + uint32_t reserved24: 8; + }; + uint32_t val; + } int_ena; + union { + struct { + uint32_t hstimer0_ovf: 1; /*Set this bit to clear high speed channel0 counter overflow interrupt.*/ + uint32_t hstimer1_ovf: 1; /*Set this bit to clear high speed channel1 counter overflow interrupt.*/ + uint32_t hstimer2_ovf: 1; /*Set this bit to clear high speed channel2 counter overflow interrupt.*/ + uint32_t hstimer3_ovf: 1; /*Set this bit to clear high speed channel3 counter overflow interrupt.*/ + uint32_t lstimer0_ovf: 1; /*Set this bit to clear low speed channel0 counter overflow interrupt.*/ + uint32_t lstimer1_ovf: 1; /*Set this bit to clear low speed channel1 counter overflow interrupt.*/ + uint32_t lstimer2_ovf: 1; /*Set this bit to clear low speed channel2 counter overflow interrupt.*/ + uint32_t lstimer3_ovf: 1; /*Set this bit to clear low speed channel3 counter overflow interrupt.*/ + uint32_t duty_chng_end_hsch0: 1; /*Set this bit to clear high speed channel 0 duty change done interrupt.*/ + uint32_t duty_chng_end_hsch1: 1; /*Set this bit to clear high speed channel 1 duty change done interrupt.*/ + uint32_t duty_chng_end_hsch2: 1; /*Set this bit to clear high speed channel 2 duty change done interrupt.*/ + uint32_t duty_chng_end_hsch3: 1; /*Set this bit to clear high speed channel 3 duty change done interrupt.*/ + uint32_t duty_chng_end_hsch4: 1; /*Set this bit to clear high speed channel 4 duty change done interrupt.*/ + uint32_t duty_chng_end_hsch5: 1; /*Set this bit to clear high speed channel 5 duty change done interrupt.*/ + uint32_t duty_chng_end_hsch6: 1; /*Set this bit to clear high speed channel 6 duty change done interrupt.*/ + uint32_t duty_chng_end_hsch7: 1; /*Set this bit to clear high speed channel 7 duty change done interrupt.*/ + uint32_t duty_chng_end_lsch0: 1; /*Set this bit to clear low speed channel 0 duty change done interrupt.*/ + uint32_t duty_chng_end_lsch1: 1; /*Set this bit to clear low speed channel 1 duty change done interrupt.*/ + uint32_t duty_chng_end_lsch2: 1; /*Set this bit to clear low speed channel 2 duty change done interrupt.*/ + uint32_t duty_chng_end_lsch3: 1; /*Set this bit to clear low speed channel 3 duty change done interrupt.*/ + uint32_t duty_chng_end_lsch4: 1; /*Set this bit to clear low speed channel 4 duty change done interrupt.*/ + uint32_t duty_chng_end_lsch5: 1; /*Set this bit to clear low speed channel 5 duty change done interrupt.*/ + uint32_t duty_chng_end_lsch6: 1; /*Set this bit to clear low speed channel 6 duty change done interrupt.*/ + uint32_t duty_chng_end_lsch7: 1; /*Set this bit to clear low speed channel 7 duty change done interrupt.*/ + uint32_t reserved24: 8; + }; + uint32_t val; + } int_clr; + union { + struct { + uint32_t apb_clk_sel: 1; /*This bit decides the slow clock for LEDC low speed channels, so we want to replace the field name with slow_clk_sel*/ + uint32_t reserved1: 31; + }; + struct { + uint32_t slow_clk_sel: 1; /*This bit is used to set the frequency of slow_clk. 1'b1:80mhz 1'b0:8mhz, (only used by LEDC low speed channels/timers)*/ + uint32_t reserved: 31; + }; + uint32_t val; + } conf; + uint32_t reserved_194; + uint32_t reserved_198; + uint32_t reserved_19c; + uint32_t reserved_1a0; + uint32_t reserved_1a4; + uint32_t reserved_1a8; + uint32_t reserved_1ac; + uint32_t reserved_1b0; + uint32_t reserved_1b4; + uint32_t reserved_1b8; + uint32_t reserved_1bc; + uint32_t reserved_1c0; + uint32_t reserved_1c4; + uint32_t reserved_1c8; + uint32_t reserved_1cc; + uint32_t reserved_1d0; + uint32_t reserved_1d4; + uint32_t reserved_1d8; + uint32_t reserved_1dc; + uint32_t reserved_1e0; + uint32_t reserved_1e4; + uint32_t reserved_1e8; + uint32_t reserved_1ec; + uint32_t reserved_1f0; + uint32_t reserved_1f4; + uint32_t reserved_1f8; + uint32_t date; /*This register represents the version .*/ +} ledc_dev_t; +extern ledc_dev_t LEDC; + +#ifdef __cplusplus +} +#endif + +#endif /* _SOC_LEDC_STRUCT_H_ */ diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/mcpwm_caps.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/mcpwm_caps.h new file mode 100644 index 0000000000000..bb2ce19862264 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/mcpwm_caps.h @@ -0,0 +1,22 @@ +// 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. + +#pragma once + +#define SOC_MCPWM_PERIPH_NUM 2 ///< MCPWM peripheral number +#define SOC_MCPWM_TIMER_NUM 3 ///< Timer that each peripheral has +#define SOC_MCPWM_OP_NUM 3 ///< Operator that each peripheral has +#define SOC_MCPWM_COMPARATOR_NUM 2 ///< Comparator that each operator has +#define SOC_MCPWM_GENERATOR_NUM 2 ///< Generator that each operator has +#define SOC_MCPWM_FAULT_SIG_NUM 3 ///< Fault signal number that each peripheral has \ No newline at end of file diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/mcpwm_reg.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/mcpwm_reg.h new file mode 100644 index 0000000000000..1dce94d469424 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/mcpwm_reg.h @@ -0,0 +1,3028 @@ +// 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. +#ifndef _SOC_MCPWM_REG_H_ +#define _SOC_MCPWM_REG_H_ +#include "soc.h" + +#define REG_MCPWM_BASE(i) (DR_REG_PWM_BASE + i * (0xE000)) +#define MCPWM_CLK_CFG_REG(i) (REG_MCPWM_BASE(i) + 0x0000) +/* MCPWM_CLK_PRESCALE : R/W ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: Period of PWM_clk = 6.25ns * (PWM_CLK_PRESCALE + 1)*/ +#define MCPWM_CLK_PRESCALE 0x000000FF +#define MCPWM_CLK_PRESCALE_M ((MCPWM_CLK_PRESCALE_V)<<(MCPWM_CLK_PRESCALE_S)) +#define MCPWM_CLK_PRESCALE_V 0xFF +#define MCPWM_CLK_PRESCALE_S 0 + +#define MCPWM_TIMER0_CFG0_REG(i) (REG_MCPWM_BASE(i) + 0x0004) +/* MCPWM_TIMER0_PERIOD_UPMETHOD : R/W ;bitpos:[25:24] ;default: 2'd0 ; */ +/*description: Update method for active reg of PWM timer0 period 0: immediate + 1: TEZ 2: sync 3: TEZ or sync. TEZ here and below means timer equal zero event*/ +#define MCPWM_TIMER0_PERIOD_UPMETHOD 0x00000003 +#define MCPWM_TIMER0_PERIOD_UPMETHOD_M ((MCPWM_TIMER0_PERIOD_UPMETHOD_V)<<(MCPWM_TIMER0_PERIOD_UPMETHOD_S)) +#define MCPWM_TIMER0_PERIOD_UPMETHOD_V 0x3 +#define MCPWM_TIMER0_PERIOD_UPMETHOD_S 24 +/* MCPWM_TIMER0_PERIOD : R/W ;bitpos:[23:8] ;default: 16'h00ff ; */ +/*description: Period shadow reg of PWM timer0*/ +#define MCPWM_TIMER0_PERIOD 0x0000FFFF +#define MCPWM_TIMER0_PERIOD_M ((MCPWM_TIMER0_PERIOD_V)<<(MCPWM_TIMER0_PERIOD_S)) +#define MCPWM_TIMER0_PERIOD_V 0xFFFF +#define MCPWM_TIMER0_PERIOD_S 8 +/* MCPWM_TIMER0_PRESCALE : R/W ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: Period of PT0_clk = Period of PWM_clk * (PWM_TIMER0_PRESCALE + 1)*/ +#define MCPWM_TIMER0_PRESCALE 0x000000FF +#define MCPWM_TIMER0_PRESCALE_M ((MCPWM_TIMER0_PRESCALE_V)<<(MCPWM_TIMER0_PRESCALE_S)) +#define MCPWM_TIMER0_PRESCALE_V 0xFF +#define MCPWM_TIMER0_PRESCALE_S 0 + +#define MCPWM_TIMER0_CFG1_REG(i) (REG_MCPWM_BASE(i) + 0x0008) +/* MCPWM_TIMER0_MOD : R/W ;bitpos:[4:3] ;default: 2'h0 ; */ +/*description: PWM timer0 working mode 0: freeze 1: increase mod 2: decrease + mod 3: up-down mod*/ +#define MCPWM_TIMER0_MOD 0x00000003 +#define MCPWM_TIMER0_MOD_M ((MCPWM_TIMER0_MOD_V)<<(MCPWM_TIMER0_MOD_S)) +#define MCPWM_TIMER0_MOD_V 0x3 +#define MCPWM_TIMER0_MOD_S 3 +/* MCPWM_TIMER0_START : R/W ;bitpos:[2:0] ;default: 3'h0 ; */ +/*description: PWM timer0 start and stop control. 0: stop @ TEZ 1: stop @ TEP + 2: free run 3: start and stop @ next TEZ 4: start and stop @ next TEP. TEP here and below means timer equal period event*/ +#define MCPWM_TIMER0_START 0x00000007 +#define MCPWM_TIMER0_START_M ((MCPWM_TIMER0_START_V)<<(MCPWM_TIMER0_START_S)) +#define MCPWM_TIMER0_START_V 0x7 +#define MCPWM_TIMER0_START_S 0 + +#define MCPWM_TIMER0_SYNC_REG(i) (REG_MCPWM_BASE(i) + 0x000c) +/* MCPWM_TIMER0_PHASE : R/W ;bitpos:[20:4] ;default: 17'd0 ; */ +/*description: Phase for timer reload on sync event*/ +#define MCPWM_TIMER0_PHASE 0x0001FFFF +#define MCPWM_TIMER0_PHASE_M ((MCPWM_TIMER0_PHASE_V)<<(MCPWM_TIMER0_PHASE_S)) +#define MCPWM_TIMER0_PHASE_V 0x1FFFF +#define MCPWM_TIMER0_PHASE_S 4 +/* MCPWM_TIMER0_SYNCO_SEL : R/W ;bitpos:[3:2] ;default: 2'd0 ; */ +/*description: PWM timer0 synco selection 0: synci 1: TEZ 2: TEP else 0*/ +#define MCPWM_TIMER0_SYNCO_SEL 0x00000003 +#define MCPWM_TIMER0_SYNCO_SEL_M ((MCPWM_TIMER0_SYNCO_SEL_V)<<(MCPWM_TIMER0_SYNCO_SEL_S)) +#define MCPWM_TIMER0_SYNCO_SEL_V 0x3 +#define MCPWM_TIMER0_SYNCO_SEL_S 2 +/* MCPWM_TIMER0_SYNC_SW : R/W ;bitpos:[1] ;default: 1'h0 ; */ +/*description: Toggling this bit will trigger a software sync*/ +#define MCPWM_TIMER0_SYNC_SW (BIT(1)) +#define MCPWM_TIMER0_SYNC_SW_M (BIT(1)) +#define MCPWM_TIMER0_SYNC_SW_V 0x1 +#define MCPWM_TIMER0_SYNC_SW_S 1 +/* MCPWM_TIMER0_SYNCI_EN : R/W ;bitpos:[0] ;default: 1'h0 ; */ +/*description: When set timer reload with phase on sync input event is enabled*/ +#define MCPWM_TIMER0_SYNCI_EN (BIT(0)) +#define MCPWM_TIMER0_SYNCI_EN_M (BIT(0)) +#define MCPWM_TIMER0_SYNCI_EN_V 0x1 +#define MCPWM_TIMER0_SYNCI_EN_S 0 + +#define MCPWM_TIMER0_STATUS_REG(i) (REG_MCPWM_BASE(i) + 0x0010) +/* MCPWM_TIMER0_DIRECTION : RO ;bitpos:[16] ;default: 1'd0 ; */ +/*description: Current PWM timer0 counter direction 0: increment 1: decrement*/ +#define MCPWM_TIMER0_DIRECTION (BIT(16)) +#define MCPWM_TIMER0_DIRECTION_M (BIT(16)) +#define MCPWM_TIMER0_DIRECTION_V 0x1 +#define MCPWM_TIMER0_DIRECTION_S 16 +/* MCPWM_TIMER0_VALUE : RO ;bitpos:[15:0] ;default: 16'd0 ; */ +/*description: Current PWM timer0 counter value*/ +#define MCPWM_TIMER0_VALUE 0x0000FFFF +#define MCPWM_TIMER0_VALUE_M ((MCPWM_TIMER0_VALUE_V)<<(MCPWM_TIMER0_VALUE_S)) +#define MCPWM_TIMER0_VALUE_V 0xFFFF +#define MCPWM_TIMER0_VALUE_S 0 + +#define MCPWM_TIMER1_CFG0_REG(i) (REG_MCPWM_BASE(i) + 0x0014) +/* MCPWM_TIMER1_PERIOD_UPMETHOD : R/W ;bitpos:[25:24] ;default: 2'd0 ; */ +/*description: Update method for active reg of PWM timer1 period 0: immediate + 1: TEZ 2: sync 3: TEZ or sync*/ +#define MCPWM_TIMER1_PERIOD_UPMETHOD 0x00000003 +#define MCPWM_TIMER1_PERIOD_UPMETHOD_M ((MCPWM_TIMER1_PERIOD_UPMETHOD_V)<<(MCPWM_TIMER1_PERIOD_UPMETHOD_S)) +#define MCPWM_TIMER1_PERIOD_UPMETHOD_V 0x3 +#define MCPWM_TIMER1_PERIOD_UPMETHOD_S 24 +/* MCPWM_TIMER1_PERIOD : R/W ;bitpos:[23:8] ;default: 16'h00ff ; */ +/*description: Period shadow reg of PWM timer1*/ +#define MCPWM_TIMER1_PERIOD 0x0000FFFF +#define MCPWM_TIMER1_PERIOD_M ((MCPWM_TIMER1_PERIOD_V)<<(MCPWM_TIMER1_PERIOD_S)) +#define MCPWM_TIMER1_PERIOD_V 0xFFFF +#define MCPWM_TIMER1_PERIOD_S 8 +/* MCPWM_TIMER1_PRESCALE : R/W ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: Period of PT1_clk = Period of PWM_clk * (PWM_TIMER1_PRESCALE + 1)*/ +#define MCPWM_TIMER1_PRESCALE 0x000000FF +#define MCPWM_TIMER1_PRESCALE_M ((MCPWM_TIMER1_PRESCALE_V)<<(MCPWM_TIMER1_PRESCALE_S)) +#define MCPWM_TIMER1_PRESCALE_V 0xFF +#define MCPWM_TIMER1_PRESCALE_S 0 + +#define MCPWM_TIMER1_CFG1_REG(i) (REG_MCPWM_BASE(i) + 0x0018) +/* MCPWM_TIMER1_MOD : R/W ;bitpos:[4:3] ;default: 2'h0 ; */ +/*description: PWM timer1 working mode 0: freeze 1: increase mod 2: decrease + mod 3: up-down mod*/ +#define MCPWM_TIMER1_MOD 0x00000003 +#define MCPWM_TIMER1_MOD_M ((MCPWM_TIMER1_MOD_V)<<(MCPWM_TIMER1_MOD_S)) +#define MCPWM_TIMER1_MOD_V 0x3 +#define MCPWM_TIMER1_MOD_S 3 +/* MCPWM_TIMER1_START : R/W ;bitpos:[2:0] ;default: 3'h0 ; */ +/*description: PWM timer1 start and stop control. 0: stop @ TEZ 1: stop @ TEP + 2: free run 3: start and stop @ next TEZ 4: start and stop @ next TEP.*/ +#define MCPWM_TIMER1_START 0x00000007 +#define MCPWM_TIMER1_START_M ((MCPWM_TIMER1_START_V)<<(MCPWM_TIMER1_START_S)) +#define MCPWM_TIMER1_START_V 0x7 +#define MCPWM_TIMER1_START_S 0 + +#define MCPWM_TIMER1_SYNC_REG(i) (REG_MCPWM_BASE(i) + 0x001c) +/* MCPWM_TIMER1_PHASE : R/W ;bitpos:[20:4] ;default: 17'd0 ; */ +/*description: Phase for timer reload on sync event*/ +#define MCPWM_TIMER1_PHASE 0x0001FFFF +#define MCPWM_TIMER1_PHASE_M ((MCPWM_TIMER1_PHASE_V)<<(MCPWM_TIMER1_PHASE_S)) +#define MCPWM_TIMER1_PHASE_V 0x1FFFF +#define MCPWM_TIMER1_PHASE_S 4 +/* MCPWM_TIMER1_SYNCO_SEL : R/W ;bitpos:[3:2] ;default: 2'd0 ; */ +/*description: PWM timer1 synco selection 0: synci 1: TEZ 2: TEP else 0*/ +#define MCPWM_TIMER1_SYNCO_SEL 0x00000003 +#define MCPWM_TIMER1_SYNCO_SEL_M ((MCPWM_TIMER1_SYNCO_SEL_V)<<(MCPWM_TIMER1_SYNCO_SEL_S)) +#define MCPWM_TIMER1_SYNCO_SEL_V 0x3 +#define MCPWM_TIMER1_SYNCO_SEL_S 2 +/* MCPWM_TIMER1_SYNC_SW : R/W ;bitpos:[1] ;default: 1'h0 ; */ +/*description: Toggling this bit will trigger a software sync*/ +#define MCPWM_TIMER1_SYNC_SW (BIT(1)) +#define MCPWM_TIMER1_SYNC_SW_M (BIT(1)) +#define MCPWM_TIMER1_SYNC_SW_V 0x1 +#define MCPWM_TIMER1_SYNC_SW_S 1 +/* MCPWM_TIMER1_SYNCI_EN : R/W ;bitpos:[0] ;default: 1'h0 ; */ +/*description: When set timer reload with phase on sync input event is enabled*/ +#define MCPWM_TIMER1_SYNCI_EN (BIT(0)) +#define MCPWM_TIMER1_SYNCI_EN_M (BIT(0)) +#define MCPWM_TIMER1_SYNCI_EN_V 0x1 +#define MCPWM_TIMER1_SYNCI_EN_S 0 + +#define MCPWM_TIMER1_STATUS_REG(i) (REG_MCPWM_BASE(i) + 0x0020) +/* MCPWM_TIMER1_DIRECTION : RO ;bitpos:[16] ;default: 1'd0 ; */ +/*description: Current PWM timer1 counter direction 0: increment 1: decrement*/ +#define MCPWM_TIMER1_DIRECTION (BIT(16)) +#define MCPWM_TIMER1_DIRECTION_M (BIT(16)) +#define MCPWM_TIMER1_DIRECTION_V 0x1 +#define MCPWM_TIMER1_DIRECTION_S 16 +/* MCPWM_TIMER1_VALUE : RO ;bitpos:[15:0] ;default: 16'd0 ; */ +/*description: Current PWM timer1 counter value*/ +#define MCPWM_TIMER1_VALUE 0x0000FFFF +#define MCPWM_TIMER1_VALUE_M ((MCPWM_TIMER1_VALUE_V)<<(MCPWM_TIMER1_VALUE_S)) +#define MCPWM_TIMER1_VALUE_V 0xFFFF +#define MCPWM_TIMER1_VALUE_S 0 + +#define MCPWM_TIMER2_CFG0_REG(i) (REG_MCPWM_BASE(i) + 0x0024) +/* MCPWM_TIMER2_PERIOD_UPMETHOD : R/W ;bitpos:[25:24] ;default: 2'd0 ; */ +/*description: Update method for active reg of PWM timer2 period 0: immediate + 1: TEZ 2: sync 3: TEZ or sync*/ +#define MCPWM_TIMER2_PERIOD_UPMETHOD 0x00000003 +#define MCPWM_TIMER2_PERIOD_UPMETHOD_M ((MCPWM_TIMER2_PERIOD_UPMETHOD_V)<<(MCPWM_TIMER2_PERIOD_UPMETHOD_S)) +#define MCPWM_TIMER2_PERIOD_UPMETHOD_V 0x3 +#define MCPWM_TIMER2_PERIOD_UPMETHOD_S 24 +/* MCPWM_TIMER2_PERIOD : R/W ;bitpos:[23:8] ;default: 16'h00ff ; */ +/*description: Period shadow reg of PWM timer2*/ +#define MCPWM_TIMER2_PERIOD 0x0000FFFF +#define MCPWM_TIMER2_PERIOD_M ((MCPWM_TIMER2_PERIOD_V)<<(MCPWM_TIMER2_PERIOD_S)) +#define MCPWM_TIMER2_PERIOD_V 0xFFFF +#define MCPWM_TIMER2_PERIOD_S 8 +/* MCPWM_TIMER2_PRESCALE : R/W ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: Period of PT2_clk = Period of PWM_clk * (PWM_TIMER2_PRESCALE + 1)*/ +#define MCPWM_TIMER2_PRESCALE 0x000000FF +#define MCPWM_TIMER2_PRESCALE_M ((MCPWM_TIMER2_PRESCALE_V)<<(MCPWM_TIMER2_PRESCALE_S)) +#define MCPWM_TIMER2_PRESCALE_V 0xFF +#define MCPWM_TIMER2_PRESCALE_S 0 + +#define MCPWM_TIMER2_CFG1_REG(i) (REG_MCPWM_BASE(i) + 0x0028) +/* MCPWM_TIMER2_MOD : R/W ;bitpos:[4:3] ;default: 2'h0 ; */ +/*description: PWM timer2 working mode 0: freeze 1: increase mod 2: decrease + mod 3: up-down mod*/ +#define MCPWM_TIMER2_MOD 0x00000003 +#define MCPWM_TIMER2_MOD_M ((MCPWM_TIMER2_MOD_V)<<(MCPWM_TIMER2_MOD_S)) +#define MCPWM_TIMER2_MOD_V 0x3 +#define MCPWM_TIMER2_MOD_S 3 +/* MCPWM_TIMER2_START : R/W ;bitpos:[2:0] ;default: 3'h0 ; */ +/*description: PWM timer2 start and stop control. 0: stop @ TEZ 1: stop @ TEP + 2: free run 3: start and stop @ next TEZ 4: start and stop @ next TEP.*/ +#define MCPWM_TIMER2_START 0x00000007 +#define MCPWM_TIMER2_START_M ((MCPWM_TIMER2_START_V)<<(MCPWM_TIMER2_START_S)) +#define MCPWM_TIMER2_START_V 0x7 +#define MCPWM_TIMER2_START_S 0 + +#define MCPWM_TIMER2_SYNC_REG(i) (REG_MCPWM_BASE(i) + 0x002c) +/* MCPWM_TIMER2_PHASE : R/W ;bitpos:[20:4] ;default: 17'd0 ; */ +/*description: Phase for timer reload on sync event*/ +#define MCPWM_TIMER2_PHASE 0x0001FFFF +#define MCPWM_TIMER2_PHASE_M ((MCPWM_TIMER2_PHASE_V)<<(MCPWM_TIMER2_PHASE_S)) +#define MCPWM_TIMER2_PHASE_V 0x1FFFF +#define MCPWM_TIMER2_PHASE_S 4 +/* MCPWM_TIMER2_SYNCO_SEL : R/W ;bitpos:[3:2] ;default: 2'd0 ; */ +/*description: PWM timer2 synco selection 0: synci 1: TEZ 2: TEP else 0*/ +#define MCPWM_TIMER2_SYNCO_SEL 0x00000003 +#define MCPWM_TIMER2_SYNCO_SEL_M ((MCPWM_TIMER2_SYNCO_SEL_V)<<(MCPWM_TIMER2_SYNCO_SEL_S)) +#define MCPWM_TIMER2_SYNCO_SEL_V 0x3 +#define MCPWM_TIMER2_SYNCO_SEL_S 2 +/* MCPWM_TIMER2_SYNC_SW : R/W ;bitpos:[1] ;default: 1'h0 ; */ +/*description: Toggling this bit will trigger a software sync*/ +#define MCPWM_TIMER2_SYNC_SW (BIT(1)) +#define MCPWM_TIMER2_SYNC_SW_M (BIT(1)) +#define MCPWM_TIMER2_SYNC_SW_V 0x1 +#define MCPWM_TIMER2_SYNC_SW_S 1 +/* MCPWM_TIMER2_SYNCI_EN : R/W ;bitpos:[0] ;default: 1'h0 ; */ +/*description: When set timer reload with phase on sync input event is enabled*/ +#define MCPWM_TIMER2_SYNCI_EN (BIT(0)) +#define MCPWM_TIMER2_SYNCI_EN_M (BIT(0)) +#define MCPWM_TIMER2_SYNCI_EN_V 0x1 +#define MCPWM_TIMER2_SYNCI_EN_S 0 + +#define MCPWM_TIMER2_STATUS_REG(i) (REG_MCPWM_BASE(i) + 0x0030) +/* MCPWM_TIMER2_DIRECTION : RO ;bitpos:[16] ;default: 1'd0 ; */ +/*description: Current PWM timer2 counter direction 0: increment 1: decrement*/ +#define MCPWM_TIMER2_DIRECTION (BIT(16)) +#define MCPWM_TIMER2_DIRECTION_M (BIT(16)) +#define MCPWM_TIMER2_DIRECTION_V 0x1 +#define MCPWM_TIMER2_DIRECTION_S 16 +/* MCPWM_TIMER2_VALUE : RO ;bitpos:[15:0] ;default: 16'd0 ; */ +/*description: Current PWM timer2 counter value*/ +#define MCPWM_TIMER2_VALUE 0x0000FFFF +#define MCPWM_TIMER2_VALUE_M ((MCPWM_TIMER2_VALUE_V)<<(MCPWM_TIMER2_VALUE_S)) +#define MCPWM_TIMER2_VALUE_V 0xFFFF +#define MCPWM_TIMER2_VALUE_S 0 + +#define MCPWM_TIMER_SYNCI_CFG_REG(i) (REG_MCPWM_BASE(i) + 0x0034) +/* MCPWM_EXTERNAL_SYNCI2_INVERT : R/W ;bitpos:[11] ;default: 1'd0 ; */ +/*description: Onvert SYNC2 from GPIO matrix*/ +#define MCPWM_EXTERNAL_SYNCI2_INVERT (BIT(11)) +#define MCPWM_EXTERNAL_SYNCI2_INVERT_M (BIT(11)) +#define MCPWM_EXTERNAL_SYNCI2_INVERT_V 0x1 +#define MCPWM_EXTERNAL_SYNCI2_INVERT_S 11 +/* MCPWM_EXTERNAL_SYNCI1_INVERT : R/W ;bitpos:[10] ;default: 1'd0 ; */ +/*description: Invert SYNC1 from GPIO matrix*/ +#define MCPWM_EXTERNAL_SYNCI1_INVERT (BIT(10)) +#define MCPWM_EXTERNAL_SYNCI1_INVERT_M (BIT(10)) +#define MCPWM_EXTERNAL_SYNCI1_INVERT_V 0x1 +#define MCPWM_EXTERNAL_SYNCI1_INVERT_S 10 +/* MCPWM_EXTERNAL_SYNCI0_INVERT : R/W ;bitpos:[9] ;default: 1'd0 ; */ +/*description: Invert SYNC0 from GPIO matrix*/ +#define MCPWM_EXTERNAL_SYNCI0_INVERT (BIT(9)) +#define MCPWM_EXTERNAL_SYNCI0_INVERT_M (BIT(9)) +#define MCPWM_EXTERNAL_SYNCI0_INVERT_V 0x1 +#define MCPWM_EXTERNAL_SYNCI0_INVERT_S 9 +/* MCPWM_TIMER2_SYNCISEL : R/W ;bitpos:[8:6] ;default: 3'd0 ; */ +/*description: Select sync input for PWM timer2 1: PWM timer0 synco 2: PWM + timer1 synco 3: PWM timer2 synco 4: SYNC0 from GPIO matrix 5: SYNC1 from GPIO matrix 6: SYNC2 from GPIO matrix other values: no sync input selected*/ +#define MCPWM_TIMER2_SYNCISEL 0x00000007 +#define MCPWM_TIMER2_SYNCISEL_M ((MCPWM_TIMER2_SYNCISEL_V)<<(MCPWM_TIMER2_SYNCISEL_S)) +#define MCPWM_TIMER2_SYNCISEL_V 0x7 +#define MCPWM_TIMER2_SYNCISEL_S 6 +/* MCPWM_TIMER1_SYNCISEL : R/W ;bitpos:[5:3] ;default: 3'd0 ; */ +/*description: Select sync input for PWM timer1 1: PWM timer0 synco 2: PWM + timer1 synco 3: PWM timer2 synco 4: SYNC0 from GPIO matrix 5: SYNC1 from GPIO matrix 6: SYNC2 from GPIO matrix other values: no sync input selected*/ +#define MCPWM_TIMER1_SYNCISEL 0x00000007 +#define MCPWM_TIMER1_SYNCISEL_M ((MCPWM_TIMER1_SYNCISEL_V)<<(MCPWM_TIMER1_SYNCISEL_S)) +#define MCPWM_TIMER1_SYNCISEL_V 0x7 +#define MCPWM_TIMER1_SYNCISEL_S 3 +/* MCPWM_TIMER0_SYNCISEL : R/W ;bitpos:[2:0] ;default: 3'd0 ; */ +/*description: Select sync input for PWM timer0 1: PWM timer0 synco 2: PWM + timer1 synco 3: PWM timer2 synco 4: SYNC0 from GPIO matrix 5: SYNC1 from GPIO matrix 6: SYNC2 from GPIO matrix other values: no sync input selected*/ +#define MCPWM_TIMER0_SYNCISEL 0x00000007 +#define MCPWM_TIMER0_SYNCISEL_M ((MCPWM_TIMER0_SYNCISEL_V)<<(MCPWM_TIMER0_SYNCISEL_S)) +#define MCPWM_TIMER0_SYNCISEL_V 0x7 +#define MCPWM_TIMER0_SYNCISEL_S 0 + +#define MCPWM_OPERATOR_TIMERSEL_REG(i) (REG_MCPWM_BASE(i) + 0x0038) +/* MCPWM_OPERATOR2_TIMERSEL : R/W ;bitpos:[5:4] ;default: 2'd0 ; */ +/*description: Select which PWM timer's is the timing reference for PWM operator2 + 0: timer0 1: timer1 2: timer2*/ +#define MCPWM_OPERATOR2_TIMERSEL 0x00000003 +#define MCPWM_OPERATOR2_TIMERSEL_M ((MCPWM_OPERATOR2_TIMERSEL_V)<<(MCPWM_OPERATOR2_TIMERSEL_S)) +#define MCPWM_OPERATOR2_TIMERSEL_V 0x3 +#define MCPWM_OPERATOR2_TIMERSEL_S 4 +/* MCPWM_OPERATOR1_TIMERSEL : R/W ;bitpos:[3:2] ;default: 2'd0 ; */ +/*description: Select which PWM timer's is the timing reference for PWM operator1 + 0: timer0 1: timer1 2: timer2*/ +#define MCPWM_OPERATOR1_TIMERSEL 0x00000003 +#define MCPWM_OPERATOR1_TIMERSEL_M ((MCPWM_OPERATOR1_TIMERSEL_V)<<(MCPWM_OPERATOR1_TIMERSEL_S)) +#define MCPWM_OPERATOR1_TIMERSEL_V 0x3 +#define MCPWM_OPERATOR1_TIMERSEL_S 2 +/* MCPWM_OPERATOR0_TIMERSEL : R/W ;bitpos:[1:0] ;default: 2'd0 ; */ +/*description: Select which PWM timer's is the timing reference for PWM operator0 + 0: timer0 1: timer1 2: timer2*/ +#define MCPWM_OPERATOR0_TIMERSEL 0x00000003 +#define MCPWM_OPERATOR0_TIMERSEL_M ((MCPWM_OPERATOR0_TIMERSEL_V)<<(MCPWM_OPERATOR0_TIMERSEL_S)) +#define MCPWM_OPERATOR0_TIMERSEL_V 0x3 +#define MCPWM_OPERATOR0_TIMERSEL_S 0 + +#define MCPWM_GEN0_STMP_CFG_REG(i) (REG_MCPWM_BASE(i) + 0x003c) +/* MCPWM_GEN0_B_SHDW_FULL : RO ;bitpos:[9] ;default: 1'd0 ; */ +/*description: Set and reset by hardware. If set PWM generator 0 time stamp + B's shadow reg is filled and waiting to be transferred to B's active reg. If cleared B's active reg has been updated with shadow reg latest value*/ +#define MCPWM_GEN0_B_SHDW_FULL (BIT(9)) +#define MCPWM_GEN0_B_SHDW_FULL_M (BIT(9)) +#define MCPWM_GEN0_B_SHDW_FULL_V 0x1 +#define MCPWM_GEN0_B_SHDW_FULL_S 9 +/* MCPWM_GEN0_A_SHDW_FULL : RO ;bitpos:[8] ;default: 1'd0 ; */ +/*description: Set and reset by hardware. If set PWM generator 0 time stamp + A's shadow reg is filled and waiting to be transferred to A's active reg. If cleared A's active reg has been updated with shadow reg latest value*/ +#define MCPWM_GEN0_A_SHDW_FULL (BIT(8)) +#define MCPWM_GEN0_A_SHDW_FULL_M (BIT(8)) +#define MCPWM_GEN0_A_SHDW_FULL_V 0x1 +#define MCPWM_GEN0_A_SHDW_FULL_S 8 +/* MCPWM_GEN0_B_UPMETHOD : R/W ;bitpos:[7:4] ;default: 4'd0 ; */ +/*description: Update method for PWM generator 0 time stamp B's active reg. + 0: immediate bit0: TEZ bit1: TEP bit2: sync bit3: disable update*/ +#define MCPWM_GEN0_B_UPMETHOD 0x0000000F +#define MCPWM_GEN0_B_UPMETHOD_M ((MCPWM_GEN0_B_UPMETHOD_V)<<(MCPWM_GEN0_B_UPMETHOD_S)) +#define MCPWM_GEN0_B_UPMETHOD_V 0xF +#define MCPWM_GEN0_B_UPMETHOD_S 4 +/* MCPWM_GEN0_A_UPMETHOD : R/W ;bitpos:[3:0] ;default: 4'd0 ; */ +/*description: Update method for PWM generator 0 time stamp A's active reg. + 0: immediate bit0: TEZ bit1: TEP bit2: sync bit3: disable update*/ +#define MCPWM_GEN0_A_UPMETHOD 0x0000000F +#define MCPWM_GEN0_A_UPMETHOD_M ((MCPWM_GEN0_A_UPMETHOD_V)<<(MCPWM_GEN0_A_UPMETHOD_S)) +#define MCPWM_GEN0_A_UPMETHOD_V 0xF +#define MCPWM_GEN0_A_UPMETHOD_S 0 + +#define MCPWM_GEN0_TSTMP_A_REG(i) (REG_MCPWM_BASE(i) + 0x0040) +/* MCPWM_GEN0_A : R/W ;bitpos:[15:0] ;default: 16'd0 ; */ +/*description: PWM generator 0 time stamp A's shadow reg*/ +#define MCPWM_GEN0_A 0x0000FFFF +#define MCPWM_GEN0_A_M ((MCPWM_GEN0_A_V)<<(MCPWM_GEN0_A_S)) +#define MCPWM_GEN0_A_V 0xFFFF +#define MCPWM_GEN0_A_S 0 + +#define MCPWM_GEN0_TSTMP_B_REG(i) (REG_MCPWM_BASE(i) + 0x0044) +/* MCPWM_GEN0_B : R/W ;bitpos:[15:0] ;default: 16'd0 ; */ +/*description: PWM generator 0 time stamp B's shadow reg*/ +#define MCPWM_GEN0_B 0x0000FFFF +#define MCPWM_GEN0_B_M ((MCPWM_GEN0_B_V)<<(MCPWM_GEN0_B_S)) +#define MCPWM_GEN0_B_V 0xFFFF +#define MCPWM_GEN0_B_S 0 + +#define MCPWM_GEN0_CFG0_REG(i) (REG_MCPWM_BASE(i) + 0x0048) +/* MCPWM_GEN0_T1_SEL : R/W ;bitpos:[9:7] ;default: 3'd0 ; */ +/*description: Source selection for PWM generator 0 event_t1 take effect immediately + 0: fault_event0 1: fault_event1 2: fault_event2 3: sync_taken 4: none*/ +#define MCPWM_GEN0_T1_SEL 0x00000007 +#define MCPWM_GEN0_T1_SEL_M ((MCPWM_GEN0_T1_SEL_V)<<(MCPWM_GEN0_T1_SEL_S)) +#define MCPWM_GEN0_T1_SEL_V 0x7 +#define MCPWM_GEN0_T1_SEL_S 7 +/* MCPWM_GEN0_T0_SEL : R/W ;bitpos:[6:4] ;default: 3'd0 ; */ +/*description: Source selection for PWM generator 0 event_t0 take effect immediately + 0: fault_event0 1: fault_event1 2: fault_event2 3: sync_taken 4: none*/ +#define MCPWM_GEN0_T0_SEL 0x00000007 +#define MCPWM_GEN0_T0_SEL_M ((MCPWM_GEN0_T0_SEL_V)<<(MCPWM_GEN0_T0_SEL_S)) +#define MCPWM_GEN0_T0_SEL_V 0x7 +#define MCPWM_GEN0_T0_SEL_S 4 +/* MCPWM_GEN0_CFG_UPMETHOD : R/W ;bitpos:[3:0] ;default: 4'd0 ; */ +/*description: Update method for PWM generator 0's active reg of configuration. + 0: immediate bit0: TEZ bit1: TEP bit2: sync. bit3: disable update*/ +#define MCPWM_GEN0_CFG_UPMETHOD 0x0000000F +#define MCPWM_GEN0_CFG_UPMETHOD_M ((MCPWM_GEN0_CFG_UPMETHOD_V)<<(MCPWM_GEN0_CFG_UPMETHOD_S)) +#define MCPWM_GEN0_CFG_UPMETHOD_V 0xF +#define MCPWM_GEN0_CFG_UPMETHOD_S 0 + +#define MCPWM_GEN0_FORCE_REG(i) (REG_MCPWM_BASE(i) + 0x004c) +/* MCPWM_GEN0_B_NCIFORCE_MODE : R/W ;bitpos:[15:14] ;default: 2'd0 ; */ +/*description: Non-continuous immediate software force mode for PWM0B 0: disabled + 1: low 2: high 3: disabled*/ +#define MCPWM_GEN0_B_NCIFORCE_MODE 0x00000003 +#define MCPWM_GEN0_B_NCIFORCE_MODE_M ((MCPWM_GEN0_B_NCIFORCE_MODE_V)<<(MCPWM_GEN0_B_NCIFORCE_MODE_S)) +#define MCPWM_GEN0_B_NCIFORCE_MODE_V 0x3 +#define MCPWM_GEN0_B_NCIFORCE_MODE_S 14 +/* MCPWM_GEN0_B_NCIFORCE : R/W ;bitpos:[13] ;default: 1'd0 ; */ +/*description: Non-continuous immediate software force trigger for PWM0B a + toggle will trigger a force event*/ +#define MCPWM_GEN0_B_NCIFORCE (BIT(13)) +#define MCPWM_GEN0_B_NCIFORCE_M (BIT(13)) +#define MCPWM_GEN0_B_NCIFORCE_V 0x1 +#define MCPWM_GEN0_B_NCIFORCE_S 13 +/* MCPWM_GEN0_A_NCIFORCE_MODE : R/W ;bitpos:[12:11] ;default: 2'd0 ; */ +/*description: Non-continuous immediate software force mode for PWM0A 0: disabled + 1: low 2: high 3: disabled*/ +#define MCPWM_GEN0_A_NCIFORCE_MODE 0x00000003 +#define MCPWM_GEN0_A_NCIFORCE_MODE_M ((MCPWM_GEN0_A_NCIFORCE_MODE_V)<<(MCPWM_GEN0_A_NCIFORCE_MODE_S)) +#define MCPWM_GEN0_A_NCIFORCE_MODE_V 0x3 +#define MCPWM_GEN0_A_NCIFORCE_MODE_S 11 +/* MCPWM_GEN0_A_NCIFORCE : R/W ;bitpos:[10] ;default: 1'd0 ; */ +/*description: Non-continuous immediate software force trigger for PWM0A a + toggle will trigger a force event*/ +#define MCPWM_GEN0_A_NCIFORCE (BIT(10)) +#define MCPWM_GEN0_A_NCIFORCE_M (BIT(10)) +#define MCPWM_GEN0_A_NCIFORCE_V 0x1 +#define MCPWM_GEN0_A_NCIFORCE_S 10 +/* MCPWM_GEN0_B_CNTUFORCE_MODE : R/W ;bitpos:[9:8] ;default: 2'd0 ; */ +/*description: Continuous software force mode for PWM0B. 0: disabled 1: low + 2: high 3: disabled*/ +#define MCPWM_GEN0_B_CNTUFORCE_MODE 0x00000003 +#define MCPWM_GEN0_B_CNTUFORCE_MODE_M ((MCPWM_GEN0_B_CNTUFORCE_MODE_V)<<(MCPWM_GEN0_B_CNTUFORCE_MODE_S)) +#define MCPWM_GEN0_B_CNTUFORCE_MODE_V 0x3 +#define MCPWM_GEN0_B_CNTUFORCE_MODE_S 8 +/* MCPWM_GEN0_A_CNTUFORCE_MODE : R/W ;bitpos:[7:6] ;default: 2'd0 ; */ +/*description: Continuous software force mode for PWM0A. 0: disabled 1: low + 2: high 3: disabled*/ +#define MCPWM_GEN0_A_CNTUFORCE_MODE 0x00000003 +#define MCPWM_GEN0_A_CNTUFORCE_MODE_M ((MCPWM_GEN0_A_CNTUFORCE_MODE_V)<<(MCPWM_GEN0_A_CNTUFORCE_MODE_S)) +#define MCPWM_GEN0_A_CNTUFORCE_MODE_V 0x3 +#define MCPWM_GEN0_A_CNTUFORCE_MODE_S 6 +/* MCPWM_GEN0_CNTUFORCE_UPMETHOD : R/W ;bitpos:[5:0] ;default: 6'h20 ; */ +/*description: Update method for continuous software force of PWM generator0. + 0: immediate bit0: TEZ bit1: TEP bit2: TEA bit3: TEB bit4: sync bit5: disable update. (TEA/B here and below means an event generated when timer value equals A/B register)*/ +#define MCPWM_GEN0_CNTUFORCE_UPMETHOD 0x0000003F +#define MCPWM_GEN0_CNTUFORCE_UPMETHOD_M ((MCPWM_GEN0_CNTUFORCE_UPMETHOD_V)<<(MCPWM_GEN0_CNTUFORCE_UPMETHOD_S)) +#define MCPWM_GEN0_CNTUFORCE_UPMETHOD_V 0x3F +#define MCPWM_GEN0_CNTUFORCE_UPMETHOD_S 0 + +#define MCPWM_GEN0_A_REG(i) (REG_MCPWM_BASE(i) + 0x0050) +/* MCPWM_GEN0_A_DT1 : R/W ;bitpos:[23:22] ;default: 2'd0 ; */ +/*description: Action on PWM0A triggered by event_t1 when timer decreasing. + 0: no change 1: low 2: high 3: toggle*/ +#define MCPWM_GEN0_A_DT1 0x00000003 +#define MCPWM_GEN0_A_DT1_M ((MCPWM_GEN0_A_DT1_V)<<(MCPWM_GEN0_A_DT1_S)) +#define MCPWM_GEN0_A_DT1_V 0x3 +#define MCPWM_GEN0_A_DT1_S 22 +/* MCPWM_GEN0_A_DT0 : R/W ;bitpos:[21:20] ;default: 2'd0 ; */ +/*description: Action on PWM0A triggered by event_t0 when timer decreasing*/ +#define MCPWM_GEN0_A_DT0 0x00000003 +#define MCPWM_GEN0_A_DT0_M ((MCPWM_GEN0_A_DT0_V)<<(MCPWM_GEN0_A_DT0_S)) +#define MCPWM_GEN0_A_DT0_V 0x3 +#define MCPWM_GEN0_A_DT0_S 20 +/* MCPWM_GEN0_A_DTEB : R/W ;bitpos:[19:18] ;default: 2'd0 ; */ +/*description: Action on PWM0A triggered by event TEB when timer decreasing*/ +#define MCPWM_GEN0_A_DTEB 0x00000003 +#define MCPWM_GEN0_A_DTEB_M ((MCPWM_GEN0_A_DTEB_V)<<(MCPWM_GEN0_A_DTEB_S)) +#define MCPWM_GEN0_A_DTEB_V 0x3 +#define MCPWM_GEN0_A_DTEB_S 18 +/* MCPWM_GEN0_A_DTEA : R/W ;bitpos:[17:16] ;default: 2'd0 ; */ +/*description: Action on PWM0A triggered by event TEA when timer decreasing*/ +#define MCPWM_GEN0_A_DTEA 0x00000003 +#define MCPWM_GEN0_A_DTEA_M ((MCPWM_GEN0_A_DTEA_V)<<(MCPWM_GEN0_A_DTEA_S)) +#define MCPWM_GEN0_A_DTEA_V 0x3 +#define MCPWM_GEN0_A_DTEA_S 16 +/* MCPWM_GEN0_A_DTEP : R/W ;bitpos:[15:14] ;default: 2'd0 ; */ +/*description: Action on PWM0A triggered by event TEP when timer decreasing*/ +#define MCPWM_GEN0_A_DTEP 0x00000003 +#define MCPWM_GEN0_A_DTEP_M ((MCPWM_GEN0_A_DTEP_V)<<(MCPWM_GEN0_A_DTEP_S)) +#define MCPWM_GEN0_A_DTEP_V 0x3 +#define MCPWM_GEN0_A_DTEP_S 14 +/* MCPWM_GEN0_A_DTEZ : R/W ;bitpos:[13:12] ;default: 2'd0 ; */ +/*description: Action on PWM0A triggered by event TEZ when timer decreasing*/ +#define MCPWM_GEN0_A_DTEZ 0x00000003 +#define MCPWM_GEN0_A_DTEZ_M ((MCPWM_GEN0_A_DTEZ_V)<<(MCPWM_GEN0_A_DTEZ_S)) +#define MCPWM_GEN0_A_DTEZ_V 0x3 +#define MCPWM_GEN0_A_DTEZ_S 12 +/* MCPWM_GEN0_A_UT1 : R/W ;bitpos:[11:10] ;default: 2'd0 ; */ +/*description: Action on PWM0A triggered by event_t1 when timer increasing*/ +#define MCPWM_GEN0_A_UT1 0x00000003 +#define MCPWM_GEN0_A_UT1_M ((MCPWM_GEN0_A_UT1_V)<<(MCPWM_GEN0_A_UT1_S)) +#define MCPWM_GEN0_A_UT1_V 0x3 +#define MCPWM_GEN0_A_UT1_S 10 +/* MCPWM_GEN0_A_UT0 : R/W ;bitpos:[9:8] ;default: 2'd0 ; */ +/*description: Action on PWM0A triggered by event_t0 when timer increasing*/ +#define MCPWM_GEN0_A_UT0 0x00000003 +#define MCPWM_GEN0_A_UT0_M ((MCPWM_GEN0_A_UT0_V)<<(MCPWM_GEN0_A_UT0_S)) +#define MCPWM_GEN0_A_UT0_V 0x3 +#define MCPWM_GEN0_A_UT0_S 8 +/* MCPWM_GEN0_A_UTEB : R/W ;bitpos:[7:6] ;default: 2'd0 ; */ +/*description: Action on PWM0A triggered by event TEB when timer increasing*/ +#define MCPWM_GEN0_A_UTEB 0x00000003 +#define MCPWM_GEN0_A_UTEB_M ((MCPWM_GEN0_A_UTEB_V)<<(MCPWM_GEN0_A_UTEB_S)) +#define MCPWM_GEN0_A_UTEB_V 0x3 +#define MCPWM_GEN0_A_UTEB_S 6 +/* MCPWM_GEN0_A_UTEA : R/W ;bitpos:[5:4] ;default: 2'd0 ; */ +/*description: Action on PWM0A triggered by event TEA when timer increasing*/ +#define MCPWM_GEN0_A_UTEA 0x00000003 +#define MCPWM_GEN0_A_UTEA_M ((MCPWM_GEN0_A_UTEA_V)<<(MCPWM_GEN0_A_UTEA_S)) +#define MCPWM_GEN0_A_UTEA_V 0x3 +#define MCPWM_GEN0_A_UTEA_S 4 +/* MCPWM_GEN0_A_UTEP : R/W ;bitpos:[3:2] ;default: 2'd0 ; */ +/*description: Action on PWM0A triggered by event TEP when timer increasing*/ +#define MCPWM_GEN0_A_UTEP 0x00000003 +#define MCPWM_GEN0_A_UTEP_M ((MCPWM_GEN0_A_UTEP_V)<<(MCPWM_GEN0_A_UTEP_S)) +#define MCPWM_GEN0_A_UTEP_V 0x3 +#define MCPWM_GEN0_A_UTEP_S 2 +/* MCPWM_GEN0_A_UTEZ : R/W ;bitpos:[1:0] ;default: 2'd0 ; */ +/*description: Action on PWM0A triggered by event TEZ when timer increasing*/ +#define MCPWM_GEN0_A_UTEZ 0x00000003 +#define MCPWM_GEN0_A_UTEZ_M ((MCPWM_GEN0_A_UTEZ_V)<<(MCPWM_GEN0_A_UTEZ_S)) +#define MCPWM_GEN0_A_UTEZ_V 0x3 +#define MCPWM_GEN0_A_UTEZ_S 0 + +#define MCPWM_GEN0_B_REG(i) (REG_MCPWM_BASE(i) + 0x0054) +/* MCPWM_GEN0_B_DT1 : R/W ;bitpos:[23:22] ;default: 2'd0 ; */ +/*description: Action on PWM0B triggered by event_t1 when timer decreasing. + 0: no change 1: low 2: high 3: toggle*/ +#define MCPWM_GEN0_B_DT1 0x00000003 +#define MCPWM_GEN0_B_DT1_M ((MCPWM_GEN0_B_DT1_V)<<(MCPWM_GEN0_B_DT1_S)) +#define MCPWM_GEN0_B_DT1_V 0x3 +#define MCPWM_GEN0_B_DT1_S 22 +/* MCPWM_GEN0_B_DT0 : R/W ;bitpos:[21:20] ;default: 2'd0 ; */ +/*description: Action on PWM0B triggered by event_t0 when timer decreasing*/ +#define MCPWM_GEN0_B_DT0 0x00000003 +#define MCPWM_GEN0_B_DT0_M ((MCPWM_GEN0_B_DT0_V)<<(MCPWM_GEN0_B_DT0_S)) +#define MCPWM_GEN0_B_DT0_V 0x3 +#define MCPWM_GEN0_B_DT0_S 20 +/* MCPWM_GEN0_B_DTEB : R/W ;bitpos:[19:18] ;default: 2'd0 ; */ +/*description: Action on PWM0B triggered by event TEB when timer decreasing*/ +#define MCPWM_GEN0_B_DTEB 0x00000003 +#define MCPWM_GEN0_B_DTEB_M ((MCPWM_GEN0_B_DTEB_V)<<(MCPWM_GEN0_B_DTEB_S)) +#define MCPWM_GEN0_B_DTEB_V 0x3 +#define MCPWM_GEN0_B_DTEB_S 18 +/* MCPWM_GEN0_B_DTEA : R/W ;bitpos:[17:16] ;default: 2'd0 ; */ +/*description: Action on PWM0B triggered by event TEA when timer decreasing*/ +#define MCPWM_GEN0_B_DTEA 0x00000003 +#define MCPWM_GEN0_B_DTEA_M ((MCPWM_GEN0_B_DTEA_V)<<(MCPWM_GEN0_B_DTEA_S)) +#define MCPWM_GEN0_B_DTEA_V 0x3 +#define MCPWM_GEN0_B_DTEA_S 16 +/* MCPWM_GEN0_B_DTEP : R/W ;bitpos:[15:14] ;default: 2'd0 ; */ +/*description: Action on PWM0B triggered by event TEP when timer decreasing*/ +#define MCPWM_GEN0_B_DTEP 0x00000003 +#define MCPWM_GEN0_B_DTEP_M ((MCPWM_GEN0_B_DTEP_V)<<(MCPWM_GEN0_B_DTEP_S)) +#define MCPWM_GEN0_B_DTEP_V 0x3 +#define MCPWM_GEN0_B_DTEP_S 14 +/* MCPWM_GEN0_B_DTEZ : R/W ;bitpos:[13:12] ;default: 2'd0 ; */ +/*description: Action on PWM0B triggered by event TEZ when timer decreasing*/ +#define MCPWM_GEN0_B_DTEZ 0x00000003 +#define MCPWM_GEN0_B_DTEZ_M ((MCPWM_GEN0_B_DTEZ_V)<<(MCPWM_GEN0_B_DTEZ_S)) +#define MCPWM_GEN0_B_DTEZ_V 0x3 +#define MCPWM_GEN0_B_DTEZ_S 12 +/* MCPWM_GEN0_B_UT1 : R/W ;bitpos:[11:10] ;default: 2'd0 ; */ +/*description: Action on PWM0B triggered by event_t1 when timer increasing*/ +#define MCPWM_GEN0_B_UT1 0x00000003 +#define MCPWM_GEN0_B_UT1_M ((MCPWM_GEN0_B_UT1_V)<<(MCPWM_GEN0_B_UT1_S)) +#define MCPWM_GEN0_B_UT1_V 0x3 +#define MCPWM_GEN0_B_UT1_S 10 +/* MCPWM_GEN0_B_UT0 : R/W ;bitpos:[9:8] ;default: 2'd0 ; */ +/*description: Action on PWM0B triggered by event_t0 when timer increasing*/ +#define MCPWM_GEN0_B_UT0 0x00000003 +#define MCPWM_GEN0_B_UT0_M ((MCPWM_GEN0_B_UT0_V)<<(MCPWM_GEN0_B_UT0_S)) +#define MCPWM_GEN0_B_UT0_V 0x3 +#define MCPWM_GEN0_B_UT0_S 8 +/* MCPWM_GEN0_B_UTEB : R/W ;bitpos:[7:6] ;default: 2'd0 ; */ +/*description: Action on PWM0B triggered by event TEB when timer increasing*/ +#define MCPWM_GEN0_B_UTEB 0x00000003 +#define MCPWM_GEN0_B_UTEB_M ((MCPWM_GEN0_B_UTEB_V)<<(MCPWM_GEN0_B_UTEB_S)) +#define MCPWM_GEN0_B_UTEB_V 0x3 +#define MCPWM_GEN0_B_UTEB_S 6 +/* MCPWM_GEN0_B_UTEA : R/W ;bitpos:[5:4] ;default: 2'd0 ; */ +/*description: Action on PWM0B triggered by event TEA when timer increasing*/ +#define MCPWM_GEN0_B_UTEA 0x00000003 +#define MCPWM_GEN0_B_UTEA_M ((MCPWM_GEN0_B_UTEA_V)<<(MCPWM_GEN0_B_UTEA_S)) +#define MCPWM_GEN0_B_UTEA_V 0x3 +#define MCPWM_GEN0_B_UTEA_S 4 +/* MCPWM_GEN0_B_UTEP : R/W ;bitpos:[3:2] ;default: 2'd0 ; */ +/*description: Action on PWM0B triggered by event TEP when timer increasing*/ +#define MCPWM_GEN0_B_UTEP 0x00000003 +#define MCPWM_GEN0_B_UTEP_M ((MCPWM_GEN0_B_UTEP_V)<<(MCPWM_GEN0_B_UTEP_S)) +#define MCPWM_GEN0_B_UTEP_V 0x3 +#define MCPWM_GEN0_B_UTEP_S 2 +/* MCPWM_GEN0_B_UTEZ : R/W ;bitpos:[1:0] ;default: 2'd0 ; */ +/*description: Action on PWM0B triggered by event TEZ when timer increasing*/ +#define MCPWM_GEN0_B_UTEZ 0x00000003 +#define MCPWM_GEN0_B_UTEZ_M ((MCPWM_GEN0_B_UTEZ_V)<<(MCPWM_GEN0_B_UTEZ_S)) +#define MCPWM_GEN0_B_UTEZ_V 0x3 +#define MCPWM_GEN0_B_UTEZ_S 0 + +#define MCPWM_DT0_CFG_REG(i) (REG_MCPWM_BASE(i) + 0x0058) +/* MCPWM_DT0_CLK_SEL : R/W ;bitpos:[17] ;default: 1'd0 ; */ +/*description: Dead time generator 0 clock selection. 0: PWM_clk 1: PT_clk*/ +#define MCPWM_DT0_CLK_SEL (BIT(17)) +#define MCPWM_DT0_CLK_SEL_M (BIT(17)) +#define MCPWM_DT0_CLK_SEL_V 0x1 +#define MCPWM_DT0_CLK_SEL_S 17 +/* MCPWM_DT0_B_OUTBYPASS : R/W ;bitpos:[16] ;default: 1'd1 ; */ +/*description: S0 in documentation*/ +#define MCPWM_DT0_B_OUTBYPASS (BIT(16)) +#define MCPWM_DT0_B_OUTBYPASS_M (BIT(16)) +#define MCPWM_DT0_B_OUTBYPASS_V 0x1 +#define MCPWM_DT0_B_OUTBYPASS_S 16 +/* MCPWM_DT0_A_OUTBYPASS : R/W ;bitpos:[15] ;default: 1'd1 ; */ +/*description: S1 in documentation*/ +#define MCPWM_DT0_A_OUTBYPASS (BIT(15)) +#define MCPWM_DT0_A_OUTBYPASS_M (BIT(15)) +#define MCPWM_DT0_A_OUTBYPASS_V 0x1 +#define MCPWM_DT0_A_OUTBYPASS_S 15 +/* MCPWM_DT0_FED_OUTINVERT : R/W ;bitpos:[14] ;default: 1'd0 ; */ +/*description: S3 in documentation*/ +#define MCPWM_DT0_FED_OUTINVERT (BIT(14)) +#define MCPWM_DT0_FED_OUTINVERT_M (BIT(14)) +#define MCPWM_DT0_FED_OUTINVERT_V 0x1 +#define MCPWM_DT0_FED_OUTINVERT_S 14 +/* MCPWM_DT0_RED_OUTINVERT : R/W ;bitpos:[13] ;default: 1'd0 ; */ +/*description: S2 in documentation*/ +#define MCPWM_DT0_RED_OUTINVERT (BIT(13)) +#define MCPWM_DT0_RED_OUTINVERT_M (BIT(13)) +#define MCPWM_DT0_RED_OUTINVERT_V 0x1 +#define MCPWM_DT0_RED_OUTINVERT_S 13 +/* MCPWM_DT0_FED_INSEL : R/W ;bitpos:[12] ;default: 1'd0 ; */ +/*description: S5 in documentation*/ +#define MCPWM_DT0_FED_INSEL (BIT(12)) +#define MCPWM_DT0_FED_INSEL_M (BIT(12)) +#define MCPWM_DT0_FED_INSEL_V 0x1 +#define MCPWM_DT0_FED_INSEL_S 12 +/* MCPWM_DT0_RED_INSEL : R/W ;bitpos:[11] ;default: 1'd0 ; */ +/*description: S4 in documentation*/ +#define MCPWM_DT0_RED_INSEL (BIT(11)) +#define MCPWM_DT0_RED_INSEL_M (BIT(11)) +#define MCPWM_DT0_RED_INSEL_V 0x1 +#define MCPWM_DT0_RED_INSEL_S 11 +/* MCPWM_DT0_B_OUTSWAP : R/W ;bitpos:[10] ;default: 1'd0 ; */ +/*description: S7 in documentation*/ +#define MCPWM_DT0_B_OUTSWAP (BIT(10)) +#define MCPWM_DT0_B_OUTSWAP_M (BIT(10)) +#define MCPWM_DT0_B_OUTSWAP_V 0x1 +#define MCPWM_DT0_B_OUTSWAP_S 10 +/* MCPWM_DT0_A_OUTSWAP : R/W ;bitpos:[9] ;default: 1'd0 ; */ +/*description: S6 in documentation*/ +#define MCPWM_DT0_A_OUTSWAP (BIT(9)) +#define MCPWM_DT0_A_OUTSWAP_M (BIT(9)) +#define MCPWM_DT0_A_OUTSWAP_V 0x1 +#define MCPWM_DT0_A_OUTSWAP_S 9 +/* MCPWM_DT0_DEB_MODE : R/W ;bitpos:[8] ;default: 1'd0 ; */ +/*description: S8 in documentation dual-edge B mode 0: FED/RED take effect + on different path separately 1: FED/RED take effect on B path A out is in bypass or normal operation mode*/ +#define MCPWM_DT0_DEB_MODE (BIT(8)) +#define MCPWM_DT0_DEB_MODE_M (BIT(8)) +#define MCPWM_DT0_DEB_MODE_V 0x1 +#define MCPWM_DT0_DEB_MODE_S 8 +/* MCPWM_DT0_RED_UPMETHOD : R/W ;bitpos:[7:4] ;default: 4'd0 ; */ +/*description: Update method for RED (rising edge delay) active reg. 0: immediate + bit0: TEZ bit1: TEP bit2: sync bit3: disable update*/ +#define MCPWM_DT0_RED_UPMETHOD 0x0000000F +#define MCPWM_DT0_RED_UPMETHOD_M ((MCPWM_DT0_RED_UPMETHOD_V)<<(MCPWM_DT0_RED_UPMETHOD_S)) +#define MCPWM_DT0_RED_UPMETHOD_V 0xF +#define MCPWM_DT0_RED_UPMETHOD_S 4 +/* MCPWM_DT0_FED_UPMETHOD : R/W ;bitpos:[3:0] ;default: 4'd0 ; */ +/*description: Update method for FED (falling edge delay) active reg. 0: immediate + bit0: TEZ bit1: TEP bit2: sync bit3: disable update*/ +#define MCPWM_DT0_FED_UPMETHOD 0x0000000F +#define MCPWM_DT0_FED_UPMETHOD_M ((MCPWM_DT0_FED_UPMETHOD_V)<<(MCPWM_DT0_FED_UPMETHOD_S)) +#define MCPWM_DT0_FED_UPMETHOD_V 0xF +#define MCPWM_DT0_FED_UPMETHOD_S 0 + +#define MCPWM_DT0_FED_CFG_REG(i) (REG_MCPWM_BASE(i) + 0x005c) +/* MCPWM_DT0_FED : R/W ;bitpos:[15:0] ;default: 16'd0 ; */ +/*description: Shadow reg for FED*/ +#define MCPWM_DT0_FED 0x0000FFFF +#define MCPWM_DT0_FED_M ((MCPWM_DT0_FED_V)<<(MCPWM_DT0_FED_S)) +#define MCPWM_DT0_FED_V 0xFFFF +#define MCPWM_DT0_FED_S 0 + +#define MCPWM_DT0_RED_CFG_REG(i) (REG_MCPWM_BASE(i) + 0x0060) +/* MCPWM_DT0_RED : R/W ;bitpos:[15:0] ;default: 16'd0 ; */ +/*description: Shadow reg for RED*/ +#define MCPWM_DT0_RED 0x0000FFFF +#define MCPWM_DT0_RED_M ((MCPWM_DT0_RED_V)<<(MCPWM_DT0_RED_S)) +#define MCPWM_DT0_RED_V 0xFFFF +#define MCPWM_DT0_RED_S 0 + +#define MCPWM_CARRIER0_CFG_REG(i) (REG_MCPWM_BASE(i) + 0x0064) +/* MCPWM_CARRIER0_IN_INVERT : R/W ;bitpos:[13] ;default: 1'd0 ; */ +/*description: When set invert the input of PWM0A and PWM0B for this submodule*/ +#define MCPWM_CARRIER0_IN_INVERT (BIT(13)) +#define MCPWM_CARRIER0_IN_INVERT_M (BIT(13)) +#define MCPWM_CARRIER0_IN_INVERT_V 0x1 +#define MCPWM_CARRIER0_IN_INVERT_S 13 +/* MCPWM_CARRIER0_OUT_INVERT : R/W ;bitpos:[12] ;default: 1'd0 ; */ +/*description: When set invert the output of PWM0A and PWM0B for this submodule*/ +#define MCPWM_CARRIER0_OUT_INVERT (BIT(12)) +#define MCPWM_CARRIER0_OUT_INVERT_M (BIT(12)) +#define MCPWM_CARRIER0_OUT_INVERT_V 0x1 +#define MCPWM_CARRIER0_OUT_INVERT_S 12 +/* MCPWM_CARRIER0_OSHWTH : R/W ;bitpos:[11:8] ;default: 4'd0 ; */ +/*description: Width of the fist pulse in number of periods of the carrier*/ +#define MCPWM_CARRIER0_OSHWTH 0x0000000F +#define MCPWM_CARRIER0_OSHWTH_M ((MCPWM_CARRIER0_OSHWTH_V)<<(MCPWM_CARRIER0_OSHWTH_S)) +#define MCPWM_CARRIER0_OSHWTH_V 0xF +#define MCPWM_CARRIER0_OSHWTH_S 8 +/* MCPWM_CARRIER0_DUTY : R/W ;bitpos:[7:5] ;default: 3'd0 ; */ +/*description: Carrier duty selection. Duty = PWM_CARRIER0_DUTY / 8*/ +#define MCPWM_CARRIER0_DUTY 0x00000007 +#define MCPWM_CARRIER0_DUTY_M ((MCPWM_CARRIER0_DUTY_V)<<(MCPWM_CARRIER0_DUTY_S)) +#define MCPWM_CARRIER0_DUTY_V 0x7 +#define MCPWM_CARRIER0_DUTY_S 5 +/* MCPWM_CARRIER0_PRESCALE : R/W ;bitpos:[4:1] ;default: 4'd0 ; */ +/*description: PWM carrier0 clock (PC_clk) prescale value. Period of PC_clk + = period of PWM_clk * (PWM_CARRIER0_PRESCALE + 1)*/ +#define MCPWM_CARRIER0_PRESCALE 0x0000000F +#define MCPWM_CARRIER0_PRESCALE_M ((MCPWM_CARRIER0_PRESCALE_V)<<(MCPWM_CARRIER0_PRESCALE_S)) +#define MCPWM_CARRIER0_PRESCALE_V 0xF +#define MCPWM_CARRIER0_PRESCALE_S 1 +/* MCPWM_CARRIER0_EN : R/W ;bitpos:[0] ;default: 1'd0 ; */ +/*description: When set carrier0 function is enabled. When cleared carrier0 is bypassed*/ +#define MCPWM_CARRIER0_EN (BIT(0)) +#define MCPWM_CARRIER0_EN_M (BIT(0)) +#define MCPWM_CARRIER0_EN_V 0x1 +#define MCPWM_CARRIER0_EN_S 0 + +#define MCPWM_FH0_CFG0_REG(i) (REG_MCPWM_BASE(i) + 0x0068) +/* MCPWM_FH0_B_OST_U : R/W ;bitpos:[23:22] ;default: 2'd0 ; */ +/*description: One-shot mode action on PWM0B when fault event occurs and timer + is increasing. 0: do nothing 1: force lo 2: force hi 3: toggle*/ +#define MCPWM_FH0_B_OST_U 0x00000003 +#define MCPWM_FH0_B_OST_U_M ((MCPWM_FH0_B_OST_U_V)<<(MCPWM_FH0_B_OST_U_S)) +#define MCPWM_FH0_B_OST_U_V 0x3 +#define MCPWM_FH0_B_OST_U_S 22 +/* MCPWM_FH0_B_OST_D : R/W ;bitpos:[21:20] ;default: 2'd0 ; */ +/*description: One-shot mode action on PWM0B when fault event occurs and timer + is decreasing. 0: do nothing 1: force lo 2: force hi 3: toggle*/ +#define MCPWM_FH0_B_OST_D 0x00000003 +#define MCPWM_FH0_B_OST_D_M ((MCPWM_FH0_B_OST_D_V)<<(MCPWM_FH0_B_OST_D_S)) +#define MCPWM_FH0_B_OST_D_V 0x3 +#define MCPWM_FH0_B_OST_D_S 20 +/* MCPWM_FH0_B_CBC_U : R/W ;bitpos:[19:18] ;default: 2'd0 ; */ +/*description: Cycle-by-cycle mode action on PWM0B when fault event occurs and + timer is increasing. 0: do nothing 1: force lo 2: force hi 3: toggle*/ +#define MCPWM_FH0_B_CBC_U 0x00000003 +#define MCPWM_FH0_B_CBC_U_M ((MCPWM_FH0_B_CBC_U_V)<<(MCPWM_FH0_B_CBC_U_S)) +#define MCPWM_FH0_B_CBC_U_V 0x3 +#define MCPWM_FH0_B_CBC_U_S 18 +/* MCPWM_FH0_B_CBC_D : R/W ;bitpos:[17:16] ;default: 2'd0 ; */ +/*description: Cycle-by-cycle mode action on PWM0B when fault event occurs and + timer is decreasing. 0: do nothing 1: force lo 2: force hi 3: toggle*/ +#define MCPWM_FH0_B_CBC_D 0x00000003 +#define MCPWM_FH0_B_CBC_D_M ((MCPWM_FH0_B_CBC_D_V)<<(MCPWM_FH0_B_CBC_D_S)) +#define MCPWM_FH0_B_CBC_D_V 0x3 +#define MCPWM_FH0_B_CBC_D_S 16 +/* MCPWM_FH0_A_OST_U : R/W ;bitpos:[15:14] ;default: 2'd0 ; */ +/*description: One-shot mode action on PWM0A when fault event occurs and timer + is increasing. 0: do nothing 1: force lo 2: force hi 3: toggle*/ +#define MCPWM_FH0_A_OST_U 0x00000003 +#define MCPWM_FH0_A_OST_U_M ((MCPWM_FH0_A_OST_U_V)<<(MCPWM_FH0_A_OST_U_S)) +#define MCPWM_FH0_A_OST_U_V 0x3 +#define MCPWM_FH0_A_OST_U_S 14 +/* MCPWM_FH0_A_OST_D : R/W ;bitpos:[13:12] ;default: 2'd0 ; */ +/*description: One-shot mode action on PWM0A when fault event occurs and timer + is decreasing. 0: do nothing 1: force lo 2: force hi 3: toggle*/ +#define MCPWM_FH0_A_OST_D 0x00000003 +#define MCPWM_FH0_A_OST_D_M ((MCPWM_FH0_A_OST_D_V)<<(MCPWM_FH0_A_OST_D_S)) +#define MCPWM_FH0_A_OST_D_V 0x3 +#define MCPWM_FH0_A_OST_D_S 12 +/* MCPWM_FH0_A_CBC_U : R/W ;bitpos:[11:10] ;default: 2'd0 ; */ +/*description: Cycle-by-cycle mode action on PWM0A when fault event occurs and + timer is increasing. 0: do nothing 1: force lo 2: force hi 3: toggle*/ +#define MCPWM_FH0_A_CBC_U 0x00000003 +#define MCPWM_FH0_A_CBC_U_M ((MCPWM_FH0_A_CBC_U_V)<<(MCPWM_FH0_A_CBC_U_S)) +#define MCPWM_FH0_A_CBC_U_V 0x3 +#define MCPWM_FH0_A_CBC_U_S 10 +/* MCPWM_FH0_A_CBC_D : R/W ;bitpos:[9:8] ;default: 2'd0 ; */ +/*description: Cycle-by-cycle mode action on PWM0A when fault event occurs and + timer is decreasing. 0: do nothing 1: force lo 2: force hi 3: toggle*/ +#define MCPWM_FH0_A_CBC_D 0x00000003 +#define MCPWM_FH0_A_CBC_D_M ((MCPWM_FH0_A_CBC_D_V)<<(MCPWM_FH0_A_CBC_D_S)) +#define MCPWM_FH0_A_CBC_D_V 0x3 +#define MCPWM_FH0_A_CBC_D_S 8 +/* MCPWM_FH0_F0_OST : R/W ;bitpos:[7] ;default: 1'd0 ; */ +/*description: event_f0 will trigger one-shot mode action. 0: disable 1: enable*/ +#define MCPWM_FH0_F0_OST (BIT(7)) +#define MCPWM_FH0_F0_OST_M (BIT(7)) +#define MCPWM_FH0_F0_OST_V 0x1 +#define MCPWM_FH0_F0_OST_S 7 +/* MCPWM_FH0_F1_OST : R/W ;bitpos:[6] ;default: 1'd0 ; */ +/*description: event_f1 will trigger one-shot mode action. 0: disable 1: enable*/ +#define MCPWM_FH0_F1_OST (BIT(6)) +#define MCPWM_FH0_F1_OST_M (BIT(6)) +#define MCPWM_FH0_F1_OST_V 0x1 +#define MCPWM_FH0_F1_OST_S 6 +/* MCPWM_FH0_F2_OST : R/W ;bitpos:[5] ;default: 1'd0 ; */ +/*description: event_f2 will trigger one-shot mode action. 0: disable 1: enable*/ +#define MCPWM_FH0_F2_OST (BIT(5)) +#define MCPWM_FH0_F2_OST_M (BIT(5)) +#define MCPWM_FH0_F2_OST_V 0x1 +#define MCPWM_FH0_F2_OST_S 5 +/* MCPWM_FH0_SW_OST : R/W ;bitpos:[4] ;default: 1'd0 ; */ +/*description: Enable register for software force one-shot mode action. 0: disable 1: enable*/ +#define MCPWM_FH0_SW_OST (BIT(4)) +#define MCPWM_FH0_SW_OST_M (BIT(4)) +#define MCPWM_FH0_SW_OST_V 0x1 +#define MCPWM_FH0_SW_OST_S 4 +/* MCPWM_FH0_F0_CBC : R/W ;bitpos:[3] ;default: 1'd0 ; */ +/*description: event_f0 will trigger cycle-by-cycle mode action. 0: disable 1: enable*/ +#define MCPWM_FH0_F0_CBC (BIT(3)) +#define MCPWM_FH0_F0_CBC_M (BIT(3)) +#define MCPWM_FH0_F0_CBC_V 0x1 +#define MCPWM_FH0_F0_CBC_S 3 +/* MCPWM_FH0_F1_CBC : R/W ;bitpos:[2] ;default: 1'd0 ; */ +/*description: event_f1 will trigger cycle-by-cycle mode action. 0: disable 1: enable*/ +#define MCPWM_FH0_F1_CBC (BIT(2)) +#define MCPWM_FH0_F1_CBC_M (BIT(2)) +#define MCPWM_FH0_F1_CBC_V 0x1 +#define MCPWM_FH0_F1_CBC_S 2 +/* MCPWM_FH0_F2_CBC : R/W ;bitpos:[1] ;default: 1'd0 ; */ +/*description: event_f2 will trigger cycle-by-cycle mode action. 0: disable 1: enable*/ +#define MCPWM_FH0_F2_CBC (BIT(1)) +#define MCPWM_FH0_F2_CBC_M (BIT(1)) +#define MCPWM_FH0_F2_CBC_V 0x1 +#define MCPWM_FH0_F2_CBC_S 1 +/* MCPWM_FH0_SW_CBC : R/W ;bitpos:[0] ;default: 1'd0 ; */ +/*description: Enable register for software force cycle-by-cycle mode action. + 0: disable 1: enable*/ +#define MCPWM_FH0_SW_CBC (BIT(0)) +#define MCPWM_FH0_SW_CBC_M (BIT(0)) +#define MCPWM_FH0_SW_CBC_V 0x1 +#define MCPWM_FH0_SW_CBC_S 0 + +#define MCPWM_FH0_CFG1_REG(i) (REG_MCPWM_BASE(i) + 0x006c) +/* MCPWM_FH0_FORCE_OST : R/W ;bitpos:[4] ;default: 1'd0 ; */ +/*description: A toggle (software negation of value of this bit) triggers a + one-shot mode action*/ +#define MCPWM_FH0_FORCE_OST (BIT(4)) +#define MCPWM_FH0_FORCE_OST_M (BIT(4)) +#define MCPWM_FH0_FORCE_OST_V 0x1 +#define MCPWM_FH0_FORCE_OST_S 4 +/* MCPWM_FH0_FORCE_CBC : R/W ;bitpos:[3] ;default: 1'd0 ; */ +/*description: A toggle triggers a cycle-by-cycle mode action*/ +#define MCPWM_FH0_FORCE_CBC (BIT(3)) +#define MCPWM_FH0_FORCE_CBC_M (BIT(3)) +#define MCPWM_FH0_FORCE_CBC_V 0x1 +#define MCPWM_FH0_FORCE_CBC_S 3 +/* MCPWM_FH0_CBCPULSE : R/W ;bitpos:[2:1] ;default: 2'd0 ; */ +/*description: The cycle-by-cycle mode action refresh moment selection. Bit0: TEZ bit1:TEP*/ +#define MCPWM_FH0_CBCPULSE 0x00000003 +#define MCPWM_FH0_CBCPULSE_M ((MCPWM_FH0_CBCPULSE_V)<<(MCPWM_FH0_CBCPULSE_S)) +#define MCPWM_FH0_CBCPULSE_V 0x3 +#define MCPWM_FH0_CBCPULSE_S 1 +/* MCPWM_FH0_CLR_OST : R/W ;bitpos:[0] ;default: 1'd0 ; */ +/*description: A toggle will clear on going one-shot mode action*/ +#define MCPWM_FH0_CLR_OST (BIT(0)) +#define MCPWM_FH0_CLR_OST_M (BIT(0)) +#define MCPWM_FH0_CLR_OST_V 0x1 +#define MCPWM_FH0_CLR_OST_S 0 + +#define MCPWM_FH0_STATUS_REG(i) (REG_MCPWM_BASE(i) + 0x0070) +/* MCPWM_FH0_OST_ON : RO ;bitpos:[1] ;default: 1'd0 ; */ +/*description: Set and reset by hardware. If set an one-shot mode action is on going*/ +#define MCPWM_FH0_OST_ON (BIT(1)) +#define MCPWM_FH0_OST_ON_M (BIT(1)) +#define MCPWM_FH0_OST_ON_V 0x1 +#define MCPWM_FH0_OST_ON_S 1 +/* MCPWM_FH0_CBC_ON : RO ;bitpos:[0] ;default: 1'd0 ; */ +/*description: Set and reset by hardware. If set an cycle-by-cycle mode action is on going*/ +#define MCPWM_FH0_CBC_ON (BIT(0)) +#define MCPWM_FH0_CBC_ON_M (BIT(0)) +#define MCPWM_FH0_CBC_ON_V 0x1 +#define MCPWM_FH0_CBC_ON_S 0 + +#define MCPWM_GEN1_STMP_CFG_REG(i) (REG_MCPWM_BASE(i) + 0x0074) +/* MCPWM_GEN1_B_SHDW_FULL : RO ;bitpos:[9] ;default: 1'd0 ; */ +/*description: Set and reset by hardware. If set PWM generator 1 time stamp + B's shadow reg is filled and waiting to be transferred to B's active reg. If cleared B's active reg has been updated with shadow reg latest value*/ +#define MCPWM_GEN1_B_SHDW_FULL (BIT(9)) +#define MCPWM_GEN1_B_SHDW_FULL_M (BIT(9)) +#define MCPWM_GEN1_B_SHDW_FULL_V 0x1 +#define MCPWM_GEN1_B_SHDW_FULL_S 9 +/* MCPWM_GEN1_A_SHDW_FULL : RO ;bitpos:[8] ;default: 1'd0 ; */ +/*description: Set and reset by hardware. If set PWM generator 1 time stamp + A's shadow reg is filled and waiting to be transferred to A's active reg. If cleared A's active reg has been updated with shadow reg latest value*/ +#define MCPWM_GEN1_A_SHDW_FULL (BIT(8)) +#define MCPWM_GEN1_A_SHDW_FULL_M (BIT(8)) +#define MCPWM_GEN1_A_SHDW_FULL_V 0x1 +#define MCPWM_GEN1_A_SHDW_FULL_S 8 +/* MCPWM_GEN1_B_UPMETHOD : R/W ;bitpos:[7:4] ;default: 4'd0 ; */ +/*description: Update method for PWM generator 1 time stamp B's active reg. + 0: immediate bit0: TEZ bit1: TEP bit2: sync bit3: disable update*/ +#define MCPWM_GEN1_B_UPMETHOD 0x0000000F +#define MCPWM_GEN1_B_UPMETHOD_M ((MCPWM_GEN1_B_UPMETHOD_V)<<(MCPWM_GEN1_B_UPMETHOD_S)) +#define MCPWM_GEN1_B_UPMETHOD_V 0xF +#define MCPWM_GEN1_B_UPMETHOD_S 4 +/* MCPWM_GEN1_A_UPMETHOD : R/W ;bitpos:[3:0] ;default: 4'd0 ; */ +/*description: Update method for PWM generator 1 time stamp A's active reg. + 0: immediate bit0: TEZ bit1: TEP bit2: sync bit3: disable update*/ +#define MCPWM_GEN1_A_UPMETHOD 0x0000000F +#define MCPWM_GEN1_A_UPMETHOD_M ((MCPWM_GEN1_A_UPMETHOD_V)<<(MCPWM_GEN1_A_UPMETHOD_S)) +#define MCPWM_GEN1_A_UPMETHOD_V 0xF +#define MCPWM_GEN1_A_UPMETHOD_S 0 + +#define MCPWM_GEN1_TSTMP_A_REG(i) (REG_MCPWM_BASE(i) + 0x0078) +/* MCPWM_GEN1_A : R/W ;bitpos:[15:0] ;default: 16'd0 ; */ +/*description: PWM generator 1 time stamp A's shadow reg*/ +#define MCPWM_GEN1_A 0x0000FFFF +#define MCPWM_GEN1_A_M ((MCPWM_GEN1_A_V)<<(MCPWM_GEN1_A_S)) +#define MCPWM_GEN1_A_V 0xFFFF +#define MCPWM_GEN1_A_S 0 + +#define MCPWM_GEN1_TSTMP_B_REG(i) (REG_MCPWM_BASE(i) + 0x007c) +/* MCPWM_GEN1_B : R/W ;bitpos:[15:0] ;default: 16'd0 ; */ +/*description: PWM generator 1 time stamp B's shadow reg*/ +#define MCPWM_GEN1_B 0x0000FFFF +#define MCPWM_GEN1_B_M ((MCPWM_GEN1_B_V)<<(MCPWM_GEN1_B_S)) +#define MCPWM_GEN1_B_V 0xFFFF +#define MCPWM_GEN1_B_S 0 + +#define MCPWM_GEN1_CFG0_REG(i) (REG_MCPWM_BASE(i) + 0x0080) +/* MCPWM_GEN1_T1_SEL : R/W ;bitpos:[9:7] ;default: 3'd0 ; */ +/*description: Source selection for PWM generate1 event_t1 take effect immediately + 0: fault_event0 1: fault_event1 2: fault_event2 3: sync_taken 4: none*/ +#define MCPWM_GEN1_T1_SEL 0x00000007 +#define MCPWM_GEN1_T1_SEL_M ((MCPWM_GEN1_T1_SEL_V)<<(MCPWM_GEN1_T1_SEL_S)) +#define MCPWM_GEN1_T1_SEL_V 0x7 +#define MCPWM_GEN1_T1_SEL_S 7 +/* MCPWM_GEN1_T0_SEL : R/W ;bitpos:[6:4] ;default: 3'd0 ; */ +/*description: Source selection for PWM generate1 event_t0 take effect immediately + 0: fault_event0 1: fault_event1 2: fault_event2 3: sync_taken 4: none*/ +#define MCPWM_GEN1_T0_SEL 0x00000007 +#define MCPWM_GEN1_T0_SEL_M ((MCPWM_GEN1_T0_SEL_V)<<(MCPWM_GEN1_T0_SEL_S)) +#define MCPWM_GEN1_T0_SEL_V 0x7 +#define MCPWM_GEN1_T0_SEL_S 4 +/* MCPWM_GEN1_CFG_UPMETHOD : R/W ;bitpos:[3:0] ;default: 4'd0 ; */ +/*description: Update method for PWM generate1's active reg of configuration. + 0: immediate bit0: TEZ bit1: TEP bit2: sync. bit3: disable update*/ +#define MCPWM_GEN1_CFG_UPMETHOD 0x0000000F +#define MCPWM_GEN1_CFG_UPMETHOD_M ((MCPWM_GEN1_CFG_UPMETHOD_V)<<(MCPWM_GEN1_CFG_UPMETHOD_S)) +#define MCPWM_GEN1_CFG_UPMETHOD_V 0xF +#define MCPWM_GEN1_CFG_UPMETHOD_S 0 + +#define MCPWM_GEN1_FORCE_REG(i) (REG_MCPWM_BASE(i) + 0x0084) +/* MCPWM_GEN1_B_NCIFORCE_MODE : R/W ;bitpos:[15:14] ;default: 2'd0 ; */ +/*description: Non-continuous immediate software force mode for PWM1B 0: disabled + 1: low 2: high 3: disabled*/ +#define MCPWM_GEN1_B_NCIFORCE_MODE 0x00000003 +#define MCPWM_GEN1_B_NCIFORCE_MODE_M ((MCPWM_GEN1_B_NCIFORCE_MODE_V)<<(MCPWM_GEN1_B_NCIFORCE_MODE_S)) +#define MCPWM_GEN1_B_NCIFORCE_MODE_V 0x3 +#define MCPWM_GEN1_B_NCIFORCE_MODE_S 14 +/* MCPWM_GEN1_B_NCIFORCE : R/W ;bitpos:[13] ;default: 1'd0 ; */ +/*description: Non-continuous immediate software force trigger for PWM1B a + toggle will trigger a force event*/ +#define MCPWM_GEN1_B_NCIFORCE (BIT(13)) +#define MCPWM_GEN1_B_NCIFORCE_M (BIT(13)) +#define MCPWM_GEN1_B_NCIFORCE_V 0x1 +#define MCPWM_GEN1_B_NCIFORCE_S 13 +/* MCPWM_GEN1_A_NCIFORCE_MODE : R/W ;bitpos:[12:11] ;default: 2'd0 ; */ +/*description: Non-continuous immediate software force mode for PWM1A 0: disabled + 1: low 2: high 3: disabled*/ +#define MCPWM_GEN1_A_NCIFORCE_MODE 0x00000003 +#define MCPWM_GEN1_A_NCIFORCE_MODE_M ((MCPWM_GEN1_A_NCIFORCE_MODE_V)<<(MCPWM_GEN1_A_NCIFORCE_MODE_S)) +#define MCPWM_GEN1_A_NCIFORCE_MODE_V 0x3 +#define MCPWM_GEN1_A_NCIFORCE_MODE_S 11 +/* MCPWM_GEN1_A_NCIFORCE : R/W ;bitpos:[10] ;default: 1'd0 ; */ +/*description: Non-continuous immediate software force trigger for PWM1A a + toggle will trigger a force event*/ +#define MCPWM_GEN1_A_NCIFORCE (BIT(10)) +#define MCPWM_GEN1_A_NCIFORCE_M (BIT(10)) +#define MCPWM_GEN1_A_NCIFORCE_V 0x1 +#define MCPWM_GEN1_A_NCIFORCE_S 10 +/* MCPWM_GEN1_B_CNTUFORCE_MODE : R/W ;bitpos:[9:8] ;default: 2'd0 ; */ +/*description: Continuous software force mode for PWM1B. 0: disabled 1: low + 2: high 3: disabled*/ +#define MCPWM_GEN1_B_CNTUFORCE_MODE 0x00000003 +#define MCPWM_GEN1_B_CNTUFORCE_MODE_M ((MCPWM_GEN1_B_CNTUFORCE_MODE_V)<<(MCPWM_GEN1_B_CNTUFORCE_MODE_S)) +#define MCPWM_GEN1_B_CNTUFORCE_MODE_V 0x3 +#define MCPWM_GEN1_B_CNTUFORCE_MODE_S 8 +/* MCPWM_GEN1_A_CNTUFORCE_MODE : R/W ;bitpos:[7:6] ;default: 2'd0 ; */ +/*description: Continuous software force mode for PWM1A. 0: disabled 1: low + 2: high 3: disabled*/ +#define MCPWM_GEN1_A_CNTUFORCE_MODE 0x00000003 +#define MCPWM_GEN1_A_CNTUFORCE_MODE_M ((MCPWM_GEN1_A_CNTUFORCE_MODE_V)<<(MCPWM_GEN1_A_CNTUFORCE_MODE_S)) +#define MCPWM_GEN1_A_CNTUFORCE_MODE_V 0x3 +#define MCPWM_GEN1_A_CNTUFORCE_MODE_S 6 +/* MCPWM_GEN1_CNTUFORCE_UPMETHOD : R/W ;bitpos:[5:0] ;default: 6'h20 ; */ +/*description: Update method for continuous software force of PWM generator1. + 0: immediate bit0: TEZ bit1: TEP bit2: TEA bit3: TEB bit4: sync bit5: disable update. (TEA/B here and below means an event generated when timer value equals A/B register)*/ +#define MCPWM_GEN1_CNTUFORCE_UPMETHOD 0x0000003F +#define MCPWM_GEN1_CNTUFORCE_UPMETHOD_M ((MCPWM_GEN1_CNTUFORCE_UPMETHOD_V)<<(MCPWM_GEN1_CNTUFORCE_UPMETHOD_S)) +#define MCPWM_GEN1_CNTUFORCE_UPMETHOD_V 0x3F +#define MCPWM_GEN1_CNTUFORCE_UPMETHOD_S 0 + +#define MCPWM_GEN1_A_REG(i) (REG_MCPWM_BASE(i) + 0x0088) +/* MCPWM_GEN1_A_DT1 : R/W ;bitpos:[23:22] ;default: 2'd0 ; */ +/*description: Action on PWM1A triggered by event_t1 when timer decreasing. + 0: no change 1: low 2: high 3: toggle*/ +#define MCPWM_GEN1_A_DT1 0x00000003 +#define MCPWM_GEN1_A_DT1_M ((MCPWM_GEN1_A_DT1_V)<<(MCPWM_GEN1_A_DT1_S)) +#define MCPWM_GEN1_A_DT1_V 0x3 +#define MCPWM_GEN1_A_DT1_S 22 +/* MCPWM_GEN1_A_DT0 : R/W ;bitpos:[21:20] ;default: 2'd0 ; */ +/*description: Action on PWM1A triggered by event_t0 when timer decreasing*/ +#define MCPWM_GEN1_A_DT0 0x00000003 +#define MCPWM_GEN1_A_DT0_M ((MCPWM_GEN1_A_DT0_V)<<(MCPWM_GEN1_A_DT0_S)) +#define MCPWM_GEN1_A_DT0_V 0x3 +#define MCPWM_GEN1_A_DT0_S 20 +/* MCPWM_GEN1_A_DTEB : R/W ;bitpos:[19:18] ;default: 2'd0 ; */ +/*description: Action on PWM1A triggered by event TEB when timer decreasing*/ +#define MCPWM_GEN1_A_DTEB 0x00000003 +#define MCPWM_GEN1_A_DTEB_M ((MCPWM_GEN1_A_DTEB_V)<<(MCPWM_GEN1_A_DTEB_S)) +#define MCPWM_GEN1_A_DTEB_V 0x3 +#define MCPWM_GEN1_A_DTEB_S 18 +/* MCPWM_GEN1_A_DTEA : R/W ;bitpos:[17:16] ;default: 2'd0 ; */ +/*description: Action on PWM1A triggered by event TEA when timer decreasing*/ +#define MCPWM_GEN1_A_DTEA 0x00000003 +#define MCPWM_GEN1_A_DTEA_M ((MCPWM_GEN1_A_DTEA_V)<<(MCPWM_GEN1_A_DTEA_S)) +#define MCPWM_GEN1_A_DTEA_V 0x3 +#define MCPWM_GEN1_A_DTEA_S 16 +/* MCPWM_GEN1_A_DTEP : R/W ;bitpos:[15:14] ;default: 2'd0 ; */ +/*description: Action on PWM1A triggered by event TEP when timer decreasing*/ +#define MCPWM_GEN1_A_DTEP 0x00000003 +#define MCPWM_GEN1_A_DTEP_M ((MCPWM_GEN1_A_DTEP_V)<<(MCPWM_GEN1_A_DTEP_S)) +#define MCPWM_GEN1_A_DTEP_V 0x3 +#define MCPWM_GEN1_A_DTEP_S 14 +/* MCPWM_GEN1_A_DTEZ : R/W ;bitpos:[13:12] ;default: 2'd0 ; */ +/*description: Action on PWM1A triggered by event TEZ when timer decreasing*/ +#define MCPWM_GEN1_A_DTEZ 0x00000003 +#define MCPWM_GEN1_A_DTEZ_M ((MCPWM_GEN1_A_DTEZ_V)<<(MCPWM_GEN1_A_DTEZ_S)) +#define MCPWM_GEN1_A_DTEZ_V 0x3 +#define MCPWM_GEN1_A_DTEZ_S 12 +/* MCPWM_GEN1_A_UT1 : R/W ;bitpos:[11:10] ;default: 2'd0 ; */ +/*description: Action on PWM1A triggered by event_t1 when timer increasing*/ +#define MCPWM_GEN1_A_UT1 0x00000003 +#define MCPWM_GEN1_A_UT1_M ((MCPWM_GEN1_A_UT1_V)<<(MCPWM_GEN1_A_UT1_S)) +#define MCPWM_GEN1_A_UT1_V 0x3 +#define MCPWM_GEN1_A_UT1_S 10 +/* MCPWM_GEN1_A_UT0 : R/W ;bitpos:[9:8] ;default: 2'd0 ; */ +/*description: Action on PWM1A triggered by event_t0 when timer increasing*/ +#define MCPWM_GEN1_A_UT0 0x00000003 +#define MCPWM_GEN1_A_UT0_M ((MCPWM_GEN1_A_UT0_V)<<(MCPWM_GEN1_A_UT0_S)) +#define MCPWM_GEN1_A_UT0_V 0x3 +#define MCPWM_GEN1_A_UT0_S 8 +/* MCPWM_GEN1_A_UTEB : R/W ;bitpos:[7:6] ;default: 2'd0 ; */ +/*description: Action on PWM1A triggered by event TEB when timer increasing*/ +#define MCPWM_GEN1_A_UTEB 0x00000003 +#define MCPWM_GEN1_A_UTEB_M ((MCPWM_GEN1_A_UTEB_V)<<(MCPWM_GEN1_A_UTEB_S)) +#define MCPWM_GEN1_A_UTEB_V 0x3 +#define MCPWM_GEN1_A_UTEB_S 6 +/* MCPWM_GEN1_A_UTEA : R/W ;bitpos:[5:4] ;default: 2'd0 ; */ +/*description: Action on PWM1A triggered by event TEA when timer increasing*/ +#define MCPWM_GEN1_A_UTEA 0x00000003 +#define MCPWM_GEN1_A_UTEA_M ((MCPWM_GEN1_A_UTEA_V)<<(MCPWM_GEN1_A_UTEA_S)) +#define MCPWM_GEN1_A_UTEA_V 0x3 +#define MCPWM_GEN1_A_UTEA_S 4 +/* MCPWM_GEN1_A_UTEP : R/W ;bitpos:[3:2] ;default: 2'd0 ; */ +/*description: Action on PWM1A triggered by event TEP when timer increasing*/ +#define MCPWM_GEN1_A_UTEP 0x00000003 +#define MCPWM_GEN1_A_UTEP_M ((MCPWM_GEN1_A_UTEP_V)<<(MCPWM_GEN1_A_UTEP_S)) +#define MCPWM_GEN1_A_UTEP_V 0x3 +#define MCPWM_GEN1_A_UTEP_S 2 +/* MCPWM_GEN1_A_UTEZ : R/W ;bitpos:[1:0] ;default: 2'd0 ; */ +/*description: Action on PWM1A triggered by event TEZ when timer increasing*/ +#define MCPWM_GEN1_A_UTEZ 0x00000003 +#define MCPWM_GEN1_A_UTEZ_M ((MCPWM_GEN1_A_UTEZ_V)<<(MCPWM_GEN1_A_UTEZ_S)) +#define MCPWM_GEN1_A_UTEZ_V 0x3 +#define MCPWM_GEN1_A_UTEZ_S 0 + +#define MCPWM_GEN1_B_REG(i) (REG_MCPWM_BASE(i) + 0x008c) +/* MCPWM_GEN1_B_DT1 : R/W ;bitpos:[23:22] ;default: 2'd0 ; */ +/*description: Action on PWM1B triggered by event_t1 when timer decreasing. + 0: no change 1: low 2: high 3: toggle*/ +#define MCPWM_GEN1_B_DT1 0x00000003 +#define MCPWM_GEN1_B_DT1_M ((MCPWM_GEN1_B_DT1_V)<<(MCPWM_GEN1_B_DT1_S)) +#define MCPWM_GEN1_B_DT1_V 0x3 +#define MCPWM_GEN1_B_DT1_S 22 +/* MCPWM_GEN1_B_DT0 : R/W ;bitpos:[21:20] ;default: 2'd0 ; */ +/*description: Action on PWM1B triggered by event_t0 when timer decreasing*/ +#define MCPWM_GEN1_B_DT0 0x00000003 +#define MCPWM_GEN1_B_DT0_M ((MCPWM_GEN1_B_DT0_V)<<(MCPWM_GEN1_B_DT0_S)) +#define MCPWM_GEN1_B_DT0_V 0x3 +#define MCPWM_GEN1_B_DT0_S 20 +/* MCPWM_GEN1_B_DTEB : R/W ;bitpos:[19:18] ;default: 2'd0 ; */ +/*description: Action on PWM1B triggered by event TEB when timer decreasing*/ +#define MCPWM_GEN1_B_DTEB 0x00000003 +#define MCPWM_GEN1_B_DTEB_M ((MCPWM_GEN1_B_DTEB_V)<<(MCPWM_GEN1_B_DTEB_S)) +#define MCPWM_GEN1_B_DTEB_V 0x3 +#define MCPWM_GEN1_B_DTEB_S 18 +/* MCPWM_GEN1_B_DTEA : R/W ;bitpos:[17:16] ;default: 2'd0 ; */ +/*description: Action on PWM1B triggered by event TEA when timer decreasing*/ +#define MCPWM_GEN1_B_DTEA 0x00000003 +#define MCPWM_GEN1_B_DTEA_M ((MCPWM_GEN1_B_DTEA_V)<<(MCPWM_GEN1_B_DTEA_S)) +#define MCPWM_GEN1_B_DTEA_V 0x3 +#define MCPWM_GEN1_B_DTEA_S 16 +/* MCPWM_GEN1_B_DTEP : R/W ;bitpos:[15:14] ;default: 2'd0 ; */ +/*description: Action on PWM1B triggered by event TEP when timer decreasing*/ +#define MCPWM_GEN1_B_DTEP 0x00000003 +#define MCPWM_GEN1_B_DTEP_M ((MCPWM_GEN1_B_DTEP_V)<<(MCPWM_GEN1_B_DTEP_S)) +#define MCPWM_GEN1_B_DTEP_V 0x3 +#define MCPWM_GEN1_B_DTEP_S 14 +/* MCPWM_GEN1_B_DTEZ : R/W ;bitpos:[13:12] ;default: 2'd0 ; */ +/*description: Action on PWM1B triggered by event TEZ when timer decreasing*/ +#define MCPWM_GEN1_B_DTEZ 0x00000003 +#define MCPWM_GEN1_B_DTEZ_M ((MCPWM_GEN1_B_DTEZ_V)<<(MCPWM_GEN1_B_DTEZ_S)) +#define MCPWM_GEN1_B_DTEZ_V 0x3 +#define MCPWM_GEN1_B_DTEZ_S 12 +/* MCPWM_GEN1_B_UT1 : R/W ;bitpos:[11:10] ;default: 2'd0 ; */ +/*description: Action on PWM1B triggered by event_t1 when timer increasing*/ +#define MCPWM_GEN1_B_UT1 0x00000003 +#define MCPWM_GEN1_B_UT1_M ((MCPWM_GEN1_B_UT1_V)<<(MCPWM_GEN1_B_UT1_S)) +#define MCPWM_GEN1_B_UT1_V 0x3 +#define MCPWM_GEN1_B_UT1_S 10 +/* MCPWM_GEN1_B_UT0 : R/W ;bitpos:[9:8] ;default: 2'd0 ; */ +/*description: Action on PWM1B triggered by event_t0 when timer increasing*/ +#define MCPWM_GEN1_B_UT0 0x00000003 +#define MCPWM_GEN1_B_UT0_M ((MCPWM_GEN1_B_UT0_V)<<(MCPWM_GEN1_B_UT0_S)) +#define MCPWM_GEN1_B_UT0_V 0x3 +#define MCPWM_GEN1_B_UT0_S 8 +/* MCPWM_GEN1_B_UTEB : R/W ;bitpos:[7:6] ;default: 2'd0 ; */ +/*description: Action on PWM1B triggered by event TEB when timer increasing*/ +#define MCPWM_GEN1_B_UTEB 0x00000003 +#define MCPWM_GEN1_B_UTEB_M ((MCPWM_GEN1_B_UTEB_V)<<(MCPWM_GEN1_B_UTEB_S)) +#define MCPWM_GEN1_B_UTEB_V 0x3 +#define MCPWM_GEN1_B_UTEB_S 6 +/* MCPWM_GEN1_B_UTEA : R/W ;bitpos:[5:4] ;default: 2'd0 ; */ +/*description: Action on PWM1B triggered by event TEA when timer increasing*/ +#define MCPWM_GEN1_B_UTEA 0x00000003 +#define MCPWM_GEN1_B_UTEA_M ((MCPWM_GEN1_B_UTEA_V)<<(MCPWM_GEN1_B_UTEA_S)) +#define MCPWM_GEN1_B_UTEA_V 0x3 +#define MCPWM_GEN1_B_UTEA_S 4 +/* MCPWM_GEN1_B_UTEP : R/W ;bitpos:[3:2] ;default: 2'd0 ; */ +/*description: Action on PWM1B triggered by event TEP when timer increasing*/ +#define MCPWM_GEN1_B_UTEP 0x00000003 +#define MCPWM_GEN1_B_UTEP_M ((MCPWM_GEN1_B_UTEP_V)<<(MCPWM_GEN1_B_UTEP_S)) +#define MCPWM_GEN1_B_UTEP_V 0x3 +#define MCPWM_GEN1_B_UTEP_S 2 +/* MCPWM_GEN1_B_UTEZ : R/W ;bitpos:[1:0] ;default: 2'd0 ; */ +/*description: Action on PWM1B triggered by event TEZ when timer increasing*/ +#define MCPWM_GEN1_B_UTEZ 0x00000003 +#define MCPWM_GEN1_B_UTEZ_M ((MCPWM_GEN1_B_UTEZ_V)<<(MCPWM_GEN1_B_UTEZ_S)) +#define MCPWM_GEN1_B_UTEZ_V 0x3 +#define MCPWM_GEN1_B_UTEZ_S 0 + +#define MCPWM_DT1_CFG_REG(i) (REG_MCPWM_BASE(i) + 0x0090) +/* MCPWM_DT1_CLK_SEL : R/W ;bitpos:[17] ;default: 1'd0 ; */ +/*description: Dead time generator 1 clock selection. 0: PWM_clk 1: PT_clk*/ +#define MCPWM_DT1_CLK_SEL (BIT(17)) +#define MCPWM_DT1_CLK_SEL_M (BIT(17)) +#define MCPWM_DT1_CLK_SEL_V 0x1 +#define MCPWM_DT1_CLK_SEL_S 17 +/* MCPWM_DT1_B_OUTBYPASS : R/W ;bitpos:[16] ;default: 1'd1 ; */ +/*description: S0 in documentation*/ +#define MCPWM_DT1_B_OUTBYPASS (BIT(16)) +#define MCPWM_DT1_B_OUTBYPASS_M (BIT(16)) +#define MCPWM_DT1_B_OUTBYPASS_V 0x1 +#define MCPWM_DT1_B_OUTBYPASS_S 16 +/* MCPWM_DT1_A_OUTBYPASS : R/W ;bitpos:[15] ;default: 1'd1 ; */ +/*description: S1 in documentation*/ +#define MCPWM_DT1_A_OUTBYPASS (BIT(15)) +#define MCPWM_DT1_A_OUTBYPASS_M (BIT(15)) +#define MCPWM_DT1_A_OUTBYPASS_V 0x1 +#define MCPWM_DT1_A_OUTBYPASS_S 15 +/* MCPWM_DT1_FED_OUTINVERT : R/W ;bitpos:[14] ;default: 1'd0 ; */ +/*description: S3 in documentation*/ +#define MCPWM_DT1_FED_OUTINVERT (BIT(14)) +#define MCPWM_DT1_FED_OUTINVERT_M (BIT(14)) +#define MCPWM_DT1_FED_OUTINVERT_V 0x1 +#define MCPWM_DT1_FED_OUTINVERT_S 14 +/* MCPWM_DT1_RED_OUTINVERT : R/W ;bitpos:[13] ;default: 1'd0 ; */ +/*description: S2 in documentation*/ +#define MCPWM_DT1_RED_OUTINVERT (BIT(13)) +#define MCPWM_DT1_RED_OUTINVERT_M (BIT(13)) +#define MCPWM_DT1_RED_OUTINVERT_V 0x1 +#define MCPWM_DT1_RED_OUTINVERT_S 13 +/* MCPWM_DT1_FED_INSEL : R/W ;bitpos:[12] ;default: 1'd0 ; */ +/*description: S5 in documentation*/ +#define MCPWM_DT1_FED_INSEL (BIT(12)) +#define MCPWM_DT1_FED_INSEL_M (BIT(12)) +#define MCPWM_DT1_FED_INSEL_V 0x1 +#define MCPWM_DT1_FED_INSEL_S 12 +/* MCPWM_DT1_RED_INSEL : R/W ;bitpos:[11] ;default: 1'd0 ; */ +/*description: S4 in documentation*/ +#define MCPWM_DT1_RED_INSEL (BIT(11)) +#define MCPWM_DT1_RED_INSEL_M (BIT(11)) +#define MCPWM_DT1_RED_INSEL_V 0x1 +#define MCPWM_DT1_RED_INSEL_S 11 +/* MCPWM_DT1_B_OUTSWAP : R/W ;bitpos:[10] ;default: 1'd0 ; */ +/*description: S7 in documentation*/ +#define MCPWM_DT1_B_OUTSWAP (BIT(10)) +#define MCPWM_DT1_B_OUTSWAP_M (BIT(10)) +#define MCPWM_DT1_B_OUTSWAP_V 0x1 +#define MCPWM_DT1_B_OUTSWAP_S 10 +/* MCPWM_DT1_A_OUTSWAP : R/W ;bitpos:[9] ;default: 1'd0 ; */ +/*description: S6 in documentation*/ +#define MCPWM_DT1_A_OUTSWAP (BIT(9)) +#define MCPWM_DT1_A_OUTSWAP_M (BIT(9)) +#define MCPWM_DT1_A_OUTSWAP_V 0x1 +#define MCPWM_DT1_A_OUTSWAP_S 9 +/* MCPWM_DT1_DEB_MODE : R/W ;bitpos:[8] ;default: 1'd0 ; */ +/*description: S8 in documentation dual-edge B mode 0: FED/RED take effect + on different path separately 1: FED/RED take effect on B path A out is in bypass or normal operation mode*/ +#define MCPWM_DT1_DEB_MODE (BIT(8)) +#define MCPWM_DT1_DEB_MODE_M (BIT(8)) +#define MCPWM_DT1_DEB_MODE_V 0x1 +#define MCPWM_DT1_DEB_MODE_S 8 +/* MCPWM_DT1_RED_UPMETHOD : R/W ;bitpos:[7:4] ;default: 4'd0 ; */ +/*description: Update method for RED (rising edge delay) active reg. 0: immediate + bit0: TEZ bit1: TEP bit2: sync bit3: disable update*/ +#define MCPWM_DT1_RED_UPMETHOD 0x0000000F +#define MCPWM_DT1_RED_UPMETHOD_M ((MCPWM_DT1_RED_UPMETHOD_V)<<(MCPWM_DT1_RED_UPMETHOD_S)) +#define MCPWM_DT1_RED_UPMETHOD_V 0xF +#define MCPWM_DT1_RED_UPMETHOD_S 4 +/* MCPWM_DT1_FED_UPMETHOD : R/W ;bitpos:[3:0] ;default: 4'd0 ; */ +/*description: Update method for FED (falling edge delay) active reg. 0: immediate + bit0: TEZ bit1: TEP bit2: sync bit3: disable update*/ +#define MCPWM_DT1_FED_UPMETHOD 0x0000000F +#define MCPWM_DT1_FED_UPMETHOD_M ((MCPWM_DT1_FED_UPMETHOD_V)<<(MCPWM_DT1_FED_UPMETHOD_S)) +#define MCPWM_DT1_FED_UPMETHOD_V 0xF +#define MCPWM_DT1_FED_UPMETHOD_S 0 + +#define MCPWM_DT1_FED_CFG_REG(i) (REG_MCPWM_BASE(i) + 0x0094) +/* MCPWM_DT1_FED : R/W ;bitpos:[15:0] ;default: 16'd0 ; */ +/*description: Shadow reg for FED*/ +#define MCPWM_DT1_FED 0x0000FFFF +#define MCPWM_DT1_FED_M ((MCPWM_DT1_FED_V)<<(MCPWM_DT1_FED_S)) +#define MCPWM_DT1_FED_V 0xFFFF +#define MCPWM_DT1_FED_S 0 + +#define MCPWM_DT1_RED_CFG_REG(i) (REG_MCPWM_BASE(i) + 0x0098) +/* MCPWM_DT1_RED : R/W ;bitpos:[15:0] ;default: 16'd0 ; */ +/*description: Shadow reg for RED*/ +#define MCPWM_DT1_RED 0x0000FFFF +#define MCPWM_DT1_RED_M ((MCPWM_DT1_RED_V)<<(MCPWM_DT1_RED_S)) +#define MCPWM_DT1_RED_V 0xFFFF +#define MCPWM_DT1_RED_S 0 + +#define MCPWM_CARRIER1_CFG_REG(i) (REG_MCPWM_BASE(i) + 0x009c) +/* MCPWM_CARRIER1_IN_INVERT : R/W ;bitpos:[13] ;default: 1'd0 ; */ +/*description: When set invert the input of PWM1A and PWM1B for this submodule*/ +#define MCPWM_CARRIER1_IN_INVERT (BIT(13)) +#define MCPWM_CARRIER1_IN_INVERT_M (BIT(13)) +#define MCPWM_CARRIER1_IN_INVERT_V 0x1 +#define MCPWM_CARRIER1_IN_INVERT_S 13 +/* MCPWM_CARRIER1_OUT_INVERT : R/W ;bitpos:[12] ;default: 1'd0 ; */ +/*description: When set invert the output of PWM1A and PWM1B for this submodule*/ +#define MCPWM_CARRIER1_OUT_INVERT (BIT(12)) +#define MCPWM_CARRIER1_OUT_INVERT_M (BIT(12)) +#define MCPWM_CARRIER1_OUT_INVERT_V 0x1 +#define MCPWM_CARRIER1_OUT_INVERT_S 12 +/* MCPWM_CARRIER1_OSHWTH : R/W ;bitpos:[11:8] ;default: 4'd0 ; */ +/*description: Width of the fist pulse in number of periods of the carrier*/ +#define MCPWM_CARRIER1_OSHWTH 0x0000000F +#define MCPWM_CARRIER1_OSHWTH_M ((MCPWM_CARRIER1_OSHWTH_V)<<(MCPWM_CARRIER1_OSHWTH_S)) +#define MCPWM_CARRIER1_OSHWTH_V 0xF +#define MCPWM_CARRIER1_OSHWTH_S 8 +/* MCPWM_CARRIER1_DUTY : R/W ;bitpos:[7:5] ;default: 3'd0 ; */ +/*description: Carrier duty selection. Duty = PWM_CARRIER1_DUTY / 8*/ +#define MCPWM_CARRIER1_DUTY 0x00000007 +#define MCPWM_CARRIER1_DUTY_M ((MCPWM_CARRIER1_DUTY_V)<<(MCPWM_CARRIER1_DUTY_S)) +#define MCPWM_CARRIER1_DUTY_V 0x7 +#define MCPWM_CARRIER1_DUTY_S 5 +/* MCPWM_CARRIER1_PRESCALE : R/W ;bitpos:[4:1] ;default: 4'd0 ; */ +/*description: PWM carrier1 clock (PC_clk) prescale value. Period of PC_clk + = period of PWM_clk * (PWM_CARRIER1_PRESCALE + 1)*/ +#define MCPWM_CARRIER1_PRESCALE 0x0000000F +#define MCPWM_CARRIER1_PRESCALE_M ((MCPWM_CARRIER1_PRESCALE_V)<<(MCPWM_CARRIER1_PRESCALE_S)) +#define MCPWM_CARRIER1_PRESCALE_V 0xF +#define MCPWM_CARRIER1_PRESCALE_S 1 +/* MCPWM_CARRIER1_EN : R/W ;bitpos:[0] ;default: 1'd0 ; */ +/*description: When set carrier1 function is enabled. When cleared carrier1 is bypassed*/ +#define MCPWM_CARRIER1_EN (BIT(0)) +#define MCPWM_CARRIER1_EN_M (BIT(0)) +#define MCPWM_CARRIER1_EN_V 0x1 +#define MCPWM_CARRIER1_EN_S 0 + +#define MCPWM_FH1_CFG0_REG(i) (REG_MCPWM_BASE(i) + 0x00a0) +/* MCPWM_FH1_B_OST_U : R/W ;bitpos:[23:22] ;default: 2'd0 ; */ +/*description: One-shot mode action on PWM1B when fault event occurs and timer + is increasing. 0: do nothing 1: force lo 2: force hi 3: toggle*/ +#define MCPWM_FH1_B_OST_U 0x00000003 +#define MCPWM_FH1_B_OST_U_M ((MCPWM_FH1_B_OST_U_V)<<(MCPWM_FH1_B_OST_U_S)) +#define MCPWM_FH1_B_OST_U_V 0x3 +#define MCPWM_FH1_B_OST_U_S 22 +/* MCPWM_FH1_B_OST_D : R/W ;bitpos:[21:20] ;default: 2'd0 ; */ +/*description: One-shot mode action on PWM1B when fault event occurs and timer + is decreasing. 0: do nothing 1: force lo 2: force hi 3: toggle*/ +#define MCPWM_FH1_B_OST_D 0x00000003 +#define MCPWM_FH1_B_OST_D_M ((MCPWM_FH1_B_OST_D_V)<<(MCPWM_FH1_B_OST_D_S)) +#define MCPWM_FH1_B_OST_D_V 0x3 +#define MCPWM_FH1_B_OST_D_S 20 +/* MCPWM_FH1_B_CBC_U : R/W ;bitpos:[19:18] ;default: 2'd0 ; */ +/*description: Cycle-by-cycle mode action on PWM1B when fault event occurs and + timer is increasing. 0: do nothing 1: force lo 2: force hi 3: toggle*/ +#define MCPWM_FH1_B_CBC_U 0x00000003 +#define MCPWM_FH1_B_CBC_U_M ((MCPWM_FH1_B_CBC_U_V)<<(MCPWM_FH1_B_CBC_U_S)) +#define MCPWM_FH1_B_CBC_U_V 0x3 +#define MCPWM_FH1_B_CBC_U_S 18 +/* MCPWM_FH1_B_CBC_D : R/W ;bitpos:[17:16] ;default: 2'd0 ; */ +/*description: Cycle-by-cycle mode action on PWM1B when fault event occurs and + timer is decreasing. 0: do nothing 1: force lo 2: force hi 3: toggle*/ +#define MCPWM_FH1_B_CBC_D 0x00000003 +#define MCPWM_FH1_B_CBC_D_M ((MCPWM_FH1_B_CBC_D_V)<<(MCPWM_FH1_B_CBC_D_S)) +#define MCPWM_FH1_B_CBC_D_V 0x3 +#define MCPWM_FH1_B_CBC_D_S 16 +/* MCPWM_FH1_A_OST_U : R/W ;bitpos:[15:14] ;default: 2'd0 ; */ +/*description: One-shot mode action on PWM1A when fault event occurs and timer + is increasing. 0: do nothing 1: force lo 2: force hi 3: toggle*/ +#define MCPWM_FH1_A_OST_U 0x00000003 +#define MCPWM_FH1_A_OST_U_M ((MCPWM_FH1_A_OST_U_V)<<(MCPWM_FH1_A_OST_U_S)) +#define MCPWM_FH1_A_OST_U_V 0x3 +#define MCPWM_FH1_A_OST_U_S 14 +/* MCPWM_FH1_A_OST_D : R/W ;bitpos:[13:12] ;default: 2'd0 ; */ +/*description: One-shot mode action on PWM1A when fault event occurs and timer + is decreasing. 0: do nothing 1: force lo 2: force hi 3: toggle*/ +#define MCPWM_FH1_A_OST_D 0x00000003 +#define MCPWM_FH1_A_OST_D_M ((MCPWM_FH1_A_OST_D_V)<<(MCPWM_FH1_A_OST_D_S)) +#define MCPWM_FH1_A_OST_D_V 0x3 +#define MCPWM_FH1_A_OST_D_S 12 +/* MCPWM_FH1_A_CBC_U : R/W ;bitpos:[11:10] ;default: 2'd0 ; */ +/*description: Cycle-by-cycle mode action on PWM1A when fault event occurs and + timer is increasing. 0: do nothing 1: force lo 2: force hi 3: toggle*/ +#define MCPWM_FH1_A_CBC_U 0x00000003 +#define MCPWM_FH1_A_CBC_U_M ((MCPWM_FH1_A_CBC_U_V)<<(MCPWM_FH1_A_CBC_U_S)) +#define MCPWM_FH1_A_CBC_U_V 0x3 +#define MCPWM_FH1_A_CBC_U_S 10 +/* MCPWM_FH1_A_CBC_D : R/W ;bitpos:[9:8] ;default: 2'd0 ; */ +/*description: Cycle-by-cycle mode action on PWM1A when fault event occurs and + timer is decreasing. 0: do nothing 1: force lo 2: force hi 3: toggle*/ +#define MCPWM_FH1_A_CBC_D 0x00000003 +#define MCPWM_FH1_A_CBC_D_M ((MCPWM_FH1_A_CBC_D_V)<<(MCPWM_FH1_A_CBC_D_S)) +#define MCPWM_FH1_A_CBC_D_V 0x3 +#define MCPWM_FH1_A_CBC_D_S 8 +/* MCPWM_FH1_F0_OST : R/W ;bitpos:[7] ;default: 1'd0 ; */ +/*description: event_f0 will trigger one-shot mode action. 0: disable 1: enable*/ +#define MCPWM_FH1_F0_OST (BIT(7)) +#define MCPWM_FH1_F0_OST_M (BIT(7)) +#define MCPWM_FH1_F0_OST_V 0x1 +#define MCPWM_FH1_F0_OST_S 7 +/* MCPWM_FH1_F1_OST : R/W ;bitpos:[6] ;default: 1'd0 ; */ +/*description: event_f1 will trigger one-shot mode action. 0: disable 1: enable*/ +#define MCPWM_FH1_F1_OST (BIT(6)) +#define MCPWM_FH1_F1_OST_M (BIT(6)) +#define MCPWM_FH1_F1_OST_V 0x1 +#define MCPWM_FH1_F1_OST_S 6 +/* MCPWM_FH1_F2_OST : R/W ;bitpos:[5] ;default: 1'd0 ; */ +/*description: event_f2 will trigger one-shot mode action. 0: disable 1: enable*/ +#define MCPWM_FH1_F2_OST (BIT(5)) +#define MCPWM_FH1_F2_OST_M (BIT(5)) +#define MCPWM_FH1_F2_OST_V 0x1 +#define MCPWM_FH1_F2_OST_S 5 +/* MCPWM_FH1_SW_OST : R/W ;bitpos:[4] ;default: 1'd0 ; */ +/*description: Enable register for software force one-shot mode action. 0: disable 1: enable*/ +#define MCPWM_FH1_SW_OST (BIT(4)) +#define MCPWM_FH1_SW_OST_M (BIT(4)) +#define MCPWM_FH1_SW_OST_V 0x1 +#define MCPWM_FH1_SW_OST_S 4 +/* MCPWM_FH1_F0_CBC : R/W ;bitpos:[3] ;default: 1'd0 ; */ +/*description: event_f0 will trigger cycle-by-cycle mode action. 0: disable 1: enable*/ +#define MCPWM_FH1_F0_CBC (BIT(3)) +#define MCPWM_FH1_F0_CBC_M (BIT(3)) +#define MCPWM_FH1_F0_CBC_V 0x1 +#define MCPWM_FH1_F0_CBC_S 3 +/* MCPWM_FH1_F1_CBC : R/W ;bitpos:[2] ;default: 1'd0 ; */ +/*description: event_f1 will trigger cycle-by-cycle mode action. 0: disable 1: enable*/ +#define MCPWM_FH1_F1_CBC (BIT(2)) +#define MCPWM_FH1_F1_CBC_M (BIT(2)) +#define MCPWM_FH1_F1_CBC_V 0x1 +#define MCPWM_FH1_F1_CBC_S 2 +/* MCPWM_FH1_F2_CBC : R/W ;bitpos:[1] ;default: 1'd0 ; */ +/*description: event_f2 will trigger cycle-by-cycle mode action. 0: disable 1: enable*/ +#define MCPWM_FH1_F2_CBC (BIT(1)) +#define MCPWM_FH1_F2_CBC_M (BIT(1)) +#define MCPWM_FH1_F2_CBC_V 0x1 +#define MCPWM_FH1_F2_CBC_S 1 +/* MCPWM_FH1_SW_CBC : R/W ;bitpos:[0] ;default: 1'd0 ; */ +/*description: Enable register for software force cycle-by-cycle mode action. + 0: disable 1: enable*/ +#define MCPWM_FH1_SW_CBC (BIT(0)) +#define MCPWM_FH1_SW_CBC_M (BIT(0)) +#define MCPWM_FH1_SW_CBC_V 0x1 +#define MCPWM_FH1_SW_CBC_S 0 + +#define MCPWM_FH1_CFG1_REG(i) (REG_MCPWM_BASE(i) + 0x00a4) +/* MCPWM_FH1_FORCE_OST : R/W ;bitpos:[4] ;default: 1'd0 ; */ +/*description: A toggle (software negation of value of this bit) triggers a + one-shot mode action*/ +#define MCPWM_FH1_FORCE_OST (BIT(4)) +#define MCPWM_FH1_FORCE_OST_M (BIT(4)) +#define MCPWM_FH1_FORCE_OST_V 0x1 +#define MCPWM_FH1_FORCE_OST_S 4 +/* MCPWM_FH1_FORCE_CBC : R/W ;bitpos:[3] ;default: 1'd0 ; */ +/*description: A toggle triggers a cycle-by-cycle mode action*/ +#define MCPWM_FH1_FORCE_CBC (BIT(3)) +#define MCPWM_FH1_FORCE_CBC_M (BIT(3)) +#define MCPWM_FH1_FORCE_CBC_V 0x1 +#define MCPWM_FH1_FORCE_CBC_S 3 +/* MCPWM_FH1_CBCPULSE : R/W ;bitpos:[2:1] ;default: 2'd0 ; */ +/*description: The cycle-by-cycle mode action refresh moment selection. Bit0: TEZ bit1:TEP*/ +#define MCPWM_FH1_CBCPULSE 0x00000003 +#define MCPWM_FH1_CBCPULSE_M ((MCPWM_FH1_CBCPULSE_V)<<(MCPWM_FH1_CBCPULSE_S)) +#define MCPWM_FH1_CBCPULSE_V 0x3 +#define MCPWM_FH1_CBCPULSE_S 1 +/* MCPWM_FH1_CLR_OST : R/W ;bitpos:[0] ;default: 1'd0 ; */ +/*description: A toggle will clear on going one-shot mode action*/ +#define MCPWM_FH1_CLR_OST (BIT(0)) +#define MCPWM_FH1_CLR_OST_M (BIT(0)) +#define MCPWM_FH1_CLR_OST_V 0x1 +#define MCPWM_FH1_CLR_OST_S 0 + +#define MCPWM_FH1_STATUS_REG(i) (REG_MCPWM_BASE(i) + 0x00a8) +/* MCPWM_FH1_OST_ON : RO ;bitpos:[1] ;default: 1'd0 ; */ +/*description: Set and reset by hardware. If set an one-shot mode action is on going*/ +#define MCPWM_FH1_OST_ON (BIT(1)) +#define MCPWM_FH1_OST_ON_M (BIT(1)) +#define MCPWM_FH1_OST_ON_V 0x1 +#define MCPWM_FH1_OST_ON_S 1 +/* MCPWM_FH1_CBC_ON : RO ;bitpos:[0] ;default: 1'd0 ; */ +/*description: Set and reset by hardware. If set an cycle-by-cycle mode action is on going*/ +#define MCPWM_FH1_CBC_ON (BIT(0)) +#define MCPWM_FH1_CBC_ON_M (BIT(0)) +#define MCPWM_FH1_CBC_ON_V 0x1 +#define MCPWM_FH1_CBC_ON_S 0 + +#define MCPWM_GEN2_STMP_CFG_REG(i) (REG_MCPWM_BASE(i) + 0x00ac) +/* MCPWM_GEN2_B_SHDW_FULL : RO ;bitpos:[9] ;default: 1'd0 ; */ +/*description: Set and reset by hardware. If set PWM generator 2 time stamp + B's shadow reg is filled and waiting to be transferred to B's active reg. If cleared B's active reg has been updated with shadow reg latest value*/ +#define MCPWM_GEN2_B_SHDW_FULL (BIT(9)) +#define MCPWM_GEN2_B_SHDW_FULL_M (BIT(9)) +#define MCPWM_GEN2_B_SHDW_FULL_V 0x1 +#define MCPWM_GEN2_B_SHDW_FULL_S 9 +/* MCPWM_GEN2_A_SHDW_FULL : RO ;bitpos:[8] ;default: 1'd0 ; */ +/*description: Set and reset by hardware. If set PWM generator 2 time stamp + A's shadow reg is filled and waiting to be transferred to A's active reg. If cleared A's active reg has been updated with shadow reg latest value*/ +#define MCPWM_GEN2_A_SHDW_FULL (BIT(8)) +#define MCPWM_GEN2_A_SHDW_FULL_M (BIT(8)) +#define MCPWM_GEN2_A_SHDW_FULL_V 0x1 +#define MCPWM_GEN2_A_SHDW_FULL_S 8 +/* MCPWM_GEN2_B_UPMETHOD : R/W ;bitpos:[7:4] ;default: 4'd0 ; */ +/*description: Update method for PWM generator 2 time stamp B's active reg. + 0: immediate bit0: TEZ bit1: TEP bit2: sync bit3: disable update*/ +#define MCPWM_GEN2_B_UPMETHOD 0x0000000F +#define MCPWM_GEN2_B_UPMETHOD_M ((MCPWM_GEN2_B_UPMETHOD_V)<<(MCPWM_GEN2_B_UPMETHOD_S)) +#define MCPWM_GEN2_B_UPMETHOD_V 0xF +#define MCPWM_GEN2_B_UPMETHOD_S 4 +/* MCPWM_GEN2_A_UPMETHOD : R/W ;bitpos:[3:0] ;default: 4'd0 ; */ +/*description: Update method for PWM generator 2 time stamp A's active reg. + 0: immediate bit0: TEZ bit1: TEP bit2: sync bit3: disable update*/ +#define MCPWM_GEN2_A_UPMETHOD 0x0000000F +#define MCPWM_GEN2_A_UPMETHOD_M ((MCPWM_GEN2_A_UPMETHOD_V)<<(MCPWM_GEN2_A_UPMETHOD_S)) +#define MCPWM_GEN2_A_UPMETHOD_V 0xF +#define MCPWM_GEN2_A_UPMETHOD_S 0 + +#define MCPWM_GEN2_TSTMP_A_REG(i) (REG_MCPWM_BASE(i) + 0x00b0) +/* MCPWM_GEN2_A : R/W ;bitpos:[15:0] ;default: 16'd0 ; */ +/*description: PWM generator 2 time stamp A's shadow reg*/ +#define MCPWM_GEN2_A 0x0000FFFF +#define MCPWM_GEN2_A_M ((MCPWM_GEN2_A_V)<<(MCPWM_GEN2_A_S)) +#define MCPWM_GEN2_A_V 0xFFFF +#define MCPWM_GEN2_A_S 0 + +#define MCPWM_GEN2_TSTMP_B_REG(i) (REG_MCPWM_BASE(i) + 0x00b4) +/* MCPWM_GEN2_B : R/W ;bitpos:[15:0] ;default: 16'd0 ; */ +/*description: PWM generator 2 time stamp B's shadow reg*/ +#define MCPWM_GEN2_B 0x0000FFFF +#define MCPWM_GEN2_B_M ((MCPWM_GEN2_B_V)<<(MCPWM_GEN2_B_S)) +#define MCPWM_GEN2_B_V 0xFFFF +#define MCPWM_GEN2_B_S 0 + +#define MCPWM_GEN2_CFG0_REG(i) (REG_MCPWM_BASE(i) + 0x00b8) +/* MCPWM_GEN2_T1_SEL : R/W ;bitpos:[9:7] ;default: 3'd0 ; */ +/*description: Source selection for PWM generate2 event_t1 take effect immediately + 0: fault_event0 1: fault_event1 2: fault_event2 3: sync_taken 4: none*/ +#define MCPWM_GEN2_T1_SEL 0x00000007 +#define MCPWM_GEN2_T1_SEL_M ((MCPWM_GEN2_T1_SEL_V)<<(MCPWM_GEN2_T1_SEL_S)) +#define MCPWM_GEN2_T1_SEL_V 0x7 +#define MCPWM_GEN2_T1_SEL_S 7 +/* MCPWM_GEN2_T0_SEL : R/W ;bitpos:[6:4] ;default: 3'd0 ; */ +/*description: Source selection for PWM generate2 event_t0 take effect immediately + 0: fault_event0 1: fault_event1 2: fault_event2 3: sync_taken 4: none*/ +#define MCPWM_GEN2_T0_SEL 0x00000007 +#define MCPWM_GEN2_T0_SEL_M ((MCPWM_GEN2_T0_SEL_V)<<(MCPWM_GEN2_T0_SEL_S)) +#define MCPWM_GEN2_T0_SEL_V 0x7 +#define MCPWM_GEN2_T0_SEL_S 4 +/* MCPWM_GEN2_CFG_UPMETHOD : R/W ;bitpos:[3:0] ;default: 4'd0 ; */ +/*description: Update method for PWM generate2's active reg of configuration. + 0: immediate bit0: TEZ bit1: TEP bit2: sync. bit3: disable update*/ +#define MCPWM_GEN2_CFG_UPMETHOD 0x0000000F +#define MCPWM_GEN2_CFG_UPMETHOD_M ((MCPWM_GEN2_CFG_UPMETHOD_V)<<(MCPWM_GEN2_CFG_UPMETHOD_S)) +#define MCPWM_GEN2_CFG_UPMETHOD_V 0xF +#define MCPWM_GEN2_CFG_UPMETHOD_S 0 + +#define MCPWM_GEN2_FORCE_REG(i) (REG_MCPWM_BASE(i) + 0x00bc) +/* MCPWM_GEN2_B_NCIFORCE_MODE : R/W ;bitpos:[15:14] ;default: 2'd0 ; */ +/*description: Non-continuous immediate software force mode for PWM2B 0: disabled + 1: low 2: high 3: disabled*/ +#define MCPWM_GEN2_B_NCIFORCE_MODE 0x00000003 +#define MCPWM_GEN2_B_NCIFORCE_MODE_M ((MCPWM_GEN2_B_NCIFORCE_MODE_V)<<(MCPWM_GEN2_B_NCIFORCE_MODE_S)) +#define MCPWM_GEN2_B_NCIFORCE_MODE_V 0x3 +#define MCPWM_GEN2_B_NCIFORCE_MODE_S 14 +/* MCPWM_GEN2_B_NCIFORCE : R/W ;bitpos:[13] ;default: 1'd0 ; */ +/*description: Non-continuous immediate software force trigger for PWM2B a + toggle will trigger a force event*/ +#define MCPWM_GEN2_B_NCIFORCE (BIT(13)) +#define MCPWM_GEN2_B_NCIFORCE_M (BIT(13)) +#define MCPWM_GEN2_B_NCIFORCE_V 0x1 +#define MCPWM_GEN2_B_NCIFORCE_S 13 +/* MCPWM_GEN2_A_NCIFORCE_MODE : R/W ;bitpos:[12:11] ;default: 2'd0 ; */ +/*description: Non-continuous immediate software force mode for PWM2A 0: disabled + 1: low 2: high 3: disabled*/ +#define MCPWM_GEN2_A_NCIFORCE_MODE 0x00000003 +#define MCPWM_GEN2_A_NCIFORCE_MODE_M ((MCPWM_GEN2_A_NCIFORCE_MODE_V)<<(MCPWM_GEN2_A_NCIFORCE_MODE_S)) +#define MCPWM_GEN2_A_NCIFORCE_MODE_V 0x3 +#define MCPWM_GEN2_A_NCIFORCE_MODE_S 11 +/* MCPWM_GEN2_A_NCIFORCE : R/W ;bitpos:[10] ;default: 1'd0 ; */ +/*description: Non-continuous immediate software force trigger for PWM2A a + toggle will trigger a force event*/ +#define MCPWM_GEN2_A_NCIFORCE (BIT(10)) +#define MCPWM_GEN2_A_NCIFORCE_M (BIT(10)) +#define MCPWM_GEN2_A_NCIFORCE_V 0x1 +#define MCPWM_GEN2_A_NCIFORCE_S 10 +/* MCPWM_GEN2_B_CNTUFORCE_MODE : R/W ;bitpos:[9:8] ;default: 2'd0 ; */ +/*description: Continuous software force mode for PWM2B. 0: disabled 1: low + 2: high 3: disabled*/ +#define MCPWM_GEN2_B_CNTUFORCE_MODE 0x00000003 +#define MCPWM_GEN2_B_CNTUFORCE_MODE_M ((MCPWM_GEN2_B_CNTUFORCE_MODE_V)<<(MCPWM_GEN2_B_CNTUFORCE_MODE_S)) +#define MCPWM_GEN2_B_CNTUFORCE_MODE_V 0x3 +#define MCPWM_GEN2_B_CNTUFORCE_MODE_S 8 +/* MCPWM_GEN2_A_CNTUFORCE_MODE : R/W ;bitpos:[7:6] ;default: 2'd0 ; */ +/*description: Continuous software force mode for PWM2A. 0: disabled 1: low + 2: high 3: disabled*/ +#define MCPWM_GEN2_A_CNTUFORCE_MODE 0x00000003 +#define MCPWM_GEN2_A_CNTUFORCE_MODE_M ((MCPWM_GEN2_A_CNTUFORCE_MODE_V)<<(MCPWM_GEN2_A_CNTUFORCE_MODE_S)) +#define MCPWM_GEN2_A_CNTUFORCE_MODE_V 0x3 +#define MCPWM_GEN2_A_CNTUFORCE_MODE_S 6 +/* MCPWM_GEN2_CNTUFORCE_UPMETHOD : R/W ;bitpos:[5:0] ;default: 6'h20 ; */ +/*description: Update method for continuous software force of PWM generator2. + 0: immediate bit0: TEZ bit1: TEP bit2: TEA bit3: TEB bit4: sync bit5: disable update. (TEA/B here and below means an event generated when timer value equals A/B register)*/ +#define MCPWM_GEN2_CNTUFORCE_UPMETHOD 0x0000003F +#define MCPWM_GEN2_CNTUFORCE_UPMETHOD_M ((MCPWM_GEN2_CNTUFORCE_UPMETHOD_V)<<(MCPWM_GEN2_CNTUFORCE_UPMETHOD_S)) +#define MCPWM_GEN2_CNTUFORCE_UPMETHOD_V 0x3F +#define MCPWM_GEN2_CNTUFORCE_UPMETHOD_S 0 + +#define MCPWM_GEN2_A_REG(i) (REG_MCPWM_BASE(i) + 0x00c0) +/* MCPWM_GEN2_A_DT1 : R/W ;bitpos:[23:22] ;default: 2'd0 ; */ +/*description: Action on PWM2A triggered by event_t1 when timer decreasing. + 0: no change 1: low 2: high 3: toggle*/ +#define MCPWM_GEN2_A_DT1 0x00000003 +#define MCPWM_GEN2_A_DT1_M ((MCPWM_GEN2_A_DT1_V)<<(MCPWM_GEN2_A_DT1_S)) +#define MCPWM_GEN2_A_DT1_V 0x3 +#define MCPWM_GEN2_A_DT1_S 22 +/* MCPWM_GEN2_A_DT0 : R/W ;bitpos:[21:20] ;default: 2'd0 ; */ +/*description: Action on PWM2A triggered by event_t0 when timer decreasing*/ +#define MCPWM_GEN2_A_DT0 0x00000003 +#define MCPWM_GEN2_A_DT0_M ((MCPWM_GEN2_A_DT0_V)<<(MCPWM_GEN2_A_DT0_S)) +#define MCPWM_GEN2_A_DT0_V 0x3 +#define MCPWM_GEN2_A_DT0_S 20 +/* MCPWM_GEN2_A_DTEB : R/W ;bitpos:[19:18] ;default: 2'd0 ; */ +/*description: Action on PWM2A triggered by event TEB when timer decreasing*/ +#define MCPWM_GEN2_A_DTEB 0x00000003 +#define MCPWM_GEN2_A_DTEB_M ((MCPWM_GEN2_A_DTEB_V)<<(MCPWM_GEN2_A_DTEB_S)) +#define MCPWM_GEN2_A_DTEB_V 0x3 +#define MCPWM_GEN2_A_DTEB_S 18 +/* MCPWM_GEN2_A_DTEA : R/W ;bitpos:[17:16] ;default: 2'd0 ; */ +/*description: Action on PWM2A triggered by event TEA when timer decreasing*/ +#define MCPWM_GEN2_A_DTEA 0x00000003 +#define MCPWM_GEN2_A_DTEA_M ((MCPWM_GEN2_A_DTEA_V)<<(MCPWM_GEN2_A_DTEA_S)) +#define MCPWM_GEN2_A_DTEA_V 0x3 +#define MCPWM_GEN2_A_DTEA_S 16 +/* MCPWM_GEN2_A_DTEP : R/W ;bitpos:[15:14] ;default: 2'd0 ; */ +/*description: Action on PWM2A triggered by event TEP when timer decreasing*/ +#define MCPWM_GEN2_A_DTEP 0x00000003 +#define MCPWM_GEN2_A_DTEP_M ((MCPWM_GEN2_A_DTEP_V)<<(MCPWM_GEN2_A_DTEP_S)) +#define MCPWM_GEN2_A_DTEP_V 0x3 +#define MCPWM_GEN2_A_DTEP_S 14 +/* MCPWM_GEN2_A_DTEZ : R/W ;bitpos:[13:12] ;default: 2'd0 ; */ +/*description: Action on PWM2A triggered by event TEZ when timer decreasing*/ +#define MCPWM_GEN2_A_DTEZ 0x00000003 +#define MCPWM_GEN2_A_DTEZ_M ((MCPWM_GEN2_A_DTEZ_V)<<(MCPWM_GEN2_A_DTEZ_S)) +#define MCPWM_GEN2_A_DTEZ_V 0x3 +#define MCPWM_GEN2_A_DTEZ_S 12 +/* MCPWM_GEN2_A_UT1 : R/W ;bitpos:[11:10] ;default: 2'd0 ; */ +/*description: Action on PWM2A triggered by event_t1 when timer increasing*/ +#define MCPWM_GEN2_A_UT1 0x00000003 +#define MCPWM_GEN2_A_UT1_M ((MCPWM_GEN2_A_UT1_V)<<(MCPWM_GEN2_A_UT1_S)) +#define MCPWM_GEN2_A_UT1_V 0x3 +#define MCPWM_GEN2_A_UT1_S 10 +/* MCPWM_GEN2_A_UT0 : R/W ;bitpos:[9:8] ;default: 2'd0 ; */ +/*description: Action on PWM2A triggered by event_t0 when timer increasing*/ +#define MCPWM_GEN2_A_UT0 0x00000003 +#define MCPWM_GEN2_A_UT0_M ((MCPWM_GEN2_A_UT0_V)<<(MCPWM_GEN2_A_UT0_S)) +#define MCPWM_GEN2_A_UT0_V 0x3 +#define MCPWM_GEN2_A_UT0_S 8 +/* MCPWM_GEN2_A_UTEB : R/W ;bitpos:[7:6] ;default: 2'd0 ; */ +/*description: Action on PWM2A triggered by event TEB when timer increasing*/ +#define MCPWM_GEN2_A_UTEB 0x00000003 +#define MCPWM_GEN2_A_UTEB_M ((MCPWM_GEN2_A_UTEB_V)<<(MCPWM_GEN2_A_UTEB_S)) +#define MCPWM_GEN2_A_UTEB_V 0x3 +#define MCPWM_GEN2_A_UTEB_S 6 +/* MCPWM_GEN2_A_UTEA : R/W ;bitpos:[5:4] ;default: 2'd0 ; */ +/*description: Action on PWM2A triggered by event TEA when timer increasing*/ +#define MCPWM_GEN2_A_UTEA 0x00000003 +#define MCPWM_GEN2_A_UTEA_M ((MCPWM_GEN2_A_UTEA_V)<<(MCPWM_GEN2_A_UTEA_S)) +#define MCPWM_GEN2_A_UTEA_V 0x3 +#define MCPWM_GEN2_A_UTEA_S 4 +/* MCPWM_GEN2_A_UTEP : R/W ;bitpos:[3:2] ;default: 2'd0 ; */ +/*description: Action on PWM2A triggered by event TEP when timer increasing*/ +#define MCPWM_GEN2_A_UTEP 0x00000003 +#define MCPWM_GEN2_A_UTEP_M ((MCPWM_GEN2_A_UTEP_V)<<(MCPWM_GEN2_A_UTEP_S)) +#define MCPWM_GEN2_A_UTEP_V 0x3 +#define MCPWM_GEN2_A_UTEP_S 2 +/* MCPWM_GEN2_A_UTEZ : R/W ;bitpos:[1:0] ;default: 2'd0 ; */ +/*description: Action on PWM2A triggered by event TEZ when timer increasing*/ +#define MCPWM_GEN2_A_UTEZ 0x00000003 +#define MCPWM_GEN2_A_UTEZ_M ((MCPWM_GEN2_A_UTEZ_V)<<(MCPWM_GEN2_A_UTEZ_S)) +#define MCPWM_GEN2_A_UTEZ_V 0x3 +#define MCPWM_GEN2_A_UTEZ_S 0 + +#define MCPWM_GEN2_B_REG(i) (REG_MCPWM_BASE(i) + 0x00c4) +/* MCPWM_GEN2_B_DT1 : R/W ;bitpos:[23:22] ;default: 2'd0 ; */ +/*description: Action on PWM2B triggered by event_t1 when timer decreasing. + 0: no change 1: low 2: high 3: toggle*/ +#define MCPWM_GEN2_B_DT1 0x00000003 +#define MCPWM_GEN2_B_DT1_M ((MCPWM_GEN2_B_DT1_V)<<(MCPWM_GEN2_B_DT1_S)) +#define MCPWM_GEN2_B_DT1_V 0x3 +#define MCPWM_GEN2_B_DT1_S 22 +/* MCPWM_GEN2_B_DT0 : R/W ;bitpos:[21:20] ;default: 2'd0 ; */ +/*description: Action on PWM2B triggered by event_t0 when timer decreasing*/ +#define MCPWM_GEN2_B_DT0 0x00000003 +#define MCPWM_GEN2_B_DT0_M ((MCPWM_GEN2_B_DT0_V)<<(MCPWM_GEN2_B_DT0_S)) +#define MCPWM_GEN2_B_DT0_V 0x3 +#define MCPWM_GEN2_B_DT0_S 20 +/* MCPWM_GEN2_B_DTEB : R/W ;bitpos:[19:18] ;default: 2'd0 ; */ +/*description: Action on PWM2B triggered by event TEB when timer decreasing*/ +#define MCPWM_GEN2_B_DTEB 0x00000003 +#define MCPWM_GEN2_B_DTEB_M ((MCPWM_GEN2_B_DTEB_V)<<(MCPWM_GEN2_B_DTEB_S)) +#define MCPWM_GEN2_B_DTEB_V 0x3 +#define MCPWM_GEN2_B_DTEB_S 18 +/* MCPWM_GEN2_B_DTEA : R/W ;bitpos:[17:16] ;default: 2'd0 ; */ +/*description: Action on PWM2B triggered by event TEA when timer decreasing*/ +#define MCPWM_GEN2_B_DTEA 0x00000003 +#define MCPWM_GEN2_B_DTEA_M ((MCPWM_GEN2_B_DTEA_V)<<(MCPWM_GEN2_B_DTEA_S)) +#define MCPWM_GEN2_B_DTEA_V 0x3 +#define MCPWM_GEN2_B_DTEA_S 16 +/* MCPWM_GEN2_B_DTEP : R/W ;bitpos:[15:14] ;default: 2'd0 ; */ +/*description: Action on PWM2B triggered by event TEP when timer decreasing*/ +#define MCPWM_GEN2_B_DTEP 0x00000003 +#define MCPWM_GEN2_B_DTEP_M ((MCPWM_GEN2_B_DTEP_V)<<(MCPWM_GEN2_B_DTEP_S)) +#define MCPWM_GEN2_B_DTEP_V 0x3 +#define MCPWM_GEN2_B_DTEP_S 14 +/* MCPWM_GEN2_B_DTEZ : R/W ;bitpos:[13:12] ;default: 2'd0 ; */ +/*description: Action on PWM2B triggered by event TEZ when timer decreasing*/ +#define MCPWM_GEN2_B_DTEZ 0x00000003 +#define MCPWM_GEN2_B_DTEZ_M ((MCPWM_GEN2_B_DTEZ_V)<<(MCPWM_GEN2_B_DTEZ_S)) +#define MCPWM_GEN2_B_DTEZ_V 0x3 +#define MCPWM_GEN2_B_DTEZ_S 12 +/* MCPWM_GEN2_B_UT1 : R/W ;bitpos:[11:10] ;default: 2'd0 ; */ +/*description: Action on PWM2B triggered by event_t1 when timer increasing*/ +#define MCPWM_GEN2_B_UT1 0x00000003 +#define MCPWM_GEN2_B_UT1_M ((MCPWM_GEN2_B_UT1_V)<<(MCPWM_GEN2_B_UT1_S)) +#define MCPWM_GEN2_B_UT1_V 0x3 +#define MCPWM_GEN2_B_UT1_S 10 +/* MCPWM_GEN2_B_UT0 : R/W ;bitpos:[9:8] ;default: 2'd0 ; */ +/*description: Action on PWM2B triggered by event_t0 when timer increasing*/ +#define MCPWM_GEN2_B_UT0 0x00000003 +#define MCPWM_GEN2_B_UT0_M ((MCPWM_GEN2_B_UT0_V)<<(MCPWM_GEN2_B_UT0_S)) +#define MCPWM_GEN2_B_UT0_V 0x3 +#define MCPWM_GEN2_B_UT0_S 8 +/* MCPWM_GEN2_B_UTEB : R/W ;bitpos:[7:6] ;default: 2'd0 ; */ +/*description: Action on PWM2B triggered by event TEB when timer increasing*/ +#define MCPWM_GEN2_B_UTEB 0x00000003 +#define MCPWM_GEN2_B_UTEB_M ((MCPWM_GEN2_B_UTEB_V)<<(MCPWM_GEN2_B_UTEB_S)) +#define MCPWM_GEN2_B_UTEB_V 0x3 +#define MCPWM_GEN2_B_UTEB_S 6 +/* MCPWM_GEN2_B_UTEA : R/W ;bitpos:[5:4] ;default: 2'd0 ; */ +/*description: Action on PWM2B triggered by event TEA when timer increasing*/ +#define MCPWM_GEN2_B_UTEA 0x00000003 +#define MCPWM_GEN2_B_UTEA_M ((MCPWM_GEN2_B_UTEA_V)<<(MCPWM_GEN2_B_UTEA_S)) +#define MCPWM_GEN2_B_UTEA_V 0x3 +#define MCPWM_GEN2_B_UTEA_S 4 +/* MCPWM_GEN2_B_UTEP : R/W ;bitpos:[3:2] ;default: 2'd0 ; */ +/*description: Action on PWM2B triggered by event TEP when timer increasing*/ +#define MCPWM_GEN2_B_UTEP 0x00000003 +#define MCPWM_GEN2_B_UTEP_M ((MCPWM_GEN2_B_UTEP_V)<<(MCPWM_GEN2_B_UTEP_S)) +#define MCPWM_GEN2_B_UTEP_V 0x3 +#define MCPWM_GEN2_B_UTEP_S 2 +/* MCPWM_GEN2_B_UTEZ : R/W ;bitpos:[1:0] ;default: 2'd0 ; */ +/*description: Action on PWM2B triggered by event TEZ when timer increasing*/ +#define MCPWM_GEN2_B_UTEZ 0x00000003 +#define MCPWM_GEN2_B_UTEZ_M ((MCPWM_GEN2_B_UTEZ_V)<<(MCPWM_GEN2_B_UTEZ_S)) +#define MCPWM_GEN2_B_UTEZ_V 0x3 +#define MCPWM_GEN2_B_UTEZ_S 0 + +#define MCPWM_DT2_CFG_REG(i) (REG_MCPWM_BASE(i) + 0x00c8) +/* MCPWM_DT2_CLK_SEL : R/W ;bitpos:[17] ;default: 1'd0 ; */ +/*description: Dead time generator 1 clock selection. 0: PWM_clk 1: PT_clk*/ +#define MCPWM_DT2_CLK_SEL (BIT(17)) +#define MCPWM_DT2_CLK_SEL_M (BIT(17)) +#define MCPWM_DT2_CLK_SEL_V 0x1 +#define MCPWM_DT2_CLK_SEL_S 17 +/* MCPWM_DT2_B_OUTBYPASS : R/W ;bitpos:[16] ;default: 1'd1 ; */ +/*description: S0 in documentation*/ +#define MCPWM_DT2_B_OUTBYPASS (BIT(16)) +#define MCPWM_DT2_B_OUTBYPASS_M (BIT(16)) +#define MCPWM_DT2_B_OUTBYPASS_V 0x1 +#define MCPWM_DT2_B_OUTBYPASS_S 16 +/* MCPWM_DT2_A_OUTBYPASS : R/W ;bitpos:[15] ;default: 1'd1 ; */ +/*description: S1 in documentation*/ +#define MCPWM_DT2_A_OUTBYPASS (BIT(15)) +#define MCPWM_DT2_A_OUTBYPASS_M (BIT(15)) +#define MCPWM_DT2_A_OUTBYPASS_V 0x1 +#define MCPWM_DT2_A_OUTBYPASS_S 15 +/* MCPWM_DT2_FED_OUTINVERT : R/W ;bitpos:[14] ;default: 1'd0 ; */ +/*description: S3 in documentation*/ +#define MCPWM_DT2_FED_OUTINVERT (BIT(14)) +#define MCPWM_DT2_FED_OUTINVERT_M (BIT(14)) +#define MCPWM_DT2_FED_OUTINVERT_V 0x1 +#define MCPWM_DT2_FED_OUTINVERT_S 14 +/* MCPWM_DT2_RED_OUTINVERT : R/W ;bitpos:[13] ;default: 1'd0 ; */ +/*description: S2 in documentation*/ +#define MCPWM_DT2_RED_OUTINVERT (BIT(13)) +#define MCPWM_DT2_RED_OUTINVERT_M (BIT(13)) +#define MCPWM_DT2_RED_OUTINVERT_V 0x1 +#define MCPWM_DT2_RED_OUTINVERT_S 13 +/* MCPWM_DT2_FED_INSEL : R/W ;bitpos:[12] ;default: 1'd0 ; */ +/*description: S5 in documentation*/ +#define MCPWM_DT2_FED_INSEL (BIT(12)) +#define MCPWM_DT2_FED_INSEL_M (BIT(12)) +#define MCPWM_DT2_FED_INSEL_V 0x1 +#define MCPWM_DT2_FED_INSEL_S 12 +/* MCPWM_DT2_RED_INSEL : R/W ;bitpos:[11] ;default: 1'd0 ; */ +/*description: S4 in documentation*/ +#define MCPWM_DT2_RED_INSEL (BIT(11)) +#define MCPWM_DT2_RED_INSEL_M (BIT(11)) +#define MCPWM_DT2_RED_INSEL_V 0x1 +#define MCPWM_DT2_RED_INSEL_S 11 +/* MCPWM_DT2_B_OUTSWAP : R/W ;bitpos:[10] ;default: 1'd0 ; */ +/*description: S7 in documentation*/ +#define MCPWM_DT2_B_OUTSWAP (BIT(10)) +#define MCPWM_DT2_B_OUTSWAP_M (BIT(10)) +#define MCPWM_DT2_B_OUTSWAP_V 0x1 +#define MCPWM_DT2_B_OUTSWAP_S 10 +/* MCPWM_DT2_A_OUTSWAP : R/W ;bitpos:[9] ;default: 1'd0 ; */ +/*description: S6 in documentation*/ +#define MCPWM_DT2_A_OUTSWAP (BIT(9)) +#define MCPWM_DT2_A_OUTSWAP_M (BIT(9)) +#define MCPWM_DT2_A_OUTSWAP_V 0x1 +#define MCPWM_DT2_A_OUTSWAP_S 9 +/* MCPWM_DT2_DEB_MODE : R/W ;bitpos:[8] ;default: 1'd0 ; */ +/*description: S8 in documentation dual-edge B mode 0: FED/RED take effect + on different path separately 1: FED/RED take effect on B path A out is in bypass or normal operation mode*/ +#define MCPWM_DT2_DEB_MODE (BIT(8)) +#define MCPWM_DT2_DEB_MODE_M (BIT(8)) +#define MCPWM_DT2_DEB_MODE_V 0x1 +#define MCPWM_DT2_DEB_MODE_S 8 +/* MCPWM_DT2_RED_UPMETHOD : R/W ;bitpos:[7:4] ;default: 4'd0 ; */ +/*description: Update method for RED (rising edge delay) active reg. 0: immediate + bit0: TEZ bit1: TEP bit2: sync bit3: disable update*/ +#define MCPWM_DT2_RED_UPMETHOD 0x0000000F +#define MCPWM_DT2_RED_UPMETHOD_M ((MCPWM_DT2_RED_UPMETHOD_V)<<(MCPWM_DT2_RED_UPMETHOD_S)) +#define MCPWM_DT2_RED_UPMETHOD_V 0xF +#define MCPWM_DT2_RED_UPMETHOD_S 4 +/* MCPWM_DT2_FED_UPMETHOD : R/W ;bitpos:[3:0] ;default: 4'd0 ; */ +/*description: Update method for FED (falling edge delay) active reg. 0: immediate + bit0: TEZ bit1: TEP bit2: sync bit3: disable update*/ +#define MCPWM_DT2_FED_UPMETHOD 0x0000000F +#define MCPWM_DT2_FED_UPMETHOD_M ((MCPWM_DT2_FED_UPMETHOD_V)<<(MCPWM_DT2_FED_UPMETHOD_S)) +#define MCPWM_DT2_FED_UPMETHOD_V 0xF +#define MCPWM_DT2_FED_UPMETHOD_S 0 + +#define MCPWM_DT2_FED_CFG_REG(i) (REG_MCPWM_BASE(i) + 0x00cc) +/* MCPWM_DT2_FED : R/W ;bitpos:[15:0] ;default: 16'd0 ; */ +/*description: Shadow reg for FED*/ +#define MCPWM_DT2_FED 0x0000FFFF +#define MCPWM_DT2_FED_M ((MCPWM_DT2_FED_V)<<(MCPWM_DT2_FED_S)) +#define MCPWM_DT2_FED_V 0xFFFF +#define MCPWM_DT2_FED_S 0 + +#define MCPWM_DT2_RED_CFG_REG(i) (REG_MCPWM_BASE(i) + 0x00d0) +/* MCPWM_DT2_RED : R/W ;bitpos:[15:0] ;default: 16'd0 ; */ +/*description: Shadow reg for RED*/ +#define MCPWM_DT2_RED 0x0000FFFF +#define MCPWM_DT2_RED_M ((MCPWM_DT2_RED_V)<<(MCPWM_DT2_RED_S)) +#define MCPWM_DT2_RED_V 0xFFFF +#define MCPWM_DT2_RED_S 0 + +#define MCPWM_CARRIER2_CFG_REG(i) (REG_MCPWM_BASE(i) + 0x00d4) +/* MCPWM_CARRIER2_IN_INVERT : R/W ;bitpos:[13] ;default: 1'd0 ; */ +/*description: When set invert the input of PWM2A and PWM2B for this submodule*/ +#define MCPWM_CARRIER2_IN_INVERT (BIT(13)) +#define MCPWM_CARRIER2_IN_INVERT_M (BIT(13)) +#define MCPWM_CARRIER2_IN_INVERT_V 0x1 +#define MCPWM_CARRIER2_IN_INVERT_S 13 +/* MCPWM_CARRIER2_OUT_INVERT : R/W ;bitpos:[12] ;default: 1'd0 ; */ +/*description: When set invert the output of PWM2A and PWM2B for this submodule*/ +#define MCPWM_CARRIER2_OUT_INVERT (BIT(12)) +#define MCPWM_CARRIER2_OUT_INVERT_M (BIT(12)) +#define MCPWM_CARRIER2_OUT_INVERT_V 0x1 +#define MCPWM_CARRIER2_OUT_INVERT_S 12 +/* MCPWM_CARRIER2_OSHWTH : R/W ;bitpos:[11:8] ;default: 4'd0 ; */ +/*description: Width of the fist pulse in number of periods of the carrier*/ +#define MCPWM_CARRIER2_OSHWTH 0x0000000F +#define MCPWM_CARRIER2_OSHWTH_M ((MCPWM_CARRIER2_OSHWTH_V)<<(MCPWM_CARRIER2_OSHWTH_S)) +#define MCPWM_CARRIER2_OSHWTH_V 0xF +#define MCPWM_CARRIER2_OSHWTH_S 8 +/* MCPWM_CARRIER2_DUTY : R/W ;bitpos:[7:5] ;default: 3'd0 ; */ +/*description: Carrier duty selection. Duty = PWM_CARRIER2_DUTY / 8*/ +#define MCPWM_CARRIER2_DUTY 0x00000007 +#define MCPWM_CARRIER2_DUTY_M ((MCPWM_CARRIER2_DUTY_V)<<(MCPWM_CARRIER2_DUTY_S)) +#define MCPWM_CARRIER2_DUTY_V 0x7 +#define MCPWM_CARRIER2_DUTY_S 5 +/* MCPWM_CARRIER2_PRESCALE : R/W ;bitpos:[4:1] ;default: 4'd0 ; */ +/*description: PWM carrier2 clock (PC_clk) prescale value. Period of PC_clk + = period of PWM_clk * (PWM_CARRIER2_PRESCALE + 1)*/ +#define MCPWM_CARRIER2_PRESCALE 0x0000000F +#define MCPWM_CARRIER2_PRESCALE_M ((MCPWM_CARRIER2_PRESCALE_V)<<(MCPWM_CARRIER2_PRESCALE_S)) +#define MCPWM_CARRIER2_PRESCALE_V 0xF +#define MCPWM_CARRIER2_PRESCALE_S 1 +/* MCPWM_CARRIER2_EN : R/W ;bitpos:[0] ;default: 1'd0 ; */ +/*description: When set carrier2 function is enabled. When cleared carrier2 is bypassed*/ +#define MCPWM_CARRIER2_EN (BIT(0)) +#define MCPWM_CARRIER2_EN_M (BIT(0)) +#define MCPWM_CARRIER2_EN_V 0x1 +#define MCPWM_CARRIER2_EN_S 0 + +#define MCPWM_FH2_CFG0_REG(i) (REG_MCPWM_BASE(i) + 0x00d8) +/* MCPWM_FH2_B_OST_U : R/W ;bitpos:[23:22] ;default: 2'd0 ; */ +/*description: One-shot mode action on PWM2B when fault event occurs and timer + is increasing. 0: do nothing 1: force lo 2: force hi 3: toggle*/ +#define MCPWM_FH2_B_OST_U 0x00000003 +#define MCPWM_FH2_B_OST_U_M ((MCPWM_FH2_B_OST_U_V)<<(MCPWM_FH2_B_OST_U_S)) +#define MCPWM_FH2_B_OST_U_V 0x3 +#define MCPWM_FH2_B_OST_U_S 22 +/* MCPWM_FH2_B_OST_D : R/W ;bitpos:[21:20] ;default: 2'd0 ; */ +/*description: One-shot mode action on PWM2B when fault event occurs and timer + is decreasing. 0: do nothing 1: force lo 2: force hi 3: toggle*/ +#define MCPWM_FH2_B_OST_D 0x00000003 +#define MCPWM_FH2_B_OST_D_M ((MCPWM_FH2_B_OST_D_V)<<(MCPWM_FH2_B_OST_D_S)) +#define MCPWM_FH2_B_OST_D_V 0x3 +#define MCPWM_FH2_B_OST_D_S 20 +/* MCPWM_FH2_B_CBC_U : R/W ;bitpos:[19:18] ;default: 2'd0 ; */ +/*description: Cycle-by-cycle mode action on PWM2B when fault event occurs and + timer is increasing. 0: do nothing 1: force lo 2: force hi 3: toggle*/ +#define MCPWM_FH2_B_CBC_U 0x00000003 +#define MCPWM_FH2_B_CBC_U_M ((MCPWM_FH2_B_CBC_U_V)<<(MCPWM_FH2_B_CBC_U_S)) +#define MCPWM_FH2_B_CBC_U_V 0x3 +#define MCPWM_FH2_B_CBC_U_S 18 +/* MCPWM_FH2_B_CBC_D : R/W ;bitpos:[17:16] ;default: 2'd0 ; */ +/*description: Cycle-by-cycle mode action on PWM2B when fault event occurs and + timer is decreasing. 0: do nothing 1: force lo 2: force hi 3: toggle*/ +#define MCPWM_FH2_B_CBC_D 0x00000003 +#define MCPWM_FH2_B_CBC_D_M ((MCPWM_FH2_B_CBC_D_V)<<(MCPWM_FH2_B_CBC_D_S)) +#define MCPWM_FH2_B_CBC_D_V 0x3 +#define MCPWM_FH2_B_CBC_D_S 16 +/* MCPWM_FH2_A_OST_U : R/W ;bitpos:[15:14] ;default: 2'd0 ; */ +/*description: One-shot mode action on PWM2A when fault event occurs and timer + is increasing. 0: do nothing 1: force lo 2: force hi 3: toggle*/ +#define MCPWM_FH2_A_OST_U 0x00000003 +#define MCPWM_FH2_A_OST_U_M ((MCPWM_FH2_A_OST_U_V)<<(MCPWM_FH2_A_OST_U_S)) +#define MCPWM_FH2_A_OST_U_V 0x3 +#define MCPWM_FH2_A_OST_U_S 14 +/* MCPWM_FH2_A_OST_D : R/W ;bitpos:[13:12] ;default: 2'd0 ; */ +/*description: One-shot mode action on PWM2A when fault event occurs and timer + is decreasing. 0: do nothing 1: force lo 2: force hi 3: toggle*/ +#define MCPWM_FH2_A_OST_D 0x00000003 +#define MCPWM_FH2_A_OST_D_M ((MCPWM_FH2_A_OST_D_V)<<(MCPWM_FH2_A_OST_D_S)) +#define MCPWM_FH2_A_OST_D_V 0x3 +#define MCPWM_FH2_A_OST_D_S 12 +/* MCPWM_FH2_A_CBC_U : R/W ;bitpos:[11:10] ;default: 2'd0 ; */ +/*description: Cycle-by-cycle mode action on PWM2A when fault event occurs and + timer is increasing. 0: do nothing 1: force lo 2: force hi 3: toggle*/ +#define MCPWM_FH2_A_CBC_U 0x00000003 +#define MCPWM_FH2_A_CBC_U_M ((MCPWM_FH2_A_CBC_U_V)<<(MCPWM_FH2_A_CBC_U_S)) +#define MCPWM_FH2_A_CBC_U_V 0x3 +#define MCPWM_FH2_A_CBC_U_S 10 +/* MCPWM_FH2_A_CBC_D : R/W ;bitpos:[9:8] ;default: 2'd0 ; */ +/*description: Cycle-by-cycle mode action on PWM2A when fault event occurs and + timer is decreasing. 0: do nothing 1: force lo 2: force hi 3: toggle*/ +#define MCPWM_FH2_A_CBC_D 0x00000003 +#define MCPWM_FH2_A_CBC_D_M ((MCPWM_FH2_A_CBC_D_V)<<(MCPWM_FH2_A_CBC_D_S)) +#define MCPWM_FH2_A_CBC_D_V 0x3 +#define MCPWM_FH2_A_CBC_D_S 8 +/* MCPWM_FH2_F0_OST : R/W ;bitpos:[7] ;default: 1'd0 ; */ +/*description: event_f0 will trigger one-shot mode action. 0: disable 1: enable*/ +#define MCPWM_FH2_F0_OST (BIT(7)) +#define MCPWM_FH2_F0_OST_M (BIT(7)) +#define MCPWM_FH2_F0_OST_V 0x1 +#define MCPWM_FH2_F0_OST_S 7 +/* MCPWM_FH2_F1_OST : R/W ;bitpos:[6] ;default: 1'd0 ; */ +/*description: event_f1 will trigger one-shot mode action. 0: disable 1: enable*/ +#define MCPWM_FH2_F1_OST (BIT(6)) +#define MCPWM_FH2_F1_OST_M (BIT(6)) +#define MCPWM_FH2_F1_OST_V 0x1 +#define MCPWM_FH2_F1_OST_S 6 +/* MCPWM_FH2_F2_OST : R/W ;bitpos:[5] ;default: 1'd0 ; */ +/*description: event_f2 will trigger one-shot mode action. 0: disable 1: enable*/ +#define MCPWM_FH2_F2_OST (BIT(5)) +#define MCPWM_FH2_F2_OST_M (BIT(5)) +#define MCPWM_FH2_F2_OST_V 0x1 +#define MCPWM_FH2_F2_OST_S 5 +/* MCPWM_FH2_SW_OST : R/W ;bitpos:[4] ;default: 1'd0 ; */ +/*description: Enable register for software force one-shot mode action. 0: disable 1: enable*/ +#define MCPWM_FH2_SW_OST (BIT(4)) +#define MCPWM_FH2_SW_OST_M (BIT(4)) +#define MCPWM_FH2_SW_OST_V 0x1 +#define MCPWM_FH2_SW_OST_S 4 +/* MCPWM_FH2_F0_CBC : R/W ;bitpos:[3] ;default: 1'd0 ; */ +/*description: event_f0 will trigger cycle-by-cycle mode action. 0: disable 1: enable*/ +#define MCPWM_FH2_F0_CBC (BIT(3)) +#define MCPWM_FH2_F0_CBC_M (BIT(3)) +#define MCPWM_FH2_F0_CBC_V 0x1 +#define MCPWM_FH2_F0_CBC_S 3 +/* MCPWM_FH2_F1_CBC : R/W ;bitpos:[2] ;default: 1'd0 ; */ +/*description: event_f1 will trigger cycle-by-cycle mode action. 0: disable 1: enable*/ +#define MCPWM_FH2_F1_CBC (BIT(2)) +#define MCPWM_FH2_F1_CBC_M (BIT(2)) +#define MCPWM_FH2_F1_CBC_V 0x1 +#define MCPWM_FH2_F1_CBC_S 2 +/* MCPWM_FH2_F2_CBC : R/W ;bitpos:[1] ;default: 1'd0 ; */ +/*description: event_f2 will trigger cycle-by-cycle mode action. 0: disable 1: enable*/ +#define MCPWM_FH2_F2_CBC (BIT(1)) +#define MCPWM_FH2_F2_CBC_M (BIT(1)) +#define MCPWM_FH2_F2_CBC_V 0x1 +#define MCPWM_FH2_F2_CBC_S 1 +/* MCPWM_FH2_SW_CBC : R/W ;bitpos:[0] ;default: 1'd0 ; */ +/*description: Enable register for software force cycle-by-cycle mode action. + 0: disable 1: enable*/ +#define MCPWM_FH2_SW_CBC (BIT(0)) +#define MCPWM_FH2_SW_CBC_M (BIT(0)) +#define MCPWM_FH2_SW_CBC_V 0x1 +#define MCPWM_FH2_SW_CBC_S 0 + +#define MCPWM_FH2_CFG1_REG(i) (REG_MCPWM_BASE(i) + 0x00dc) +/* MCPWM_FH2_FORCE_OST : R/W ;bitpos:[4] ;default: 1'd0 ; */ +/*description: A toggle (software negation of value of this bit) triggers a + one-shot mode action*/ +#define MCPWM_FH2_FORCE_OST (BIT(4)) +#define MCPWM_FH2_FORCE_OST_M (BIT(4)) +#define MCPWM_FH2_FORCE_OST_V 0x1 +#define MCPWM_FH2_FORCE_OST_S 4 +/* MCPWM_FH2_FORCE_CBC : R/W ;bitpos:[3] ;default: 1'd0 ; */ +/*description: A toggle triggers a cycle-by-cycle mode action*/ +#define MCPWM_FH2_FORCE_CBC (BIT(3)) +#define MCPWM_FH2_FORCE_CBC_M (BIT(3)) +#define MCPWM_FH2_FORCE_CBC_V 0x1 +#define MCPWM_FH2_FORCE_CBC_S 3 +/* MCPWM_FH2_CBCPULSE : R/W ;bitpos:[2:1] ;default: 2'd0 ; */ +/*description: The cycle-by-cycle mode action refresh moment selection. Bit0: TEZ bit1:TEP*/ +#define MCPWM_FH2_CBCPULSE 0x00000003 +#define MCPWM_FH2_CBCPULSE_M ((MCPWM_FH2_CBCPULSE_V)<<(MCPWM_FH2_CBCPULSE_S)) +#define MCPWM_FH2_CBCPULSE_V 0x3 +#define MCPWM_FH2_CBCPULSE_S 1 +/* MCPWM_FH2_CLR_OST : R/W ;bitpos:[0] ;default: 1'd0 ; */ +/*description: A toggle will clear on going one-shot mode action*/ +#define MCPWM_FH2_CLR_OST (BIT(0)) +#define MCPWM_FH2_CLR_OST_M (BIT(0)) +#define MCPWM_FH2_CLR_OST_V 0x1 +#define MCPWM_FH2_CLR_OST_S 0 + +#define MCPWM_FH2_STATUS_REG(i) (REG_MCPWM_BASE(i) + 0x00e0) +/* MCPWM_FH2_OST_ON : RO ;bitpos:[1] ;default: 1'd0 ; */ +/*description: Set and reset by hardware. If set an one-shot mode action is on going*/ +#define MCPWM_FH2_OST_ON (BIT(1)) +#define MCPWM_FH2_OST_ON_M (BIT(1)) +#define MCPWM_FH2_OST_ON_V 0x1 +#define MCPWM_FH2_OST_ON_S 1 +/* MCPWM_FH2_CBC_ON : RO ;bitpos:[0] ;default: 1'd0 ; */ +/*description: Set and reset by hardware. If set an cycle-by-cycle mode action is on going*/ +#define MCPWM_FH2_CBC_ON (BIT(0)) +#define MCPWM_FH2_CBC_ON_M (BIT(0)) +#define MCPWM_FH2_CBC_ON_V 0x1 +#define MCPWM_FH2_CBC_ON_S 0 + +#define MCPWM_FAULT_DETECT_REG(i) (REG_MCPWM_BASE(i) + 0x00e4) +/* MCPWM_EVENT_F2 : RO ;bitpos:[8] ;default: 1'd0 ; */ +/*description: Set and reset by hardware. If set event_f2 is on going*/ +#define MCPWM_EVENT_F2 (BIT(8)) +#define MCPWM_EVENT_F2_M (BIT(8)) +#define MCPWM_EVENT_F2_V 0x1 +#define MCPWM_EVENT_F2_S 8 +/* MCPWM_EVENT_F1 : RO ;bitpos:[7] ;default: 1'd0 ; */ +/*description: Set and reset by hardware. If set event_f1 is on going*/ +#define MCPWM_EVENT_F1 (BIT(7)) +#define MCPWM_EVENT_F1_M (BIT(7)) +#define MCPWM_EVENT_F1_V 0x1 +#define MCPWM_EVENT_F1_S 7 +/* MCPWM_EVENT_F0 : RO ;bitpos:[6] ;default: 1'd0 ; */ +/*description: Set and reset by hardware. If set event_f0 is on going*/ +#define MCPWM_EVENT_F0 (BIT(6)) +#define MCPWM_EVENT_F0_M (BIT(6)) +#define MCPWM_EVENT_F0_V 0x1 +#define MCPWM_EVENT_F0_S 6 +/* MCPWM_F2_POLE : R/W ;bitpos:[5] ;default: 1'd0 ; */ +/*description: Set event_f2 trigger polarity on FAULT2 source from GPIO matrix. + 0: level low 1: level high*/ +#define MCPWM_F2_POLE (BIT(5)) +#define MCPWM_F2_POLE_M (BIT(5)) +#define MCPWM_F2_POLE_V 0x1 +#define MCPWM_F2_POLE_S 5 +/* MCPWM_F1_POLE : R/W ;bitpos:[4] ;default: 1'd0 ; */ +/*description: Set event_f1 trigger polarity on FAULT2 source from GPIO matrix. + 0: level low 1: level high*/ +#define MCPWM_F1_POLE (BIT(4)) +#define MCPWM_F1_POLE_M (BIT(4)) +#define MCPWM_F1_POLE_V 0x1 +#define MCPWM_F1_POLE_S 4 +/* MCPWM_F0_POLE : R/W ;bitpos:[3] ;default: 1'd0 ; */ +/*description: Set event_f0 trigger polarity on FAULT2 source from GPIO matrix. + 0: level low 1: level high*/ +#define MCPWM_F0_POLE (BIT(3)) +#define MCPWM_F0_POLE_M (BIT(3)) +#define MCPWM_F0_POLE_V 0x1 +#define MCPWM_F0_POLE_S 3 +/* MCPWM_F2_EN : R/W ;bitpos:[2] ;default: 1'd0 ; */ +/*description: Set to enable generation of event_f2*/ +#define MCPWM_F2_EN (BIT(2)) +#define MCPWM_F2_EN_M (BIT(2)) +#define MCPWM_F2_EN_V 0x1 +#define MCPWM_F2_EN_S 2 +/* MCPWM_F1_EN : R/W ;bitpos:[1] ;default: 1'd0 ; */ +/*description: Set to enable generation of event_f1*/ +#define MCPWM_F1_EN (BIT(1)) +#define MCPWM_F1_EN_M (BIT(1)) +#define MCPWM_F1_EN_V 0x1 +#define MCPWM_F1_EN_S 1 +/* MCPWM_F0_EN : R/W ;bitpos:[0] ;default: 1'd0 ; */ +/*description: Set to enable generation of event_f0*/ +#define MCPWM_F0_EN (BIT(0)) +#define MCPWM_F0_EN_M (BIT(0)) +#define MCPWM_F0_EN_V 0x1 +#define MCPWM_F0_EN_S 0 + +#define MCPWM_CAP_TIMER_CFG_REG(i) (REG_MCPWM_BASE(i) + 0x00e8) +/* MCPWM_CAP_SYNC_SW : WO ;bitpos:[5] ;default: 1'd0 ; */ +/*description: Set this bit to force a capture timer sync capture timer is + loaded with value in phase register.*/ +#define MCPWM_CAP_SYNC_SW (BIT(5)) +#define MCPWM_CAP_SYNC_SW_M (BIT(5)) +#define MCPWM_CAP_SYNC_SW_V 0x1 +#define MCPWM_CAP_SYNC_SW_S 5 +/* MCPWM_CAP_SYNCI_SEL : R/W ;bitpos:[4:2] ;default: 3'd0 ; */ +/*description: Capture module sync input selection. 0: none 1: timer0 synco + 2: timer1 synco 3: timer2 synco 4: SYNC0 from GPIO matrix 5: SYNC1 from GPIO matrix 6: SYNC2 from GPIO matrix*/ +#define MCPWM_CAP_SYNCI_SEL 0x00000007 +#define MCPWM_CAP_SYNCI_SEL_M ((MCPWM_CAP_SYNCI_SEL_V)<<(MCPWM_CAP_SYNCI_SEL_S)) +#define MCPWM_CAP_SYNCI_SEL_V 0x7 +#define MCPWM_CAP_SYNCI_SEL_S 2 +/* MCPWM_CAP_SYNCI_EN : R/W ;bitpos:[1] ;default: 1'd0 ; */ +/*description: When set capture timer sync is enabled.*/ +#define MCPWM_CAP_SYNCI_EN (BIT(1)) +#define MCPWM_CAP_SYNCI_EN_M (BIT(1)) +#define MCPWM_CAP_SYNCI_EN_V 0x1 +#define MCPWM_CAP_SYNCI_EN_S 1 +/* MCPWM_CAP_TIMER_EN : R/W ;bitpos:[0] ;default: 1'd0 ; */ +/*description: When set capture timer incrementing under APB_clk is enabled.*/ +#define MCPWM_CAP_TIMER_EN (BIT(0)) +#define MCPWM_CAP_TIMER_EN_M (BIT(0)) +#define MCPWM_CAP_TIMER_EN_V 0x1 +#define MCPWM_CAP_TIMER_EN_S 0 + +#define MCPWM_CAP_TIMER_PHASE_REG(i) (REG_MCPWM_BASE(i) + 0x00ec) +/* MCPWM_CAP_PHASE : R/W ;bitpos:[31:0] ;default: 32'd0 ; */ +/*description: Phase value for capture timer sync operation.*/ +#define MCPWM_CAP_PHASE 0xFFFFFFFF +#define MCPWM_CAP_PHASE_M ((MCPWM_CAP_PHASE_V)<<(MCPWM_CAP_PHASE_S)) +#define MCPWM_CAP_PHASE_V 0xFFFFFFFF +#define MCPWM_CAP_PHASE_S 0 + +#define MCPWM_CAP_CH0_CFG_REG(i) (REG_MCPWM_BASE(i) + 0x00f0) +/* MCPWM_CAP0_SW : WO ;bitpos:[12] ;default: 1'd0 ; */ +/*description: Write 1 will trigger a software forced capture on channel 0*/ +#define MCPWM_CAP0_SW (BIT(12)) +#define MCPWM_CAP0_SW_M (BIT(12)) +#define MCPWM_CAP0_SW_V 0x1 +#define MCPWM_CAP0_SW_S 12 +/* MCPWM_CAP0_IN_INVERT : R/W ;bitpos:[11] ;default: 1'd0 ; */ +/*description: When set CAP0 form GPIO matrix is inverted before prescale*/ +#define MCPWM_CAP0_IN_INVERT (BIT(11)) +#define MCPWM_CAP0_IN_INVERT_M (BIT(11)) +#define MCPWM_CAP0_IN_INVERT_V 0x1 +#define MCPWM_CAP0_IN_INVERT_S 11 +/* MCPWM_CAP0_PRESCALE : R/W ;bitpos:[10:3] ;default: 8'd0 ; */ +/*description: Value of prescale on possitive edge of CAP0. Prescale value = + PWM_CAP0_PRESCALE + 1*/ +#define MCPWM_CAP0_PRESCALE 0x000000FF +#define MCPWM_CAP0_PRESCALE_M ((MCPWM_CAP0_PRESCALE_V)<<(MCPWM_CAP0_PRESCALE_S)) +#define MCPWM_CAP0_PRESCALE_V 0xFF +#define MCPWM_CAP0_PRESCALE_S 3 +/* MCPWM_CAP0_MODE : R/W ;bitpos:[2:1] ;default: 2'd0 ; */ +/*description: Edge of capture on channel 0 after prescale. bit0: negedge cap + en bit1: posedge cap en*/ +#define MCPWM_CAP0_MODE 0x00000003 +#define MCPWM_CAP0_MODE_M ((MCPWM_CAP0_MODE_V)<<(MCPWM_CAP0_MODE_S)) +#define MCPWM_CAP0_MODE_V 0x3 +#define MCPWM_CAP0_MODE_S 1 +/* MCPWM_CAP0_EN : R/W ;bitpos:[0] ;default: 1'd0 ; */ +/*description: When set capture on channel 0 is enabled*/ +#define MCPWM_CAP0_EN (BIT(0)) +#define MCPWM_CAP0_EN_M (BIT(0)) +#define MCPWM_CAP0_EN_V 0x1 +#define MCPWM_CAP0_EN_S 0 + +#define MCPWM_CAP_CH1_CFG_REG(i) (REG_MCPWM_BASE(i) + 0x00f4) +/* MCPWM_CAP1_SW : WO ;bitpos:[12] ;default: 1'd0 ; */ +/*description: Write 1 will trigger a software forced capture on channel 1*/ +#define MCPWM_CAP1_SW (BIT(12)) +#define MCPWM_CAP1_SW_M (BIT(12)) +#define MCPWM_CAP1_SW_V 0x1 +#define MCPWM_CAP1_SW_S 12 +/* MCPWM_CAP1_IN_INVERT : R/W ;bitpos:[11] ;default: 1'd0 ; */ +/*description: When set CAP1 form GPIO matrix is inverted before prescale*/ +#define MCPWM_CAP1_IN_INVERT (BIT(11)) +#define MCPWM_CAP1_IN_INVERT_M (BIT(11)) +#define MCPWM_CAP1_IN_INVERT_V 0x1 +#define MCPWM_CAP1_IN_INVERT_S 11 +/* MCPWM_CAP1_PRESCALE : R/W ;bitpos:[10:3] ;default: 8'd0 ; */ +/*description: Value of prescale on possitive edge of CAP1. Prescale value = + PWM_CAP1_PRESCALE + 1*/ +#define MCPWM_CAP1_PRESCALE 0x000000FF +#define MCPWM_CAP1_PRESCALE_M ((MCPWM_CAP1_PRESCALE_V)<<(MCPWM_CAP1_PRESCALE_S)) +#define MCPWM_CAP1_PRESCALE_V 0xFF +#define MCPWM_CAP1_PRESCALE_S 3 +/* MCPWM_CAP1_MODE : R/W ;bitpos:[2:1] ;default: 2'd0 ; */ +/*description: Edge of capture on channel 1 after prescale. bit0: negedge cap + en bit1: posedge cap en*/ +#define MCPWM_CAP1_MODE 0x00000003 +#define MCPWM_CAP1_MODE_M ((MCPWM_CAP1_MODE_V)<<(MCPWM_CAP1_MODE_S)) +#define MCPWM_CAP1_MODE_V 0x3 +#define MCPWM_CAP1_MODE_S 1 +/* MCPWM_CAP1_EN : R/W ;bitpos:[0] ;default: 1'd0 ; */ +/*description: When set capture on channel 1 is enabled*/ +#define MCPWM_CAP1_EN (BIT(0)) +#define MCPWM_CAP1_EN_M (BIT(0)) +#define MCPWM_CAP1_EN_V 0x1 +#define MCPWM_CAP1_EN_S 0 + +#define MCPWM_CAP_CH2_CFG_REG(i) (REG_MCPWM_BASE(i) + 0x00f8) +/* MCPWM_CAP2_SW : WO ;bitpos:[12] ;default: 1'd0 ; */ +/*description: Write 1 will trigger a software forced capture on channel 2*/ +#define MCPWM_CAP2_SW (BIT(12)) +#define MCPWM_CAP2_SW_M (BIT(12)) +#define MCPWM_CAP2_SW_V 0x1 +#define MCPWM_CAP2_SW_S 12 +/* MCPWM_CAP2_IN_INVERT : R/W ;bitpos:[11] ;default: 1'd0 ; */ +/*description: When set CAP2 form GPIO matrix is inverted before prescale*/ +#define MCPWM_CAP2_IN_INVERT (BIT(11)) +#define MCPWM_CAP2_IN_INVERT_M (BIT(11)) +#define MCPWM_CAP2_IN_INVERT_V 0x1 +#define MCPWM_CAP2_IN_INVERT_S 11 +/* MCPWM_CAP2_PRESCALE : R/W ;bitpos:[10:3] ;default: 8'd0 ; */ +/*description: Value of prescale on possitive edge of CAP2. Prescale value = + PWM_CAP2_PRESCALE + 1*/ +#define MCPWM_CAP2_PRESCALE 0x000000FF +#define MCPWM_CAP2_PRESCALE_M ((MCPWM_CAP2_PRESCALE_V)<<(MCPWM_CAP2_PRESCALE_S)) +#define MCPWM_CAP2_PRESCALE_V 0xFF +#define MCPWM_CAP2_PRESCALE_S 3 +/* MCPWM_CAP2_MODE : R/W ;bitpos:[2:1] ;default: 2'd0 ; */ +/*description: Edge of capture on channel 2 after prescale. bit0: negedge cap + en bit1: posedge cap en*/ +#define MCPWM_CAP2_MODE 0x00000003 +#define MCPWM_CAP2_MODE_M ((MCPWM_CAP2_MODE_V)<<(MCPWM_CAP2_MODE_S)) +#define MCPWM_CAP2_MODE_V 0x3 +#define MCPWM_CAP2_MODE_S 1 +/* MCPWM_CAP2_EN : R/W ;bitpos:[0] ;default: 1'd0 ; */ +/*description: When set capture on channel 2 is enabled*/ +#define MCPWM_CAP2_EN (BIT(0)) +#define MCPWM_CAP2_EN_M (BIT(0)) +#define MCPWM_CAP2_EN_V 0x1 +#define MCPWM_CAP2_EN_S 0 + +#define MCPWM_CAP_CH0_REG(i) (REG_MCPWM_BASE(i) + 0x00fc) +/* MCPWM_CAP0_VALUE : RO ;bitpos:[31:0] ;default: 32'd0 ; */ +/*description: Value of last capture on channel 0*/ +#define MCPWM_CAP0_VALUE 0xFFFFFFFF +#define MCPWM_CAP0_VALUE_M ((MCPWM_CAP0_VALUE_V)<<(MCPWM_CAP0_VALUE_S)) +#define MCPWM_CAP0_VALUE_V 0xFFFFFFFF +#define MCPWM_CAP0_VALUE_S 0 + +#define MCPWM_CAP_CH1_REG(i) (REG_MCPWM_BASE(i) + 0x0100) +/* MCPWM_CAP1_VALUE : RO ;bitpos:[31:0] ;default: 32'd0 ; */ +/*description: Value of last capture on channel 1*/ +#define MCPWM_CAP1_VALUE 0xFFFFFFFF +#define MCPWM_CAP1_VALUE_M ((MCPWM_CAP1_VALUE_V)<<(MCPWM_CAP1_VALUE_S)) +#define MCPWM_CAP1_VALUE_V 0xFFFFFFFF +#define MCPWM_CAP1_VALUE_S 0 + +#define MCPWM_CAP_CH2_REG(i) (REG_MCPWM_BASE(i) + 0x0104) +/* MCPWM_CAP2_VALUE : RO ;bitpos:[31:0] ;default: 32'd0 ; */ +/*description: Value of last capture on channel 2*/ +#define MCPWM_CAP2_VALUE 0xFFFFFFFF +#define MCPWM_CAP2_VALUE_M ((MCPWM_CAP2_VALUE_V)<<(MCPWM_CAP2_VALUE_S)) +#define MCPWM_CAP2_VALUE_V 0xFFFFFFFF +#define MCPWM_CAP2_VALUE_S 0 + +#define MCPWM_CAP_STATUS_REG(i) (REG_MCPWM_BASE(i) + 0x0108) +/* MCPWM_CAP2_EDGE : RO ;bitpos:[2] ;default: 1'd0 ; */ +/*description: Edge of last capture trigger on channel 2 0: posedge 1: negedge*/ +#define MCPWM_CAP2_EDGE (BIT(2)) +#define MCPWM_CAP2_EDGE_M (BIT(2)) +#define MCPWM_CAP2_EDGE_V 0x1 +#define MCPWM_CAP2_EDGE_S 2 +/* MCPWM_CAP1_EDGE : RO ;bitpos:[1] ;default: 1'd0 ; */ +/*description: Edge of last capture trigger on channel 1 0: posedge 1: negedge*/ +#define MCPWM_CAP1_EDGE (BIT(1)) +#define MCPWM_CAP1_EDGE_M (BIT(1)) +#define MCPWM_CAP1_EDGE_V 0x1 +#define MCPWM_CAP1_EDGE_S 1 +/* MCPWM_CAP0_EDGE : RO ;bitpos:[0] ;default: 1'd0 ; */ +/*description: Edge of last capture trigger on channel 0 0: posedge 1: negedge*/ +#define MCPWM_CAP0_EDGE (BIT(0)) +#define MCPWM_CAP0_EDGE_M (BIT(0)) +#define MCPWM_CAP0_EDGE_V 0x1 +#define MCPWM_CAP0_EDGE_S 0 + +#define MCPWM_UPDATE_CFG_REG(i) (REG_MCPWM_BASE(i) + 0x010c) +/* MCPWM_OP2_FORCE_UP : R/W ;bitpos:[7] ;default: 1'd0 ; */ +/*description: A toggle (software negation of value of this bit) will trigger + a forced update of active registers in PWM operator 2*/ +#define MCPWM_OP2_FORCE_UP (BIT(7)) +#define MCPWM_OP2_FORCE_UP_M (BIT(7)) +#define MCPWM_OP2_FORCE_UP_V 0x1 +#define MCPWM_OP2_FORCE_UP_S 7 +/* MCPWM_OP2_UP_EN : R/W ;bitpos:[6] ;default: 1'd1 ; */ +/*description: When set and PWM_GLOBAL_UP_EN is set update of active registers + in PWM operator 2 are enabled*/ +#define MCPWM_OP2_UP_EN (BIT(6)) +#define MCPWM_OP2_UP_EN_M (BIT(6)) +#define MCPWM_OP2_UP_EN_V 0x1 +#define MCPWM_OP2_UP_EN_S 6 +/* MCPWM_OP1_FORCE_UP : R/W ;bitpos:[5] ;default: 1'd0 ; */ +/*description: A toggle (software negation of value of this bit) will trigger + a forced update of active registers in PWM operator 1*/ +#define MCPWM_OP1_FORCE_UP (BIT(5)) +#define MCPWM_OP1_FORCE_UP_M (BIT(5)) +#define MCPWM_OP1_FORCE_UP_V 0x1 +#define MCPWM_OP1_FORCE_UP_S 5 +/* MCPWM_OP1_UP_EN : R/W ;bitpos:[4] ;default: 1'd1 ; */ +/*description: When set and PWM_GLOBAL_UP_EN is set update of active registers + in PWM operator 1 are enabled*/ +#define MCPWM_OP1_UP_EN (BIT(4)) +#define MCPWM_OP1_UP_EN_M (BIT(4)) +#define MCPWM_OP1_UP_EN_V 0x1 +#define MCPWM_OP1_UP_EN_S 4 +/* MCPWM_OP0_FORCE_UP : R/W ;bitpos:[3] ;default: 1'd0 ; */ +/*description: A toggle (software negation of value of this bit) will trigger + a forced update of active registers in PWM operator 0*/ +#define MCPWM_OP0_FORCE_UP (BIT(3)) +#define MCPWM_OP0_FORCE_UP_M (BIT(3)) +#define MCPWM_OP0_FORCE_UP_V 0x1 +#define MCPWM_OP0_FORCE_UP_S 3 +/* MCPWM_OP0_UP_EN : R/W ;bitpos:[2] ;default: 1'd1 ; */ +/*description: When set and PWM_GLOBAL_UP_EN is set update of active registers + in PWM operator 0 are enabled*/ +#define MCPWM_OP0_UP_EN (BIT(2)) +#define MCPWM_OP0_UP_EN_M (BIT(2)) +#define MCPWM_OP0_UP_EN_V 0x1 +#define MCPWM_OP0_UP_EN_S 2 +/* MCPWM_GLOBAL_FORCE_UP : R/W ;bitpos:[1] ;default: 1'd0 ; */ +/*description: A toggle (software negation of value of this bit) will trigger + a forced update of all active registers in MCPWM module*/ +#define MCPWM_GLOBAL_FORCE_UP (BIT(1)) +#define MCPWM_GLOBAL_FORCE_UP_M (BIT(1)) +#define MCPWM_GLOBAL_FORCE_UP_V 0x1 +#define MCPWM_GLOBAL_FORCE_UP_S 1 +/* MCPWM_GLOBAL_UP_EN : R/W ;bitpos:[0] ;default: 1'd1 ; */ +/*description: The global enable of update of all active registers in MCPWM module*/ +#define MCPWM_GLOBAL_UP_EN (BIT(0)) +#define MCPWM_GLOBAL_UP_EN_M (BIT(0)) +#define MCPWM_GLOBAL_UP_EN_V 0x1 +#define MCPWM_GLOBAL_UP_EN_S 0 + +#define MCMCPWM_INT_ENA_MCPWM_REG(i) (REG_MCPWM_BASE(i) + 0x0110) +/* MCPWM_CAP2_INT_ENA : R/W ;bitpos:[29] ;default: 1'd0 ; */ +/*description: The enable bit for interrupt triggered by captureon channel 2*/ +#define MCPWM_CAP2_INT_ENA (BIT(29)) +#define MCPWM_CAP2_INT_ENA_M (BIT(29)) +#define MCPWM_CAP2_INT_ENA_V 0x1 +#define MCPWM_CAP2_INT_ENA_S 29 +/* MCPWM_CAP1_INT_ENA : R/W ;bitpos:[28] ;default: 1'd0 ; */ +/*description: The enable bit for interrupt triggered by captureon channel 1*/ +#define MCPWM_CAP1_INT_ENA (BIT(28)) +#define MCPWM_CAP1_INT_ENA_M (BIT(28)) +#define MCPWM_CAP1_INT_ENA_V 0x1 +#define MCPWM_CAP1_INT_ENA_S 28 +/* MCPWM_CAP0_INT_ENA : R/W ;bitpos:[27] ;default: 1'd0 ; */ +/*description: The enable bit for interrupt triggered by captureon channel 0*/ +#define MCPWM_CAP0_INT_ENA (BIT(27)) +#define MCPWM_CAP0_INT_ENA_M (BIT(27)) +#define MCPWM_CAP0_INT_ENA_V 0x1 +#define MCPWM_CAP0_INT_ENA_S 27 +/* MCPWM_FH2_OST_INT_ENA : R/W ;bitpos:[26] ;default: 1'd0 ; */ +/*description: The enable bit for interrupt triggered by an one-shot mode action on PWM2*/ +#define MCPWM_FH2_OST_INT_ENA (BIT(26)) +#define MCPWM_FH2_OST_INT_ENA_M (BIT(26)) +#define MCPWM_FH2_OST_INT_ENA_V 0x1 +#define MCPWM_FH2_OST_INT_ENA_S 26 +/* MCPWM_FH1_OST_INT_ENA : R/W ;bitpos:[25] ;default: 1'd0 ; */ +/*description: The enable bit for interrupt triggered by an one-shot mode action on PWM0*/ +#define MCPWM_FH1_OST_INT_ENA (BIT(25)) +#define MCPWM_FH1_OST_INT_ENA_M (BIT(25)) +#define MCPWM_FH1_OST_INT_ENA_V 0x1 +#define MCPWM_FH1_OST_INT_ENA_S 25 +/* MCPWM_FH0_OST_INT_ENA : R/W ;bitpos:[24] ;default: 1'd0 ; */ +/*description: The enable bit for interrupt triggered by an one-shot mode action on PWM0*/ +#define MCPWM_FH0_OST_INT_ENA (BIT(24)) +#define MCPWM_FH0_OST_INT_ENA_M (BIT(24)) +#define MCPWM_FH0_OST_INT_ENA_V 0x1 +#define MCPWM_FH0_OST_INT_ENA_S 24 +/* MCPWM_FH2_CBC_INT_ENA : R/W ;bitpos:[23] ;default: 1'd0 ; */ +/*description: The enable bit for interrupt triggered by an cycle-by-cycle mode action on PWM2*/ +#define MCPWM_FH2_CBC_INT_ENA (BIT(23)) +#define MCPWM_FH2_CBC_INT_ENA_M (BIT(23)) +#define MCPWM_FH2_CBC_INT_ENA_V 0x1 +#define MCPWM_FH2_CBC_INT_ENA_S 23 +/* MCPWM_FH1_CBC_INT_ENA : R/W ;bitpos:[22] ;default: 1'd0 ; */ +/*description: The enable bit for interrupt triggered by an cycle-by-cycle mode action on PWM1*/ +#define MCPWM_FH1_CBC_INT_ENA (BIT(22)) +#define MCPWM_FH1_CBC_INT_ENA_M (BIT(22)) +#define MCPWM_FH1_CBC_INT_ENA_V 0x1 +#define MCPWM_FH1_CBC_INT_ENA_S 22 +/* MCPWM_FH0_CBC_INT_ENA : R/W ;bitpos:[21] ;default: 1'd0 ; */ +/*description: The enable bit for interrupt triggered by an cycle-by-cycle mode action on PWM0*/ +#define MCPWM_FH0_CBC_INT_ENA (BIT(21)) +#define MCPWM_FH0_CBC_INT_ENA_M (BIT(21)) +#define MCPWM_FH0_CBC_INT_ENA_V 0x1 +#define MCPWM_FH0_CBC_INT_ENA_S 21 +/* MCPWM_OP2_TEB_INT_ENA : R/W ;bitpos:[20] ;default: 1'd0 ; */ +/*description: The enable bit for interrupt triggered by a PWM operator 2 TEB event*/ +#define MCPWM_OP2_TEB_INT_ENA (BIT(20)) +#define MCPWM_OP2_TEB_INT_ENA_M (BIT(20)) +#define MCPWM_OP2_TEB_INT_ENA_V 0x1 +#define MCPWM_OP2_TEB_INT_ENA_S 20 +/* MCPWM_OP1_TEB_INT_ENA : R/W ;bitpos:[19] ;default: 1'd0 ; */ +/*description: The enable bit for interrupt triggered by a PWM operator 1 TEB event*/ +#define MCPWM_OP1_TEB_INT_ENA (BIT(19)) +#define MCPWM_OP1_TEB_INT_ENA_M (BIT(19)) +#define MCPWM_OP1_TEB_INT_ENA_V 0x1 +#define MCPWM_OP1_TEB_INT_ENA_S 19 +/* MCPWM_OP0_TEB_INT_ENA : R/W ;bitpos:[18] ;default: 1'd0 ; */ +/*description: The enable bit for interrupt triggered by a PWM operator 0 TEB event*/ +#define MCPWM_OP0_TEB_INT_ENA (BIT(18)) +#define MCPWM_OP0_TEB_INT_ENA_M (BIT(18)) +#define MCPWM_OP0_TEB_INT_ENA_V 0x1 +#define MCPWM_OP0_TEB_INT_ENA_S 18 +/* MCPWM_OP2_TEA_INT_ENA : R/W ;bitpos:[17] ;default: 1'd0 ; */ +/*description: The enable bit for interrupt triggered by a PWM operator 2 TEA event*/ +#define MCPWM_OP2_TEA_INT_ENA (BIT(17)) +#define MCPWM_OP2_TEA_INT_ENA_M (BIT(17)) +#define MCPWM_OP2_TEA_INT_ENA_V 0x1 +#define MCPWM_OP2_TEA_INT_ENA_S 17 +/* MCPWM_OP1_TEA_INT_ENA : R/W ;bitpos:[16] ;default: 1'd0 ; */ +/*description: The enable bit for interrupt triggered by a PWM operator 1 TEA event*/ +#define MCPWM_OP1_TEA_INT_ENA (BIT(16)) +#define MCPWM_OP1_TEA_INT_ENA_M (BIT(16)) +#define MCPWM_OP1_TEA_INT_ENA_V 0x1 +#define MCPWM_OP1_TEA_INT_ENA_S 16 +/* MCPWM_OP0_TEA_INT_ENA : R/W ;bitpos:[15] ;default: 1'd0 ; */ +/*description: The enable bit for interrupt triggered by a PWM operator 0 TEA event*/ +#define MCPWM_OP0_TEA_INT_ENA (BIT(15)) +#define MCPWM_OP0_TEA_INT_ENA_M (BIT(15)) +#define MCPWM_OP0_TEA_INT_ENA_V 0x1 +#define MCPWM_OP0_TEA_INT_ENA_S 15 +/* MCPWM_FAULT2_CLR_INT_ENA : R/W ;bitpos:[14] ;default: 1'd0 ; */ +/*description: The enable bit for interrupt triggered when event_f2 ends*/ +#define MCPWM_FAULT2_CLR_INT_ENA (BIT(14)) +#define MCPWM_FAULT2_CLR_INT_ENA_M (BIT(14)) +#define MCPWM_FAULT2_CLR_INT_ENA_V 0x1 +#define MCPWM_FAULT2_CLR_INT_ENA_S 14 +/* MCPWM_FAULT1_CLR_INT_ENA : R/W ;bitpos:[13] ;default: 1'd0 ; */ +/*description: The enable bit for interrupt triggered when event_f1 ends*/ +#define MCPWM_FAULT1_CLR_INT_ENA (BIT(13)) +#define MCPWM_FAULT1_CLR_INT_ENA_M (BIT(13)) +#define MCPWM_FAULT1_CLR_INT_ENA_V 0x1 +#define MCPWM_FAULT1_CLR_INT_ENA_S 13 +/* MCPWM_FAULT0_CLR_INT_ENA : R/W ;bitpos:[12] ;default: 1'd0 ; */ +/*description: The enable bit for interrupt triggered when event_f0 ends*/ +#define MCPWM_FAULT0_CLR_INT_ENA (BIT(12)) +#define MCPWM_FAULT0_CLR_INT_ENA_M (BIT(12)) +#define MCPWM_FAULT0_CLR_INT_ENA_V 0x1 +#define MCPWM_FAULT0_CLR_INT_ENA_S 12 +/* MCPWM_FAULT2_INT_ENA : R/W ;bitpos:[11] ;default: 1'd0 ; */ +/*description: The enable bit for interrupt triggered when event_f2 starts*/ +#define MCPWM_FAULT2_INT_ENA (BIT(11)) +#define MCPWM_FAULT2_INT_ENA_M (BIT(11)) +#define MCPWM_FAULT2_INT_ENA_V 0x1 +#define MCPWM_FAULT2_INT_ENA_S 11 +/* MCPWM_FAULT1_INT_ENA : R/W ;bitpos:[10] ;default: 1'd0 ; */ +/*description: The enable bit for interrupt triggered when event_f1 starts*/ +#define MCPWM_FAULT1_INT_ENA (BIT(10)) +#define MCPWM_FAULT1_INT_ENA_M (BIT(10)) +#define MCPWM_FAULT1_INT_ENA_V 0x1 +#define MCPWM_FAULT1_INT_ENA_S 10 +/* MCPWM_FAULT0_INT_ENA : R/W ;bitpos:[9] ;default: 1'd0 ; */ +/*description: The enable bit for interrupt triggered when event_f0 starts*/ +#define MCPWM_FAULT0_INT_ENA (BIT(9)) +#define MCPWM_FAULT0_INT_ENA_M (BIT(9)) +#define MCPWM_FAULT0_INT_ENA_V 0x1 +#define MCPWM_FAULT0_INT_ENA_S 9 +/* MCPWM_TIMER2_TEP_INT_ENA : R/W ;bitpos:[8] ;default: 1'h0 ; */ +/*description: The enable bit for interrupt triggered by a PWM timer 2 TEP event*/ +#define MCPWM_TIMER2_TEP_INT_ENA (BIT(8)) +#define MCPWM_TIMER2_TEP_INT_ENA_M (BIT(8)) +#define MCPWM_TIMER2_TEP_INT_ENA_V 0x1 +#define MCPWM_TIMER2_TEP_INT_ENA_S 8 +/* MCPWM_TIMER1_TEP_INT_ENA : R/W ;bitpos:[7] ;default: 1'h0 ; */ +/*description: The enable bit for interrupt triggered by a PWM timer 1 TEP event*/ +#define MCPWM_TIMER1_TEP_INT_ENA (BIT(7)) +#define MCPWM_TIMER1_TEP_INT_ENA_M (BIT(7)) +#define MCPWM_TIMER1_TEP_INT_ENA_V 0x1 +#define MCPWM_TIMER1_TEP_INT_ENA_S 7 +/* MCPWM_TIMER0_TEP_INT_ENA : R/W ;bitpos:[6] ;default: 1'h0 ; */ +/*description: The enable bit for interrupt triggered by a PWM timer 0 TEP event*/ +#define MCPWM_TIMER0_TEP_INT_ENA (BIT(6)) +#define MCPWM_TIMER0_TEP_INT_ENA_M (BIT(6)) +#define MCPWM_TIMER0_TEP_INT_ENA_V 0x1 +#define MCPWM_TIMER0_TEP_INT_ENA_S 6 +/* MCPWM_TIMER2_TEZ_INT_ENA : R/W ;bitpos:[5] ;default: 1'h0 ; */ +/*description: The enable bit for interrupt triggered by a PWM timer 2 TEZ event*/ +#define MCPWM_TIMER2_TEZ_INT_ENA (BIT(5)) +#define MCPWM_TIMER2_TEZ_INT_ENA_M (BIT(5)) +#define MCPWM_TIMER2_TEZ_INT_ENA_V 0x1 +#define MCPWM_TIMER2_TEZ_INT_ENA_S 5 +/* MCPWM_TIMER1_TEZ_INT_ENA : R/W ;bitpos:[4] ;default: 1'h0 ; */ +/*description: The enable bit for interrupt triggered by a PWM timer 1 TEZ event*/ +#define MCPWM_TIMER1_TEZ_INT_ENA (BIT(4)) +#define MCPWM_TIMER1_TEZ_INT_ENA_M (BIT(4)) +#define MCPWM_TIMER1_TEZ_INT_ENA_V 0x1 +#define MCPWM_TIMER1_TEZ_INT_ENA_S 4 +/* MCPWM_TIMER0_TEZ_INT_ENA : R/W ;bitpos:[3] ;default: 1'h0 ; */ +/*description: The enable bit for interrupt triggered by a PWM timer 0 TEZ event*/ +#define MCPWM_TIMER0_TEZ_INT_ENA (BIT(3)) +#define MCPWM_TIMER0_TEZ_INT_ENA_M (BIT(3)) +#define MCPWM_TIMER0_TEZ_INT_ENA_V 0x1 +#define MCPWM_TIMER0_TEZ_INT_ENA_S 3 +/* MCPWM_TIMER2_STOP_INT_ENA : R/W ;bitpos:[2] ;default: 1'h0 ; */ +/*description: The enable bit for interrupt triggered when timer 2 stops*/ +#define MCPWM_TIMER2_STOP_INT_ENA (BIT(2)) +#define MCPWM_TIMER2_STOP_INT_ENA_M (BIT(2)) +#define MCPWM_TIMER2_STOP_INT_ENA_V 0x1 +#define MCPWM_TIMER2_STOP_INT_ENA_S 2 +/* MCPWM_TIMER1_STOP_INT_ENA : R/W ;bitpos:[1] ;default: 1'h0 ; */ +/*description: The enable bit for interrupt triggered when timer 1 stops*/ +#define MCPWM_TIMER1_STOP_INT_ENA (BIT(1)) +#define MCPWM_TIMER1_STOP_INT_ENA_M (BIT(1)) +#define MCPWM_TIMER1_STOP_INT_ENA_V 0x1 +#define MCPWM_TIMER1_STOP_INT_ENA_S 1 +/* MCPWM_TIMER0_STOP_INT_ENA : R/W ;bitpos:[0] ;default: 1'h0 ; */ +/*description: The enable bit for interrupt triggered when timer 0 stops*/ +#define MCPWM_TIMER0_STOP_INT_ENA (BIT(0)) +#define MCPWM_TIMER0_STOP_INT_ENA_M (BIT(0)) +#define MCPWM_TIMER0_STOP_INT_ENA_V 0x1 +#define MCPWM_TIMER0_STOP_INT_ENA_S 0 + +#define MCMCPWM_INT_RAW_MCPWM_REG(i) (REG_MCPWM_BASE(i) + 0x0114) +/* MCPWM_CAP2_INT_RAW : RO ;bitpos:[29] ;default: 1'd0 ; */ +/*description: The raw status bit for interrupt triggered by captureon channel 2*/ +#define MCPWM_CAP2_INT_RAW (BIT(29)) +#define MCPWM_CAP2_INT_RAW_M (BIT(29)) +#define MCPWM_CAP2_INT_RAW_V 0x1 +#define MCPWM_CAP2_INT_RAW_S 29 +/* MCPWM_CAP1_INT_RAW : RO ;bitpos:[28] ;default: 1'd0 ; */ +/*description: The raw status bit for interrupt triggered by captureon channel 1*/ +#define MCPWM_CAP1_INT_RAW (BIT(28)) +#define MCPWM_CAP1_INT_RAW_M (BIT(28)) +#define MCPWM_CAP1_INT_RAW_V 0x1 +#define MCPWM_CAP1_INT_RAW_S 28 +/* MCPWM_CAP0_INT_RAW : RO ;bitpos:[27] ;default: 1'd0 ; */ +/*description: The raw status bit for interrupt triggered by captureon channel 0*/ +#define MCPWM_CAP0_INT_RAW (BIT(27)) +#define MCPWM_CAP0_INT_RAW_M (BIT(27)) +#define MCPWM_CAP0_INT_RAW_V 0x1 +#define MCPWM_CAP0_INT_RAW_S 27 +/* MCPWM_FH2_OST_INT_RAW : RO ;bitpos:[26] ;default: 1'd0 ; */ +/*description: The raw status bit for interrupt triggered by an one-shot mode action on PWM2*/ +#define MCPWM_FH2_OST_INT_RAW (BIT(26)) +#define MCPWM_FH2_OST_INT_RAW_M (BIT(26)) +#define MCPWM_FH2_OST_INT_RAW_V 0x1 +#define MCPWM_FH2_OST_INT_RAW_S 26 +/* MCPWM_FH1_OST_INT_RAW : RO ;bitpos:[25] ;default: 1'd0 ; */ +/*description: The raw status bit for interrupt triggered by an one-shot mode action on PWM0*/ +#define MCPWM_FH1_OST_INT_RAW (BIT(25)) +#define MCPWM_FH1_OST_INT_RAW_M (BIT(25)) +#define MCPWM_FH1_OST_INT_RAW_V 0x1 +#define MCPWM_FH1_OST_INT_RAW_S 25 +/* MCPWM_FH0_OST_INT_RAW : RO ;bitpos:[24] ;default: 1'd0 ; */ +/*description: The raw status bit for interrupt triggered by an one-shot mode action on PWM0*/ +#define MCPWM_FH0_OST_INT_RAW (BIT(24)) +#define MCPWM_FH0_OST_INT_RAW_M (BIT(24)) +#define MCPWM_FH0_OST_INT_RAW_V 0x1 +#define MCPWM_FH0_OST_INT_RAW_S 24 +/* MCPWM_FH2_CBC_INT_RAW : RO ;bitpos:[23] ;default: 1'd0 ; */ +/*description: The raw status bit for interrupt triggered by an cycle-by-cycle + mode action on PWM2*/ +#define MCPWM_FH2_CBC_INT_RAW (BIT(23)) +#define MCPWM_FH2_CBC_INT_RAW_M (BIT(23)) +#define MCPWM_FH2_CBC_INT_RAW_V 0x1 +#define MCPWM_FH2_CBC_INT_RAW_S 23 +/* MCPWM_FH1_CBC_INT_RAW : RO ;bitpos:[22] ;default: 1'd0 ; */ +/*description: The raw status bit for interrupt triggered by an cycle-by-cycle + mode action on PWM1*/ +#define MCPWM_FH1_CBC_INT_RAW (BIT(22)) +#define MCPWM_FH1_CBC_INT_RAW_M (BIT(22)) +#define MCPWM_FH1_CBC_INT_RAW_V 0x1 +#define MCPWM_FH1_CBC_INT_RAW_S 22 +/* MCPWM_FH0_CBC_INT_RAW : RO ;bitpos:[21] ;default: 1'd0 ; */ +/*description: The raw status bit for interrupt triggered by an cycle-by-cycle + mode action on PWM0*/ +#define MCPWM_FH0_CBC_INT_RAW (BIT(21)) +#define MCPWM_FH0_CBC_INT_RAW_M (BIT(21)) +#define MCPWM_FH0_CBC_INT_RAW_V 0x1 +#define MCPWM_FH0_CBC_INT_RAW_S 21 +/* MCPWM_OP2_TEB_INT_RAW : RO ;bitpos:[20] ;default: 1'd0 ; */ +/*description: The raw status bit for interrupt triggered by a PWM operator 2 TEB event*/ +#define MCPWM_OP2_TEB_INT_RAW (BIT(20)) +#define MCPWM_OP2_TEB_INT_RAW_M (BIT(20)) +#define MCPWM_OP2_TEB_INT_RAW_V 0x1 +#define MCPWM_OP2_TEB_INT_RAW_S 20 +/* MCPWM_OP1_TEB_INT_RAW : RO ;bitpos:[19] ;default: 1'd0 ; */ +/*description: The raw status bit for interrupt triggered by a PWM operator 1 TEB event*/ +#define MCPWM_OP1_TEB_INT_RAW (BIT(19)) +#define MCPWM_OP1_TEB_INT_RAW_M (BIT(19)) +#define MCPWM_OP1_TEB_INT_RAW_V 0x1 +#define MCPWM_OP1_TEB_INT_RAW_S 19 +/* MCPWM_OP0_TEB_INT_RAW : RO ;bitpos:[18] ;default: 1'd0 ; */ +/*description: The raw status bit for interrupt triggered by a PWM operator 0 TEB event*/ +#define MCPWM_OP0_TEB_INT_RAW (BIT(18)) +#define MCPWM_OP0_TEB_INT_RAW_M (BIT(18)) +#define MCPWM_OP0_TEB_INT_RAW_V 0x1 +#define MCPWM_OP0_TEB_INT_RAW_S 18 +/* MCPWM_OP2_TEA_INT_RAW : RO ;bitpos:[17] ;default: 1'd0 ; */ +/*description: The raw status bit for interrupt triggered by a PWM operator 2 TEA event*/ +#define MCPWM_OP2_TEA_INT_RAW (BIT(17)) +#define MCPWM_OP2_TEA_INT_RAW_M (BIT(17)) +#define MCPWM_OP2_TEA_INT_RAW_V 0x1 +#define MCPWM_OP2_TEA_INT_RAW_S 17 +/* MCPWM_OP1_TEA_INT_RAW : RO ;bitpos:[16] ;default: 1'd0 ; */ +/*description: The raw status bit for interrupt triggered by a PWM operator 1 TEA event*/ +#define MCPWM_OP1_TEA_INT_RAW (BIT(16)) +#define MCPWM_OP1_TEA_INT_RAW_M (BIT(16)) +#define MCPWM_OP1_TEA_INT_RAW_V 0x1 +#define MCPWM_OP1_TEA_INT_RAW_S 16 +/* MCPWM_OP0_TEA_INT_RAW : RO ;bitpos:[15] ;default: 1'd0 ; */ +/*description: The raw status bit for interrupt triggered by a PWM operator 0 TEA event*/ +#define MCPWM_OP0_TEA_INT_RAW (BIT(15)) +#define MCPWM_OP0_TEA_INT_RAW_M (BIT(15)) +#define MCPWM_OP0_TEA_INT_RAW_V 0x1 +#define MCPWM_OP0_TEA_INT_RAW_S 15 +/* MCPWM_FAULT2_CLR_INT_RAW : RO ;bitpos:[14] ;default: 1'd0 ; */ +/*description: The raw status bit for interrupt triggered when event_f2 ends*/ +#define MCPWM_FAULT2_CLR_INT_RAW (BIT(14)) +#define MCPWM_FAULT2_CLR_INT_RAW_M (BIT(14)) +#define MCPWM_FAULT2_CLR_INT_RAW_V 0x1 +#define MCPWM_FAULT2_CLR_INT_RAW_S 14 +/* MCPWM_FAULT1_CLR_INT_RAW : RO ;bitpos:[13] ;default: 1'd0 ; */ +/*description: The raw status bit for interrupt triggered when event_f1 ends*/ +#define MCPWM_FAULT1_CLR_INT_RAW (BIT(13)) +#define MCPWM_FAULT1_CLR_INT_RAW_M (BIT(13)) +#define MCPWM_FAULT1_CLR_INT_RAW_V 0x1 +#define MCPWM_FAULT1_CLR_INT_RAW_S 13 +/* MCPWM_FAULT0_CLR_INT_RAW : RO ;bitpos:[12] ;default: 1'd0 ; */ +/*description: The raw status bit for interrupt triggered when event_f0 ends*/ +#define MCPWM_FAULT0_CLR_INT_RAW (BIT(12)) +#define MCPWM_FAULT0_CLR_INT_RAW_M (BIT(12)) +#define MCPWM_FAULT0_CLR_INT_RAW_V 0x1 +#define MCPWM_FAULT0_CLR_INT_RAW_S 12 +/* MCPWM_FAULT2_INT_RAW : RO ;bitpos:[11] ;default: 1'd0 ; */ +/*description: The raw status bit for interrupt triggered when event_f2 starts*/ +#define MCPWM_FAULT2_INT_RAW (BIT(11)) +#define MCPWM_FAULT2_INT_RAW_M (BIT(11)) +#define MCPWM_FAULT2_INT_RAW_V 0x1 +#define MCPWM_FAULT2_INT_RAW_S 11 +/* MCPWM_FAULT1_INT_RAW : RO ;bitpos:[10] ;default: 1'd0 ; */ +/*description: The raw status bit for interrupt triggered when event_f1 starts*/ +#define MCPWM_FAULT1_INT_RAW (BIT(10)) +#define MCPWM_FAULT1_INT_RAW_M (BIT(10)) +#define MCPWM_FAULT1_INT_RAW_V 0x1 +#define MCPWM_FAULT1_INT_RAW_S 10 +/* MCPWM_FAULT0_INT_RAW : RO ;bitpos:[9] ;default: 1'd0 ; */ +/*description: The raw status bit for interrupt triggered when event_f0 starts*/ +#define MCPWM_FAULT0_INT_RAW (BIT(9)) +#define MCPWM_FAULT0_INT_RAW_M (BIT(9)) +#define MCPWM_FAULT0_INT_RAW_V 0x1 +#define MCPWM_FAULT0_INT_RAW_S 9 +/* MCPWM_TIMER2_TEP_INT_RAW : RO ;bitpos:[8] ;default: 1'h0 ; */ +/*description: The raw status bit for interrupt triggered by a PWM timer 2 TEP event*/ +#define MCPWM_TIMER2_TEP_INT_RAW (BIT(8)) +#define MCPWM_TIMER2_TEP_INT_RAW_M (BIT(8)) +#define MCPWM_TIMER2_TEP_INT_RAW_V 0x1 +#define MCPWM_TIMER2_TEP_INT_RAW_S 8 +/* MCPWM_TIMER1_TEP_INT_RAW : RO ;bitpos:[7] ;default: 1'h0 ; */ +/*description: The raw status bit for interrupt triggered by a PWM timer 1 TEP event*/ +#define MCPWM_TIMER1_TEP_INT_RAW (BIT(7)) +#define MCPWM_TIMER1_TEP_INT_RAW_M (BIT(7)) +#define MCPWM_TIMER1_TEP_INT_RAW_V 0x1 +#define MCPWM_TIMER1_TEP_INT_RAW_S 7 +/* MCPWM_TIMER0_TEP_INT_RAW : RO ;bitpos:[6] ;default: 1'h0 ; */ +/*description: The raw status bit for interrupt triggered by a PWM timer 0 TEP event*/ +#define MCPWM_TIMER0_TEP_INT_RAW (BIT(6)) +#define MCPWM_TIMER0_TEP_INT_RAW_M (BIT(6)) +#define MCPWM_TIMER0_TEP_INT_RAW_V 0x1 +#define MCPWM_TIMER0_TEP_INT_RAW_S 6 +/* MCPWM_TIMER2_TEZ_INT_RAW : RO ;bitpos:[5] ;default: 1'h0 ; */ +/*description: The raw status bit for interrupt triggered by a PWM timer 2 TEZ event*/ +#define MCPWM_TIMER2_TEZ_INT_RAW (BIT(5)) +#define MCPWM_TIMER2_TEZ_INT_RAW_M (BIT(5)) +#define MCPWM_TIMER2_TEZ_INT_RAW_V 0x1 +#define MCPWM_TIMER2_TEZ_INT_RAW_S 5 +/* MCPWM_TIMER1_TEZ_INT_RAW : RO ;bitpos:[4] ;default: 1'h0 ; */ +/*description: The raw status bit for interrupt triggered by a PWM timer 1 TEZ event*/ +#define MCPWM_TIMER1_TEZ_INT_RAW (BIT(4)) +#define MCPWM_TIMER1_TEZ_INT_RAW_M (BIT(4)) +#define MCPWM_TIMER1_TEZ_INT_RAW_V 0x1 +#define MCPWM_TIMER1_TEZ_INT_RAW_S 4 +/* MCPWM_TIMER0_TEZ_INT_RAW : RO ;bitpos:[3] ;default: 1'h0 ; */ +/*description: The raw status bit for interrupt triggered by a PWM timer 0 TEZ event*/ +#define MCPWM_TIMER0_TEZ_INT_RAW (BIT(3)) +#define MCPWM_TIMER0_TEZ_INT_RAW_M (BIT(3)) +#define MCPWM_TIMER0_TEZ_INT_RAW_V 0x1 +#define MCPWM_TIMER0_TEZ_INT_RAW_S 3 +/* MCPWM_TIMER2_STOP_INT_RAW : RO ;bitpos:[2] ;default: 1'h0 ; */ +/*description: The raw status bit for interrupt triggered when timer 2 stops*/ +#define MCPWM_TIMER2_STOP_INT_RAW (BIT(2)) +#define MCPWM_TIMER2_STOP_INT_RAW_M (BIT(2)) +#define MCPWM_TIMER2_STOP_INT_RAW_V 0x1 +#define MCPWM_TIMER2_STOP_INT_RAW_S 2 +/* MCPWM_TIMER1_STOP_INT_RAW : RO ;bitpos:[1] ;default: 1'h0 ; */ +/*description: The raw status bit for interrupt triggered when timer 1 stops*/ +#define MCPWM_TIMER1_STOP_INT_RAW (BIT(1)) +#define MCPWM_TIMER1_STOP_INT_RAW_M (BIT(1)) +#define MCPWM_TIMER1_STOP_INT_RAW_V 0x1 +#define MCPWM_TIMER1_STOP_INT_RAW_S 1 +/* MCPWM_TIMER0_STOP_INT_RAW : RO ;bitpos:[0] ;default: 1'h0 ; */ +/*description: The raw status bit for interrupt triggered when timer 0 stops*/ +#define MCPWM_TIMER0_STOP_INT_RAW (BIT(0)) +#define MCPWM_TIMER0_STOP_INT_RAW_M (BIT(0)) +#define MCPWM_TIMER0_STOP_INT_RAW_V 0x1 +#define MCPWM_TIMER0_STOP_INT_RAW_S 0 + +#define MCMCPWM_INT_ST_MCPWM_REG(i) (REG_MCPWM_BASE(i) + 0x0118) +/* MCPWM_CAP2_INT_ST : RO ;bitpos:[29] ;default: 1'd0 ; */ +/*description: The masked status bit for interrupt triggered by captureon channel 2*/ +#define MCPWM_CAP2_INT_ST (BIT(29)) +#define MCPWM_CAP2_INT_ST_M (BIT(29)) +#define MCPWM_CAP2_INT_ST_V 0x1 +#define MCPWM_CAP2_INT_ST_S 29 +/* MCPWM_CAP1_INT_ST : RO ;bitpos:[28] ;default: 1'd0 ; */ +/*description: The masked status bit for interrupt triggered by captureon channel 1*/ +#define MCPWM_CAP1_INT_ST (BIT(28)) +#define MCPWM_CAP1_INT_ST_M (BIT(28)) +#define MCPWM_CAP1_INT_ST_V 0x1 +#define MCPWM_CAP1_INT_ST_S 28 +/* MCPWM_CAP0_INT_ST : RO ;bitpos:[27] ;default: 1'd0 ; */ +/*description: The masked status bit for interrupt triggered by captureon channel 0*/ +#define MCPWM_CAP0_INT_ST (BIT(27)) +#define MCPWM_CAP0_INT_ST_M (BIT(27)) +#define MCPWM_CAP0_INT_ST_V 0x1 +#define MCPWM_CAP0_INT_ST_S 27 +/* MCPWM_FH2_OST_INT_ST : RO ;bitpos:[26] ;default: 1'd0 ; */ +/*description: The masked status bit for interrupt triggered by an one-shot mode action on PWM2*/ +#define MCPWM_FH2_OST_INT_ST (BIT(26)) +#define MCPWM_FH2_OST_INT_ST_M (BIT(26)) +#define MCPWM_FH2_OST_INT_ST_V 0x1 +#define MCPWM_FH2_OST_INT_ST_S 26 +/* MCPWM_FH1_OST_INT_ST : RO ;bitpos:[25] ;default: 1'd0 ; */ +/*description: The masked status bit for interrupt triggered by an one-shot mode action on PWM0*/ +#define MCPWM_FH1_OST_INT_ST (BIT(25)) +#define MCPWM_FH1_OST_INT_ST_M (BIT(25)) +#define MCPWM_FH1_OST_INT_ST_V 0x1 +#define MCPWM_FH1_OST_INT_ST_S 25 +/* MCPWM_FH0_OST_INT_ST : RO ;bitpos:[24] ;default: 1'd0 ; */ +/*description: The masked status bit for interrupt triggered by an one-shot mode action on PWM0*/ +#define MCPWM_FH0_OST_INT_ST (BIT(24)) +#define MCPWM_FH0_OST_INT_ST_M (BIT(24)) +#define MCPWM_FH0_OST_INT_ST_V 0x1 +#define MCPWM_FH0_OST_INT_ST_S 24 +/* MCPWM_FH2_CBC_INT_ST : RO ;bitpos:[23] ;default: 1'd0 ; */ +/*description: The masked status bit for interrupt triggered by an cycle-by-cycle + mode action on PWM2*/ +#define MCPWM_FH2_CBC_INT_ST (BIT(23)) +#define MCPWM_FH2_CBC_INT_ST_M (BIT(23)) +#define MCPWM_FH2_CBC_INT_ST_V 0x1 +#define MCPWM_FH2_CBC_INT_ST_S 23 +/* MCPWM_FH1_CBC_INT_ST : RO ;bitpos:[22] ;default: 1'd0 ; */ +/*description: The masked status bit for interrupt triggered by an cycle-by-cycle + mode action on PWM1*/ +#define MCPWM_FH1_CBC_INT_ST (BIT(22)) +#define MCPWM_FH1_CBC_INT_ST_M (BIT(22)) +#define MCPWM_FH1_CBC_INT_ST_V 0x1 +#define MCPWM_FH1_CBC_INT_ST_S 22 +/* MCPWM_FH0_CBC_INT_ST : RO ;bitpos:[21] ;default: 1'd0 ; */ +/*description: The masked status bit for interrupt triggered by an cycle-by-cycle + mode action on PWM0*/ +#define MCPWM_FH0_CBC_INT_ST (BIT(21)) +#define MCPWM_FH0_CBC_INT_ST_M (BIT(21)) +#define MCPWM_FH0_CBC_INT_ST_V 0x1 +#define MCPWM_FH0_CBC_INT_ST_S 21 +/* MCPWM_OP2_TEB_INT_ST : RO ;bitpos:[20] ;default: 1'd0 ; */ +/*description: The masked status bit for interrupt triggered by a PWM operator 2 TEB event*/ +#define MCPWM_OP2_TEB_INT_ST (BIT(20)) +#define MCPWM_OP2_TEB_INT_ST_M (BIT(20)) +#define MCPWM_OP2_TEB_INT_ST_V 0x1 +#define MCPWM_OP2_TEB_INT_ST_S 20 +/* MCPWM_OP1_TEB_INT_ST : RO ;bitpos:[19] ;default: 1'd0 ; */ +/*description: The masked status bit for interrupt triggered by a PWM operator 1 TEB event*/ +#define MCPWM_OP1_TEB_INT_ST (BIT(19)) +#define MCPWM_OP1_TEB_INT_ST_M (BIT(19)) +#define MCPWM_OP1_TEB_INT_ST_V 0x1 +#define MCPWM_OP1_TEB_INT_ST_S 19 +/* MCPWM_OP0_TEB_INT_ST : RO ;bitpos:[18] ;default: 1'd0 ; */ +/*description: The masked status bit for interrupt triggered by a PWM operator 0 TEB event*/ +#define MCPWM_OP0_TEB_INT_ST (BIT(18)) +#define MCPWM_OP0_TEB_INT_ST_M (BIT(18)) +#define MCPWM_OP0_TEB_INT_ST_V 0x1 +#define MCPWM_OP0_TEB_INT_ST_S 18 +/* MCPWM_OP2_TEA_INT_ST : RO ;bitpos:[17] ;default: 1'd0 ; */ +/*description: The masked status bit for interrupt triggered by a PWM operator 2 TEA event*/ +#define MCPWM_OP2_TEA_INT_ST (BIT(17)) +#define MCPWM_OP2_TEA_INT_ST_M (BIT(17)) +#define MCPWM_OP2_TEA_INT_ST_V 0x1 +#define MCPWM_OP2_TEA_INT_ST_S 17 +/* MCPWM_OP1_TEA_INT_ST : RO ;bitpos:[16] ;default: 1'd0 ; */ +/*description: The masked status bit for interrupt triggered by a PWM operator 1 TEA event*/ +#define MCPWM_OP1_TEA_INT_ST (BIT(16)) +#define MCPWM_OP1_TEA_INT_ST_M (BIT(16)) +#define MCPWM_OP1_TEA_INT_ST_V 0x1 +#define MCPWM_OP1_TEA_INT_ST_S 16 +/* MCPWM_OP0_TEA_INT_ST : RO ;bitpos:[15] ;default: 1'd0 ; */ +/*description: The masked status bit for interrupt triggered by a PWM operator 0 TEA event*/ +#define MCPWM_OP0_TEA_INT_ST (BIT(15)) +#define MCPWM_OP0_TEA_INT_ST_M (BIT(15)) +#define MCPWM_OP0_TEA_INT_ST_V 0x1 +#define MCPWM_OP0_TEA_INT_ST_S 15 +/* MCPWM_FAULT2_CLR_INT_ST : RO ;bitpos:[14] ;default: 1'd0 ; */ +/*description: The masked status bit for interrupt triggered when event_f2 ends*/ +#define MCPWM_FAULT2_CLR_INT_ST (BIT(14)) +#define MCPWM_FAULT2_CLR_INT_ST_M (BIT(14)) +#define MCPWM_FAULT2_CLR_INT_ST_V 0x1 +#define MCPWM_FAULT2_CLR_INT_ST_S 14 +/* MCPWM_FAULT1_CLR_INT_ST : RO ;bitpos:[13] ;default: 1'd0 ; */ +/*description: The masked status bit for interrupt triggered when event_f1 ends*/ +#define MCPWM_FAULT1_CLR_INT_ST (BIT(13)) +#define MCPWM_FAULT1_CLR_INT_ST_M (BIT(13)) +#define MCPWM_FAULT1_CLR_INT_ST_V 0x1 +#define MCPWM_FAULT1_CLR_INT_ST_S 13 +/* MCPWM_FAULT0_CLR_INT_ST : RO ;bitpos:[12] ;default: 1'd0 ; */ +/*description: The masked status bit for interrupt triggered when event_f0 ends*/ +#define MCPWM_FAULT0_CLR_INT_ST (BIT(12)) +#define MCPWM_FAULT0_CLR_INT_ST_M (BIT(12)) +#define MCPWM_FAULT0_CLR_INT_ST_V 0x1 +#define MCPWM_FAULT0_CLR_INT_ST_S 12 +/* MCPWM_FAULT2_INT_ST : RO ;bitpos:[11] ;default: 1'd0 ; */ +/*description: The masked status bit for interrupt triggered when event_f2 starts*/ +#define MCPWM_FAULT2_INT_ST (BIT(11)) +#define MCPWM_FAULT2_INT_ST_M (BIT(11)) +#define MCPWM_FAULT2_INT_ST_V 0x1 +#define MCPWM_FAULT2_INT_ST_S 11 +/* MCPWM_FAULT1_INT_ST : RO ;bitpos:[10] ;default: 1'd0 ; */ +/*description: The masked status bit for interrupt triggered when event_f1 starts*/ +#define MCPWM_FAULT1_INT_ST (BIT(10)) +#define MCPWM_FAULT1_INT_ST_M (BIT(10)) +#define MCPWM_FAULT1_INT_ST_V 0x1 +#define MCPWM_FAULT1_INT_ST_S 10 +/* MCPWM_FAULT0_INT_ST : RO ;bitpos:[9] ;default: 1'd0 ; */ +/*description: The masked status bit for interrupt triggered when event_f0 starts*/ +#define MCPWM_FAULT0_INT_ST (BIT(9)) +#define MCPWM_FAULT0_INT_ST_M (BIT(9)) +#define MCPWM_FAULT0_INT_ST_V 0x1 +#define MCPWM_FAULT0_INT_ST_S 9 +/* MCPWM_TIMER2_TEP_INT_ST : RO ;bitpos:[8] ;default: 1'h0 ; */ +/*description: The masked status bit for interrupt triggered by a PWM timer 2 TEP event*/ +#define MCPWM_TIMER2_TEP_INT_ST (BIT(8)) +#define MCPWM_TIMER2_TEP_INT_ST_M (BIT(8)) +#define MCPWM_TIMER2_TEP_INT_ST_V 0x1 +#define MCPWM_TIMER2_TEP_INT_ST_S 8 +/* MCPWM_TIMER1_TEP_INT_ST : RO ;bitpos:[7] ;default: 1'h0 ; */ +/*description: The masked status bit for interrupt triggered by a PWM timer 1 TEP event*/ +#define MCPWM_TIMER1_TEP_INT_ST (BIT(7)) +#define MCPWM_TIMER1_TEP_INT_ST_M (BIT(7)) +#define MCPWM_TIMER1_TEP_INT_ST_V 0x1 +#define MCPWM_TIMER1_TEP_INT_ST_S 7 +/* MCPWM_TIMER0_TEP_INT_ST : RO ;bitpos:[6] ;default: 1'h0 ; */ +/*description: The masked status bit for interrupt triggered by a PWM timer 0 TEP event*/ +#define MCPWM_TIMER0_TEP_INT_ST (BIT(6)) +#define MCPWM_TIMER0_TEP_INT_ST_M (BIT(6)) +#define MCPWM_TIMER0_TEP_INT_ST_V 0x1 +#define MCPWM_TIMER0_TEP_INT_ST_S 6 +/* MCPWM_TIMER2_TEZ_INT_ST : RO ;bitpos:[5] ;default: 1'h0 ; */ +/*description: The masked status bit for interrupt triggered by a PWM timer 2 TEZ event*/ +#define MCPWM_TIMER2_TEZ_INT_ST (BIT(5)) +#define MCPWM_TIMER2_TEZ_INT_ST_M (BIT(5)) +#define MCPWM_TIMER2_TEZ_INT_ST_V 0x1 +#define MCPWM_TIMER2_TEZ_INT_ST_S 5 +/* MCPWM_TIMER1_TEZ_INT_ST : RO ;bitpos:[4] ;default: 1'h0 ; */ +/*description: The masked status bit for interrupt triggered by a PWM timer 1 TEZ event*/ +#define MCPWM_TIMER1_TEZ_INT_ST (BIT(4)) +#define MCPWM_TIMER1_TEZ_INT_ST_M (BIT(4)) +#define MCPWM_TIMER1_TEZ_INT_ST_V 0x1 +#define MCPWM_TIMER1_TEZ_INT_ST_S 4 +/* MCPWM_TIMER0_TEZ_INT_ST : RO ;bitpos:[3] ;default: 1'h0 ; */ +/*description: The masked status bit for interrupt triggered by a PWM timer 0 TEZ event*/ +#define MCPWM_TIMER0_TEZ_INT_ST (BIT(3)) +#define MCPWM_TIMER0_TEZ_INT_ST_M (BIT(3)) +#define MCPWM_TIMER0_TEZ_INT_ST_V 0x1 +#define MCPWM_TIMER0_TEZ_INT_ST_S 3 +/* MCPWM_TIMER2_STOP_INT_ST : RO ;bitpos:[2] ;default: 1'h0 ; */ +/*description: The masked status bit for interrupt triggered when timer 2 stops*/ +#define MCPWM_TIMER2_STOP_INT_ST (BIT(2)) +#define MCPWM_TIMER2_STOP_INT_ST_M (BIT(2)) +#define MCPWM_TIMER2_STOP_INT_ST_V 0x1 +#define MCPWM_TIMER2_STOP_INT_ST_S 2 +/* MCPWM_TIMER1_STOP_INT_ST : RO ;bitpos:[1] ;default: 1'h0 ; */ +/*description: The masked status bit for interrupt triggered when timer 1 stops*/ +#define MCPWM_TIMER1_STOP_INT_ST (BIT(1)) +#define MCPWM_TIMER1_STOP_INT_ST_M (BIT(1)) +#define MCPWM_TIMER1_STOP_INT_ST_V 0x1 +#define MCPWM_TIMER1_STOP_INT_ST_S 1 +/* MCPWM_TIMER0_STOP_INT_ST : RO ;bitpos:[0] ;default: 1'h0 ; */ +/*description: The masked status bit for interrupt triggered when timer 0 stops*/ +#define MCPWM_TIMER0_STOP_INT_ST (BIT(0)) +#define MCPWM_TIMER0_STOP_INT_ST_M (BIT(0)) +#define MCPWM_TIMER0_STOP_INT_ST_V 0x1 +#define MCPWM_TIMER0_STOP_INT_ST_S 0 + +#define MCMCPWM_INT_CLR_MCPWM_REG(i) (REG_MCPWM_BASE(i) + 0x011c) +/* MCPWM_CAP2_INT_CLR : WO ;bitpos:[29] ;default: 1'd0 ; */ +/*description: Set this bit to clear interrupt triggered by captureon channel 2*/ +#define MCPWM_CAP2_INT_CLR (BIT(29)) +#define MCPWM_CAP2_INT_CLR_M (BIT(29)) +#define MCPWM_CAP2_INT_CLR_V 0x1 +#define MCPWM_CAP2_INT_CLR_S 29 +/* MCPWM_CAP1_INT_CLR : WO ;bitpos:[28] ;default: 1'd0 ; */ +/*description: Set this bit to clear interrupt triggered by captureon channel 1*/ +#define MCPWM_CAP1_INT_CLR (BIT(28)) +#define MCPWM_CAP1_INT_CLR_M (BIT(28)) +#define MCPWM_CAP1_INT_CLR_V 0x1 +#define MCPWM_CAP1_INT_CLR_S 28 +/* MCPWM_CAP0_INT_CLR : WO ;bitpos:[27] ;default: 1'd0 ; */ +/*description: Set this bit to clear interrupt triggered by captureon channel 0*/ +#define MCPWM_CAP0_INT_CLR (BIT(27)) +#define MCPWM_CAP0_INT_CLR_M (BIT(27)) +#define MCPWM_CAP0_INT_CLR_V 0x1 +#define MCPWM_CAP0_INT_CLR_S 27 +/* MCPWM_FH2_OST_INT_CLR : WO ;bitpos:[26] ;default: 1'd0 ; */ +/*description: Set this bit to clear interrupt triggered by an one-shot mode action on PWM2*/ +#define MCPWM_FH2_OST_INT_CLR (BIT(26)) +#define MCPWM_FH2_OST_INT_CLR_M (BIT(26)) +#define MCPWM_FH2_OST_INT_CLR_V 0x1 +#define MCPWM_FH2_OST_INT_CLR_S 26 +/* MCPWM_FH1_OST_INT_CLR : WO ;bitpos:[25] ;default: 1'd0 ; */ +/*description: Set this bit to clear interrupt triggered by an one-shot mode action on PWM0*/ +#define MCPWM_FH1_OST_INT_CLR (BIT(25)) +#define MCPWM_FH1_OST_INT_CLR_M (BIT(25)) +#define MCPWM_FH1_OST_INT_CLR_V 0x1 +#define MCPWM_FH1_OST_INT_CLR_S 25 +/* MCPWM_FH0_OST_INT_CLR : WO ;bitpos:[24] ;default: 1'd0 ; */ +/*description: Set this bit to clear interrupt triggered by an one-shot mode action on PWM0*/ +#define MCPWM_FH0_OST_INT_CLR (BIT(24)) +#define MCPWM_FH0_OST_INT_CLR_M (BIT(24)) +#define MCPWM_FH0_OST_INT_CLR_V 0x1 +#define MCPWM_FH0_OST_INT_CLR_S 24 +/* MCPWM_FH2_CBC_INT_CLR : WO ;bitpos:[23] ;default: 1'd0 ; */ +/*description: Set this bit to clear interrupt triggered by an cycle-by-cycle + mode action on PWM2*/ +#define MCPWM_FH2_CBC_INT_CLR (BIT(23)) +#define MCPWM_FH2_CBC_INT_CLR_M (BIT(23)) +#define MCPWM_FH2_CBC_INT_CLR_V 0x1 +#define MCPWM_FH2_CBC_INT_CLR_S 23 +/* MCPWM_FH1_CBC_INT_CLR : WO ;bitpos:[22] ;default: 1'd0 ; */ +/*description: Set this bit to clear interrupt triggered by an cycle-by-cycle + mode action on PWM1*/ +#define MCPWM_FH1_CBC_INT_CLR (BIT(22)) +#define MCPWM_FH1_CBC_INT_CLR_M (BIT(22)) +#define MCPWM_FH1_CBC_INT_CLR_V 0x1 +#define MCPWM_FH1_CBC_INT_CLR_S 22 +/* MCPWM_FH0_CBC_INT_CLR : WO ;bitpos:[21] ;default: 1'd0 ; */ +/*description: Set this bit to clear interrupt triggered by an cycle-by-cycle + mode action on PWM0*/ +#define MCPWM_FH0_CBC_INT_CLR (BIT(21)) +#define MCPWM_FH0_CBC_INT_CLR_M (BIT(21)) +#define MCPWM_FH0_CBC_INT_CLR_V 0x1 +#define MCPWM_FH0_CBC_INT_CLR_S 21 +/* MCPWM_OP2_TEB_INT_CLR : WO ;bitpos:[20] ;default: 1'd0 ; */ +/*description: Set this bit to clear interrupt triggered by a PWM operator 2 TEB event*/ +#define MCPWM_OP2_TEB_INT_CLR (BIT(20)) +#define MCPWM_OP2_TEB_INT_CLR_M (BIT(20)) +#define MCPWM_OP2_TEB_INT_CLR_V 0x1 +#define MCPWM_OP2_TEB_INT_CLR_S 20 +/* MCPWM_OP1_TEB_INT_CLR : WO ;bitpos:[19] ;default: 1'd0 ; */ +/*description: Set this bit to clear interrupt triggered by a PWM operator 1 TEB event*/ +#define MCPWM_OP1_TEB_INT_CLR (BIT(19)) +#define MCPWM_OP1_TEB_INT_CLR_M (BIT(19)) +#define MCPWM_OP1_TEB_INT_CLR_V 0x1 +#define MCPWM_OP1_TEB_INT_CLR_S 19 +/* MCPWM_OP0_TEB_INT_CLR : WO ;bitpos:[18] ;default: 1'd0 ; */ +/*description: Set this bit to clear interrupt triggered by a PWM operator 0 TEB event*/ +#define MCPWM_OP0_TEB_INT_CLR (BIT(18)) +#define MCPWM_OP0_TEB_INT_CLR_M (BIT(18)) +#define MCPWM_OP0_TEB_INT_CLR_V 0x1 +#define MCPWM_OP0_TEB_INT_CLR_S 18 +/* MCPWM_OP2_TEA_INT_CLR : WO ;bitpos:[17] ;default: 1'd0 ; */ +/*description: Set this bit to clear interrupt triggered by a PWM operator 2 TEA event*/ +#define MCPWM_OP2_TEA_INT_CLR (BIT(17)) +#define MCPWM_OP2_TEA_INT_CLR_M (BIT(17)) +#define MCPWM_OP2_TEA_INT_CLR_V 0x1 +#define MCPWM_OP2_TEA_INT_CLR_S 17 +/* MCPWM_OP1_TEA_INT_CLR : WO ;bitpos:[16] ;default: 1'd0 ; */ +/*description: Set this bit to clear interrupt triggered by a PWM operator 1 TEA event*/ +#define MCPWM_OP1_TEA_INT_CLR (BIT(16)) +#define MCPWM_OP1_TEA_INT_CLR_M (BIT(16)) +#define MCPWM_OP1_TEA_INT_CLR_V 0x1 +#define MCPWM_OP1_TEA_INT_CLR_S 16 +/* MCPWM_OP0_TEA_INT_CLR : WO ;bitpos:[15] ;default: 1'd0 ; */ +/*description: Set this bit to clear interrupt triggered by a PWM operator 0 TEA event*/ +#define MCPWM_OP0_TEA_INT_CLR (BIT(15)) +#define MCPWM_OP0_TEA_INT_CLR_M (BIT(15)) +#define MCPWM_OP0_TEA_INT_CLR_V 0x1 +#define MCPWM_OP0_TEA_INT_CLR_S 15 +/* MCPWM_FAULT2_CLR_INT_CLR : WO ;bitpos:[14] ;default: 1'd0 ; */ +/*description: Set this bit to clear interrupt triggered when event_f2 ends*/ +#define MCPWM_FAULT2_CLR_INT_CLR (BIT(14)) +#define MCPWM_FAULT2_CLR_INT_CLR_M (BIT(14)) +#define MCPWM_FAULT2_CLR_INT_CLR_V 0x1 +#define MCPWM_FAULT2_CLR_INT_CLR_S 14 +/* MCPWM_FAULT1_CLR_INT_CLR : WO ;bitpos:[13] ;default: 1'd0 ; */ +/*description: Set this bit to clear interrupt triggered when event_f1 ends*/ +#define MCPWM_FAULT1_CLR_INT_CLR (BIT(13)) +#define MCPWM_FAULT1_CLR_INT_CLR_M (BIT(13)) +#define MCPWM_FAULT1_CLR_INT_CLR_V 0x1 +#define MCPWM_FAULT1_CLR_INT_CLR_S 13 +/* MCPWM_FAULT0_CLR_INT_CLR : WO ;bitpos:[12] ;default: 1'd0 ; */ +/*description: Set this bit to clear interrupt triggered when event_f0 ends*/ +#define MCPWM_FAULT0_CLR_INT_CLR (BIT(12)) +#define MCPWM_FAULT0_CLR_INT_CLR_M (BIT(12)) +#define MCPWM_FAULT0_CLR_INT_CLR_V 0x1 +#define MCPWM_FAULT0_CLR_INT_CLR_S 12 +/* MCPWM_FAULT2_INT_CLR : WO ;bitpos:[11] ;default: 1'd0 ; */ +/*description: Set this bit to clear interrupt triggered when event_f2 starts*/ +#define MCPWM_FAULT2_INT_CLR (BIT(11)) +#define MCPWM_FAULT2_INT_CLR_M (BIT(11)) +#define MCPWM_FAULT2_INT_CLR_V 0x1 +#define MCPWM_FAULT2_INT_CLR_S 11 +/* MCPWM_FAULT1_INT_CLR : WO ;bitpos:[10] ;default: 1'd0 ; */ +/*description: Set this bit to clear interrupt triggered when event_f1 starts*/ +#define MCPWM_FAULT1_INT_CLR (BIT(10)) +#define MCPWM_FAULT1_INT_CLR_M (BIT(10)) +#define MCPWM_FAULT1_INT_CLR_V 0x1 +#define MCPWM_FAULT1_INT_CLR_S 10 +/* MCPWM_FAULT0_INT_CLR : WO ;bitpos:[9] ;default: 1'd0 ; */ +/*description: Set this bit to clear interrupt triggered when event_f0 starts*/ +#define MCPWM_FAULT0_INT_CLR (BIT(9)) +#define MCPWM_FAULT0_INT_CLR_M (BIT(9)) +#define MCPWM_FAULT0_INT_CLR_V 0x1 +#define MCPWM_FAULT0_INT_CLR_S 9 +/* MCPWM_TIMER2_TEP_INT_CLR : WO ;bitpos:[8] ;default: 1'h0 ; */ +/*description: Set this bit to clear interrupt triggered by a PWM timer 2 TEP event*/ +#define MCPWM_TIMER2_TEP_INT_CLR (BIT(8)) +#define MCPWM_TIMER2_TEP_INT_CLR_M (BIT(8)) +#define MCPWM_TIMER2_TEP_INT_CLR_V 0x1 +#define MCPWM_TIMER2_TEP_INT_CLR_S 8 +/* MCPWM_TIMER1_TEP_INT_CLR : WO ;bitpos:[7] ;default: 1'h0 ; */ +/*description: Set this bit to clear interrupt triggered by a PWM timer 1 TEP event*/ +#define MCPWM_TIMER1_TEP_INT_CLR (BIT(7)) +#define MCPWM_TIMER1_TEP_INT_CLR_M (BIT(7)) +#define MCPWM_TIMER1_TEP_INT_CLR_V 0x1 +#define MCPWM_TIMER1_TEP_INT_CLR_S 7 +/* MCPWM_TIMER0_TEP_INT_CLR : WO ;bitpos:[6] ;default: 1'h0 ; */ +/*description: Set this bit to clear interrupt triggered by a PWM timer 0 TEP event*/ +#define MCPWM_TIMER0_TEP_INT_CLR (BIT(6)) +#define MCPWM_TIMER0_TEP_INT_CLR_M (BIT(6)) +#define MCPWM_TIMER0_TEP_INT_CLR_V 0x1 +#define MCPWM_TIMER0_TEP_INT_CLR_S 6 +/* MCPWM_TIMER2_TEZ_INT_CLR : WO ;bitpos:[5] ;default: 1'h0 ; */ +/*description: Set this bit to clear interrupt triggered by a PWM timer 2 TEZ event*/ +#define MCPWM_TIMER2_TEZ_INT_CLR (BIT(5)) +#define MCPWM_TIMER2_TEZ_INT_CLR_M (BIT(5)) +#define MCPWM_TIMER2_TEZ_INT_CLR_V 0x1 +#define MCPWM_TIMER2_TEZ_INT_CLR_S 5 +/* MCPWM_TIMER1_TEZ_INT_CLR : WO ;bitpos:[4] ;default: 1'h0 ; */ +/*description: Set this bit to clear interrupt triggered by a PWM timer 1 TEZ event*/ +#define MCPWM_TIMER1_TEZ_INT_CLR (BIT(4)) +#define MCPWM_TIMER1_TEZ_INT_CLR_M (BIT(4)) +#define MCPWM_TIMER1_TEZ_INT_CLR_V 0x1 +#define MCPWM_TIMER1_TEZ_INT_CLR_S 4 +/* MCPWM_TIMER0_TEZ_INT_CLR : WO ;bitpos:[3] ;default: 1'h0 ; */ +/*description: Set this bit to clear interrupt triggered by a PWM timer 0 TEZ event*/ +#define MCPWM_TIMER0_TEZ_INT_CLR (BIT(3)) +#define MCPWM_TIMER0_TEZ_INT_CLR_M (BIT(3)) +#define MCPWM_TIMER0_TEZ_INT_CLR_V 0x1 +#define MCPWM_TIMER0_TEZ_INT_CLR_S 3 +/* MCPWM_TIMER2_STOP_INT_CLR : WO ;bitpos:[2] ;default: 1'h0 ; */ +/*description: Set this bit to clear interrupt triggered when timer 2 stops*/ +#define MCPWM_TIMER2_STOP_INT_CLR (BIT(2)) +#define MCPWM_TIMER2_STOP_INT_CLR_M (BIT(2)) +#define MCPWM_TIMER2_STOP_INT_CLR_V 0x1 +#define MCPWM_TIMER2_STOP_INT_CLR_S 2 +/* MCPWM_TIMER1_STOP_INT_CLR : WO ;bitpos:[1] ;default: 1'h0 ; */ +/*description: Set this bit to clear interrupt triggered when timer 1 stops*/ +#define MCPWM_TIMER1_STOP_INT_CLR (BIT(1)) +#define MCPWM_TIMER1_STOP_INT_CLR_M (BIT(1)) +#define MCPWM_TIMER1_STOP_INT_CLR_V 0x1 +#define MCPWM_TIMER1_STOP_INT_CLR_S 1 +/* MCPWM_TIMER0_STOP_INT_CLR : WO ;bitpos:[0] ;default: 1'h0 ; */ +/*description: Set this bit to clear interrupt triggered when timer 0 stops*/ +#define MCPWM_TIMER0_STOP_INT_CLR (BIT(0)) +#define MCPWM_TIMER0_STOP_INT_CLR_M (BIT(0)) +#define MCPWM_TIMER0_STOP_INT_CLR_V 0x1 +#define MCPWM_TIMER0_STOP_INT_CLR_S 0 + +#define MCPWM_CLK_REG(i) (REG_MCPWM_BASE(i) + 0x0120) +/* MCPWM_CLK_EN : R/W ;bitpos:[0] ;default: 1'd0 ; */ +/*description: Force clock on for this reg file*/ +#define MCPWM_CLK_EN (BIT(0)) +#define MCPWM_CLK_EN_M (BIT(0)) +#define MCPWM_CLK_EN_V 0x1 +#define MCPWM_CLK_EN_S 0 + +#define MCPWM_VERSION_REG(i) (REG_MCPWM_BASE(i) + 0x0124) +/* MCPWM_DATE : R/W ;bitpos:[27:0] ;default: 28'h1509110 ; */ +/*description: Version of this reg file*/ +#define MCPWM_DATE 0x0FFFFFFF +#define MCPWM_DATE_M ((MCPWM_DATE_V)<<(MCPWM_DATE_S)) +#define MCPWM_DATE_V 0xFFFFFFF +#define MCPWM_DATE_S 0 + + + + +#endif /*_SOC_MCPWM_REG_H_ */ + + diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/mcpwm_struct.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/mcpwm_struct.h new file mode 100644 index 0000000000000..287998d663574 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/mcpwm_struct.h @@ -0,0 +1,464 @@ +// 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. +#ifndef _SOC_MCPWM_STRUCT_H__ +#define _SOC_MCPWM_STRUCT_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef volatile struct mcpwm_dev_s { + union { + struct { + uint32_t prescale: 8; /*Period of PWM_clk = 6.25ns * (PWM_CLK_PRESCALE + 1)*/ + uint32_t reserved8: 24; + }; + uint32_t val; + }clk_cfg; + struct { + union { + struct { + uint32_t prescale: 8; /*period of PT0_clk = Period of PWM_clk * (PWM_TIMER0_PRESCALE + 1)*/ + uint32_t period: 16; /*period shadow reg of PWM timer0*/ + uint32_t upmethod: 2; /*Update method for active reg of PWM timer0 period 0: immediate 1: TEZ 2: sync 3: TEZ | sync. TEZ here and below means timer equal zero event*/ + uint32_t reserved26: 6; + }; + uint32_t val; + }period; + union { + struct { + uint32_t start: 3; /*PWM timer0 start and stop control. 0: stop @ TEZ 1: stop @ TEP 2: free run 3: start and stop @ next TEZ 4: start and stop @ next TEP. TEP here and below means timer equal period event*/ + uint32_t mode: 2; /*PWM timer0 working mode 0: freeze 1: increase mod 2: decrease mod 3: up-down mod*/ + uint32_t reserved5: 27; + }; + uint32_t val; + }mode; + union { + struct { + uint32_t in_en: 1; /*when set timer reload with phase on sync input event is enabled*/ + uint32_t sync_sw: 1; /*write the negate value will trigger a software sync*/ + uint32_t out_sel: 2; /*PWM timer0 synco selection 0: synci 1: TEZ 2: TEP else 0*/ + uint32_t timer_phase: 17; /*phase for timer reload on sync event*/ + uint32_t reserved21: 11; + }; + uint32_t val; + }sync; + union { + struct { + uint32_t value: 16; /*current PWM timer0 counter value*/ + uint32_t direction: 1; /*current PWM timer0 counter direction 0: increment 1: decrement*/ + uint32_t reserved17: 15; + }; + uint32_t val; + }status; + }timer[3]; + + + union { + struct { + uint32_t t0_in_sel: 3; /*select sync input for PWM timer0 1: PWM timer0 synco 2: PWM timer1 synco 3: PWM timer2 synco 4: SYNC0 from GPIO matrix 5: SYNC1 from GPIO matrix 6: SYNC2 from GPIO matrix else: none*/ + uint32_t t1_in_sel: 3; /*select sync input for PWM timer1 1: PWM timer0 synco 2: PWM timer1 synco 3: PWM timer2 synco 4: SYNC0 from GPIO matrix 5: SYNC1 from GPIO matrix 6: SYNC2 from GPIO matrix else: none*/ + uint32_t t2_in_sel: 3; /*select sync input for PWM timer2 1: PWM timer0 synco 2: PWM timer1 synco 3: PWM timer2 synco 4: SYNC0 from GPIO matrix 5: SYNC1 from GPIO matrix 6: SYNC2 from GPIO matrix else: none*/ + uint32_t ext_in0_inv: 1; /*invert SYNC0 from GPIO matrix*/ + uint32_t ext_in1_inv: 1; /*invert SYNC1 from GPIO matrix*/ + uint32_t ext_in2_inv: 1; /*invert SYNC2 from GPIO matrix*/ + uint32_t reserved12: 20; + }; + uint32_t val; + }timer_synci_cfg; + union { + struct { + uint32_t operator0_sel: 2; /*Select which PWM timer's is the timing reference for PWM operator0 0: timer0 1: timer1 2: timer2*/ + uint32_t operator1_sel: 2; /*Select which PWM timer's is the timing reference for PWM operator1 0: timer0 1: timer1 2: timer2*/ + uint32_t operator2_sel: 2; /*Select which PWM timer's is the timing reference for PWM operator2 0: timer0 1: timer1 2: timer2*/ + uint32_t reserved6: 26; + }; + uint32_t val; + }timer_sel; + + + struct { + union { + struct { + uint32_t a_upmethod: 4; /*Update method for PWM compare0 A's active reg. 0: immediate bit0: TEZ bit1: TEP bit2: sync bit3: freeze*/ + uint32_t b_upmethod: 4; /*Update method for PWM compare0 B's active reg. 0: immediate bit0: TEZ bit1: TEP bit2: sync bit3: freeze*/ + uint32_t a_shdw_full: 1; /*Set and reset by hardware. If set PWM compare0 A's shadow reg is filled and waiting to be transferred to A's active reg. If cleared A's active reg has been updated with shadow reg latest value*/ + uint32_t b_shdw_full: 1; /*Set and reset by hardware. If set PWM compare0 B's shadow reg is filled and waiting to be transferred to B's active reg. If cleared B's active reg has been updated with shadow reg latest value*/ + uint32_t reserved10: 22; + }; + uint32_t val; + }cmpr_cfg; + union { + struct { + uint32_t cmpr_val: 16; /*PWM compare0 A's shadow reg*/ + uint32_t reserved16:16; + }; + uint32_t val; + }cmpr_value[2]; + union { + struct { + uint32_t upmethod: 4; /*Update method for PWM generate0's active reg of configuration. 0: immediate bit0: TEZ bit1: TEP bit2: sync. bit3: freeze*/ + uint32_t t0_sel: 3; /*Source selection for PWM generate0 event_t0 take effect immediately 0: fault_event0 1: fault_event1 2: fault_event2 3: sync_taken 4: none*/ + uint32_t t1_sel: 3; /*Source selection for PWM generate0 event_t1 take effect immediately 0: fault_event0 1: fault_event1 2: fault_event2 3: sync_taken 4: none*/ + uint32_t reserved10: 22; + }; + uint32_t val; + }gen_cfg0; + union { + struct { + uint32_t cntu_force_upmethod: 6; /*Update method for continuous software force of PWM generate0. 0: immediate bit0: TEZ bit1: TEP bit2: TEA bit3: TEB bit4: sync bit5: freeze. (TEA/B here and below means timer equals A/B event)*/ + uint32_t a_cntuforce_mode: 2; /*Continuous software force mode for PWM0A. 0: disabled 1: low 2: high 3: disabled*/ + uint32_t b_cntuforce_mode: 2; /*Continuous software force mode for PWM0B. 0: disabled 1: low 2: high 3: disabled*/ + uint32_t a_nciforce: 1; /*non-continuous immediate software force trigger for PWM0A a toggle will trigger a force event*/ + uint32_t a_nciforce_mode: 2; /*non-continuous immediate software force mode for PWM0A 0: disabled 1: low 2: high 3: disabled*/ + uint32_t b_nciforce: 1; /*non-continuous immediate software force trigger for PWM0B a toggle will trigger a force event*/ + uint32_t b_nciforce_mode: 2; /*non-continuous immediate software force mode for PWM0B 0: disabled 1: low 2: high 3: disabled*/ + uint32_t reserved16: 16; + }; + uint32_t val; + }gen_force; + union { + struct { + uint32_t utez: 2; /*Action on PWM0A triggered by event TEZ when timer increasing*/ + uint32_t utep: 2; /*Action on PWM0A triggered by event TEP when timer increasing*/ + uint32_t utea: 2; /*Action on PWM0A triggered by event TEA when timer increasing*/ + uint32_t uteb: 2; /*Action on PWM0A triggered by event TEB when timer increasing*/ + uint32_t ut0: 2; /*Action on PWM0A triggered by event_t0 when timer increasing*/ + uint32_t ut1: 2; /*Action on PWM0A triggered by event_t1 when timer increasing*/ + uint32_t dtez: 2; /*Action on PWM0A triggered by event TEZ when timer decreasing*/ + uint32_t dtep: 2; /*Action on PWM0A triggered by event TEP when timer decreasing*/ + uint32_t dtea: 2; /*Action on PWM0A triggered by event TEA when timer decreasing*/ + uint32_t dteb: 2; /*Action on PWM0A triggered by event TEB when timer decreasing*/ + uint32_t dt0: 2; /*Action on PWM0A triggered by event_t0 when timer decreasing*/ + uint32_t dt1: 2; /*Action on PWM0A triggered by event_t1 when timer decreasing. 0: no change 1: low 2: high 3: toggle*/ + uint32_t reserved24: 8; + }; + uint32_t val; + }generator[2]; + union { + struct { + uint32_t fed_upmethod: 4; /*Update method for FED (falling edge delay) active reg. 0: immediate bit0: tez bit1: tep bit2: sync bit3: freeze*/ + uint32_t red_upmethod: 4; /*Update method for RED (rising edge delay) active reg. 0: immediate bit0: tez bit1: tep bit2: sync bit3: freeze*/ + uint32_t deb_mode: 1; /*S8 in documentation dual-edge B mode 0: fed/red take effect on different path separately 1: fed/red take effect on B path A out is in bypass or dulpB mode*/ + uint32_t a_outswap: 1; /*S6 in documentation*/ + uint32_t b_outswap: 1; /*S7 in documentation*/ + uint32_t red_insel: 1; /*S4 in documentation*/ + uint32_t fed_insel: 1; /*S5 in documentation*/ + uint32_t red_outinvert: 1; /*S2 in documentation*/ + uint32_t fed_outinvert: 1; /*S3 in documentation*/ + uint32_t a_outbypass: 1; /*S1 in documentation*/ + uint32_t b_outbypass: 1; /*S0 in documentation*/ + uint32_t clk_sel: 1; /*Dead band0 clock selection. 0: PWM_clk 1: PT_clk*/ + uint32_t reserved18: 14; + }; + uint32_t val; + }db_cfg; + union { + struct { + uint32_t fed: 16; /*Shadow reg for FED*/ + uint32_t reserved16:16; + }; + uint32_t val; + }db_fed_cfg; + union { + struct { + uint32_t red: 16; /*Shadow reg for RED*/ + uint32_t reserved16:16; + }; + uint32_t val; + }db_red_cfg; + union { + struct { + uint32_t en: 1; /*When set carrier0 function is enabled. When reset carrier0 is bypassed*/ + uint32_t prescale: 4; /*carrier0 clk (CP_clk) prescale value. Period of CP_clk = period of PWM_clk * (PWM_CARRIER0_PRESCALE + 1)*/ + uint32_t duty: 3; /*carrier duty selection. Duty = PWM_CARRIER0_DUTY / 8*/ + uint32_t oshtwth: 4; /*width of the fist pulse in number of periods of the carrier*/ + uint32_t out_invert: 1; /*when set invert the output of PWM0A and PWM0B for this submodule*/ + uint32_t in_invert: 1; /*when set invert the input of PWM0A and PWM0B for this submodule*/ + uint32_t reserved14: 18; + }; + uint32_t val; + }carrier_cfg; + union { + struct { + uint32_t sw_cbc: 1; /*Cycle-by-cycle tripping software force event will trigger cycle-by-cycle trip event. 0: disable 1: enable*/ + uint32_t f2_cbc: 1; /*event_f2 will trigger cycle-by-cycle trip event. 0: disable 1: enable*/ + uint32_t f1_cbc: 1; /*event_f1 will trigger cycle-by-cycle trip event. 0: disable 1: enable*/ + uint32_t f0_cbc: 1; /*event_f0 will trigger cycle-by-cycle trip event. 0: disable 1: enable*/ + uint32_t sw_ost: 1; /*one-shot tripping software force event will trigger one-shot trip event. 0: disable 1: enable*/ + uint32_t f2_ost: 1; /*event_f2 will trigger one-shot trip event. 0: disable 1: enable*/ + uint32_t f1_ost: 1; /*event_f1 will trigger one-shot trip event. 0: disable 1: enable*/ + uint32_t f0_ost: 1; /*event_f0 will trigger one-shot trip event. 0: disable 1: enable*/ + uint32_t a_cbc_d: 2; /*Action on PWM0A when cycle-by-cycle trip event occurs and timer is decreasing. 0: do nothing 1: force lo 2: force hi 3: toggle*/ + uint32_t a_cbc_u: 2; /*Action on PWM0A when cycle-by-cycle trip event occurs and timer is increasing. 0: do nothing 1: force lo 2: force hi 3: toggle*/ + uint32_t a_ost_d: 2; /*Action on PWM0A when one-shot trip event occurs and timer is decreasing. 0: do nothing 1: force lo 2: force hi 3: toggle*/ + uint32_t a_ost_u: 2; /*Action on PWM0A when one-shot trip event occurs and timer is increasing. 0: do nothing 1: force lo 2: force hi 3: toggle*/ + uint32_t b_cbc_d: 2; /*Action on PWM0B when cycle-by-cycle trip event occurs and timer is decreasing. 0: do nothing 1: force lo 2: force hi 3: toggle*/ + uint32_t b_cbc_u: 2; /*Action on PWM0B when cycle-by-cycle trip event occurs and timer is increasing. 0: do nothing 1: force lo 2: force hi 3: toggle*/ + uint32_t b_ost_d: 2; /*Action on PWM0B when one-shot trip event occurs and timer is decreasing. 0: do nothing 1: force lo 2: force hi 3: toggle*/ + uint32_t b_ost_u: 2; /*Action on PWM0B when one-shot trip event occurs and timer is increasing. 0: do nothing 1: force lo 2: force hi 3: toggle*/ + uint32_t reserved24: 8; + }; + uint32_t val; + }tz_cfg0; + union { + struct { + uint32_t clr_ost: 1; /*a toggle will clear on going one-shot tripping*/ + uint32_t cbcpulse: 2; /*cycle-by-cycle tripping refresh moment selection. Bit0: TEZ bit1:TEP*/ + uint32_t force_cbc: 1; /*a toggle trigger a cycle-by-cycle tripping software force event*/ + uint32_t force_ost: 1; /*a toggle (software negate its value) trigger a one-shot tripping software force event*/ + uint32_t reserved5: 27; + }; + uint32_t val; + }tz_cfg1; + union { + struct { + uint32_t cbc_on: 1; /*Set and reset by hardware. If set an cycle-by-cycle trip event is on going*/ + uint32_t ost_on: 1; /*Set and reset by hardware. If set an one-shot trip event is on going*/ + uint32_t reserved2: 30; + }; + uint32_t val; + }tz_status; + }channel[3]; + + union { + struct { + uint32_t f0_en: 1; /*When set event_f0 generation is enabled*/ + uint32_t f1_en: 1; /*When set event_f1 generation is enabled*/ + uint32_t f2_en: 1; /*When set event_f2 generation is enabled*/ + uint32_t f0_pole: 1; /*Set event_f0 trigger polarity on FAULT2 source from GPIO matrix. 0: level low 1: level high*/ + uint32_t f1_pole: 1; /*Set event_f1 trigger polarity on FAULT2 source from GPIO matrix. 0: level low 1: level high*/ + uint32_t f2_pole: 1; /*Set event_f2 trigger polarity on FAULT2 source from GPIO matrix. 0: level low 1: level high*/ + uint32_t event_f0: 1; /*Set and reset by hardware. If set event_f0 is on going*/ + uint32_t event_f1: 1; /*Set and reset by hardware. If set event_f1 is on going*/ + uint32_t event_f2: 1; /*Set and reset by hardware. If set event_f2 is on going*/ + uint32_t reserved9: 23; + }; + uint32_t val; + }fault_detect; + union { + struct { + uint32_t timer_en: 1; /*When set capture timer incrementing under APB_clk is enabled.*/ + uint32_t synci_en: 1; /*When set capture timer sync is enabled.*/ + uint32_t synci_sel: 3; /*capture module sync input selection. 0: none 1: timer0 synco 2: timer1 synco 3: timer2 synco 4: SYNC0 from GPIO matrix 5: SYNC1 from GPIO matrix 6: SYNC2 from GPIO matrix*/ + uint32_t sync_sw: 1; /*Write 1 will force a capture timer sync capture timer is loaded with value in phase register.*/ + uint32_t reserved6: 26; + }; + uint32_t val; + }cap_timer_cfg; + uint32_t cap_timer_phase; /*Phase value for capture timer sync operation.*/ + union { + struct { + uint32_t en: 1; /*When set capture on channel 0 is enabled*/ + uint32_t mode: 2; /*Edge of capture on channel 0 after prescale. bit0: negedge cap en bit1: posedge cap en*/ + uint32_t prescale: 8; /*Value of prescale on possitive edge of CAP0. Prescale value = PWM_CAP0_PRESCALE + 1*/ + uint32_t in_invert: 1; /*when set CAP0 form GPIO matrix is inverted before prescale*/ + uint32_t sw: 1; /*Write 1 will trigger a software forced capture on channel 0*/ + uint32_t reserved13: 19; + }; + uint32_t val; + }cap_cfg_ch[3]; + uint32_t cap_val_ch[3]; /*Value of last capture on channel 0*/ + union { + struct { + uint32_t cap0_edge: 1; /*Edge of last capture trigger on channel 0 0: posedge 1: negedge*/ + uint32_t cap1_edge: 1; /*Edge of last capture trigger on channel 1 0: posedge 1: negedge*/ + uint32_t cap2_edge: 1; /*Edge of last capture trigger on channel 2 0: posedge 1: negedge*/ + uint32_t reserved3: 29; + }; + uint32_t val; + }cap_status; + union { + struct { + uint32_t global_up_en: 1; /*The global enable of update of all active registers in MCPWM module*/ + uint32_t global_force_up: 1; /*a toggle (software invert its value) will trigger a forced update of all active registers in MCPWM module*/ + uint32_t op0_up_en: 1; /*When set and PWM_GLOBAL_UP_EN is set update of active registers in PWM operator 0 are enabled*/ + uint32_t op0_force_up: 1; /*a toggle (software invert its value) will trigger a forced update of active registers in PWM operator 0*/ + uint32_t op1_up_en: 1; /*When set and PWM_GLOBAL_UP_EN is set update of active registers in PWM operator 1 are enabled*/ + uint32_t op1_force_up: 1; /*a toggle (software invert its value) will trigger a forced update of active registers in PWM operator 1*/ + uint32_t op2_up_en: 1; /*When set and PWM_GLOBAL_UP_EN is set update of active registers in PWM operator 2 are enabled*/ + uint32_t op2_force_up: 1; /*a toggle (software invert its value) will trigger a forced update of active registers in PWM operator 2*/ + uint32_t reserved8: 24; + }; + uint32_t val; + }update_cfg; + union { + struct { + uint32_t timer0_stop_int_ena: 1; /*Interrupt when timer 0 stops*/ + uint32_t timer1_stop_int_ena: 1; /*Interrupt when timer 1 stops*/ + uint32_t timer2_stop_int_ena: 1; /*Interrupt when timer 2 stops*/ + uint32_t timer0_tez_int_ena: 1; /*A PWM timer 0 TEZ event will trigger this interrupt*/ + uint32_t timer1_tez_int_ena: 1; /*A PWM timer 1 TEZ event will trigger this interrupt*/ + uint32_t timer2_tez_int_ena: 1; /*A PWM timer 2 TEZ event will trigger this interrupt*/ + uint32_t timer0_tep_int_ena: 1; /*A PWM timer 0 TEP event will trigger this interrupt*/ + uint32_t timer1_tep_int_ena: 1; /*A PWM timer 1 TEP event will trigger this interrupt*/ + uint32_t timer2_tep_int_ena: 1; /*A PWM timer 2 TEP event will trigger this interrupt*/ + uint32_t fault0_int_ena: 1; /*Interrupt when event_f0 starts*/ + uint32_t fault1_int_ena: 1; /*Interrupt when event_f1 starts*/ + uint32_t fault2_int_ena: 1; /*Interrupt when event_f2 starts*/ + uint32_t fault0_clr_int_ena: 1; /*Interrupt when event_f0 ends*/ + uint32_t fault1_clr_int_ena: 1; /*Interrupt when event_f1 ends*/ + uint32_t fault2_clr_int_ena: 1; /*Interrupt when event_f2 ends*/ + uint32_t cmpr0_tea_int_ena: 1; /*A PWM operator 0 TEA event will trigger this interrupt*/ + uint32_t cmpr1_tea_int_ena: 1; /*A PWM operator 1 TEA event will trigger this interrupt*/ + uint32_t cmpr2_tea_int_ena: 1; /*A PWM operator 2 TEA event will trigger this interrupt*/ + uint32_t cmpr0_teb_int_ena: 1; /*A PWM operator 0 TEB event will trigger this interrupt*/ + uint32_t cmpr1_teb_int_ena: 1; /*A PWM operator 1 TEB event will trigger this interrupt*/ + uint32_t cmpr2_teb_int_ena: 1; /*A PWM operator 2 TEB event will trigger this interrupt*/ + uint32_t tz0_cbc_int_ena: 1; /*An cycle-by-cycle trip event on PWM0 will trigger this interrupt*/ + uint32_t tz1_cbc_int_ena: 1; /*An cycle-by-cycle trip event on PWM1 will trigger this interrupt*/ + uint32_t tz2_cbc_int_ena: 1; /*An cycle-by-cycle trip event on PWM2 will trigger this interrupt*/ + uint32_t tz0_ost_int_ena: 1; /*An one-shot trip event on PWM0 will trigger this interrupt*/ + uint32_t tz1_ost_int_ena: 1; /*An one-shot trip event on PWM1 will trigger this interrupt*/ + uint32_t tz2_ost_int_ena: 1; /*An one-shot trip event on PWM2 will trigger this interrupt*/ + uint32_t cap0_int_ena: 1; /*A capture on channel 0 will trigger this interrupt*/ + uint32_t cap1_int_ena: 1; /*A capture on channel 1 will trigger this interrupt*/ + uint32_t cap2_int_ena: 1; /*A capture on channel 2 will trigger this interrupt*/ + uint32_t reserved30: 2; + }; + uint32_t val; + }int_ena; + union { + struct { + uint32_t timer0_stop_int_raw: 1; /*Interrupt when timer 0 stops*/ + uint32_t timer1_stop_int_raw: 1; /*Interrupt when timer 1 stops*/ + uint32_t timer2_stop_int_raw: 1; /*Interrupt when timer 2 stops*/ + uint32_t timer0_tez_int_raw: 1; /*A PWM timer 0 TEZ event will trigger this interrupt*/ + uint32_t timer1_tez_int_raw: 1; /*A PWM timer 1 TEZ event will trigger this interrupt*/ + uint32_t timer2_tez_int_raw: 1; /*A PWM timer 2 TEZ event will trigger this interrupt*/ + uint32_t timer0_tep_int_raw: 1; /*A PWM timer 0 TEP event will trigger this interrupt*/ + uint32_t timer1_tep_int_raw: 1; /*A PWM timer 1 TEP event will trigger this interrupt*/ + uint32_t timer2_tep_int_raw: 1; /*A PWM timer 2 TEP event will trigger this interrupt*/ + uint32_t fault0_int_raw: 1; /*Interrupt when event_f0 starts*/ + uint32_t fault1_int_raw: 1; /*Interrupt when event_f1 starts*/ + uint32_t fault2_int_raw: 1; /*Interrupt when event_f2 starts*/ + uint32_t fault0_clr_int_raw: 1; /*Interrupt when event_f0 ends*/ + uint32_t fault1_clr_int_raw: 1; /*Interrupt when event_f1 ends*/ + uint32_t fault2_clr_int_raw: 1; /*Interrupt when event_f2 ends*/ + uint32_t cmpr0_tea_int_raw: 1; /*A PWM operator 0 TEA event will trigger this interrupt*/ + uint32_t cmpr1_tea_int_raw: 1; /*A PWM operator 1 TEA event will trigger this interrupt*/ + uint32_t cmpr2_tea_int_raw: 1; /*A PWM operator 2 TEA event will trigger this interrupt*/ + uint32_t cmpr0_teb_int_raw: 1; /*A PWM operator 0 TEB event will trigger this interrupt*/ + uint32_t cmpr1_teb_int_raw: 1; /*A PWM operator 1 TEB event will trigger this interrupt*/ + uint32_t cmpr2_teb_int_raw: 1; /*A PWM operator 2 TEB event will trigger this interrupt*/ + uint32_t tz0_cbc_int_raw: 1; /*An cycle-by-cycle trip event on PWM0 will trigger this interrupt*/ + uint32_t tz1_cbc_int_raw: 1; /*An cycle-by-cycle trip event on PWM1 will trigger this interrupt*/ + uint32_t tz2_cbc_int_raw: 1; /*An cycle-by-cycle trip event on PWM2 will trigger this interrupt*/ + uint32_t tz0_ost_int_raw: 1; /*An one-shot trip event on PWM0 will trigger this interrupt*/ + uint32_t tz1_ost_int_raw: 1; /*An one-shot trip event on PWM1 will trigger this interrupt*/ + uint32_t tz2_ost_int_raw: 1; /*An one-shot trip event on PWM2 will trigger this interrupt*/ + uint32_t cap0_int_raw: 1; /*A capture on channel 0 will trigger this interrupt*/ + uint32_t cap1_int_raw: 1; /*A capture on channel 1 will trigger this interrupt*/ + uint32_t cap2_int_raw: 1; /*A capture on channel 2 will trigger this interrupt*/ + uint32_t reserved30: 2; + }; + uint32_t val; + }int_raw; + union { + struct { + uint32_t timer0_stop_int_st: 1; /*Interrupt when timer 0 stops*/ + uint32_t timer1_stop_int_st: 1; /*Interrupt when timer 1 stops*/ + uint32_t timer2_stop_int_st: 1; /*Interrupt when timer 2 stops*/ + uint32_t timer0_tez_int_st: 1; /*A PWM timer 0 TEZ event will trigger this interrupt*/ + uint32_t timer1_tez_int_st: 1; /*A PWM timer 1 TEZ event will trigger this interrupt*/ + uint32_t timer2_tez_int_st: 1; /*A PWM timer 2 TEZ event will trigger this interrupt*/ + uint32_t timer0_tep_int_st: 1; /*A PWM timer 0 TEP event will trigger this interrupt*/ + uint32_t timer1_tep_int_st: 1; /*A PWM timer 1 TEP event will trigger this interrupt*/ + uint32_t timer2_tep_int_st: 1; /*A PWM timer 2 TEP event will trigger this interrupt*/ + uint32_t fault0_int_st: 1; /*Interrupt when event_f0 starts*/ + uint32_t fault1_int_st: 1; /*Interrupt when event_f1 starts*/ + uint32_t fault2_int_st: 1; /*Interrupt when event_f2 starts*/ + uint32_t fault0_clr_int_st: 1; /*Interrupt when event_f0 ends*/ + uint32_t fault1_clr_int_st: 1; /*Interrupt when event_f1 ends*/ + uint32_t fault2_clr_int_st: 1; /*Interrupt when event_f2 ends*/ + uint32_t cmpr0_tea_int_st: 1; /*A PWM operator 0 TEA event will trigger this interrupt*/ + uint32_t cmpr1_tea_int_st: 1; /*A PWM operator 1 TEA event will trigger this interrupt*/ + uint32_t cmpr2_tea_int_st: 1; /*A PWM operator 2 TEA event will trigger this interrupt*/ + uint32_t cmpr0_teb_int_st: 1; /*A PWM operator 0 TEB event will trigger this interrupt*/ + uint32_t cmpr1_teb_int_st: 1; /*A PWM operator 1 TEB event will trigger this interrupt*/ + uint32_t cmpr2_teb_int_st: 1; /*A PWM operator 2 TEB event will trigger this interrupt*/ + uint32_t tz0_cbc_int_st: 1; /*An cycle-by-cycle trip event on PWM0 will trigger this interrupt*/ + uint32_t tz1_cbc_int_st: 1; /*An cycle-by-cycle trip event on PWM1 will trigger this interrupt*/ + uint32_t tz2_cbc_int_st: 1; /*An cycle-by-cycle trip event on PWM2 will trigger this interrupt*/ + uint32_t tz0_ost_int_st: 1; /*An one-shot trip event on PWM0 will trigger this interrupt*/ + uint32_t tz1_ost_int_st: 1; /*An one-shot trip event on PWM1 will trigger this interrupt*/ + uint32_t tz2_ost_int_st: 1; /*An one-shot trip event on PWM2 will trigger this interrupt*/ + uint32_t cap0_int_st: 1; /*A capture on channel 0 will trigger this interrupt*/ + uint32_t cap1_int_st: 1; /*A capture on channel 1 will trigger this interrupt*/ + uint32_t cap2_int_st: 1; /*A capture on channel 2 will trigger this interrupt*/ + uint32_t reserved30: 2; + }; + uint32_t val; + }int_st; + union { + struct { + uint32_t timer0_stop_int_clr: 1; /*Interrupt when timer 0 stops*/ + uint32_t timer1_stop_int_clr: 1; /*Interrupt when timer 1 stops*/ + uint32_t timer2_stop_int_clr: 1; /*Interrupt when timer 2 stops*/ + uint32_t timer0_tez_int_clr: 1; /*A PWM timer 0 TEZ event will trigger this interrupt*/ + uint32_t timer1_tez_int_clr: 1; /*A PWM timer 1 TEZ event will trigger this interrupt*/ + uint32_t timer2_tez_int_clr: 1; /*A PWM timer 2 TEZ event will trigger this interrupt*/ + uint32_t timer0_tep_int_clr: 1; /*A PWM timer 0 TEP event will trigger this interrupt*/ + uint32_t timer1_tep_int_clr: 1; /*A PWM timer 1 TEP event will trigger this interrupt*/ + uint32_t timer2_tep_int_clr: 1; /*A PWM timer 2 TEP event will trigger this interrupt*/ + uint32_t fault0_int_clr: 1; /*Interrupt when event_f0 starts*/ + uint32_t fault1_int_clr: 1; /*Interrupt when event_f1 starts*/ + uint32_t fault2_int_clr: 1; /*Interrupt when event_f2 starts*/ + uint32_t fault0_clr_int_clr: 1; /*Interrupt when event_f0 ends*/ + uint32_t fault1_clr_int_clr: 1; /*Interrupt when event_f1 ends*/ + uint32_t fault2_clr_int_clr: 1; /*Interrupt when event_f2 ends*/ + uint32_t cmpr0_tea_int_clr: 1; /*A PWM operator 0 TEA event will trigger this interrupt*/ + uint32_t cmpr1_tea_int_clr: 1; /*A PWM operator 1 TEA event will trigger this interrupt*/ + uint32_t cmpr2_tea_int_clr: 1; /*A PWM operator 2 TEA event will trigger this interrupt*/ + uint32_t cmpr0_teb_int_clr: 1; /*A PWM operator 0 TEB event will trigger this interrupt*/ + uint32_t cmpr1_teb_int_clr: 1; /*A PWM operator 1 TEB event will trigger this interrupt*/ + uint32_t cmpr2_teb_int_clr: 1; /*A PWM operator 2 TEB event will trigger this interrupt*/ + uint32_t tz0_cbc_int_clr: 1; /*An cycle-by-cycle trip event on PWM0 will trigger this interrupt*/ + uint32_t tz1_cbc_int_clr: 1; /*An cycle-by-cycle trip event on PWM1 will trigger this interrupt*/ + uint32_t tz2_cbc_int_clr: 1; /*An cycle-by-cycle trip event on PWM2 will trigger this interrupt*/ + uint32_t tz0_ost_int_clr: 1; /*An one-shot trip event on PWM0 will trigger this interrupt*/ + uint32_t tz1_ost_int_clr: 1; /*An one-shot trip event on PWM1 will trigger this interrupt*/ + uint32_t tz2_ost_int_clr: 1; /*An one-shot trip event on PWM2 will trigger this interrupt*/ + uint32_t cap0_int_clr: 1; /*A capture on channel 0 will trigger this interrupt*/ + uint32_t cap1_int_clr: 1; /*A capture on channel 1 will trigger this interrupt*/ + uint32_t cap2_int_clr: 1; /*A capture on channel 2 will trigger this interrupt*/ + uint32_t reserved30: 2; + }; + uint32_t val; + }int_clr; + union { + struct { + uint32_t clk_en: 1; /*Force clock on for this reg file*/ + uint32_t reserved1: 31; + }; + uint32_t val; + }reg_clk; + union { + struct { + uint32_t date: 28; /*Version of this reg file*/ + uint32_t reserved28: 4; + }; + uint32_t val; + }version; +} mcpwm_dev_t; +extern mcpwm_dev_t MCPWM0; +extern mcpwm_dev_t MCPWM1; + +#ifdef __cplusplus +} +#endif + +#endif /* _SOC_MCPWM_STRUCT_H__ */ diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/nrx_reg.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/nrx_reg.h new file mode 100644 index 0000000000000..ca338b89ab369 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/nrx_reg.h @@ -0,0 +1,55 @@ +// 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. + +#pragma once + +#include "soc/soc.h" + +/* Some of the WiFi RX control registers. + * PU/PD fields defined here are used in sleep related functions. + */ + +#define NRXPD_CTRL (DR_REG_NRX_BASE + 0x00d4) +#define NRX_CHAN_EST_FORCE_PU (BIT(7)) +#define NRX_CHAN_EST_FORCE_PU_M (BIT(7)) +#define NRX_CHAN_EST_FORCE_PU_V 1 +#define NRX_CHAN_EST_FORCE_PU_S 7 +#define NRX_CHAN_EST_FORCE_PD (BIT(6)) +#define NRX_CHAN_EST_FORCE_PD_M (BIT(6)) +#define NRX_CHAN_EST_FORCE_PD_V 1 +#define NRX_CHAN_EST_FORCE_PD_S 6 +#define NRX_RX_ROT_FORCE_PU (BIT(5)) +#define NRX_RX_ROT_FORCE_PU_M (BIT(5)) +#define NRX_RX_ROT_FORCE_PU_V 1 +#define NRX_RX_ROT_FORCE_PU_S 5 +#define NRX_RX_ROT_FORCE_PD (BIT(4)) +#define NRX_RX_ROT_FORCE_PD_M (BIT(4)) +#define NRX_RX_ROT_FORCE_PD_V 1 +#define NRX_RX_ROT_FORCE_PD_S 4 +#define NRX_VIT_FORCE_PU (BIT(3)) +#define NRX_VIT_FORCE_PU_M (BIT(3)) +#define NRX_VIT_FORCE_PU_V 1 +#define NRX_VIT_FORCE_PU_S 3 +#define NRX_VIT_FORCE_PD (BIT(2)) +#define NRX_VIT_FORCE_PD_M (BIT(2)) +#define NRX_VIT_FORCE_PD_V 1 +#define NRX_VIT_FORCE_PD_S 2 +#define NRX_DEMAP_FORCE_PU (BIT(1)) +#define NRX_DEMAP_FORCE_PU_M (BIT(1)) +#define NRX_DEMAP_FORCE_PU_V 1 +#define NRX_DEMAP_FORCE_PU_S 1 +#define NRX_DEMAP_FORCE_PD (BIT(0)) +#define NRX_DEMAP_FORCE_PD_M (BIT(0)) +#define NRX_DEMAP_FORCE_PD_V 1 +#define NRX_DEMAP_FORCE_PD_S 0 diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/pcnt_caps.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/pcnt_caps.h new file mode 100644 index 0000000000000..b66dccf515977 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/pcnt_caps.h @@ -0,0 +1,40 @@ +// 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. + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +// ESP32 have 1 PCNT peripheral +#define PCNT_PORT_0 (0) /*!< PCNT port 0 */ +#define PCNT_PORT_MAX (1) /*!< PCNT port max */ +#define SOC_PCNT_NUM (PCNT_PORT_MAX) + +#define PCNT_PIN_NOT_USED (-1) /*!< When selected for a pin, this pin will not be used */ + +#define PCNT_UNIT_0 (0) /*!< PCNT unit 0 */ +#define PCNT_UNIT_1 (1) /*!< PCNT unit 1 */ +#define PCNT_UNIT_2 (2) /*!< PCNT unit 2 */ +#define PCNT_UNIT_3 (3) /*!< PCNT unit 3 */ +#define PCNT_UNIT_4 (4) /*!< PCNT unit 4 */ +#define PCNT_UNIT_5 (5) /*!< PCNT unit 5 */ +#define PCNT_UNIT_6 (6) /*!< PCNT unit 6 */ +#define PCNT_UNIT_7 (7) /*!< PCNT unit 7 */ +#define PCNT_UNIT_MAX (8) + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/pcnt_reg.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/pcnt_reg.h new file mode 100644 index 0000000000000..fa7dedc2528e8 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/pcnt_reg.h @@ -0,0 +1,1526 @@ +// 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. +#ifndef _SOC_PCNT_REG_H_ +#define _SOC_PCNT_REG_H_ + + +#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: This register is used to control the mode of channel1's low control + signal for unit0. 2'd0:increase when control signal is low 2'd1: decrease when control signal is high others:forbidden*/ +#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: This register is used to control the mode of channel1's high + control signal for unit0. 2'd0:increase when control signal is low 2'd1: decrease when control signal is high others:forbidden*/ +#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: This register is used to control the mode of channel1's input + posedge signal for unit0. 2'd1: increase at the posedge of input signal 2'd2:decrease at the posedge of input signal others:forbidden*/ +#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: This register is used to control the mode of channel1's input + negedge signal for unit0. 2'd1: increase at the negedge of input signal 2'd2:decrease at the negedge of input signal others:forbidden*/ +#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: This register is used to control the mode of channel0's low control + signal for unit0. 2'd0:increase when control signal is low 2'd1: decrease when control signal is high others:forbidden*/ +#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: This register is used to control the mode of channel0's high + control signal for unit0. 2'd0:increase when control signal is low 2'd1: decrease when control signal is high others:forbidden*/ +#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: This register is used to control the mode of channel0's input + posedge signal for unit0. 2'd1: increase at the posedge of input signal 2'd2:decrease at the posedge of input signal others:forbidden*/ +#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: This register is used to control the mode of channel0's input + negedge signal for unit0. 2'd1: increase at the negedge of input signal 2'd2:decrease at the negedge of input signal others:forbidden*/ +#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: This is the enable bit for comparing unit0's count with thres1 value .*/ +#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: This is the enable bit for comparing unit0's count with thres0 value.*/ +#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: This is the enable bit for comparing unit0's count with thr_l_lim value.*/ +#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: This is the enable bit for comparing unit0's count with thr_h_lim value.*/ +#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: This is the enable bit for comparing unit0's count with 0 value.*/ +#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: This is the enable bit for filtering input signals for unit0.*/ +#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: This register is used to filter pluse whose width is smaller + than this value for unit0.*/ +#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 +#define PCNT_FILTER_THRES_U0_S 0 + +#define PCNT_U0_CONF1_REG (DR_REG_PCNT_BASE + 0x0004) +/* PCNT_CNT_THRES1_U0 : R/W ;bitpos:[31:16] ;default: 10'h0 ; */ +/*description: This register is used to configure thres1 value for unit0.*/ +#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: This register is used to configure thres0 value for unit0.*/ +#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 +#define PCNT_CNT_THRES0_U0_S 0 + +#define PCNT_U0_CONF2_REG (DR_REG_PCNT_BASE + 0x0008) +/* PCNT_CNT_L_LIM_U0 : R/W ;bitpos:[31:16] ;default: 10'h0 ; */ +/*description: This register is used to confiugre thr_l_lim value for unit0.*/ +#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: This register is used to configure thr_h_lim value for unit0.*/ +#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 +#define PCNT_CNT_H_LIM_U0_S 0 + +#define PCNT_U1_CONF0_REG (DR_REG_PCNT_BASE + 0x000c) +/* PCNT_CH1_LCTRL_MODE_U1 : R/W ;bitpos:[31:30] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel1's low control + signal for unit1. 2'd0:increase when control signal is low 2'd1: decrease when control signal is high others:forbidden*/ +#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: This register is used to control the mode of channel1's high + control signal for unit1. 2'd0:increase when control signal is low 2'd1: decrease when control signal is high others:forbidden*/ +#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: This register is used to control the mode of channel1's input + posedge signal for unit1. 2'd1: increase at the posedge of input signal 2'd2:decrease at the posedge of input signal others:forbidden*/ +#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: This register is used to control the mode of channel1's input + negedge signal for unit1. 2'd1: increase at the negedge of input signal 2'd2:decrease at the negedge of input signal others:forbidden*/ +#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: This register is used to control the mode of channel0's low control + signal for unit1. 2'd0:increase when control signal is low 2'd1: decrease when control signal is high others:forbidden*/ +#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: This register is used to control the mode of channel0's high + control signal for unit1. 2'd0:increase when control signal is low 2'd1: decrease when control signal is high others:forbidden*/ +#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: This register is used to control the mode of channel0's input + posedge signal for unit1. 2'd1: increase at the posedge of input signal 2'd2:decrease at the posedge of input signal others:forbidden*/ +#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: This register is used to control the mode of channel0's input + negedge signal for unit1. 2'd1: increase at the negedge of input signal 2'd2:decrease at the negedge of input signal others:forbidden*/ +#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: This is the enable bit for comparing unit1's count with thres1 value .*/ +#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: This is the enable bit for comparing unit1's count with thres0 value.*/ +#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: This is the enable bit for comparing unit1's count with thr_l_lim value.*/ +#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: This is the enable bit for comparing unit1's count with thr_h_lim value.*/ +#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: This is the enable bit for comparing unit1's count with 0 value.*/ +#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: This is the enable bit for filtering input signals for unit1.*/ +#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: This register is used to filter pluse whose width is smaller + than this value for unit1.*/ +#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 +#define PCNT_FILTER_THRES_U1_S 0 + +#define PCNT_U1_CONF1_REG (DR_REG_PCNT_BASE + 0x0010) +/* PCNT_CNT_THRES1_U1 : R/W ;bitpos:[31:16] ;default: 10'h0 ; */ +/*description: This register is used to configure thres1 value for unit1.*/ +#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: This register is used to configure thres0 value for unit1.*/ +#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 +#define PCNT_CNT_THRES0_U1_S 0 + +#define PCNT_U1_CONF2_REG (DR_REG_PCNT_BASE + 0x0014) +/* PCNT_CNT_L_LIM_U1 : R/W ;bitpos:[31:16] ;default: 10'h0 ; */ +/*description: This register is used to confiugre thr_l_lim value for unit1.*/ +#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: This register is used to configure thr_h_lim value for unit1.*/ +#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 +#define PCNT_CNT_H_LIM_U1_S 0 + +#define PCNT_U2_CONF0_REG (DR_REG_PCNT_BASE + 0x0018) +/* PCNT_CH1_LCTRL_MODE_U2 : R/W ;bitpos:[31:30] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel1's low control + signal for unit2. 2'd0:increase when control signal is low 2'd1: decrease when control signal is high others:forbidden*/ +#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: This register is used to control the mode of channel1's high + control signal for unit2. 2'd0:increase when control signal is low 2'd1: decrease when control signal is high others:forbidden*/ +#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: This register is used to control the mode of channel1's input + posedge signal for unit2. 2'd1: increase at the posedge of input signal 2'd2:decrease at the posedge of input signal others:forbidden*/ +#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: This register is used to control the mode of channel1's input + negedge signal for unit2. 2'd1: increase at the negedge of input signal 2'd2:decrease at the negedge of input signal others:forbidden*/ +#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: This register is used to control the mode of channel0's low control + signal for unit2. 2'd0:increase when control signal is low 2'd1: decrease when control signal is high others:forbidden*/ +#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: This register is used to control the mode of channel0's high + control signal for unit2. 2'd0:increase when control signal is low 2'd1: decrease when control signal is high others:forbidden*/ +#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: This register is used to control the mode of channel0's input + posedge signal for unit2. 2'd1: increase at the posedge of input signal 2'd2:decrease at the posedge of input signal others:forbidden*/ +#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: This register is used to control the mode of channel0's input + negedge signal for unit2. 2'd1: increase at the negedge of input signal 2'd2:decrease at the negedge of input signal others:forbidden*/ +#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: This is the enable bit for comparing unit2's count with thres1 value .*/ +#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: This is the enable bit for comparing unit2's count with thres0 value.*/ +#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: This is the enable bit for comparing unit2's count with thr_l_lim value.*/ +#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: This is the enable bit for comparing unit2's count with thr_h_lim value.*/ +#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: This is the enable bit for comparing unit2's count with 0 value.*/ +#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: This is the enable bit for filtering input signals for unit2.*/ +#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: This register is used to filter pluse whose width is smaller + than this value for unit2.*/ +#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 +#define PCNT_FILTER_THRES_U2_S 0 + +#define PCNT_U2_CONF1_REG (DR_REG_PCNT_BASE + 0x001c) +/* PCNT_CNT_THRES1_U2 : R/W ;bitpos:[31:16] ;default: 10'h0 ; */ +/*description: This register is used to configure thres1 value for unit2.*/ +#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: This register is used to configure thres0 value for unit2.*/ +#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 +#define PCNT_CNT_THRES0_U2_S 0 + +#define PCNT_U2_CONF2_REG (DR_REG_PCNT_BASE + 0x0020) +/* PCNT_CNT_L_LIM_U2 : R/W ;bitpos:[31:16] ;default: 10'h0 ; */ +/*description: This register is used to confiugre thr_l_lim value for unit2.*/ +#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: This register is used to configure thr_h_lim value for unit2.*/ +#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 +#define PCNT_CNT_H_LIM_U2_S 0 + +#define PCNT_U3_CONF0_REG (DR_REG_PCNT_BASE + 0x0024) +/* PCNT_CH1_LCTRL_MODE_U3 : R/W ;bitpos:[31:30] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel1's low control + signal for unit3. 2'd0:increase when control signal is low 2'd1: decrease when control signal is high others:forbidden*/ +#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: This register is used to control the mode of channel1's high + control signal for unit3. 2'd0:increase when control signal is low 2'd1: decrease when control signal is high others:forbidden*/ +#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: This register is used to control the mode of channel1's input + posedge signal for unit3. 2'd1: increase at the posedge of input signal 2'd2:decrease at the posedge of input signal others:forbidden*/ +#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: This register is used to control the mode of channel1's input + negedge signal for unit3. 2'd1: increase at the negedge of input signal 2'd2:decrease at the negedge of input signal others:forbidden*/ +#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: This register is used to control the mode of channel0's low control + signal for unit3. 2'd0:increase when control signal is low 2'd1: decrease when control signal is high others:forbidden*/ +#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: This register is used to control the mode of channel0's high + control signal for unit3. 2'd0:increase when control signal is low 2'd1: decrease when control signal is high others:forbidden*/ +#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: This register is used to control the mode of channel0's input + posedge signal for unit3. 2'd1: increase at the posedge of input signal 2'd2:decrease at the posedge of input signal others:forbidden*/ +#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: This register is used to control the mode of channel0's input + negedge signal for unit3. 2'd1: increase at the negedge of input signal 2'd2:decrease at the negedge of input signal others:forbidden*/ +#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: This is the enable bit for comparing unit3's count with thres1 value .*/ +#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: This is the enable bit for comparing unit3's count with thres0 value.*/ +#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: This is the enable bit for comparing unit3's count with thr_l_lim value.*/ +#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: This is the enable bit for comparing unit3's count with thr_h_lim value.*/ +#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: This is the enable bit for comparing unit3's count with 0 value.*/ +#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: This is the enable bit for filtering input signals for unit3.*/ +#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: This register is used to filter pluse whose width is smaller + than this value for unit3.*/ +#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 +#define PCNT_FILTER_THRES_U3_S 0 + +#define PCNT_U3_CONF1_REG (DR_REG_PCNT_BASE + 0x0028) +/* PCNT_CNT_THRES1_U3 : R/W ;bitpos:[31:16] ;default: 10'h0 ; */ +/*description: This register is used to configure thres1 value for unit3.*/ +#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: This register is used to configure thres0 value for unit3.*/ +#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 +#define PCNT_CNT_THRES0_U3_S 0 + +#define PCNT_U3_CONF2_REG (DR_REG_PCNT_BASE + 0x002c) +/* PCNT_CNT_L_LIM_U3 : R/W ;bitpos:[31:16] ;default: 10'h0 ; */ +/*description: This register is used to confiugre thr_l_lim value for unit3.*/ +#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: This register is used to configure thr_h_lim value for unit3.*/ +#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 +#define PCNT_CNT_H_LIM_U3_S 0 + +#define PCNT_U4_CONF0_REG (DR_REG_PCNT_BASE + 0x0030) +/* PCNT_CH1_LCTRL_MODE_U4 : R/W ;bitpos:[31:30] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel1's low control + signal for unit4. 2'd0:increase when control signal is low 2'd1: decrease when control signal is high others:forbidden*/ +#define PCNT_CH1_LCTRL_MODE_U4 0x00000003 +#define PCNT_CH1_LCTRL_MODE_U4_M ((PCNT_CH1_LCTRL_MODE_U4_V)<<(PCNT_CH1_LCTRL_MODE_U4_S)) +#define PCNT_CH1_LCTRL_MODE_U4_V 0x3 +#define PCNT_CH1_LCTRL_MODE_U4_S 30 +/* PCNT_CH1_HCTRL_MODE_U4 : R/W ;bitpos:[29:28] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel1's high + control signal for unit4. 2'd0:increase when control signal is low 2'd1: decrease when control signal is high others:forbidden*/ +#define PCNT_CH1_HCTRL_MODE_U4 0x00000003 +#define PCNT_CH1_HCTRL_MODE_U4_M ((PCNT_CH1_HCTRL_MODE_U4_V)<<(PCNT_CH1_HCTRL_MODE_U4_S)) +#define PCNT_CH1_HCTRL_MODE_U4_V 0x3 +#define PCNT_CH1_HCTRL_MODE_U4_S 28 +/* PCNT_CH1_POS_MODE_U4 : R/W ;bitpos:[27:26] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel1's input + posedge signal for unit4. 2'd1: increase at the posedge of input signal 2'd2:decrease at the posedge of input signal others:forbidden*/ +#define PCNT_CH1_POS_MODE_U4 0x00000003 +#define PCNT_CH1_POS_MODE_U4_M ((PCNT_CH1_POS_MODE_U4_V)<<(PCNT_CH1_POS_MODE_U4_S)) +#define PCNT_CH1_POS_MODE_U4_V 0x3 +#define PCNT_CH1_POS_MODE_U4_S 26 +/* PCNT_CH1_NEG_MODE_U4 : R/W ;bitpos:[25:24] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel1's input + negedge signal for unit4. 2'd1: increase at the negedge of input signal 2'd2:decrease at the negedge of input signal others:forbidden*/ +#define PCNT_CH1_NEG_MODE_U4 0x00000003 +#define PCNT_CH1_NEG_MODE_U4_M ((PCNT_CH1_NEG_MODE_U4_V)<<(PCNT_CH1_NEG_MODE_U4_S)) +#define PCNT_CH1_NEG_MODE_U4_V 0x3 +#define PCNT_CH1_NEG_MODE_U4_S 24 +/* PCNT_CH0_LCTRL_MODE_U4 : R/W ;bitpos:[23:22] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel0's low control + signal for unit4. 2'd0:increase when control signal is low 2'd1: decrease when control signal is high others:forbidden*/ +#define PCNT_CH0_LCTRL_MODE_U4 0x00000003 +#define PCNT_CH0_LCTRL_MODE_U4_M ((PCNT_CH0_LCTRL_MODE_U4_V)<<(PCNT_CH0_LCTRL_MODE_U4_S)) +#define PCNT_CH0_LCTRL_MODE_U4_V 0x3 +#define PCNT_CH0_LCTRL_MODE_U4_S 22 +/* PCNT_CH0_HCTRL_MODE_U4 : R/W ;bitpos:[21:20] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel0's high + control signal for unit4. 2'd0:increase when control signal is low 2'd1: decrease when control signal is high others:forbidden*/ +#define PCNT_CH0_HCTRL_MODE_U4 0x00000003 +#define PCNT_CH0_HCTRL_MODE_U4_M ((PCNT_CH0_HCTRL_MODE_U4_V)<<(PCNT_CH0_HCTRL_MODE_U4_S)) +#define PCNT_CH0_HCTRL_MODE_U4_V 0x3 +#define PCNT_CH0_HCTRL_MODE_U4_S 20 +/* PCNT_CH0_POS_MODE_U4 : R/W ;bitpos:[19:18] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel0's input + posedge signal for unit4. 2'd1: increase at the posedge of input signal 2'd2:decrease at the posedge of input signal others:forbidden*/ +#define PCNT_CH0_POS_MODE_U4 0x00000003 +#define PCNT_CH0_POS_MODE_U4_M ((PCNT_CH0_POS_MODE_U4_V)<<(PCNT_CH0_POS_MODE_U4_S)) +#define PCNT_CH0_POS_MODE_U4_V 0x3 +#define PCNT_CH0_POS_MODE_U4_S 18 +/* PCNT_CH0_NEG_MODE_U4 : R/W ;bitpos:[17:16] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel0's input + negedge signal for unit4. 2'd1: increase at the negedge of input signal 2'd2:decrease at the negedge of input signal others:forbidden*/ +#define PCNT_CH0_NEG_MODE_U4 0x00000003 +#define PCNT_CH0_NEG_MODE_U4_M ((PCNT_CH0_NEG_MODE_U4_V)<<(PCNT_CH0_NEG_MODE_U4_S)) +#define PCNT_CH0_NEG_MODE_U4_V 0x3 +#define PCNT_CH0_NEG_MODE_U4_S 16 +/* PCNT_THR_THRES1_EN_U4 : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: This is the enable bit for comparing unit4's count with thres1 value .*/ +#define PCNT_THR_THRES1_EN_U4 (BIT(15)) +#define PCNT_THR_THRES1_EN_U4_M (BIT(15)) +#define PCNT_THR_THRES1_EN_U4_V 0x1 +#define PCNT_THR_THRES1_EN_U4_S 15 +/* PCNT_THR_THRES0_EN_U4 : R/W ;bitpos:[14] ;default: 1'b0 ; */ +/*description: This is the enable bit for comparing unit4's count with thres0 value.*/ +#define PCNT_THR_THRES0_EN_U4 (BIT(14)) +#define PCNT_THR_THRES0_EN_U4_M (BIT(14)) +#define PCNT_THR_THRES0_EN_U4_V 0x1 +#define PCNT_THR_THRES0_EN_U4_S 14 +/* PCNT_THR_L_LIM_EN_U4 : R/W ;bitpos:[13] ;default: 1'b1 ; */ +/*description: This is the enable bit for comparing unit4's count with thr_l_lim value.*/ +#define PCNT_THR_L_LIM_EN_U4 (BIT(13)) +#define PCNT_THR_L_LIM_EN_U4_M (BIT(13)) +#define PCNT_THR_L_LIM_EN_U4_V 0x1 +#define PCNT_THR_L_LIM_EN_U4_S 13 +/* PCNT_THR_H_LIM_EN_U4 : R/W ;bitpos:[12] ;default: 1'b1 ; */ +/*description: This is the enable bit for comparing unit4's count with thr_h_lim value.*/ +#define PCNT_THR_H_LIM_EN_U4 (BIT(12)) +#define PCNT_THR_H_LIM_EN_U4_M (BIT(12)) +#define PCNT_THR_H_LIM_EN_U4_V 0x1 +#define PCNT_THR_H_LIM_EN_U4_S 12 +/* PCNT_THR_ZERO_EN_U4 : R/W ;bitpos:[11] ;default: 1'b1 ; */ +/*description: This is the enable bit for comparing unit4's count with 0 value.*/ +#define PCNT_THR_ZERO_EN_U4 (BIT(11)) +#define PCNT_THR_ZERO_EN_U4_M (BIT(11)) +#define PCNT_THR_ZERO_EN_U4_V 0x1 +#define PCNT_THR_ZERO_EN_U4_S 11 +/* PCNT_FILTER_EN_U4 : R/W ;bitpos:[10] ;default: 1'b1 ; */ +/*description: This is the enable bit for filtering input signals for unit4.*/ +#define PCNT_FILTER_EN_U4 (BIT(10)) +#define PCNT_FILTER_EN_U4_M (BIT(10)) +#define PCNT_FILTER_EN_U4_V 0x1 +#define PCNT_FILTER_EN_U4_S 10 +/* PCNT_FILTER_THRES_U4 : R/W ;bitpos:[9:0] ;default: 10'h10 ; */ +/*description: This register is used to filter pluse whose width is smaller + than this value for unit4.*/ +#define PCNT_FILTER_THRES_U4 0x000003FF +#define PCNT_FILTER_THRES_U4_M ((PCNT_FILTER_THRES_U4_V)<<(PCNT_FILTER_THRES_U4_S)) +#define PCNT_FILTER_THRES_U4_V 0x3FF +#define PCNT_FILTER_THRES_U4_S 0 + +#define PCNT_U4_CONF1_REG (DR_REG_PCNT_BASE + 0x0034) +/* PCNT_CNT_THRES1_U4 : R/W ;bitpos:[31:16] ;default: 10'h0 ; */ +/*description: This register is used to configure thres1 value for unit4.*/ +#define PCNT_CNT_THRES1_U4 0x0000FFFF +#define PCNT_CNT_THRES1_U4_M ((PCNT_CNT_THRES1_U4_V)<<(PCNT_CNT_THRES1_U4_S)) +#define PCNT_CNT_THRES1_U4_V 0xFFFF +#define PCNT_CNT_THRES1_U4_S 16 +/* PCNT_CNT_THRES0_U4 : R/W ;bitpos:[15:0] ;default: 10'h0 ; */ +/*description: This register is used to configure thres0 value for unit4.*/ +#define PCNT_CNT_THRES0_U4 0x0000FFFF +#define PCNT_CNT_THRES0_U4_M ((PCNT_CNT_THRES0_U4_V)<<(PCNT_CNT_THRES0_U4_S)) +#define PCNT_CNT_THRES0_U4_V 0xFFFF +#define PCNT_CNT_THRES0_U4_S 0 + +#define PCNT_U4_CONF2_REG (DR_REG_PCNT_BASE + 0x0038) +/* PCNT_CNT_L_LIM_U4 : R/W ;bitpos:[31:16] ;default: 10'h0 ; */ +/*description: This register is used to confiugre thr_l_lim value for unit4.*/ +#define PCNT_CNT_L_LIM_U4 0x0000FFFF +#define PCNT_CNT_L_LIM_U4_M ((PCNT_CNT_L_LIM_U4_V)<<(PCNT_CNT_L_LIM_U4_S)) +#define PCNT_CNT_L_LIM_U4_V 0xFFFF +#define PCNT_CNT_L_LIM_U4_S 16 +/* PCNT_CNT_H_LIM_U4 : R/W ;bitpos:[15:0] ;default: 10'h0 ; */ +/*description: This register is used to configure thr_h_lim value for unit4.*/ +#define PCNT_CNT_H_LIM_U4 0x0000FFFF +#define PCNT_CNT_H_LIM_U4_M ((PCNT_CNT_H_LIM_U4_V)<<(PCNT_CNT_H_LIM_U4_S)) +#define PCNT_CNT_H_LIM_U4_V 0xFFFF +#define PCNT_CNT_H_LIM_U4_S 0 + +#define PCNT_U5_CONF0_REG (DR_REG_PCNT_BASE + 0x003c) +/* PCNT_CH1_LCTRL_MODE_U5 : R/W ;bitpos:[31:30] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel1's low control + signal for unit5. 2'd0:increase when control signal is low 2'd1: decrease when control signal is high others:forbidden*/ +#define PCNT_CH1_LCTRL_MODE_U5 0x00000003 +#define PCNT_CH1_LCTRL_MODE_U5_M ((PCNT_CH1_LCTRL_MODE_U5_V)<<(PCNT_CH1_LCTRL_MODE_U5_S)) +#define PCNT_CH1_LCTRL_MODE_U5_V 0x3 +#define PCNT_CH1_LCTRL_MODE_U5_S 30 +/* PCNT_CH1_HCTRL_MODE_U5 : R/W ;bitpos:[29:28] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel1's high + control signal for unit5. 2'd0:increase when control signal is low 2'd1: decrease when control signal is high others:forbidden*/ +#define PCNT_CH1_HCTRL_MODE_U5 0x00000003 +#define PCNT_CH1_HCTRL_MODE_U5_M ((PCNT_CH1_HCTRL_MODE_U5_V)<<(PCNT_CH1_HCTRL_MODE_U5_S)) +#define PCNT_CH1_HCTRL_MODE_U5_V 0x3 +#define PCNT_CH1_HCTRL_MODE_U5_S 28 +/* PCNT_CH1_POS_MODE_U5 : R/W ;bitpos:[27:26] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel1's input + posedge signal for unit5. 2'd1: increase at the posedge of input signal 2'd2:decrease at the posedge of input signal others:forbidden*/ +#define PCNT_CH1_POS_MODE_U5 0x00000003 +#define PCNT_CH1_POS_MODE_U5_M ((PCNT_CH1_POS_MODE_U5_V)<<(PCNT_CH1_POS_MODE_U5_S)) +#define PCNT_CH1_POS_MODE_U5_V 0x3 +#define PCNT_CH1_POS_MODE_U5_S 26 +/* PCNT_CH1_NEG_MODE_U5 : R/W ;bitpos:[25:24] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel1's input + negedge signal for unit5. 2'd1: increase at the negedge of input signal 2'd2:decrease at the negedge of input signal others:forbidden*/ +#define PCNT_CH1_NEG_MODE_U5 0x00000003 +#define PCNT_CH1_NEG_MODE_U5_M ((PCNT_CH1_NEG_MODE_U5_V)<<(PCNT_CH1_NEG_MODE_U5_S)) +#define PCNT_CH1_NEG_MODE_U5_V 0x3 +#define PCNT_CH1_NEG_MODE_U5_S 24 +/* PCNT_CH0_LCTRL_MODE_U5 : R/W ;bitpos:[23:22] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel0's low control + signal for unit5. 2'd0:increase when control signal is low 2'd1: decrease when control signal is high others:forbidden*/ +#define PCNT_CH0_LCTRL_MODE_U5 0x00000003 +#define PCNT_CH0_LCTRL_MODE_U5_M ((PCNT_CH0_LCTRL_MODE_U5_V)<<(PCNT_CH0_LCTRL_MODE_U5_S)) +#define PCNT_CH0_LCTRL_MODE_U5_V 0x3 +#define PCNT_CH0_LCTRL_MODE_U5_S 22 +/* PCNT_CH0_HCTRL_MODE_U5 : R/W ;bitpos:[21:20] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel0's high + control signal for unit5. 2'd0:increase when control signal is low 2'd1: decrease when control signal is high others:forbidden*/ +#define PCNT_CH0_HCTRL_MODE_U5 0x00000003 +#define PCNT_CH0_HCTRL_MODE_U5_M ((PCNT_CH0_HCTRL_MODE_U5_V)<<(PCNT_CH0_HCTRL_MODE_U5_S)) +#define PCNT_CH0_HCTRL_MODE_U5_V 0x3 +#define PCNT_CH0_HCTRL_MODE_U5_S 20 +/* PCNT_CH0_POS_MODE_U5 : R/W ;bitpos:[19:18] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel0's input + posedge signal for unit5. 2'd1: increase at the posedge of input signal 2'd2:decrease at the posedge of input signal others:forbidden*/ +#define PCNT_CH0_POS_MODE_U5 0x00000003 +#define PCNT_CH0_POS_MODE_U5_M ((PCNT_CH0_POS_MODE_U5_V)<<(PCNT_CH0_POS_MODE_U5_S)) +#define PCNT_CH0_POS_MODE_U5_V 0x3 +#define PCNT_CH0_POS_MODE_U5_S 18 +/* PCNT_CH0_NEG_MODE_U5 : R/W ;bitpos:[17:16] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel0's input + negedge signal for unit5. 2'd1: increase at the negedge of input signal 2'd2:decrease at the negedge of input signal others:forbidden*/ +#define PCNT_CH0_NEG_MODE_U5 0x00000003 +#define PCNT_CH0_NEG_MODE_U5_M ((PCNT_CH0_NEG_MODE_U5_V)<<(PCNT_CH0_NEG_MODE_U5_S)) +#define PCNT_CH0_NEG_MODE_U5_V 0x3 +#define PCNT_CH0_NEG_MODE_U5_S 16 +/* PCNT_THR_THRES1_EN_U5 : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: This is the enable bit for comparing unit5's count with thres1 value .*/ +#define PCNT_THR_THRES1_EN_U5 (BIT(15)) +#define PCNT_THR_THRES1_EN_U5_M (BIT(15)) +#define PCNT_THR_THRES1_EN_U5_V 0x1 +#define PCNT_THR_THRES1_EN_U5_S 15 +/* PCNT_THR_THRES0_EN_U5 : R/W ;bitpos:[14] ;default: 1'b0 ; */ +/*description: This is the enable bit for comparing unit5's count with thres0 value.*/ +#define PCNT_THR_THRES0_EN_U5 (BIT(14)) +#define PCNT_THR_THRES0_EN_U5_M (BIT(14)) +#define PCNT_THR_THRES0_EN_U5_V 0x1 +#define PCNT_THR_THRES0_EN_U5_S 14 +/* PCNT_THR_L_LIM_EN_U5 : R/W ;bitpos:[13] ;default: 1'b1 ; */ +/*description: This is the enable bit for comparing unit5's count with thr_l_lim value.*/ +#define PCNT_THR_L_LIM_EN_U5 (BIT(13)) +#define PCNT_THR_L_LIM_EN_U5_M (BIT(13)) +#define PCNT_THR_L_LIM_EN_U5_V 0x1 +#define PCNT_THR_L_LIM_EN_U5_S 13 +/* PCNT_THR_H_LIM_EN_U5 : R/W ;bitpos:[12] ;default: 1'b1 ; */ +/*description: This is the enable bit for comparing unit5's count with thr_h_lim value.*/ +#define PCNT_THR_H_LIM_EN_U5 (BIT(12)) +#define PCNT_THR_H_LIM_EN_U5_M (BIT(12)) +#define PCNT_THR_H_LIM_EN_U5_V 0x1 +#define PCNT_THR_H_LIM_EN_U5_S 12 +/* PCNT_THR_ZERO_EN_U5 : R/W ;bitpos:[11] ;default: 1'b1 ; */ +/*description: This is the enable bit for comparing unit5's count with 0 value.*/ +#define PCNT_THR_ZERO_EN_U5 (BIT(11)) +#define PCNT_THR_ZERO_EN_U5_M (BIT(11)) +#define PCNT_THR_ZERO_EN_U5_V 0x1 +#define PCNT_THR_ZERO_EN_U5_S 11 +/* PCNT_FILTER_EN_U5 : R/W ;bitpos:[10] ;default: 1'b1 ; */ +/*description: This is the enable bit for filtering input signals for unit5.*/ +#define PCNT_FILTER_EN_U5 (BIT(10)) +#define PCNT_FILTER_EN_U5_M (BIT(10)) +#define PCNT_FILTER_EN_U5_V 0x1 +#define PCNT_FILTER_EN_U5_S 10 +/* PCNT_FILTER_THRES_U5 : R/W ;bitpos:[9:0] ;default: 10'h10 ; */ +/*description: This register is used to filter pluse whose width is smaller + than this value for unit5.*/ +#define PCNT_FILTER_THRES_U5 0x000003FF +#define PCNT_FILTER_THRES_U5_M ((PCNT_FILTER_THRES_U5_V)<<(PCNT_FILTER_THRES_U5_S)) +#define PCNT_FILTER_THRES_U5_V 0x3FF +#define PCNT_FILTER_THRES_U5_S 0 + +#define PCNT_U5_CONF1_REG (DR_REG_PCNT_BASE + 0x0040) +/* PCNT_CNT_THRES1_U5 : R/W ;bitpos:[31:16] ;default: 10'h0 ; */ +/*description: This register is used to configure thres1 value for unit5.*/ +#define PCNT_CNT_THRES1_U5 0x0000FFFF +#define PCNT_CNT_THRES1_U5_M ((PCNT_CNT_THRES1_U5_V)<<(PCNT_CNT_THRES1_U5_S)) +#define PCNT_CNT_THRES1_U5_V 0xFFFF +#define PCNT_CNT_THRES1_U5_S 16 +/* PCNT_CNT_THRES0_U5 : R/W ;bitpos:[15:0] ;default: 10'h0 ; */ +/*description: This register is used to configure thres0 value for unit5.*/ +#define PCNT_CNT_THRES0_U5 0x0000FFFF +#define PCNT_CNT_THRES0_U5_M ((PCNT_CNT_THRES0_U5_V)<<(PCNT_CNT_THRES0_U5_S)) +#define PCNT_CNT_THRES0_U5_V 0xFFFF +#define PCNT_CNT_THRES0_U5_S 0 + +#define PCNT_U5_CONF2_REG (DR_REG_PCNT_BASE + 0x0044) +/* PCNT_CNT_L_LIM_U5 : R/W ;bitpos:[31:16] ;default: 10'h0 ; */ +/*description: This register is used to confiugre thr_l_lim value for unit5.*/ +#define PCNT_CNT_L_LIM_U5 0x0000FFFF +#define PCNT_CNT_L_LIM_U5_M ((PCNT_CNT_L_LIM_U5_V)<<(PCNT_CNT_L_LIM_U5_S)) +#define PCNT_CNT_L_LIM_U5_V 0xFFFF +#define PCNT_CNT_L_LIM_U5_S 16 +/* PCNT_CNT_H_LIM_U5 : R/W ;bitpos:[15:0] ;default: 10'h0 ; */ +/*description: This register is used to configure thr_h_lim value for unit5.*/ +#define PCNT_CNT_H_LIM_U5 0x0000FFFF +#define PCNT_CNT_H_LIM_U5_M ((PCNT_CNT_H_LIM_U5_V)<<(PCNT_CNT_H_LIM_U5_S)) +#define PCNT_CNT_H_LIM_U5_V 0xFFFF +#define PCNT_CNT_H_LIM_U5_S 0 + +#define PCNT_U6_CONF0_REG (DR_REG_PCNT_BASE + 0x0048) +/* PCNT_CH1_LCTRL_MODE_U6 : R/W ;bitpos:[31:30] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel1's low control + signal for unit6. 2'd0:increase when control signal is low 2'd1: decrease when control signal is high others:forbidden*/ +#define PCNT_CH1_LCTRL_MODE_U6 0x00000003 +#define PCNT_CH1_LCTRL_MODE_U6_M ((PCNT_CH1_LCTRL_MODE_U6_V)<<(PCNT_CH1_LCTRL_MODE_U6_S)) +#define PCNT_CH1_LCTRL_MODE_U6_V 0x3 +#define PCNT_CH1_LCTRL_MODE_U6_S 30 +/* PCNT_CH1_HCTRL_MODE_U6 : R/W ;bitpos:[29:28] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel1's high + control signal for unit6. 2'd0:increase when control signal is low 2'd1: decrease when control signal is high others:forbidden*/ +#define PCNT_CH1_HCTRL_MODE_U6 0x00000003 +#define PCNT_CH1_HCTRL_MODE_U6_M ((PCNT_CH1_HCTRL_MODE_U6_V)<<(PCNT_CH1_HCTRL_MODE_U6_S)) +#define PCNT_CH1_HCTRL_MODE_U6_V 0x3 +#define PCNT_CH1_HCTRL_MODE_U6_S 28 +/* PCNT_CH1_POS_MODE_U6 : R/W ;bitpos:[27:26] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel1's input + posedge signal for unit6. 2'd1: increase at the posedge of input signal 2'd2:decrease at the posedge of input signal others:forbidden*/ +#define PCNT_CH1_POS_MODE_U6 0x00000003 +#define PCNT_CH1_POS_MODE_U6_M ((PCNT_CH1_POS_MODE_U6_V)<<(PCNT_CH1_POS_MODE_U6_S)) +#define PCNT_CH1_POS_MODE_U6_V 0x3 +#define PCNT_CH1_POS_MODE_U6_S 26 +/* PCNT_CH1_NEG_MODE_U6 : R/W ;bitpos:[25:24] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel1's input + negedge signal for unit6. 2'd1: increase at the negedge of input signal 2'd2:decrease at the negedge of input signal others:forbidden*/ +#define PCNT_CH1_NEG_MODE_U6 0x00000003 +#define PCNT_CH1_NEG_MODE_U6_M ((PCNT_CH1_NEG_MODE_U6_V)<<(PCNT_CH1_NEG_MODE_U6_S)) +#define PCNT_CH1_NEG_MODE_U6_V 0x3 +#define PCNT_CH1_NEG_MODE_U6_S 24 +/* PCNT_CH0_LCTRL_MODE_U6 : R/W ;bitpos:[23:22] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel0's low control + signal for unit6. 2'd0:increase when control signal is low 2'd1: decrease when control signal is high others:forbidden*/ +#define PCNT_CH0_LCTRL_MODE_U6 0x00000003 +#define PCNT_CH0_LCTRL_MODE_U6_M ((PCNT_CH0_LCTRL_MODE_U6_V)<<(PCNT_CH0_LCTRL_MODE_U6_S)) +#define PCNT_CH0_LCTRL_MODE_U6_V 0x3 +#define PCNT_CH0_LCTRL_MODE_U6_S 22 +/* PCNT_CH0_HCTRL_MODE_U6 : R/W ;bitpos:[21:20] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel0's high + control signal for unit6. 2'd0:increase when control signal is low 2'd1: decrease when control signal is high others:forbidden*/ +#define PCNT_CH0_HCTRL_MODE_U6 0x00000003 +#define PCNT_CH0_HCTRL_MODE_U6_M ((PCNT_CH0_HCTRL_MODE_U6_V)<<(PCNT_CH0_HCTRL_MODE_U6_S)) +#define PCNT_CH0_HCTRL_MODE_U6_V 0x3 +#define PCNT_CH0_HCTRL_MODE_U6_S 20 +/* PCNT_CH0_POS_MODE_U6 : R/W ;bitpos:[19:18] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel0's input + posedge signal for unit6. 2'd1: increase at the posedge of input signal 2'd2:decrease at the posedge of input signal others:forbidden*/ +#define PCNT_CH0_POS_MODE_U6 0x00000003 +#define PCNT_CH0_POS_MODE_U6_M ((PCNT_CH0_POS_MODE_U6_V)<<(PCNT_CH0_POS_MODE_U6_S)) +#define PCNT_CH0_POS_MODE_U6_V 0x3 +#define PCNT_CH0_POS_MODE_U6_S 18 +/* PCNT_CH0_NEG_MODE_U6 : R/W ;bitpos:[17:16] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel0's input + negedge signal for unit6. 2'd1: increase at the negedge of input signal 2'd2:decrease at the negedge of input signal others:forbidden*/ +#define PCNT_CH0_NEG_MODE_U6 0x00000003 +#define PCNT_CH0_NEG_MODE_U6_M ((PCNT_CH0_NEG_MODE_U6_V)<<(PCNT_CH0_NEG_MODE_U6_S)) +#define PCNT_CH0_NEG_MODE_U6_V 0x3 +#define PCNT_CH0_NEG_MODE_U6_S 16 +/* PCNT_THR_THRES1_EN_U6 : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: This is the enable bit for comparing unit6's count with thres1 value .*/ +#define PCNT_THR_THRES1_EN_U6 (BIT(15)) +#define PCNT_THR_THRES1_EN_U6_M (BIT(15)) +#define PCNT_THR_THRES1_EN_U6_V 0x1 +#define PCNT_THR_THRES1_EN_U6_S 15 +/* PCNT_THR_THRES0_EN_U6 : R/W ;bitpos:[14] ;default: 1'b0 ; */ +/*description: This is the enable bit for comparing unit6's count with thres0 value.*/ +#define PCNT_THR_THRES0_EN_U6 (BIT(14)) +#define PCNT_THR_THRES0_EN_U6_M (BIT(14)) +#define PCNT_THR_THRES0_EN_U6_V 0x1 +#define PCNT_THR_THRES0_EN_U6_S 14 +/* PCNT_THR_L_LIM_EN_U6 : R/W ;bitpos:[13] ;default: 1'b1 ; */ +/*description: This is the enable bit for comparing unit6's count with thr_l_lim value.*/ +#define PCNT_THR_L_LIM_EN_U6 (BIT(13)) +#define PCNT_THR_L_LIM_EN_U6_M (BIT(13)) +#define PCNT_THR_L_LIM_EN_U6_V 0x1 +#define PCNT_THR_L_LIM_EN_U6_S 13 +/* PCNT_THR_H_LIM_EN_U6 : R/W ;bitpos:[12] ;default: 1'b1 ; */ +/*description: This is the enable bit for comparing unit6's count with thr_h_lim value.*/ +#define PCNT_THR_H_LIM_EN_U6 (BIT(12)) +#define PCNT_THR_H_LIM_EN_U6_M (BIT(12)) +#define PCNT_THR_H_LIM_EN_U6_V 0x1 +#define PCNT_THR_H_LIM_EN_U6_S 12 +/* PCNT_THR_ZERO_EN_U6 : R/W ;bitpos:[11] ;default: 1'b1 ; */ +/*description: This is the enable bit for comparing unit6's count with 0 value.*/ +#define PCNT_THR_ZERO_EN_U6 (BIT(11)) +#define PCNT_THR_ZERO_EN_U6_M (BIT(11)) +#define PCNT_THR_ZERO_EN_U6_V 0x1 +#define PCNT_THR_ZERO_EN_U6_S 11 +/* PCNT_FILTER_EN_U6 : R/W ;bitpos:[10] ;default: 1'b1 ; */ +/*description: This is the enable bit for filtering input signals for unit6.*/ +#define PCNT_FILTER_EN_U6 (BIT(10)) +#define PCNT_FILTER_EN_U6_M (BIT(10)) +#define PCNT_FILTER_EN_U6_V 0x1 +#define PCNT_FILTER_EN_U6_S 10 +/* PCNT_FILTER_THRES_U6 : R/W ;bitpos:[9:0] ;default: 10'h10 ; */ +/*description: This register is used to filter pluse whose width is smaller + than this value for unit6.*/ +#define PCNT_FILTER_THRES_U6 0x000003FF +#define PCNT_FILTER_THRES_U6_M ((PCNT_FILTER_THRES_U6_V)<<(PCNT_FILTER_THRES_U6_S)) +#define PCNT_FILTER_THRES_U6_V 0x3FF +#define PCNT_FILTER_THRES_U6_S 0 + +#define PCNT_U6_CONF1_REG (DR_REG_PCNT_BASE + 0x004c) +/* PCNT_CNT_THRES1_U6 : R/W ;bitpos:[31:16] ;default: 10'h0 ; */ +/*description: This register is used to configure thres1 value for unit6.*/ +#define PCNT_CNT_THRES1_U6 0x0000FFFF +#define PCNT_CNT_THRES1_U6_M ((PCNT_CNT_THRES1_U6_V)<<(PCNT_CNT_THRES1_U6_S)) +#define PCNT_CNT_THRES1_U6_V 0xFFFF +#define PCNT_CNT_THRES1_U6_S 16 +/* PCNT_CNT_THRES0_U6 : R/W ;bitpos:[15:0] ;default: 10'h0 ; */ +/*description: This register is used to configure thres0 value for unit6.*/ +#define PCNT_CNT_THRES0_U6 0x0000FFFF +#define PCNT_CNT_THRES0_U6_M ((PCNT_CNT_THRES0_U6_V)<<(PCNT_CNT_THRES0_U6_S)) +#define PCNT_CNT_THRES0_U6_V 0xFFFF +#define PCNT_CNT_THRES0_U6_S 0 + +#define PCNT_U6_CONF2_REG (DR_REG_PCNT_BASE + 0x0050) +/* PCNT_CNT_L_LIM_U6 : R/W ;bitpos:[31:16] ;default: 10'h0 ; */ +/*description: This register is used to confiugre thr_l_lim value for unit6.*/ +#define PCNT_CNT_L_LIM_U6 0x0000FFFF +#define PCNT_CNT_L_LIM_U6_M ((PCNT_CNT_L_LIM_U6_V)<<(PCNT_CNT_L_LIM_U6_S)) +#define PCNT_CNT_L_LIM_U6_V 0xFFFF +#define PCNT_CNT_L_LIM_U6_S 16 +/* PCNT_CNT_H_LIM_U6 : R/W ;bitpos:[15:0] ;default: 10'h0 ; */ +/*description: This register is used to configure thr_h_lim value for unit6.*/ +#define PCNT_CNT_H_LIM_U6 0x0000FFFF +#define PCNT_CNT_H_LIM_U6_M ((PCNT_CNT_H_LIM_U6_V)<<(PCNT_CNT_H_LIM_U6_S)) +#define PCNT_CNT_H_LIM_U6_V 0xFFFF +#define PCNT_CNT_H_LIM_U6_S 0 + +#define PCNT_U7_CONF0_REG (DR_REG_PCNT_BASE + 0x0054) +/* PCNT_CH1_LCTRL_MODE_U7 : R/W ;bitpos:[31:30] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel1's low control + signal for unit7. 2'd0:increase when control signal is low 2'd1: decrease when control signal is high others:forbidden*/ +#define PCNT_CH1_LCTRL_MODE_U7 0x00000003 +#define PCNT_CH1_LCTRL_MODE_U7_M ((PCNT_CH1_LCTRL_MODE_U7_V)<<(PCNT_CH1_LCTRL_MODE_U7_S)) +#define PCNT_CH1_LCTRL_MODE_U7_V 0x3 +#define PCNT_CH1_LCTRL_MODE_U7_S 30 +/* PCNT_CH1_HCTRL_MODE_U7 : R/W ;bitpos:[29:28] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel1's high + control signal for unit7. 2'd0:increase when control signal is low 2'd1: decrease when control signal is high others:forbidden*/ +#define PCNT_CH1_HCTRL_MODE_U7 0x00000003 +#define PCNT_CH1_HCTRL_MODE_U7_M ((PCNT_CH1_HCTRL_MODE_U7_V)<<(PCNT_CH1_HCTRL_MODE_U7_S)) +#define PCNT_CH1_HCTRL_MODE_U7_V 0x3 +#define PCNT_CH1_HCTRL_MODE_U7_S 28 +/* PCNT_CH1_POS_MODE_U7 : R/W ;bitpos:[27:26] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel1's input + posedge signal for unit7. 2'd1: increase at the posedge of input signal 2'd2:decrease at the posedge of input signal others:forbidden*/ +#define PCNT_CH1_POS_MODE_U7 0x00000003 +#define PCNT_CH1_POS_MODE_U7_M ((PCNT_CH1_POS_MODE_U7_V)<<(PCNT_CH1_POS_MODE_U7_S)) +#define PCNT_CH1_POS_MODE_U7_V 0x3 +#define PCNT_CH1_POS_MODE_U7_S 26 +/* PCNT_CH1_NEG_MODE_U7 : R/W ;bitpos:[25:24] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel1's input + negedge signal for unit7. 2'd1: increase at the negedge of input signal 2'd2:decrease at the negedge of input signal others:forbidden*/ +#define PCNT_CH1_NEG_MODE_U7 0x00000003 +#define PCNT_CH1_NEG_MODE_U7_M ((PCNT_CH1_NEG_MODE_U7_V)<<(PCNT_CH1_NEG_MODE_U7_S)) +#define PCNT_CH1_NEG_MODE_U7_V 0x3 +#define PCNT_CH1_NEG_MODE_U7_S 24 +/* PCNT_CH0_LCTRL_MODE_U7 : R/W ;bitpos:[23:22] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel0's low control + signal for unit7. 2'd0:increase when control signal is low 2'd1: decrease when control signal is high others:forbidden*/ +#define PCNT_CH0_LCTRL_MODE_U7 0x00000003 +#define PCNT_CH0_LCTRL_MODE_U7_M ((PCNT_CH0_LCTRL_MODE_U7_V)<<(PCNT_CH0_LCTRL_MODE_U7_S)) +#define PCNT_CH0_LCTRL_MODE_U7_V 0x3 +#define PCNT_CH0_LCTRL_MODE_U7_S 22 +/* PCNT_CH0_HCTRL_MODE_U7 : R/W ;bitpos:[21:20] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel0's high + control signal for unit7. 2'd0:increase when control signal is low 2'd1: decrease when control signal is high others:forbidden*/ +#define PCNT_CH0_HCTRL_MODE_U7 0x00000003 +#define PCNT_CH0_HCTRL_MODE_U7_M ((PCNT_CH0_HCTRL_MODE_U7_V)<<(PCNT_CH0_HCTRL_MODE_U7_S)) +#define PCNT_CH0_HCTRL_MODE_U7_V 0x3 +#define PCNT_CH0_HCTRL_MODE_U7_S 20 +/* PCNT_CH0_POS_MODE_U7 : R/W ;bitpos:[19:18] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel0's input + posedge signal for unit7. 2'd1: increase at the posedge of input signal 2'd2:decrease at the posedge of input signal others:forbidden*/ +#define PCNT_CH0_POS_MODE_U7 0x00000003 +#define PCNT_CH0_POS_MODE_U7_M ((PCNT_CH0_POS_MODE_U7_V)<<(PCNT_CH0_POS_MODE_U7_S)) +#define PCNT_CH0_POS_MODE_U7_V 0x3 +#define PCNT_CH0_POS_MODE_U7_S 18 +/* PCNT_CH0_NEG_MODE_U7 : R/W ;bitpos:[17:16] ;default: 2'd0 ; */ +/*description: This register is used to control the mode of channel0's input + negedge signal for unit7. 2'd1: increase at the negedge of input signal 2'd2:decrease at the negedge of input signal others:forbidden*/ +#define PCNT_CH0_NEG_MODE_U7 0x00000003 +#define PCNT_CH0_NEG_MODE_U7_M ((PCNT_CH0_NEG_MODE_U7_V)<<(PCNT_CH0_NEG_MODE_U7_S)) +#define PCNT_CH0_NEG_MODE_U7_V 0x3 +#define PCNT_CH0_NEG_MODE_U7_S 16 +/* PCNT_THR_THRES1_EN_U7 : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: This is the enable bit for comparing unit7's count with thres1 value .*/ +#define PCNT_THR_THRES1_EN_U7 (BIT(15)) +#define PCNT_THR_THRES1_EN_U7_M (BIT(15)) +#define PCNT_THR_THRES1_EN_U7_V 0x1 +#define PCNT_THR_THRES1_EN_U7_S 15 +/* PCNT_THR_THRES0_EN_U7 : R/W ;bitpos:[14] ;default: 1'b0 ; */ +/*description: This is the enable bit for comparing unit7's count with thres0 value.*/ +#define PCNT_THR_THRES0_EN_U7 (BIT(14)) +#define PCNT_THR_THRES0_EN_U7_M (BIT(14)) +#define PCNT_THR_THRES0_EN_U7_V 0x1 +#define PCNT_THR_THRES0_EN_U7_S 14 +/* PCNT_THR_L_LIM_EN_U7 : R/W ;bitpos:[13] ;default: 1'b1 ; */ +/*description: This is the enable bit for comparing unit7's count with thr_l_lim value.*/ +#define PCNT_THR_L_LIM_EN_U7 (BIT(13)) +#define PCNT_THR_L_LIM_EN_U7_M (BIT(13)) +#define PCNT_THR_L_LIM_EN_U7_V 0x1 +#define PCNT_THR_L_LIM_EN_U7_S 13 +/* PCNT_THR_H_LIM_EN_U7 : R/W ;bitpos:[12] ;default: 1'b1 ; */ +/*description: This is the enable bit for comparing unit7's count with thr_h_lim value.*/ +#define PCNT_THR_H_LIM_EN_U7 (BIT(12)) +#define PCNT_THR_H_LIM_EN_U7_M (BIT(12)) +#define PCNT_THR_H_LIM_EN_U7_V 0x1 +#define PCNT_THR_H_LIM_EN_U7_S 12 +/* PCNT_THR_ZERO_EN_U7 : R/W ;bitpos:[11] ;default: 1'b1 ; */ +/*description: This is the enable bit for comparing unit7's count with 0 value.*/ +#define PCNT_THR_ZERO_EN_U7 (BIT(11)) +#define PCNT_THR_ZERO_EN_U7_M (BIT(11)) +#define PCNT_THR_ZERO_EN_U7_V 0x1 +#define PCNT_THR_ZERO_EN_U7_S 11 +/* PCNT_FILTER_EN_U7 : R/W ;bitpos:[10] ;default: 1'b1 ; */ +/*description: This is the enable bit for filtering input signals for unit7.*/ +#define PCNT_FILTER_EN_U7 (BIT(10)) +#define PCNT_FILTER_EN_U7_M (BIT(10)) +#define PCNT_FILTER_EN_U7_V 0x1 +#define PCNT_FILTER_EN_U7_S 10 +/* PCNT_FILTER_THRES_U7 : R/W ;bitpos:[9:0] ;default: 10'h10 ; */ +/*description: This register is used to filter pluse whose width is smaller + than this value for unit7.*/ +#define PCNT_FILTER_THRES_U7 0x000003FF +#define PCNT_FILTER_THRES_U7_M ((PCNT_FILTER_THRES_U7_V)<<(PCNT_FILTER_THRES_U7_S)) +#define PCNT_FILTER_THRES_U7_V 0x3FF +#define PCNT_FILTER_THRES_U7_S 0 + +#define PCNT_U7_CONF1_REG (DR_REG_PCNT_BASE + 0x0058) +/* PCNT_CNT_THRES1_U7 : R/W ;bitpos:[31:16] ;default: 10'h0 ; */ +/*description: This register is used to configure thres1 value for unit7.*/ +#define PCNT_CNT_THRES1_U7 0x0000FFFF +#define PCNT_CNT_THRES1_U7_M ((PCNT_CNT_THRES1_U7_V)<<(PCNT_CNT_THRES1_U7_S)) +#define PCNT_CNT_THRES1_U7_V 0xFFFF +#define PCNT_CNT_THRES1_U7_S 16 +/* PCNT_CNT_THRES0_U7 : R/W ;bitpos:[15:0] ;default: 10'h0 ; */ +/*description: This register is used to configure thres0 value for unit7.*/ +#define PCNT_CNT_THRES0_U7 0x0000FFFF +#define PCNT_CNT_THRES0_U7_M ((PCNT_CNT_THRES0_U7_V)<<(PCNT_CNT_THRES0_U7_S)) +#define PCNT_CNT_THRES0_U7_V 0xFFFF +#define PCNT_CNT_THRES0_U7_S 0 + +#define PCNT_U7_CONF2_REG (DR_REG_PCNT_BASE + 0x005c) +/* PCNT_CNT_L_LIM_U7 : R/W ;bitpos:[31:16] ;default: 10'h0 ; */ +/*description: This register is used to confiugre thr_l_lim value for unit7.*/ +#define PCNT_CNT_L_LIM_U7 0x0000FFFF +#define PCNT_CNT_L_LIM_U7_M ((PCNT_CNT_L_LIM_U7_V)<<(PCNT_CNT_L_LIM_U7_S)) +#define PCNT_CNT_L_LIM_U7_V 0xFFFF +#define PCNT_CNT_L_LIM_U7_S 16 +/* PCNT_CNT_H_LIM_U7 : R/W ;bitpos:[15:0] ;default: 10'h0 ; */ +/*description: This register is used to configure thr_h_lim value for unit7.*/ +#define PCNT_CNT_H_LIM_U7 0x0000FFFF +#define PCNT_CNT_H_LIM_U7_M ((PCNT_CNT_H_LIM_U7_V)<<(PCNT_CNT_H_LIM_U7_S)) +#define PCNT_CNT_H_LIM_U7_V 0xFFFF +#define PCNT_CNT_H_LIM_U7_S 0 + +#define PCNT_U0_CNT_REG (DR_REG_PCNT_BASE + 0x0060) +/* PCNT_PLUS_CNT_U0 : RO ;bitpos:[15:0] ;default: 16'h0 ; */ +/*description: This register stores the current pulse count value for unit0.*/ +#define PCNT_PLUS_CNT_U0 0x0000FFFF +#define PCNT_PLUS_CNT_U0_M ((PCNT_PLUS_CNT_U0_V)<<(PCNT_PLUS_CNT_U0_S)) +#define PCNT_PLUS_CNT_U0_V 0xFFFF +#define PCNT_PLUS_CNT_U0_S 0 + +#define PCNT_U1_CNT_REG (DR_REG_PCNT_BASE + 0x0064) +/* PCNT_PLUS_CNT_U1 : RO ;bitpos:[15:0] ;default: 16'h0 ; */ +/*description: This register stores the current pulse count value for unit1.*/ +#define PCNT_PLUS_CNT_U1 0x0000FFFF +#define PCNT_PLUS_CNT_U1_M ((PCNT_PLUS_CNT_U1_V)<<(PCNT_PLUS_CNT_U1_S)) +#define PCNT_PLUS_CNT_U1_V 0xFFFF +#define PCNT_PLUS_CNT_U1_S 0 + +#define PCNT_U2_CNT_REG (DR_REG_PCNT_BASE + 0x0068) +/* PCNT_PLUS_CNT_U2 : RO ;bitpos:[15:0] ;default: 16'h0 ; */ +/*description: This register stores the current pulse count value for unit2.*/ +#define PCNT_PLUS_CNT_U2 0x0000FFFF +#define PCNT_PLUS_CNT_U2_M ((PCNT_PLUS_CNT_U2_V)<<(PCNT_PLUS_CNT_U2_S)) +#define PCNT_PLUS_CNT_U2_V 0xFFFF +#define PCNT_PLUS_CNT_U2_S 0 + +#define PCNT_U3_CNT_REG (DR_REG_PCNT_BASE + 0x006c) +/* PCNT_PLUS_CNT_U3 : RO ;bitpos:[15:0] ;default: 16'h0 ; */ +/*description: This register stores the current pulse count value for unit3.*/ +#define PCNT_PLUS_CNT_U3 0x0000FFFF +#define PCNT_PLUS_CNT_U3_M ((PCNT_PLUS_CNT_U3_V)<<(PCNT_PLUS_CNT_U3_S)) +#define PCNT_PLUS_CNT_U3_V 0xFFFF +#define PCNT_PLUS_CNT_U3_S 0 + +#define PCNT_U4_CNT_REG (DR_REG_PCNT_BASE + 0x0070) +/* PCNT_PLUS_CNT_U4 : RO ;bitpos:[15:0] ;default: 16'h0 ; */ +/*description: This register stores the current pulse count value for unit4.*/ +#define PCNT_PLUS_CNT_U4 0x0000FFFF +#define PCNT_PLUS_CNT_U4_M ((PCNT_PLUS_CNT_U4_V)<<(PCNT_PLUS_CNT_U4_S)) +#define PCNT_PLUS_CNT_U4_V 0xFFFF +#define PCNT_PLUS_CNT_U4_S 0 + +#define PCNT_U5_CNT_REG (DR_REG_PCNT_BASE + 0x0074) +/* PCNT_PLUS_CNT_U5 : RO ;bitpos:[15:0] ;default: 16'h0 ; */ +/*description: This register stores the current pulse count value for unit5.*/ +#define PCNT_PLUS_CNT_U5 0x0000FFFF +#define PCNT_PLUS_CNT_U5_M ((PCNT_PLUS_CNT_U5_V)<<(PCNT_PLUS_CNT_U5_S)) +#define PCNT_PLUS_CNT_U5_V 0xFFFF +#define PCNT_PLUS_CNT_U5_S 0 + +#define PCNT_U6_CNT_REG (DR_REG_PCNT_BASE + 0x0078) +/* PCNT_PLUS_CNT_U6 : RO ;bitpos:[15:0] ;default: 16'h0 ; */ +/*description: This register stores the current pulse count value for unit6.*/ +#define PCNT_PLUS_CNT_U6 0x0000FFFF +#define PCNT_PLUS_CNT_U6_M ((PCNT_PLUS_CNT_U6_V)<<(PCNT_PLUS_CNT_U6_S)) +#define PCNT_PLUS_CNT_U6_V 0xFFFF +#define PCNT_PLUS_CNT_U6_S 0 + +#define PCNT_U7_CNT_REG (DR_REG_PCNT_BASE + 0x007c) +/* PCNT_PLUS_CNT_U7 : RO ;bitpos:[15:0] ;default: 16'h0 ; */ +/*description: This register stores the current pulse count value for unit7.*/ +#define PCNT_PLUS_CNT_U7 0x0000FFFF +#define PCNT_PLUS_CNT_U7_M ((PCNT_PLUS_CNT_U7_V)<<(PCNT_PLUS_CNT_U7_S)) +#define PCNT_PLUS_CNT_U7_V 0xFFFF +#define PCNT_PLUS_CNT_U7_S 0 + +#define PCNT_INT_RAW_REG (DR_REG_PCNT_BASE + 0x0080) +/* PCNT_CNT_THR_EVENT_U7_INT_RAW : RO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: This is the interrupt raw bit for channel7 event.*/ +#define PCNT_CNT_THR_EVENT_U7_INT_RAW (BIT(7)) +#define PCNT_CNT_THR_EVENT_U7_INT_RAW_M (BIT(7)) +#define PCNT_CNT_THR_EVENT_U7_INT_RAW_V 0x1 +#define PCNT_CNT_THR_EVENT_U7_INT_RAW_S 7 +/* PCNT_CNT_THR_EVENT_U6_INT_RAW : RO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: This is the interrupt raw bit for channel6 event.*/ +#define PCNT_CNT_THR_EVENT_U6_INT_RAW (BIT(6)) +#define PCNT_CNT_THR_EVENT_U6_INT_RAW_M (BIT(6)) +#define PCNT_CNT_THR_EVENT_U6_INT_RAW_V 0x1 +#define PCNT_CNT_THR_EVENT_U6_INT_RAW_S 6 +/* PCNT_CNT_THR_EVENT_U5_INT_RAW : RO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: This is the interrupt raw bit for channel5 event.*/ +#define PCNT_CNT_THR_EVENT_U5_INT_RAW (BIT(5)) +#define PCNT_CNT_THR_EVENT_U5_INT_RAW_M (BIT(5)) +#define PCNT_CNT_THR_EVENT_U5_INT_RAW_V 0x1 +#define PCNT_CNT_THR_EVENT_U5_INT_RAW_S 5 +/* PCNT_CNT_THR_EVENT_U4_INT_RAW : RO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: This is the interrupt raw bit for channel4 event.*/ +#define PCNT_CNT_THR_EVENT_U4_INT_RAW (BIT(4)) +#define PCNT_CNT_THR_EVENT_U4_INT_RAW_M (BIT(4)) +#define PCNT_CNT_THR_EVENT_U4_INT_RAW_V 0x1 +#define PCNT_CNT_THR_EVENT_U4_INT_RAW_S 4 +/* PCNT_CNT_THR_EVENT_U3_INT_RAW : RO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: This is the interrupt raw bit for channel3 event.*/ +#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: This is the interrupt raw bit for channel2 event.*/ +#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: This is the interrupt raw bit for channel1 event.*/ +#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: This is the interrupt raw bit for channel0 event.*/ +#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_S 0 + +#define PCNT_INT_ST_REG (DR_REG_PCNT_BASE + 0x0084) +/* PCNT_CNT_THR_EVENT_U7_INT_ST : RO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: This is the interrupt status bit for channel7 event.*/ +#define PCNT_CNT_THR_EVENT_U7_INT_ST (BIT(7)) +#define PCNT_CNT_THR_EVENT_U7_INT_ST_M (BIT(7)) +#define PCNT_CNT_THR_EVENT_U7_INT_ST_V 0x1 +#define PCNT_CNT_THR_EVENT_U7_INT_ST_S 7 +/* PCNT_CNT_THR_EVENT_U6_INT_ST : RO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: This is the interrupt status bit for channel6 event.*/ +#define PCNT_CNT_THR_EVENT_U6_INT_ST (BIT(6)) +#define PCNT_CNT_THR_EVENT_U6_INT_ST_M (BIT(6)) +#define PCNT_CNT_THR_EVENT_U6_INT_ST_V 0x1 +#define PCNT_CNT_THR_EVENT_U6_INT_ST_S 6 +/* PCNT_CNT_THR_EVENT_U5_INT_ST : RO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: This is the interrupt status bit for channel5 event.*/ +#define PCNT_CNT_THR_EVENT_U5_INT_ST (BIT(5)) +#define PCNT_CNT_THR_EVENT_U5_INT_ST_M (BIT(5)) +#define PCNT_CNT_THR_EVENT_U5_INT_ST_V 0x1 +#define PCNT_CNT_THR_EVENT_U5_INT_ST_S 5 +/* PCNT_CNT_THR_EVENT_U4_INT_ST : RO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: This is the interrupt status bit for channel4 event.*/ +#define PCNT_CNT_THR_EVENT_U4_INT_ST (BIT(4)) +#define PCNT_CNT_THR_EVENT_U4_INT_ST_M (BIT(4)) +#define PCNT_CNT_THR_EVENT_U4_INT_ST_V 0x1 +#define PCNT_CNT_THR_EVENT_U4_INT_ST_S 4 +/* PCNT_CNT_THR_EVENT_U3_INT_ST : RO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: This is the interrupt status bit for channel3 event.*/ +#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: This is the interrupt status bit for channel2 event.*/ +#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: This is the interrupt status bit for channel1 event.*/ +#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: This is the interrupt status bit for channel0 event.*/ +#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_S 0 + +#define PCNT_INT_ENA_REG (DR_REG_PCNT_BASE + 0x0088) +/* PCNT_CNT_THR_EVENT_U7_INT_ENA : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: This is the interrupt enable bit for channel7 event.*/ +#define PCNT_CNT_THR_EVENT_U7_INT_ENA (BIT(7)) +#define PCNT_CNT_THR_EVENT_U7_INT_ENA_M (BIT(7)) +#define PCNT_CNT_THR_EVENT_U7_INT_ENA_V 0x1 +#define PCNT_CNT_THR_EVENT_U7_INT_ENA_S 7 +/* PCNT_CNT_THR_EVENT_U6_INT_ENA : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: This is the interrupt enable bit for channel6 event.*/ +#define PCNT_CNT_THR_EVENT_U6_INT_ENA (BIT(6)) +#define PCNT_CNT_THR_EVENT_U6_INT_ENA_M (BIT(6)) +#define PCNT_CNT_THR_EVENT_U6_INT_ENA_V 0x1 +#define PCNT_CNT_THR_EVENT_U6_INT_ENA_S 6 +/* PCNT_CNT_THR_EVENT_U5_INT_ENA : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: This is the interrupt enable bit for channel5 event.*/ +#define PCNT_CNT_THR_EVENT_U5_INT_ENA (BIT(5)) +#define PCNT_CNT_THR_EVENT_U5_INT_ENA_M (BIT(5)) +#define PCNT_CNT_THR_EVENT_U5_INT_ENA_V 0x1 +#define PCNT_CNT_THR_EVENT_U5_INT_ENA_S 5 +/* PCNT_CNT_THR_EVENT_U4_INT_ENA : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: This is the interrupt enable bit for channel4 event.*/ +#define PCNT_CNT_THR_EVENT_U4_INT_ENA (BIT(4)) +#define PCNT_CNT_THR_EVENT_U4_INT_ENA_M (BIT(4)) +#define PCNT_CNT_THR_EVENT_U4_INT_ENA_V 0x1 +#define PCNT_CNT_THR_EVENT_U4_INT_ENA_S 4 +/* PCNT_CNT_THR_EVENT_U3_INT_ENA : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: This is the interrupt enable bit for channel3 event.*/ +#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: This is the interrupt enable bit for channel2 event.*/ +#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: This is the interrupt enable bit for channel1 event.*/ +#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: This is the interrupt enable bit for channel0 event.*/ +#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_S 0 + +#define PCNT_INT_CLR_REG (DR_REG_PCNT_BASE + 0x008c) +/* PCNT_CNT_THR_EVENT_U7_INT_CLR : WO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: Set this bit to clear channel7 event interrupt.*/ +#define PCNT_CNT_THR_EVENT_U7_INT_CLR (BIT(7)) +#define PCNT_CNT_THR_EVENT_U7_INT_CLR_M (BIT(7)) +#define PCNT_CNT_THR_EVENT_U7_INT_CLR_V 0x1 +#define PCNT_CNT_THR_EVENT_U7_INT_CLR_S 7 +/* PCNT_CNT_THR_EVENT_U6_INT_CLR : WO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: Set this bit to clear channel6 event interrupt.*/ +#define PCNT_CNT_THR_EVENT_U6_INT_CLR (BIT(6)) +#define PCNT_CNT_THR_EVENT_U6_INT_CLR_M (BIT(6)) +#define PCNT_CNT_THR_EVENT_U6_INT_CLR_V 0x1 +#define PCNT_CNT_THR_EVENT_U6_INT_CLR_S 6 +/* PCNT_CNT_THR_EVENT_U5_INT_CLR : WO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: Set this bit to clear channel5 event interrupt.*/ +#define PCNT_CNT_THR_EVENT_U5_INT_CLR (BIT(5)) +#define PCNT_CNT_THR_EVENT_U5_INT_CLR_M (BIT(5)) +#define PCNT_CNT_THR_EVENT_U5_INT_CLR_V 0x1 +#define PCNT_CNT_THR_EVENT_U5_INT_CLR_S 5 +/* PCNT_CNT_THR_EVENT_U4_INT_CLR : WO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: Set this bit to clear channel4 event interrupt.*/ +#define PCNT_CNT_THR_EVENT_U4_INT_CLR (BIT(4)) +#define PCNT_CNT_THR_EVENT_U4_INT_CLR_M (BIT(4)) +#define PCNT_CNT_THR_EVENT_U4_INT_CLR_V 0x1 +#define PCNT_CNT_THR_EVENT_U4_INT_CLR_S 4 +/* PCNT_CNT_THR_EVENT_U3_INT_CLR : WO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: Set this bit to clear channel3 event interrupt.*/ +#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: Set this bit to clear channel2 event interrupt.*/ +#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: Set this bit to clear channel1 event interrupt.*/ +#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: Set this bit to clear channel0 event 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_S 0 + +#define PCNT_U0_STATUS_REG (DR_REG_PCNT_BASE + 0x0090) +/* PCNT_CORE_STATUS_U0 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define PCNT_CORE_STATUS_U0 0xFFFFFFFF +#define PCNT_CORE_STATUS_U0_M ((PCNT_CORE_STATUS_U0_V)<<(PCNT_CORE_STATUS_U0_S)) +#define PCNT_CORE_STATUS_U0_V 0xFFFFFFFF +#define PCNT_CORE_STATUS_U0_S 0 +/*0: positive value to zero; 1: negative value to zero; 2: counter value negative ; 3: counter value positive*/ +#define PCNT_STATUS_CNT_MODE 0x3 +#define PCNT_STATUS_CNT_MODE_M ((PCNT_STATUS_CNT_MODE_V)<<(PCNT_STATUS_CNT_MODE_S)) +#define PCNT_STATUS_CNT_MODE_V 0x3 +#define PCNT_STATUS_CNT_MODE_S 0 +/* counter value equals to thresh1*/ +#define PCNT_STATUS_THRES1 BIT(2) +#define PCNT_STATUS_THRES1_M BIT(2) +#define PCNT_STATUS_THRES1_V 0x1 +#define PCNT_STATUS_THRES1_S 2 +/* counter value equals to thresh0*/ +#define PCNT_STATUS_THRES0 BIT(3) +#define PCNT_STATUS_THRES0_M BIT(3) +#define PCNT_STATUS_THRES0_V 0x1 +#define PCNT_STATUS_THRES0_S 3 +/* counter value reaches h_lim*/ +#define PCNT_STATUS_L_LIM BIT(4) +#define PCNT_STATUS_L_LIM_M BIT(4) +#define PCNT_STATUS_L_LIM_V 0x1 +#define PCNT_STATUS_L_LIM_S 4 +/* counter value reaches l_lim*/ +#define PCNT_STATUS_H_LIM BIT(5) +#define PCNT_STATUS_H_LIM_M BIT(5) +#define PCNT_STATUS_H_LIM_V 0x1 +#define PCNT_STATUS_H_LIM_S 5 +/* counter value equals to zero*/ +#define PCNT_STATUS_ZERO BIT(6) +#define PCNT_STATUS_ZERO_M BIT(6) +#define PCNT_STATUS_ZERO_V 0x1 +#define PCNT_STATUS_ZERO_S 6 + +#define PCNT_U1_STATUS_REG (DR_REG_PCNT_BASE + 0x0094) +/* PCNT_CORE_STATUS_U1 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define PCNT_CORE_STATUS_U1 0xFFFFFFFF +#define PCNT_CORE_STATUS_U1_M ((PCNT_CORE_STATUS_U1_V)<<(PCNT_CORE_STATUS_U1_S)) +#define PCNT_CORE_STATUS_U1_V 0xFFFFFFFF +#define PCNT_CORE_STATUS_U1_S 0 + +#define PCNT_U2_STATUS_REG (DR_REG_PCNT_BASE + 0x0098) +/* PCNT_CORE_STATUS_U2 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define PCNT_CORE_STATUS_U2 0xFFFFFFFF +#define PCNT_CORE_STATUS_U2_M ((PCNT_CORE_STATUS_U2_V)<<(PCNT_CORE_STATUS_U2_S)) +#define PCNT_CORE_STATUS_U2_V 0xFFFFFFFF +#define PCNT_CORE_STATUS_U2_S 0 + +#define PCNT_U3_STATUS_REG (DR_REG_PCNT_BASE + 0x009c) +/* PCNT_CORE_STATUS_U3 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define PCNT_CORE_STATUS_U3 0xFFFFFFFF +#define PCNT_CORE_STATUS_U3_M ((PCNT_CORE_STATUS_U3_V)<<(PCNT_CORE_STATUS_U3_S)) +#define PCNT_CORE_STATUS_U3_V 0xFFFFFFFF +#define PCNT_CORE_STATUS_U3_S 0 + +#define PCNT_U4_STATUS_REG (DR_REG_PCNT_BASE + 0x00a0) +/* PCNT_CORE_STATUS_U4 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define PCNT_CORE_STATUS_U4 0xFFFFFFFF +#define PCNT_CORE_STATUS_U4_M ((PCNT_CORE_STATUS_U4_V)<<(PCNT_CORE_STATUS_U4_S)) +#define PCNT_CORE_STATUS_U4_V 0xFFFFFFFF +#define PCNT_CORE_STATUS_U4_S 0 + +#define PCNT_U5_STATUS_REG (DR_REG_PCNT_BASE + 0x00a4) +/* PCNT_CORE_STATUS_U5 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define PCNT_CORE_STATUS_U5 0xFFFFFFFF +#define PCNT_CORE_STATUS_U5_M ((PCNT_CORE_STATUS_U5_V)<<(PCNT_CORE_STATUS_U5_S)) +#define PCNT_CORE_STATUS_U5_V 0xFFFFFFFF +#define PCNT_CORE_STATUS_U5_S 0 + +#define PCNT_U6_STATUS_REG (DR_REG_PCNT_BASE + 0x00a8) +/* PCNT_CORE_STATUS_U6 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define PCNT_CORE_STATUS_U6 0xFFFFFFFF +#define PCNT_CORE_STATUS_U6_M ((PCNT_CORE_STATUS_U6_V)<<(PCNT_CORE_STATUS_U6_S)) +#define PCNT_CORE_STATUS_U6_V 0xFFFFFFFF +#define PCNT_CORE_STATUS_U6_S 0 + +#define PCNT_U7_STATUS_REG (DR_REG_PCNT_BASE + 0x00ac) +/* PCNT_CORE_STATUS_U7 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define PCNT_CORE_STATUS_U7 0xFFFFFFFF +#define PCNT_CORE_STATUS_U7_M ((PCNT_CORE_STATUS_U7_V)<<(PCNT_CORE_STATUS_U7_S)) +#define PCNT_CORE_STATUS_U7_V 0xFFFFFFFF +#define PCNT_CORE_STATUS_U7_S 0 + +#define PCNT_CTRL_REG (DR_REG_PCNT_BASE + 0x00b0) +/* 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_U7 : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: Set this bit to pause unit7's counter.*/ +#define PCNT_CNT_PAUSE_U7 (BIT(15)) +#define PCNT_CNT_PAUSE_U7_M (BIT(15)) +#define PCNT_CNT_PAUSE_U7_V 0x1 +#define PCNT_CNT_PAUSE_U7_S 15 +/* PCNT_PLUS_CNT_RST_U7 : R/W ;bitpos:[14] ;default: 1'b1 ; */ +/*description: Set this bit to clear unit7's counter.*/ +#define PCNT_PLUS_CNT_RST_U7 (BIT(14)) +#define PCNT_PLUS_CNT_RST_U7_M (BIT(14)) +#define PCNT_PLUS_CNT_RST_U7_V 0x1 +#define PCNT_PLUS_CNT_RST_U7_S 14 +/* PCNT_CNT_PAUSE_U6 : R/W ;bitpos:[13] ;default: 1'b0 ; */ +/*description: Set this bit to pause unit6's counter.*/ +#define PCNT_CNT_PAUSE_U6 (BIT(13)) +#define PCNT_CNT_PAUSE_U6_M (BIT(13)) +#define PCNT_CNT_PAUSE_U6_V 0x1 +#define PCNT_CNT_PAUSE_U6_S 13 +/* PCNT_PLUS_CNT_RST_U6 : R/W ;bitpos:[12] ;default: 1'b1 ; */ +/*description: Set this bit to clear unit6's counter.*/ +#define PCNT_PLUS_CNT_RST_U6 (BIT(12)) +#define PCNT_PLUS_CNT_RST_U6_M (BIT(12)) +#define PCNT_PLUS_CNT_RST_U6_V 0x1 +#define PCNT_PLUS_CNT_RST_U6_S 12 +/* PCNT_CNT_PAUSE_U5 : R/W ;bitpos:[11] ;default: 1'b0 ; */ +/*description: Set this bit to pause unit5's counter.*/ +#define PCNT_CNT_PAUSE_U5 (BIT(11)) +#define PCNT_CNT_PAUSE_U5_M (BIT(11)) +#define PCNT_CNT_PAUSE_U5_V 0x1 +#define PCNT_CNT_PAUSE_U5_S 11 +/* PCNT_PLUS_CNT_RST_U5 : R/W ;bitpos:[10] ;default: 1'b1 ; */ +/*description: Set this bit to clear unit5's counter.*/ +#define PCNT_PLUS_CNT_RST_U5 (BIT(10)) +#define PCNT_PLUS_CNT_RST_U5_M (BIT(10)) +#define PCNT_PLUS_CNT_RST_U5_V 0x1 +#define PCNT_PLUS_CNT_RST_U5_S 10 +/* PCNT_CNT_PAUSE_U4 : R/W ;bitpos:[9] ;default: 1'b0 ; */ +/*description: Set this bit to pause unit4's counter.*/ +#define PCNT_CNT_PAUSE_U4 (BIT(9)) +#define PCNT_CNT_PAUSE_U4_M (BIT(9)) +#define PCNT_CNT_PAUSE_U4_V 0x1 +#define PCNT_CNT_PAUSE_U4_S 9 +/* PCNT_PLUS_CNT_RST_U4 : R/W ;bitpos:[8] ;default: 1'b1 ; */ +/*description: Set this bit to clear unit4's counter.*/ +#define PCNT_PLUS_CNT_RST_U4 (BIT(8)) +#define PCNT_PLUS_CNT_RST_U4_M (BIT(8)) +#define PCNT_PLUS_CNT_RST_U4_V 0x1 +#define PCNT_PLUS_CNT_RST_U4_S 8 +/* PCNT_CNT_PAUSE_U3 : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: Set this bit to pause unit3's counter.*/ +#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_PLUS_CNT_RST_U3 : R/W ;bitpos:[6] ;default: 1'b1 ; */ +/*description: Set this bit to clear unit3's counter.*/ +#define PCNT_PLUS_CNT_RST_U3 (BIT(6)) +#define PCNT_PLUS_CNT_RST_U3_M (BIT(6)) +#define PCNT_PLUS_CNT_RST_U3_V 0x1 +#define PCNT_PLUS_CNT_RST_U3_S 6 +/* PCNT_CNT_PAUSE_U2 : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: Set this bit to pause unit2's counter.*/ +#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_PLUS_CNT_RST_U2 : R/W ;bitpos:[4] ;default: 1'b1 ; */ +/*description: Set this bit to clear unit2's counter.*/ +#define PCNT_PLUS_CNT_RST_U2 (BIT(4)) +#define PCNT_PLUS_CNT_RST_U2_M (BIT(4)) +#define PCNT_PLUS_CNT_RST_U2_V 0x1 +#define PCNT_PLUS_CNT_RST_U2_S 4 +/* PCNT_CNT_PAUSE_U1 : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: Set this bit to pause unit1's counter.*/ +#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_PLUS_CNT_RST_U1 : R/W ;bitpos:[2] ;default: 1'b1 ; */ +/*description: Set this bit to clear unit1's counter.*/ +#define PCNT_PLUS_CNT_RST_U1 (BIT(2)) +#define PCNT_PLUS_CNT_RST_U1_M (BIT(2)) +#define PCNT_PLUS_CNT_RST_U1_V 0x1 +#define PCNT_PLUS_CNT_RST_U1_S 2 +/* PCNT_CNT_PAUSE_U0 : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: Set this bit to pause unit0's counter.*/ +#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_PLUS_CNT_RST_U0 : R/W ;bitpos:[0] ;default: 1'b1 ; */ +/*description: Set this bit to clear unit0's counter.*/ +#define PCNT_PLUS_CNT_RST_U0 (BIT(0)) +#define PCNT_PLUS_CNT_RST_U0_M (BIT(0)) +#define PCNT_PLUS_CNT_RST_U0_V 0x1 +#define PCNT_PLUS_CNT_RST_U0_S 0 + +#define PCNT_DATE_REG (DR_REG_PCNT_BASE + 0x00fc) +/* PCNT_DATE : R/W ;bitpos:[31:0] ;default: 32'h14122600 ; */ +/*description: */ +#define PCNT_DATE 0xFFFFFFFF +#define PCNT_DATE_M ((PCNT_DATE_V)<<(PCNT_DATE_S)) +#define PCNT_DATE_V 0xFFFFFFFF +#define PCNT_DATE_S 0 + + + + +#endif /*_SOC_PCNT_REG_H_ */ + + diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/pcnt_struct.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/pcnt_struct.h new file mode 100644 index 0000000000000..caeb02ac23eb0 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/pcnt_struct.h @@ -0,0 +1,184 @@ +// 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. +#ifndef _SOC_PCNT_STRUCT_H_ +#define _SOC_PCNT_STRUCT_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef volatile struct pcnt_dev_s { + struct{ + union { + struct { + uint32_t filter_thres: 10; /*This register is used to filter pulse whose width is smaller than this value for unit0.*/ + uint32_t filter_en: 1; /*This is the enable bit for filtering input signals for unit0.*/ + uint32_t thr_zero_en: 1; /*This is the enable bit for comparing unit0's count with 0 value.*/ + uint32_t thr_h_lim_en: 1; /*This is the enable bit for comparing unit0's count with thr_h_lim value.*/ + uint32_t thr_l_lim_en: 1; /*This is the enable bit for comparing unit0's count with thr_l_lim value.*/ + uint32_t thr_thres0_en: 1; /*This is the enable bit for comparing unit0's count with thres0 value.*/ + uint32_t thr_thres1_en: 1; /*This is the enable bit for comparing unit0's count with thres1 value .*/ + uint32_t ch0_neg_mode: 2; /*This register is used to control the mode of channel0's input neg-edge signal for unit0. 2'd1:increase at the negedge of input signal 2'd2:decrease at the negedge of input signal others:forbidden*/ + uint32_t ch0_pos_mode: 2; /*This register is used to control the mode of channel0's input pos-edge signal for unit0. 2'd1:increase at the posedge of input signal 2'd2:decrease at the posedge of input signal others:forbidden*/ + uint32_t ch0_hctrl_mode: 2; /*This register is used to control the mode of channel0's high control signal for unit0. 2'd0:increase when control signal is low 2'd1:decrease when control signal is high others:forbidden*/ + uint32_t ch0_lctrl_mode: 2; /*This register is used to control the mode of channel0's low control signal for unit0. 2'd0:increase when control signal is low 2'd1:decrease when control signal is high others:forbidden*/ + uint32_t ch1_neg_mode: 2; /*This register is used to control the mode of channel1's input neg-edge signal for unit0. 2'd1:increase at the negedge of input signal 2'd2:decrease at the negedge of input signal others:forbidden*/ + uint32_t ch1_pos_mode: 2; /*This register is used to control the mode of channel1's input pos-edge signal for unit0. 2'd1:increase at the posedge of input signal 2'd2:decrease at the posedge of input signal others:forbidden*/ + uint32_t ch1_hctrl_mode: 2; /*This register is used to control the mode of channel1's high control signal for unit0. 2'd0:increase when control signal is low 2'd1:decrease when control signal is high others:forbidden*/ + uint32_t ch1_lctrl_mode: 2; /*This register is used to control the mode of channel1's low control signal for unit0. 2'd0:increase when control signal is low 2'd1:decrease when control signal is high others:forbidden*/ + }; + uint32_t val; + } conf0; + union { + struct { + uint32_t cnt_thres0:16; /*This register is used to configure thres0 value for unit0.*/ + uint32_t cnt_thres1:16; /*This register is used to configure thres1 value for unit0.*/ + }; + uint32_t val; + } conf1; + union { + struct { + uint32_t cnt_h_lim:16; /*This register is used to configure thr_h_lim value for unit0.*/ + uint32_t cnt_l_lim:16; /*This register is used to configure thr_l_lim value for unit0.*/ + }; + uint32_t val; + } conf2; + } conf_unit[8]; + union { + struct { + uint32_t cnt_val : 16; /*This register stores the current pulse count value for unit0.*/ + uint32_t reserved16: 16; + }; + uint32_t val; + } cnt_unit[8]; + union { + struct { + uint32_t cnt_thr_event_u0: 1; /*This is the interrupt raw bit for channel0 event.*/ + uint32_t cnt_thr_event_u1: 1; /*This is the interrupt raw bit for channel1 event.*/ + uint32_t cnt_thr_event_u2: 1; /*This is the interrupt raw bit for channel2 event.*/ + uint32_t cnt_thr_event_u3: 1; /*This is the interrupt raw bit for channel3 event.*/ + uint32_t cnt_thr_event_u4: 1; /*This is the interrupt raw bit for channel4 event.*/ + uint32_t cnt_thr_event_u5: 1; /*This is the interrupt raw bit for channel5 event.*/ + uint32_t cnt_thr_event_u6: 1; /*This is the interrupt raw bit for channel6 event.*/ + uint32_t cnt_thr_event_u7: 1; /*This is the interrupt raw bit for channel7 event.*/ + uint32_t reserved8: 24; + }; + uint32_t val; + } int_raw; + union { + struct { + uint32_t cnt_thr_event_u0: 1; /*This is the interrupt status bit for channel0 event.*/ + uint32_t cnt_thr_event_u1: 1; /*This is the interrupt status bit for channel1 event.*/ + uint32_t cnt_thr_event_u2: 1; /*This is the interrupt status bit for channel2 event.*/ + uint32_t cnt_thr_event_u3: 1; /*This is the interrupt status bit for channel3 event.*/ + uint32_t cnt_thr_event_u4: 1; /*This is the interrupt status bit for channel4 event.*/ + uint32_t cnt_thr_event_u5: 1; /*This is the interrupt status bit for channel5 event.*/ + uint32_t cnt_thr_event_u6: 1; /*This is the interrupt status bit for channel6 event.*/ + uint32_t cnt_thr_event_u7: 1; /*This is the interrupt status bit for channel7 event.*/ + uint32_t reserved8: 24; + }; + uint32_t val; + } int_st; + union { + struct { + uint32_t cnt_thr_event_u0: 1; /*This is the interrupt enable bit for channel0 event.*/ + uint32_t cnt_thr_event_u1: 1; /*This is the interrupt enable bit for channel1 event.*/ + uint32_t cnt_thr_event_u2: 1; /*This is the interrupt enable bit for channel2 event.*/ + uint32_t cnt_thr_event_u3: 1; /*This is the interrupt enable bit for channel3 event.*/ + uint32_t cnt_thr_event_u4: 1; /*This is the interrupt enable bit for channel4 event.*/ + uint32_t cnt_thr_event_u5: 1; /*This is the interrupt enable bit for channel5 event.*/ + uint32_t cnt_thr_event_u6: 1; /*This is the interrupt enable bit for channel6 event.*/ + uint32_t cnt_thr_event_u7: 1; /*This is the interrupt enable bit for channel7 event.*/ + uint32_t reserved8: 24; + }; + uint32_t val; + } int_ena; + union { + struct { + uint32_t cnt_thr_event_u0: 1; /*Set this bit to clear channel0 event interrupt.*/ + uint32_t cnt_thr_event_u1: 1; /*Set this bit to clear channel1 event interrupt.*/ + uint32_t cnt_thr_event_u2: 1; /*Set this bit to clear channel2 event interrupt.*/ + uint32_t cnt_thr_event_u3: 1; /*Set this bit to clear channel3 event interrupt.*/ + uint32_t cnt_thr_event_u4: 1; /*Set this bit to clear channel4 event interrupt.*/ + uint32_t cnt_thr_event_u5: 1; /*Set this bit to clear channel5 event interrupt.*/ + uint32_t cnt_thr_event_u6: 1; /*Set this bit to clear channel6 event interrupt.*/ + uint32_t cnt_thr_event_u7: 1; /*Set this bit to clear channel7 event interrupt.*/ + uint32_t reserved8: 24; + }; + uint32_t val; + } int_clr; + union { + struct { + uint32_t cnt_mode:2; /*0: positive value to zero; 1: negative value to zero; 2: counter value negative ; 3: counter value positive*/ + uint32_t thres1_lat:1; /* counter value equals to thresh1*/ + uint32_t thres0_lat:1; /* counter value equals to thresh0*/ + uint32_t l_lim_lat:1; /* counter value reaches h_lim*/ + uint32_t h_lim_lat:1; /* counter value reaches l_lim*/ + uint32_t zero_lat:1; /* counter value equals zero*/ + uint32_t reserved7:25; + }; + uint32_t val; + } status_unit[8]; + union { + struct { + uint32_t cnt_rst_u0: 1; /*Set this bit to clear unit0's counter.*/ + uint32_t cnt_pause_u0: 1; /*Set this bit to pause unit0's counter.*/ + uint32_t cnt_rst_u1: 1; /*Set this bit to clear unit1's counter.*/ + uint32_t cnt_pause_u1: 1; /*Set this bit to pause unit1's counter.*/ + uint32_t cnt_rst_u2: 1; /*Set this bit to clear unit2's counter.*/ + uint32_t cnt_pause_u2: 1; /*Set this bit to pause unit2's counter.*/ + uint32_t cnt_rst_u3: 1; /*Set this bit to clear unit3's counter.*/ + uint32_t cnt_pause_u3: 1; /*Set this bit to pause unit3's counter.*/ + uint32_t cnt_rst_u4: 1; /*Set this bit to clear unit4's counter.*/ + uint32_t cnt_pause_u4: 1; /*Set this bit to pause unit4's counter.*/ + uint32_t cnt_rst_u5: 1; /*Set this bit to clear unit5's counter.*/ + uint32_t cnt_pause_u5: 1; /*Set this bit to pause unit5's counter.*/ + uint32_t cnt_rst_u6: 1; /*Set this bit to clear unit6's counter.*/ + uint32_t cnt_pause_u6: 1; /*Set this bit to pause unit6's counter.*/ + uint32_t cnt_rst_u7: 1; /*Set this bit to clear unit7's counter.*/ + uint32_t cnt_pause_u7: 1; /*Set this bit to pause unit7's counter.*/ + uint32_t clk_en: 1; + uint32_t reserved17: 15; + }; + uint32_t val; + } ctrl; + 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; /**/ +} pcnt_dev_t; +extern pcnt_dev_t PCNT; + +#ifdef __cplusplus +} +#endif + +#endif /* _SOC_PCNT_STRUCT_H_ */ diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/periph_defs.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/periph_defs.h new file mode 100644 index 0000000000000..c4ad589c9ddf9 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/periph_defs.h @@ -0,0 +1,64 @@ +// 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. + +#ifndef _SOC_PERIPH_DEFS_H_ +#define _SOC_PERIPH_DEFS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + PERIPH_LEDC_MODULE = 0, + PERIPH_UART0_MODULE, + PERIPH_UART1_MODULE, + PERIPH_UART2_MODULE, + PERIPH_I2C0_MODULE, + PERIPH_I2C1_MODULE, + PERIPH_I2S0_MODULE, + PERIPH_I2S1_MODULE, + PERIPH_TIMG0_MODULE, + PERIPH_TIMG1_MODULE, + PERIPH_PWM0_MODULE, + PERIPH_PWM1_MODULE, + PERIPH_PWM2_MODULE, + PERIPH_PWM3_MODULE, + PERIPH_UHCI0_MODULE, + PERIPH_UHCI1_MODULE, + PERIPH_RMT_MODULE, + PERIPH_PCNT_MODULE, + PERIPH_SPI_MODULE, + PERIPH_HSPI_MODULE, + PERIPH_VSPI_MODULE, + PERIPH_SPI_DMA_MODULE, + PERIPH_SDMMC_MODULE, + PERIPH_SDIO_SLAVE_MODULE, + PERIPH_CAN_MODULE, + PERIPH_EMAC_MODULE, + PERIPH_RNG_MODULE, + PERIPH_WIFI_MODULE, + PERIPH_BT_MODULE, + PERIPH_WIFI_BT_COMMON_MODULE, + PERIPH_BT_BASEBAND_MODULE, + PERIPH_BT_LC_MODULE, + PERIPH_AES_MODULE, + PERIPH_SHA_MODULE, + PERIPH_RSA_MODULE, +} periph_module_t; + +#ifdef __cplusplus +} +#endif + +#endif /* _SOC_PERIPH_DEFS_H_ */ diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/pid.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/pid.h new file mode 100644 index 0000000000000..bd4e9f26d243e --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/pid.h @@ -0,0 +1,65 @@ +// 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. +#ifndef _SOC_PID_H_ +#define _SOC_PID_H_ + +#define PROPID_GEN_BASE 0x3FF1F000 +//Bits 1..7: 1 if interrupt will be triggering PID change +#define PROPID_CONFIG_INTERRUPT_ENABLE ((PROPID_GEN_BASE)+0x000) +//Vectors for the various interrupt handlers +#define PROPID_CONFIG_INTERRUPT_ADDR_1 ((PROPID_GEN_BASE)+0x004) +#define PROPID_CONFIG_INTERRUPT_ADDR_2 ((PROPID_GEN_BASE)+0x008) +#define PROPID_CONFIG_INTERRUPT_ADDR_3 ((PROPID_GEN_BASE)+0x00C) +#define PROPID_CONFIG_INTERRUPT_ADDR_4 ((PROPID_GEN_BASE)+0x010) +#define PROPID_CONFIG_INTERRUPT_ADDR_5 ((PROPID_GEN_BASE)+0x014) +#define PROPID_CONFIG_INTERRUPT_ADDR_6 ((PROPID_GEN_BASE)+0x018) +#define PROPID_CONFIG_INTERRUPT_ADDR_7 ((PROPID_GEN_BASE)+0x01C) + +//Delay, in CPU cycles, before switching to new PID +#define PROPID_CONFIG_PID_DELAY ((PROPID_GEN_BASE)+0x020) +#define PROPID_CONFIG_NMI_DELAY ((PROPID_GEN_BASE)+0x024) + +//Last detected interrupt. Set by hw on int. +#define PROPID_TABLE_LEVEL ((PROPID_GEN_BASE)+0x028) +//PID/prev int data for each int +#define PROPID_FROM_1 ((PROPID_GEN_BASE)+0x02C) +#define PROPID_FROM_2 ((PROPID_GEN_BASE)+0x030) +#define PROPID_FROM_3 ((PROPID_GEN_BASE)+0x034) +#define PROPID_FROM_4 ((PROPID_GEN_BASE)+0x038) +#define PROPID_FROM_5 ((PROPID_GEN_BASE)+0x03C) +#define PROPID_FROM_6 ((PROPID_GEN_BASE)+0x040) +#define PROPID_FROM_7 ((PROPID_GEN_BASE)+0x044) +#define PROPID_FROM_PID_MASK 0x7 +#define PROPID_FROM_PID_S 0 +#define PROPID_FROM_INT_MASK 0xF +#define PROPID_FROM_INT_S 3 + +//PID to be set after confirm routine +#define PROPID_PID_NEW ((PROPID_GEN_BASE)+0x048) +//Write to kick off PID change +#define PROPID_PID_CONFIRM ((PROPID_GEN_BASE)+0x04c) +//current PID? +#define PROPID_PID_REG ((PROPID_GEN_BASE)+0x050) + +//Write to mask NMI +#define PROPID_PID_NMI_MASK_HW_ENABLE ((PROPID_GEN_BASE)+0x054) +//Write to unmask NMI +#define PROPID_PID_NMI_MASK_HW_DISABLE ((PROPID_GEN_BASE)+0x058) +#define PROPID_PID_NMI_MASK_HW_REG ((PROPID_GEN_BASE)+0x05c) + +//Debug regs +#define PROPID_PID ((PROPID_GEN_BASE)+0x060) +#define PROPID_NMI_MASK_HW ((PROPID_GEN_BASE)+0x064) + +#endif /* _SOC_PID_H_ */ diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/rmt_caps.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/rmt_caps.h new file mode 100644 index 0000000000000..7b3eaf4adec54 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/rmt_caps.h @@ -0,0 +1,43 @@ +// 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 + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#define RMT_CHANNEL_MEM_WORDS (64) /*!< Each channel owns 64 words memory */ + +/** +* @brief RMT channel ID +* +*/ +typedef enum { + RMT_CHANNEL_0, /*!< RMT channel number 0 */ + RMT_CHANNEL_1, /*!< RMT channel number 1 */ + RMT_CHANNEL_2, /*!< RMT channel number 2 */ + RMT_CHANNEL_3, /*!< RMT channel number 3 */ + RMT_CHANNEL_4, /*!< RMT channel number 4 */ + RMT_CHANNEL_5, /*!< RMT channel number 5 */ + RMT_CHANNEL_6, /*!< RMT channel number 6 */ + RMT_CHANNEL_7, /*!< RMT channel number 7 */ + RMT_CHANNEL_MAX /*!< Number of RMT channels */ +} rmt_channel_id_t; + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/rmt_reg.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/rmt_reg.h new file mode 100644 index 0000000000000..15c2f9a2dc666 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/rmt_reg.h @@ -0,0 +1,2604 @@ +// 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. +#ifndef _SOC_RMT_REG_H_ +#define _SOC_RMT_REG_H_ + +#include "soc.h" +#define RMT_CH0DATA_REG (DR_REG_RMT_BASE + 0x0000) + +#define RMT_CH1DATA_REG (DR_REG_RMT_BASE + 0x0004) + +#define RMT_CH2DATA_REG (DR_REG_RMT_BASE + 0x0008) + +#define RMT_CH3DATA_REG (DR_REG_RMT_BASE + 0x000c) + +#define RMT_CH4DATA_REG (DR_REG_RMT_BASE + 0x0010) + +#define RMT_CH5DATA_REG (DR_REG_RMT_BASE + 0x0014) + +#define RMT_CH6DATA_REG (DR_REG_RMT_BASE + 0x0018) + +#define RMT_CH7DATA_REG (DR_REG_RMT_BASE + 0x001c) + +#define RMT_CH0CONF0_REG (DR_REG_RMT_BASE + 0x0020) +/* RMT_CLK_EN : R/W ;bitpos:[31] ;default: 1'h0 ; */ +/*description: This bit is used to control clock.when software config RMT + internal registers it controls the register clock.*/ +#define RMT_CLK_EN (BIT(31)) +#define RMT_CLK_EN_M (BIT(31)) +#define RMT_CLK_EN_V 0x1 +#define RMT_CLK_EN_S 31 +/* RMT_MEM_PD : R/W ;bitpos:[30] ;default: 1'b0 ; */ +/*description: This bit is used to reduce power consumed by mem. 1:mem is in low power state.*/ +#define RMT_MEM_PD (BIT(30)) +#define RMT_MEM_PD_M (BIT(30)) +#define RMT_MEM_PD_V 0x1 +#define RMT_MEM_PD_S 30 +/* RMT_CARRIER_OUT_LV_CH0 : R/W ;bitpos:[29] ;default: 1'b1 ; */ +/*description: This bit is used to configure the way carrier wave is modulated + for channel0.1'b1:transmit on low output level 1'b0:transmit on high output level.*/ +#define RMT_CARRIER_OUT_LV_CH0 (BIT(29)) +#define RMT_CARRIER_OUT_LV_CH0_M (BIT(29)) +#define RMT_CARRIER_OUT_LV_CH0_V 0x1 +#define RMT_CARRIER_OUT_LV_CH0_S 29 +/* RMT_CARRIER_EN_CH0 : R/W ;bitpos:[28] ;default: 1'b1 ; */ +/*description: This is the carrier modulation enable control bit for channel0.*/ +#define RMT_CARRIER_EN_CH0 (BIT(28)) +#define RMT_CARRIER_EN_CH0_M (BIT(28)) +#define RMT_CARRIER_EN_CH0_V 0x1 +#define RMT_CARRIER_EN_CH0_S 28 +/* RMT_MEM_SIZE_CH0 : R/W ;bitpos:[27:24] ;default: 4'h1 ; */ +/*description: This register is used to configure the the amount of memory blocks + allocated to channel0.*/ +#define RMT_MEM_SIZE_CH0 0x0000000F +#define RMT_MEM_SIZE_CH0_M ((RMT_MEM_SIZE_CH0_V)<<(RMT_MEM_SIZE_CH0_S)) +#define RMT_MEM_SIZE_CH0_V 0xF +#define RMT_MEM_SIZE_CH0_S 24 +/* RMT_IDLE_THRES_CH0 : R/W ;bitpos:[23:8] ;default: 16'h1000 ; */ +/*description: In receive mode when no edge is detected on the input signal + for longer than reg_idle_thres_ch0 then the receive process is done.*/ +#define RMT_IDLE_THRES_CH0 0x0000FFFF +#define RMT_IDLE_THRES_CH0_M ((RMT_IDLE_THRES_CH0_V)<<(RMT_IDLE_THRES_CH0_S)) +#define RMT_IDLE_THRES_CH0_V 0xFFFF +#define RMT_IDLE_THRES_CH0_S 8 +/* RMT_DIV_CNT_CH0 : R/W ;bitpos:[7:0] ;default: 8'h2 ; */ +/*description: This register is used to configure the frequency divider's factor in channel0.*/ +#define RMT_DIV_CNT_CH0 0x000000FF +#define RMT_DIV_CNT_CH0_M ((RMT_DIV_CNT_CH0_V)<<(RMT_DIV_CNT_CH0_S)) +#define RMT_DIV_CNT_CH0_V 0xFF +#define RMT_DIV_CNT_CH0_S 0 + +#define RMT_CH0CONF1_REG (DR_REG_RMT_BASE + 0x0024) +/* RMT_IDLE_OUT_EN_CH0 : R/W ;bitpos:[19] ;default: 1'b0 ; */ +/*description: This is the output enable control bit for channel0 in IDLE state.*/ +#define RMT_IDLE_OUT_EN_CH0 (BIT(19)) +#define RMT_IDLE_OUT_EN_CH0_M (BIT(19)) +#define RMT_IDLE_OUT_EN_CH0_V 0x1 +#define RMT_IDLE_OUT_EN_CH0_S 19 +/* RMT_IDLE_OUT_LV_CH0 : R/W ;bitpos:[18] ;default: 1'b0 ; */ +/*description: This bit configures the output signal's level for channel0 in IDLE state.*/ +#define RMT_IDLE_OUT_LV_CH0 (BIT(18)) +#define RMT_IDLE_OUT_LV_CH0_M (BIT(18)) +#define RMT_IDLE_OUT_LV_CH0_V 0x1 +#define RMT_IDLE_OUT_LV_CH0_S 18 +/* RMT_REF_ALWAYS_ON_CH0 : R/W ;bitpos:[17] ;default: 1'b0 ; */ +/*description: This bit is used to select base clock. 1'b1:clk_apb 1'b0:clk_ref*/ +#define RMT_REF_ALWAYS_ON_CH0 (BIT(17)) +#define RMT_REF_ALWAYS_ON_CH0_M (BIT(17)) +#define RMT_REF_ALWAYS_ON_CH0_V 0x1 +#define RMT_REF_ALWAYS_ON_CH0_S 17 +/* RMT_REF_CNT_RST_CH0 : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: This bit is used to reset divider in channel0.*/ +#define RMT_REF_CNT_RST_CH0 (BIT(16)) +#define RMT_REF_CNT_RST_CH0_M (BIT(16)) +#define RMT_REF_CNT_RST_CH0_V 0x1 +#define RMT_REF_CNT_RST_CH0_S 16 +/* RMT_RX_FILTER_THRES_CH0 : R/W ;bitpos:[15:8] ;default: 8'hf ; */ +/*description: in receive mode channel0 ignore input pulse when the pulse width + is smaller then this value.*/ +#define RMT_RX_FILTER_THRES_CH0 0x000000FF +#define RMT_RX_FILTER_THRES_CH0_M ((RMT_RX_FILTER_THRES_CH0_V)<<(RMT_RX_FILTER_THRES_CH0_S)) +#define RMT_RX_FILTER_THRES_CH0_V 0xFF +#define RMT_RX_FILTER_THRES_CH0_S 8 +/* RMT_RX_FILTER_EN_CH0 : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: This is the receive filter enable bit for channel0.*/ +#define RMT_RX_FILTER_EN_CH0 (BIT(7)) +#define RMT_RX_FILTER_EN_CH0_M (BIT(7)) +#define RMT_RX_FILTER_EN_CH0_V 0x1 +#define RMT_RX_FILTER_EN_CH0_S 7 +/* RMT_TX_CONTI_MODE_CH0 : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: Set this bit to continue sending from the first data to the + last data in channel0 again and again.*/ +#define RMT_TX_CONTI_MODE_CH0 (BIT(6)) +#define RMT_TX_CONTI_MODE_CH0_M (BIT(6)) +#define RMT_TX_CONTI_MODE_CH0_V 0x1 +#define RMT_TX_CONTI_MODE_CH0_S 6 +/* RMT_MEM_OWNER_CH0 : R/W ;bitpos:[5] ;default: 1'b1 ; */ +/*description: This is the mark of channel0's ram usage right.1'b1:receiver + uses the ram 0:transmitter uses the ram*/ +#define RMT_MEM_OWNER_CH0 (BIT(5)) +#define RMT_MEM_OWNER_CH0_M (BIT(5)) +#define RMT_MEM_OWNER_CH0_V 0x1 +#define RMT_MEM_OWNER_CH0_S 5 +/* RMT_APB_MEM_RST_CH0 : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: Set this bit to reset W/R ram address for channel0 by apb fifo access*/ +#define RMT_APB_MEM_RST_CH0 (BIT(4)) +#define RMT_APB_MEM_RST_CH0_M (BIT(4)) +#define RMT_APB_MEM_RST_CH0_V 0x1 +#define RMT_APB_MEM_RST_CH0_S 4 +/* RMT_MEM_RD_RST_CH0 : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: Set this bit to reset read ram address for channel0 by transmitter access.*/ +#define RMT_MEM_RD_RST_CH0 (BIT(3)) +#define RMT_MEM_RD_RST_CH0_M (BIT(3)) +#define RMT_MEM_RD_RST_CH0_V 0x1 +#define RMT_MEM_RD_RST_CH0_S 3 +/* RMT_MEM_WR_RST_CH0 : R/W ;bitpos:[2] ;default: 1'h0 ; */ +/*description: Set this bit to reset write ram address for channel0 by receiver access.*/ +#define RMT_MEM_WR_RST_CH0 (BIT(2)) +#define RMT_MEM_WR_RST_CH0_M (BIT(2)) +#define RMT_MEM_WR_RST_CH0_V 0x1 +#define RMT_MEM_WR_RST_CH0_S 2 +/* RMT_RX_EN_CH0 : R/W ;bitpos:[1] ;default: 1'h0 ; */ +/*description: Set this bit to enbale receving data for channel0.*/ +#define RMT_RX_EN_CH0 (BIT(1)) +#define RMT_RX_EN_CH0_M (BIT(1)) +#define RMT_RX_EN_CH0_V 0x1 +#define RMT_RX_EN_CH0_S 1 +/* RMT_TX_START_CH0 : R/W ;bitpos:[0] ;default: 1'h0 ; */ +/*description: Set this bit to start sending data for channel0.*/ +#define RMT_TX_START_CH0 (BIT(0)) +#define RMT_TX_START_CH0_M (BIT(0)) +#define RMT_TX_START_CH0_V 0x1 +#define RMT_TX_START_CH0_S 0 + +#define RMT_CH1CONF0_REG (DR_REG_RMT_BASE + 0x0028) +/* RMT_CARRIER_OUT_LV_CH1 : R/W ;bitpos:[29] ;default: 1'b1 ; */ +/*description: This bit is used to configure the way carrier wave is modulated + for channel1.1'b1:transmit on low output level 1'b0:transmit on high output level.*/ +#define RMT_CARRIER_OUT_LV_CH1 (BIT(29)) +#define RMT_CARRIER_OUT_LV_CH1_M (BIT(29)) +#define RMT_CARRIER_OUT_LV_CH1_V 0x1 +#define RMT_CARRIER_OUT_LV_CH1_S 29 +/* RMT_CARRIER_EN_CH1 : R/W ;bitpos:[28] ;default: 1'b1 ; */ +/*description: This is the carrier modulation enable control bit for channel1.*/ +#define RMT_CARRIER_EN_CH1 (BIT(28)) +#define RMT_CARRIER_EN_CH1_M (BIT(28)) +#define RMT_CARRIER_EN_CH1_V 0x1 +#define RMT_CARRIER_EN_CH1_S 28 +/* RMT_MEM_SIZE_CH1 : R/W ;bitpos:[27:24] ;default: 4'h1 ; */ +/*description: This register is used to configure the the amount of memory blocks + allocated to channel1.*/ +#define RMT_MEM_SIZE_CH1 0x0000000F +#define RMT_MEM_SIZE_CH1_M ((RMT_MEM_SIZE_CH1_V)<<(RMT_MEM_SIZE_CH1_S)) +#define RMT_MEM_SIZE_CH1_V 0xF +#define RMT_MEM_SIZE_CH1_S 24 +/* RMT_IDLE_THRES_CH1 : R/W ;bitpos:[23:8] ;default: 16'h1000 ; */ +/*description: This register is used to configure the the amount of memory blocks + allocated to channel1.*/ +#define RMT_IDLE_THRES_CH1 0x0000FFFF +#define RMT_IDLE_THRES_CH1_M ((RMT_IDLE_THRES_CH1_V)<<(RMT_IDLE_THRES_CH1_S)) +#define RMT_IDLE_THRES_CH1_V 0xFFFF +#define RMT_IDLE_THRES_CH1_S 8 +/* RMT_DIV_CNT_CH1 : R/W ;bitpos:[7:0] ;default: 8'h2 ; */ +/*description: This register is used to configure the frequency divider's factor in channel1.*/ +#define RMT_DIV_CNT_CH1 0x000000FF +#define RMT_DIV_CNT_CH1_M ((RMT_DIV_CNT_CH1_V)<<(RMT_DIV_CNT_CH1_S)) +#define RMT_DIV_CNT_CH1_V 0xFF +#define RMT_DIV_CNT_CH1_S 0 + +#define RMT_CH1CONF1_REG (DR_REG_RMT_BASE + 0x002c) +/* RMT_IDLE_OUT_EN_CH1 : R/W ;bitpos:[19] ;default: 1'b0 ; */ +/*description: This is the output enable control bit for channel1 in IDLE state.*/ +#define RMT_IDLE_OUT_EN_CH1 (BIT(19)) +#define RMT_IDLE_OUT_EN_CH1_M (BIT(19)) +#define RMT_IDLE_OUT_EN_CH1_V 0x1 +#define RMT_IDLE_OUT_EN_CH1_S 19 +/* RMT_IDLE_OUT_LV_CH1 : R/W ;bitpos:[18] ;default: 1'b0 ; */ +/*description: This bit configures the output signal's level for channel1 in IDLE state.*/ +#define RMT_IDLE_OUT_LV_CH1 (BIT(18)) +#define RMT_IDLE_OUT_LV_CH1_M (BIT(18)) +#define RMT_IDLE_OUT_LV_CH1_V 0x1 +#define RMT_IDLE_OUT_LV_CH1_S 18 +/* RMT_REF_ALWAYS_ON_CH1 : R/W ;bitpos:[17] ;default: 1'b0 ; */ +/*description: This bit is used to select base clock. 1'b1:clk_apb 1'b0:clk_ref*/ +#define RMT_REF_ALWAYS_ON_CH1 (BIT(17)) +#define RMT_REF_ALWAYS_ON_CH1_M (BIT(17)) +#define RMT_REF_ALWAYS_ON_CH1_V 0x1 +#define RMT_REF_ALWAYS_ON_CH1_S 17 +/* RMT_REF_CNT_RST_CH1 : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: This bit is used to reset divider in channel1.*/ +#define RMT_REF_CNT_RST_CH1 (BIT(16)) +#define RMT_REF_CNT_RST_CH1_M (BIT(16)) +#define RMT_REF_CNT_RST_CH1_V 0x1 +#define RMT_REF_CNT_RST_CH1_S 16 +/* RMT_RX_FILTER_THRES_CH1 : R/W ;bitpos:[15:8] ;default: 8'hf ; */ +/*description: in receive mode channel1 ignore input pulse when the pulse width + is smaller then this value.*/ +#define RMT_RX_FILTER_THRES_CH1 0x000000FF +#define RMT_RX_FILTER_THRES_CH1_M ((RMT_RX_FILTER_THRES_CH1_V)<<(RMT_RX_FILTER_THRES_CH1_S)) +#define RMT_RX_FILTER_THRES_CH1_V 0xFF +#define RMT_RX_FILTER_THRES_CH1_S 8 +/* RMT_RX_FILTER_EN_CH1 : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: This is the receive filter enable bit for channel1.*/ +#define RMT_RX_FILTER_EN_CH1 (BIT(7)) +#define RMT_RX_FILTER_EN_CH1_M (BIT(7)) +#define RMT_RX_FILTER_EN_CH1_V 0x1 +#define RMT_RX_FILTER_EN_CH1_S 7 +/* RMT_TX_CONTI_MODE_CH1 : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: Set this bit to continue sending from the first data to the + last data in channel1 again and again.*/ +#define RMT_TX_CONTI_MODE_CH1 (BIT(6)) +#define RMT_TX_CONTI_MODE_CH1_M (BIT(6)) +#define RMT_TX_CONTI_MODE_CH1_V 0x1 +#define RMT_TX_CONTI_MODE_CH1_S 6 +/* RMT_MEM_OWNER_CH1 : R/W ;bitpos:[5] ;default: 1'b1 ; */ +/*description: This is the mark of channel1's ram usage right.1'b1:receiver + uses the ram 0:transmitter uses the ram*/ +#define RMT_MEM_OWNER_CH1 (BIT(5)) +#define RMT_MEM_OWNER_CH1_M (BIT(5)) +#define RMT_MEM_OWNER_CH1_V 0x1 +#define RMT_MEM_OWNER_CH1_S 5 +/* RMT_APB_MEM_RST_CH1 : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: Set this bit to reset W/R ram address for channel1 by apb fifo access*/ +#define RMT_APB_MEM_RST_CH1 (BIT(4)) +#define RMT_APB_MEM_RST_CH1_M (BIT(4)) +#define RMT_APB_MEM_RST_CH1_V 0x1 +#define RMT_APB_MEM_RST_CH1_S 4 +/* RMT_MEM_RD_RST_CH1 : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: Set this bit to reset read ram address for channel1 by transmitter access.*/ +#define RMT_MEM_RD_RST_CH1 (BIT(3)) +#define RMT_MEM_RD_RST_CH1_M (BIT(3)) +#define RMT_MEM_RD_RST_CH1_V 0x1 +#define RMT_MEM_RD_RST_CH1_S 3 +/* RMT_MEM_WR_RST_CH1 : R/W ;bitpos:[2] ;default: 1'h0 ; */ +/*description: Set this bit to reset write ram address for channel1 by receiver access.*/ +#define RMT_MEM_WR_RST_CH1 (BIT(2)) +#define RMT_MEM_WR_RST_CH1_M (BIT(2)) +#define RMT_MEM_WR_RST_CH1_V 0x1 +#define RMT_MEM_WR_RST_CH1_S 2 +/* RMT_RX_EN_CH1 : R/W ;bitpos:[1] ;default: 1'h0 ; */ +/*description: Set this bit to enbale receving data for channel1.*/ +#define RMT_RX_EN_CH1 (BIT(1)) +#define RMT_RX_EN_CH1_M (BIT(1)) +#define RMT_RX_EN_CH1_V 0x1 +#define RMT_RX_EN_CH1_S 1 +/* RMT_TX_START_CH1 : R/W ;bitpos:[0] ;default: 1'h0 ; */ +/*description: Set this bit to start sending data for channel1.*/ +#define RMT_TX_START_CH1 (BIT(0)) +#define RMT_TX_START_CH1_M (BIT(0)) +#define RMT_TX_START_CH1_V 0x1 +#define RMT_TX_START_CH1_S 0 + +#define RMT_CH2CONF0_REG (DR_REG_RMT_BASE + 0x0030) +/* RMT_CARRIER_OUT_LV_CH2 : R/W ;bitpos:[29] ;default: 1'b1 ; */ +/*description: This bit is used to configure carrier wave's position for channel2.1'b1:add + on low level 1'b0:add on high level.*/ +#define RMT_CARRIER_OUT_LV_CH2 (BIT(29)) +#define RMT_CARRIER_OUT_LV_CH2_M (BIT(29)) +#define RMT_CARRIER_OUT_LV_CH2_V 0x1 +#define RMT_CARRIER_OUT_LV_CH2_S 29 +/* RMT_CARRIER_EN_CH2 : R/W ;bitpos:[28] ;default: 1'b1 ; */ +/*description: This is the carrier modulation enable control bit for channel2.*/ +#define RMT_CARRIER_EN_CH2 (BIT(28)) +#define RMT_CARRIER_EN_CH2_M (BIT(28)) +#define RMT_CARRIER_EN_CH2_V 0x1 +#define RMT_CARRIER_EN_CH2_S 28 +/* RMT_MEM_SIZE_CH2 : R/W ;bitpos:[27:24] ;default: 4'h1 ; */ +/*description: This register is used to configure the the amount of memory blocks + allocated to channel2.*/ +#define RMT_MEM_SIZE_CH2 0x0000000F +#define RMT_MEM_SIZE_CH2_M ((RMT_MEM_SIZE_CH2_V)<<(RMT_MEM_SIZE_CH2_S)) +#define RMT_MEM_SIZE_CH2_V 0xF +#define RMT_MEM_SIZE_CH2_S 24 +/* RMT_IDLE_THRES_CH2 : R/W ;bitpos:[23:8] ;default: 16'h1000 ; */ +/*description: In receive mode when the counter's value is bigger than reg_idle_thres_ch2 + then the receive process is done.*/ +#define RMT_IDLE_THRES_CH2 0x0000FFFF +#define RMT_IDLE_THRES_CH2_M ((RMT_IDLE_THRES_CH2_V)<<(RMT_IDLE_THRES_CH2_S)) +#define RMT_IDLE_THRES_CH2_V 0xFFFF +#define RMT_IDLE_THRES_CH2_S 8 +/* RMT_DIV_CNT_CH2 : R/W ;bitpos:[7:0] ;default: 8'h2 ; */ +/*description: This register is used to configure the frequency divider's factor in channel2.*/ +#define RMT_DIV_CNT_CH2 0x000000FF +#define RMT_DIV_CNT_CH2_M ((RMT_DIV_CNT_CH2_V)<<(RMT_DIV_CNT_CH2_S)) +#define RMT_DIV_CNT_CH2_V 0xFF +#define RMT_DIV_CNT_CH2_S 0 + +#define RMT_CH2CONF1_REG (DR_REG_RMT_BASE + 0x0034) +/* RMT_IDLE_OUT_EN_CH2 : R/W ;bitpos:[19] ;default: 1'b0 ; */ +/*description: This is the output enable control bit for channel2 in IDLE state.*/ +#define RMT_IDLE_OUT_EN_CH2 (BIT(19)) +#define RMT_IDLE_OUT_EN_CH2_M (BIT(19)) +#define RMT_IDLE_OUT_EN_CH2_V 0x1 +#define RMT_IDLE_OUT_EN_CH2_S 19 +/* RMT_IDLE_OUT_LV_CH2 : R/W ;bitpos:[18] ;default: 1'b0 ; */ +/*description: This bit configures the output signal's level for channel2 in IDLE state.*/ +#define RMT_IDLE_OUT_LV_CH2 (BIT(18)) +#define RMT_IDLE_OUT_LV_CH2_M (BIT(18)) +#define RMT_IDLE_OUT_LV_CH2_V 0x1 +#define RMT_IDLE_OUT_LV_CH2_S 18 +/* RMT_REF_ALWAYS_ON_CH2 : R/W ;bitpos:[17] ;default: 1'b0 ; */ +/*description: This bit is used to select base clock. 1'b1:clk_apb 1'b0:clk_ref*/ +#define RMT_REF_ALWAYS_ON_CH2 (BIT(17)) +#define RMT_REF_ALWAYS_ON_CH2_M (BIT(17)) +#define RMT_REF_ALWAYS_ON_CH2_V 0x1 +#define RMT_REF_ALWAYS_ON_CH2_S 17 +/* RMT_REF_CNT_RST_CH2 : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: This bit is used to reset divider in channel2.*/ +#define RMT_REF_CNT_RST_CH2 (BIT(16)) +#define RMT_REF_CNT_RST_CH2_M (BIT(16)) +#define RMT_REF_CNT_RST_CH2_V 0x1 +#define RMT_REF_CNT_RST_CH2_S 16 +/* RMT_RX_FILTER_THRES_CH2 : R/W ;bitpos:[15:8] ;default: 8'hf ; */ +/*description: in receive mode channel2 ignore input pulse when the pulse width + is smaller then this value.*/ +#define RMT_RX_FILTER_THRES_CH2 0x000000FF +#define RMT_RX_FILTER_THRES_CH2_M ((RMT_RX_FILTER_THRES_CH2_V)<<(RMT_RX_FILTER_THRES_CH2_S)) +#define RMT_RX_FILTER_THRES_CH2_V 0xFF +#define RMT_RX_FILTER_THRES_CH2_S 8 +/* RMT_RX_FILTER_EN_CH2 : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: This is the receive filter enable bit for channel2.*/ +#define RMT_RX_FILTER_EN_CH2 (BIT(7)) +#define RMT_RX_FILTER_EN_CH2_M (BIT(7)) +#define RMT_RX_FILTER_EN_CH2_V 0x1 +#define RMT_RX_FILTER_EN_CH2_S 7 +/* RMT_TX_CONTI_MODE_CH2 : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: Set this bit to continue sending from the first data to the + last data in channel2.*/ +#define RMT_TX_CONTI_MODE_CH2 (BIT(6)) +#define RMT_TX_CONTI_MODE_CH2_M (BIT(6)) +#define RMT_TX_CONTI_MODE_CH2_V 0x1 +#define RMT_TX_CONTI_MODE_CH2_S 6 +/* RMT_MEM_OWNER_CH2 : R/W ;bitpos:[5] ;default: 1'b1 ; */ +/*description: This is the mark of channel2's ram usage right.1'b1:receiver + uses the ram 0:transmitter uses the ram*/ +#define RMT_MEM_OWNER_CH2 (BIT(5)) +#define RMT_MEM_OWNER_CH2_M (BIT(5)) +#define RMT_MEM_OWNER_CH2_V 0x1 +#define RMT_MEM_OWNER_CH2_S 5 +/* RMT_APB_MEM_RST_CH2 : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: Set this bit to reset W/R ram address for channel2 by apb fifo access*/ +#define RMT_APB_MEM_RST_CH2 (BIT(4)) +#define RMT_APB_MEM_RST_CH2_M (BIT(4)) +#define RMT_APB_MEM_RST_CH2_V 0x1 +#define RMT_APB_MEM_RST_CH2_S 4 +/* RMT_MEM_RD_RST_CH2 : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: Set this bit to reset read ram address for channel2 by transmitter access.*/ +#define RMT_MEM_RD_RST_CH2 (BIT(3)) +#define RMT_MEM_RD_RST_CH2_M (BIT(3)) +#define RMT_MEM_RD_RST_CH2_V 0x1 +#define RMT_MEM_RD_RST_CH2_S 3 +/* RMT_MEM_WR_RST_CH2 : R/W ;bitpos:[2] ;default: 1'h0 ; */ +/*description: Set this bit to reset write ram address for channel2 by receiver access.*/ +#define RMT_MEM_WR_RST_CH2 (BIT(2)) +#define RMT_MEM_WR_RST_CH2_M (BIT(2)) +#define RMT_MEM_WR_RST_CH2_V 0x1 +#define RMT_MEM_WR_RST_CH2_S 2 +/* RMT_RX_EN_CH2 : R/W ;bitpos:[1] ;default: 1'h0 ; */ +/*description: Set this bit to enbale receving data for channel2.*/ +#define RMT_RX_EN_CH2 (BIT(1)) +#define RMT_RX_EN_CH2_M (BIT(1)) +#define RMT_RX_EN_CH2_V 0x1 +#define RMT_RX_EN_CH2_S 1 +/* RMT_TX_START_CH2 : R/W ;bitpos:[0] ;default: 1'h0 ; */ +/*description: Set this bit to start sending data for channel2.*/ +#define RMT_TX_START_CH2 (BIT(0)) +#define RMT_TX_START_CH2_M (BIT(0)) +#define RMT_TX_START_CH2_V 0x1 +#define RMT_TX_START_CH2_S 0 + +#define RMT_CH3CONF0_REG (DR_REG_RMT_BASE + 0x0038) +/* RMT_CARRIER_OUT_LV_CH3 : R/W ;bitpos:[29] ;default: 1'b1 ; */ +/*description: This bit is used to configure carrier wave's position for channel3.1'b1:add + on low level 1'b0:add on high level.*/ +#define RMT_CARRIER_OUT_LV_CH3 (BIT(29)) +#define RMT_CARRIER_OUT_LV_CH3_M (BIT(29)) +#define RMT_CARRIER_OUT_LV_CH3_V 0x1 +#define RMT_CARRIER_OUT_LV_CH3_S 29 +/* RMT_CARRIER_EN_CH3 : R/W ;bitpos:[28] ;default: 1'b1 ; */ +/*description: This is the carrier modulation enable control bit for channel3.*/ +#define RMT_CARRIER_EN_CH3 (BIT(28)) +#define RMT_CARRIER_EN_CH3_M (BIT(28)) +#define RMT_CARRIER_EN_CH3_V 0x1 +#define RMT_CARRIER_EN_CH3_S 28 +/* RMT_MEM_SIZE_CH3 : R/W ;bitpos:[27:24] ;default: 4'h1 ; */ +/*description: This register is used to configure the the amount of memory blocks + allocated to channel3.*/ +#define RMT_MEM_SIZE_CH3 0x0000000F +#define RMT_MEM_SIZE_CH3_M ((RMT_MEM_SIZE_CH3_V)<<(RMT_MEM_SIZE_CH3_S)) +#define RMT_MEM_SIZE_CH3_V 0xF +#define RMT_MEM_SIZE_CH3_S 24 +/* RMT_IDLE_THRES_CH3 : R/W ;bitpos:[23:8] ;default: 16'h1000 ; */ +/*description: In receive mode when the counter's value is bigger than reg_idle_thres_ch3 + then the receive process is done.*/ +#define RMT_IDLE_THRES_CH3 0x0000FFFF +#define RMT_IDLE_THRES_CH3_M ((RMT_IDLE_THRES_CH3_V)<<(RMT_IDLE_THRES_CH3_S)) +#define RMT_IDLE_THRES_CH3_V 0xFFFF +#define RMT_IDLE_THRES_CH3_S 8 +/* RMT_DIV_CNT_CH3 : R/W ;bitpos:[7:0] ;default: 8'h2 ; */ +/*description: This register is used to configure the frequency divider's factor in channel3.*/ +#define RMT_DIV_CNT_CH3 0x000000FF +#define RMT_DIV_CNT_CH3_M ((RMT_DIV_CNT_CH3_V)<<(RMT_DIV_CNT_CH3_S)) +#define RMT_DIV_CNT_CH3_V 0xFF +#define RMT_DIV_CNT_CH3_S 0 + +#define RMT_CH3CONF1_REG (DR_REG_RMT_BASE + 0x003c) +/* RMT_IDLE_OUT_EN_CH3 : R/W ;bitpos:[19] ;default: 1'b0 ; */ +/*description: This is the output enable control bit for channel3 in IDLE state.*/ +#define RMT_IDLE_OUT_EN_CH3 (BIT(19)) +#define RMT_IDLE_OUT_EN_CH3_M (BIT(19)) +#define RMT_IDLE_OUT_EN_CH3_V 0x1 +#define RMT_IDLE_OUT_EN_CH3_S 19 +/* RMT_IDLE_OUT_LV_CH3 : R/W ;bitpos:[18] ;default: 1'b0 ; */ +/*description: This bit configures the output signal's level for channel3 in IDLE state.*/ +#define RMT_IDLE_OUT_LV_CH3 (BIT(18)) +#define RMT_IDLE_OUT_LV_CH3_M (BIT(18)) +#define RMT_IDLE_OUT_LV_CH3_V 0x1 +#define RMT_IDLE_OUT_LV_CH3_S 18 +/* RMT_REF_ALWAYS_ON_CH3 : R/W ;bitpos:[17] ;default: 1'b0 ; */ +/*description: This bit is used to select base clock. 1'b1:clk_apb 1'b0:clk_ref*/ +#define RMT_REF_ALWAYS_ON_CH3 (BIT(17)) +#define RMT_REF_ALWAYS_ON_CH3_M (BIT(17)) +#define RMT_REF_ALWAYS_ON_CH3_V 0x1 +#define RMT_REF_ALWAYS_ON_CH3_S 17 +/* RMT_REF_CNT_RST_CH3 : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: This bit is used to reset divider in channel3.*/ +#define RMT_REF_CNT_RST_CH3 (BIT(16)) +#define RMT_REF_CNT_RST_CH3_M (BIT(16)) +#define RMT_REF_CNT_RST_CH3_V 0x1 +#define RMT_REF_CNT_RST_CH3_S 16 +/* RMT_RX_FILTER_THRES_CH3 : R/W ;bitpos:[15:8] ;default: 8'hf ; */ +/*description: in receive mode channel3 ignore input pulse when the pulse width + is smaller then this value.*/ +#define RMT_RX_FILTER_THRES_CH3 0x000000FF +#define RMT_RX_FILTER_THRES_CH3_M ((RMT_RX_FILTER_THRES_CH3_V)<<(RMT_RX_FILTER_THRES_CH3_S)) +#define RMT_RX_FILTER_THRES_CH3_V 0xFF +#define RMT_RX_FILTER_THRES_CH3_S 8 +/* RMT_RX_FILTER_EN_CH3 : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: This is the receive filter enable bit for channel3.*/ +#define RMT_RX_FILTER_EN_CH3 (BIT(7)) +#define RMT_RX_FILTER_EN_CH3_M (BIT(7)) +#define RMT_RX_FILTER_EN_CH3_V 0x1 +#define RMT_RX_FILTER_EN_CH3_S 7 +/* RMT_TX_CONTI_MODE_CH3 : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: Set this bit to continue sending from the first data to the + last data in channel3.*/ +#define RMT_TX_CONTI_MODE_CH3 (BIT(6)) +#define RMT_TX_CONTI_MODE_CH3_M (BIT(6)) +#define RMT_TX_CONTI_MODE_CH3_V 0x1 +#define RMT_TX_CONTI_MODE_CH3_S 6 +/* RMT_MEM_OWNER_CH3 : R/W ;bitpos:[5] ;default: 1'b1 ; */ +/*description: This is the mark of channel3's ram usage right.1'b1:receiver + uses the ram 0:transmitter uses the ram*/ +#define RMT_MEM_OWNER_CH3 (BIT(5)) +#define RMT_MEM_OWNER_CH3_M (BIT(5)) +#define RMT_MEM_OWNER_CH3_V 0x1 +#define RMT_MEM_OWNER_CH3_S 5 +/* RMT_APB_MEM_RST_CH3 : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: Set this bit to reset W/R ram address for channel3 by apb fifo access*/ +#define RMT_APB_MEM_RST_CH3 (BIT(4)) +#define RMT_APB_MEM_RST_CH3_M (BIT(4)) +#define RMT_APB_MEM_RST_CH3_V 0x1 +#define RMT_APB_MEM_RST_CH3_S 4 +/* RMT_MEM_RD_RST_CH3 : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: Set this bit to reset read ram address for channel3 by transmitter access.*/ +#define RMT_MEM_RD_RST_CH3 (BIT(3)) +#define RMT_MEM_RD_RST_CH3_M (BIT(3)) +#define RMT_MEM_RD_RST_CH3_V 0x1 +#define RMT_MEM_RD_RST_CH3_S 3 +/* RMT_MEM_WR_RST_CH3 : R/W ;bitpos:[2] ;default: 1'h0 ; */ +/*description: Set this bit to reset write ram address for channel3 by receiver access.*/ +#define RMT_MEM_WR_RST_CH3 (BIT(2)) +#define RMT_MEM_WR_RST_CH3_M (BIT(2)) +#define RMT_MEM_WR_RST_CH3_V 0x1 +#define RMT_MEM_WR_RST_CH3_S 2 +/* RMT_RX_EN_CH3 : R/W ;bitpos:[1] ;default: 1'h0 ; */ +/*description: Set this bit to enbale receving data for channel3.*/ +#define RMT_RX_EN_CH3 (BIT(1)) +#define RMT_RX_EN_CH3_M (BIT(1)) +#define RMT_RX_EN_CH3_V 0x1 +#define RMT_RX_EN_CH3_S 1 +/* RMT_TX_START_CH3 : R/W ;bitpos:[0] ;default: 1'h0 ; */ +/*description: Set this bit to start sending data for channel3.*/ +#define RMT_TX_START_CH3 (BIT(0)) +#define RMT_TX_START_CH3_M (BIT(0)) +#define RMT_TX_START_CH3_V 0x1 +#define RMT_TX_START_CH3_S 0 + +#define RMT_CH4CONF0_REG (DR_REG_RMT_BASE + 0x0040) +/* RMT_CARRIER_OUT_LV_CH4 : R/W ;bitpos:[29] ;default: 1'b1 ; */ +/*description: This bit is used to configure carrier wave's position for channel4.1'b1:add + on low level 1'b0:add on high level.*/ +#define RMT_CARRIER_OUT_LV_CH4 (BIT(29)) +#define RMT_CARRIER_OUT_LV_CH4_M (BIT(29)) +#define RMT_CARRIER_OUT_LV_CH4_V 0x1 +#define RMT_CARRIER_OUT_LV_CH4_S 29 +/* RMT_CARRIER_EN_CH4 : R/W ;bitpos:[28] ;default: 1'b1 ; */ +/*description: This is the carrier modulation enable control bit for channel4.*/ +#define RMT_CARRIER_EN_CH4 (BIT(28)) +#define RMT_CARRIER_EN_CH4_M (BIT(28)) +#define RMT_CARRIER_EN_CH4_V 0x1 +#define RMT_CARRIER_EN_CH4_S 28 +/* RMT_MEM_SIZE_CH4 : R/W ;bitpos:[27:24] ;default: 4'h1 ; */ +/*description: This register is used to configure the the amount of memory blocks + allocated to channel4.*/ +#define RMT_MEM_SIZE_CH4 0x0000000F +#define RMT_MEM_SIZE_CH4_M ((RMT_MEM_SIZE_CH4_V)<<(RMT_MEM_SIZE_CH4_S)) +#define RMT_MEM_SIZE_CH4_V 0xF +#define RMT_MEM_SIZE_CH4_S 24 +/* RMT_IDLE_THRES_CH4 : R/W ;bitpos:[23:8] ;default: 16'h1000 ; */ +/*description: In receive mode when the counter's value is bigger than reg_idle_thres_ch4 + then the receive process is done.*/ +#define RMT_IDLE_THRES_CH4 0x0000FFFF +#define RMT_IDLE_THRES_CH4_M ((RMT_IDLE_THRES_CH4_V)<<(RMT_IDLE_THRES_CH4_S)) +#define RMT_IDLE_THRES_CH4_V 0xFFFF +#define RMT_IDLE_THRES_CH4_S 8 +/* RMT_DIV_CNT_CH4 : R/W ;bitpos:[7:0] ;default: 8'h2 ; */ +/*description: This register is used to configure the frequency divider's factor in channel4.*/ +#define RMT_DIV_CNT_CH4 0x000000FF +#define RMT_DIV_CNT_CH4_M ((RMT_DIV_CNT_CH4_V)<<(RMT_DIV_CNT_CH4_S)) +#define RMT_DIV_CNT_CH4_V 0xFF +#define RMT_DIV_CNT_CH4_S 0 + +#define RMT_CH4CONF1_REG (DR_REG_RMT_BASE + 0x0044) +/* RMT_IDLE_OUT_EN_CH4 : R/W ;bitpos:[19] ;default: 1'b0 ; */ +/*description: This is the output enable control bit for channel4 in IDLE state.*/ +#define RMT_IDLE_OUT_EN_CH4 (BIT(19)) +#define RMT_IDLE_OUT_EN_CH4_M (BIT(19)) +#define RMT_IDLE_OUT_EN_CH4_V 0x1 +#define RMT_IDLE_OUT_EN_CH4_S 19 +/* RMT_IDLE_OUT_LV_CH4 : R/W ;bitpos:[18] ;default: 1'b0 ; */ +/*description: This bit configures the output signal's level for channel4 in IDLE state.*/ +#define RMT_IDLE_OUT_LV_CH4 (BIT(18)) +#define RMT_IDLE_OUT_LV_CH4_M (BIT(18)) +#define RMT_IDLE_OUT_LV_CH4_V 0x1 +#define RMT_IDLE_OUT_LV_CH4_S 18 +/* RMT_REF_ALWAYS_ON_CH4 : R/W ;bitpos:[17] ;default: 1'b0 ; */ +/*description: This bit is used to select base clock. 1'b1:clk_apb 1'b0:clk_ref*/ +#define RMT_REF_ALWAYS_ON_CH4 (BIT(17)) +#define RMT_REF_ALWAYS_ON_CH4_M (BIT(17)) +#define RMT_REF_ALWAYS_ON_CH4_V 0x1 +#define RMT_REF_ALWAYS_ON_CH4_S 17 +/* RMT_REF_CNT_RST_CH4 : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: This bit is used to reset divider in channel4.*/ +#define RMT_REF_CNT_RST_CH4 (BIT(16)) +#define RMT_REF_CNT_RST_CH4_M (BIT(16)) +#define RMT_REF_CNT_RST_CH4_V 0x1 +#define RMT_REF_CNT_RST_CH4_S 16 +/* RMT_RX_FILTER_THRES_CH4 : R/W ;bitpos:[15:8] ;default: 8'hf ; */ +/*description: in receive mode channel4 ignore input pulse when the pulse width + is smaller then this value.*/ +#define RMT_RX_FILTER_THRES_CH4 0x000000FF +#define RMT_RX_FILTER_THRES_CH4_M ((RMT_RX_FILTER_THRES_CH4_V)<<(RMT_RX_FILTER_THRES_CH4_S)) +#define RMT_RX_FILTER_THRES_CH4_V 0xFF +#define RMT_RX_FILTER_THRES_CH4_S 8 +/* RMT_RX_FILTER_EN_CH4 : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: This is the receive filter enable bit for channel4.*/ +#define RMT_RX_FILTER_EN_CH4 (BIT(7)) +#define RMT_RX_FILTER_EN_CH4_M (BIT(7)) +#define RMT_RX_FILTER_EN_CH4_V 0x1 +#define RMT_RX_FILTER_EN_CH4_S 7 +/* RMT_TX_CONTI_MODE_CH4 : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: Set this bit to continue sending from the first data to the + last data in channel4.*/ +#define RMT_TX_CONTI_MODE_CH4 (BIT(6)) +#define RMT_TX_CONTI_MODE_CH4_M (BIT(6)) +#define RMT_TX_CONTI_MODE_CH4_V 0x1 +#define RMT_TX_CONTI_MODE_CH4_S 6 +/* RMT_MEM_OWNER_CH4 : R/W ;bitpos:[5] ;default: 1'b1 ; */ +/*description: This is the mark of channel4's ram usage right.1'b1:receiver + uses the ram 0:transmitter uses the ram*/ +#define RMT_MEM_OWNER_CH4 (BIT(5)) +#define RMT_MEM_OWNER_CH4_M (BIT(5)) +#define RMT_MEM_OWNER_CH4_V 0x1 +#define RMT_MEM_OWNER_CH4_S 5 +/* RMT_APB_MEM_RST_CH4 : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: Set this bit to reset W/R ram address for channel4 by apb fifo access*/ +#define RMT_APB_MEM_RST_CH4 (BIT(4)) +#define RMT_APB_MEM_RST_CH4_M (BIT(4)) +#define RMT_APB_MEM_RST_CH4_V 0x1 +#define RMT_APB_MEM_RST_CH4_S 4 +/* RMT_MEM_RD_RST_CH4 : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: Set this bit to reset read ram address for channel4 by transmitter access.*/ +#define RMT_MEM_RD_RST_CH4 (BIT(3)) +#define RMT_MEM_RD_RST_CH4_M (BIT(3)) +#define RMT_MEM_RD_RST_CH4_V 0x1 +#define RMT_MEM_RD_RST_CH4_S 3 +/* RMT_MEM_WR_RST_CH4 : R/W ;bitpos:[2] ;default: 1'h0 ; */ +/*description: Set this bit to reset write ram address for channel4 by receiver access.*/ +#define RMT_MEM_WR_RST_CH4 (BIT(2)) +#define RMT_MEM_WR_RST_CH4_M (BIT(2)) +#define RMT_MEM_WR_RST_CH4_V 0x1 +#define RMT_MEM_WR_RST_CH4_S 2 +/* RMT_RX_EN_CH4 : R/W ;bitpos:[1] ;default: 1'h0 ; */ +/*description: Set this bit to enbale receving data for channel4.*/ +#define RMT_RX_EN_CH4 (BIT(1)) +#define RMT_RX_EN_CH4_M (BIT(1)) +#define RMT_RX_EN_CH4_V 0x1 +#define RMT_RX_EN_CH4_S 1 +/* RMT_TX_START_CH4 : R/W ;bitpos:[0] ;default: 1'h0 ; */ +/*description: Set this bit to start sending data for channel4.*/ +#define RMT_TX_START_CH4 (BIT(0)) +#define RMT_TX_START_CH4_M (BIT(0)) +#define RMT_TX_START_CH4_V 0x1 +#define RMT_TX_START_CH4_S 0 + +#define RMT_CH5CONF0_REG (DR_REG_RMT_BASE + 0x0048) +/* RMT_CARRIER_OUT_LV_CH5 : R/W ;bitpos:[29] ;default: 1'b1 ; */ +/*description: This bit is used to configure carrier wave's position for channel5.1'b1:add + on low level 1'b0:add on high level.*/ +#define RMT_CARRIER_OUT_LV_CH5 (BIT(29)) +#define RMT_CARRIER_OUT_LV_CH5_M (BIT(29)) +#define RMT_CARRIER_OUT_LV_CH5_V 0x1 +#define RMT_CARRIER_OUT_LV_CH5_S 29 +/* RMT_CARRIER_EN_CH5 : R/W ;bitpos:[28] ;default: 1'b1 ; */ +/*description: This is the carrier modulation enable control bit for channel5.*/ +#define RMT_CARRIER_EN_CH5 (BIT(28)) +#define RMT_CARRIER_EN_CH5_M (BIT(28)) +#define RMT_CARRIER_EN_CH5_V 0x1 +#define RMT_CARRIER_EN_CH5_S 28 +/* RMT_MEM_SIZE_CH5 : R/W ;bitpos:[27:24] ;default: 4'h1 ; */ +/*description: This register is used to configure the the amount of memory blocks + allocated to channel5.*/ +#define RMT_MEM_SIZE_CH5 0x0000000F +#define RMT_MEM_SIZE_CH5_M ((RMT_MEM_SIZE_CH5_V)<<(RMT_MEM_SIZE_CH5_S)) +#define RMT_MEM_SIZE_CH5_V 0xF +#define RMT_MEM_SIZE_CH5_S 24 +/* RMT_IDLE_THRES_CH5 : R/W ;bitpos:[23:8] ;default: 16'h1000 ; */ +/*description: In receive mode when the counter's value is bigger than reg_idle_thres_ch5 + then the receive process is done.*/ +#define RMT_IDLE_THRES_CH5 0x0000FFFF +#define RMT_IDLE_THRES_CH5_M ((RMT_IDLE_THRES_CH5_V)<<(RMT_IDLE_THRES_CH5_S)) +#define RMT_IDLE_THRES_CH5_V 0xFFFF +#define RMT_IDLE_THRES_CH5_S 8 +/* RMT_DIV_CNT_CH5 : R/W ;bitpos:[7:0] ;default: 8'h2 ; */ +/*description: This register is used to configure the frequency divider's factor in channel5.*/ +#define RMT_DIV_CNT_CH5 0x000000FF +#define RMT_DIV_CNT_CH5_M ((RMT_DIV_CNT_CH5_V)<<(RMT_DIV_CNT_CH5_S)) +#define RMT_DIV_CNT_CH5_V 0xFF +#define RMT_DIV_CNT_CH5_S 0 + +#define RMT_CH5CONF1_REG (DR_REG_RMT_BASE + 0x004c) +/* RMT_IDLE_OUT_EN_CH5 : R/W ;bitpos:[19] ;default: 1'b0 ; */ +/*description: This is the output enable control bit for channel5 in IDLE state.*/ +#define RMT_IDLE_OUT_EN_CH5 (BIT(19)) +#define RMT_IDLE_OUT_EN_CH5_M (BIT(19)) +#define RMT_IDLE_OUT_EN_CH5_V 0x1 +#define RMT_IDLE_OUT_EN_CH5_S 19 +/* RMT_IDLE_OUT_LV_CH5 : R/W ;bitpos:[18] ;default: 1'b0 ; */ +/*description: This bit configures the output signal's level for channel5 in IDLE state.*/ +#define RMT_IDLE_OUT_LV_CH5 (BIT(18)) +#define RMT_IDLE_OUT_LV_CH5_M (BIT(18)) +#define RMT_IDLE_OUT_LV_CH5_V 0x1 +#define RMT_IDLE_OUT_LV_CH5_S 18 +/* RMT_REF_ALWAYS_ON_CH5 : R/W ;bitpos:[17] ;default: 1'b0 ; */ +/*description: This bit is used to select base clock. 1'b1:clk_apb 1'b0:clk_ref*/ +#define RMT_REF_ALWAYS_ON_CH5 (BIT(17)) +#define RMT_REF_ALWAYS_ON_CH5_M (BIT(17)) +#define RMT_REF_ALWAYS_ON_CH5_V 0x1 +#define RMT_REF_ALWAYS_ON_CH5_S 17 +/* RMT_REF_CNT_RST_CH5 : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: This bit is used to reset divider in channel5.*/ +#define RMT_REF_CNT_RST_CH5 (BIT(16)) +#define RMT_REF_CNT_RST_CH5_M (BIT(16)) +#define RMT_REF_CNT_RST_CH5_V 0x1 +#define RMT_REF_CNT_RST_CH5_S 16 +/* RMT_RX_FILTER_THRES_CH5 : R/W ;bitpos:[15:8] ;default: 8'hf ; */ +/*description: in receive mode channel5 ignore input pulse when the pulse width + is smaller then this value.*/ +#define RMT_RX_FILTER_THRES_CH5 0x000000FF +#define RMT_RX_FILTER_THRES_CH5_M ((RMT_RX_FILTER_THRES_CH5_V)<<(RMT_RX_FILTER_THRES_CH5_S)) +#define RMT_RX_FILTER_THRES_CH5_V 0xFF +#define RMT_RX_FILTER_THRES_CH5_S 8 +/* RMT_RX_FILTER_EN_CH5 : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: This is the receive filter enable bit for channel5.*/ +#define RMT_RX_FILTER_EN_CH5 (BIT(7)) +#define RMT_RX_FILTER_EN_CH5_M (BIT(7)) +#define RMT_RX_FILTER_EN_CH5_V 0x1 +#define RMT_RX_FILTER_EN_CH5_S 7 +/* RMT_TX_CONTI_MODE_CH5 : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: Set this bit to continue sending from the first data to the + last data in channel5.*/ +#define RMT_TX_CONTI_MODE_CH5 (BIT(6)) +#define RMT_TX_CONTI_MODE_CH5_M (BIT(6)) +#define RMT_TX_CONTI_MODE_CH5_V 0x1 +#define RMT_TX_CONTI_MODE_CH5_S 6 +/* RMT_MEM_OWNER_CH5 : R/W ;bitpos:[5] ;default: 1'b1 ; */ +/*description: This is the mark of channel5's ram usage right.1'b1:receiver + uses the ram 0:transmitter uses the ram*/ +#define RMT_MEM_OWNER_CH5 (BIT(5)) +#define RMT_MEM_OWNER_CH5_M (BIT(5)) +#define RMT_MEM_OWNER_CH5_V 0x1 +#define RMT_MEM_OWNER_CH5_S 5 +/* RMT_APB_MEM_RST_CH5 : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: Set this bit to reset W/R ram address for channel5 by apb fifo access*/ +#define RMT_APB_MEM_RST_CH5 (BIT(4)) +#define RMT_APB_MEM_RST_CH5_M (BIT(4)) +#define RMT_APB_MEM_RST_CH5_V 0x1 +#define RMT_APB_MEM_RST_CH5_S 4 +/* RMT_MEM_RD_RST_CH5 : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: Set this bit to reset read ram address for channel5 by transmitter access.*/ +#define RMT_MEM_RD_RST_CH5 (BIT(3)) +#define RMT_MEM_RD_RST_CH5_M (BIT(3)) +#define RMT_MEM_RD_RST_CH5_V 0x1 +#define RMT_MEM_RD_RST_CH5_S 3 +/* RMT_MEM_WR_RST_CH5 : R/W ;bitpos:[2] ;default: 1'h0 ; */ +/*description: Set this bit to reset write ram address for channel5 by receiver access.*/ +#define RMT_MEM_WR_RST_CH5 (BIT(2)) +#define RMT_MEM_WR_RST_CH5_M (BIT(2)) +#define RMT_MEM_WR_RST_CH5_V 0x1 +#define RMT_MEM_WR_RST_CH5_S 2 +/* RMT_RX_EN_CH5 : R/W ;bitpos:[1] ;default: 1'h0 ; */ +/*description: Set this bit to enbale receving data for channel5.*/ +#define RMT_RX_EN_CH5 (BIT(1)) +#define RMT_RX_EN_CH5_M (BIT(1)) +#define RMT_RX_EN_CH5_V 0x1 +#define RMT_RX_EN_CH5_S 1 +/* RMT_TX_START_CH5 : R/W ;bitpos:[0] ;default: 1'h0 ; */ +/*description: Set this bit to start sending data for channel5.*/ +#define RMT_TX_START_CH5 (BIT(0)) +#define RMT_TX_START_CH5_M (BIT(0)) +#define RMT_TX_START_CH5_V 0x1 +#define RMT_TX_START_CH5_S 0 + +#define RMT_CH6CONF0_REG (DR_REG_RMT_BASE + 0x0050) +/* RMT_CARRIER_OUT_LV_CH6 : R/W ;bitpos:[29] ;default: 1'b1 ; */ +/*description: This bit is used to configure carrier wave's position for channel6.1'b1:add + on low level 1'b0:add on high level.*/ +#define RMT_CARRIER_OUT_LV_CH6 (BIT(29)) +#define RMT_CARRIER_OUT_LV_CH6_M (BIT(29)) +#define RMT_CARRIER_OUT_LV_CH6_V 0x1 +#define RMT_CARRIER_OUT_LV_CH6_S 29 +/* RMT_CARRIER_EN_CH6 : R/W ;bitpos:[28] ;default: 1'b1 ; */ +/*description: This is the carrier modulation enable control bit for channel6.*/ +#define RMT_CARRIER_EN_CH6 (BIT(28)) +#define RMT_CARRIER_EN_CH6_M (BIT(28)) +#define RMT_CARRIER_EN_CH6_V 0x1 +#define RMT_CARRIER_EN_CH6_S 28 +/* RMT_MEM_SIZE_CH6 : R/W ;bitpos:[27:24] ;default: 4'h1 ; */ +/*description: This register is used to configure the the amount of memory blocks + allocated to channel6.*/ +#define RMT_MEM_SIZE_CH6 0x0000000F +#define RMT_MEM_SIZE_CH6_M ((RMT_MEM_SIZE_CH6_V)<<(RMT_MEM_SIZE_CH6_S)) +#define RMT_MEM_SIZE_CH6_V 0xF +#define RMT_MEM_SIZE_CH6_S 24 +/* RMT_IDLE_THRES_CH6 : R/W ;bitpos:[23:8] ;default: 16'h1000 ; */ +/*description: In receive mode when the counter's value is bigger than reg_idle_thres_ch6 + then the receive process is done.*/ +#define RMT_IDLE_THRES_CH6 0x0000FFFF +#define RMT_IDLE_THRES_CH6_M ((RMT_IDLE_THRES_CH6_V)<<(RMT_IDLE_THRES_CH6_S)) +#define RMT_IDLE_THRES_CH6_V 0xFFFF +#define RMT_IDLE_THRES_CH6_S 8 +/* RMT_DIV_CNT_CH6 : R/W ;bitpos:[7:0] ;default: 8'h2 ; */ +/*description: This register is used to configure the frequency divider's factor in channel6.*/ +#define RMT_DIV_CNT_CH6 0x000000FF +#define RMT_DIV_CNT_CH6_M ((RMT_DIV_CNT_CH6_V)<<(RMT_DIV_CNT_CH6_S)) +#define RMT_DIV_CNT_CH6_V 0xFF +#define RMT_DIV_CNT_CH6_S 0 + +#define RMT_CH6CONF1_REG (DR_REG_RMT_BASE + 0x0054) +/* RMT_IDLE_OUT_EN_CH6 : R/W ;bitpos:[19] ;default: 1'b0 ; */ +/*description: This is the output enable control bit for channel6 in IDLE state.*/ +#define RMT_IDLE_OUT_EN_CH6 (BIT(19)) +#define RMT_IDLE_OUT_EN_CH6_M (BIT(19)) +#define RMT_IDLE_OUT_EN_CH6_V 0x1 +#define RMT_IDLE_OUT_EN_CH6_S 19 +/* RMT_IDLE_OUT_LV_CH6 : R/W ;bitpos:[18] ;default: 1'b0 ; */ +/*description: This bit configures the output signal's level for channel6 in IDLE state.*/ +#define RMT_IDLE_OUT_LV_CH6 (BIT(18)) +#define RMT_IDLE_OUT_LV_CH6_M (BIT(18)) +#define RMT_IDLE_OUT_LV_CH6_V 0x1 +#define RMT_IDLE_OUT_LV_CH6_S 18 +/* RMT_REF_ALWAYS_ON_CH6 : R/W ;bitpos:[17] ;default: 1'b0 ; */ +/*description: This bit is used to select base clock. 1'b1:clk_apb 1'b0:clk_ref*/ +#define RMT_REF_ALWAYS_ON_CH6 (BIT(17)) +#define RMT_REF_ALWAYS_ON_CH6_M (BIT(17)) +#define RMT_REF_ALWAYS_ON_CH6_V 0x1 +#define RMT_REF_ALWAYS_ON_CH6_S 17 +/* RMT_REF_CNT_RST_CH6 : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: This bit is used to reset divider in channel6.*/ +#define RMT_REF_CNT_RST_CH6 (BIT(16)) +#define RMT_REF_CNT_RST_CH6_M (BIT(16)) +#define RMT_REF_CNT_RST_CH6_V 0x1 +#define RMT_REF_CNT_RST_CH6_S 16 +/* RMT_RX_FILTER_THRES_CH6 : R/W ;bitpos:[15:8] ;default: 8'hf ; */ +/*description: in receive mode channel6 ignore input pulse when the pulse width + is smaller then this value.*/ +#define RMT_RX_FILTER_THRES_CH6 0x000000FF +#define RMT_RX_FILTER_THRES_CH6_M ((RMT_RX_FILTER_THRES_CH6_V)<<(RMT_RX_FILTER_THRES_CH6_S)) +#define RMT_RX_FILTER_THRES_CH6_V 0xFF +#define RMT_RX_FILTER_THRES_CH6_S 8 +/* RMT_RX_FILTER_EN_CH6 : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: This is the receive filter enable bit for channel6.*/ +#define RMT_RX_FILTER_EN_CH6 (BIT(7)) +#define RMT_RX_FILTER_EN_CH6_M (BIT(7)) +#define RMT_RX_FILTER_EN_CH6_V 0x1 +#define RMT_RX_FILTER_EN_CH6_S 7 +/* RMT_TX_CONTI_MODE_CH6 : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: Set this bit to continue sending from the first data to the + last data in channel6.*/ +#define RMT_TX_CONTI_MODE_CH6 (BIT(6)) +#define RMT_TX_CONTI_MODE_CH6_M (BIT(6)) +#define RMT_TX_CONTI_MODE_CH6_V 0x1 +#define RMT_TX_CONTI_MODE_CH6_S 6 +/* RMT_MEM_OWNER_CH6 : R/W ;bitpos:[5] ;default: 1'b1 ; */ +/*description: This is the mark of channel6's ram usage right.1'b1:receiver + uses the ram 0:transmitter uses the ram*/ +#define RMT_MEM_OWNER_CH6 (BIT(5)) +#define RMT_MEM_OWNER_CH6_M (BIT(5)) +#define RMT_MEM_OWNER_CH6_V 0x1 +#define RMT_MEM_OWNER_CH6_S 5 +/* RMT_APB_MEM_RST_CH6 : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: Set this bit to reset W/R ram address for channel6 by apb fifo access*/ +#define RMT_APB_MEM_RST_CH6 (BIT(4)) +#define RMT_APB_MEM_RST_CH6_M (BIT(4)) +#define RMT_APB_MEM_RST_CH6_V 0x1 +#define RMT_APB_MEM_RST_CH6_S 4 +/* RMT_MEM_RD_RST_CH6 : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: Set this bit to reset read ram address for channel6 by transmitter access.*/ +#define RMT_MEM_RD_RST_CH6 (BIT(3)) +#define RMT_MEM_RD_RST_CH6_M (BIT(3)) +#define RMT_MEM_RD_RST_CH6_V 0x1 +#define RMT_MEM_RD_RST_CH6_S 3 +/* RMT_MEM_WR_RST_CH6 : R/W ;bitpos:[2] ;default: 1'h0 ; */ +/*description: Set this bit to reset write ram address for channel6 by receiver access.*/ +#define RMT_MEM_WR_RST_CH6 (BIT(2)) +#define RMT_MEM_WR_RST_CH6_M (BIT(2)) +#define RMT_MEM_WR_RST_CH6_V 0x1 +#define RMT_MEM_WR_RST_CH6_S 2 +/* RMT_RX_EN_CH6 : R/W ;bitpos:[1] ;default: 1'h0 ; */ +/*description: Set this bit to enbale receving data for channel6.*/ +#define RMT_RX_EN_CH6 (BIT(1)) +#define RMT_RX_EN_CH6_M (BIT(1)) +#define RMT_RX_EN_CH6_V 0x1 +#define RMT_RX_EN_CH6_S 1 +/* RMT_TX_START_CH6 : R/W ;bitpos:[0] ;default: 1'h0 ; */ +/*description: Set this bit to start sending data for channel6.*/ +#define RMT_TX_START_CH6 (BIT(0)) +#define RMT_TX_START_CH6_M (BIT(0)) +#define RMT_TX_START_CH6_V 0x1 +#define RMT_TX_START_CH6_S 0 + +#define RMT_CH7CONF0_REG (DR_REG_RMT_BASE + 0x0058) +/* RMT_CARRIER_OUT_LV_CH7 : R/W ;bitpos:[29] ;default: 1'b1 ; */ +/*description: This bit is used to configure carrier wave's position for channel7.1'b1:add + on low level 1'b0:add on high level.*/ +#define RMT_CARRIER_OUT_LV_CH7 (BIT(29)) +#define RMT_CARRIER_OUT_LV_CH7_M (BIT(29)) +#define RMT_CARRIER_OUT_LV_CH7_V 0x1 +#define RMT_CARRIER_OUT_LV_CH7_S 29 +/* RMT_CARRIER_EN_CH7 : R/W ;bitpos:[28] ;default: 1'b1 ; */ +/*description: This is the carrier modulation enable control bit for channel7.*/ +#define RMT_CARRIER_EN_CH7 (BIT(28)) +#define RMT_CARRIER_EN_CH7_M (BIT(28)) +#define RMT_CARRIER_EN_CH7_V 0x1 +#define RMT_CARRIER_EN_CH7_S 28 +/* RMT_MEM_SIZE_CH7 : R/W ;bitpos:[27:24] ;default: 4'h1 ; */ +/*description: This register is used to configure the the amount of memory blocks + allocated to channel7.*/ +#define RMT_MEM_SIZE_CH7 0x0000000F +#define RMT_MEM_SIZE_CH7_M ((RMT_MEM_SIZE_CH7_V)<<(RMT_MEM_SIZE_CH7_S)) +#define RMT_MEM_SIZE_CH7_V 0xF +#define RMT_MEM_SIZE_CH7_S 24 +/* RMT_IDLE_THRES_CH7 : R/W ;bitpos:[23:8] ;default: 16'h1000 ; */ +/*description: In receive mode when the counter's value is bigger than reg_idle_thres_ch7 + then the receive process is done.*/ +#define RMT_IDLE_THRES_CH7 0x0000FFFF +#define RMT_IDLE_THRES_CH7_M ((RMT_IDLE_THRES_CH7_V)<<(RMT_IDLE_THRES_CH7_S)) +#define RMT_IDLE_THRES_CH7_V 0xFFFF +#define RMT_IDLE_THRES_CH7_S 8 +/* RMT_DIV_CNT_CH7 : R/W ;bitpos:[7:0] ;default: 8'h2 ; */ +/*description: This register is used to configure the frequency divider's factor in channel7.*/ +#define RMT_DIV_CNT_CH7 0x000000FF +#define RMT_DIV_CNT_CH7_M ((RMT_DIV_CNT_CH7_V)<<(RMT_DIV_CNT_CH7_S)) +#define RMT_DIV_CNT_CH7_V 0xFF +#define RMT_DIV_CNT_CH7_S 0 + +#define RMT_CH7CONF1_REG (DR_REG_RMT_BASE + 0x005c) +/* RMT_IDLE_OUT_EN_CH7 : R/W ;bitpos:[19] ;default: 1'b0 ; */ +/*description: This is the output enable control bit for channel6 in IDLE state.*/ +#define RMT_IDLE_OUT_EN_CH7 (BIT(19)) +#define RMT_IDLE_OUT_EN_CH7_M (BIT(19)) +#define RMT_IDLE_OUT_EN_CH7_V 0x1 +#define RMT_IDLE_OUT_EN_CH7_S 19 +/* RMT_IDLE_OUT_LV_CH7 : R/W ;bitpos:[18] ;default: 1'b0 ; */ +/*description: This bit configures the output signal's level for channel7 in IDLE state.*/ +#define RMT_IDLE_OUT_LV_CH7 (BIT(18)) +#define RMT_IDLE_OUT_LV_CH7_M (BIT(18)) +#define RMT_IDLE_OUT_LV_CH7_V 0x1 +#define RMT_IDLE_OUT_LV_CH7_S 18 +/* RMT_REF_ALWAYS_ON_CH7 : R/W ;bitpos:[17] ;default: 1'b0 ; */ +/*description: This bit is used to select base clock. 1'b1:clk_apb 1'b0:clk_ref*/ +#define RMT_REF_ALWAYS_ON_CH7 (BIT(17)) +#define RMT_REF_ALWAYS_ON_CH7_M (BIT(17)) +#define RMT_REF_ALWAYS_ON_CH7_V 0x1 +#define RMT_REF_ALWAYS_ON_CH7_S 17 +/* RMT_REF_CNT_RST_CH7 : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: This bit is used to reset divider in channel7.*/ +#define RMT_REF_CNT_RST_CH7 (BIT(16)) +#define RMT_REF_CNT_RST_CH7_M (BIT(16)) +#define RMT_REF_CNT_RST_CH7_V 0x1 +#define RMT_REF_CNT_RST_CH7_S 16 +/* RMT_RX_FILTER_THRES_CH7 : R/W ;bitpos:[15:8] ;default: 8'hf ; */ +/*description: in receive mode channel7 ignore input pulse when the pulse width + is smaller then this value.*/ +#define RMT_RX_FILTER_THRES_CH7 0x000000FF +#define RMT_RX_FILTER_THRES_CH7_M ((RMT_RX_FILTER_THRES_CH7_V)<<(RMT_RX_FILTER_THRES_CH7_S)) +#define RMT_RX_FILTER_THRES_CH7_V 0xFF +#define RMT_RX_FILTER_THRES_CH7_S 8 +/* RMT_RX_FILTER_EN_CH7 : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: This is the receive filter enable bit for channel7.*/ +#define RMT_RX_FILTER_EN_CH7 (BIT(7)) +#define RMT_RX_FILTER_EN_CH7_M (BIT(7)) +#define RMT_RX_FILTER_EN_CH7_V 0x1 +#define RMT_RX_FILTER_EN_CH7_S 7 +/* RMT_TX_CONTI_MODE_CH7 : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: Set this bit to continue sending from the first data to the + last data in channel7.*/ +#define RMT_TX_CONTI_MODE_CH7 (BIT(6)) +#define RMT_TX_CONTI_MODE_CH7_M (BIT(6)) +#define RMT_TX_CONTI_MODE_CH7_V 0x1 +#define RMT_TX_CONTI_MODE_CH7_S 6 +/* RMT_MEM_OWNER_CH7 : R/W ;bitpos:[5] ;default: 1'b1 ; */ +/*description: This is the mark of channel7's ram usage right.1'b1:receiver + uses the ram 0:transmitter uses the ram*/ +#define RMT_MEM_OWNER_CH7 (BIT(5)) +#define RMT_MEM_OWNER_CH7_M (BIT(5)) +#define RMT_MEM_OWNER_CH7_V 0x1 +#define RMT_MEM_OWNER_CH7_S 5 +/* RMT_APB_MEM_RST_CH7 : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: Set this bit to reset W/R ram address for channel7 by apb fifo access*/ +#define RMT_APB_MEM_RST_CH7 (BIT(4)) +#define RMT_APB_MEM_RST_CH7_M (BIT(4)) +#define RMT_APB_MEM_RST_CH7_V 0x1 +#define RMT_APB_MEM_RST_CH7_S 4 +/* RMT_MEM_RD_RST_CH7 : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: Set this bit to reset read ram address for channel7 by transmitter access.*/ +#define RMT_MEM_RD_RST_CH7 (BIT(3)) +#define RMT_MEM_RD_RST_CH7_M (BIT(3)) +#define RMT_MEM_RD_RST_CH7_V 0x1 +#define RMT_MEM_RD_RST_CH7_S 3 +/* RMT_MEM_WR_RST_CH7 : R/W ;bitpos:[2] ;default: 1'h0 ; */ +/*description: Set this bit to reset write ram address for channel7 by receiver access.*/ +#define RMT_MEM_WR_RST_CH7 (BIT(2)) +#define RMT_MEM_WR_RST_CH7_M (BIT(2)) +#define RMT_MEM_WR_RST_CH7_V 0x1 +#define RMT_MEM_WR_RST_CH7_S 2 +/* RMT_RX_EN_CH7 : R/W ;bitpos:[1] ;default: 1'h0 ; */ +/*description: Set this bit to enbale receving data for channel7.*/ +#define RMT_RX_EN_CH7 (BIT(1)) +#define RMT_RX_EN_CH7_M (BIT(1)) +#define RMT_RX_EN_CH7_V 0x1 +#define RMT_RX_EN_CH7_S 1 +/* RMT_TX_START_CH7 : R/W ;bitpos:[0] ;default: 1'h0 ; */ +/*description: Set this bit to start sending data for channel7.*/ +#define RMT_TX_START_CH7 (BIT(0)) +#define RMT_TX_START_CH7_M (BIT(0)) +#define RMT_TX_START_CH7_V 0x1 +#define RMT_TX_START_CH7_S 0 + +#define RMT_CH0STATUS_REG (DR_REG_RMT_BASE + 0x0060) +/* RMT_STATUS_CH0 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: The status for channel0*/ +#define RMT_STATUS_CH0 0xFFFFFFFF +#define RMT_STATUS_CH0_M ((RMT_STATUS_CH0_V)<<(RMT_STATUS_CH0_S)) +#define RMT_STATUS_CH0_V 0xFFFFFFFF +#define RMT_STATUS_CH0_S 0 +/* RMT_APB_MEM_RD_ERR_CH0 : RO ;bitpos:[31] ;default: 1'b0 ; */ +/*description: The apb read memory status bit for channel0 turns to + high level when the apb read address exceeds the configuration range.*/ +#define RMT_APB_MEM_RD_ERR_CH0 (BIT(31)) +#define RMT_APB_MEM_RD_ERR_CH0_M ((RMT_APB_MEM_RD_ERR_CH0_V)<<(RMT_APB_MEM_RD_ERR_CH0_S)) +#define RMT_APB_MEM_RD_ERR_CH0_V 0x1 +#define RMT_APB_MEM_RD_ERR_CH0_S 31 +/* RMT_APB_MEM_WR_ERR_CH0 : RO ;bitpos:[30] ;default: 1'b0 ; */ +/*description: The apb write memory status bit for channel0 turns to + high level when the apb write address exceeds the configuration range.*/ +#define RMT_APB_MEM_WR_ERR_CH0 (BIT(30)) +#define RMT_APB_MEM_WR_ERR_CH0_M ((RMT_APB_MEM_WR_ERR_CH0_V)<<(RMT_APB_MEM_WR_ERR_CH0_S)) +#define RMT_APB_MEM_WR_ERR_CH0_V 0x1 +#define RMT_APB_MEM_WR_ERR_CH0_S 30 +/* RMT_MEM_EMPTY_CH0 : RO ;bitpos:[29] ;default: 1'b0 ; */ +/*description: The memory empty status bit for channel0. in acyclic mode, + this bit turns to high level when mem_raddr_ex is greater than or equal to the configured range.*/ +#define RMT_MEM_EMPTY_CH0 (BIT(29)) +#define RMT_MEM_EMPTY_CH0_M ((RMT_MEM_EMPTY_CH0_V)<<(RMT_MEM_EMPTY_CH0_S)) +#define RMT_MEM_EMPTY_CH0_V 0x1 +#define RMT_MEM_EMPTY_CH0_S 29 +/* RMT_MEM_FULL_CH0 : RO ;bitpos:[28] ;default: 1'b0 ; */ +/*description: The memory full status bit for channel0 turns to high level + when mem_waddr_ex is greater than or equal to the configuration range.*/ +#define RMT_MEM_FULL_CH0 (BIT(28)) +#define RMT_MEM_FULL_CH0_M ((RMT_MEM_FULL_CH0_V)<<(RMT_MEM_FULL_CH0_S)) +#define RMT_MEM_FULL_CH0_V 0x1 +#define RMT_MEM_FULL_CH0_S 28 +/* RMT_MEM_OWNER_ERR_CH0 : RO ;bitpos:[27] ;default: 1'b0 ; */ +/*description: When channel0 is configured for receive mode, this bit will turn to high level + if rmt_mem_owner register is not set to 1.*/ +#define RMT_MEM_OWNER_ERR_CH0 (BIT(27)) +#define RMT_MEM_OWNER_ERR_CH0_M ((RMT_MEM_OWNER_ERR_CH0_V)<<(RMT_MEM_OWNER_ERR_CH0_S)) +#define RMT_MEM_OWNER_ERR_CH0_V 0x1 +#define RMT_MEM_OWNER_ERR_CH0_S 27 +/* RMT_STATE_CH0 : RO ;bitpos:[26:24] ;default: 3'h0 ; */ +/*description: The channel0 state machine status register. +3'h0 : idle, 3'h1 : send, 3'h2 : read memory, 3'h3 : receive, 3'h4 : wait.*/ +#define RMT_STATE_CH0 0x07000000 +#define RMT_STATE_CH0_M ((RMT_STATE_CH0_V)<<(RMT_STATE_CH0_S)) +#define RMT_STATE_CH0_V 0x7 +#define RMT_STATE_CH0_S 24 +/* RMT_MEM_RADDR_EX_CH0 : RO ;bitpos:[21:12] ;default: 10'h0 ; */ +/*description: The current memory write address of channel0.*/ +#define RMT_MEM_RADDR_EX_CH0 0x003ff000 +#define RMT_MEM_RADDR_EX_CH0_M ((RMT_MEM_RADDR_EX_CH0_V)<<(RMT_MEM_RADDR_EX_CH0_S)) +#define RMT_MEM_RADDR_EX_CH0_V 0x3ff +#define RMT_MEM_RADDR_EX_CH0_S 12 +/* RMT_MEM_WADDR_EX_CH0 : RO ;bitpos:[9:0] ;default: 10'h0 ; */ +/*description: The current memory read address of channel0.*/ +#define RMT_MEM_WADDR_EX_CH0 0x000003ff +#define RMT_MEM_WADDR_EX_CH0_M ((RMT_MEM_WADDR_EX_CH0_V)<<(RMT_MEM_WADDR_EX_CH0_S)) +#define RMT_MEM_WADDR_EX_CH0_V 0x3ff +#define RMT_MEM_WADDR_EX_CH0_S 0 + +#define RMT_CH1STATUS_REG (DR_REG_RMT_BASE + 0x0064) +/* RMT_STATUS_CH1 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: The status for channel1*/ +#define RMT_STATUS_CH1 0xFFFFFFFF +#define RMT_STATUS_CH1_M ((RMT_STATUS_CH1_V)<<(RMT_STATUS_CH1_S)) +#define RMT_STATUS_CH1_V 0xFFFFFFFF +#define RMT_STATUS_CH1_S 0 +/* RMT_APB_MEM_RD_ERR_CH1 : RO ;bitpos:[31] ;default: 1'b0 ; */ +/*description: The apb read memory status bit for channel1 turns to + high level when the apb read address exceeds the configuration range.*/ +#define RMT_APB_MEM_RD_ERR_CH1 (BIT(31)) +#define RMT_APB_MEM_RD_ERR_CH1_M ((RMT_APB_MEM_RD_ERR_CH1_V)<<(RMT_APB_MEM_RD_ERR_CH1_S)) +#define RMT_APB_MEM_RD_ERR_CH1_V 0x1 +#define RMT_APB_MEM_RD_ERR_CH1_S 31 +/* RMT_APB_MEM_WR_ERR_CH1 : RO ;bitpos:[30] ;default: 1'b0 ; */ +/*description: The apb write memory status bit for channel1 turns to + high level when the apb write address exceeds the configuration range.*/ +#define RMT_APB_MEM_WR_ERR_CH1 (BIT(30)) +#define RMT_APB_MEM_WR_ERR_CH1_M ((RMT_APB_MEM_WR_ERR_CH1_V)<<(RMT_APB_MEM_WR_ERR_CH1_S)) +#define RMT_APB_MEM_WR_ERR_CH1_V 0x1 +#define RMT_APB_MEM_WR_ERR_CH1_S 30 +/* RMT_MEM_EMPTY_CH1 : RO ;bitpos:[29] ;default: 1'b0 ; */ +/*description: The memory empty status bit for channel1. in acyclic mode, + this bit turns to high level when mem_raddr_ex is greater than or equal to the configured range.*/ +#define RMT_MEM_EMPTY_CH1 (BIT(29)) +#define RMT_MEM_EMPTY_CH1_M ((RMT_MEM_EMPTY_CH1_V)<<(RMT_MEM_EMPTY_CH1_S)) +#define RMT_MEM_EMPTY_CH1_V 0x1 +#define RMT_MEM_EMPTY_CH1_S 29 +/* RMT_MEM_FULL_CH1 : RO ;bitpos:[28] ;default: 1'b0 ; */ +/*description: The memory full status bit for channel1 turns to high level + when mem_waddr_ex is greater than or equal to the configuration range.*/ +#define RMT_MEM_FULL_CH1 (BIT(28)) +#define RMT_MEM_FULL_CH1_M ((RMT_MEM_FULL_CH1_V)<<(RMT_MEM_FULL_CH1_S)) +#define RMT_MEM_FULL_CH1_V 0x1 +#define RMT_MEM_FULL_CH1_S 28 +/* RMT_MEM_OWNER_ERR_CH1 : RO ;bitpos:[27] ;default: 1'b0 ; */ +/*description: When channel1 is configured for receive mode, this bit will turn to high level + if rmt_mem_owner register is not set to 1.*/ +#define RMT_MEM_OWNER_ERR_CH1 (BIT(27)) +#define RMT_MEM_OWNER_ERR_CH1_M ((RMT_MEM_OWNER_ERR_CH1_V)<<(RMT_MEM_OWNER_ERR_CH1_S)) +#define RMT_MEM_OWNER_ERR_CH1_V 0x1 +#define RMT_MEM_OWNER_ERR_CH1_S 27 +/* RMT_STATE_CH1 : RO ;bitpos:[26:24] ;default: 3'h0 ; */ +/*description: The channel1 state machine status register. +3'h0 : idle, 3'h1 : send, 3'h2 : read memory, 3'h3 : receive, 3'h4 : wait.*/ +#define RMT_STATE_CH1 0x07000000 +#define RMT_STATE_CH1_M ((RMT_STATE_CH1_V)<<(RMT_STATE_CH1_S)) +#define RMT_STATE_CH1_V 0x7 +#define RMT_STATE_CH1_S 24 +/* RMT_MEM_RADDR_EX_CH1 : RO ;bitpos:[21:12] ;default: 10'h0 ; */ +/*description: The current memory write address of channel1.*/ +#define RMT_MEM_RADDR_EX_CH1 0x003ff000 +#define RMT_MEM_RADDR_EX_CH1_M ((RMT_MEM_RADDR_EX_CH1_V)<<(RMT_MEM_RADDR_EX_CH1_S)) +#define RMT_MEM_RADDR_EX_CH1_V 0x3ff +#define RMT_MEM_RADDR_EX_CH1_S 12 +/* RMT_MEM_WADDR_EX_CH1 : RO ;bitpos:[9:0] ;default: 10'h0 ; */ +/*description: The current memory read address of channel1.*/ +#define RMT_MEM_WADDR_EX_CH1 0x000003ff +#define RMT_MEM_WADDR_EX_CH1_M ((RMT_MEM_WADDR_EX_CH1_V)<<(RMT_MEM_WADDR_EX_CH1_S)) +#define RMT_MEM_WADDR_EX_CH1_V 0x3ff +#define RMT_MEM_WADDR_EX_CH1_S 0 + +#define RMT_CH2STATUS_REG (DR_REG_RMT_BASE + 0x0068) +/* RMT_STATUS_CH2 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: The status for channel2*/ +#define RMT_STATUS_CH2 0xFFFFFFFF +#define RMT_STATUS_CH2_M ((RMT_STATUS_CH2_V)<<(RMT_STATUS_CH2_S)) +#define RMT_STATUS_CH2_V 0xFFFFFFFF +#define RMT_STATUS_CH2_S 0 +/* RMT_APB_MEM_RD_ERR_CH2 : RO ;bitpos:[31] ;default: 1'b0 ; */ +/*description: The apb read memory status bit for channel2 turns to + high level when the apb read address exceeds the configuration range.*/ +#define RMT_APB_MEM_RD_ERR_CH2 (BIT(31)) +#define RMT_APB_MEM_RD_ERR_CH2_M ((RMT_APB_MEM_RD_ERR_CH2_V)<<(RMT_APB_MEM_RD_ERR_CH2_S)) +#define RMT_APB_MEM_RD_ERR_CH2_V 0x1 +#define RMT_APB_MEM_RD_ERR_CH2_S 31 +/* RMT_APB_MEM_WR_ERR_CH2 : RO ;bitpos:[30] ;default: 1'b0 ; */ +/*description: The apb write memory status bit for channel2 turns to + high level when the apb write address exceeds the configuration range.*/ +#define RMT_APB_MEM_WR_ERR_CH2 (BIT(30)) +#define RMT_APB_MEM_WR_ERR_CH2_M ((RMT_APB_MEM_WR_ERR_CH2_V)<<(RMT_APB_MEM_WR_ERR_CH2_S)) +#define RMT_APB_MEM_WR_ERR_CH2_V 0x1 +#define RMT_APB_MEM_WR_ERR_CH2_S 30 +/* RMT_MEM_EMPTY_CH2 : RO ;bitpos:[29] ;default: 1'b0 ; */ +/*description: The memory empty status bit for channel2. in acyclic mode, + this bit turns to high level when mem_raddr_ex is greater than or equal to the configured range.*/ +#define RMT_MEM_EMPTY_CH2 (BIT(29)) +#define RMT_MEM_EMPTY_CH2_M ((RMT_MEM_EMPTY_CH2_V)<<(RMT_MEM_EMPTY_CH2_S)) +#define RMT_MEM_EMPTY_CH2_V 0x1 +#define RMT_MEM_EMPTY_CH2_S 29 +/* RMT_MEM_FULL_CH2 : RO ;bitpos:[28] ;default: 1'b0 ; */ +/*description: The memory full status bit for channel2 turns to high level + when mem_waddr_ex is greater than or equal to the configuration range.*/ +#define RMT_MEM_FULL_CH2 (BIT(28)) +#define RMT_MEM_FULL_CH2_M ((RMT_MEM_FULL_CH2_V)<<(RMT_MEM_FULL_CH2_S)) +#define RMT_MEM_FULL_CH2_V 0x1 +#define RMT_MEM_FULL_CH2_S 28 +/* RMT_MEM_OWNER_ERR_CH2 : RO ;bitpos:[27] ;default: 1'b0 ; */ +/*description: When channel2 is configured for receive mode, this bit will turn to high level + if rmt_mem_owner register is not set to 1.*/ +#define RMT_MEM_OWNER_ERR_CH2 (BIT(27)) +#define RMT_MEM_OWNER_ERR_CH2_M ((RMT_MEM_OWNER_ERR_CH2_V)<<(RMT_MEM_OWNER_ERR_CH2_S)) +#define RMT_MEM_OWNER_ERR_CH2_V 0x1 +#define RMT_MEM_OWNER_ERR_CH2_S 27 +/* RMT_STATE_CH2 : RO ;bitpos:[26:24] ;default: 3'h0 ; */ +/*description: The channel2 state machine status register. +3'h0 : idle, 3'h1 : send, 3'h2 : read memory, 3'h3 : receive, 3'h4 : wait.*/ +#define RMT_STATE_CH2 0x07000000 +#define RMT_STATE_CH2_M ((RMT_STATE_CH2_V)<<(RMT_STATE_CH2_S)) +#define RMT_STATE_CH2_V 0x7 +#define RMT_STATE_CH2_S 24 +/* RMT_MEM_RADDR_EX_CH2 : RO ;bitpos:[21:12] ;default: 10'h0 ; */ +/*description: The current memory write address of channel2.*/ +#define RMT_MEM_RADDR_EX_CH2 0x003ff000 +#define RMT_MEM_RADDR_EX_CH2_M ((RMT_MEM_RADDR_EX_CH2_V)<<(RMT_MEM_RADDR_EX_CH2_S)) +#define RMT_MEM_RADDR_EX_CH2_V 0x3ff +#define RMT_MEM_RADDR_EX_CH2_S 12 +/* RMT_MEM_WADDR_EX_CH2 : RO ;bitpos:[9:0] ;default: 10'h0 ; */ +/*description: The current memory read address of channel2.*/ +#define RMT_MEM_WADDR_EX_CH2 0x000003ff +#define RMT_MEM_WADDR_EX_CH2_M ((RMT_MEM_WADDR_EX_CH2_V)<<(RMT_MEM_WADDR_EX_CH2_S)) +#define RMT_MEM_WADDR_EX_CH2_V 0x3ff +#define RMT_MEM_WADDR_EX_CH2_S 0 + +#define RMT_CH3STATUS_REG (DR_REG_RMT_BASE + 0x006c) +/* RMT_STATUS_CH3 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: The status for channel3*/ +#define RMT_STATUS_CH3 0xFFFFFFFF +#define RMT_STATUS_CH3_M ((RMT_STATUS_CH3_V)<<(RMT_STATUS_CH3_S)) +#define RMT_STATUS_CH3_V 0xFFFFFFFF +#define RMT_STATUS_CH3_S 0 +/* RMT_APB_MEM_RD_ERR_CH3 : RO ;bitpos:[31] ;default: 1'b0 ; */ +/*description: The apb read memory status bit for channel3 turns to + high level when the apb read address exceeds the configuration range.*/ +#define RMT_APB_MEM_RD_ERR_CH3 (BIT(31)) +#define RMT_APB_MEM_RD_ERR_CH3_M ((RMT_APB_MEM_RD_ERR_CH3_V)<<(RMT_APB_MEM_RD_ERR_CH3_S)) +#define RMT_APB_MEM_RD_ERR_CH3_V 0x1 +#define RMT_APB_MEM_RD_ERR_CH3_S 31 +/* RMT_APB_MEM_WR_ERR_CH3 : RO ;bitpos:[30] ;default: 1'b0 ; */ +/*description: The apb write memory status bit for channel3 turns to + high level when the apb write address exceeds the configuration range.*/ +#define RMT_APB_MEM_WR_ERR_CH3 (BIT(30)) +#define RMT_APB_MEM_WR_ERR_CH3_M ((RMT_APB_MEM_WR_ERR_CH3_V)<<(RMT_APB_MEM_WR_ERR_CH3_S)) +#define RMT_APB_MEM_WR_ERR_CH3_V 0x1 +#define RMT_APB_MEM_WR_ERR_CH3_S 30 +/* RMT_MEM_EMPTY_CH3 : RO ;bitpos:[29] ;default: 1'b0 ; */ +/*description: The memory empty status bit for channel3. in acyclic mode, + this bit turns to high level when mem_raddr_ex is greater than or equal to the configured range.*/ +#define RMT_MEM_EMPTY_CH3 (BIT(29)) +#define RMT_MEM_EMPTY_CH3_M ((RMT_MEM_EMPTY_CH3_V)<<(RMT_MEM_EMPTY_CH3_S)) +#define RMT_MEM_EMPTY_CH3_V 0x1 +#define RMT_MEM_EMPTY_CH3_S 29 +/* RMT_MEM_FULL_CH3 : RO ;bitpos:[28] ;default: 1'b0 ; */ +/*description: The memory full status bit for channel3 turns to high level + when mem_waddr_ex is greater than or equal to the configuration range.*/ +#define RMT_MEM_FULL_CH3 (BIT(28)) +#define RMT_MEM_FULL_CH3_M ((RMT_MEM_FULL_CH3_V)<<(RMT_MEM_FULL_CH3_S)) +#define RMT_MEM_FULL_CH3_V 0x1 +#define RMT_MEM_FULL_CH3_S 28 +/* RMT_MEM_OWNER_ERR_CH3 : RO ;bitpos:[27] ;default: 1'b0 ; */ +/*description: When channel3 is configured for receive mode, this bit will turn to high level + if rmt_mem_owner register is not set to 1.*/ +#define RMT_MEM_OWNER_ERR_CH3 (BIT(27)) +#define RMT_MEM_OWNER_ERR_CH3_M ((RMT_MEM_OWNER_ERR_CH3_V)<<(RMT_MEM_OWNER_ERR_CH3_S)) +#define RMT_MEM_OWNER_ERR_CH3_V 0x1 +#define RMT_MEM_OWNER_ERR_CH3_S 27 +/* RMT_STATE_CH3 : RO ;bitpos:[26:24] ;default: 3'h0 ; */ +/*description: The channel3 state machine status register. +3'h0 : idle, 3'h1 : send, 3'h2 : read memory, 3'h3 : receive, 3'h4 : wait.*/ +#define RMT_STATE_CH3 0x07000000 +#define RMT_STATE_CH3_M ((RMT_STATE_CH3_V)<<(RMT_STATE_CH3_S)) +#define RMT_STATE_CH3_V 0x7 +#define RMT_STATE_CH3_S 24 +/* RMT_MEM_RADDR_EX_CH3 : RO ;bitpos:[21:12] ;default: 10'h0 ; */ +/*description: The current memory write address of channel3.*/ +#define RMT_MEM_RADDR_EX_CH3 0x003ff000 +#define RMT_MEM_RADDR_EX_CH3_M ((RMT_MEM_RADDR_EX_CH3_V)<<(RMT_MEM_RADDR_EX_CH3_S)) +#define RMT_MEM_RADDR_EX_CH3_V 0x3ff +#define RMT_MEM_RADDR_EX_CH3_S 12 +/* RMT_MEM_WADDR_EX_CH3 : RO ;bitpos:[9:0] ;default: 10'h0 ; */ +/*description: The current memory read address of channel3.*/ +#define RMT_MEM_WADDR_EX_CH3 0x000003ff +#define RMT_MEM_WADDR_EX_CH3_M ((RMT_MEM_WADDR_EX_CH3_V)<<(RMT_MEM_WADDR_EX_CH3_S)) +#define RMT_MEM_WADDR_EX_CH3_V 0x3ff +#define RMT_MEM_WADDR_EX_CH3_S 0 + +#define RMT_CH4STATUS_REG (DR_REG_RMT_BASE + 0x0070) +/* RMT_STATUS_CH4 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: The status for channel4*/ +#define RMT_STATUS_CH4 0xFFFFFFFF +#define RMT_STATUS_CH4_M ((RMT_STATUS_CH4_V)<<(RMT_STATUS_CH4_S)) +#define RMT_STATUS_CH4_V 0xFFFFFFFF +#define RMT_STATUS_CH4_S 0 +/* RMT_APB_MEM_RD_ERR_CH4 : RO ;bitpos:[31] ;default: 1'b0 ; */ +/*description: The apb read memory status bit for channel4 turns to + high level when the apb read address exceeds the configuration range.*/ +#define RMT_APB_MEM_RD_ERR_CH4 (BIT(31)) +#define RMT_APB_MEM_RD_ERR_CH4_M ((RMT_APB_MEM_RD_ERR_CH4_V)<<(RMT_APB_MEM_RD_ERR_CH4_S)) +#define RMT_APB_MEM_RD_ERR_CH4_V 0x1 +#define RMT_APB_MEM_RD_ERR_CH4_S 31 +/* RMT_APB_MEM_WR_ERR_CH4 : RO ;bitpos:[30] ;default: 1'b0 ; */ +/*description: The apb write memory status bit for channel4 turns to + high level when the apb write address exceeds the configuration range.*/ +#define RMT_APB_MEM_WR_ERR_CH4 (BIT(30)) +#define RMT_APB_MEM_WR_ERR_CH4_M ((RMT_APB_MEM_WR_ERR_CH4_V)<<(RMT_APB_MEM_WR_ERR_CH4_S)) +#define RMT_APB_MEM_WR_ERR_CH4_V 0x1 +#define RMT_APB_MEM_WR_ERR_CH4_S 30 +/* RMT_MEM_EMPTY_CH4 : RO ;bitpos:[29] ;default: 1'b0 ; */ +/*description: The memory empty status bit for channel4. in acyclic mode, + this bit turns to high level when mem_raddr_ex is greater than or equal to the configured range.*/ +#define RMT_MEM_EMPTY_CH4 (BIT(29)) +#define RMT_MEM_EMPTY_CH4_M ((RMT_MEM_EMPTY_CH4_V)<<(RMT_MEM_EMPTY_CH4_S)) +#define RMT_MEM_EMPTY_CH4_V 0x1 +#define RMT_MEM_EMPTY_CH4_S 29 +/* RMT_MEM_FULL_CH4 : RO ;bitpos:[28] ;default: 1'b0 ; */ +/*description: The memory full status bit for channel4 turns to high level + when mem_waddr_ex is greater than or equal to the configuration range.*/ +#define RMT_MEM_FULL_CH4 (BIT(28)) +#define RMT_MEM_FULL_CH4_M ((RMT_MEM_FULL_CH4_V)<<(RMT_MEM_FULL_CH4_S)) +#define RMT_MEM_FULL_CH4_V 0x1 +#define RMT_MEM_FULL_CH4_S 28 +/* RMT_MEM_OWNER_ERR_CH4 : RO ;bitpos:[27] ;default: 1'b0 ; */ +/*description: When channel4 is configured for receive mode, this bit will turn to high level + if rmt_mem_owner register is not set to 1.*/ +#define RMT_MEM_OWNER_ERR_CH4 (BIT(27)) +#define RMT_MEM_OWNER_ERR_CH4_M ((RMT_MEM_OWNER_ERR_CH4_V)<<(RMT_MEM_OWNER_ERR_CH4_S)) +#define RMT_MEM_OWNER_ERR_CH4_V 0x1 +#define RMT_MEM_OWNER_ERR_CH4_S 27 +/* RMT_STATE_CH4 : RO ;bitpos:[26:24] ;default: 3'h0 ; */ +/*description: The channel4 state machine status register. +3'h0 : idle, 3'h1 : send, 3'h2 : read memory, 3'h3 : receive, 3'h4 : wait.*/ +#define RMT_STATE_CH4 0x07000000 +#define RMT_STATE_CH4_M ((RMT_STATE_CH4_V)<<(RMT_STATE_CH4_S)) +#define RMT_STATE_CH4_V 0x7 +#define RMT_STATE_CH4_S 24 +/* RMT_MEM_RADDR_EX_CH4 : RO ;bitpos:[21:12] ;default: 10'h0 ; */ +/*description: The current memory write address of channel4.*/ +#define RMT_MEM_RADDR_EX_CH4 0x003ff000 +#define RMT_MEM_RADDR_EX_CH4_M ((RMT_MEM_RADDR_EX_CH4_V)<<(RMT_MEM_RADDR_EX_CH4_S)) +#define RMT_MEM_RADDR_EX_CH4_V 0x3ff +#define RMT_MEM_RADDR_EX_CH4_S 12 +/* RMT_MEM_WADDR_EX_CH4 : RO ;bitpos:[9:0] ;default: 10'h0 ; */ +/*description: The current memory read address of channel4.*/ +#define RMT_MEM_WADDR_EX_CH4 0x000003ff +#define RMT_MEM_WADDR_EX_CH4_M ((RMT_MEM_WADDR_EX_CH4_V)<<(RMT_MEM_WADDR_EX_CH4_S)) +#define RMT_MEM_WADDR_EX_CH4_V 0x3ff +#define RMT_MEM_WADDR_EX_CH4_S 0 + +#define RMT_CH5STATUS_REG (DR_REG_RMT_BASE + 0x0074) +/* RMT_STATUS_CH5 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: The status for channel5*/ +#define RMT_STATUS_CH5 0xFFFFFFFF +#define RMT_STATUS_CH5_M ((RMT_STATUS_CH5_V)<<(RMT_STATUS_CH5_S)) +#define RMT_STATUS_CH5_V 0xFFFFFFFF +#define RMT_STATUS_CH5_S 0 +/* RMT_APB_MEM_RD_ERR_CH5 : RO ;bitpos:[31] ;default: 1'b0 ; */ +/*description: The apb read memory status bit for channel5 turns to + high level when the apb read address exceeds the configuration range.*/ +#define RMT_APB_MEM_RD_ERR_CH5 (BIT(31)) +#define RMT_APB_MEM_RD_ERR_CH5_M ((RMT_APB_MEM_RD_ERR_CH5_V)<<(RMT_APB_MEM_RD_ERR_CH5_S)) +#define RMT_APB_MEM_RD_ERR_CH5_V 0x1 +#define RMT_APB_MEM_RD_ERR_CH5_S 31 +/* RMT_APB_MEM_WR_ERR_CH5 : RO ;bitpos:[30] ;default: 1'b0 ; */ +/*description: The apb write memory status bit for channel5 turns to + high level when the apb write address exceeds the configuration range.*/ +#define RMT_APB_MEM_WR_ERR_CH5 (BIT(30)) +#define RMT_APB_MEM_WR_ERR_CH5_M ((RMT_APB_MEM_WR_ERR_CH5_V)<<(RMT_APB_MEM_WR_ERR_CH5_S)) +#define RMT_APB_MEM_WR_ERR_CH5_V 0x1 +#define RMT_APB_MEM_WR_ERR_CH5_S 30 +/* RMT_MEM_EMPTY_CH5 : RO ;bitpos:[29] ;default: 1'b0 ; */ +/*description: The memory empty status bit for channel5. in acyclic mode, + this bit turns to high level when mem_raddr_ex is greater than or equal to the configured range.*/ +#define RMT_MEM_EMPTY_CH5 (BIT(29)) +#define RMT_MEM_EMPTY_CH5_M ((RMT_MEM_EMPTY_CH5_V)<<(RMT_MEM_EMPTY_CH5_S)) +#define RMT_MEM_EMPTY_CH5_V 0x1 +#define RMT_MEM_EMPTY_CH5_S 29 +/* RMT_MEM_FULL_CH5 : RO ;bitpos:[28] ;default: 1'b0 ; */ +/*description: The memory full status bit for channel5 turns to high level + when mem_waddr_ex is greater than or equal to the configuration range.*/ +#define RMT_MEM_FULL_CH5 (BIT(28)) +#define RMT_MEM_FULL_CH5_M ((RMT_MEM_FULL_CH5_V)<<(RMT_MEM_FULL_CH5_S)) +#define RMT_MEM_FULL_CH5_V 0x1 +#define RMT_MEM_FULL_CH5_S 28 +/* RMT_MEM_OWNER_ERR_CH5 : RO ;bitpos:[27] ;default: 1'b0 ; */ +/*description: When channel5 is configured for receive mode, this bit will turn to high level + if rmt_mem_owner register is not set to 1.*/ +#define RMT_MEM_OWNER_ERR_CH5 (BIT(27)) +#define RMT_MEM_OWNER_ERR_CH5_M ((RMT_MEM_OWNER_ERR_CH5_V)<<(RMT_MEM_OWNER_ERR_CH5_S)) +#define RMT_MEM_OWNER_ERR_CH5_V 0x1 +#define RMT_MEM_OWNER_ERR_CH5_S 27 +/* RMT_STATE_CH5 : RO ;bitpos:[26:24] ;default: 3'h0 ; */ +/*description: The channel5 state machine status register. +3'h0 : idle, 3'h1 : send, 3'h2 : read memory, 3'h3 : receive, 3'h4 : wait.*/ +#define RMT_STATE_CH5 0x07000000 +#define RMT_STATE_CH5_M ((RMT_STATE_CH5_V)<<(RMT_STATE_CH5_S)) +#define RMT_STATE_CH5_V 0x7 +#define RMT_STATE_CH5_S 24 +/* RMT_MEM_RADDR_EX_CH5 : RO ;bitpos:[21:12] ;default: 10'h0 ; */ +/*description: The current memory write address of channel5.*/ +#define RMT_MEM_RADDR_EX_CH5 0x003ff000 +#define RMT_MEM_RADDR_EX_CH5_M ((RMT_MEM_RADDR_EX_CH5_V)<<(RMT_MEM_RADDR_EX_CH5_S)) +#define RMT_MEM_RADDR_EX_CH5_V 0x3ff +#define RMT_MEM_RADDR_EX_CH5_S 12 +/* RMT_MEM_WADDR_EX_CH5 : RO ;bitpos:[9:0] ;default: 10'h0 ; */ +/*description: The current memory read address of channel5.*/ +#define RMT_MEM_WADDR_EX_CH5 0x000003ff +#define RMT_MEM_WADDR_EX_CH5_M ((RMT_MEM_WADDR_EX_CH5_V)<<(RMT_MEM_WADDR_EX_CH5_S)) +#define RMT_MEM_WADDR_EX_CH5_V 0x3ff +#define RMT_MEM_WADDR_EX_CH5_S 0 + +#define RMT_CH6STATUS_REG (DR_REG_RMT_BASE + 0x0078) +/* RMT_STATUS_CH6 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: The status for channel6*/ +#define RMT_STATUS_CH6 0xFFFFFFFF +#define RMT_STATUS_CH6_M ((RMT_STATUS_CH6_V)<<(RMT_STATUS_CH6_S)) +#define RMT_STATUS_CH6_V 0xFFFFFFFF +#define RMT_STATUS_CH6_S 0 +/* RMT_APB_MEM_RD_ERR_CH6 : RO ;bitpos:[31] ;default: 1'b0 ; */ +/*description: The apb read memory status bit for channel6 turns to + high level when the apb read address exceeds the configuration range.*/ +#define RMT_APB_MEM_RD_ERR_CH6 (BIT(31)) +#define RMT_APB_MEM_RD_ERR_CH6_M ((RMT_APB_MEM_RD_ERR_CH6_V)<<(RMT_APB_MEM_RD_ERR_CH6_S)) +#define RMT_APB_MEM_RD_ERR_CH6_V 0x1 +#define RMT_APB_MEM_RD_ERR_CH6_S 31 +/* RMT_APB_MEM_WR_ERR_CH6 : RO ;bitpos:[30] ;default: 1'b0 ; */ +/*description: The apb write memory status bit for channel6 turns to + high level when the apb write address exceeds the configuration range.*/ +#define RMT_APB_MEM_WR_ERR_CH6 (BIT(30)) +#define RMT_APB_MEM_WR_ERR_CH6_M ((RMT_APB_MEM_WR_ERR_CH6_V)<<(RMT_APB_MEM_WR_ERR_CH6_S)) +#define RMT_APB_MEM_WR_ERR_CH6_V 0x1 +#define RMT_APB_MEM_WR_ERR_CH6_S 30 +/* RMT_MEM_EMPTY_CH6 : RO ;bitpos:[29] ;default: 1'b0 ; */ +/*description: The memory empty status bit for channel6. in acyclic mode, + this bit turns to high level when mem_raddr_ex is greater than or equal to the configured range.*/ +#define RMT_MEM_EMPTY_CH6 (BIT(29)) +#define RMT_MEM_EMPTY_CH6_M ((RMT_MEM_EMPTY_CH6_V)<<(RMT_MEM_EMPTY_CH6_S)) +#define RMT_MEM_EMPTY_CH6_V 0x1 +#define RMT_MEM_EMPTY_CH6_S 29 +/* RMT_MEM_FULL_CH6 : RO ;bitpos:[28] ;default: 1'b0 ; */ +/*description: The memory full status bit for channel6 turns to high level + when mem_waddr_ex is greater than or equal to the configuration range.*/ +#define RMT_MEM_FULL_CH6 (BIT(28)) +#define RMT_MEM_FULL_CH6_M ((RMT_MEM_FULL_CH6_V)<<(RMT_MEM_FULL_CH6_S)) +#define RMT_MEM_FULL_CH6_V 0x1 +#define RMT_MEM_FULL_CH6_S 28 +/* RMT_MEM_OWNER_ERR_CH6 : RO ;bitpos:[27] ;default: 1'b0 ; */ +/*description: When channel6 is configured for receive mode, this bit will turn to high level + if rmt_mem_owner register is not set to 1.*/ +#define RMT_MEM_OWNER_ERR_CH6 (BIT(27)) +#define RMT_MEM_OWNER_ERR_CH6_M ((RMT_MEM_OWNER_ERR_CH6_V)<<(RMT_MEM_OWNER_ERR_CH6_S)) +#define RMT_MEM_OWNER_ERR_CH6_V 0x1 +#define RMT_MEM_OWNER_ERR_CH6_S 27 +/* RMT_STATE_CH6 : RO ;bitpos:[26:24] ;default: 3'h0 ; */ +/*description: The channel6 state machine status register. +3'h0 : idle, 3'h1 : send, 3'h2 : read memory, 3'h3 : receive, 3'h4 : wait.*/ +#define RMT_STATE_CH6 0x07000000 +#define RMT_STATE_CH6_M ((RMT_STATE_CH6_V)<<(RMT_STATE_CH6_S)) +#define RMT_STATE_CH6_V 0x7 +#define RMT_STATE_CH6_S 24 +/* RMT_MEM_RADDR_EX_CH6 : RO ;bitpos:[21:12] ;default: 10'h0 ; */ +/*description: The current memory write address of channel6.*/ +#define RMT_MEM_RADDR_EX_CH6 0x003ff000 +#define RMT_MEM_RADDR_EX_CH6_M ((RMT_MEM_RADDR_EX_CH6_V)<<(RMT_MEM_RADDR_EX_CH6_S)) +#define RMT_MEM_RADDR_EX_CH6_V 0x3ff +#define RMT_MEM_RADDR_EX_CH6_S 12 +/* RMT_MEM_WADDR_EX_CH6 : RO ;bitpos:[9:0] ;default: 10'h0 ; */ +/*description: The current memory read address of channel6.*/ +#define RMT_MEM_WADDR_EX_CH6 0x000003ff +#define RMT_MEM_WADDR_EX_CH6_M ((RMT_MEM_WADDR_EX_CH6_V)<<(RMT_MEM_WADDR_EX_CH6_S)) +#define RMT_MEM_WADDR_EX_CH6_V 0x3ff +#define RMT_MEM_WADDR_EX_CH6_S 0 + +#define RMT_CH7STATUS_REG (DR_REG_RMT_BASE + 0x007c) +/* RMT_STATUS_CH7 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: The status for channel7*/ +#define RMT_STATUS_CH7 0xFFFFFFFF +#define RMT_STATUS_CH7_M ((RMT_STATUS_CH7_V)<<(RMT_STATUS_CH7_S)) +#define RMT_STATUS_CH7_V 0xFFFFFFFF +#define RMT_STATUS_CH7_S 0 +/* RMT_APB_MEM_RD_ERR_CH7 : RO ;bitpos:[31] ;default: 1'b0 ; */ +/*description: The apb read memory status bit for channel7 turns to + high level when the apb read address exceeds the configuration range.*/ +#define RMT_APB_MEM_RD_ERR_CH7 (BIT(31)) +#define RMT_APB_MEM_RD_ERR_CH7_M ((RMT_APB_MEM_RD_ERR_CH7_V)<<(RMT_APB_MEM_RD_ERR_CH7_S)) +#define RMT_APB_MEM_RD_ERR_CH7_V 0x1 +#define RMT_APB_MEM_RD_ERR_CH7_S 31 +/* RMT_APB_MEM_WR_ERR_CH7 : RO ;bitpos:[30] ;default: 1'b0 ; */ +/*description: The apb write memory status bit for channel7 turns to + high level when the apb write address exceeds the configuration range.*/ +#define RMT_APB_MEM_WR_ERR_CH7 (BIT(30)) +#define RMT_APB_MEM_WR_ERR_CH7_M ((RMT_APB_MEM_WR_ERR_CH7_V)<<(RMT_APB_MEM_WR_ERR_CH7_S)) +#define RMT_APB_MEM_WR_ERR_CH7_V 0x1 +#define RMT_APB_MEM_WR_ERR_CH7_S 30 +/* RMT_MEM_EMPTY_CH7 : RO ;bitpos:[29] ;default: 1'b0 ; */ +/*description: The memory empty status bit for channel7. in acyclic mode, + this bit turns to high level when mem_raddr_ex is greater than or equal to the configured range.*/ +#define RMT_MEM_EMPTY_CH7 (BIT(29)) +#define RMT_MEM_EMPTY_CH7_M ((RMT_MEM_EMPTY_CH7_V)<<(RMT_MEM_EMPTY_CH7_S)) +#define RMT_MEM_EMPTY_CH7_V 0x1 +#define RMT_MEM_EMPTY_CH7_S 29 +/* RMT_MEM_FULL_CH7 : RO ;bitpos:[28] ;default: 1'b0 ; */ +/*description: The memory full status bit for channel7 turns to high level + when mem_waddr_ex is greater than or equal to the configuration range.*/ +#define RMT_MEM_FULL_CH7 (BIT(28)) +#define RMT_MEM_FULL_CH7_M ((RMT_MEM_FULL_CH7_V)<<(RMT_MEM_FULL_CH7_S)) +#define RMT_MEM_FULL_CH7_V 0x1 +#define RMT_MEM_FULL_CH7_S 28 +/* RMT_MEM_OWNER_ERR_CH7 : RO ;bitpos:[27] ;default: 1'b0 ; */ +/*description: When channel7 is configured for receive mode, this bit will turn to high level + if rmt_mem_owner register is not set to 1.*/ +#define RMT_MEM_OWNER_ERR_CH7 (BIT(27)) +#define RMT_MEM_OWNER_ERR_CH7_M ((RMT_MEM_OWNER_ERR_CH7_V)<<(RMT_MEM_OWNER_ERR_CH7_S)) +#define RMT_MEM_OWNER_ERR_CH7_V 0x1 +#define RMT_MEM_OWNER_ERR_CH7_S 27 +/* RMT_STATE_CH7 : RO ;bitpos:[26:24] ;default: 3'h0 ; */ +/*description: The channel7 state machine status register. +3'h0 : idle, 3'h1 : send, 3'h2 : read memory, 3'h3 : receive, 3'h4 : wait.*/ +#define RMT_STATE_CH7 0x07000000 +#define RMT_STATE_CH7_M ((RMT_STATE_CH7_V)<<(RMT_STATE_CH7_S)) +#define RMT_STATE_CH7_V 0x7 +#define RMT_STATE_CH7_S 24 +/* RMT_MEM_RADDR_EX_CH7 : RO ;bitpos:[21:12] ;default: 10'h0 ; */ +/*description: The current memory write address of channel7.*/ +#define RMT_MEM_RADDR_EX_CH7 0x003ff000 +#define RMT_MEM_RADDR_EX_CH7_M ((RMT_MEM_RADDR_EX_CH7_V)<<(RMT_MEM_RADDR_EX_CH7_S)) +#define RMT_MEM_RADDR_EX_CH7_V 0x3ff +#define RMT_MEM_RADDR_EX_CH7_S 12 +/* RMT_MEM_WADDR_EX_CH7 : RO ;bitpos:[9:0] ;default: 10'h0 ; */ +/*description: The current memory read address of channel7.*/ +#define RMT_MEM_WADDR_EX_CH7 0x000003ff +#define RMT_MEM_WADDR_EX_CH7_M ((RMT_MEM_WADDR_EX_CH7_V)<<(RMT_MEM_WADDR_EX_CH7_S)) +#define RMT_MEM_WADDR_EX_CH7_V 0x3ff +#define RMT_MEM_WADDR_EX_CH7_S 0 + +#define RMT_CH0ADDR_REG (DR_REG_RMT_BASE + 0x0080) +/* RMT_APB_MEM_ADDR_CH0 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: The ram relative address in channel0 by apb fifo access*/ +#define RMT_APB_MEM_ADDR_CH0 0xFFFFFFFF +#define RMT_APB_MEM_ADDR_CH0_M ((RMT_APB_MEM_ADDR_CH0_V)<<(RMT_APB_MEM_ADDR_CH0_S)) +#define RMT_APB_MEM_ADDR_CH0_V 0xFFFFFFFF +#define RMT_APB_MEM_ADDR_CH0_S 0 + +#define RMT_CH1ADDR_REG (DR_REG_RMT_BASE + 0x0084) +/* RMT_APB_MEM_ADDR_CH1 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: The ram relative address in channel1 by apb fifo access*/ +#define RMT_APB_MEM_ADDR_CH1 0xFFFFFFFF +#define RMT_APB_MEM_ADDR_CH1_M ((RMT_APB_MEM_ADDR_CH1_V)<<(RMT_APB_MEM_ADDR_CH1_S)) +#define RMT_APB_MEM_ADDR_CH1_V 0xFFFFFFFF +#define RMT_APB_MEM_ADDR_CH1_S 0 + +#define RMT_CH2ADDR_REG (DR_REG_RMT_BASE + 0x0088) +/* RMT_APB_MEM_ADDR_CH2 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: The ram relative address in channel2 by apb fifo access*/ +#define RMT_APB_MEM_ADDR_CH2 0xFFFFFFFF +#define RMT_APB_MEM_ADDR_CH2_M ((RMT_APB_MEM_ADDR_CH2_V)<<(RMT_APB_MEM_ADDR_CH2_S)) +#define RMT_APB_MEM_ADDR_CH2_V 0xFFFFFFFF +#define RMT_APB_MEM_ADDR_CH2_S 0 + +#define RMT_CH3ADDR_REG (DR_REG_RMT_BASE + 0x008c) +/* RMT_APB_MEM_ADDR_CH3 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: The ram relative address in channel3 by apb fifo access*/ +#define RMT_APB_MEM_ADDR_CH3 0xFFFFFFFF +#define RMT_APB_MEM_ADDR_CH3_M ((RMT_APB_MEM_ADDR_CH3_V)<<(RMT_APB_MEM_ADDR_CH3_S)) +#define RMT_APB_MEM_ADDR_CH3_V 0xFFFFFFFF +#define RMT_APB_MEM_ADDR_CH3_S 0 + +#define RMT_CH4ADDR_REG (DR_REG_RMT_BASE + 0x0090) +/* RMT_APB_MEM_ADDR_CH4 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: The ram relative address in channel4 by apb fifo access*/ +#define RMT_APB_MEM_ADDR_CH4 0xFFFFFFFF +#define RMT_APB_MEM_ADDR_CH4_M ((RMT_APB_MEM_ADDR_CH4_V)<<(RMT_APB_MEM_ADDR_CH4_S)) +#define RMT_APB_MEM_ADDR_CH4_V 0xFFFFFFFF +#define RMT_APB_MEM_ADDR_CH4_S 0 + +#define RMT_CH5ADDR_REG (DR_REG_RMT_BASE + 0x0094) +/* RMT_APB_MEM_ADDR_CH5 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: The ram relative address in channel5 by apb fifo access*/ +#define RMT_APB_MEM_ADDR_CH5 0xFFFFFFFF +#define RMT_APB_MEM_ADDR_CH5_M ((RMT_APB_MEM_ADDR_CH5_V)<<(RMT_APB_MEM_ADDR_CH5_S)) +#define RMT_APB_MEM_ADDR_CH5_V 0xFFFFFFFF +#define RMT_APB_MEM_ADDR_CH5_S 0 + +#define RMT_CH6ADDR_REG (DR_REG_RMT_BASE + 0x0098) +/* RMT_APB_MEM_ADDR_CH6 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: The ram relative address in channel6 by apb fifo access*/ +#define RMT_APB_MEM_ADDR_CH6 0xFFFFFFFF +#define RMT_APB_MEM_ADDR_CH6_M ((RMT_APB_MEM_ADDR_CH6_V)<<(RMT_APB_MEM_ADDR_CH6_S)) +#define RMT_APB_MEM_ADDR_CH6_V 0xFFFFFFFF +#define RMT_APB_MEM_ADDR_CH6_S 0 + +#define RMT_CH7ADDR_REG (DR_REG_RMT_BASE + 0x009c) +/* RMT_APB_MEM_ADDR_CH7 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: The ram relative address in channel7 by apb fifo access*/ +#define RMT_APB_MEM_ADDR_CH7 0xFFFFFFFF +#define RMT_APB_MEM_ADDR_CH7_M ((RMT_APB_MEM_ADDR_CH7_V)<<(RMT_APB_MEM_ADDR_CH7_S)) +#define RMT_APB_MEM_ADDR_CH7_V 0xFFFFFFFF +#define RMT_APB_MEM_ADDR_CH7_S 0 + +#define RMT_INT_RAW_REG (DR_REG_RMT_BASE + 0x00a0) +/* RMT_CH7_TX_THR_EVENT_INT_RAW : RO ;bitpos:[31] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for channel7 turns to high level when + transmitter in channle 7 have send datas more than reg_rmt_tx_lim_ch7 after detecting this interrupt software can updata the old datas with new datas.*/ +#define RMT_CH7_TX_THR_EVENT_INT_RAW (BIT(31)) +#define RMT_CH7_TX_THR_EVENT_INT_RAW_M (BIT(31)) +#define RMT_CH7_TX_THR_EVENT_INT_RAW_V 0x1 +#define RMT_CH7_TX_THR_EVENT_INT_RAW_S 31 +/* RMT_CH6_TX_THR_EVENT_INT_RAW : RO ;bitpos:[30] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for channel 6 turns to high level when + transmitter in channle6 have send datas more than reg_rmt_tx_lim_ch6 after detecting this interrupt software can updata the old datas with new datas.*/ +#define RMT_CH6_TX_THR_EVENT_INT_RAW (BIT(30)) +#define RMT_CH6_TX_THR_EVENT_INT_RAW_M (BIT(30)) +#define RMT_CH6_TX_THR_EVENT_INT_RAW_V 0x1 +#define RMT_CH6_TX_THR_EVENT_INT_RAW_S 30 +/* RMT_CH5_TX_THR_EVENT_INT_RAW : RO ;bitpos:[29] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for channel 5 turns to high level when + transmitter in channle5 have send datas more than reg_rmt_tx_lim_ch5 after detecting this interrupt software can updata the old datas with new datas.*/ +#define RMT_CH5_TX_THR_EVENT_INT_RAW (BIT(29)) +#define RMT_CH5_TX_THR_EVENT_INT_RAW_M (BIT(29)) +#define RMT_CH5_TX_THR_EVENT_INT_RAW_V 0x1 +#define RMT_CH5_TX_THR_EVENT_INT_RAW_S 29 +/* RMT_CH4_TX_THR_EVENT_INT_RAW : RO ;bitpos:[28] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for channel 4 turns to high level when + transmitter in channle4 have send datas more than reg_rmt_tx_lim_ch4 after detecting this interrupt software can updata the old datas with new datas.*/ +#define RMT_CH4_TX_THR_EVENT_INT_RAW (BIT(28)) +#define RMT_CH4_TX_THR_EVENT_INT_RAW_M (BIT(28)) +#define RMT_CH4_TX_THR_EVENT_INT_RAW_V 0x1 +#define RMT_CH4_TX_THR_EVENT_INT_RAW_S 28 +/* RMT_CH3_TX_THR_EVENT_INT_RAW : RO ;bitpos:[27] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for channel 3 turns to high level when + transmitter in channle3 have send datas more than reg_rmt_tx_lim_ch3 after detecting this interrupt software can updata the old datas with new datas.*/ +#define RMT_CH3_TX_THR_EVENT_INT_RAW (BIT(27)) +#define RMT_CH3_TX_THR_EVENT_INT_RAW_M (BIT(27)) +#define RMT_CH3_TX_THR_EVENT_INT_RAW_V 0x1 +#define RMT_CH3_TX_THR_EVENT_INT_RAW_S 27 +/* RMT_CH2_TX_THR_EVENT_INT_RAW : RO ;bitpos:[26] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for channel 2 turns to high level when + transmitter in channle2 have send datas more than reg_rmt_tx_lim_ch2 after detecting this interrupt software can updata the old datas with new datas.*/ +#define RMT_CH2_TX_THR_EVENT_INT_RAW (BIT(26)) +#define RMT_CH2_TX_THR_EVENT_INT_RAW_M (BIT(26)) +#define RMT_CH2_TX_THR_EVENT_INT_RAW_V 0x1 +#define RMT_CH2_TX_THR_EVENT_INT_RAW_S 26 +/* RMT_CH1_TX_THR_EVENT_INT_RAW : RO ;bitpos:[25] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for channel 1 turns to high level when + transmitter in channle1 have send datas more than reg_rmt_tx_lim_ch1 after detecting this interrupt software can updata the old datas with new datas.*/ +#define RMT_CH1_TX_THR_EVENT_INT_RAW (BIT(25)) +#define RMT_CH1_TX_THR_EVENT_INT_RAW_M (BIT(25)) +#define RMT_CH1_TX_THR_EVENT_INT_RAW_V 0x1 +#define RMT_CH1_TX_THR_EVENT_INT_RAW_S 25 +/* RMT_CH0_TX_THR_EVENT_INT_RAW : RO ;bitpos:[24] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for channel 0 turns to high level when + transmitter in channle0 have send datas more than reg_rmt_tx_lim_ch0 after detecting this interrupt software can updata the old datas with new datas.*/ +#define RMT_CH0_TX_THR_EVENT_INT_RAW (BIT(24)) +#define RMT_CH0_TX_THR_EVENT_INT_RAW_M (BIT(24)) +#define RMT_CH0_TX_THR_EVENT_INT_RAW_V 0x1 +#define RMT_CH0_TX_THR_EVENT_INT_RAW_S 24 +/* RMT_CH7_ERR_INT_RAW : RO ;bitpos:[23] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for channel 7 turns to high level when + channle 7 detects some errors.*/ +#define RMT_CH7_ERR_INT_RAW (BIT(23)) +#define RMT_CH7_ERR_INT_RAW_M (BIT(23)) +#define RMT_CH7_ERR_INT_RAW_V 0x1 +#define RMT_CH7_ERR_INT_RAW_S 23 +/* RMT_CH7_RX_END_INT_RAW : RO ;bitpos:[22] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for channel 7 turns to high level when + the receive process is done.*/ +#define RMT_CH7_RX_END_INT_RAW (BIT(22)) +#define RMT_CH7_RX_END_INT_RAW_M (BIT(22)) +#define RMT_CH7_RX_END_INT_RAW_V 0x1 +#define RMT_CH7_RX_END_INT_RAW_S 22 +/* RMT_CH7_TX_END_INT_RAW : RO ;bitpos:[21] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for channel 7 turns to high level when + the transmit process is done.*/ +#define RMT_CH7_TX_END_INT_RAW (BIT(21)) +#define RMT_CH7_TX_END_INT_RAW_M (BIT(21)) +#define RMT_CH7_TX_END_INT_RAW_V 0x1 +#define RMT_CH7_TX_END_INT_RAW_S 21 +/* RMT_CH6_ERR_INT_RAW : RO ;bitpos:[20] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for channel 6 turns to high level when + channle 6 detects some errors.*/ +#define RMT_CH6_ERR_INT_RAW (BIT(20)) +#define RMT_CH6_ERR_INT_RAW_M (BIT(20)) +#define RMT_CH6_ERR_INT_RAW_V 0x1 +#define RMT_CH6_ERR_INT_RAW_S 20 +/* RMT_CH6_RX_END_INT_RAW : RO ;bitpos:[19] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for channel 6 turns to high level when + the receive process is done.*/ +#define RMT_CH6_RX_END_INT_RAW (BIT(19)) +#define RMT_CH6_RX_END_INT_RAW_M (BIT(19)) +#define RMT_CH6_RX_END_INT_RAW_V 0x1 +#define RMT_CH6_RX_END_INT_RAW_S 19 +/* RMT_CH6_TX_END_INT_RAW : RO ;bitpos:[18] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for channel 6 turns to high level when + the transmit process is done.*/ +#define RMT_CH6_TX_END_INT_RAW (BIT(18)) +#define RMT_CH6_TX_END_INT_RAW_M (BIT(18)) +#define RMT_CH6_TX_END_INT_RAW_V 0x1 +#define RMT_CH6_TX_END_INT_RAW_S 18 +/* RMT_CH5_ERR_INT_RAW : RO ;bitpos:[17] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for channel 5 turns to high level when + channle 5 detects some errors.*/ +#define RMT_CH5_ERR_INT_RAW (BIT(17)) +#define RMT_CH5_ERR_INT_RAW_M (BIT(17)) +#define RMT_CH5_ERR_INT_RAW_V 0x1 +#define RMT_CH5_ERR_INT_RAW_S 17 +/* RMT_CH5_RX_END_INT_RAW : RO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for channel 5 turns to high level when + the receive process is done.*/ +#define RMT_CH5_RX_END_INT_RAW (BIT(16)) +#define RMT_CH5_RX_END_INT_RAW_M (BIT(16)) +#define RMT_CH5_RX_END_INT_RAW_V 0x1 +#define RMT_CH5_RX_END_INT_RAW_S 16 +/* RMT_CH5_TX_END_INT_RAW : RO ;bitpos:[15] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for channel 5 turns to high level when + the transmit process is done.*/ +#define RMT_CH5_TX_END_INT_RAW (BIT(15)) +#define RMT_CH5_TX_END_INT_RAW_M (BIT(15)) +#define RMT_CH5_TX_END_INT_RAW_V 0x1 +#define RMT_CH5_TX_END_INT_RAW_S 15 +/* RMT_CH4_ERR_INT_RAW : RO ;bitpos:[14] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for channel 4 turns to high level when + channle 4 detects some errors.*/ +#define RMT_CH4_ERR_INT_RAW (BIT(14)) +#define RMT_CH4_ERR_INT_RAW_M (BIT(14)) +#define RMT_CH4_ERR_INT_RAW_V 0x1 +#define RMT_CH4_ERR_INT_RAW_S 14 +/* RMT_CH4_RX_END_INT_RAW : RO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for channel 4 turns to high level when + the receive process is done.*/ +#define RMT_CH4_RX_END_INT_RAW (BIT(13)) +#define RMT_CH4_RX_END_INT_RAW_M (BIT(13)) +#define RMT_CH4_RX_END_INT_RAW_V 0x1 +#define RMT_CH4_RX_END_INT_RAW_S 13 +/* RMT_CH4_TX_END_INT_RAW : RO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for channel 4 turns to high level when + the transmit process is done.*/ +#define RMT_CH4_TX_END_INT_RAW (BIT(12)) +#define RMT_CH4_TX_END_INT_RAW_M (BIT(12)) +#define RMT_CH4_TX_END_INT_RAW_V 0x1 +#define RMT_CH4_TX_END_INT_RAW_S 12 +/* RMT_CH3_ERR_INT_RAW : RO ;bitpos:[11] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for channel 3 turns to high level when + channle 3 detects some errors.*/ +#define RMT_CH3_ERR_INT_RAW (BIT(11)) +#define RMT_CH3_ERR_INT_RAW_M (BIT(11)) +#define RMT_CH3_ERR_INT_RAW_V 0x1 +#define RMT_CH3_ERR_INT_RAW_S 11 +/* RMT_CH3_RX_END_INT_RAW : RO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for channel 3 turns to high level when + the receive process is done.*/ +#define RMT_CH3_RX_END_INT_RAW (BIT(10)) +#define RMT_CH3_RX_END_INT_RAW_M (BIT(10)) +#define RMT_CH3_RX_END_INT_RAW_V 0x1 +#define RMT_CH3_RX_END_INT_RAW_S 10 +/* RMT_CH3_TX_END_INT_RAW : RO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for channel 3 turns to high level when + the transmit process is done.*/ +#define RMT_CH3_TX_END_INT_RAW (BIT(9)) +#define RMT_CH3_TX_END_INT_RAW_M (BIT(9)) +#define RMT_CH3_TX_END_INT_RAW_V 0x1 +#define RMT_CH3_TX_END_INT_RAW_S 9 +/* RMT_CH2_ERR_INT_RAW : RO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for channel 2 turns to high level when + channle 2 detects some errors.*/ +#define RMT_CH2_ERR_INT_RAW (BIT(8)) +#define RMT_CH2_ERR_INT_RAW_M (BIT(8)) +#define RMT_CH2_ERR_INT_RAW_V 0x1 +#define RMT_CH2_ERR_INT_RAW_S 8 +/* RMT_CH2_RX_END_INT_RAW : RO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for channel 2 turns to high level when + the receive process is done.*/ +#define RMT_CH2_RX_END_INT_RAW (BIT(7)) +#define RMT_CH2_RX_END_INT_RAW_M (BIT(7)) +#define RMT_CH2_RX_END_INT_RAW_V 0x1 +#define RMT_CH2_RX_END_INT_RAW_S 7 +/* RMT_CH2_TX_END_INT_RAW : RO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for channel 2 turns to high level when + the transmit process is done.*/ +#define RMT_CH2_TX_END_INT_RAW (BIT(6)) +#define RMT_CH2_TX_END_INT_RAW_M (BIT(6)) +#define RMT_CH2_TX_END_INT_RAW_V 0x1 +#define RMT_CH2_TX_END_INT_RAW_S 6 +/* RMT_CH1_ERR_INT_RAW : RO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for channel 1 turns to high level when + channle 1 detects some errors.*/ +#define RMT_CH1_ERR_INT_RAW (BIT(5)) +#define RMT_CH1_ERR_INT_RAW_M (BIT(5)) +#define RMT_CH1_ERR_INT_RAW_V 0x1 +#define RMT_CH1_ERR_INT_RAW_S 5 +/* RMT_CH1_RX_END_INT_RAW : RO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for channel 1 turns to high level when + the receive process is done.*/ +#define RMT_CH1_RX_END_INT_RAW (BIT(4)) +#define RMT_CH1_RX_END_INT_RAW_M (BIT(4)) +#define RMT_CH1_RX_END_INT_RAW_V 0x1 +#define RMT_CH1_RX_END_INT_RAW_S 4 +/* RMT_CH1_TX_END_INT_RAW : RO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for channel 1 turns to high level when + the transmit process is done.*/ +#define RMT_CH1_TX_END_INT_RAW (BIT(3)) +#define RMT_CH1_TX_END_INT_RAW_M (BIT(3)) +#define RMT_CH1_TX_END_INT_RAW_V 0x1 +#define RMT_CH1_TX_END_INT_RAW_S 3 +/* RMT_CH0_ERR_INT_RAW : RO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for channel 0 turns to high level when + channle 0 detects some errors.*/ +#define RMT_CH0_ERR_INT_RAW (BIT(2)) +#define RMT_CH0_ERR_INT_RAW_M (BIT(2)) +#define RMT_CH0_ERR_INT_RAW_V 0x1 +#define RMT_CH0_ERR_INT_RAW_S 2 +/* RMT_CH0_RX_END_INT_RAW : RO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for channel 0 turns to high level when + the receive process is done.*/ +#define RMT_CH0_RX_END_INT_RAW (BIT(1)) +#define RMT_CH0_RX_END_INT_RAW_M (BIT(1)) +#define RMT_CH0_RX_END_INT_RAW_V 0x1 +#define RMT_CH0_RX_END_INT_RAW_S 1 +/* RMT_CH0_TX_END_INT_RAW : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for channel 0 turns to high level when + the transmit process is done.*/ +#define RMT_CH0_TX_END_INT_RAW (BIT(0)) +#define RMT_CH0_TX_END_INT_RAW_M (BIT(0)) +#define RMT_CH0_TX_END_INT_RAW_V 0x1 +#define RMT_CH0_TX_END_INT_RAW_S 0 + +#define RMT_INT_ST_REG (DR_REG_RMT_BASE + 0x00a4) +/* RMT_CH7_TX_THR_EVENT_INT_ST : RO ;bitpos:[31] ;default: 1'b0 ; */ +/*description: The interrupt state bit for channel 7's rmt_ch7_tx_thr_event_int_raw + when mt_ch7_tx_thr_event_int_ena is set to 1.*/ +#define RMT_CH7_TX_THR_EVENT_INT_ST (BIT(31)) +#define RMT_CH7_TX_THR_EVENT_INT_ST_M (BIT(31)) +#define RMT_CH7_TX_THR_EVENT_INT_ST_V 0x1 +#define RMT_CH7_TX_THR_EVENT_INT_ST_S 31 +/* RMT_CH6_TX_THR_EVENT_INT_ST : RO ;bitpos:[30] ;default: 1'b0 ; */ +/*description: The interrupt state bit for channel 6's rmt_ch6_tx_thr_event_int_raw + when mt_ch6_tx_thr_event_int_ena is set to 1.*/ +#define RMT_CH6_TX_THR_EVENT_INT_ST (BIT(30)) +#define RMT_CH6_TX_THR_EVENT_INT_ST_M (BIT(30)) +#define RMT_CH6_TX_THR_EVENT_INT_ST_V 0x1 +#define RMT_CH6_TX_THR_EVENT_INT_ST_S 30 +/* RMT_CH5_TX_THR_EVENT_INT_ST : RO ;bitpos:[29] ;default: 1'b0 ; */ +/*description: The interrupt state bit for channel 5's rmt_ch5_tx_thr_event_int_raw + when mt_ch5_tx_thr_event_int_ena is set to 1.*/ +#define RMT_CH5_TX_THR_EVENT_INT_ST (BIT(29)) +#define RMT_CH5_TX_THR_EVENT_INT_ST_M (BIT(29)) +#define RMT_CH5_TX_THR_EVENT_INT_ST_V 0x1 +#define RMT_CH5_TX_THR_EVENT_INT_ST_S 29 +/* RMT_CH4_TX_THR_EVENT_INT_ST : RO ;bitpos:[28] ;default: 1'b0 ; */ +/*description: The interrupt state bit for channel 4's rmt_ch4_tx_thr_event_int_raw + when mt_ch4_tx_thr_event_int_ena is set to 1.*/ +#define RMT_CH4_TX_THR_EVENT_INT_ST (BIT(28)) +#define RMT_CH4_TX_THR_EVENT_INT_ST_M (BIT(28)) +#define RMT_CH4_TX_THR_EVENT_INT_ST_V 0x1 +#define RMT_CH4_TX_THR_EVENT_INT_ST_S 28 +/* RMT_CH3_TX_THR_EVENT_INT_ST : RO ;bitpos:[27] ;default: 1'b0 ; */ +/*description: The interrupt state bit for channel 3's rmt_ch3_tx_thr_event_int_raw + when mt_ch3_tx_thr_event_int_ena is set to 1.*/ +#define RMT_CH3_TX_THR_EVENT_INT_ST (BIT(27)) +#define RMT_CH3_TX_THR_EVENT_INT_ST_M (BIT(27)) +#define RMT_CH3_TX_THR_EVENT_INT_ST_V 0x1 +#define RMT_CH3_TX_THR_EVENT_INT_ST_S 27 +/* RMT_CH2_TX_THR_EVENT_INT_ST : RO ;bitpos:[26] ;default: 1'b0 ; */ +/*description: The interrupt state bit for channel 2's rmt_ch2_tx_thr_event_int_raw + when mt_ch2_tx_thr_event_int_ena is set to 1.*/ +#define RMT_CH2_TX_THR_EVENT_INT_ST (BIT(26)) +#define RMT_CH2_TX_THR_EVENT_INT_ST_M (BIT(26)) +#define RMT_CH2_TX_THR_EVENT_INT_ST_V 0x1 +#define RMT_CH2_TX_THR_EVENT_INT_ST_S 26 +/* RMT_CH1_TX_THR_EVENT_INT_ST : RO ;bitpos:[25] ;default: 1'b0 ; */ +/*description: The interrupt state bit for channel 1's rmt_ch1_tx_thr_event_int_raw + when mt_ch1_tx_thr_event_int_ena is set to 1.*/ +#define RMT_CH1_TX_THR_EVENT_INT_ST (BIT(25)) +#define RMT_CH1_TX_THR_EVENT_INT_ST_M (BIT(25)) +#define RMT_CH1_TX_THR_EVENT_INT_ST_V 0x1 +#define RMT_CH1_TX_THR_EVENT_INT_ST_S 25 +/* RMT_CH0_TX_THR_EVENT_INT_ST : RO ;bitpos:[24] ;default: 1'b0 ; */ +/*description: The interrupt state bit for channel 0's rmt_ch0_tx_thr_event_int_raw + when mt_ch0_tx_thr_event_int_ena is set to 1.*/ +#define RMT_CH0_TX_THR_EVENT_INT_ST (BIT(24)) +#define RMT_CH0_TX_THR_EVENT_INT_ST_M (BIT(24)) +#define RMT_CH0_TX_THR_EVENT_INT_ST_V 0x1 +#define RMT_CH0_TX_THR_EVENT_INT_ST_S 24 +/* RMT_CH7_ERR_INT_ST : RO ;bitpos:[23] ;default: 1'b0 ; */ +/*description: The interrupt state bit for channel 7's rmt_ch7_err_int_raw + when rmt_ch7_err_int_ena is set to 1.*/ +#define RMT_CH7_ERR_INT_ST (BIT(23)) +#define RMT_CH7_ERR_INT_ST_M (BIT(23)) +#define RMT_CH7_ERR_INT_ST_V 0x1 +#define RMT_CH7_ERR_INT_ST_S 23 +/* RMT_CH7_RX_END_INT_ST : RO ;bitpos:[22] ;default: 1'b0 ; */ +/*description: The interrupt state bit for channel 7's rmt_ch7_rx_end_int_raw + when rmt_ch7_rx_end_int_ena is set to 1.*/ +#define RMT_CH7_RX_END_INT_ST (BIT(22)) +#define RMT_CH7_RX_END_INT_ST_M (BIT(22)) +#define RMT_CH7_RX_END_INT_ST_V 0x1 +#define RMT_CH7_RX_END_INT_ST_S 22 +/* RMT_CH7_TX_END_INT_ST : RO ;bitpos:[21] ;default: 1'b0 ; */ +/*description: The interrupt state bit for channel 7's mt_ch7_tx_end_int_raw + when mt_ch7_tx_end_int_ena is set to 1.*/ +#define RMT_CH7_TX_END_INT_ST (BIT(21)) +#define RMT_CH7_TX_END_INT_ST_M (BIT(21)) +#define RMT_CH7_TX_END_INT_ST_V 0x1 +#define RMT_CH7_TX_END_INT_ST_S 21 +/* RMT_CH6_ERR_INT_ST : RO ;bitpos:[20] ;default: 1'b0 ; */ +/*description: The interrupt state bit for channel 6's rmt_ch6_err_int_raw + when rmt_ch6_err_int_ena is set to 1.*/ +#define RMT_CH6_ERR_INT_ST (BIT(20)) +#define RMT_CH6_ERR_INT_ST_M (BIT(20)) +#define RMT_CH6_ERR_INT_ST_V 0x1 +#define RMT_CH6_ERR_INT_ST_S 20 +/* RMT_CH6_RX_END_INT_ST : RO ;bitpos:[19] ;default: 1'b0 ; */ +/*description: The interrupt state bit for channel 6's rmt_ch6_rx_end_int_raw + when rmt_ch6_rx_end_int_ena is set to 1.*/ +#define RMT_CH6_RX_END_INT_ST (BIT(19)) +#define RMT_CH6_RX_END_INT_ST_M (BIT(19)) +#define RMT_CH6_RX_END_INT_ST_V 0x1 +#define RMT_CH6_RX_END_INT_ST_S 19 +/* RMT_CH6_TX_END_INT_ST : RO ;bitpos:[18] ;default: 1'b0 ; */ +/*description: The interrupt state bit for channel 6's mt_ch6_tx_end_int_raw + when mt_ch6_tx_end_int_ena is set to 1.*/ +#define RMT_CH6_TX_END_INT_ST (BIT(18)) +#define RMT_CH6_TX_END_INT_ST_M (BIT(18)) +#define RMT_CH6_TX_END_INT_ST_V 0x1 +#define RMT_CH6_TX_END_INT_ST_S 18 +/* RMT_CH5_ERR_INT_ST : RO ;bitpos:[17] ;default: 1'b0 ; */ +/*description: The interrupt state bit for channel 5's rmt_ch5_err_int_raw + when rmt_ch5_err_int_ena is set to 1.*/ +#define RMT_CH5_ERR_INT_ST (BIT(17)) +#define RMT_CH5_ERR_INT_ST_M (BIT(17)) +#define RMT_CH5_ERR_INT_ST_V 0x1 +#define RMT_CH5_ERR_INT_ST_S 17 +/* RMT_CH5_RX_END_INT_ST : RO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: The interrupt state bit for channel 5's rmt_ch5_rx_end_int_raw + when rmt_ch5_rx_end_int_ena is set to 1.*/ +#define RMT_CH5_RX_END_INT_ST (BIT(16)) +#define RMT_CH5_RX_END_INT_ST_M (BIT(16)) +#define RMT_CH5_RX_END_INT_ST_V 0x1 +#define RMT_CH5_RX_END_INT_ST_S 16 +/* RMT_CH5_TX_END_INT_ST : RO ;bitpos:[15] ;default: 1'b0 ; */ +/*description: The interrupt state bit for channel 5's mt_ch5_tx_end_int_raw + when mt_ch5_tx_end_int_ena is set to 1.*/ +#define RMT_CH5_TX_END_INT_ST (BIT(15)) +#define RMT_CH5_TX_END_INT_ST_M (BIT(15)) +#define RMT_CH5_TX_END_INT_ST_V 0x1 +#define RMT_CH5_TX_END_INT_ST_S 15 +/* RMT_CH4_ERR_INT_ST : RO ;bitpos:[14] ;default: 1'b0 ; */ +/*description: The interrupt state bit for channel 4's rmt_ch4_err_int_raw + when rmt_ch4_err_int_ena is set to 1.*/ +#define RMT_CH4_ERR_INT_ST (BIT(14)) +#define RMT_CH4_ERR_INT_ST_M (BIT(14)) +#define RMT_CH4_ERR_INT_ST_V 0x1 +#define RMT_CH4_ERR_INT_ST_S 14 +/* RMT_CH4_RX_END_INT_ST : RO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: The interrupt state bit for channel 4's rmt_ch4_rx_end_int_raw + when rmt_ch4_rx_end_int_ena is set to 1.*/ +#define RMT_CH4_RX_END_INT_ST (BIT(13)) +#define RMT_CH4_RX_END_INT_ST_M (BIT(13)) +#define RMT_CH4_RX_END_INT_ST_V 0x1 +#define RMT_CH4_RX_END_INT_ST_S 13 +/* RMT_CH4_TX_END_INT_ST : RO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: The interrupt state bit for channel 4's mt_ch4_tx_end_int_raw + when mt_ch4_tx_end_int_ena is set to 1.*/ +#define RMT_CH4_TX_END_INT_ST (BIT(12)) +#define RMT_CH4_TX_END_INT_ST_M (BIT(12)) +#define RMT_CH4_TX_END_INT_ST_V 0x1 +#define RMT_CH4_TX_END_INT_ST_S 12 +/* RMT_CH3_ERR_INT_ST : RO ;bitpos:[11] ;default: 1'b0 ; */ +/*description: The interrupt state bit for channel 3's rmt_ch3_err_int_raw + when rmt_ch3_err_int_ena is set to 1.*/ +#define RMT_CH3_ERR_INT_ST (BIT(11)) +#define RMT_CH3_ERR_INT_ST_M (BIT(11)) +#define RMT_CH3_ERR_INT_ST_V 0x1 +#define RMT_CH3_ERR_INT_ST_S 11 +/* RMT_CH3_RX_END_INT_ST : RO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: The interrupt state bit for channel 3's rmt_ch3_rx_end_int_raw + when rmt_ch3_rx_end_int_ena is set to 1.*/ +#define RMT_CH3_RX_END_INT_ST (BIT(10)) +#define RMT_CH3_RX_END_INT_ST_M (BIT(10)) +#define RMT_CH3_RX_END_INT_ST_V 0x1 +#define RMT_CH3_RX_END_INT_ST_S 10 +/* RMT_CH3_TX_END_INT_ST : RO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: The interrupt state bit for channel 3's mt_ch3_tx_end_int_raw + when mt_ch3_tx_end_int_ena is set to 1.*/ +#define RMT_CH3_TX_END_INT_ST (BIT(9)) +#define RMT_CH3_TX_END_INT_ST_M (BIT(9)) +#define RMT_CH3_TX_END_INT_ST_V 0x1 +#define RMT_CH3_TX_END_INT_ST_S 9 +/* RMT_CH2_ERR_INT_ST : RO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: The interrupt state bit for channel 2's rmt_ch2_err_int_raw + when rmt_ch2_err_int_ena is set to 1.*/ +#define RMT_CH2_ERR_INT_ST (BIT(8)) +#define RMT_CH2_ERR_INT_ST_M (BIT(8)) +#define RMT_CH2_ERR_INT_ST_V 0x1 +#define RMT_CH2_ERR_INT_ST_S 8 +/* RMT_CH2_RX_END_INT_ST : RO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: The interrupt state bit for channel 2's rmt_ch2_rx_end_int_raw + when rmt_ch2_rx_end_int_ena is set to 1.*/ +#define RMT_CH2_RX_END_INT_ST (BIT(7)) +#define RMT_CH2_RX_END_INT_ST_M (BIT(7)) +#define RMT_CH2_RX_END_INT_ST_V 0x1 +#define RMT_CH2_RX_END_INT_ST_S 7 +/* RMT_CH2_TX_END_INT_ST : RO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: The interrupt state bit for channel 2's mt_ch2_tx_end_int_raw + when mt_ch2_tx_end_int_ena is set to 1.*/ +#define RMT_CH2_TX_END_INT_ST (BIT(6)) +#define RMT_CH2_TX_END_INT_ST_M (BIT(6)) +#define RMT_CH2_TX_END_INT_ST_V 0x1 +#define RMT_CH2_TX_END_INT_ST_S 6 +/* RMT_CH1_ERR_INT_ST : RO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: The interrupt state bit for channel 1's rmt_ch1_err_int_raw + when rmt_ch1_err_int_ena is set to 1.*/ +#define RMT_CH1_ERR_INT_ST (BIT(5)) +#define RMT_CH1_ERR_INT_ST_M (BIT(5)) +#define RMT_CH1_ERR_INT_ST_V 0x1 +#define RMT_CH1_ERR_INT_ST_S 5 +/* RMT_CH1_RX_END_INT_ST : RO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: The interrupt state bit for channel 1's rmt_ch1_rx_end_int_raw + when rmt_ch1_rx_end_int_ena is set to 1.*/ +#define RMT_CH1_RX_END_INT_ST (BIT(4)) +#define RMT_CH1_RX_END_INT_ST_M (BIT(4)) +#define RMT_CH1_RX_END_INT_ST_V 0x1 +#define RMT_CH1_RX_END_INT_ST_S 4 +/* RMT_CH1_TX_END_INT_ST : RO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: The interrupt state bit for channel 1's mt_ch1_tx_end_int_raw + when mt_ch1_tx_end_int_ena is set to 1.*/ +#define RMT_CH1_TX_END_INT_ST (BIT(3)) +#define RMT_CH1_TX_END_INT_ST_M (BIT(3)) +#define RMT_CH1_TX_END_INT_ST_V 0x1 +#define RMT_CH1_TX_END_INT_ST_S 3 +/* RMT_CH0_ERR_INT_ST : RO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: The interrupt state bit for channel 0's rmt_ch0_err_int_raw + when rmt_ch0_err_int_ena is set to 0.*/ +#define RMT_CH0_ERR_INT_ST (BIT(2)) +#define RMT_CH0_ERR_INT_ST_M (BIT(2)) +#define RMT_CH0_ERR_INT_ST_V 0x1 +#define RMT_CH0_ERR_INT_ST_S 2 +/* RMT_CH0_RX_END_INT_ST : RO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: The interrupt state bit for channel 0's rmt_ch0_rx_end_int_raw + when rmt_ch0_rx_end_int_ena is set to 0.*/ +#define RMT_CH0_RX_END_INT_ST (BIT(1)) +#define RMT_CH0_RX_END_INT_ST_M (BIT(1)) +#define RMT_CH0_RX_END_INT_ST_V 0x1 +#define RMT_CH0_RX_END_INT_ST_S 1 +/* RMT_CH0_TX_END_INT_ST : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: The interrupt state bit for channel 0's mt_ch0_tx_end_int_raw + when mt_ch0_tx_end_int_ena is set to 0.*/ +#define RMT_CH0_TX_END_INT_ST (BIT(0)) +#define RMT_CH0_TX_END_INT_ST_M (BIT(0)) +#define RMT_CH0_TX_END_INT_ST_V 0x1 +#define RMT_CH0_TX_END_INT_ST_S 0 + +#define RMT_INT_ENA_REG (DR_REG_RMT_BASE + 0x00a8) +/* RMT_CH7_TX_THR_EVENT_INT_ENA : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: Set this bit to enable rmt_ch7_tx_thr_event_int_st.*/ +#define RMT_CH7_TX_THR_EVENT_INT_ENA (BIT(31)) +#define RMT_CH7_TX_THR_EVENT_INT_ENA_M (BIT(31)) +#define RMT_CH7_TX_THR_EVENT_INT_ENA_V 0x1 +#define RMT_CH7_TX_THR_EVENT_INT_ENA_S 31 +/* RMT_CH6_TX_THR_EVENT_INT_ENA : R/W ;bitpos:[30] ;default: 1'b0 ; */ +/*description: Set this bit to enable rmt_ch6_tx_thr_event_int_st.*/ +#define RMT_CH6_TX_THR_EVENT_INT_ENA (BIT(30)) +#define RMT_CH6_TX_THR_EVENT_INT_ENA_M (BIT(30)) +#define RMT_CH6_TX_THR_EVENT_INT_ENA_V 0x1 +#define RMT_CH6_TX_THR_EVENT_INT_ENA_S 30 +/* RMT_CH5_TX_THR_EVENT_INT_ENA : R/W ;bitpos:[29] ;default: 1'b0 ; */ +/*description: Set this bit to enable rmt_ch5_tx_thr_event_int_st.*/ +#define RMT_CH5_TX_THR_EVENT_INT_ENA (BIT(29)) +#define RMT_CH5_TX_THR_EVENT_INT_ENA_M (BIT(29)) +#define RMT_CH5_TX_THR_EVENT_INT_ENA_V 0x1 +#define RMT_CH5_TX_THR_EVENT_INT_ENA_S 29 +/* RMT_CH4_TX_THR_EVENT_INT_ENA : R/W ;bitpos:[28] ;default: 1'b0 ; */ +/*description: Set this bit to enable rmt_ch4_tx_thr_event_int_st.*/ +#define RMT_CH4_TX_THR_EVENT_INT_ENA (BIT(28)) +#define RMT_CH4_TX_THR_EVENT_INT_ENA_M (BIT(28)) +#define RMT_CH4_TX_THR_EVENT_INT_ENA_V 0x1 +#define RMT_CH4_TX_THR_EVENT_INT_ENA_S 28 +/* RMT_CH3_TX_THR_EVENT_INT_ENA : R/W ;bitpos:[27] ;default: 1'b0 ; */ +/*description: Set this bit to enable rmt_ch3_tx_thr_event_int_st.*/ +#define RMT_CH3_TX_THR_EVENT_INT_ENA (BIT(27)) +#define RMT_CH3_TX_THR_EVENT_INT_ENA_M (BIT(27)) +#define RMT_CH3_TX_THR_EVENT_INT_ENA_V 0x1 +#define RMT_CH3_TX_THR_EVENT_INT_ENA_S 27 +/* RMT_CH2_TX_THR_EVENT_INT_ENA : R/W ;bitpos:[26] ;default: 1'b0 ; */ +/*description: Set this bit to enable rmt_ch2_tx_thr_event_int_st.*/ +#define RMT_CH2_TX_THR_EVENT_INT_ENA (BIT(26)) +#define RMT_CH2_TX_THR_EVENT_INT_ENA_M (BIT(26)) +#define RMT_CH2_TX_THR_EVENT_INT_ENA_V 0x1 +#define RMT_CH2_TX_THR_EVENT_INT_ENA_S 26 +/* RMT_CH1_TX_THR_EVENT_INT_ENA : R/W ;bitpos:[25] ;default: 1'b0 ; */ +/*description: Set this bit to enable rmt_ch1_tx_thr_event_int_st.*/ +#define RMT_CH1_TX_THR_EVENT_INT_ENA (BIT(25)) +#define RMT_CH1_TX_THR_EVENT_INT_ENA_M (BIT(25)) +#define RMT_CH1_TX_THR_EVENT_INT_ENA_V 0x1 +#define RMT_CH1_TX_THR_EVENT_INT_ENA_S 25 +/* RMT_CH0_TX_THR_EVENT_INT_ENA : R/W ;bitpos:[24] ;default: 1'b0 ; */ +/*description: Set this bit to enable rmt_ch0_tx_thr_event_int_st.*/ +#define RMT_CH0_TX_THR_EVENT_INT_ENA (BIT(24)) +#define RMT_CH0_TX_THR_EVENT_INT_ENA_M (BIT(24)) +#define RMT_CH0_TX_THR_EVENT_INT_ENA_V 0x1 +#define RMT_CH0_TX_THR_EVENT_INT_ENA_S 24 +/* RMT_CH7_ERR_INT_ENA : R/W ;bitpos:[23] ;default: 1'b0 ; */ +/*description: Set this bit to enable rmt_ch7_err_int_st.*/ +#define RMT_CH7_ERR_INT_ENA (BIT(23)) +#define RMT_CH7_ERR_INT_ENA_M (BIT(23)) +#define RMT_CH7_ERR_INT_ENA_V 0x1 +#define RMT_CH7_ERR_INT_ENA_S 23 +/* RMT_CH7_RX_END_INT_ENA : R/W ;bitpos:[22] ;default: 1'b0 ; */ +/*description: Set this bit to enable rmt_ch7_rx_end_int_st.*/ +#define RMT_CH7_RX_END_INT_ENA (BIT(22)) +#define RMT_CH7_RX_END_INT_ENA_M (BIT(22)) +#define RMT_CH7_RX_END_INT_ENA_V 0x1 +#define RMT_CH7_RX_END_INT_ENA_S 22 +/* RMT_CH7_TX_END_INT_ENA : R/W ;bitpos:[21] ;default: 1'b0 ; */ +/*description: Set this bit to enable rmt_ch7_tx_end_int_st.*/ +#define RMT_CH7_TX_END_INT_ENA (BIT(21)) +#define RMT_CH7_TX_END_INT_ENA_M (BIT(21)) +#define RMT_CH7_TX_END_INT_ENA_V 0x1 +#define RMT_CH7_TX_END_INT_ENA_S 21 +/* RMT_CH6_ERR_INT_ENA : R/W ;bitpos:[20] ;default: 1'b0 ; */ +/*description: Set this bit to enable rmt_ch6_err_int_st.*/ +#define RMT_CH6_ERR_INT_ENA (BIT(20)) +#define RMT_CH6_ERR_INT_ENA_M (BIT(20)) +#define RMT_CH6_ERR_INT_ENA_V 0x1 +#define RMT_CH6_ERR_INT_ENA_S 20 +/* RMT_CH6_RX_END_INT_ENA : R/W ;bitpos:[19] ;default: 1'b0 ; */ +/*description: Set this bit to enable rmt_ch6_rx_end_int_st.*/ +#define RMT_CH6_RX_END_INT_ENA (BIT(19)) +#define RMT_CH6_RX_END_INT_ENA_M (BIT(19)) +#define RMT_CH6_RX_END_INT_ENA_V 0x1 +#define RMT_CH6_RX_END_INT_ENA_S 19 +/* RMT_CH6_TX_END_INT_ENA : R/W ;bitpos:[18] ;default: 1'b0 ; */ +/*description: Set this bit to enable rmt_ch6_tx_end_int_st.*/ +#define RMT_CH6_TX_END_INT_ENA (BIT(18)) +#define RMT_CH6_TX_END_INT_ENA_M (BIT(18)) +#define RMT_CH6_TX_END_INT_ENA_V 0x1 +#define RMT_CH6_TX_END_INT_ENA_S 18 +/* RMT_CH5_ERR_INT_ENA : R/W ;bitpos:[17] ;default: 1'b0 ; */ +/*description: Set this bit to enable rmt_ch5_err_int_st.*/ +#define RMT_CH5_ERR_INT_ENA (BIT(17)) +#define RMT_CH5_ERR_INT_ENA_M (BIT(17)) +#define RMT_CH5_ERR_INT_ENA_V 0x1 +#define RMT_CH5_ERR_INT_ENA_S 17 +/* RMT_CH5_RX_END_INT_ENA : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: Set this bit to enable rmt_ch5_rx_end_int_st.*/ +#define RMT_CH5_RX_END_INT_ENA (BIT(16)) +#define RMT_CH5_RX_END_INT_ENA_M (BIT(16)) +#define RMT_CH5_RX_END_INT_ENA_V 0x1 +#define RMT_CH5_RX_END_INT_ENA_S 16 +/* RMT_CH5_TX_END_INT_ENA : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: Set this bit to enable rmt_ch5_tx_end_int_st.*/ +#define RMT_CH5_TX_END_INT_ENA (BIT(15)) +#define RMT_CH5_TX_END_INT_ENA_M (BIT(15)) +#define RMT_CH5_TX_END_INT_ENA_V 0x1 +#define RMT_CH5_TX_END_INT_ENA_S 15 +/* RMT_CH4_ERR_INT_ENA : R/W ;bitpos:[14] ;default: 1'b0 ; */ +/*description: Set this bit to enable rmt_ch4_err_int_st.*/ +#define RMT_CH4_ERR_INT_ENA (BIT(14)) +#define RMT_CH4_ERR_INT_ENA_M (BIT(14)) +#define RMT_CH4_ERR_INT_ENA_V 0x1 +#define RMT_CH4_ERR_INT_ENA_S 14 +/* RMT_CH4_RX_END_INT_ENA : R/W ;bitpos:[13] ;default: 1'b0 ; */ +/*description: Set this bit to enable rmt_ch4_rx_end_int_st.*/ +#define RMT_CH4_RX_END_INT_ENA (BIT(13)) +#define RMT_CH4_RX_END_INT_ENA_M (BIT(13)) +#define RMT_CH4_RX_END_INT_ENA_V 0x1 +#define RMT_CH4_RX_END_INT_ENA_S 13 +/* RMT_CH4_TX_END_INT_ENA : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: Set this bit to enable rmt_ch4_tx_end_int_st.*/ +#define RMT_CH4_TX_END_INT_ENA (BIT(12)) +#define RMT_CH4_TX_END_INT_ENA_M (BIT(12)) +#define RMT_CH4_TX_END_INT_ENA_V 0x1 +#define RMT_CH4_TX_END_INT_ENA_S 12 +/* RMT_CH3_ERR_INT_ENA : R/W ;bitpos:[11] ;default: 1'b0 ; */ +/*description: Set this bit to enable rmt_ch3_err_int_st.*/ +#define RMT_CH3_ERR_INT_ENA (BIT(11)) +#define RMT_CH3_ERR_INT_ENA_M (BIT(11)) +#define RMT_CH3_ERR_INT_ENA_V 0x1 +#define RMT_CH3_ERR_INT_ENA_S 11 +/* RMT_CH3_RX_END_INT_ENA : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: Set this bit to enable rmt_ch3_rx_end_int_st.*/ +#define RMT_CH3_RX_END_INT_ENA (BIT(10)) +#define RMT_CH3_RX_END_INT_ENA_M (BIT(10)) +#define RMT_CH3_RX_END_INT_ENA_V 0x1 +#define RMT_CH3_RX_END_INT_ENA_S 10 +/* RMT_CH3_TX_END_INT_ENA : R/W ;bitpos:[9] ;default: 1'b0 ; */ +/*description: Set this bit to enable rmt_ch3_tx_end_int_st.*/ +#define RMT_CH3_TX_END_INT_ENA (BIT(9)) +#define RMT_CH3_TX_END_INT_ENA_M (BIT(9)) +#define RMT_CH3_TX_END_INT_ENA_V 0x1 +#define RMT_CH3_TX_END_INT_ENA_S 9 +/* RMT_CH2_ERR_INT_ENA : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: Set this bit to enable rmt_ch2_err_int_st.*/ +#define RMT_CH2_ERR_INT_ENA (BIT(8)) +#define RMT_CH2_ERR_INT_ENA_M (BIT(8)) +#define RMT_CH2_ERR_INT_ENA_V 0x1 +#define RMT_CH2_ERR_INT_ENA_S 8 +/* RMT_CH2_RX_END_INT_ENA : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: Set this bit to enable rmt_ch2_rx_end_int_st.*/ +#define RMT_CH2_RX_END_INT_ENA (BIT(7)) +#define RMT_CH2_RX_END_INT_ENA_M (BIT(7)) +#define RMT_CH2_RX_END_INT_ENA_V 0x1 +#define RMT_CH2_RX_END_INT_ENA_S 7 +/* RMT_CH2_TX_END_INT_ENA : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: Set this bit to enable rmt_ch2_tx_end_int_st.*/ +#define RMT_CH2_TX_END_INT_ENA (BIT(6)) +#define RMT_CH2_TX_END_INT_ENA_M (BIT(6)) +#define RMT_CH2_TX_END_INT_ENA_V 0x1 +#define RMT_CH2_TX_END_INT_ENA_S 6 +/* RMT_CH1_ERR_INT_ENA : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: Set this bit to enable rmt_ch1_err_int_st.*/ +#define RMT_CH1_ERR_INT_ENA (BIT(5)) +#define RMT_CH1_ERR_INT_ENA_M (BIT(5)) +#define RMT_CH1_ERR_INT_ENA_V 0x1 +#define RMT_CH1_ERR_INT_ENA_S 5 +/* RMT_CH1_RX_END_INT_ENA : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: Set this bit to enable rmt_ch1_rx_end_int_st.*/ +#define RMT_CH1_RX_END_INT_ENA (BIT(4)) +#define RMT_CH1_RX_END_INT_ENA_M (BIT(4)) +#define RMT_CH1_RX_END_INT_ENA_V 0x1 +#define RMT_CH1_RX_END_INT_ENA_S 4 +/* RMT_CH1_TX_END_INT_ENA : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: Set this bit to enable rmt_ch1_tx_end_int_st.*/ +#define RMT_CH1_TX_END_INT_ENA (BIT(3)) +#define RMT_CH1_TX_END_INT_ENA_M (BIT(3)) +#define RMT_CH1_TX_END_INT_ENA_V 0x1 +#define RMT_CH1_TX_END_INT_ENA_S 3 +/* RMT_CH0_ERR_INT_ENA : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: Set this bit to enable rmt_ch0_err_int_st.*/ +#define RMT_CH0_ERR_INT_ENA (BIT(2)) +#define RMT_CH0_ERR_INT_ENA_M (BIT(2)) +#define RMT_CH0_ERR_INT_ENA_V 0x1 +#define RMT_CH0_ERR_INT_ENA_S 2 +/* RMT_CH0_RX_END_INT_ENA : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: Set this bit to enable rmt_ch0_rx_end_int_st.*/ +#define RMT_CH0_RX_END_INT_ENA (BIT(1)) +#define RMT_CH0_RX_END_INT_ENA_M (BIT(1)) +#define RMT_CH0_RX_END_INT_ENA_V 0x1 +#define RMT_CH0_RX_END_INT_ENA_S 1 +/* RMT_CH0_TX_END_INT_ENA : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: Set this bit to enable rmt_ch0_tx_end_int_st.*/ +#define RMT_CH0_TX_END_INT_ENA (BIT(0)) +#define RMT_CH0_TX_END_INT_ENA_M (BIT(0)) +#define RMT_CH0_TX_END_INT_ENA_V 0x1 +#define RMT_CH0_TX_END_INT_ENA_S 0 + +#define RMT_INT_CLR_REG (DR_REG_RMT_BASE + 0x00ac) +/* RMT_CH7_TX_THR_EVENT_INT_CLR : WO ;bitpos:[31] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rmt_ch7_tx_thr_event_int_raw interrupt.*/ +#define RMT_CH7_TX_THR_EVENT_INT_CLR (BIT(31)) +#define RMT_CH7_TX_THR_EVENT_INT_CLR_M (BIT(31)) +#define RMT_CH7_TX_THR_EVENT_INT_CLR_V 0x1 +#define RMT_CH7_TX_THR_EVENT_INT_CLR_S 31 +/* RMT_CH6_TX_THR_EVENT_INT_CLR : WO ;bitpos:[30] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rmt_ch6_tx_thr_event_int_raw interrupt.*/ +#define RMT_CH6_TX_THR_EVENT_INT_CLR (BIT(30)) +#define RMT_CH6_TX_THR_EVENT_INT_CLR_M (BIT(30)) +#define RMT_CH6_TX_THR_EVENT_INT_CLR_V 0x1 +#define RMT_CH6_TX_THR_EVENT_INT_CLR_S 30 +/* RMT_CH5_TX_THR_EVENT_INT_CLR : WO ;bitpos:[29] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rmt_ch5_tx_thr_event_int_raw interrupt.*/ +#define RMT_CH5_TX_THR_EVENT_INT_CLR (BIT(29)) +#define RMT_CH5_TX_THR_EVENT_INT_CLR_M (BIT(29)) +#define RMT_CH5_TX_THR_EVENT_INT_CLR_V 0x1 +#define RMT_CH5_TX_THR_EVENT_INT_CLR_S 29 +/* RMT_CH4_TX_THR_EVENT_INT_CLR : WO ;bitpos:[28] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rmt_ch4_tx_thr_event_int_raw interrupt.*/ +#define RMT_CH4_TX_THR_EVENT_INT_CLR (BIT(28)) +#define RMT_CH4_TX_THR_EVENT_INT_CLR_M (BIT(28)) +#define RMT_CH4_TX_THR_EVENT_INT_CLR_V 0x1 +#define RMT_CH4_TX_THR_EVENT_INT_CLR_S 28 +/* RMT_CH3_TX_THR_EVENT_INT_CLR : WO ;bitpos:[27] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rmt_ch3_tx_thr_event_int_raw interrupt.*/ +#define RMT_CH3_TX_THR_EVENT_INT_CLR (BIT(27)) +#define RMT_CH3_TX_THR_EVENT_INT_CLR_M (BIT(27)) +#define RMT_CH3_TX_THR_EVENT_INT_CLR_V 0x1 +#define RMT_CH3_TX_THR_EVENT_INT_CLR_S 27 +/* RMT_CH2_TX_THR_EVENT_INT_CLR : WO ;bitpos:[26] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rmt_ch2_tx_thr_event_int_raw interrupt.*/ +#define RMT_CH2_TX_THR_EVENT_INT_CLR (BIT(26)) +#define RMT_CH2_TX_THR_EVENT_INT_CLR_M (BIT(26)) +#define RMT_CH2_TX_THR_EVENT_INT_CLR_V 0x1 +#define RMT_CH2_TX_THR_EVENT_INT_CLR_S 26 +/* RMT_CH1_TX_THR_EVENT_INT_CLR : WO ;bitpos:[25] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rmt_ch1_tx_thr_event_int_raw interrupt.*/ +#define RMT_CH1_TX_THR_EVENT_INT_CLR (BIT(25)) +#define RMT_CH1_TX_THR_EVENT_INT_CLR_M (BIT(25)) +#define RMT_CH1_TX_THR_EVENT_INT_CLR_V 0x1 +#define RMT_CH1_TX_THR_EVENT_INT_CLR_S 25 +/* RMT_CH0_TX_THR_EVENT_INT_CLR : WO ;bitpos:[24] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rmt_ch0_tx_thr_event_int_raw interrupt.*/ +#define RMT_CH0_TX_THR_EVENT_INT_CLR (BIT(24)) +#define RMT_CH0_TX_THR_EVENT_INT_CLR_M (BIT(24)) +#define RMT_CH0_TX_THR_EVENT_INT_CLR_V 0x1 +#define RMT_CH0_TX_THR_EVENT_INT_CLR_S 24 +/* RMT_CH7_ERR_INT_CLR : WO ;bitpos:[23] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rmt_ch7_err_int_raw.*/ +#define RMT_CH7_ERR_INT_CLR (BIT(23)) +#define RMT_CH7_ERR_INT_CLR_M (BIT(23)) +#define RMT_CH7_ERR_INT_CLR_V 0x1 +#define RMT_CH7_ERR_INT_CLR_S 23 +/* RMT_CH7_RX_END_INT_CLR : WO ;bitpos:[22] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rmt_ch7_tx_end_int_raw.*/ +#define RMT_CH7_RX_END_INT_CLR (BIT(22)) +#define RMT_CH7_RX_END_INT_CLR_M (BIT(22)) +#define RMT_CH7_RX_END_INT_CLR_V 0x1 +#define RMT_CH7_RX_END_INT_CLR_S 22 +/* RMT_CH7_TX_END_INT_CLR : WO ;bitpos:[21] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rmt_ch7_rx_end_int_raw..*/ +#define RMT_CH7_TX_END_INT_CLR (BIT(21)) +#define RMT_CH7_TX_END_INT_CLR_M (BIT(21)) +#define RMT_CH7_TX_END_INT_CLR_V 0x1 +#define RMT_CH7_TX_END_INT_CLR_S 21 +/* RMT_CH6_ERR_INT_CLR : WO ;bitpos:[20] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rmt_ch6_err_int_raw.*/ +#define RMT_CH6_ERR_INT_CLR (BIT(20)) +#define RMT_CH6_ERR_INT_CLR_M (BIT(20)) +#define RMT_CH6_ERR_INT_CLR_V 0x1 +#define RMT_CH6_ERR_INT_CLR_S 20 +/* RMT_CH6_RX_END_INT_CLR : WO ;bitpos:[19] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rmt_ch6_tx_end_int_raw.*/ +#define RMT_CH6_RX_END_INT_CLR (BIT(19)) +#define RMT_CH6_RX_END_INT_CLR_M (BIT(19)) +#define RMT_CH6_RX_END_INT_CLR_V 0x1 +#define RMT_CH6_RX_END_INT_CLR_S 19 +/* RMT_CH6_TX_END_INT_CLR : WO ;bitpos:[18] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rmt_ch6_rx_end_int_raw..*/ +#define RMT_CH6_TX_END_INT_CLR (BIT(18)) +#define RMT_CH6_TX_END_INT_CLR_M (BIT(18)) +#define RMT_CH6_TX_END_INT_CLR_V 0x1 +#define RMT_CH6_TX_END_INT_CLR_S 18 +/* RMT_CH5_ERR_INT_CLR : WO ;bitpos:[17] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rmt_ch5_err_int_raw.*/ +#define RMT_CH5_ERR_INT_CLR (BIT(17)) +#define RMT_CH5_ERR_INT_CLR_M (BIT(17)) +#define RMT_CH5_ERR_INT_CLR_V 0x1 +#define RMT_CH5_ERR_INT_CLR_S 17 +/* RMT_CH5_RX_END_INT_CLR : WO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rmt_ch5_tx_end_int_raw.*/ +#define RMT_CH5_RX_END_INT_CLR (BIT(16)) +#define RMT_CH5_RX_END_INT_CLR_M (BIT(16)) +#define RMT_CH5_RX_END_INT_CLR_V 0x1 +#define RMT_CH5_RX_END_INT_CLR_S 16 +/* RMT_CH5_TX_END_INT_CLR : WO ;bitpos:[15] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rmt_ch5_rx_end_int_raw..*/ +#define RMT_CH5_TX_END_INT_CLR (BIT(15)) +#define RMT_CH5_TX_END_INT_CLR_M (BIT(15)) +#define RMT_CH5_TX_END_INT_CLR_V 0x1 +#define RMT_CH5_TX_END_INT_CLR_S 15 +/* RMT_CH4_ERR_INT_CLR : WO ;bitpos:[14] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rmt_ch4_err_int_raw.*/ +#define RMT_CH4_ERR_INT_CLR (BIT(14)) +#define RMT_CH4_ERR_INT_CLR_M (BIT(14)) +#define RMT_CH4_ERR_INT_CLR_V 0x1 +#define RMT_CH4_ERR_INT_CLR_S 14 +/* RMT_CH4_RX_END_INT_CLR : WO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rmt_ch4_tx_end_int_raw.*/ +#define RMT_CH4_RX_END_INT_CLR (BIT(13)) +#define RMT_CH4_RX_END_INT_CLR_M (BIT(13)) +#define RMT_CH4_RX_END_INT_CLR_V 0x1 +#define RMT_CH4_RX_END_INT_CLR_S 13 +/* RMT_CH4_TX_END_INT_CLR : WO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rmt_ch4_rx_end_int_raw..*/ +#define RMT_CH4_TX_END_INT_CLR (BIT(12)) +#define RMT_CH4_TX_END_INT_CLR_M (BIT(12)) +#define RMT_CH4_TX_END_INT_CLR_V 0x1 +#define RMT_CH4_TX_END_INT_CLR_S 12 +/* RMT_CH3_ERR_INT_CLR : WO ;bitpos:[11] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rmt_ch3_err_int_raw.*/ +#define RMT_CH3_ERR_INT_CLR (BIT(11)) +#define RMT_CH3_ERR_INT_CLR_M (BIT(11)) +#define RMT_CH3_ERR_INT_CLR_V 0x1 +#define RMT_CH3_ERR_INT_CLR_S 11 +/* RMT_CH3_RX_END_INT_CLR : WO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rmt_ch3_tx_end_int_raw.*/ +#define RMT_CH3_RX_END_INT_CLR (BIT(10)) +#define RMT_CH3_RX_END_INT_CLR_M (BIT(10)) +#define RMT_CH3_RX_END_INT_CLR_V 0x1 +#define RMT_CH3_RX_END_INT_CLR_S 10 +/* RMT_CH3_TX_END_INT_CLR : WO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rmt_ch3_rx_end_int_raw..*/ +#define RMT_CH3_TX_END_INT_CLR (BIT(9)) +#define RMT_CH3_TX_END_INT_CLR_M (BIT(9)) +#define RMT_CH3_TX_END_INT_CLR_V 0x1 +#define RMT_CH3_TX_END_INT_CLR_S 9 +/* RMT_CH2_ERR_INT_CLR : WO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rmt_ch2_err_int_raw.*/ +#define RMT_CH2_ERR_INT_CLR (BIT(8)) +#define RMT_CH2_ERR_INT_CLR_M (BIT(8)) +#define RMT_CH2_ERR_INT_CLR_V 0x1 +#define RMT_CH2_ERR_INT_CLR_S 8 +/* RMT_CH2_RX_END_INT_CLR : WO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rmt_ch2_tx_end_int_raw.*/ +#define RMT_CH2_RX_END_INT_CLR (BIT(7)) +#define RMT_CH2_RX_END_INT_CLR_M (BIT(7)) +#define RMT_CH2_RX_END_INT_CLR_V 0x1 +#define RMT_CH2_RX_END_INT_CLR_S 7 +/* RMT_CH2_TX_END_INT_CLR : WO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rmt_ch2_rx_end_int_raw..*/ +#define RMT_CH2_TX_END_INT_CLR (BIT(6)) +#define RMT_CH2_TX_END_INT_CLR_M (BIT(6)) +#define RMT_CH2_TX_END_INT_CLR_V 0x1 +#define RMT_CH2_TX_END_INT_CLR_S 6 +/* RMT_CH1_ERR_INT_CLR : WO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rmt_ch1_err_int_raw.*/ +#define RMT_CH1_ERR_INT_CLR (BIT(5)) +#define RMT_CH1_ERR_INT_CLR_M (BIT(5)) +#define RMT_CH1_ERR_INT_CLR_V 0x1 +#define RMT_CH1_ERR_INT_CLR_S 5 +/* RMT_CH1_RX_END_INT_CLR : WO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rmt_ch1_tx_end_int_raw.*/ +#define RMT_CH1_RX_END_INT_CLR (BIT(4)) +#define RMT_CH1_RX_END_INT_CLR_M (BIT(4)) +#define RMT_CH1_RX_END_INT_CLR_V 0x1 +#define RMT_CH1_RX_END_INT_CLR_S 4 +/* RMT_CH1_TX_END_INT_CLR : WO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rmt_ch1_rx_end_int_raw..*/ +#define RMT_CH1_TX_END_INT_CLR (BIT(3)) +#define RMT_CH1_TX_END_INT_CLR_M (BIT(3)) +#define RMT_CH1_TX_END_INT_CLR_V 0x1 +#define RMT_CH1_TX_END_INT_CLR_S 3 +/* RMT_CH0_ERR_INT_CLR : WO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rmt_ch0_err_int_raw.*/ +#define RMT_CH0_ERR_INT_CLR (BIT(2)) +#define RMT_CH0_ERR_INT_CLR_M (BIT(2)) +#define RMT_CH0_ERR_INT_CLR_V 0x1 +#define RMT_CH0_ERR_INT_CLR_S 2 +/* RMT_CH0_RX_END_INT_CLR : WO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rmt_ch0_tx_end_int_raw.*/ +#define RMT_CH0_RX_END_INT_CLR (BIT(1)) +#define RMT_CH0_RX_END_INT_CLR_M (BIT(1)) +#define RMT_CH0_RX_END_INT_CLR_V 0x1 +#define RMT_CH0_RX_END_INT_CLR_S 1 +/* RMT_CH0_TX_END_INT_CLR : WO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: Set this bit to clear the rmt_ch0_rx_end_int_raw..*/ +#define RMT_CH0_TX_END_INT_CLR (BIT(0)) +#define RMT_CH0_TX_END_INT_CLR_M (BIT(0)) +#define RMT_CH0_TX_END_INT_CLR_V 0x1 +#define RMT_CH0_TX_END_INT_CLR_S 0 + +#define RMT_CH0CARRIER_DUTY_REG (DR_REG_RMT_BASE + 0x00b0) +/* RMT_CARRIER_HIGH_CH0 : R/W ;bitpos:[31:16] ;default: 16'h40 ; */ +/*description: This register is used to configure carrier wave's high level value for channel0.*/ +#define RMT_CARRIER_HIGH_CH0 0x0000FFFF +#define RMT_CARRIER_HIGH_CH0_M ((RMT_CARRIER_HIGH_CH0_V)<<(RMT_CARRIER_HIGH_CH0_S)) +#define RMT_CARRIER_HIGH_CH0_V 0xFFFF +#define RMT_CARRIER_HIGH_CH0_S 16 +/* RMT_CARRIER_LOW_CH0 : R/W ;bitpos:[15:0] ;default: 16'h40 ; */ +/*description: This register is used to configure carrier wave's low level value for channel0.*/ +#define RMT_CARRIER_LOW_CH0 0x0000FFFF +#define RMT_CARRIER_LOW_CH0_M ((RMT_CARRIER_LOW_CH0_V)<<(RMT_CARRIER_LOW_CH0_S)) +#define RMT_CARRIER_LOW_CH0_V 0xFFFF +#define RMT_CARRIER_LOW_CH0_S 0 + +#define RMT_CH1CARRIER_DUTY_REG (DR_REG_RMT_BASE + 0x00b4) +/* RMT_CARRIER_HIGH_CH1 : R/W ;bitpos:[31:16] ;default: 16'h40 ; */ +/*description: This register is used to configure carrier wave's high level value for channel1.*/ +#define RMT_CARRIER_HIGH_CH1 0x0000FFFF +#define RMT_CARRIER_HIGH_CH1_M ((RMT_CARRIER_HIGH_CH1_V)<<(RMT_CARRIER_HIGH_CH1_S)) +#define RMT_CARRIER_HIGH_CH1_V 0xFFFF +#define RMT_CARRIER_HIGH_CH1_S 16 +/* RMT_CARRIER_LOW_CH1 : R/W ;bitpos:[15:0] ;default: 16'h40 ; */ +/*description: This register is used to configure carrier wave's low level value for channel1.*/ +#define RMT_CARRIER_LOW_CH1 0x0000FFFF +#define RMT_CARRIER_LOW_CH1_M ((RMT_CARRIER_LOW_CH1_V)<<(RMT_CARRIER_LOW_CH1_S)) +#define RMT_CARRIER_LOW_CH1_V 0xFFFF +#define RMT_CARRIER_LOW_CH1_S 0 + +#define RMT_CH2CARRIER_DUTY_REG (DR_REG_RMT_BASE + 0x00b8) +/* RMT_CARRIER_HIGH_CH2 : R/W ;bitpos:[31:16] ;default: 16'h40 ; */ +/*description: This register is used to configure carrier wave's high level value for channel2.*/ +#define RMT_CARRIER_HIGH_CH2 0x0000FFFF +#define RMT_CARRIER_HIGH_CH2_M ((RMT_CARRIER_HIGH_CH2_V)<<(RMT_CARRIER_HIGH_CH2_S)) +#define RMT_CARRIER_HIGH_CH2_V 0xFFFF +#define RMT_CARRIER_HIGH_CH2_S 16 +/* RMT_CARRIER_LOW_CH2 : R/W ;bitpos:[15:0] ;default: 16'h40 ; */ +/*description: This register is used to configure carrier wave's low level value for channel2.*/ +#define RMT_CARRIER_LOW_CH2 0x0000FFFF +#define RMT_CARRIER_LOW_CH2_M ((RMT_CARRIER_LOW_CH2_V)<<(RMT_CARRIER_LOW_CH2_S)) +#define RMT_CARRIER_LOW_CH2_V 0xFFFF +#define RMT_CARRIER_LOW_CH2_S 0 + +#define RMT_CH3CARRIER_DUTY_REG (DR_REG_RMT_BASE + 0x00bc) +/* RMT_CARRIER_HIGH_CH3 : R/W ;bitpos:[31:16] ;default: 16'h40 ; */ +/*description: This register is used to configure carrier wave's high level value for channel3.*/ +#define RMT_CARRIER_HIGH_CH3 0x0000FFFF +#define RMT_CARRIER_HIGH_CH3_M ((RMT_CARRIER_HIGH_CH3_V)<<(RMT_CARRIER_HIGH_CH3_S)) +#define RMT_CARRIER_HIGH_CH3_V 0xFFFF +#define RMT_CARRIER_HIGH_CH3_S 16 +/* RMT_CARRIER_LOW_CH3 : R/W ;bitpos:[15:0] ;default: 16'h40 ; */ +/*description: This register is used to configure carrier wave's low level value for channel3.*/ +#define RMT_CARRIER_LOW_CH3 0x0000FFFF +#define RMT_CARRIER_LOW_CH3_M ((RMT_CARRIER_LOW_CH3_V)<<(RMT_CARRIER_LOW_CH3_S)) +#define RMT_CARRIER_LOW_CH3_V 0xFFFF +#define RMT_CARRIER_LOW_CH3_S 0 + +#define RMT_CH4CARRIER_DUTY_REG (DR_REG_RMT_BASE + 0x00c0) +/* RMT_CARRIER_HIGH_CH4 : R/W ;bitpos:[31:16] ;default: 16'h40 ; */ +/*description: This register is used to configure carrier wave's high level value for channel4.*/ +#define RMT_CARRIER_HIGH_CH4 0x0000FFFF +#define RMT_CARRIER_HIGH_CH4_M ((RMT_CARRIER_HIGH_CH4_V)<<(RMT_CARRIER_HIGH_CH4_S)) +#define RMT_CARRIER_HIGH_CH4_V 0xFFFF +#define RMT_CARRIER_HIGH_CH4_S 16 +/* RMT_CARRIER_LOW_CH4 : R/W ;bitpos:[15:0] ;default: 16'h40 ; */ +/*description: This register is used to configure carrier wave's low level value for channel4.*/ +#define RMT_CARRIER_LOW_CH4 0x0000FFFF +#define RMT_CARRIER_LOW_CH4_M ((RMT_CARRIER_LOW_CH4_V)<<(RMT_CARRIER_LOW_CH4_S)) +#define RMT_CARRIER_LOW_CH4_V 0xFFFF +#define RMT_CARRIER_LOW_CH4_S 0 + +#define RMT_CH5CARRIER_DUTY_REG (DR_REG_RMT_BASE + 0x00c4) +/* RMT_CARRIER_HIGH_CH5 : R/W ;bitpos:[31:16] ;default: 16'h40 ; */ +/*description: This register is used to configure carrier wave's high level value for channel5.*/ +#define RMT_CARRIER_HIGH_CH5 0x0000FFFF +#define RMT_CARRIER_HIGH_CH5_M ((RMT_CARRIER_HIGH_CH5_V)<<(RMT_CARRIER_HIGH_CH5_S)) +#define RMT_CARRIER_HIGH_CH5_V 0xFFFF +#define RMT_CARRIER_HIGH_CH5_S 16 +/* RMT_CARRIER_LOW_CH5 : R/W ;bitpos:[15:0] ;default: 16'h40 ; */ +/*description: This register is used to configure carrier wave's low level value for channel5.*/ +#define RMT_CARRIER_LOW_CH5 0x0000FFFF +#define RMT_CARRIER_LOW_CH5_M ((RMT_CARRIER_LOW_CH5_V)<<(RMT_CARRIER_LOW_CH5_S)) +#define RMT_CARRIER_LOW_CH5_V 0xFFFF +#define RMT_CARRIER_LOW_CH5_S 0 + +#define RMT_CH6CARRIER_DUTY_REG (DR_REG_RMT_BASE + 0x00c8) +/* RMT_CARRIER_HIGH_CH6 : R/W ;bitpos:[31:16] ;default: 16'h40 ; */ +/*description: This register is used to configure carrier wave's high level value for channel6.*/ +#define RMT_CARRIER_HIGH_CH6 0x0000FFFF +#define RMT_CARRIER_HIGH_CH6_M ((RMT_CARRIER_HIGH_CH6_V)<<(RMT_CARRIER_HIGH_CH6_S)) +#define RMT_CARRIER_HIGH_CH6_V 0xFFFF +#define RMT_CARRIER_HIGH_CH6_S 16 +/* RMT_CARRIER_LOW_CH6 : R/W ;bitpos:[15:0] ;default: 16'h40 ; */ +/*description: This register is used to configure carrier wave's low level value for channel6.*/ +#define RMT_CARRIER_LOW_CH6 0x0000FFFF +#define RMT_CARRIER_LOW_CH6_M ((RMT_CARRIER_LOW_CH6_V)<<(RMT_CARRIER_LOW_CH6_S)) +#define RMT_CARRIER_LOW_CH6_V 0xFFFF +#define RMT_CARRIER_LOW_CH6_S 0 + +#define RMT_CH7CARRIER_DUTY_REG (DR_REG_RMT_BASE + 0x00cc) +/* RMT_CARRIER_HIGH_CH7 : R/W ;bitpos:[31:16] ;default: 16'h40 ; */ +/*description: This register is used to configure carrier wave's high level value for channel7.*/ +#define RMT_CARRIER_HIGH_CH7 0x0000FFFF +#define RMT_CARRIER_HIGH_CH7_M ((RMT_CARRIER_HIGH_CH7_V)<<(RMT_CARRIER_HIGH_CH7_S)) +#define RMT_CARRIER_HIGH_CH7_V 0xFFFF +#define RMT_CARRIER_HIGH_CH7_S 16 +/* RMT_CARRIER_LOW_CH7 : R/W ;bitpos:[15:0] ;default: 16'h40 ; */ +/*description: This register is used to configure carrier wave's low level value for channel7.*/ +#define RMT_CARRIER_LOW_CH7 0x0000FFFF +#define RMT_CARRIER_LOW_CH7_M ((RMT_CARRIER_LOW_CH7_V)<<(RMT_CARRIER_LOW_CH7_S)) +#define RMT_CARRIER_LOW_CH7_V 0xFFFF +#define RMT_CARRIER_LOW_CH7_S 0 + +#define RMT_CH0_TX_LIM_REG (DR_REG_RMT_BASE + 0x00d0) +/* RMT_TX_LIM_CH0 : R/W ;bitpos:[8:0] ;default: 9'h80 ; */ +/*description: When channel0 sends more than reg_rmt_tx_lim_ch0 datas then channel0 + produce the relative interrupt.*/ +#define RMT_TX_LIM_CH0 0x000001FF +#define RMT_TX_LIM_CH0_M ((RMT_TX_LIM_CH0_V)<<(RMT_TX_LIM_CH0_S)) +#define RMT_TX_LIM_CH0_V 0x1FF +#define RMT_TX_LIM_CH0_S 0 + +#define RMT_CH1_TX_LIM_REG (DR_REG_RMT_BASE + 0x00d4) +/* RMT_TX_LIM_CH1 : R/W ;bitpos:[8:0] ;default: 9'h80 ; */ +/*description: When channel1 sends more than reg_rmt_tx_lim_ch1 datas then channel1 + produce the relative interrupt.*/ +#define RMT_TX_LIM_CH1 0x000001FF +#define RMT_TX_LIM_CH1_M ((RMT_TX_LIM_CH1_V)<<(RMT_TX_LIM_CH1_S)) +#define RMT_TX_LIM_CH1_V 0x1FF +#define RMT_TX_LIM_CH1_S 0 + +#define RMT_CH2_TX_LIM_REG (DR_REG_RMT_BASE + 0x00d8) +/* RMT_TX_LIM_CH2 : R/W ;bitpos:[8:0] ;default: 9'h80 ; */ +/*description: When channel2 sends more than reg_rmt_tx_lim_ch2 datas then channel2 + produce the relative interrupt.*/ +#define RMT_TX_LIM_CH2 0x000001FF +#define RMT_TX_LIM_CH2_M ((RMT_TX_LIM_CH2_V)<<(RMT_TX_LIM_CH2_S)) +#define RMT_TX_LIM_CH2_V 0x1FF +#define RMT_TX_LIM_CH2_S 0 + +#define RMT_CH3_TX_LIM_REG (DR_REG_RMT_BASE + 0x00dc) +/* RMT_TX_LIM_CH3 : R/W ;bitpos:[8:0] ;default: 9'h80 ; */ +/*description: When channel3 sends more than reg_rmt_tx_lim_ch3 datas then channel3 + produce the relative interrupt.*/ +#define RMT_TX_LIM_CH3 0x000001FF +#define RMT_TX_LIM_CH3_M ((RMT_TX_LIM_CH3_V)<<(RMT_TX_LIM_CH3_S)) +#define RMT_TX_LIM_CH3_V 0x1FF +#define RMT_TX_LIM_CH3_S 0 + +#define RMT_CH4_TX_LIM_REG (DR_REG_RMT_BASE + 0x00e0) +/* RMT_TX_LIM_CH4 : R/W ;bitpos:[8:0] ;default: 9'h80 ; */ +/*description: When channel4 sends more than reg_rmt_tx_lim_ch4 datas then channel4 + produce the relative interrupt.*/ +#define RMT_TX_LIM_CH4 0x000001FF +#define RMT_TX_LIM_CH4_M ((RMT_TX_LIM_CH4_V)<<(RMT_TX_LIM_CH4_S)) +#define RMT_TX_LIM_CH4_V 0x1FF +#define RMT_TX_LIM_CH4_S 0 + +#define RMT_CH5_TX_LIM_REG (DR_REG_RMT_BASE + 0x00e4) +/* RMT_TX_LIM_CH5 : R/W ;bitpos:[8:0] ;default: 9'h80 ; */ +/*description: When channel5 sends more than reg_rmt_tx_lim_ch5 datas then channel5 + produce the relative interrupt.*/ +#define RMT_TX_LIM_CH5 0x000001FF +#define RMT_TX_LIM_CH5_M ((RMT_TX_LIM_CH5_V)<<(RMT_TX_LIM_CH5_S)) +#define RMT_TX_LIM_CH5_V 0x1FF +#define RMT_TX_LIM_CH5_S 0 + +#define RMT_CH6_TX_LIM_REG (DR_REG_RMT_BASE + 0x00e8) +/* RMT_TX_LIM_CH6 : R/W ;bitpos:[8:0] ;default: 9'h80 ; */ +/*description: When channel6 sends more than reg_rmt_tx_lim_ch6 datas then channel6 + produce the relative interrupt.*/ +#define RMT_TX_LIM_CH6 0x000001FF +#define RMT_TX_LIM_CH6_M ((RMT_TX_LIM_CH6_V)<<(RMT_TX_LIM_CH6_S)) +#define RMT_TX_LIM_CH6_V 0x1FF +#define RMT_TX_LIM_CH6_S 0 + +#define RMT_CH7_TX_LIM_REG (DR_REG_RMT_BASE + 0x00ec) +/* RMT_TX_LIM_CH7 : R/W ;bitpos:[8:0] ;default: 9'h80 ; */ +/*description: When channel7 sends more than reg_rmt_tx_lim_ch7 datas then channel7 + produce the relative interrupt.*/ +#define RMT_TX_LIM_CH7 0x000001FF +#define RMT_TX_LIM_CH7_M ((RMT_TX_LIM_CH7_V)<<(RMT_TX_LIM_CH7_S)) +#define RMT_TX_LIM_CH7_V 0x1FF +#define RMT_TX_LIM_CH7_S 0 + +#define RMT_APB_CONF_REG (DR_REG_RMT_BASE + 0x00f0) +/* RMT_MEM_TX_WRAP_EN : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: when datas need to be send is more than channel's mem can store + then set this bit to enable reusage of mem this bit is used together with reg_rmt_tx_lim_chn.*/ +#define RMT_MEM_TX_WRAP_EN (BIT(1)) +#define RMT_MEM_TX_WRAP_EN_M (BIT(1)) +#define RMT_MEM_TX_WRAP_EN_V 0x1 +#define RMT_MEM_TX_WRAP_EN_S 1 +/* RMT_APB_FIFO_MASK : R/W ;bitpos:[0] ;default: 1'h0 ; */ +/*description: Set this bit to disable apb fifo access*/ +#define RMT_APB_FIFO_MASK (BIT(0)) +#define RMT_APB_FIFO_MASK_M (BIT(0)) +#define RMT_APB_FIFO_MASK_V 0x1 +#define RMT_APB_FIFO_MASK_S 0 + +#define RMT_DATE_REG (DR_REG_RMT_BASE + 0x00fc) +/* RMT_DATE : R/W ;bitpos:[31:0] ;default: 32'h16022600 ; */ +/*description: This is the version register.*/ +#define RMT_DATE 0xFFFFFFFF +#define RMT_DATE_M ((RMT_DATE_V)<<(RMT_DATE_S)) +#define RMT_DATE_V 0xFFFFFFFF +#define RMT_DATE_S 0 + +/* RMT memory block address */ +#define RMT_CHANNEL_MEM(i) (DR_REG_RMT_BASE + 0x800 + 64 * 4 * (i)) + + +#endif /*_SOC_RMT_REG_H_ */ + + diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/rmt_struct.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/rmt_struct.h new file mode 100644 index 0000000000000..9736a28a77603 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/rmt_struct.h @@ -0,0 +1,264 @@ +// 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. +#ifndef _SOC_RMT_STRUCT_H_ +#define _SOC_RMT_STRUCT_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef volatile struct rmt_dev_s { + uint32_t data_ch[8]; /*The R/W ram address for channel0-7 by apb fifo access. + Note that in some circumstances, data read from the FIFO may get lost. As RMT memory area accesses using the RMTMEM method do not have this issue + and provide all the functionality that the FIFO register has, it is encouraged to use that instead.*/ + struct{ + union { + struct { + uint32_t div_cnt: 8; /*This register is used to configure the frequency divider's factor in channel0-7.*/ + uint32_t idle_thres: 16; /*In receive mode when no edge is detected on the input signal for longer than reg_idle_thres_ch0 then the receive process is done.*/ + uint32_t mem_size: 4; /*This register is used to configure the the amount of memory blocks allocated to channel0-7.*/ + uint32_t carrier_en: 1; /*This is the carrier modulation enable control bit for channel0-7.*/ + uint32_t carrier_out_lv: 1; /*This bit is used to configure the way carrier wave is modulated for channel0-7.1'b1:transmit on low output level 1'b0:transmit on high output level.*/ + uint32_t mem_pd: 1; /*This bit is used to reduce power consumed by memory. 1:memory is in low power state.*/ + uint32_t clk_en: 1; /*This bit is used to control clock.when software configure RMT internal registers it controls the register clock.*/ + }; + uint32_t val; + } conf0; + union { + struct { + uint32_t tx_start: 1; /*Set this bit to start sending data for channel0-7.*/ + uint32_t rx_en: 1; /*Set this bit to enable receiving data for channel0-7.*/ + uint32_t mem_wr_rst: 1; /*Set this bit to reset write ram address for channel0-7 by receiver access.*/ + uint32_t mem_rd_rst: 1; /*Set this bit to reset read ram address for channel0-7 by transmitter access.*/ + uint32_t apb_mem_rst: 1; /*Set this bit to reset W/R ram address for channel0-7 by apb fifo access (using fifo is discouraged, please see the note above at data_ch[] item)*/ + uint32_t mem_owner: 1; /*This is the mark of channel0-7's ram usage right.1'b1:receiver uses the ram 0:transmitter uses the ram*/ + uint32_t tx_conti_mode: 1; /*Set this bit to continue sending from the first data to the last data in channel0-7 again and again.*/ + uint32_t rx_filter_en: 1; /*This is the receive filter enable bit for channel0-7.*/ + uint32_t rx_filter_thres: 8; /*in receive mode channel0-7 ignore input pulse when the pulse width is smaller then this value.*/ + uint32_t ref_cnt_rst: 1; /*This bit is used to reset divider in channel0-7.*/ + uint32_t ref_always_on: 1; /*This bit is used to select base clock. 1'b1:clk_apb 1'b0:clk_ref*/ + uint32_t idle_out_lv: 1; /*This bit configures the output signal's level for channel0-7 in IDLE state.*/ + uint32_t idle_out_en: 1; /*This is the output enable control bit for channel0-7 in IDLE state.*/ + uint32_t reserved20: 12; + }; + uint32_t val; + } conf1; + } conf_ch[8]; + uint32_t status_ch[8]; /*The status for channel0-7*/ + uint32_t apb_mem_addr_ch[8]; /*The ram relative address in channel0-7 by apb fifo access (using fifo is discouraged, please see the note above at data_ch[] item)*/ + union { + struct { + uint32_t ch0_tx_end: 1; /*The interrupt raw bit for channel 0 turns to high level when the transmit process is done.*/ + uint32_t ch0_rx_end: 1; /*The interrupt raw bit for channel 0 turns to high level when the receive process is done.*/ + uint32_t ch0_err: 1; /*The interrupt raw bit for channel 0 turns to high level when channel 0 detects some errors.*/ + uint32_t ch1_tx_end: 1; /*The interrupt raw bit for channel 1 turns to high level when the transmit process is done.*/ + uint32_t ch1_rx_end: 1; /*The interrupt raw bit for channel 1 turns to high level when the receive process is done.*/ + uint32_t ch1_err: 1; /*The interrupt raw bit for channel 1 turns to high level when channel 1 detects some errors.*/ + uint32_t ch2_tx_end: 1; /*The interrupt raw bit for channel 2 turns to high level when the transmit process is done.*/ + uint32_t ch2_rx_end: 1; /*The interrupt raw bit for channel 2 turns to high level when the receive process is done.*/ + uint32_t ch2_err: 1; /*The interrupt raw bit for channel 2 turns to high level when channel 2 detects some errors.*/ + uint32_t ch3_tx_end: 1; /*The interrupt raw bit for channel 3 turns to high level when the transmit process is done.*/ + uint32_t ch3_rx_end: 1; /*The interrupt raw bit for channel 3 turns to high level when the receive process is done.*/ + uint32_t ch3_err: 1; /*The interrupt raw bit for channel 3 turns to high level when channel 3 detects some errors.*/ + uint32_t ch4_tx_end: 1; /*The interrupt raw bit for channel 4 turns to high level when the transmit process is done.*/ + uint32_t ch4_rx_end: 1; /*The interrupt raw bit for channel 4 turns to high level when the receive process is done.*/ + uint32_t ch4_err: 1; /*The interrupt raw bit for channel 4 turns to high level when channel 4 detects some errors.*/ + uint32_t ch5_tx_end: 1; /*The interrupt raw bit for channel 5 turns to high level when the transmit process is done.*/ + uint32_t ch5_rx_end: 1; /*The interrupt raw bit for channel 5 turns to high level when the receive process is done.*/ + uint32_t ch5_err: 1; /*The interrupt raw bit for channel 5 turns to high level when channel 5 detects some errors.*/ + uint32_t ch6_tx_end: 1; /*The interrupt raw bit for channel 6 turns to high level when the transmit process is done.*/ + uint32_t ch6_rx_end: 1; /*The interrupt raw bit for channel 6 turns to high level when the receive process is done.*/ + uint32_t ch6_err: 1; /*The interrupt raw bit for channel 6 turns to high level when channel 6 detects some errors.*/ + uint32_t ch7_tx_end: 1; /*The interrupt raw bit for channel 7 turns to high level when the transmit process is done.*/ + uint32_t ch7_rx_end: 1; /*The interrupt raw bit for channel 7 turns to high level when the receive process is done.*/ + uint32_t ch7_err: 1; /*The interrupt raw bit for channel 7 turns to high level when channel 7 detects some errors.*/ + uint32_t ch0_tx_thr_event: 1; /*The interrupt raw bit for channel 0 turns to high level when transmitter in channel0 have send data more than reg_rmt_tx_lim_ch0 after detecting this interrupt software can updata the old data with new data.*/ + uint32_t ch1_tx_thr_event: 1; /*The interrupt raw bit for channel 1 turns to high level when transmitter in channel1 have send data more than reg_rmt_tx_lim_ch1 after detecting this interrupt software can updata the old data with new data.*/ + uint32_t ch2_tx_thr_event: 1; /*The interrupt raw bit for channel 2 turns to high level when transmitter in channel2 have send data more than reg_rmt_tx_lim_ch2 after detecting this interrupt software can updata the old data with new data.*/ + uint32_t ch3_tx_thr_event: 1; /*The interrupt raw bit for channel 3 turns to high level when transmitter in channel3 have send data more than reg_rmt_tx_lim_ch3 after detecting this interrupt software can updata the old data with new data.*/ + uint32_t ch4_tx_thr_event: 1; /*The interrupt raw bit for channel 4 turns to high level when transmitter in channel4 have send data more than reg_rmt_tx_lim_ch4 after detecting this interrupt software can updata the old data with new data.*/ + uint32_t ch5_tx_thr_event: 1; /*The interrupt raw bit for channel 5 turns to high level when transmitter in channel5 have send data more than reg_rmt_tx_lim_ch5 after detecting this interrupt software can updata the old data with new data.*/ + uint32_t ch6_tx_thr_event: 1; /*The interrupt raw bit for channel 6 turns to high level when transmitter in channel6 have send data more than reg_rmt_tx_lim_ch6 after detecting this interrupt software can updata the old data with new data.*/ + uint32_t ch7_tx_thr_event: 1; /*The interrupt raw bit for channel 7 turns to high level when transmitter in channel7 have send data more than reg_rmt_tx_lim_ch7 after detecting this interrupt software can updata the old data with new data.*/ + }; + uint32_t val; + } int_raw; + union { + struct { + uint32_t ch0_tx_end: 1; /*The interrupt state bit for channel 0's mt_ch0_tx_end_int_raw when mt_ch0_tx_end_int_ena is set to 0.*/ + uint32_t ch0_rx_end: 1; /*The interrupt state bit for channel 0's rmt_ch0_rx_end_int_raw when rmt_ch0_rx_end_int_ena is set to 0.*/ + uint32_t ch0_err: 1; /*The interrupt state bit for channel 0's rmt_ch0_err_int_raw when rmt_ch0_err_int_ena is set to 0.*/ + uint32_t ch1_tx_end: 1; /*The interrupt state bit for channel 1's mt_ch1_tx_end_int_raw when mt_ch1_tx_end_int_ena is set to 1.*/ + uint32_t ch1_rx_end: 1; /*The interrupt state bit for channel 1's rmt_ch1_rx_end_int_raw when rmt_ch1_rx_end_int_ena is set to 1.*/ + uint32_t ch1_err: 1; /*The interrupt state bit for channel 1's rmt_ch1_err_int_raw when rmt_ch1_err_int_ena is set to 1.*/ + uint32_t ch2_tx_end: 1; /*The interrupt state bit for channel 2's mt_ch2_tx_end_int_raw when mt_ch2_tx_end_int_ena is set to 1.*/ + uint32_t ch2_rx_end: 1; /*The interrupt state bit for channel 2's rmt_ch2_rx_end_int_raw when rmt_ch2_rx_end_int_ena is set to 1.*/ + uint32_t ch2_err: 1; /*The interrupt state bit for channel 2's rmt_ch2_err_int_raw when rmt_ch2_err_int_ena is set to 1.*/ + uint32_t ch3_tx_end: 1; /*The interrupt state bit for channel 3's mt_ch3_tx_end_int_raw when mt_ch3_tx_end_int_ena is set to 1.*/ + uint32_t ch3_rx_end: 1; /*The interrupt state bit for channel 3's rmt_ch3_rx_end_int_raw when rmt_ch3_rx_end_int_ena is set to 1.*/ + uint32_t ch3_err: 1; /*The interrupt state bit for channel 3's rmt_ch3_err_int_raw when rmt_ch3_err_int_ena is set to 1.*/ + uint32_t ch4_tx_end: 1; /*The interrupt state bit for channel 4's mt_ch4_tx_end_int_raw when mt_ch4_tx_end_int_ena is set to 1.*/ + uint32_t ch4_rx_end: 1; /*The interrupt state bit for channel 4's rmt_ch4_rx_end_int_raw when rmt_ch4_rx_end_int_ena is set to 1.*/ + uint32_t ch4_err: 1; /*The interrupt state bit for channel 4's rmt_ch4_err_int_raw when rmt_ch4_err_int_ena is set to 1.*/ + uint32_t ch5_tx_end: 1; /*The interrupt state bit for channel 5's mt_ch5_tx_end_int_raw when mt_ch5_tx_end_int_ena is set to 1.*/ + uint32_t ch5_rx_end: 1; /*The interrupt state bit for channel 5's rmt_ch5_rx_end_int_raw when rmt_ch5_rx_end_int_ena is set to 1.*/ + uint32_t ch5_err: 1; /*The interrupt state bit for channel 5's rmt_ch5_err_int_raw when rmt_ch5_err_int_ena is set to 1.*/ + uint32_t ch6_tx_end: 1; /*The interrupt state bit for channel 6's mt_ch6_tx_end_int_raw when mt_ch6_tx_end_int_ena is set to 1.*/ + uint32_t ch6_rx_end: 1; /*The interrupt state bit for channel 6's rmt_ch6_rx_end_int_raw when rmt_ch6_rx_end_int_ena is set to 1.*/ + uint32_t ch6_err: 1; /*The interrupt state bit for channel 6's rmt_ch6_err_int_raw when rmt_ch6_err_int_ena is set to 1.*/ + uint32_t ch7_tx_end: 1; /*The interrupt state bit for channel 7's mt_ch7_tx_end_int_raw when mt_ch7_tx_end_int_ena is set to 1.*/ + uint32_t ch7_rx_end: 1; /*The interrupt state bit for channel 7's rmt_ch7_rx_end_int_raw when rmt_ch7_rx_end_int_ena is set to 1.*/ + uint32_t ch7_err: 1; /*The interrupt state bit for channel 7's rmt_ch7_err_int_raw when rmt_ch7_err_int_ena is set to 1.*/ + uint32_t ch0_tx_thr_event: 1; /*The interrupt state bit for channel 0's rmt_ch0_tx_thr_event_int_raw when mt_ch0_tx_thr_event_int_ena is set to 1.*/ + uint32_t ch1_tx_thr_event: 1; /*The interrupt state bit for channel 1's rmt_ch1_tx_thr_event_int_raw when mt_ch1_tx_thr_event_int_ena is set to 1.*/ + uint32_t ch2_tx_thr_event: 1; /*The interrupt state bit for channel 2's rmt_ch2_tx_thr_event_int_raw when mt_ch2_tx_thr_event_int_ena is set to 1.*/ + uint32_t ch3_tx_thr_event: 1; /*The interrupt state bit for channel 3's rmt_ch3_tx_thr_event_int_raw when mt_ch3_tx_thr_event_int_ena is set to 1.*/ + uint32_t ch4_tx_thr_event: 1; /*The interrupt state bit for channel 4's rmt_ch4_tx_thr_event_int_raw when mt_ch4_tx_thr_event_int_ena is set to 1.*/ + uint32_t ch5_tx_thr_event: 1; /*The interrupt state bit for channel 5's rmt_ch5_tx_thr_event_int_raw when mt_ch5_tx_thr_event_int_ena is set to 1.*/ + uint32_t ch6_tx_thr_event: 1; /*The interrupt state bit for channel 6's rmt_ch6_tx_thr_event_int_raw when mt_ch6_tx_thr_event_int_ena is set to 1.*/ + uint32_t ch7_tx_thr_event: 1; /*The interrupt state bit for channel 7's rmt_ch7_tx_thr_event_int_raw when mt_ch7_tx_thr_event_int_ena is set to 1.*/ + }; + uint32_t val; + } int_st; + union { + struct { + uint32_t ch0_tx_end: 1; /*Set this bit to enable rmt_ch0_tx_end_int_st.*/ + uint32_t ch0_rx_end: 1; /*Set this bit to enable rmt_ch0_rx_end_int_st.*/ + uint32_t ch0_err: 1; /*Set this bit to enable rmt_ch0_err_int_st.*/ + uint32_t ch1_tx_end: 1; /*Set this bit to enable rmt_ch1_tx_end_int_st.*/ + uint32_t ch1_rx_end: 1; /*Set this bit to enable rmt_ch1_rx_end_int_st.*/ + uint32_t ch1_err: 1; /*Set this bit to enable rmt_ch1_err_int_st.*/ + uint32_t ch2_tx_end: 1; /*Set this bit to enable rmt_ch2_tx_end_int_st.*/ + uint32_t ch2_rx_end: 1; /*Set this bit to enable rmt_ch2_rx_end_int_st.*/ + uint32_t ch2_err: 1; /*Set this bit to enable rmt_ch2_err_int_st.*/ + uint32_t ch3_tx_end: 1; /*Set this bit to enable rmt_ch3_tx_end_int_st.*/ + uint32_t ch3_rx_end: 1; /*Set this bit to enable rmt_ch3_rx_end_int_st.*/ + uint32_t ch3_err: 1; /*Set this bit to enable rmt_ch3_err_int_st.*/ + uint32_t ch4_tx_end: 1; /*Set this bit to enable rmt_ch4_tx_end_int_st.*/ + uint32_t ch4_rx_end: 1; /*Set this bit to enable rmt_ch4_rx_end_int_st.*/ + uint32_t ch4_err: 1; /*Set this bit to enable rmt_ch4_err_int_st.*/ + uint32_t ch5_tx_end: 1; /*Set this bit to enable rmt_ch5_tx_end_int_st.*/ + uint32_t ch5_rx_end: 1; /*Set this bit to enable rmt_ch5_rx_end_int_st.*/ + uint32_t ch5_err: 1; /*Set this bit to enable rmt_ch5_err_int_st.*/ + uint32_t ch6_tx_end: 1; /*Set this bit to enable rmt_ch6_tx_end_int_st.*/ + uint32_t ch6_rx_end: 1; /*Set this bit to enable rmt_ch6_rx_end_int_st.*/ + uint32_t ch6_err: 1; /*Set this bit to enable rmt_ch6_err_int_st.*/ + uint32_t ch7_tx_end: 1; /*Set this bit to enable rmt_ch7_tx_end_int_st.*/ + uint32_t ch7_rx_end: 1; /*Set this bit to enable rmt_ch7_rx_end_int_st.*/ + uint32_t ch7_err: 1; /*Set this bit to enable rmt_ch7_err_int_st.*/ + uint32_t ch0_tx_thr_event: 1; /*Set this bit to enable rmt_ch0_tx_thr_event_int_st.*/ + uint32_t ch1_tx_thr_event: 1; /*Set this bit to enable rmt_ch1_tx_thr_event_int_st.*/ + uint32_t ch2_tx_thr_event: 1; /*Set this bit to enable rmt_ch2_tx_thr_event_int_st.*/ + uint32_t ch3_tx_thr_event: 1; /*Set this bit to enable rmt_ch3_tx_thr_event_int_st.*/ + uint32_t ch4_tx_thr_event: 1; /*Set this bit to enable rmt_ch4_tx_thr_event_int_st.*/ + uint32_t ch5_tx_thr_event: 1; /*Set this bit to enable rmt_ch5_tx_thr_event_int_st.*/ + uint32_t ch6_tx_thr_event: 1; /*Set this bit to enable rmt_ch6_tx_thr_event_int_st.*/ + uint32_t ch7_tx_thr_event: 1; /*Set this bit to enable rmt_ch7_tx_thr_event_int_st.*/ + }; + uint32_t val; + } int_ena; + union { + struct { + uint32_t ch0_tx_end: 1; /*Set this bit to clear the rmt_ch0_rx_end_int_raw..*/ + uint32_t ch0_rx_end: 1; /*Set this bit to clear the rmt_ch0_tx_end_int_raw.*/ + uint32_t ch0_err: 1; /*Set this bit to clear the rmt_ch0_err_int_raw.*/ + uint32_t ch1_tx_end: 1; /*Set this bit to clear the rmt_ch1_rx_end_int_raw..*/ + uint32_t ch1_rx_end: 1; /*Set this bit to clear the rmt_ch1_tx_end_int_raw.*/ + uint32_t ch1_err: 1; /*Set this bit to clear the rmt_ch1_err_int_raw.*/ + uint32_t ch2_tx_end: 1; /*Set this bit to clear the rmt_ch2_rx_end_int_raw..*/ + uint32_t ch2_rx_end: 1; /*Set this bit to clear the rmt_ch2_tx_end_int_raw.*/ + uint32_t ch2_err: 1; /*Set this bit to clear the rmt_ch2_err_int_raw.*/ + uint32_t ch3_tx_end: 1; /*Set this bit to clear the rmt_ch3_rx_end_int_raw..*/ + uint32_t ch3_rx_end: 1; /*Set this bit to clear the rmt_ch3_tx_end_int_raw.*/ + uint32_t ch3_err: 1; /*Set this bit to clear the rmt_ch3_err_int_raw.*/ + uint32_t ch4_tx_end: 1; /*Set this bit to clear the rmt_ch4_rx_end_int_raw..*/ + uint32_t ch4_rx_end: 1; /*Set this bit to clear the rmt_ch4_tx_end_int_raw.*/ + uint32_t ch4_err: 1; /*Set this bit to clear the rmt_ch4_err_int_raw.*/ + uint32_t ch5_tx_end: 1; /*Set this bit to clear the rmt_ch5_rx_end_int_raw..*/ + uint32_t ch5_rx_end: 1; /*Set this bit to clear the rmt_ch5_tx_end_int_raw.*/ + uint32_t ch5_err: 1; /*Set this bit to clear the rmt_ch5_err_int_raw.*/ + uint32_t ch6_tx_end: 1; /*Set this bit to clear the rmt_ch6_rx_end_int_raw..*/ + uint32_t ch6_rx_end: 1; /*Set this bit to clear the rmt_ch6_tx_end_int_raw.*/ + uint32_t ch6_err: 1; /*Set this bit to clear the rmt_ch6_err_int_raw.*/ + uint32_t ch7_tx_end: 1; /*Set this bit to clear the rmt_ch7_rx_end_int_raw..*/ + uint32_t ch7_rx_end: 1; /*Set this bit to clear the rmt_ch7_tx_end_int_raw.*/ + uint32_t ch7_err: 1; /*Set this bit to clear the rmt_ch7_err_int_raw.*/ + uint32_t ch0_tx_thr_event: 1; /*Set this bit to clear the rmt_ch0_tx_thr_event_int_raw interrupt.*/ + uint32_t ch1_tx_thr_event: 1; /*Set this bit to clear the rmt_ch1_tx_thr_event_int_raw interrupt.*/ + uint32_t ch2_tx_thr_event: 1; /*Set this bit to clear the rmt_ch2_tx_thr_event_int_raw interrupt.*/ + uint32_t ch3_tx_thr_event: 1; /*Set this bit to clear the rmt_ch3_tx_thr_event_int_raw interrupt.*/ + uint32_t ch4_tx_thr_event: 1; /*Set this bit to clear the rmt_ch4_tx_thr_event_int_raw interrupt.*/ + uint32_t ch5_tx_thr_event: 1; /*Set this bit to clear the rmt_ch5_tx_thr_event_int_raw interrupt.*/ + uint32_t ch6_tx_thr_event: 1; /*Set this bit to clear the rmt_ch6_tx_thr_event_int_raw interrupt.*/ + uint32_t ch7_tx_thr_event: 1; /*Set this bit to clear the rmt_ch7_tx_thr_event_int_raw interrupt.*/ + }; + uint32_t val; + } int_clr; + union { + struct { + uint32_t low: 16; /*This register is used to configure carrier wave's low level value for channel0-7.*/ + uint32_t high:16; /*This register is used to configure carrier wave's high level value for channel0-7.*/ + }; + uint32_t val; + } carrier_duty_ch[8]; + union { + struct { + uint32_t limit: 9; /*When channel0-7 sends more than reg_rmt_tx_lim_ch0 data then channel0-7 produce the relative interrupt.*/ + uint32_t reserved9: 23; + }; + uint32_t val; + } tx_lim_ch[8]; + union { + struct { + uint32_t fifo_mask: 1; /*Set this bit to enable RMTMEM and disable apb fifo access (using fifo is discouraged, please see the note above at data_ch[] item)*/ + uint32_t mem_tx_wrap_en: 1; /*when data need to be send is more than channel's mem can store then set this bit to enable reuse of mem this bit is used together with reg_rmt_tx_lim_chn.*/ + uint32_t reserved2: 30; + }; + uint32_t val; + } apb_conf; + uint32_t reserved_f4; + uint32_t reserved_f8; + uint32_t date; /*This is the version register.*/ +} rmt_dev_t; +extern rmt_dev_t RMT; + +typedef struct rmt_item32_s { + union { + struct { + uint32_t duration0 :15; + uint32_t level0 :1; + uint32_t duration1 :15; + uint32_t level1 :1; + }; + uint32_t val; + }; +} rmt_item32_t; + +//Allow access to RMT memory using RMTMEM.chan[0].data32[8] +typedef volatile struct rmt_mem_s { + struct { + union { + rmt_item32_t data32[64]; + }; + } chan[8]; +} rmt_mem_t; +extern rmt_mem_t RMTMEM; + +#ifdef __cplusplus +} +#endif + +#endif /* _SOC_RMT_STRUCT_H_ */ diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/rtc.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/rtc.h new file mode 100644 index 0000000000000..e2c52849dc4e8 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/rtc.h @@ -0,0 +1,651 @@ +// 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. +#pragma once + +#include +#include +#include +#include "soc.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file rtc.h + * @brief Low-level RTC power, clock, and sleep functions. + * + * Functions in this file facilitate configuration of ESP32's RTC_CNTL peripheral. + * RTC_CNTL peripheral handles many functions: + * - enables/disables clocks and power to various parts of the chip; this is + * done using direct register access (forcing power up or power down) or by + * allowing state machines to control power and clocks automatically + * - handles sleep and wakeup functions + * - maintains a 48-bit counter which can be used for timekeeping + * + * These functions are not thread safe, and should not be viewed as high level + * APIs. For example, while this file provides a function which can switch + * CPU frequency, this function is on its own is not sufficient to implement + * frequency switching in ESP-IDF context: some coordination with RTOS, + * peripheral drivers, and WiFi/BT stacks is also required. + * + * These functions will normally not be used in applications directly. + * ESP-IDF provides, or will provide, drivers and other facilities to use + * RTC subsystem functionality. + * + * The functions are loosely split into the following groups: + * - rtc_clk: clock switching, calibration + * - rtc_time: reading RTC counter, conversion between counter values and time + * - rtc_sleep: entry into sleep modes + * - rtc_init: initialization + */ + + +/** + * @brief Possible main XTAL frequency values. + * + * Enum values should be equal to frequency in MHz. + */ +typedef enum { + RTC_XTAL_FREQ_AUTO = 0, //!< Automatic XTAL frequency detection + RTC_XTAL_FREQ_40M = 40, //!< 40 MHz XTAL + RTC_XTAL_FREQ_26M = 26, //!< 26 MHz XTAL + RTC_XTAL_FREQ_24M = 24, //!< 24 MHz XTAL +} rtc_xtal_freq_t; + +/** + * @brief CPU frequency values + */ +typedef enum { + RTC_CPU_FREQ_XTAL = 0, //!< Main XTAL frequency + RTC_CPU_FREQ_80M = 1, //!< 80 MHz + RTC_CPU_FREQ_160M = 2, //!< 160 MHz + RTC_CPU_FREQ_240M = 3, //!< 240 MHz + RTC_CPU_FREQ_2M = 4, //!< 2 MHz +} rtc_cpu_freq_t; + +/** + * @brief CPU clock source + */ +typedef enum { + RTC_CPU_FREQ_SRC_XTAL, //!< XTAL + RTC_CPU_FREQ_SRC_PLL, //!< PLL (480M or 320M) + RTC_CPU_FREQ_SRC_8M, //!< Internal 8M RTC oscillator + RTC_CPU_FREQ_SRC_APLL //!< APLL +} rtc_cpu_freq_src_t; + +/** + * @brief CPU clock configuration structure + */ +typedef struct rtc_cpu_freq_config_s { + rtc_cpu_freq_src_t source; //!< The clock from which CPU clock is derived + uint32_t source_freq_mhz; //!< Source clock frequency + uint32_t div; //!< Divider, freq_mhz = source_freq_mhz / div + uint32_t freq_mhz; //!< CPU clock frequency +} rtc_cpu_freq_config_t; + +/** + * @brief RTC SLOW_CLK frequency values + */ +typedef enum { + RTC_SLOW_FREQ_RTC = 0, //!< Internal 150 kHz RC oscillator + RTC_SLOW_FREQ_32K_XTAL = 1, //!< External 32 kHz XTAL + RTC_SLOW_FREQ_8MD256 = 2, //!< Internal 8 MHz RC oscillator, divided by 256 +} rtc_slow_freq_t; + +/** + * @brief RTC FAST_CLK frequency values + */ +typedef enum { + RTC_FAST_FREQ_XTALD4 = 0, //!< Main XTAL, divided by 4 + RTC_FAST_FREQ_8M = 1, //!< Internal 8 MHz RC oscillator +} rtc_fast_freq_t; + +/* With the default value of CK8M_DFREQ, 8M clock frequency is 8.5 MHz +/- 7% */ +#define RTC_FAST_CLK_FREQ_APPROX 8500000 + +/** + * @brief Clock source to be calibrated using rtc_clk_cal function + */ +typedef enum { + RTC_CAL_RTC_MUX = 0, //!< Currently selected RTC SLOW_CLK + RTC_CAL_8MD256 = 1, //!< Internal 8 MHz RC oscillator, divided by 256 + RTC_CAL_32K_XTAL = 2 //!< External 32 kHz XTAL +} rtc_cal_sel_t; + +/** + * Initialization parameters for rtc_clk_init + */ +typedef struct rtc_clk_config_s { + rtc_xtal_freq_t xtal_freq : 8; //!< Main XTAL frequency + rtc_cpu_freq_t cpu_freq_mhz : 10; //!< CPU frequency to set, in MHz + rtc_fast_freq_t fast_freq : 1; //!< RTC_FAST_CLK frequency to set + rtc_slow_freq_t slow_freq : 2; //!< RTC_SLOW_CLK frequency to set + uint32_t clk_8m_div : 3; //!< RTC 8M clock divider (division is by clk_8m_div+1, i.e. 0 means 8MHz frequency) + uint32_t slow_clk_dcap : 8; //!< RTC 150k clock adjustment parameter (higher value leads to lower frequency) + uint32_t clk_8m_dfreq : 8; //!< RTC 8m clock adjustment parameter (higher value leads to higher frequency) +} rtc_clk_config_t; + +/** + * Default initializer for rtc_clk_config_t + */ +#define RTC_CLK_CONFIG_DEFAULT() { \ + .xtal_freq = RTC_XTAL_FREQ_AUTO, \ + .cpu_freq_mhz = 80, \ + .fast_freq = RTC_FAST_FREQ_8M, \ + .slow_freq = RTC_SLOW_FREQ_RTC, \ + .clk_8m_div = 0, \ + .slow_clk_dcap = RTC_CNTL_SCK_DCAP_DEFAULT, \ + .clk_8m_dfreq = RTC_CNTL_CK8M_DFREQ_DEFAULT, \ +} + +/** + * Initialize clocks and set CPU frequency + * + * If cfg.xtal_freq is set to RTC_XTAL_FREQ_AUTO, this function will attempt + * to auto detect XTAL frequency. Auto detection is performed by comparing + * XTAL frequency with the frequency of internal 8MHz oscillator. Note that at + * high temperatures the frequency of the internal 8MHz oscillator may drift + * enough for auto detection to be unreliable. + * Auto detection code will attempt to distinguish between 26MHz and 40MHz + * crystals. 24 MHz crystals are not supported by auto detection code. + * If XTAL frequency can not be auto detected, this 26MHz frequency will be used. + * + * @param cfg clock configuration as rtc_clk_config_t + */ +void rtc_clk_init(rtc_clk_config_t cfg); + +/** + * @brief Get main XTAL frequency + * + * This is the value stored in RTC register RTC_XTAL_FREQ_REG by the bootloader. As passed to + * rtc_clk_init function, or if the value was RTC_XTAL_FREQ_AUTO, the detected + * XTAL frequency. + * + * @return XTAL frequency, one of rtc_xtal_freq_t + */ +rtc_xtal_freq_t rtc_clk_xtal_freq_get(void); + +/** + * @brief Update XTAL frequency + * + * Updates the XTAL value stored in RTC_XTAL_FREQ_REG. Usually this value is ignored + * after startup. + * + * @param xtal_freq New frequency value + */ +void rtc_clk_xtal_freq_update(rtc_xtal_freq_t xtal_freq); + +/** + * @brief Enable or disable 32 kHz XTAL oscillator + * @param en true to enable, false to disable + */ +void rtc_clk_32k_enable(bool en); + +/** + * @brief Configure 32 kHz XTAL oscillator to accept external clock signal + */ +void rtc_clk_32k_enable_external(void); + +/** + * @brief Get the state of 32k XTAL oscillator + * @return true if 32k XTAL oscillator has been enabled + */ +bool rtc_clk_32k_enabled(void); + +/** + * @brief Enable 32k oscillator, configuring it for fast startup time. + * Note: to achieve higher frequency stability, rtc_clk_32k_enable function + * must be called one the 32k XTAL oscillator has started up. This function + * will initially disable the 32k XTAL oscillator, so it should not be called + * when the system is using 32k XTAL as RTC_SLOW_CLK. + * + * @param cycle Number of 32kHz cycles to bootstrap external crystal. + * If 0, no square wave will be used to bootstrap crystal oscillation. + */ +void rtc_clk_32k_bootstrap(uint32_t cycle); + +/** + * @brief Enable or disable 8 MHz internal oscillator + * + * Output from 8 MHz internal oscillator is passed into a configurable + * divider, which by default divides the input clock frequency by 256. + * Output of the divider may be used as RTC_SLOW_CLK source. + * Output of the divider is referred to in register descriptions and code as + * 8md256 or simply d256. Divider values other than 256 may be configured, but + * this facility is not currently needed, so is not exposed in the code. + * + * When 8MHz/256 divided output is not needed, the divider should be disabled + * to reduce power consumption. + * + * @param clk_8m_en true to enable 8MHz generator + * @param d256_en true to enable /256 divider + */ +void rtc_clk_8m_enable(bool clk_8m_en, bool d256_en); + +/** + * @brief Get the state of 8 MHz internal oscillator + * @return true if the oscillator is enabled + */ +bool rtc_clk_8m_enabled(void); + +/** + * @brief Get the state of /256 divider which is applied to 8MHz clock + * @return true if the divided output is enabled + */ +bool rtc_clk_8md256_enabled(void); + +/** + * @brief Enable or disable APLL + * + * Output frequency is given by the formula: + * apll_freq = xtal_freq * (4 + sdm2 + sdm1/256 + sdm0/65536)/((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. + * + * @param enable true to enable, false to disable + * @param sdm0 frequency adjustment parameter, 0..255 + * @param sdm1 frequency adjustment parameter, 0..255 + * @param sdm2 frequency adjustment parameter, 0..63 + * @param o_div frequency divider, 0..31 + */ +void rtc_clk_apll_enable(bool enable, uint32_t sdm0, uint32_t sdm1, + uint32_t sdm2, uint32_t o_div); + +/** + * @brief Select source for RTC_SLOW_CLK + * @param slow_freq clock source (one of rtc_slow_freq_t values) + */ +void rtc_clk_slow_freq_set(rtc_slow_freq_t slow_freq); + +/** + * @brief Get the RTC_SLOW_CLK source + * @return currently selected clock source (one of rtc_slow_freq_t values) + */ +rtc_slow_freq_t rtc_clk_slow_freq_get(void); + +/** + * @brief Get the approximate frequency of RTC_SLOW_CLK, in Hz + * + * - if RTC_SLOW_FREQ_RTC is selected, returns ~150000 + * - if RTC_SLOW_FREQ_32K_XTAL is selected, returns 32768 + * - if RTC_SLOW_FREQ_8MD256 is selected, returns ~33000 + * + * rtc_clk_cal function can be used to get more precise value by comparing + * RTC_SLOW_CLK frequency to the frequency of main XTAL. + * + * @return RTC_SLOW_CLK frequency, in Hz + */ +uint32_t rtc_clk_slow_freq_get_hz(void); + +/** + * @brief Select source for RTC_FAST_CLK + * @param fast_freq clock source (one of rtc_fast_freq_t values) + */ +void rtc_clk_fast_freq_set(rtc_fast_freq_t fast_freq); + +/** + * @brief Get the RTC_FAST_CLK source + * @return currently selected clock source (one of rtc_fast_freq_t values) + */ +rtc_fast_freq_t rtc_clk_fast_freq_get(void); + +/** + * @brief Get CPU frequency config corresponding to a rtc_cpu_freq_t value + * @param cpu_freq CPU frequency enumeration value + * @param[out] out_config Output, CPU frequency configuration structure + */ + void rtc_clk_cpu_freq_to_config(rtc_cpu_freq_t cpu_freq, rtc_cpu_freq_config_t* out_config); + + /** + * @brief Get CPU frequency config for a given frequency + * @param freq_mhz Frequency in MHz + * @param[out] out_config Output, CPU frequency configuration structure + * @return true if frequency can be obtained, false otherwise + */ + bool rtc_clk_cpu_freq_mhz_to_config(uint32_t freq_mhz, rtc_cpu_freq_config_t* out_config); + + /** + * @brief Switch CPU frequency + * + * This function sets CPU frequency according to the given configuration + * structure. It enables PLLs, if necessary. + * + * @note This function in not intended to be called by applications in FreeRTOS + * environment. This is because it does not adjust various timers based on the + * new CPU frequency. + * + * @param config CPU frequency configuration structure + */ + void rtc_clk_cpu_freq_set_config(const rtc_cpu_freq_config_t* config); + + /** + * @brief Switch CPU frequency (optimized for speed) + * + * This function is a faster equivalent of rtc_clk_cpu_freq_set_config. + * It works faster because it does not disable PLLs when switching from PLL to + * XTAL and does not enabled them when switching back. If PLL is not already + * enabled when this function is called to switch from XTAL to PLL frequency, + * or the PLL which is enabled is the wrong one, this function will fall back + * to calling rtc_clk_cpu_freq_set_config. + * + * Unlike rtc_clk_cpu_freq_set_config, this function relies on static data, + * so it is less safe to use it e.g. from a panic handler (when memory might + * be corrupted). + * + * @note This function in not intended to be called by applications in FreeRTOS + * environment. This is because it does not adjust various timers based on the + * new CPU frequency. + * + * @param config CPU frequency configuration structure + */ + void rtc_clk_cpu_freq_set_config_fast(const rtc_cpu_freq_config_t* config); + + /** + * @brief Get the currently used CPU frequency configuration + * @param[out] out_config Output, CPU frequency configuration structure + */ + void rtc_clk_cpu_freq_get_config(rtc_cpu_freq_config_t* out_config); + + /** + * @brief Switch CPU clock source to XTAL + * + * Short form for filling in rtc_cpu_freq_config_t structure and calling + * rtc_clk_cpu_freq_set_config when a switch to XTAL is needed. + * Assumes that XTAL frequency has been determined — don't call in startup code. + */ + void rtc_clk_cpu_freq_set_xtal(void); + + +/** + * @brief Store new APB frequency value into RTC_APB_FREQ_REG + * + * This function doesn't change any hardware clocks. + * + * Functions which perform frequency switching and change APB frequency call + * this function to update the value of APB frequency stored in RTC_APB_FREQ_REG + * (one of RTC general purpose retention registers). This should not normally + * be called from application code. + * + * @param apb_freq new APB frequency, in Hz + */ +void rtc_clk_apb_freq_update(uint32_t apb_freq); + +/** + * @brief Get the current stored APB frequency. + * @return The APB frequency value as last set via rtc_clk_apb_freq_update(), in Hz. + */ +uint32_t rtc_clk_apb_freq_get(void); + +#define RTC_CLK_CAL_FRACT 19 //!< Number of fractional bits in values returned by rtc_clk_cal + +/** + * @brief Measure RTC slow clock's period, based on main XTAL frequency + * + * This function will time out and return 0 if the time for the given number + * of cycles to be counted exceeds the expected time twice. This may happen if + * 32k XTAL is being calibrated, but the oscillator has not started up (due to + * incorrect loading capacitance, board design issue, or lack of 32 XTAL on board). + * + * @param cal_clk clock to be measured + * @param slow_clk_cycles number of slow clock cycles to average + * @return average slow clock period in microseconds, Q13.19 fixed point format, + * or 0 if calibration has timed out + */ +uint32_t rtc_clk_cal(rtc_cal_sel_t cal_clk, uint32_t slow_clk_cycles); + +/** + * @brief Measure ratio between XTAL frequency and RTC slow clock frequency + * @param cal_clk slow clock to be measured + * @param slow_clk_cycles number of slow clock cycles to average + * @return average ratio between XTAL frequency and slow clock frequency, + * Q13.19 fixed point format, or 0 if calibration has timed out. + */ +uint32_t rtc_clk_cal_ratio(rtc_cal_sel_t cal_clk, uint32_t slow_clk_cycles); + +/** + * @brief Convert time interval from microseconds to RTC_SLOW_CLK cycles + * @param time_in_us Time interval in microseconds + * @param slow_clk_period Period of slow clock in microseconds, Q13.19 + * fixed point format (as returned by rtc_slowck_cali). + * @return number of slow clock cycles + */ +uint64_t rtc_time_us_to_slowclk(uint64_t time_in_us, uint32_t period); + +/** + * @brief Convert time interval from RTC_SLOW_CLK to microseconds + * @param time_in_us Time interval in RTC_SLOW_CLK cycles + * @param slow_clk_period Period of slow clock in microseconds, Q13.19 + * fixed point format (as returned by rtc_slowck_cali). + * @return time interval in microseconds + */ +uint64_t rtc_time_slowclk_to_us(uint64_t rtc_cycles, uint32_t period); + +/** + * @brief Get current value of RTC counter + * + * RTC has a 48-bit counter which is incremented by 2 every 2 RTC_SLOW_CLK + * cycles. Counter value is not writable by software. The value is not adjusted + * when switching to a different RTC_SLOW_CLK source. + * + * Note: this function may take up to 1 RTC_SLOW_CLK cycle to execute + * + * @return current value of RTC counter + */ +uint64_t rtc_time_get(void); + +/** + * @brief Busy loop until next RTC_SLOW_CLK cycle + * + * This function returns not earlier than the next RTC_SLOW_CLK clock cycle. + * In some cases (e.g. when RTC_SLOW_CLK cycle is very close), it may return + * one RTC_SLOW_CLK cycle later. + */ +void rtc_clk_wait_for_slow_cycle(void); + +/** + * @brief sleep configuration for rtc_sleep_init function + */ +typedef struct rtc_sleep_config_s { + uint32_t lslp_mem_inf_fpu : 1; //!< force normal voltage in sleep mode (digital domain memory) + uint32_t rtc_mem_inf_fpu : 1; //!< force normal voltage in sleep mode (RTC memory) + uint32_t rtc_mem_inf_follow_cpu : 1;//!< keep low voltage in sleep mode (even if ULP/touch is used) + uint32_t rtc_fastmem_pd_en : 1; //!< power down RTC fast memory + uint32_t rtc_slowmem_pd_en : 1; //!< power down RTC slow memory + uint32_t rtc_peri_pd_en : 1; //!< power down RTC peripherals + uint32_t wifi_pd_en : 1; //!< power down WiFi + uint32_t rom_mem_pd_en : 1; //!< power down main RAM and ROM + uint32_t deep_slp : 1; //!< power down digital domain + uint32_t wdt_flashboot_mod_en : 1; //!< enable WDT flashboot mode + uint32_t dig_dbias_wak : 3; //!< set bias for digital domain, in active mode + uint32_t dig_dbias_slp : 3; //!< set bias for digital domain, in sleep mode + uint32_t rtc_dbias_wak : 3; //!< set bias for RTC domain, in active mode + uint32_t rtc_dbias_slp : 3; //!< set bias for RTC domain, in sleep mode + uint32_t lslp_meminf_pd : 1; //!< remove all peripheral force power up flags + uint32_t vddsdio_pd_en : 1; //!< power down VDDSDIO regulator + uint32_t xtal_fpu : 1; //!< keep main XTAL powered up in sleep +} rtc_sleep_config_t; + +/** + * Default initializer for rtc_sleep_config_t + * + * This initializer sets all fields to "reasonable" values (e.g. suggested for + * production use) based on a combination of RTC_SLEEP_PD_x flags. + * + * @param RTC_SLEEP_PD_x flags combined using bitwise OR + */ +#define RTC_SLEEP_CONFIG_DEFAULT(sleep_flags) { \ + .lslp_mem_inf_fpu = 0, \ + .rtc_mem_inf_fpu = 0, \ + .rtc_mem_inf_follow_cpu = ((sleep_flags) & RTC_SLEEP_PD_RTC_MEM_FOLLOW_CPU) ? 1 : 0, \ + .rtc_fastmem_pd_en = ((sleep_flags) & RTC_SLEEP_PD_RTC_FAST_MEM) ? 1 : 0, \ + .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 = 0, \ + .rom_mem_pd_en = 0, \ + .deep_slp = ((sleep_flags) & RTC_SLEEP_PD_DIG) ? 1 : 0, \ + .wdt_flashboot_mod_en = 0, \ + .dig_dbias_wak = RTC_CNTL_DBIAS_1V10, \ + .dig_dbias_slp = RTC_CNTL_DBIAS_0V90, \ + .rtc_dbias_wak = RTC_CNTL_DBIAS_1V10, \ + .rtc_dbias_slp = RTC_CNTL_DBIAS_0V90, \ + .lslp_meminf_pd = 1, \ + .vddsdio_pd_en = ((sleep_flags) & RTC_SLEEP_PD_VDDSDIO) ? 1 : 0, \ + .xtal_fpu = ((sleep_flags) & RTC_SLEEP_PD_XTAL) ? 0 : 1 \ +}; + +#define RTC_SLEEP_PD_DIG BIT(0) //!< Deep sleep (power down digital domain) +#define RTC_SLEEP_PD_RTC_PERIPH BIT(1) //!< Power down RTC peripherals +#define RTC_SLEEP_PD_RTC_SLOW_MEM BIT(2) //!< Power down RTC SLOW memory +#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_XTAL BIT(6) //!< Power down main XTAL + +/** + * @brief Prepare the chip to enter sleep mode + * + * This function configures various power control state machines to handle + * entry into light sleep or deep sleep mode, switches APB and CPU clock source + * (usually to XTAL), and sets bias voltages for digital and RTC power domains. + * + * This function does not actually enter sleep mode; this is done using + * rtc_sleep_start function. Software may do some other actions between + * rtc_sleep_init and rtc_sleep_start, such as set wakeup timer and configure + * wakeup sources. + * @param cfg sleep mode configuration + */ +void rtc_sleep_init(rtc_sleep_config_t cfg); + + +/** + * @brief Set target value of RTC counter for RTC_TIMER_TRIG_EN wakeup source + * @param t value of RTC counter at which wakeup from sleep will happen; + * only the lower 48 bits are used + */ +void rtc_sleep_set_wakeup_time(uint64_t t); + + +#define RTC_EXT0_TRIG_EN BIT(0) //!< EXT0 GPIO wakeup +#define RTC_EXT1_TRIG_EN BIT(1) //!< EXT1 GPIO wakeup +#define RTC_GPIO_TRIG_EN BIT(2) //!< GPIO wakeup (light sleep only) +#define RTC_TIMER_TRIG_EN BIT(3) //!< Timer wakeup +#define RTC_SDIO_TRIG_EN BIT(4) //!< SDIO wakeup (light sleep only) +#define RTC_MAC_TRIG_EN BIT(5) //!< MAC wakeup (light sleep only) +#define RTC_UART0_TRIG_EN BIT(6) //!< UART0 wakeup (light sleep only) +#define RTC_UART1_TRIG_EN BIT(7) //!< UART1 wakeup (light sleep only) +#define RTC_TOUCH_TRIG_EN BIT(8) //!< Touch wakeup +#define RTC_ULP_TRIG_EN BIT(9) //!< ULP wakeup +#define RTC_BT_TRIG_EN BIT(10) //!< BT wakeup (light sleep only) + +/** + * @brief Enter deep or light sleep mode + * + * This function enters the sleep mode previously configured using rtc_sleep_init + * function. Before entering sleep, software should configure wake up sources + * appropriately (set up GPIO wakeup registers, timer wakeup registers, + * and so on). + * + * If deep sleep mode was configured using rtc_sleep_init, and sleep is not + * rejected by hardware (based on reject_opt flags), this function never returns. + * When the chip wakes up from deep sleep, CPU is reset and execution starts + * from ROM bootloader. + * + * If light sleep mode was configured using rtc_sleep_init, this function + * returns on wakeup, or if sleep is rejected by hardware. + * + * @param wakeup_opt bit mask wake up reasons to enable (RTC_xxx_TRIG_EN flags + * combined with OR) + * @param reject_opt bit mask of sleep reject reasons: + * - RTC_CNTL_GPIO_REJECT_EN + * - RTC_CNTL_SDIO_REJECT_EN + * These flags are used to prevent entering sleep when e.g. + * an external host is communicating via SDIO slave + * @return non-zero if sleep was rejected by hardware + */ +uint32_t rtc_sleep_start(uint32_t wakeup_opt, uint32_t reject_opt); + +/** + * RTC power and clock control initialization settings + */ +typedef struct rtc_config_s { + uint32_t ck8m_wait : 8; //!< Number of rtc_fast_clk cycles to wait for 8M clock to be ready + uint32_t xtal_wait : 8; //!< Number of rtc_fast_clk cycles to wait for XTAL clock to be ready + uint32_t pll_wait : 8; //!< Number of rtc_fast_clk cycles to wait for PLL to be ready + uint32_t clkctl_init : 1; //!< Perform clock control related initialization + uint32_t pwrctl_init : 1; //!< Perform power control related initialization + uint32_t rtc_dboost_fpd : 1; //!< Force power down RTC_DBOOST +} rtc_config_t; + +/** + * Default initializer of rtc_config_t. + * + * This initializer sets all fields to "reasonable" values (e.g. suggested for + * production use). + */ +#define RTC_CONFIG_DEFAULT() {\ + .ck8m_wait = RTC_CNTL_CK8M_WAIT_DEFAULT, \ + .xtal_wait = RTC_CNTL_XTL_BUF_WAIT_DEFAULT, \ + .pll_wait = RTC_CNTL_PLL_BUF_WAIT_DEFAULT, \ + .clkctl_init = 1, \ + .pwrctl_init = 1, \ + .rtc_dboost_fpd = 1 \ +} + +/** + * Initialize RTC clock and power control related functions + * @param cfg configuration options as rtc_config_t + */ +void rtc_init(rtc_config_t cfg); + +#define RTC_VDDSDIO_TIEH_1_8V 0 //!< TIEH field value for 1.8V VDDSDIO +#define RTC_VDDSDIO_TIEH_3_3V 1 //!< TIEH field value for 3.3V VDDSDIO + +/** + * Structure describing vddsdio configuration + */ +typedef struct rtc_vddsdio_config_s { + uint32_t force : 1; //!< If 1, use configuration from RTC registers; if 0, use EFUSE/bootstrapping pins. + uint32_t enable : 1; //!< Enable VDDSDIO regulator + uint32_t tieh : 1; //!< Select VDDSDIO voltage. One of RTC_VDDSDIO_TIEH_1_8V, RTC_VDDSDIO_TIEH_3_3V + uint32_t drefh : 2; //!< Tuning parameter for VDDSDIO regulator + uint32_t drefm : 2; //!< Tuning parameter for VDDSDIO regulator + uint32_t drefl : 2; //!< Tuning parameter for VDDSDIO regulator +} rtc_vddsdio_config_t; + +/** + * Get current VDDSDIO configuration + * If VDDSDIO configuration is overridden by RTC, get values from RTC + * Otherwise, if VDDSDIO is configured by EFUSE, get values from EFUSE + * Otherwise, use default values and the level of MTDI bootstrapping pin. + * @return currently used VDDSDIO configuration + */ +rtc_vddsdio_config_t rtc_vddsdio_get_config(void); + +/** + * Set new VDDSDIO configuration using RTC registers. + * If config.force == 1, this overrides configuration done using bootstrapping + * pins and EFUSE. + * + * @param config new VDDSDIO configuration + */ +void rtc_vddsdio_set_config(rtc_vddsdio_config_t config); + +#ifdef __cplusplus +} +#endif + diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/rtc_cntl_reg.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/rtc_cntl_reg.h new file mode 100644 index 0000000000000..090b3f7072ce0 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/rtc_cntl_reg.h @@ -0,0 +1,2072 @@ +// 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. +#ifndef _SOC_RTC_CNTL_REG_H_ +#define _SOC_RTC_CNTL_REG_H_ + +/* The value that needs to be written to RTC_CNTL_WDT_WKEY to write-enable the wdt registers */ +#define RTC_CNTL_WDT_WKEY_VALUE 0x50D83AA1 + + +#include "soc.h" +#define RTC_CNTL_OPTIONS0_REG (DR_REG_RTCCNTL_BASE + 0x0) +/* RTC_CNTL_SW_SYS_RST : WO ;bitpos:[31] ;default: 1'd0 ; */ +/*description: SW system reset*/ +#define RTC_CNTL_SW_SYS_RST (BIT(31)) +#define RTC_CNTL_SW_SYS_RST_M (BIT(31)) +#define RTC_CNTL_SW_SYS_RST_V 0x1 +#define RTC_CNTL_SW_SYS_RST_S 31 +/* RTC_CNTL_DG_WRAP_FORCE_NORST : R/W ;bitpos:[30] ;default: 1'd0 ; */ +/*description: digital core force no reset in deep sleep*/ +#define RTC_CNTL_DG_WRAP_FORCE_NORST (BIT(30)) +#define RTC_CNTL_DG_WRAP_FORCE_NORST_M (BIT(30)) +#define RTC_CNTL_DG_WRAP_FORCE_NORST_V 0x1 +#define RTC_CNTL_DG_WRAP_FORCE_NORST_S 30 +/* RTC_CNTL_DG_WRAP_FORCE_RST : R/W ;bitpos:[29] ;default: 1'd0 ; */ +/*description: digital wrap force reset in deep sleep*/ +#define RTC_CNTL_DG_WRAP_FORCE_RST (BIT(29)) +#define RTC_CNTL_DG_WRAP_FORCE_RST_M (BIT(29)) +#define RTC_CNTL_DG_WRAP_FORCE_RST_V 0x1 +#define RTC_CNTL_DG_WRAP_FORCE_RST_S 29 +/* RTC_CNTL_ANALOG_FORCE_NOISO : R/W ;bitpos:[28] ;default: 1'd1 ; */ +/*description: */ +#define RTC_CNTL_ANALOG_FORCE_NOISO (BIT(28)) +#define RTC_CNTL_ANALOG_FORCE_NOISO_M (BIT(28)) +#define RTC_CNTL_ANALOG_FORCE_NOISO_V 0x1 +#define RTC_CNTL_ANALOG_FORCE_NOISO_S 28 +/* RTC_CNTL_PLL_FORCE_NOISO : R/W ;bitpos:[27] ;default: 1'd1 ; */ +/*description: */ +#define RTC_CNTL_PLL_FORCE_NOISO (BIT(27)) +#define RTC_CNTL_PLL_FORCE_NOISO_M (BIT(27)) +#define RTC_CNTL_PLL_FORCE_NOISO_V 0x1 +#define RTC_CNTL_PLL_FORCE_NOISO_S 27 +/* RTC_CNTL_XTL_FORCE_NOISO : R/W ;bitpos:[26] ;default: 1'd1 ; */ +/*description: */ +#define RTC_CNTL_XTL_FORCE_NOISO (BIT(26)) +#define RTC_CNTL_XTL_FORCE_NOISO_M (BIT(26)) +#define RTC_CNTL_XTL_FORCE_NOISO_V 0x1 +#define RTC_CNTL_XTL_FORCE_NOISO_S 26 +/* RTC_CNTL_ANALOG_FORCE_ISO : R/W ;bitpos:[25] ;default: 1'd0 ; */ +/*description: */ +#define RTC_CNTL_ANALOG_FORCE_ISO (BIT(25)) +#define RTC_CNTL_ANALOG_FORCE_ISO_M (BIT(25)) +#define RTC_CNTL_ANALOG_FORCE_ISO_V 0x1 +#define RTC_CNTL_ANALOG_FORCE_ISO_S 25 +/* RTC_CNTL_PLL_FORCE_ISO : R/W ;bitpos:[24] ;default: 1'd0 ; */ +/*description: */ +#define RTC_CNTL_PLL_FORCE_ISO (BIT(24)) +#define RTC_CNTL_PLL_FORCE_ISO_M (BIT(24)) +#define RTC_CNTL_PLL_FORCE_ISO_V 0x1 +#define RTC_CNTL_PLL_FORCE_ISO_S 24 +/* RTC_CNTL_XTL_FORCE_ISO : R/W ;bitpos:[23] ;default: 1'd0 ; */ +/*description: */ +#define RTC_CNTL_XTL_FORCE_ISO (BIT(23)) +#define RTC_CNTL_XTL_FORCE_ISO_M (BIT(23)) +#define RTC_CNTL_XTL_FORCE_ISO_V 0x1 +#define RTC_CNTL_XTL_FORCE_ISO_S 23 +/* RTC_CNTL_BIAS_CORE_FORCE_PU : R/W ;bitpos:[22] ;default: 1'd1 ; */ +/*description: BIAS_CORE force power up*/ +#define RTC_CNTL_BIAS_CORE_FORCE_PU (BIT(22)) +#define RTC_CNTL_BIAS_CORE_FORCE_PU_M (BIT(22)) +#define RTC_CNTL_BIAS_CORE_FORCE_PU_V 0x1 +#define RTC_CNTL_BIAS_CORE_FORCE_PU_S 22 +/* RTC_CNTL_BIAS_CORE_FORCE_PD : R/W ;bitpos:[21] ;default: 1'b0 ; */ +/*description: BIAS_CORE force power down*/ +#define RTC_CNTL_BIAS_CORE_FORCE_PD (BIT(21)) +#define RTC_CNTL_BIAS_CORE_FORCE_PD_M (BIT(21)) +#define RTC_CNTL_BIAS_CORE_FORCE_PD_V 0x1 +#define RTC_CNTL_BIAS_CORE_FORCE_PD_S 21 +/* RTC_CNTL_BIAS_CORE_FOLW_8M : R/W ;bitpos:[20] ;default: 1'd0 ; */ +/*description: BIAS_CORE follow CK8M*/ +#define RTC_CNTL_BIAS_CORE_FOLW_8M (BIT(20)) +#define RTC_CNTL_BIAS_CORE_FOLW_8M_M (BIT(20)) +#define RTC_CNTL_BIAS_CORE_FOLW_8M_V 0x1 +#define RTC_CNTL_BIAS_CORE_FOLW_8M_S 20 +/* RTC_CNTL_BIAS_I2C_FORCE_PU : R/W ;bitpos:[19] ;default: 1'd1 ; */ +/*description: BIAS_I2C force power up*/ +#define RTC_CNTL_BIAS_I2C_FORCE_PU (BIT(19)) +#define RTC_CNTL_BIAS_I2C_FORCE_PU_M (BIT(19)) +#define RTC_CNTL_BIAS_I2C_FORCE_PU_V 0x1 +#define RTC_CNTL_BIAS_I2C_FORCE_PU_S 19 +/* RTC_CNTL_BIAS_I2C_FORCE_PD : R/W ;bitpos:[18] ;default: 1'b0 ; */ +/*description: BIAS_I2C force power down*/ +#define RTC_CNTL_BIAS_I2C_FORCE_PD (BIT(18)) +#define RTC_CNTL_BIAS_I2C_FORCE_PD_M (BIT(18)) +#define RTC_CNTL_BIAS_I2C_FORCE_PD_V 0x1 +#define RTC_CNTL_BIAS_I2C_FORCE_PD_S 18 +/* RTC_CNTL_BIAS_I2C_FOLW_8M : R/W ;bitpos:[17] ;default: 1'd0 ; */ +/*description: BIAS_I2C follow CK8M*/ +#define RTC_CNTL_BIAS_I2C_FOLW_8M (BIT(17)) +#define RTC_CNTL_BIAS_I2C_FOLW_8M_M (BIT(17)) +#define RTC_CNTL_BIAS_I2C_FOLW_8M_V 0x1 +#define RTC_CNTL_BIAS_I2C_FOLW_8M_S 17 +/* RTC_CNTL_BIAS_FORCE_NOSLEEP : R/W ;bitpos:[16] ;default: 1'd1 ; */ +/*description: BIAS_SLEEP force no sleep*/ +#define RTC_CNTL_BIAS_FORCE_NOSLEEP (BIT(16)) +#define RTC_CNTL_BIAS_FORCE_NOSLEEP_M (BIT(16)) +#define RTC_CNTL_BIAS_FORCE_NOSLEEP_V 0x1 +#define RTC_CNTL_BIAS_FORCE_NOSLEEP_S 16 +/* RTC_CNTL_BIAS_FORCE_SLEEP : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: BIAS_SLEEP force sleep*/ +#define RTC_CNTL_BIAS_FORCE_SLEEP (BIT(15)) +#define RTC_CNTL_BIAS_FORCE_SLEEP_M (BIT(15)) +#define RTC_CNTL_BIAS_FORCE_SLEEP_V 0x1 +#define RTC_CNTL_BIAS_FORCE_SLEEP_S 15 +/* RTC_CNTL_BIAS_SLEEP_FOLW_8M : R/W ;bitpos:[14] ;default: 1'b0 ; */ +/*description: BIAS_SLEEP follow CK8M*/ +#define RTC_CNTL_BIAS_SLEEP_FOLW_8M (BIT(14)) +#define RTC_CNTL_BIAS_SLEEP_FOLW_8M_M (BIT(14)) +#define RTC_CNTL_BIAS_SLEEP_FOLW_8M_V 0x1 +#define RTC_CNTL_BIAS_SLEEP_FOLW_8M_S 14 +/* RTC_CNTL_XTL_FORCE_PU : R/W ;bitpos:[13] ;default: 1'd1 ; */ +/*description: crystall force power up*/ +#define RTC_CNTL_XTL_FORCE_PU (BIT(13)) +#define RTC_CNTL_XTL_FORCE_PU_M (BIT(13)) +#define RTC_CNTL_XTL_FORCE_PU_V 0x1 +#define RTC_CNTL_XTL_FORCE_PU_S 13 +/* RTC_CNTL_XTL_FORCE_PD : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: crystall force power down*/ +#define RTC_CNTL_XTL_FORCE_PD (BIT(12)) +#define RTC_CNTL_XTL_FORCE_PD_M (BIT(12)) +#define RTC_CNTL_XTL_FORCE_PD_V 0x1 +#define RTC_CNTL_XTL_FORCE_PD_S 12 +/* RTC_CNTL_BBPLL_FORCE_PU : R/W ;bitpos:[11] ;default: 1'd0 ; */ +/*description: BB_PLL force power up*/ +#define RTC_CNTL_BBPLL_FORCE_PU (BIT(11)) +#define RTC_CNTL_BBPLL_FORCE_PU_M (BIT(11)) +#define RTC_CNTL_BBPLL_FORCE_PU_V 0x1 +#define RTC_CNTL_BBPLL_FORCE_PU_S 11 +/* RTC_CNTL_BBPLL_FORCE_PD : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: BB_PLL force power down*/ +#define RTC_CNTL_BBPLL_FORCE_PD (BIT(10)) +#define RTC_CNTL_BBPLL_FORCE_PD_M (BIT(10)) +#define RTC_CNTL_BBPLL_FORCE_PD_V 0x1 +#define RTC_CNTL_BBPLL_FORCE_PD_S 10 +/* RTC_CNTL_BBPLL_I2C_FORCE_PU : R/W ;bitpos:[9] ;default: 1'd0 ; */ +/*description: BB_PLL_I2C force power up*/ +#define RTC_CNTL_BBPLL_I2C_FORCE_PU (BIT(9)) +#define RTC_CNTL_BBPLL_I2C_FORCE_PU_M (BIT(9)) +#define RTC_CNTL_BBPLL_I2C_FORCE_PU_V 0x1 +#define RTC_CNTL_BBPLL_I2C_FORCE_PU_S 9 +/* RTC_CNTL_BBPLL_I2C_FORCE_PD : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: BB_PLL _I2C force power down*/ +#define RTC_CNTL_BBPLL_I2C_FORCE_PD (BIT(8)) +#define RTC_CNTL_BBPLL_I2C_FORCE_PD_M (BIT(8)) +#define RTC_CNTL_BBPLL_I2C_FORCE_PD_V 0x1 +#define RTC_CNTL_BBPLL_I2C_FORCE_PD_S 8 +/* RTC_CNTL_BB_I2C_FORCE_PU : R/W ;bitpos:[7] ;default: 1'd0 ; */ +/*description: BB_I2C force power up*/ +#define RTC_CNTL_BB_I2C_FORCE_PU (BIT(7)) +#define RTC_CNTL_BB_I2C_FORCE_PU_M (BIT(7)) +#define RTC_CNTL_BB_I2C_FORCE_PU_V 0x1 +#define RTC_CNTL_BB_I2C_FORCE_PU_S 7 +/* RTC_CNTL_BB_I2C_FORCE_PD : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: BB_I2C force power down*/ +#define RTC_CNTL_BB_I2C_FORCE_PD (BIT(6)) +#define RTC_CNTL_BB_I2C_FORCE_PD_M (BIT(6)) +#define RTC_CNTL_BB_I2C_FORCE_PD_V 0x1 +#define RTC_CNTL_BB_I2C_FORCE_PD_S 6 +/* RTC_CNTL_SW_PROCPU_RST : WO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: PRO CPU SW reset*/ +#define RTC_CNTL_SW_PROCPU_RST (BIT(5)) +#define RTC_CNTL_SW_PROCPU_RST_M (BIT(5)) +#define RTC_CNTL_SW_PROCPU_RST_V 0x1 +#define RTC_CNTL_SW_PROCPU_RST_S 5 +/* RTC_CNTL_SW_APPCPU_RST : WO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: APP CPU SW reset*/ +#define RTC_CNTL_SW_APPCPU_RST (BIT(4)) +#define RTC_CNTL_SW_APPCPU_RST_M (BIT(4)) +#define RTC_CNTL_SW_APPCPU_RST_V 0x1 +#define RTC_CNTL_SW_APPCPU_RST_S 4 +/* RTC_CNTL_SW_STALL_PROCPU_C0 : R/W ;bitpos:[3:2] ;default: 2'b0 ; */ +/*description: {reg_sw_stall_procpu_c1[5:0] reg_sw_stall_procpu_c0[1:0]} == + 0x86 will stall PRO CPU*/ +#define RTC_CNTL_SW_STALL_PROCPU_C0 0x00000003 +#define RTC_CNTL_SW_STALL_PROCPU_C0_M ((RTC_CNTL_SW_STALL_PROCPU_C0_V)<<(RTC_CNTL_SW_STALL_PROCPU_C0_S)) +#define RTC_CNTL_SW_STALL_PROCPU_C0_V 0x3 +#define RTC_CNTL_SW_STALL_PROCPU_C0_S 2 +/* RTC_CNTL_SW_STALL_APPCPU_C0 : R/W ;bitpos:[1:0] ;default: 2'b0 ; */ +/*description: {reg_sw_stall_appcpu_c1[5:0] reg_sw_stall_appcpu_c0[1:0]} == + 0x86 will stall APP CPU*/ +#define RTC_CNTL_SW_STALL_APPCPU_C0 0x00000003 +#define RTC_CNTL_SW_STALL_APPCPU_C0_M ((RTC_CNTL_SW_STALL_APPCPU_C0_V)<<(RTC_CNTL_SW_STALL_APPCPU_C0_S)) +#define RTC_CNTL_SW_STALL_APPCPU_C0_V 0x3 +#define RTC_CNTL_SW_STALL_APPCPU_C0_S 0 + +#define RTC_CNTL_SLP_TIMER0_REG (DR_REG_RTCCNTL_BASE + 0x4) +/* RTC_CNTL_SLP_VAL_LO : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: RTC sleep timer low 32 bits*/ +#define RTC_CNTL_SLP_VAL_LO 0xFFFFFFFF +#define RTC_CNTL_SLP_VAL_LO_M ((RTC_CNTL_SLP_VAL_LO_V)<<(RTC_CNTL_SLP_VAL_LO_S)) +#define RTC_CNTL_SLP_VAL_LO_V 0xFFFFFFFF +#define RTC_CNTL_SLP_VAL_LO_S 0 + +#define RTC_CNTL_SLP_TIMER1_REG (DR_REG_RTCCNTL_BASE + 0x8) +/* RTC_CNTL_MAIN_TIMER_ALARM_EN : R/W ;bitpos:[16] ;default: 1'h0 ; */ +/*description: timer alarm enable bit*/ +#define RTC_CNTL_MAIN_TIMER_ALARM_EN (BIT(16)) +#define RTC_CNTL_MAIN_TIMER_ALARM_EN_M (BIT(16)) +#define RTC_CNTL_MAIN_TIMER_ALARM_EN_V 0x1 +#define RTC_CNTL_MAIN_TIMER_ALARM_EN_S 16 +/* RTC_CNTL_SLP_VAL_HI : R/W ;bitpos:[15:0] ;default: 16'h0 ; */ +/*description: RTC sleep timer high 16 bits*/ +#define RTC_CNTL_SLP_VAL_HI 0x0000FFFF +#define RTC_CNTL_SLP_VAL_HI_M ((RTC_CNTL_SLP_VAL_HI_V)<<(RTC_CNTL_SLP_VAL_HI_S)) +#define RTC_CNTL_SLP_VAL_HI_V 0xFFFF +#define RTC_CNTL_SLP_VAL_HI_S 0 + +#define RTC_CNTL_TIME_UPDATE_REG (DR_REG_RTCCNTL_BASE + 0xc) +/* RTC_CNTL_TIME_UPDATE : WO ;bitpos:[31] ;default: 1'h0 ; */ +/*description: Set 1: to update register with RTC timer*/ +#define RTC_CNTL_TIME_UPDATE (BIT(31)) +#define RTC_CNTL_TIME_UPDATE_M (BIT(31)) +#define RTC_CNTL_TIME_UPDATE_V 0x1 +#define RTC_CNTL_TIME_UPDATE_S 31 +/* RTC_CNTL_TIME_VALID : RO ;bitpos:[30] ;default: 1'b0 ; */ +/*description: To indicate the register is updated*/ +#define RTC_CNTL_TIME_VALID (BIT(30)) +#define RTC_CNTL_TIME_VALID_M (BIT(30)) +#define RTC_CNTL_TIME_VALID_V 0x1 +#define RTC_CNTL_TIME_VALID_S 30 + +#define RTC_CNTL_TIME0_REG (DR_REG_RTCCNTL_BASE + 0x10) +/* RTC_CNTL_TIME_LO : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: RTC timer low 32 bits*/ +#define RTC_CNTL_TIME_LO 0xFFFFFFFF +#define RTC_CNTL_TIME_LO_M ((RTC_CNTL_TIME_LO_V)<<(RTC_CNTL_TIME_LO_S)) +#define RTC_CNTL_TIME_LO_V 0xFFFFFFFF +#define RTC_CNTL_TIME_LO_S 0 + +#define RTC_CNTL_TIME1_REG (DR_REG_RTCCNTL_BASE + 0x14) +/* RTC_CNTL_TIME_HI : RO ;bitpos:[15:0] ;default: 16'h0 ; */ +/*description: RTC timer high 16 bits*/ +#define RTC_CNTL_TIME_HI 0x0000FFFF +#define RTC_CNTL_TIME_HI_M ((RTC_CNTL_TIME_HI_V)<<(RTC_CNTL_TIME_HI_S)) +#define RTC_CNTL_TIME_HI_V 0xFFFF +#define RTC_CNTL_TIME_HI_S 0 + +#define RTC_CNTL_STATE0_REG (DR_REG_RTCCNTL_BASE + 0x18) +/* RTC_CNTL_SLEEP_EN : R/W ;bitpos:[31] ;default: 1'd0 ; */ +/*description: sleep enable bit*/ +#define RTC_CNTL_SLEEP_EN (BIT(31)) +#define RTC_CNTL_SLEEP_EN_M (BIT(31)) +#define RTC_CNTL_SLEEP_EN_V 0x1 +#define RTC_CNTL_SLEEP_EN_S 31 +/* RTC_CNTL_SLP_REJECT : R/W ;bitpos:[30] ;default: 1'd0 ; */ +/*description: sleep reject bit*/ +#define RTC_CNTL_SLP_REJECT (BIT(30)) +#define RTC_CNTL_SLP_REJECT_M (BIT(30)) +#define RTC_CNTL_SLP_REJECT_V 0x1 +#define RTC_CNTL_SLP_REJECT_S 30 +/* RTC_CNTL_SLP_WAKEUP : R/W ;bitpos:[29] ;default: 1'd0 ; */ +/*description: sleep wakeup bit*/ +#define RTC_CNTL_SLP_WAKEUP (BIT(29)) +#define RTC_CNTL_SLP_WAKEUP_M (BIT(29)) +#define RTC_CNTL_SLP_WAKEUP_V 0x1 +#define RTC_CNTL_SLP_WAKEUP_S 29 +/* RTC_CNTL_SDIO_ACTIVE_IND : RO ;bitpos:[28] ;default: 1'd0 ; */ +/*description: SDIO active indication*/ +#define RTC_CNTL_SDIO_ACTIVE_IND (BIT(28)) +#define RTC_CNTL_SDIO_ACTIVE_IND_M (BIT(28)) +#define RTC_CNTL_SDIO_ACTIVE_IND_V 0x1 +#define RTC_CNTL_SDIO_ACTIVE_IND_S 28 +/* RTC_CNTL_ULP_CP_SLP_TIMER_EN : R/W ;bitpos:[24] ;default: 1'd0 ; */ +/*description: ULP-coprocessor timer enable bit*/ +#define RTC_CNTL_ULP_CP_SLP_TIMER_EN (BIT(24)) +#define RTC_CNTL_ULP_CP_SLP_TIMER_EN_M (BIT(24)) +#define RTC_CNTL_ULP_CP_SLP_TIMER_EN_V 0x1 +#define RTC_CNTL_ULP_CP_SLP_TIMER_EN_S 24 +/* RTC_CNTL_TOUCH_SLP_TIMER_EN : R/W ;bitpos:[23] ;default: 1'd0 ; */ +/*description: touch timer enable bit*/ +#define RTC_CNTL_TOUCH_SLP_TIMER_EN (BIT(23)) +#define RTC_CNTL_TOUCH_SLP_TIMER_EN_M (BIT(23)) +#define RTC_CNTL_TOUCH_SLP_TIMER_EN_V 0x1 +#define RTC_CNTL_TOUCH_SLP_TIMER_EN_S 23 +/* RTC_CNTL_APB2RTC_BRIDGE_SEL : R/W ;bitpos:[22] ;default: 1'd0 ; */ +/*description: 1: APB to RTC using bridge 0: APB to RTC using sync*/ +#define RTC_CNTL_APB2RTC_BRIDGE_SEL (BIT(22)) +#define RTC_CNTL_APB2RTC_BRIDGE_SEL_M (BIT(22)) +#define RTC_CNTL_APB2RTC_BRIDGE_SEL_V 0x1 +#define RTC_CNTL_APB2RTC_BRIDGE_SEL_S 22 +/* RTC_CNTL_ULP_CP_WAKEUP_FORCE_EN : R/W ;bitpos:[21] ;default: 1'd1 ; */ +/*description: ULP-coprocessor force wake up*/ +#define RTC_CNTL_ULP_CP_WAKEUP_FORCE_EN (BIT(21)) +#define RTC_CNTL_ULP_CP_WAKEUP_FORCE_EN_M (BIT(21)) +#define RTC_CNTL_ULP_CP_WAKEUP_FORCE_EN_V 0x1 +#define RTC_CNTL_ULP_CP_WAKEUP_FORCE_EN_S 21 +/* RTC_CNTL_TOUCH_WAKEUP_FORCE_EN : R/W ;bitpos:[20] ;default: 1'd1 ; */ +/*description: touch controller force wake up*/ +#define RTC_CNTL_TOUCH_WAKEUP_FORCE_EN (BIT(20)) +#define RTC_CNTL_TOUCH_WAKEUP_FORCE_EN_M (BIT(20)) +#define RTC_CNTL_TOUCH_WAKEUP_FORCE_EN_V 0x1 +#define RTC_CNTL_TOUCH_WAKEUP_FORCE_EN_S 20 + +#define RTC_CNTL_TIMER1_REG (DR_REG_RTCCNTL_BASE + 0x1c) +/* RTC_CNTL_PLL_BUF_WAIT : R/W ;bitpos:[31:24] ;default: 8'd40 ; */ +/*description: PLL wait cycles in slow_clk_rtc*/ +#define RTC_CNTL_PLL_BUF_WAIT 0x000000FF +#define RTC_CNTL_PLL_BUF_WAIT_M ((RTC_CNTL_PLL_BUF_WAIT_V)<<(RTC_CNTL_PLL_BUF_WAIT_S)) +#define RTC_CNTL_PLL_BUF_WAIT_V 0xFF +#define RTC_CNTL_PLL_BUF_WAIT_S 24 +#define RTC_CNTL_PLL_BUF_WAIT_DEFAULT 20 +/* RTC_CNTL_XTL_BUF_WAIT : R/W ;bitpos:[23:14] ;default: 10'd80 ; */ +/*description: XTAL wait cycles in slow_clk_rtc*/ +#define RTC_CNTL_XTL_BUF_WAIT 0x000003FF +#define RTC_CNTL_XTL_BUF_WAIT_M ((RTC_CNTL_XTL_BUF_WAIT_V)<<(RTC_CNTL_XTL_BUF_WAIT_S)) +#define RTC_CNTL_XTL_BUF_WAIT_V 0x3FF +#define RTC_CNTL_XTL_BUF_WAIT_S 14 +#define RTC_CNTL_XTL_BUF_WAIT_DEFAULT 20 +/* RTC_CNTL_CK8M_WAIT : R/W ;bitpos:[13:6] ;default: 8'h10 ; */ +/*description: CK8M wait cycles in slow_clk_rtc*/ +#define RTC_CNTL_CK8M_WAIT 0x000000FF +#define RTC_CNTL_CK8M_WAIT_M ((RTC_CNTL_CK8M_WAIT_V)<<(RTC_CNTL_CK8M_WAIT_S)) +#define RTC_CNTL_CK8M_WAIT_V 0xFF +#define RTC_CNTL_CK8M_WAIT_S 6 +#define RTC_CNTL_CK8M_WAIT_DEFAULT 20 +/* RTC_CNTL_CPU_STALL_WAIT : R/W ;bitpos:[5:1] ;default: 5'd1 ; */ +/*description: CPU stall wait cycles in fast_clk_rtc*/ +#define RTC_CNTL_CPU_STALL_WAIT 0x0000001F +#define RTC_CNTL_CPU_STALL_WAIT_M ((RTC_CNTL_CPU_STALL_WAIT_V)<<(RTC_CNTL_CPU_STALL_WAIT_S)) +#define RTC_CNTL_CPU_STALL_WAIT_V 0x1F +#define RTC_CNTL_CPU_STALL_WAIT_S 1 +/* RTC_CNTL_CPU_STALL_EN : R/W ;bitpos:[0] ;default: 1'd1 ; */ +/*description: CPU stall enable bit*/ +#define RTC_CNTL_CPU_STALL_EN (BIT(0)) +#define RTC_CNTL_CPU_STALL_EN_M (BIT(0)) +#define RTC_CNTL_CPU_STALL_EN_V 0x1 +#define RTC_CNTL_CPU_STALL_EN_S 0 + +#define RTC_CNTL_TIMER2_REG (DR_REG_RTCCNTL_BASE + 0x20) +/* RTC_CNTL_MIN_TIME_CK8M_OFF : R/W ;bitpos:[31:24] ;default: 8'h1 ; */ +/*description: minimal cycles in slow_clk_rtc for CK8M in power down state*/ +#define RTC_CNTL_MIN_TIME_CK8M_OFF 0x000000FF +#define RTC_CNTL_MIN_TIME_CK8M_OFF_M ((RTC_CNTL_MIN_TIME_CK8M_OFF_V)<<(RTC_CNTL_MIN_TIME_CK8M_OFF_S)) +#define RTC_CNTL_MIN_TIME_CK8M_OFF_V 0xFF +#define RTC_CNTL_MIN_TIME_CK8M_OFF_S 24 +/* RTC_CNTL_ULPCP_TOUCH_START_WAIT : R/W ;bitpos:[23:15] ;default: 9'h10 ; */ +/*description: wait cycles in slow_clk_rtc before ULP-coprocessor / touch controller + start to work*/ +#define RTC_CNTL_ULPCP_TOUCH_START_WAIT 0x000001FF +#define RTC_CNTL_ULPCP_TOUCH_START_WAIT_M ((RTC_CNTL_ULPCP_TOUCH_START_WAIT_V)<<(RTC_CNTL_ULPCP_TOUCH_START_WAIT_S)) +#define RTC_CNTL_ULPCP_TOUCH_START_WAIT_V 0x1FF +#define RTC_CNTL_ULPCP_TOUCH_START_WAIT_S 15 + +#define RTC_CNTL_TIMER3_REG (DR_REG_RTCCNTL_BASE + 0x24) +/* RTC_CNTL_ROM_RAM_POWERUP_TIMER : R/W ;bitpos:[31:25] ;default: 7'd10 ; */ +/*description: */ +#define RTC_CNTL_ROM_RAM_POWERUP_TIMER 0x0000007F +#define RTC_CNTL_ROM_RAM_POWERUP_TIMER_M ((RTC_CNTL_ROM_RAM_POWERUP_TIMER_V)<<(RTC_CNTL_ROM_RAM_POWERUP_TIMER_S)) +#define RTC_CNTL_ROM_RAM_POWERUP_TIMER_V 0x7F +#define RTC_CNTL_ROM_RAM_POWERUP_TIMER_S 25 +/* RTC_CNTL_ROM_RAM_WAIT_TIMER : R/W ;bitpos:[24:16] ;default: 9'h16 ; */ +/*description: */ +#define RTC_CNTL_ROM_RAM_WAIT_TIMER 0x000001FF +#define RTC_CNTL_ROM_RAM_WAIT_TIMER_M ((RTC_CNTL_ROM_RAM_WAIT_TIMER_V)<<(RTC_CNTL_ROM_RAM_WAIT_TIMER_S)) +#define RTC_CNTL_ROM_RAM_WAIT_TIMER_V 0x1FF +#define RTC_CNTL_ROM_RAM_WAIT_TIMER_S 16 +/* RTC_CNTL_WIFI_POWERUP_TIMER : R/W ;bitpos:[15:9] ;default: 7'h5 ; */ +/*description: */ +#define RTC_CNTL_WIFI_POWERUP_TIMER 0x0000007F +#define RTC_CNTL_WIFI_POWERUP_TIMER_M ((RTC_CNTL_WIFI_POWERUP_TIMER_V)<<(RTC_CNTL_WIFI_POWERUP_TIMER_S)) +#define RTC_CNTL_WIFI_POWERUP_TIMER_V 0x7F +#define RTC_CNTL_WIFI_POWERUP_TIMER_S 9 +/* RTC_CNTL_WIFI_WAIT_TIMER : R/W ;bitpos:[8:0] ;default: 9'h8 ; */ +/*description: */ +#define RTC_CNTL_WIFI_WAIT_TIMER 0x000001FF +#define RTC_CNTL_WIFI_WAIT_TIMER_M ((RTC_CNTL_WIFI_WAIT_TIMER_V)<<(RTC_CNTL_WIFI_WAIT_TIMER_S)) +#define RTC_CNTL_WIFI_WAIT_TIMER_V 0x1FF +#define RTC_CNTL_WIFI_WAIT_TIMER_S 0 + +#define RTC_CNTL_TIMER4_REG (DR_REG_RTCCNTL_BASE + 0x28) +/* RTC_CNTL_DG_WRAP_POWERUP_TIMER : R/W ;bitpos:[31:25] ;default: 7'h8 ; */ +/*description: */ +#define RTC_CNTL_DG_WRAP_POWERUP_TIMER 0x0000007F +#define RTC_CNTL_DG_WRAP_POWERUP_TIMER_M ((RTC_CNTL_DG_WRAP_POWERUP_TIMER_V)<<(RTC_CNTL_DG_WRAP_POWERUP_TIMER_S)) +#define RTC_CNTL_DG_WRAP_POWERUP_TIMER_V 0x7F +#define RTC_CNTL_DG_WRAP_POWERUP_TIMER_S 25 +/* RTC_CNTL_DG_WRAP_WAIT_TIMER : R/W ;bitpos:[24:16] ;default: 9'h20 ; */ +/*description: */ +#define RTC_CNTL_DG_WRAP_WAIT_TIMER 0x000001FF +#define RTC_CNTL_DG_WRAP_WAIT_TIMER_M ((RTC_CNTL_DG_WRAP_WAIT_TIMER_V)<<(RTC_CNTL_DG_WRAP_WAIT_TIMER_S)) +#define RTC_CNTL_DG_WRAP_WAIT_TIMER_V 0x1FF +#define RTC_CNTL_DG_WRAP_WAIT_TIMER_S 16 +/* RTC_CNTL_POWERUP_TIMER : R/W ;bitpos:[15:9] ;default: 7'h5 ; */ +/*description: */ +#define RTC_CNTL_POWERUP_TIMER 0x0000007F +#define RTC_CNTL_POWERUP_TIMER_M ((RTC_CNTL_POWERUP_TIMER_V)<<(RTC_CNTL_POWERUP_TIMER_S)) +#define RTC_CNTL_POWERUP_TIMER_V 0x7F +#define RTC_CNTL_POWERUP_TIMER_S 9 +/* RTC_CNTL_WAIT_TIMER : R/W ;bitpos:[8:0] ;default: 9'h8 ; */ +/*description: */ +#define RTC_CNTL_WAIT_TIMER 0x000001FF +#define RTC_CNTL_WAIT_TIMER_M ((RTC_CNTL_WAIT_TIMER_V)<<(RTC_CNTL_WAIT_TIMER_S)) +#define RTC_CNTL_WAIT_TIMER_V 0x1FF +#define RTC_CNTL_WAIT_TIMER_S 0 + +#define RTC_CNTL_TIMER5_REG (DR_REG_RTCCNTL_BASE + 0x2c) +/* RTC_CNTL_RTCMEM_POWERUP_TIMER : R/W ;bitpos:[31:25] ;default: 7'h9 ; */ +/*description: */ +#define RTC_CNTL_RTCMEM_POWERUP_TIMER 0x0000007F +#define RTC_CNTL_RTCMEM_POWERUP_TIMER_M ((RTC_CNTL_RTCMEM_POWERUP_TIMER_V)<<(RTC_CNTL_RTCMEM_POWERUP_TIMER_S)) +#define RTC_CNTL_RTCMEM_POWERUP_TIMER_V 0x7F +#define RTC_CNTL_RTCMEM_POWERUP_TIMER_S 25 +/* RTC_CNTL_RTCMEM_WAIT_TIMER : R/W ;bitpos:[24:16] ;default: 9'h14 ; */ +/*description: */ +#define RTC_CNTL_RTCMEM_WAIT_TIMER 0x000001FF +#define RTC_CNTL_RTCMEM_WAIT_TIMER_M ((RTC_CNTL_RTCMEM_WAIT_TIMER_V)<<(RTC_CNTL_RTCMEM_WAIT_TIMER_S)) +#define RTC_CNTL_RTCMEM_WAIT_TIMER_V 0x1FF +#define RTC_CNTL_RTCMEM_WAIT_TIMER_S 16 +/* RTC_CNTL_MIN_SLP_VAL : R/W ;bitpos:[15:8] ;default: 8'h80 ; */ +/*description: minimal sleep cycles in slow_clk_rtc*/ +#define RTC_CNTL_MIN_SLP_VAL 0x000000FF +#define RTC_CNTL_MIN_SLP_VAL_M ((RTC_CNTL_MIN_SLP_VAL_V)<<(RTC_CNTL_MIN_SLP_VAL_S)) +#define RTC_CNTL_MIN_SLP_VAL_V 0xFF +#define RTC_CNTL_MIN_SLP_VAL_S 8 +#define RTC_CNTL_MIN_SLP_VAL_MIN 2 +/* RTC_CNTL_ULP_CP_SUBTIMER_PREDIV : R/W ;bitpos:[7:0] ;default: 8'd1 ; */ +/*description: */ +#define RTC_CNTL_ULP_CP_SUBTIMER_PREDIV 0x000000FF +#define RTC_CNTL_ULP_CP_SUBTIMER_PREDIV_M ((RTC_CNTL_ULP_CP_SUBTIMER_PREDIV_V)<<(RTC_CNTL_ULP_CP_SUBTIMER_PREDIV_S)) +#define RTC_CNTL_ULP_CP_SUBTIMER_PREDIV_V 0xFF +#define RTC_CNTL_ULP_CP_SUBTIMER_PREDIV_S 0 + +#define RTC_CNTL_ANA_CONF_REG (DR_REG_RTCCNTL_BASE + 0x30) +/* RTC_CNTL_PLL_I2C_PU : R/W ;bitpos:[31] ;default: 1'd0 ; */ +/*description: 1: PLL_I2C power up otherwise power down*/ +#define RTC_CNTL_PLL_I2C_PU (BIT(31)) +#define RTC_CNTL_PLL_I2C_PU_M (BIT(31)) +#define RTC_CNTL_PLL_I2C_PU_V 0x1 +#define RTC_CNTL_PLL_I2C_PU_S 31 +/* RTC_CNTL_CKGEN_I2C_PU : R/W ;bitpos:[30] ;default: 1'd0 ; */ +/*description: 1: CKGEN_I2C power up otherwise power down*/ +#define RTC_CNTL_CKGEN_I2C_PU (BIT(30)) +#define RTC_CNTL_CKGEN_I2C_PU_M (BIT(30)) +#define RTC_CNTL_CKGEN_I2C_PU_V 0x1 +#define RTC_CNTL_CKGEN_I2C_PU_S 30 +/* RTC_CNTL_RFRX_PBUS_PU : R/W ;bitpos:[28] ;default: 1'd0 ; */ +/*description: 1: RFRX_PBUS power up otherwise power down*/ +#define RTC_CNTL_RFRX_PBUS_PU (BIT(28)) +#define RTC_CNTL_RFRX_PBUS_PU_M (BIT(28)) +#define RTC_CNTL_RFRX_PBUS_PU_V 0x1 +#define RTC_CNTL_RFRX_PBUS_PU_S 28 +/* RTC_CNTL_TXRF_I2C_PU : R/W ;bitpos:[27] ;default: 1'd0 ; */ +/*description: 1: TXRF_I2C power up otherwise power down*/ +#define RTC_CNTL_TXRF_I2C_PU (BIT(27)) +#define RTC_CNTL_TXRF_I2C_PU_M (BIT(27)) +#define RTC_CNTL_TXRF_I2C_PU_V 0x1 +#define RTC_CNTL_TXRF_I2C_PU_S 27 +/* RTC_CNTL_PVTMON_PU : R/W ;bitpos:[26] ;default: 1'b0 ; */ +/*description: 1: PVTMON power up otherwise power down*/ +#define RTC_CNTL_PVTMON_PU (BIT(26)) +#define RTC_CNTL_PVTMON_PU_M (BIT(26)) +#define RTC_CNTL_PVTMON_PU_V 0x1 +#define RTC_CNTL_PVTMON_PU_S 26 +/* RTC_CNTL_BBPLL_CAL_SLP_START : R/W ;bitpos:[25] ;default: 1'b0 ; */ +/*description: start BBPLL calibration during sleep*/ +#define RTC_CNTL_BBPLL_CAL_SLP_START (BIT(25)) +#define RTC_CNTL_BBPLL_CAL_SLP_START_M (BIT(25)) +#define RTC_CNTL_BBPLL_CAL_SLP_START_V 0x1 +#define RTC_CNTL_BBPLL_CAL_SLP_START_S 25 +/* RTC_CNTL_PLLA_FORCE_PU : R/W ;bitpos:[24] ;default: 1'b0 ; */ +/*description: PLLA force power up*/ +#define RTC_CNTL_PLLA_FORCE_PU (BIT(24)) +#define RTC_CNTL_PLLA_FORCE_PU_M (BIT(24)) +#define RTC_CNTL_PLLA_FORCE_PU_V 0x1 +#define RTC_CNTL_PLLA_FORCE_PU_S 24 +/* RTC_CNTL_PLLA_FORCE_PD : R/W ;bitpos:[23] ;default: 1'b1 ; */ +/*description: PLLA force power down*/ +#define RTC_CNTL_PLLA_FORCE_PD (BIT(23)) +#define RTC_CNTL_PLLA_FORCE_PD_M (BIT(23)) +#define RTC_CNTL_PLLA_FORCE_PD_V 0x1 +#define RTC_CNTL_PLLA_FORCE_PD_S 23 + +#define RTC_CNTL_RESET_STATE_REG (DR_REG_RTCCNTL_BASE + 0x34) +/* RTC_CNTL_PROCPU_STAT_VECTOR_SEL : R/W ;bitpos:[13] ;default: 1'b1 ; */ +/*description: PRO CPU state vector sel*/ +#define RTC_CNTL_PROCPU_STAT_VECTOR_SEL (BIT(13)) +#define RTC_CNTL_PROCPU_STAT_VECTOR_SEL_M (BIT(13)) +#define RTC_CNTL_PROCPU_STAT_VECTOR_SEL_V 0x1 +#define RTC_CNTL_PROCPU_STAT_VECTOR_SEL_S 13 +/* RTC_CNTL_APPCPU_STAT_VECTOR_SEL : R/W ;bitpos:[12] ;default: 1'b1 ; */ +/*description: APP CPU state vector sel*/ +#define RTC_CNTL_APPCPU_STAT_VECTOR_SEL (BIT(12)) +#define RTC_CNTL_APPCPU_STAT_VECTOR_SEL_M (BIT(12)) +#define RTC_CNTL_APPCPU_STAT_VECTOR_SEL_V 0x1 +#define RTC_CNTL_APPCPU_STAT_VECTOR_SEL_S 12 +/* RTC_CNTL_RESET_CAUSE_APPCPU : RO ;bitpos:[11:6] ;default: 0 ; */ +/*description: reset cause of APP CPU*/ +#define RTC_CNTL_RESET_CAUSE_APPCPU 0x0000003F +#define RTC_CNTL_RESET_CAUSE_APPCPU_M ((RTC_CNTL_RESET_CAUSE_APPCPU_V)<<(RTC_CNTL_RESET_CAUSE_APPCPU_S)) +#define RTC_CNTL_RESET_CAUSE_APPCPU_V 0x3F +#define RTC_CNTL_RESET_CAUSE_APPCPU_S 6 +/* RTC_CNTL_RESET_CAUSE_PROCPU : RO ;bitpos:[5:0] ;default: 0 ; */ +/*description: reset cause of PRO CPU*/ +#define RTC_CNTL_RESET_CAUSE_PROCPU 0x0000003F +#define RTC_CNTL_RESET_CAUSE_PROCPU_M ((RTC_CNTL_RESET_CAUSE_PROCPU_V)<<(RTC_CNTL_RESET_CAUSE_PROCPU_S)) +#define RTC_CNTL_RESET_CAUSE_PROCPU_V 0x3F +#define RTC_CNTL_RESET_CAUSE_PROCPU_S 0 + +#define RTC_CNTL_WAKEUP_STATE_REG (DR_REG_RTCCNTL_BASE + 0x38) +/* RTC_CNTL_GPIO_WAKEUP_FILTER : R/W ;bitpos:[22] ;default: 1'd0 ; */ +/*description: enable filter for gpio wakeup event*/ +#define RTC_CNTL_GPIO_WAKEUP_FILTER (BIT(22)) +#define RTC_CNTL_GPIO_WAKEUP_FILTER_M (BIT(22)) +#define RTC_CNTL_GPIO_WAKEUP_FILTER_V 0x1 +#define RTC_CNTL_GPIO_WAKEUP_FILTER_S 22 +/* RTC_CNTL_WAKEUP_ENA : R/W ;bitpos:[21:11] ;default: 11'b1100 ; */ +/*description: wakeup enable bitmap*/ +#define RTC_CNTL_WAKEUP_ENA 0x000007FF +#define RTC_CNTL_WAKEUP_ENA_M ((RTC_CNTL_WAKEUP_ENA_V)<<(RTC_CNTL_WAKEUP_ENA_S)) +#define RTC_CNTL_WAKEUP_ENA_V 0x7FF +#define RTC_CNTL_WAKEUP_ENA_S 11 +/* RTC_CNTL_WAKEUP_CAUSE : RO ;bitpos:[10:0] ;default: 11'h0 ; */ +/*description: wakeup cause*/ +#define RTC_CNTL_WAKEUP_CAUSE 0x000007FF +#define RTC_CNTL_WAKEUP_CAUSE_M ((RTC_CNTL_WAKEUP_CAUSE_V)<<(RTC_CNTL_WAKEUP_CAUSE_S)) +#define RTC_CNTL_WAKEUP_CAUSE_V 0x7FF +#define RTC_CNTL_WAKEUP_CAUSE_S 0 + +#define RTC_CNTL_INT_ENA_REG (DR_REG_RTCCNTL_BASE + 0x3c) +/* RTC_CNTL_MAIN_TIMER_INT_ENA : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: enable RTC main timer interrupt*/ +#define RTC_CNTL_MAIN_TIMER_INT_ENA (BIT(8)) +#define RTC_CNTL_MAIN_TIMER_INT_ENA_M (BIT(8)) +#define RTC_CNTL_MAIN_TIMER_INT_ENA_V 0x1 +#define RTC_CNTL_MAIN_TIMER_INT_ENA_S 8 +/* RTC_CNTL_BROWN_OUT_INT_ENA : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: enable brown out interrupt*/ +#define RTC_CNTL_BROWN_OUT_INT_ENA (BIT(7)) +#define RTC_CNTL_BROWN_OUT_INT_ENA_M (BIT(7)) +#define RTC_CNTL_BROWN_OUT_INT_ENA_V 0x1 +#define RTC_CNTL_BROWN_OUT_INT_ENA_S 7 +/* RTC_CNTL_TOUCH_INT_ENA : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: enable touch interrupt*/ +#define RTC_CNTL_TOUCH_INT_ENA (BIT(6)) +#define RTC_CNTL_TOUCH_INT_ENA_M (BIT(6)) +#define RTC_CNTL_TOUCH_INT_ENA_V 0x1 +#define RTC_CNTL_TOUCH_INT_ENA_S 6 +/* RTC_CNTL_ULP_CP_INT_ENA : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: enable ULP-coprocessor interrupt*/ +#define RTC_CNTL_ULP_CP_INT_ENA (BIT(5)) +#define RTC_CNTL_ULP_CP_INT_ENA_M (BIT(5)) +#define RTC_CNTL_ULP_CP_INT_ENA_V 0x1 +#define RTC_CNTL_ULP_CP_INT_ENA_S 5 +/* RTC_CNTL_TIME_VALID_INT_ENA : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: enable RTC time valid interrupt*/ +#define RTC_CNTL_TIME_VALID_INT_ENA (BIT(4)) +#define RTC_CNTL_TIME_VALID_INT_ENA_M (BIT(4)) +#define RTC_CNTL_TIME_VALID_INT_ENA_V 0x1 +#define RTC_CNTL_TIME_VALID_INT_ENA_S 4 +/* RTC_CNTL_WDT_INT_ENA : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: enable RTC WDT interrupt*/ +#define RTC_CNTL_WDT_INT_ENA (BIT(3)) +#define RTC_CNTL_WDT_INT_ENA_M (BIT(3)) +#define RTC_CNTL_WDT_INT_ENA_V 0x1 +#define RTC_CNTL_WDT_INT_ENA_S 3 +/* RTC_CNTL_SDIO_IDLE_INT_ENA : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: enable SDIO idle interrupt*/ +#define RTC_CNTL_SDIO_IDLE_INT_ENA (BIT(2)) +#define RTC_CNTL_SDIO_IDLE_INT_ENA_M (BIT(2)) +#define RTC_CNTL_SDIO_IDLE_INT_ENA_V 0x1 +#define RTC_CNTL_SDIO_IDLE_INT_ENA_S 2 +/* RTC_CNTL_SLP_REJECT_INT_ENA : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: enable sleep reject interrupt*/ +#define RTC_CNTL_SLP_REJECT_INT_ENA (BIT(1)) +#define RTC_CNTL_SLP_REJECT_INT_ENA_M (BIT(1)) +#define RTC_CNTL_SLP_REJECT_INT_ENA_V 0x1 +#define RTC_CNTL_SLP_REJECT_INT_ENA_S 1 +/* RTC_CNTL_SLP_WAKEUP_INT_ENA : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: enable sleep wakeup interrupt*/ +#define RTC_CNTL_SLP_WAKEUP_INT_ENA (BIT(0)) +#define RTC_CNTL_SLP_WAKEUP_INT_ENA_M (BIT(0)) +#define RTC_CNTL_SLP_WAKEUP_INT_ENA_V 0x1 +#define RTC_CNTL_SLP_WAKEUP_INT_ENA_S 0 + +#define RTC_CNTL_INT_RAW_REG (DR_REG_RTCCNTL_BASE + 0x40) +/* RTC_CNTL_MAIN_TIMER_INT_RAW : RO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: RTC main timer interrupt raw*/ +#define RTC_CNTL_MAIN_TIMER_INT_RAW (BIT(8)) +#define RTC_CNTL_MAIN_TIMER_INT_RAW_M (BIT(8)) +#define RTC_CNTL_MAIN_TIMER_INT_RAW_V 0x1 +#define RTC_CNTL_MAIN_TIMER_INT_RAW_S 8 +/* RTC_CNTL_BROWN_OUT_INT_RAW : RO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: brown out interrupt raw*/ +#define RTC_CNTL_BROWN_OUT_INT_RAW (BIT(7)) +#define RTC_CNTL_BROWN_OUT_INT_RAW_M (BIT(7)) +#define RTC_CNTL_BROWN_OUT_INT_RAW_V 0x1 +#define RTC_CNTL_BROWN_OUT_INT_RAW_S 7 +/* RTC_CNTL_TOUCH_INT_RAW : RO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: touch interrupt raw*/ +#define RTC_CNTL_TOUCH_INT_RAW (BIT(6)) +#define RTC_CNTL_TOUCH_INT_RAW_M (BIT(6)) +#define RTC_CNTL_TOUCH_INT_RAW_V 0x1 +#define RTC_CNTL_TOUCH_INT_RAW_S 6 +/* RTC_CNTL_ULP_CP_INT_RAW : RO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: ULP-coprocessor interrupt raw*/ +#define RTC_CNTL_ULP_CP_INT_RAW (BIT(5)) +#define RTC_CNTL_ULP_CP_INT_RAW_M (BIT(5)) +#define RTC_CNTL_ULP_CP_INT_RAW_V 0x1 +#define RTC_CNTL_ULP_CP_INT_RAW_S 5 +/* RTC_CNTL_TIME_VALID_INT_RAW : RO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: RTC time valid interrupt raw*/ +#define RTC_CNTL_TIME_VALID_INT_RAW (BIT(4)) +#define RTC_CNTL_TIME_VALID_INT_RAW_M (BIT(4)) +#define RTC_CNTL_TIME_VALID_INT_RAW_V 0x1 +#define RTC_CNTL_TIME_VALID_INT_RAW_S 4 +/* RTC_CNTL_WDT_INT_RAW : RO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: RTC WDT interrupt raw*/ +#define RTC_CNTL_WDT_INT_RAW (BIT(3)) +#define RTC_CNTL_WDT_INT_RAW_M (BIT(3)) +#define RTC_CNTL_WDT_INT_RAW_V 0x1 +#define RTC_CNTL_WDT_INT_RAW_S 3 +/* RTC_CNTL_SDIO_IDLE_INT_RAW : RO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: SDIO idle interrupt raw*/ +#define RTC_CNTL_SDIO_IDLE_INT_RAW (BIT(2)) +#define RTC_CNTL_SDIO_IDLE_INT_RAW_M (BIT(2)) +#define RTC_CNTL_SDIO_IDLE_INT_RAW_V 0x1 +#define RTC_CNTL_SDIO_IDLE_INT_RAW_S 2 +/* RTC_CNTL_SLP_REJECT_INT_RAW : RO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: sleep reject interrupt raw*/ +#define RTC_CNTL_SLP_REJECT_INT_RAW (BIT(1)) +#define RTC_CNTL_SLP_REJECT_INT_RAW_M (BIT(1)) +#define RTC_CNTL_SLP_REJECT_INT_RAW_V 0x1 +#define RTC_CNTL_SLP_REJECT_INT_RAW_S 1 +/* RTC_CNTL_SLP_WAKEUP_INT_RAW : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: sleep wakeup interrupt raw*/ +#define RTC_CNTL_SLP_WAKEUP_INT_RAW (BIT(0)) +#define RTC_CNTL_SLP_WAKEUP_INT_RAW_M (BIT(0)) +#define RTC_CNTL_SLP_WAKEUP_INT_RAW_V 0x1 +#define RTC_CNTL_SLP_WAKEUP_INT_RAW_S 0 + +#define RTC_CNTL_INT_ST_REG (DR_REG_RTCCNTL_BASE + 0x44) +/* RTC_CNTL_MAIN_TIMER_INT_ST : RO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: RTC main timer interrupt state*/ +#define RTC_CNTL_MAIN_TIMER_INT_ST (BIT(8)) +#define RTC_CNTL_MAIN_TIMER_INT_ST_M (BIT(8)) +#define RTC_CNTL_MAIN_TIMER_INT_ST_V 0x1 +#define RTC_CNTL_MAIN_TIMER_INT_ST_S 8 +/* RTC_CNTL_BROWN_OUT_INT_ST : RO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: brown out interrupt state*/ +#define RTC_CNTL_BROWN_OUT_INT_ST (BIT(7)) +#define RTC_CNTL_BROWN_OUT_INT_ST_M (BIT(7)) +#define RTC_CNTL_BROWN_OUT_INT_ST_V 0x1 +#define RTC_CNTL_BROWN_OUT_INT_ST_S 7 +/* RTC_CNTL_TOUCH_INT_ST : RO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: touch interrupt state*/ +#define RTC_CNTL_TOUCH_INT_ST (BIT(6)) +#define RTC_CNTL_TOUCH_INT_ST_M (BIT(6)) +#define RTC_CNTL_TOUCH_INT_ST_V 0x1 +#define RTC_CNTL_TOUCH_INT_ST_S 6 +/* RTC_CNTL_SAR_INT_ST : RO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: ULP-coprocessor interrupt state*/ +#define RTC_CNTL_SAR_INT_ST (BIT(5)) +#define RTC_CNTL_SAR_INT_ST_M (BIT(5)) +#define RTC_CNTL_SAR_INT_ST_V 0x1 +#define RTC_CNTL_SAR_INT_ST_S 5 +/* RTC_CNTL_TIME_VALID_INT_ST : RO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: RTC time valid interrupt state*/ +#define RTC_CNTL_TIME_VALID_INT_ST (BIT(4)) +#define RTC_CNTL_TIME_VALID_INT_ST_M (BIT(4)) +#define RTC_CNTL_TIME_VALID_INT_ST_V 0x1 +#define RTC_CNTL_TIME_VALID_INT_ST_S 4 +/* RTC_CNTL_WDT_INT_ST : RO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: RTC WDT interrupt state*/ +#define RTC_CNTL_WDT_INT_ST (BIT(3)) +#define RTC_CNTL_WDT_INT_ST_M (BIT(3)) +#define RTC_CNTL_WDT_INT_ST_V 0x1 +#define RTC_CNTL_WDT_INT_ST_S 3 +/* RTC_CNTL_SDIO_IDLE_INT_ST : RO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: SDIO idle interrupt state*/ +#define RTC_CNTL_SDIO_IDLE_INT_ST (BIT(2)) +#define RTC_CNTL_SDIO_IDLE_INT_ST_M (BIT(2)) +#define RTC_CNTL_SDIO_IDLE_INT_ST_V 0x1 +#define RTC_CNTL_SDIO_IDLE_INT_ST_S 2 +/* RTC_CNTL_SLP_REJECT_INT_ST : RO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: sleep reject interrupt state*/ +#define RTC_CNTL_SLP_REJECT_INT_ST (BIT(1)) +#define RTC_CNTL_SLP_REJECT_INT_ST_M (BIT(1)) +#define RTC_CNTL_SLP_REJECT_INT_ST_V 0x1 +#define RTC_CNTL_SLP_REJECT_INT_ST_S 1 +/* RTC_CNTL_SLP_WAKEUP_INT_ST : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: sleep wakeup interrupt state*/ +#define RTC_CNTL_SLP_WAKEUP_INT_ST (BIT(0)) +#define RTC_CNTL_SLP_WAKEUP_INT_ST_M (BIT(0)) +#define RTC_CNTL_SLP_WAKEUP_INT_ST_V 0x1 +#define RTC_CNTL_SLP_WAKEUP_INT_ST_S 0 + +#define RTC_CNTL_INT_CLR_REG (DR_REG_RTCCNTL_BASE + 0x48) +/* RTC_CNTL_MAIN_TIMER_INT_CLR : WO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: Clear RTC main timer interrupt state*/ +#define RTC_CNTL_MAIN_TIMER_INT_CLR (BIT(8)) +#define RTC_CNTL_MAIN_TIMER_INT_CLR_M (BIT(8)) +#define RTC_CNTL_MAIN_TIMER_INT_CLR_V 0x1 +#define RTC_CNTL_MAIN_TIMER_INT_CLR_S 8 +/* RTC_CNTL_BROWN_OUT_INT_CLR : WO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: Clear brown out interrupt state*/ +#define RTC_CNTL_BROWN_OUT_INT_CLR (BIT(7)) +#define RTC_CNTL_BROWN_OUT_INT_CLR_M (BIT(7)) +#define RTC_CNTL_BROWN_OUT_INT_CLR_V 0x1 +#define RTC_CNTL_BROWN_OUT_INT_CLR_S 7 +/* RTC_CNTL_TOUCH_INT_CLR : WO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: Clear touch interrupt state*/ +#define RTC_CNTL_TOUCH_INT_CLR (BIT(6)) +#define RTC_CNTL_TOUCH_INT_CLR_M (BIT(6)) +#define RTC_CNTL_TOUCH_INT_CLR_V 0x1 +#define RTC_CNTL_TOUCH_INT_CLR_S 6 +/* RTC_CNTL_SAR_INT_CLR : WO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: Clear ULP-coprocessor interrupt state*/ +#define RTC_CNTL_SAR_INT_CLR (BIT(5)) +#define RTC_CNTL_SAR_INT_CLR_M (BIT(5)) +#define RTC_CNTL_SAR_INT_CLR_V 0x1 +#define RTC_CNTL_SAR_INT_CLR_S 5 +/* RTC_CNTL_TIME_VALID_INT_CLR : WO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: Clear RTC time valid interrupt state*/ +#define RTC_CNTL_TIME_VALID_INT_CLR (BIT(4)) +#define RTC_CNTL_TIME_VALID_INT_CLR_M (BIT(4)) +#define RTC_CNTL_TIME_VALID_INT_CLR_V 0x1 +#define RTC_CNTL_TIME_VALID_INT_CLR_S 4 +/* RTC_CNTL_WDT_INT_CLR : WO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: Clear RTC WDT interrupt state*/ +#define RTC_CNTL_WDT_INT_CLR (BIT(3)) +#define RTC_CNTL_WDT_INT_CLR_M (BIT(3)) +#define RTC_CNTL_WDT_INT_CLR_V 0x1 +#define RTC_CNTL_WDT_INT_CLR_S 3 +/* RTC_CNTL_SDIO_IDLE_INT_CLR : WO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: Clear SDIO idle interrupt state*/ +#define RTC_CNTL_SDIO_IDLE_INT_CLR (BIT(2)) +#define RTC_CNTL_SDIO_IDLE_INT_CLR_M (BIT(2)) +#define RTC_CNTL_SDIO_IDLE_INT_CLR_V 0x1 +#define RTC_CNTL_SDIO_IDLE_INT_CLR_S 2 +/* RTC_CNTL_SLP_REJECT_INT_CLR : WO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: Clear sleep reject interrupt state*/ +#define RTC_CNTL_SLP_REJECT_INT_CLR (BIT(1)) +#define RTC_CNTL_SLP_REJECT_INT_CLR_M (BIT(1)) +#define RTC_CNTL_SLP_REJECT_INT_CLR_V 0x1 +#define RTC_CNTL_SLP_REJECT_INT_CLR_S 1 +/* RTC_CNTL_SLP_WAKEUP_INT_CLR : WO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: Clear sleep wakeup interrupt state*/ +#define RTC_CNTL_SLP_WAKEUP_INT_CLR (BIT(0)) +#define RTC_CNTL_SLP_WAKEUP_INT_CLR_M (BIT(0)) +#define RTC_CNTL_SLP_WAKEUP_INT_CLR_V 0x1 +#define RTC_CNTL_SLP_WAKEUP_INT_CLR_S 0 + +#define RTC_CNTL_STORE0_REG (DR_REG_RTCCNTL_BASE + 0x4c) +/* RTC_CNTL_SCRATCH0 : R/W ;bitpos:[31:0] ;default: 0 ; */ +/*description: 32-bit general purpose retention register*/ +#define RTC_CNTL_SCRATCH0 0xFFFFFFFF +#define RTC_CNTL_SCRATCH0_M ((RTC_CNTL_SCRATCH0_V)<<(RTC_CNTL_SCRATCH0_S)) +#define RTC_CNTL_SCRATCH0_V 0xFFFFFFFF +#define RTC_CNTL_SCRATCH0_S 0 + +#define RTC_CNTL_STORE1_REG (DR_REG_RTCCNTL_BASE + 0x50) +/* RTC_CNTL_SCRATCH1 : R/W ;bitpos:[31:0] ;default: 0 ; */ +/*description: 32-bit general purpose retention register*/ +#define RTC_CNTL_SCRATCH1 0xFFFFFFFF +#define RTC_CNTL_SCRATCH1_M ((RTC_CNTL_SCRATCH1_V)<<(RTC_CNTL_SCRATCH1_S)) +#define RTC_CNTL_SCRATCH1_V 0xFFFFFFFF +#define RTC_CNTL_SCRATCH1_S 0 + +#define RTC_CNTL_STORE2_REG (DR_REG_RTCCNTL_BASE + 0x54) +/* RTC_CNTL_SCRATCH2 : R/W ;bitpos:[31:0] ;default: 0 ; */ +/*description: 32-bit general purpose retention register*/ +#define RTC_CNTL_SCRATCH2 0xFFFFFFFF +#define RTC_CNTL_SCRATCH2_M ((RTC_CNTL_SCRATCH2_V)<<(RTC_CNTL_SCRATCH2_S)) +#define RTC_CNTL_SCRATCH2_V 0xFFFFFFFF +#define RTC_CNTL_SCRATCH2_S 0 + +#define RTC_CNTL_STORE3_REG (DR_REG_RTCCNTL_BASE + 0x58) +/* RTC_CNTL_SCRATCH3 : R/W ;bitpos:[31:0] ;default: 0 ; */ +/*description: 32-bit general purpose retention register*/ +#define RTC_CNTL_SCRATCH3 0xFFFFFFFF +#define RTC_CNTL_SCRATCH3_M ((RTC_CNTL_SCRATCH3_V)<<(RTC_CNTL_SCRATCH3_S)) +#define RTC_CNTL_SCRATCH3_V 0xFFFFFFFF +#define RTC_CNTL_SCRATCH3_S 0 + +#define RTC_CNTL_EXT_XTL_CONF_REG (DR_REG_RTCCNTL_BASE + 0x5c) +/* RTC_CNTL_XTL_EXT_CTR_EN : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: enable control XTAL by external pads*/ +#define RTC_CNTL_XTL_EXT_CTR_EN (BIT(31)) +#define RTC_CNTL_XTL_EXT_CTR_EN_M (BIT(31)) +#define RTC_CNTL_XTL_EXT_CTR_EN_V 0x1 +#define RTC_CNTL_XTL_EXT_CTR_EN_S 31 +/* RTC_CNTL_XTL_EXT_CTR_LV : R/W ;bitpos:[30] ;default: 1'b0 ; */ +/*description: 0: power down XTAL at high level 1: power down XTAL at low level*/ +#define RTC_CNTL_XTL_EXT_CTR_LV (BIT(30)) +#define RTC_CNTL_XTL_EXT_CTR_LV_M (BIT(30)) +#define RTC_CNTL_XTL_EXT_CTR_LV_V 0x1 +#define RTC_CNTL_XTL_EXT_CTR_LV_S 30 + +#define RTC_CNTL_EXT_WAKEUP_CONF_REG (DR_REG_RTCCNTL_BASE + 0x60) +/* RTC_CNTL_EXT_WAKEUP1_LV : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: 0: external wakeup at low level 1: external wakeup at high level*/ +#define RTC_CNTL_EXT_WAKEUP1_LV (BIT(31)) +#define RTC_CNTL_EXT_WAKEUP1_LV_M (BIT(31)) +#define RTC_CNTL_EXT_WAKEUP1_LV_V 0x1 +#define RTC_CNTL_EXT_WAKEUP1_LV_S 31 +/* RTC_CNTL_EXT_WAKEUP0_LV : R/W ;bitpos:[30] ;default: 1'b0 ; */ +/*description: 0: external wakeup at low level 1: external wakeup at high level*/ +#define RTC_CNTL_EXT_WAKEUP0_LV (BIT(30)) +#define RTC_CNTL_EXT_WAKEUP0_LV_M (BIT(30)) +#define RTC_CNTL_EXT_WAKEUP0_LV_V 0x1 +#define RTC_CNTL_EXT_WAKEUP0_LV_S 30 + +#define RTC_CNTL_SLP_REJECT_CONF_REG (DR_REG_RTCCNTL_BASE + 0x64) +/* RTC_CNTL_REJECT_CAUSE : RO ;bitpos:[31:28] ;default: 4'b0 ; */ +/*description: sleep reject cause*/ +#define RTC_CNTL_REJECT_CAUSE 0x0000000F +#define RTC_CNTL_REJECT_CAUSE_M ((RTC_CNTL_REJECT_CAUSE_V)<<(RTC_CNTL_REJECT_CAUSE_S)) +#define RTC_CNTL_REJECT_CAUSE_V 0xF +#define RTC_CNTL_REJECT_CAUSE_S 28 +/* RTC_CNTL_DEEP_SLP_REJECT_EN : R/W ;bitpos:[27] ;default: 1'b0 ; */ +/*description: enable reject for deep sleep*/ +#define RTC_CNTL_DEEP_SLP_REJECT_EN (BIT(27)) +#define RTC_CNTL_DEEP_SLP_REJECT_EN_M (BIT(27)) +#define RTC_CNTL_DEEP_SLP_REJECT_EN_V 0x1 +#define RTC_CNTL_DEEP_SLP_REJECT_EN_S 27 +/* RTC_CNTL_LIGHT_SLP_REJECT_EN : R/W ;bitpos:[26] ;default: 1'b0 ; */ +/*description: enable reject for light sleep*/ +#define RTC_CNTL_LIGHT_SLP_REJECT_EN (BIT(26)) +#define RTC_CNTL_LIGHT_SLP_REJECT_EN_M (BIT(26)) +#define RTC_CNTL_LIGHT_SLP_REJECT_EN_V 0x1 +#define RTC_CNTL_LIGHT_SLP_REJECT_EN_S 26 +/* RTC_CNTL_SDIO_REJECT_EN : R/W ;bitpos:[25] ;default: 1'b0 ; */ +/*description: enable SDIO reject*/ +#define RTC_CNTL_SDIO_REJECT_EN (BIT(25)) +#define RTC_CNTL_SDIO_REJECT_EN_M (BIT(25)) +#define RTC_CNTL_SDIO_REJECT_EN_V 0x1 +#define RTC_CNTL_SDIO_REJECT_EN_S 25 +/* RTC_CNTL_GPIO_REJECT_EN : R/W ;bitpos:[24] ;default: 1'b0 ; */ +/*description: enable GPIO reject*/ +#define RTC_CNTL_GPIO_REJECT_EN (BIT(24)) +#define RTC_CNTL_GPIO_REJECT_EN_M (BIT(24)) +#define RTC_CNTL_GPIO_REJECT_EN_V 0x1 +#define RTC_CNTL_GPIO_REJECT_EN_S 24 + +#define RTC_CNTL_CPU_PERIOD_CONF_REG (DR_REG_RTCCNTL_BASE + 0x68) +/* RTC_CNTL_CPUPERIOD_SEL : R/W ;bitpos:[31:30] ;default: 2'b00 ; */ +/*description: CPU period sel*/ +#define RTC_CNTL_CPUPERIOD_SEL 0x00000003 +#define RTC_CNTL_CPUPERIOD_SEL_M ((RTC_CNTL_CPUPERIOD_SEL_V)<<(RTC_CNTL_CPUPERIOD_SEL_S)) +#define RTC_CNTL_CPUPERIOD_SEL_V 0x3 +#define RTC_CNTL_CPUPERIOD_SEL_S 30 +/* RTC_CNTL_CPUSEL_CONF : R/W ;bitpos:[29] ;default: 1'b0 ; */ +/*description: CPU sel option*/ +#define RTC_CNTL_CPUSEL_CONF (BIT(29)) +#define RTC_CNTL_CPUSEL_CONF_M (BIT(29)) +#define RTC_CNTL_CPUSEL_CONF_V 0x1 +#define RTC_CNTL_CPUSEL_CONF_S 29 + +#define RTC_CNTL_SDIO_ACT_CONF_REG (DR_REG_RTCCNTL_BASE + 0x6c) +/* RTC_CNTL_SDIO_ACT_DNUM : R/W ;bitpos:[31:22] ;default: 10'b0 ; */ +/*description: */ +#define RTC_CNTL_SDIO_ACT_DNUM 0x000003FF +#define RTC_CNTL_SDIO_ACT_DNUM_M ((RTC_CNTL_SDIO_ACT_DNUM_V)<<(RTC_CNTL_SDIO_ACT_DNUM_S)) +#define RTC_CNTL_SDIO_ACT_DNUM_V 0x3FF +#define RTC_CNTL_SDIO_ACT_DNUM_S 22 + +#define RTC_CNTL_CLK_CONF_REG (DR_REG_RTCCNTL_BASE + 0x70) +/* RTC_CNTL_ANA_CLK_RTC_SEL : R/W ;bitpos:[31:30] ;default: 2'd0 ; */ +/*description: slow_clk_rtc sel. 0: SLOW_CK 1: CK_XTAL_32K 2: CK8M_D256_OUT*/ +#define RTC_CNTL_ANA_CLK_RTC_SEL 0x00000003 +#define RTC_CNTL_ANA_CLK_RTC_SEL_M ((RTC_CNTL_ANA_CLK_RTC_SEL_V)<<(RTC_CNTL_ANA_CLK_RTC_SEL_S)) +#define RTC_CNTL_ANA_CLK_RTC_SEL_V 0x3 +#define RTC_CNTL_ANA_CLK_RTC_SEL_S 30 +/* RTC_CNTL_FAST_CLK_RTC_SEL : R/W ;bitpos:[29] ;default: 1'b0 ; */ +/*description: fast_clk_rtc sel. 0: XTAL div 4 1: CK8M*/ +#define RTC_CNTL_FAST_CLK_RTC_SEL (BIT(29)) +#define RTC_CNTL_FAST_CLK_RTC_SEL_M (BIT(29)) +#define RTC_CNTL_FAST_CLK_RTC_SEL_V 0x1 +#define RTC_CNTL_FAST_CLK_RTC_SEL_S 29 +/* RTC_CNTL_SOC_CLK_SEL : R/W ;bitpos:[28:27] ;default: 2'd0 ; */ +/*description: SOC clock sel. 0: XTAL 1: PLL 2: CK8M 3: APLL*/ +#define RTC_CNTL_SOC_CLK_SEL 0x00000003 +#define RTC_CNTL_SOC_CLK_SEL_M ((RTC_CNTL_SOC_CLK_SEL_V)<<(RTC_CNTL_SOC_CLK_SEL_S)) +#define RTC_CNTL_SOC_CLK_SEL_V 0x3 +#define RTC_CNTL_SOC_CLK_SEL_S 27 +#define RTC_CNTL_SOC_CLK_SEL_XTL 0 +#define RTC_CNTL_SOC_CLK_SEL_PLL 1 +#define RTC_CNTL_SOC_CLK_SEL_8M 2 +#define RTC_CNTL_SOC_CLK_SEL_APLL 3 +/* RTC_CNTL_CK8M_FORCE_PU : R/W ;bitpos:[26] ;default: 1'd0 ; */ +/*description: CK8M force power up*/ +#define RTC_CNTL_CK8M_FORCE_PU (BIT(26)) +#define RTC_CNTL_CK8M_FORCE_PU_M (BIT(26)) +#define RTC_CNTL_CK8M_FORCE_PU_V 0x1 +#define RTC_CNTL_CK8M_FORCE_PU_S 26 +/* RTC_CNTL_CK8M_FORCE_PD : R/W ;bitpos:[25] ;default: 1'd0 ; */ +/*description: CK8M force power down*/ +#define RTC_CNTL_CK8M_FORCE_PD (BIT(25)) +#define RTC_CNTL_CK8M_FORCE_PD_M (BIT(25)) +#define RTC_CNTL_CK8M_FORCE_PD_V 0x1 +#define RTC_CNTL_CK8M_FORCE_PD_S 25 +/* RTC_CNTL_CK8M_DFREQ : R/W ;bitpos:[24:17] ;default: 8'd0 ; */ +/*description: CK8M_DFREQ*/ +#define RTC_CNTL_CK8M_DFREQ 0x000000FF +#define RTC_CNTL_CK8M_DFREQ_M ((RTC_CNTL_CK8M_DFREQ_V)<<(RTC_CNTL_CK8M_DFREQ_S)) +#define RTC_CNTL_CK8M_DFREQ_V 0xFF +#define RTC_CNTL_CK8M_DFREQ_S 17 +#define RTC_CNTL_CK8M_DFREQ_DEFAULT 172 +/* RTC_CNTL_CK8M_FORCE_NOGATING : R/W ;bitpos:[16] ;default: 1'd0 ; */ +/*description: CK8M force no gating during sleep*/ +#define RTC_CNTL_CK8M_FORCE_NOGATING (BIT(16)) +#define RTC_CNTL_CK8M_FORCE_NOGATING_M (BIT(16)) +#define RTC_CNTL_CK8M_FORCE_NOGATING_V 0x1 +#define RTC_CNTL_CK8M_FORCE_NOGATING_S 16 +/* RTC_CNTL_XTAL_FORCE_NOGATING : R/W ;bitpos:[15] ;default: 1'd0 ; */ +/*description: XTAL force no gating during sleep*/ +#define RTC_CNTL_XTAL_FORCE_NOGATING (BIT(15)) +#define RTC_CNTL_XTAL_FORCE_NOGATING_M (BIT(15)) +#define RTC_CNTL_XTAL_FORCE_NOGATING_V 0x1 +#define RTC_CNTL_XTAL_FORCE_NOGATING_S 15 +/* RTC_CNTL_CK8M_DIV_SEL : R/W ;bitpos:[14:12] ;default: 3'd2 ; */ +/*description: divider = reg_ck8m_div_sel + 1*/ +#define RTC_CNTL_CK8M_DIV_SEL 0x00000007 +#define RTC_CNTL_CK8M_DIV_SEL_M ((RTC_CNTL_CK8M_DIV_SEL_V)<<(RTC_CNTL_CK8M_DIV_SEL_S)) +#define RTC_CNTL_CK8M_DIV_SEL_V 0x7 +#define RTC_CNTL_CK8M_DIV_SEL_S 12 +/* RTC_CNTL_CK8M_DFREQ_FORCE : R/W ;bitpos:[11] ;default: 1'd0 ; */ +/*description: */ +#define RTC_CNTL_CK8M_DFREQ_FORCE (BIT(11)) +#define RTC_CNTL_CK8M_DFREQ_FORCE_M (BIT(11)) +#define RTC_CNTL_CK8M_DFREQ_FORCE_V 0x1 +#define RTC_CNTL_CK8M_DFREQ_FORCE_S 11 +/* RTC_CNTL_DIG_CLK8M_EN : R/W ;bitpos:[10] ;default: 1'd0 ; */ +/*description: enable CK8M for digital core (no relationship with RTC core)*/ +#define RTC_CNTL_DIG_CLK8M_EN (BIT(10)) +#define RTC_CNTL_DIG_CLK8M_EN_M (BIT(10)) +#define RTC_CNTL_DIG_CLK8M_EN_V 0x1 +#define RTC_CNTL_DIG_CLK8M_EN_S 10 +/* RTC_CNTL_DIG_CLK8M_D256_EN : R/W ;bitpos:[9] ;default: 1'd1 ; */ +/*description: enable CK8M_D256_OUT for digital core (no relationship with RTC core)*/ +#define RTC_CNTL_DIG_CLK8M_D256_EN (BIT(9)) +#define RTC_CNTL_DIG_CLK8M_D256_EN_M (BIT(9)) +#define RTC_CNTL_DIG_CLK8M_D256_EN_V 0x1 +#define RTC_CNTL_DIG_CLK8M_D256_EN_S 9 +/* RTC_CNTL_DIG_XTAL32K_EN : R/W ;bitpos:[8] ;default: 1'd0 ; */ +/*description: enable CK_XTAL_32K for digital core (no relationship with RTC core)*/ +#define RTC_CNTL_DIG_XTAL32K_EN (BIT(8)) +#define RTC_CNTL_DIG_XTAL32K_EN_M (BIT(8)) +#define RTC_CNTL_DIG_XTAL32K_EN_V 0x1 +#define RTC_CNTL_DIG_XTAL32K_EN_S 8 +/* RTC_CNTL_ENB_CK8M_DIV : R/W ;bitpos:[7] ;default: 1'd0 ; */ +/*description: 1: CK8M_D256_OUT is actually CK8M 0: CK8M_D256_OUT is CK8M divided by 256*/ +#define RTC_CNTL_ENB_CK8M_DIV (BIT(7)) +#define RTC_CNTL_ENB_CK8M_DIV_M (BIT(7)) +#define RTC_CNTL_ENB_CK8M_DIV_V 0x1 +#define RTC_CNTL_ENB_CK8M_DIV_S 7 +/* RTC_CNTL_ENB_CK8M : R/W ;bitpos:[6] ;default: 1'd0 ; */ +/*description: disable CK8M and CK8M_D256_OUT*/ +#define RTC_CNTL_ENB_CK8M (BIT(6)) +#define RTC_CNTL_ENB_CK8M_M (BIT(6)) +#define RTC_CNTL_ENB_CK8M_V 0x1 +#define RTC_CNTL_ENB_CK8M_S 6 +/* RTC_CNTL_CK8M_DIV : R/W ;bitpos:[5:4] ;default: 2'b01 ; */ +/*description: CK8M_D256_OUT divider. 00: div128 01: div256 10: div512 11: div1024.*/ +#define RTC_CNTL_CK8M_DIV 0x00000003 +#define RTC_CNTL_CK8M_DIV_M ((RTC_CNTL_CK8M_DIV_V)<<(RTC_CNTL_CK8M_DIV_S)) +#define RTC_CNTL_CK8M_DIV_V 0x3 +#define RTC_CNTL_CK8M_DIV_S 4 + +#define RTC_CNTL_SDIO_CONF_REG (DR_REG_RTCCNTL_BASE + 0x74) +/* RTC_CNTL_XPD_SDIO_REG : R/W ;bitpos:[31] ;default: 1'd0 ; */ +/*description: SW option for XPD_SDIO_REG. Only active when reg_sdio_force = 1*/ +#define RTC_CNTL_XPD_SDIO_REG (BIT(31)) +#define RTC_CNTL_XPD_SDIO_REG_M (BIT(31)) +#define RTC_CNTL_XPD_SDIO_REG_V 0x1 +#define RTC_CNTL_XPD_SDIO_REG_S 31 +/* RTC_CNTL_DREFH_SDIO : R/W ;bitpos:[30:29] ;default: 2'b00 ; */ +/*description: SW option for DREFH_SDIO. Only active when reg_sdio_force = 1*/ +#define RTC_CNTL_DREFH_SDIO 0x00000003 +#define RTC_CNTL_DREFH_SDIO_M ((RTC_CNTL_DREFH_SDIO_V)<<(RTC_CNTL_DREFH_SDIO_S)) +#define RTC_CNTL_DREFH_SDIO_V 0x3 +#define RTC_CNTL_DREFH_SDIO_S 29 +/* RTC_CNTL_DREFM_SDIO : R/W ;bitpos:[28:27] ;default: 2'b00 ; */ +/*description: SW option for DREFM_SDIO. Only active when reg_sdio_force = 1*/ +#define RTC_CNTL_DREFM_SDIO 0x00000003 +#define RTC_CNTL_DREFM_SDIO_M ((RTC_CNTL_DREFM_SDIO_V)<<(RTC_CNTL_DREFM_SDIO_S)) +#define RTC_CNTL_DREFM_SDIO_V 0x3 +#define RTC_CNTL_DREFM_SDIO_S 27 +/* RTC_CNTL_DREFL_SDIO : R/W ;bitpos:[26:25] ;default: 2'b01 ; */ +/*description: SW option for DREFL_SDIO. Only active when reg_sdio_force = 1*/ +#define RTC_CNTL_DREFL_SDIO 0x00000003 +#define RTC_CNTL_DREFL_SDIO_M ((RTC_CNTL_DREFL_SDIO_V)<<(RTC_CNTL_DREFL_SDIO_S)) +#define RTC_CNTL_DREFL_SDIO_V 0x3 +#define RTC_CNTL_DREFL_SDIO_S 25 +/* RTC_CNTL_REG1P8_READY : RO ;bitpos:[24] ;default: 1'd0 ; */ +/*description: read only register for REG1P8_READY*/ +#define RTC_CNTL_REG1P8_READY (BIT(24)) +#define RTC_CNTL_REG1P8_READY_M (BIT(24)) +#define RTC_CNTL_REG1P8_READY_V 0x1 +#define RTC_CNTL_REG1P8_READY_S 24 +/* RTC_CNTL_SDIO_TIEH : R/W ;bitpos:[23] ;default: 1'd1 ; */ +/*description: SW option for SDIO_TIEH. Only active when reg_sdio_force = 1*/ +#define RTC_CNTL_SDIO_TIEH (BIT(23)) +#define RTC_CNTL_SDIO_TIEH_M (BIT(23)) +#define RTC_CNTL_SDIO_TIEH_V 0x1 +#define RTC_CNTL_SDIO_TIEH_S 23 +/* RTC_CNTL_SDIO_FORCE : R/W ;bitpos:[22] ;default: 1'd0 ; */ +/*description: 1: use SW option to control SDIO_REG 0: use state machine*/ +#define RTC_CNTL_SDIO_FORCE (BIT(22)) +#define RTC_CNTL_SDIO_FORCE_M (BIT(22)) +#define RTC_CNTL_SDIO_FORCE_V 0x1 +#define RTC_CNTL_SDIO_FORCE_S 22 +/* RTC_CNTL_SDIO_PD_EN : R/W ;bitpos:[21] ;default: 1'd1 ; */ +/*description: power down SDIO_REG in sleep. Only active when reg_sdio_force = 0*/ +#define RTC_CNTL_SDIO_PD_EN (BIT(21)) +#define RTC_CNTL_SDIO_PD_EN_M (BIT(21)) +#define RTC_CNTL_SDIO_PD_EN_V 0x1 +#define RTC_CNTL_SDIO_PD_EN_S 21 + +#define RTC_CNTL_BIAS_CONF_REG (DR_REG_RTCCNTL_BASE + 0x78) +/* RTC_CNTL_RST_BIAS_I2C : R/W ;bitpos:[31] ;default: 1'd0 ; */ +/*description: RST_BIAS_I2C*/ +#define RTC_CNTL_RST_BIAS_I2C (BIT(31)) +#define RTC_CNTL_RST_BIAS_I2C_M (BIT(31)) +#define RTC_CNTL_RST_BIAS_I2C_V 0x1 +#define RTC_CNTL_RST_BIAS_I2C_S 31 +/* RTC_CNTL_DEC_HEARTBEAT_WIDTH : R/W ;bitpos:[30] ;default: 1'd0 ; */ +/*description: DEC_HEARTBEAT_WIDTH*/ +#define RTC_CNTL_DEC_HEARTBEAT_WIDTH (BIT(30)) +#define RTC_CNTL_DEC_HEARTBEAT_WIDTH_M (BIT(30)) +#define RTC_CNTL_DEC_HEARTBEAT_WIDTH_V 0x1 +#define RTC_CNTL_DEC_HEARTBEAT_WIDTH_S 30 +/* RTC_CNTL_INC_HEARTBEAT_PERIOD : R/W ;bitpos:[29] ;default: 1'd0 ; */ +/*description: INC_HEARTBEAT_PERIOD*/ +#define RTC_CNTL_INC_HEARTBEAT_PERIOD (BIT(29)) +#define RTC_CNTL_INC_HEARTBEAT_PERIOD_M (BIT(29)) +#define RTC_CNTL_INC_HEARTBEAT_PERIOD_V 0x1 +#define RTC_CNTL_INC_HEARTBEAT_PERIOD_S 29 +/* RTC_CNTL_DEC_HEARTBEAT_PERIOD : R/W ;bitpos:[28] ;default: 1'd0 ; */ +/*description: DEC_HEARTBEAT_PERIOD*/ +#define RTC_CNTL_DEC_HEARTBEAT_PERIOD (BIT(28)) +#define RTC_CNTL_DEC_HEARTBEAT_PERIOD_M (BIT(28)) +#define RTC_CNTL_DEC_HEARTBEAT_PERIOD_V 0x1 +#define RTC_CNTL_DEC_HEARTBEAT_PERIOD_S 28 +/* RTC_CNTL_INC_HEARTBEAT_REFRESH : R/W ;bitpos:[27] ;default: 1'd0 ; */ +/*description: INC_HEARTBEAT_REFRESH*/ +#define RTC_CNTL_INC_HEARTBEAT_REFRESH (BIT(27)) +#define RTC_CNTL_INC_HEARTBEAT_REFRESH_M (BIT(27)) +#define RTC_CNTL_INC_HEARTBEAT_REFRESH_V 0x1 +#define RTC_CNTL_INC_HEARTBEAT_REFRESH_S 27 +/* RTC_CNTL_ENB_SCK_XTAL : R/W ;bitpos:[26] ;default: 1'd0 ; */ +/*description: ENB_SCK_XTAL*/ +#define RTC_CNTL_ENB_SCK_XTAL (BIT(26)) +#define RTC_CNTL_ENB_SCK_XTAL_M (BIT(26)) +#define RTC_CNTL_ENB_SCK_XTAL_V 0x1 +#define RTC_CNTL_ENB_SCK_XTAL_S 26 +/* RTC_CNTL_DBG_ATTEN : R/W ;bitpos:[25:24] ;default: 2'b00 ; */ +/*description: DBG_ATTEN*/ +#define RTC_CNTL_DBG_ATTEN 0x00000003 +#define RTC_CNTL_DBG_ATTEN_M ((RTC_CNTL_DBG_ATTEN_V)<<(RTC_CNTL_DBG_ATTEN_S)) +#define RTC_CNTL_DBG_ATTEN_V 0x3 +#define RTC_CNTL_DBG_ATTEN_S 24 +#define RTC_CNTL_DBG_ATTEN_DEFAULT 3 +#define RTC_CNTL_REG (DR_REG_RTCCNTL_BASE + 0x7c) +/* RTC_CNTL_FORCE_PU : R/W ;bitpos:[31] ;default: 1'd1 ; */ +/*description: RTC_REG force power up*/ +#define RTC_CNTL_FORCE_PU (BIT(31)) +#define RTC_CNTL_FORCE_PU_M (BIT(31)) +#define RTC_CNTL_FORCE_PU_V 0x1 +#define RTC_CNTL_FORCE_PU_S 31 +/* RTC_CNTL_FORCE_PD : R/W ;bitpos:[30] ;default: 1'd0 ; */ +/*description: RTC_REG force power down (for RTC_REG power down means decrease + the voltage to 0.8v or lower )*/ +#define RTC_CNTL_FORCE_PD (BIT(30)) +#define RTC_CNTL_FORCE_PD_M (BIT(30)) +#define RTC_CNTL_FORCE_PD_V 0x1 +#define RTC_CNTL_FORCE_PD_S 30 +/* RTC_CNTL_DBOOST_FORCE_PU : R/W ;bitpos:[29] ;default: 1'd1 ; */ +/*description: RTC_DBOOST force power up*/ +#define RTC_CNTL_DBOOST_FORCE_PU (BIT(29)) +#define RTC_CNTL_DBOOST_FORCE_PU_M (BIT(29)) +#define RTC_CNTL_DBOOST_FORCE_PU_V 0x1 +#define RTC_CNTL_DBOOST_FORCE_PU_S 29 +/* RTC_CNTL_DBOOST_FORCE_PD : R/W ;bitpos:[28] ;default: 1'd0 ; */ +/*description: RTC_DBOOST force power down*/ +#define RTC_CNTL_DBOOST_FORCE_PD (BIT(28)) +#define RTC_CNTL_DBOOST_FORCE_PD_M (BIT(28)) +#define RTC_CNTL_DBOOST_FORCE_PD_V 0x1 +#define RTC_CNTL_DBOOST_FORCE_PD_S 28 +/* RTC_CNTL_DBIAS_WAK : R/W ;bitpos:[27:25] ;default: 3'd4 ; */ +/*description: RTC_DBIAS during wakeup*/ +#define RTC_CNTL_DBIAS_WAK 0x00000007 +#define RTC_CNTL_DBIAS_WAK_M ((RTC_CNTL_DBIAS_WAK_V)<<(RTC_CNTL_DBIAS_WAK_S)) +#define RTC_CNTL_DBIAS_WAK_V 0x7 +#define RTC_CNTL_DBIAS_WAK_S 25 +/* RTC_CNTL_DBIAS_SLP : R/W ;bitpos:[24:22] ;default: 3'd4 ; */ +/*description: RTC_DBIAS during sleep*/ +#define RTC_CNTL_DBIAS_SLP 0x00000007 +#define RTC_CNTL_DBIAS_SLP_M ((RTC_CNTL_DBIAS_SLP_V)<<(RTC_CNTL_DBIAS_SLP_S)) +#define RTC_CNTL_DBIAS_SLP_V 0x7 +#define RTC_CNTL_DBIAS_SLP_S 22 +/* RTC_CNTL_SCK_DCAP : R/W ;bitpos:[21:14] ;default: 8'd0 ; */ +/*description: SCK_DCAP*/ +#define RTC_CNTL_SCK_DCAP 0x000000FF +#define RTC_CNTL_SCK_DCAP_M ((RTC_CNTL_SCK_DCAP_V)<<(RTC_CNTL_SCK_DCAP_S)) +#define RTC_CNTL_SCK_DCAP_V 0xFF +#define RTC_CNTL_SCK_DCAP_S 14 +#define RTC_CNTL_SCK_DCAP_DEFAULT 255 +/* RTC_CNTL_DIG_DBIAS_WAK : R/W ;bitpos:[13:11] ;default: 3'd4 ; */ +/*description: DIG_REG_DBIAS during wakeup*/ +#define RTC_CNTL_DIG_DBIAS_WAK 0x00000007 +#define RTC_CNTL_DIG_DBIAS_WAK_M ((RTC_CNTL_DIG_DBIAS_WAK_V)<<(RTC_CNTL_DIG_DBIAS_WAK_S)) +#define RTC_CNTL_DIG_DBIAS_WAK_V 0x7 +#define RTC_CNTL_DIG_DBIAS_WAK_S 11 +/* RTC_CNTL_DIG_DBIAS_SLP : R/W ;bitpos:[10:8] ;default: 3'd4 ; */ +/*description: DIG_REG_DBIAS during sleep*/ +#define RTC_CNTL_DIG_DBIAS_SLP 0x00000007 +#define RTC_CNTL_DIG_DBIAS_SLP_M ((RTC_CNTL_DIG_DBIAS_SLP_V)<<(RTC_CNTL_DIG_DBIAS_SLP_S)) +#define RTC_CNTL_DIG_DBIAS_SLP_V 0x7 +#define RTC_CNTL_DIG_DBIAS_SLP_S 8 +/* RTC_CNTL_SCK_DCAP_FORCE : R/W ;bitpos:[7] ;default: 1'd0 ; */ +/*description: N/A*/ +#define RTC_CNTL_SCK_DCAP_FORCE (BIT(7)) +#define RTC_CNTL_SCK_DCAP_FORCE_M (BIT(7)) +#define RTC_CNTL_SCK_DCAP_FORCE_V 0x1 +#define RTC_CNTL_SCK_DCAP_FORCE_S 7 + +/* Approximate mapping of voltages to RTC_CNTL_DBIAS_WAK, RTC_CNTL_DBIAS_SLP, + * RTC_CNTL_DIG_DBIAS_WAK, RTC_CNTL_DIG_DBIAS_SLP values. + * Valid if RTC_CNTL_DBG_ATTEN is 0. + */ +#define RTC_CNTL_DBIAS_0V90 0 +#define RTC_CNTL_DBIAS_0V95 1 +#define RTC_CNTL_DBIAS_1V00 2 +#define RTC_CNTL_DBIAS_1V05 3 +#define RTC_CNTL_DBIAS_1V10 4 +#define RTC_CNTL_DBIAS_1V15 5 +#define RTC_CNTL_DBIAS_1V20 6 +#define RTC_CNTL_DBIAS_1V25 7 + +#define RTC_CNTL_PWC_REG (DR_REG_RTCCNTL_BASE + 0x80) +/* RTC_CNTL_PD_EN : R/W ;bitpos:[20] ;default: 1'd0 ; */ +/*description: enable power down rtc_peri in sleep*/ +#define RTC_CNTL_PD_EN (BIT(20)) +#define RTC_CNTL_PD_EN_M (BIT(20)) +#define RTC_CNTL_PD_EN_V 0x1 +#define RTC_CNTL_PD_EN_S 20 +/* RTC_CNTL_FORCE_PU : R/W ;bitpos:[19] ;default: 1'd0 ; */ +/*description: rtc_peri force power up*/ +#define RTC_CNTL_PWC_FORCE_PU (BIT(19)) +#define RTC_CNTL_PWC_FORCE_PU_M (BIT(19)) +#define RTC_CNTL_PWC_FORCE_PU_V 0x1 +#define RTC_CNTL_PWC_FORCE_PU_S 19 +/* RTC_CNTL_FORCE_PD : R/W ;bitpos:[18] ;default: 1'b0 ; */ +/*description: rtc_peri force power down*/ +#define RTC_CNTL_PWC_FORCE_PD (BIT(18)) +#define RTC_CNTL_PWC_FORCE_PD_M (BIT(18)) +#define RTC_CNTL_PWC_FORCE_PD_V 0x1 +#define RTC_CNTL_PWC_FORCE_PD_S 18 +/* RTC_CNTL_SLOWMEM_PD_EN : R/W ;bitpos:[17] ;default: 1'b0 ; */ +/*description: enable power down RTC memory in sleep*/ +#define RTC_CNTL_SLOWMEM_PD_EN (BIT(17)) +#define RTC_CNTL_SLOWMEM_PD_EN_M (BIT(17)) +#define RTC_CNTL_SLOWMEM_PD_EN_V 0x1 +#define RTC_CNTL_SLOWMEM_PD_EN_S 17 +/* RTC_CNTL_SLOWMEM_FORCE_PU : R/W ;bitpos:[16] ;default: 1'b1 ; */ +/*description: RTC memory force power up*/ +#define RTC_CNTL_SLOWMEM_FORCE_PU (BIT(16)) +#define RTC_CNTL_SLOWMEM_FORCE_PU_M (BIT(16)) +#define RTC_CNTL_SLOWMEM_FORCE_PU_V 0x1 +#define RTC_CNTL_SLOWMEM_FORCE_PU_S 16 +/* RTC_CNTL_SLOWMEM_FORCE_PD : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: RTC memory force power down*/ +#define RTC_CNTL_SLOWMEM_FORCE_PD (BIT(15)) +#define RTC_CNTL_SLOWMEM_FORCE_PD_M (BIT(15)) +#define RTC_CNTL_SLOWMEM_FORCE_PD_V 0x1 +#define RTC_CNTL_SLOWMEM_FORCE_PD_S 15 +/* RTC_CNTL_FASTMEM_PD_EN : R/W ;bitpos:[14] ;default: 1'b0 ; */ +/*description: enable power down fast RTC memory in sleep*/ +#define RTC_CNTL_FASTMEM_PD_EN (BIT(14)) +#define RTC_CNTL_FASTMEM_PD_EN_M (BIT(14)) +#define RTC_CNTL_FASTMEM_PD_EN_V 0x1 +#define RTC_CNTL_FASTMEM_PD_EN_S 14 +/* RTC_CNTL_FASTMEM_FORCE_PU : R/W ;bitpos:[13] ;default: 1'b1 ; */ +/*description: Fast RTC memory force power up*/ +#define RTC_CNTL_FASTMEM_FORCE_PU (BIT(13)) +#define RTC_CNTL_FASTMEM_FORCE_PU_M (BIT(13)) +#define RTC_CNTL_FASTMEM_FORCE_PU_V 0x1 +#define RTC_CNTL_FASTMEM_FORCE_PU_S 13 +/* RTC_CNTL_FASTMEM_FORCE_PD : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: Fast RTC memory force power down*/ +#define RTC_CNTL_FASTMEM_FORCE_PD (BIT(12)) +#define RTC_CNTL_FASTMEM_FORCE_PD_M (BIT(12)) +#define RTC_CNTL_FASTMEM_FORCE_PD_V 0x1 +#define RTC_CNTL_FASTMEM_FORCE_PD_S 12 +/* RTC_CNTL_SLOWMEM_FORCE_LPU : R/W ;bitpos:[11] ;default: 1'b1 ; */ +/*description: RTC memory force no PD*/ +#define RTC_CNTL_SLOWMEM_FORCE_LPU (BIT(11)) +#define RTC_CNTL_SLOWMEM_FORCE_LPU_M (BIT(11)) +#define RTC_CNTL_SLOWMEM_FORCE_LPU_V 0x1 +#define RTC_CNTL_SLOWMEM_FORCE_LPU_S 11 +/* RTC_CNTL_SLOWMEM_FORCE_LPD : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: RTC memory force PD*/ +#define RTC_CNTL_SLOWMEM_FORCE_LPD (BIT(10)) +#define RTC_CNTL_SLOWMEM_FORCE_LPD_M (BIT(10)) +#define RTC_CNTL_SLOWMEM_FORCE_LPD_V 0x1 +#define RTC_CNTL_SLOWMEM_FORCE_LPD_S 10 +/* RTC_CNTL_SLOWMEM_FOLW_CPU : R/W ;bitpos:[9] ;default: 1'b0 ; */ +/*description: 1: RTC memory PD following CPU 0: RTC memory PD following RTC state machine*/ +#define RTC_CNTL_SLOWMEM_FOLW_CPU (BIT(9)) +#define RTC_CNTL_SLOWMEM_FOLW_CPU_M (BIT(9)) +#define RTC_CNTL_SLOWMEM_FOLW_CPU_V 0x1 +#define RTC_CNTL_SLOWMEM_FOLW_CPU_S 9 +/* RTC_CNTL_FASTMEM_FORCE_LPU : R/W ;bitpos:[8] ;default: 1'b1 ; */ +/*description: Fast RTC memory force no PD*/ +#define RTC_CNTL_FASTMEM_FORCE_LPU (BIT(8)) +#define RTC_CNTL_FASTMEM_FORCE_LPU_M (BIT(8)) +#define RTC_CNTL_FASTMEM_FORCE_LPU_V 0x1 +#define RTC_CNTL_FASTMEM_FORCE_LPU_S 8 +/* RTC_CNTL_FASTMEM_FORCE_LPD : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: Fast RTC memory force PD*/ +#define RTC_CNTL_FASTMEM_FORCE_LPD (BIT(7)) +#define RTC_CNTL_FASTMEM_FORCE_LPD_M (BIT(7)) +#define RTC_CNTL_FASTMEM_FORCE_LPD_V 0x1 +#define RTC_CNTL_FASTMEM_FORCE_LPD_S 7 +/* RTC_CNTL_FASTMEM_FOLW_CPU : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: 1: Fast RTC memory PD following CPU 0: fast RTC memory PD following + RTC state machine*/ +#define RTC_CNTL_FASTMEM_FOLW_CPU (BIT(6)) +#define RTC_CNTL_FASTMEM_FOLW_CPU_M (BIT(6)) +#define RTC_CNTL_FASTMEM_FOLW_CPU_V 0x1 +#define RTC_CNTL_FASTMEM_FOLW_CPU_S 6 +/* RTC_CNTL_FORCE_NOISO : R/W ;bitpos:[5] ;default: 1'd1 ; */ +/*description: rtc_peri force no ISO*/ +#define RTC_CNTL_FORCE_NOISO (BIT(5)) +#define RTC_CNTL_FORCE_NOISO_M (BIT(5)) +#define RTC_CNTL_FORCE_NOISO_V 0x1 +#define RTC_CNTL_FORCE_NOISO_S 5 +/* RTC_CNTL_FORCE_ISO : R/W ;bitpos:[4] ;default: 1'd0 ; */ +/*description: rtc_peri force ISO*/ +#define RTC_CNTL_FORCE_ISO (BIT(4)) +#define RTC_CNTL_FORCE_ISO_M (BIT(4)) +#define RTC_CNTL_FORCE_ISO_V 0x1 +#define RTC_CNTL_FORCE_ISO_S 4 +/* RTC_CNTL_SLOWMEM_FORCE_ISO : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: RTC memory force ISO*/ +#define RTC_CNTL_SLOWMEM_FORCE_ISO (BIT(3)) +#define RTC_CNTL_SLOWMEM_FORCE_ISO_M (BIT(3)) +#define RTC_CNTL_SLOWMEM_FORCE_ISO_V 0x1 +#define RTC_CNTL_SLOWMEM_FORCE_ISO_S 3 +/* RTC_CNTL_SLOWMEM_FORCE_NOISO : R/W ;bitpos:[2] ;default: 1'b1 ; */ +/*description: RTC memory force no ISO*/ +#define RTC_CNTL_SLOWMEM_FORCE_NOISO (BIT(2)) +#define RTC_CNTL_SLOWMEM_FORCE_NOISO_M (BIT(2)) +#define RTC_CNTL_SLOWMEM_FORCE_NOISO_V 0x1 +#define RTC_CNTL_SLOWMEM_FORCE_NOISO_S 2 +/* RTC_CNTL_FASTMEM_FORCE_ISO : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: Fast RTC memory force ISO*/ +#define RTC_CNTL_FASTMEM_FORCE_ISO (BIT(1)) +#define RTC_CNTL_FASTMEM_FORCE_ISO_M (BIT(1)) +#define RTC_CNTL_FASTMEM_FORCE_ISO_V 0x1 +#define RTC_CNTL_FASTMEM_FORCE_ISO_S 1 +/* RTC_CNTL_FASTMEM_FORCE_NOISO : R/W ;bitpos:[0] ;default: 1'b1 ; */ +/*description: Fast RTC memory force no ISO*/ +#define RTC_CNTL_FASTMEM_FORCE_NOISO (BIT(0)) +#define RTC_CNTL_FASTMEM_FORCE_NOISO_M (BIT(0)) +#define RTC_CNTL_FASTMEM_FORCE_NOISO_V 0x1 +#define RTC_CNTL_FASTMEM_FORCE_NOISO_S 0 + +/* Useful groups of RTC_CNTL_PWC_REG bits */ +#define RTC_CNTL_MEM_FORCE_ISO \ + (RTC_CNTL_SLOWMEM_FORCE_ISO | RTC_CNTL_FASTMEM_FORCE_ISO) +#define RTC_CNTL_MEM_FORCE_NOISO \ + (RTC_CNTL_SLOWMEM_FORCE_NOISO | RTC_CNTL_FASTMEM_FORCE_NOISO) +#define RTC_CNTL_MEM_PD_EN \ + (RTC_CNTL_SLOWMEM_PD_EN | RTC_CNTL_FASTMEM_PD_EN) +#define RTC_CNTL_MEM_FORCE_PU \ + (RTC_CNTL_SLOWMEM_FORCE_PU | RTC_CNTL_FASTMEM_FORCE_PU) +#define RTC_CNTL_MEM_FORCE_PD \ + (RTC_CNTL_SLOWMEM_FORCE_PD | RTC_CNTL_FASTMEM_FORCE_PD) +#define RTC_CNTL_MEM_FOLW_CPU \ + (RTC_CNTL_SLOWMEM_FOLW_CPU | RTC_CNTL_FASTMEM_FOLW_CPU) +#define RTC_CNTL_MEM_FORCE_LPU \ + (RTC_CNTL_SLOWMEM_FORCE_LPU | RTC_CNTL_FASTMEM_FORCE_LPU) +#define RTC_CNTL_MEM_FORCE_LPD \ + (RTC_CNTL_SLOWMEM_FORCE_LPD | RTC_CNTL_FASTMEM_FORCE_LPD) + +#define RTC_CNTL_DIG_PWC_REG (DR_REG_RTCCNTL_BASE + 0x84) +/* RTC_CNTL_DG_WRAP_PD_EN : R/W ;bitpos:[31] ;default: 0 ; */ +/*description: enable power down digital core in sleep*/ +#define RTC_CNTL_DG_WRAP_PD_EN (BIT(31)) +#define RTC_CNTL_DG_WRAP_PD_EN_M (BIT(31)) +#define RTC_CNTL_DG_WRAP_PD_EN_V 0x1 +#define RTC_CNTL_DG_WRAP_PD_EN_S 31 +/* RTC_CNTL_WIFI_PD_EN : R/W ;bitpos:[30] ;default: 0 ; */ +/*description: enable power down wifi in sleep*/ +#define RTC_CNTL_WIFI_PD_EN (BIT(30)) +#define RTC_CNTL_WIFI_PD_EN_M (BIT(30)) +#define RTC_CNTL_WIFI_PD_EN_V 0x1 +#define RTC_CNTL_WIFI_PD_EN_S 30 +/* RTC_CNTL_INTER_RAM4_PD_EN : R/W ;bitpos:[29] ;default: 0 ; */ +/*description: enable power down internal SRAM 4 in sleep*/ +#define RTC_CNTL_INTER_RAM4_PD_EN (BIT(29)) +#define RTC_CNTL_INTER_RAM4_PD_EN_M (BIT(29)) +#define RTC_CNTL_INTER_RAM4_PD_EN_V 0x1 +#define RTC_CNTL_INTER_RAM4_PD_EN_S 29 +/* RTC_CNTL_INTER_RAM3_PD_EN : R/W ;bitpos:[28] ;default: 0 ; */ +/*description: enable power down internal SRAM 3 in sleep*/ +#define RTC_CNTL_INTER_RAM3_PD_EN (BIT(28)) +#define RTC_CNTL_INTER_RAM3_PD_EN_M (BIT(28)) +#define RTC_CNTL_INTER_RAM3_PD_EN_V 0x1 +#define RTC_CNTL_INTER_RAM3_PD_EN_S 28 +/* RTC_CNTL_INTER_RAM2_PD_EN : R/W ;bitpos:[27] ;default: 0 ; */ +/*description: enable power down internal SRAM 2 in sleep*/ +#define RTC_CNTL_INTER_RAM2_PD_EN (BIT(27)) +#define RTC_CNTL_INTER_RAM2_PD_EN_M (BIT(27)) +#define RTC_CNTL_INTER_RAM2_PD_EN_V 0x1 +#define RTC_CNTL_INTER_RAM2_PD_EN_S 27 +/* RTC_CNTL_INTER_RAM1_PD_EN : R/W ;bitpos:[26] ;default: 0 ; */ +/*description: enable power down internal SRAM 1 in sleep*/ +#define RTC_CNTL_INTER_RAM1_PD_EN (BIT(26)) +#define RTC_CNTL_INTER_RAM1_PD_EN_M (BIT(26)) +#define RTC_CNTL_INTER_RAM1_PD_EN_V 0x1 +#define RTC_CNTL_INTER_RAM1_PD_EN_S 26 +/* RTC_CNTL_INTER_RAM0_PD_EN : R/W ;bitpos:[25] ;default: 0 ; */ +/*description: enable power down internal SRAM 0 in sleep*/ +#define RTC_CNTL_INTER_RAM0_PD_EN (BIT(25)) +#define RTC_CNTL_INTER_RAM0_PD_EN_M (BIT(25)) +#define RTC_CNTL_INTER_RAM0_PD_EN_V 0x1 +#define RTC_CNTL_INTER_RAM0_PD_EN_S 25 +/* RTC_CNTL_ROM0_PD_EN : R/W ;bitpos:[24] ;default: 0 ; */ +/*description: enable power down ROM in sleep*/ +#define RTC_CNTL_ROM0_PD_EN (BIT(24)) +#define RTC_CNTL_ROM0_PD_EN_M (BIT(24)) +#define RTC_CNTL_ROM0_PD_EN_V 0x1 +#define RTC_CNTL_ROM0_PD_EN_S 24 +/* RTC_CNTL_DG_WRAP_FORCE_PU : R/W ;bitpos:[20] ;default: 1'd1 ; */ +/*description: digital core force power up*/ +#define RTC_CNTL_DG_WRAP_FORCE_PU (BIT(20)) +#define RTC_CNTL_DG_WRAP_FORCE_PU_M (BIT(20)) +#define RTC_CNTL_DG_WRAP_FORCE_PU_V 0x1 +#define RTC_CNTL_DG_WRAP_FORCE_PU_S 20 +/* RTC_CNTL_DG_WRAP_FORCE_PD : R/W ;bitpos:[19] ;default: 1'b0 ; */ +/*description: digital core force power down*/ +#define RTC_CNTL_DG_WRAP_FORCE_PD (BIT(19)) +#define RTC_CNTL_DG_WRAP_FORCE_PD_M (BIT(19)) +#define RTC_CNTL_DG_WRAP_FORCE_PD_V 0x1 +#define RTC_CNTL_DG_WRAP_FORCE_PD_S 19 +/* RTC_CNTL_WIFI_FORCE_PU : R/W ;bitpos:[18] ;default: 1'd1 ; */ +/*description: wifi force power up*/ +#define RTC_CNTL_WIFI_FORCE_PU (BIT(18)) +#define RTC_CNTL_WIFI_FORCE_PU_M (BIT(18)) +#define RTC_CNTL_WIFI_FORCE_PU_V 0x1 +#define RTC_CNTL_WIFI_FORCE_PU_S 18 +/* RTC_CNTL_WIFI_FORCE_PD : R/W ;bitpos:[17] ;default: 1'b0 ; */ +/*description: wifi force power down*/ +#define RTC_CNTL_WIFI_FORCE_PD (BIT(17)) +#define RTC_CNTL_WIFI_FORCE_PD_M (BIT(17)) +#define RTC_CNTL_WIFI_FORCE_PD_V 0x1 +#define RTC_CNTL_WIFI_FORCE_PD_S 17 +/* RTC_CNTL_INTER_RAM4_FORCE_PU : R/W ;bitpos:[16] ;default: 1'd1 ; */ +/*description: internal SRAM 4 force power up*/ +#define RTC_CNTL_INTER_RAM4_FORCE_PU (BIT(16)) +#define RTC_CNTL_INTER_RAM4_FORCE_PU_M (BIT(16)) +#define RTC_CNTL_INTER_RAM4_FORCE_PU_V 0x1 +#define RTC_CNTL_INTER_RAM4_FORCE_PU_S 16 +/* RTC_CNTL_INTER_RAM4_FORCE_PD : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: internal SRAM 4 force power down*/ +#define RTC_CNTL_INTER_RAM4_FORCE_PD (BIT(15)) +#define RTC_CNTL_INTER_RAM4_FORCE_PD_M (BIT(15)) +#define RTC_CNTL_INTER_RAM4_FORCE_PD_V 0x1 +#define RTC_CNTL_INTER_RAM4_FORCE_PD_S 15 +/* RTC_CNTL_INTER_RAM3_FORCE_PU : R/W ;bitpos:[14] ;default: 1'd1 ; */ +/*description: internal SRAM 3 force power up*/ +#define RTC_CNTL_INTER_RAM3_FORCE_PU (BIT(14)) +#define RTC_CNTL_INTER_RAM3_FORCE_PU_M (BIT(14)) +#define RTC_CNTL_INTER_RAM3_FORCE_PU_V 0x1 +#define RTC_CNTL_INTER_RAM3_FORCE_PU_S 14 +/* RTC_CNTL_INTER_RAM3_FORCE_PD : R/W ;bitpos:[13] ;default: 1'b0 ; */ +/*description: internal SRAM 3 force power down*/ +#define RTC_CNTL_INTER_RAM3_FORCE_PD (BIT(13)) +#define RTC_CNTL_INTER_RAM3_FORCE_PD_M (BIT(13)) +#define RTC_CNTL_INTER_RAM3_FORCE_PD_V 0x1 +#define RTC_CNTL_INTER_RAM3_FORCE_PD_S 13 +/* RTC_CNTL_INTER_RAM2_FORCE_PU : R/W ;bitpos:[12] ;default: 1'd1 ; */ +/*description: internal SRAM 2 force power up*/ +#define RTC_CNTL_INTER_RAM2_FORCE_PU (BIT(12)) +#define RTC_CNTL_INTER_RAM2_FORCE_PU_M (BIT(12)) +#define RTC_CNTL_INTER_RAM2_FORCE_PU_V 0x1 +#define RTC_CNTL_INTER_RAM2_FORCE_PU_S 12 +/* RTC_CNTL_INTER_RAM2_FORCE_PD : R/W ;bitpos:[11] ;default: 1'b0 ; */ +/*description: internal SRAM 2 force power down*/ +#define RTC_CNTL_INTER_RAM2_FORCE_PD (BIT(11)) +#define RTC_CNTL_INTER_RAM2_FORCE_PD_M (BIT(11)) +#define RTC_CNTL_INTER_RAM2_FORCE_PD_V 0x1 +#define RTC_CNTL_INTER_RAM2_FORCE_PD_S 11 +/* RTC_CNTL_INTER_RAM1_FORCE_PU : R/W ;bitpos:[10] ;default: 1'd1 ; */ +/*description: internal SRAM 1 force power up*/ +#define RTC_CNTL_INTER_RAM1_FORCE_PU (BIT(10)) +#define RTC_CNTL_INTER_RAM1_FORCE_PU_M (BIT(10)) +#define RTC_CNTL_INTER_RAM1_FORCE_PU_V 0x1 +#define RTC_CNTL_INTER_RAM1_FORCE_PU_S 10 +/* RTC_CNTL_INTER_RAM1_FORCE_PD : R/W ;bitpos:[9] ;default: 1'b0 ; */ +/*description: internal SRAM 1 force power down*/ +#define RTC_CNTL_INTER_RAM1_FORCE_PD (BIT(9)) +#define RTC_CNTL_INTER_RAM1_FORCE_PD_M (BIT(9)) +#define RTC_CNTL_INTER_RAM1_FORCE_PD_V 0x1 +#define RTC_CNTL_INTER_RAM1_FORCE_PD_S 9 +/* RTC_CNTL_INTER_RAM0_FORCE_PU : R/W ;bitpos:[8] ;default: 1'd1 ; */ +/*description: internal SRAM 0 force power up*/ +#define RTC_CNTL_INTER_RAM0_FORCE_PU (BIT(8)) +#define RTC_CNTL_INTER_RAM0_FORCE_PU_M (BIT(8)) +#define RTC_CNTL_INTER_RAM0_FORCE_PU_V 0x1 +#define RTC_CNTL_INTER_RAM0_FORCE_PU_S 8 +/* RTC_CNTL_INTER_RAM0_FORCE_PD : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: internal SRAM 0 force power down*/ +#define RTC_CNTL_INTER_RAM0_FORCE_PD (BIT(7)) +#define RTC_CNTL_INTER_RAM0_FORCE_PD_M (BIT(7)) +#define RTC_CNTL_INTER_RAM0_FORCE_PD_V 0x1 +#define RTC_CNTL_INTER_RAM0_FORCE_PD_S 7 +/* RTC_CNTL_ROM0_FORCE_PU : R/W ;bitpos:[6] ;default: 1'd1 ; */ +/*description: ROM force power up*/ +#define RTC_CNTL_ROM0_FORCE_PU (BIT(6)) +#define RTC_CNTL_ROM0_FORCE_PU_M (BIT(6)) +#define RTC_CNTL_ROM0_FORCE_PU_V 0x1 +#define RTC_CNTL_ROM0_FORCE_PU_S 6 +/* RTC_CNTL_ROM0_FORCE_PD : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: ROM force power down*/ +#define RTC_CNTL_ROM0_FORCE_PD (BIT(5)) +#define RTC_CNTL_ROM0_FORCE_PD_M (BIT(5)) +#define RTC_CNTL_ROM0_FORCE_PD_V 0x1 +#define RTC_CNTL_ROM0_FORCE_PD_S 5 +/* RTC_CNTL_LSLP_MEM_FORCE_PU : R/W ;bitpos:[4] ;default: 1'b1 ; */ +/*description: memories in digital core force no PD in sleep*/ +#define RTC_CNTL_LSLP_MEM_FORCE_PU (BIT(4)) +#define RTC_CNTL_LSLP_MEM_FORCE_PU_M (BIT(4)) +#define RTC_CNTL_LSLP_MEM_FORCE_PU_V 0x1 +#define RTC_CNTL_LSLP_MEM_FORCE_PU_S 4 +/* RTC_CNTL_LSLP_MEM_FORCE_PD : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: memories in digital core force PD in sleep*/ +#define RTC_CNTL_LSLP_MEM_FORCE_PD (BIT(3)) +#define RTC_CNTL_LSLP_MEM_FORCE_PD_M (BIT(3)) +#define RTC_CNTL_LSLP_MEM_FORCE_PD_V 0x1 +#define RTC_CNTL_LSLP_MEM_FORCE_PD_S 3 + +/* Useful groups of RTC_CNTL_DIG_PWC_REG bits */ +#define RTC_CNTL_CPU_ROM_RAM_PD_EN \ + (RTC_CNTL_INTER_RAM4_PD_EN | RTC_CNTL_INTER_RAM3_PD_EN |\ + RTC_CNTL_INTER_RAM2_PD_EN | RTC_CNTL_INTER_RAM1_PD_EN |\ + RTC_CNTL_INTER_RAM0_PD_EN | RTC_CNTL_ROM0_PD_EN) +#define RTC_CNTL_CPU_ROM_RAM_FORCE_PU \ + (RTC_CNTL_INTER_RAM4_FORCE_PU | RTC_CNTL_INTER_RAM3_FORCE_PU |\ + RTC_CNTL_INTER_RAM2_FORCE_PU | RTC_CNTL_INTER_RAM1_FORCE_PU |\ + RTC_CNTL_INTER_RAM0_FORCE_PU | RTC_CNTL_ROM0_FORCE_PU) +#define RTC_CNTL_CPU_ROM_RAM_FORCE_PD \ + (RTC_CNTL_INTER_RAM4_FORCE_PD | RTC_CNTL_INTER_RAM3_FORCE_PD |\ + RTC_CNTL_INTER_RAM2_FORCE_PD | RTC_CNTL_INTER_RAM1_FORCE_PD |\ + RTC_CNTL_INTER_RAM0_FORCE_PD | RTC_CNTL_ROM0_FORCE_PD + +#define RTC_CNTL_DIG_ISO_REG (DR_REG_RTCCNTL_BASE + 0x88) +/* RTC_CNTL_DG_WRAP_FORCE_NOISO : R/W ;bitpos:[31] ;default: 1'd1 ; */ +/*description: digital core force no ISO*/ +#define RTC_CNTL_DG_WRAP_FORCE_NOISO (BIT(31)) +#define RTC_CNTL_DG_WRAP_FORCE_NOISO_M (BIT(31)) +#define RTC_CNTL_DG_WRAP_FORCE_NOISO_V 0x1 +#define RTC_CNTL_DG_WRAP_FORCE_NOISO_S 31 +/* RTC_CNTL_DG_WRAP_FORCE_ISO : R/W ;bitpos:[30] ;default: 1'd0 ; */ +/*description: digital core force ISO*/ +#define RTC_CNTL_DG_WRAP_FORCE_ISO (BIT(30)) +#define RTC_CNTL_DG_WRAP_FORCE_ISO_M (BIT(30)) +#define RTC_CNTL_DG_WRAP_FORCE_ISO_V 0x1 +#define RTC_CNTL_DG_WRAP_FORCE_ISO_S 30 +/* RTC_CNTL_WIFI_FORCE_NOISO : R/W ;bitpos:[29] ;default: 1'd1 ; */ +/*description: wifi force no ISO*/ +#define RTC_CNTL_WIFI_FORCE_NOISO (BIT(29)) +#define RTC_CNTL_WIFI_FORCE_NOISO_M (BIT(29)) +#define RTC_CNTL_WIFI_FORCE_NOISO_V 0x1 +#define RTC_CNTL_WIFI_FORCE_NOISO_S 29 +/* RTC_CNTL_WIFI_FORCE_ISO : R/W ;bitpos:[28] ;default: 1'd0 ; */ +/*description: wifi force ISO*/ +#define RTC_CNTL_WIFI_FORCE_ISO (BIT(28)) +#define RTC_CNTL_WIFI_FORCE_ISO_M (BIT(28)) +#define RTC_CNTL_WIFI_FORCE_ISO_V 0x1 +#define RTC_CNTL_WIFI_FORCE_ISO_S 28 +/* RTC_CNTL_INTER_RAM4_FORCE_NOISO : R/W ;bitpos:[27] ;default: 1'd1 ; */ +/*description: internal SRAM 4 force no ISO*/ +#define RTC_CNTL_INTER_RAM4_FORCE_NOISO (BIT(27)) +#define RTC_CNTL_INTER_RAM4_FORCE_NOISO_M (BIT(27)) +#define RTC_CNTL_INTER_RAM4_FORCE_NOISO_V 0x1 +#define RTC_CNTL_INTER_RAM4_FORCE_NOISO_S 27 +/* RTC_CNTL_INTER_RAM4_FORCE_ISO : R/W ;bitpos:[26] ;default: 1'd0 ; */ +/*description: internal SRAM 4 force ISO*/ +#define RTC_CNTL_INTER_RAM4_FORCE_ISO (BIT(26)) +#define RTC_CNTL_INTER_RAM4_FORCE_ISO_M (BIT(26)) +#define RTC_CNTL_INTER_RAM4_FORCE_ISO_V 0x1 +#define RTC_CNTL_INTER_RAM4_FORCE_ISO_S 26 +/* RTC_CNTL_INTER_RAM3_FORCE_NOISO : R/W ;bitpos:[25] ;default: 1'd1 ; */ +/*description: internal SRAM 3 force no ISO*/ +#define RTC_CNTL_INTER_RAM3_FORCE_NOISO (BIT(25)) +#define RTC_CNTL_INTER_RAM3_FORCE_NOISO_M (BIT(25)) +#define RTC_CNTL_INTER_RAM3_FORCE_NOISO_V 0x1 +#define RTC_CNTL_INTER_RAM3_FORCE_NOISO_S 25 +/* RTC_CNTL_INTER_RAM3_FORCE_ISO : R/W ;bitpos:[24] ;default: 1'd0 ; */ +/*description: internal SRAM 3 force ISO*/ +#define RTC_CNTL_INTER_RAM3_FORCE_ISO (BIT(24)) +#define RTC_CNTL_INTER_RAM3_FORCE_ISO_M (BIT(24)) +#define RTC_CNTL_INTER_RAM3_FORCE_ISO_V 0x1 +#define RTC_CNTL_INTER_RAM3_FORCE_ISO_S 24 +/* RTC_CNTL_INTER_RAM2_FORCE_NOISO : R/W ;bitpos:[23] ;default: 1'd1 ; */ +/*description: internal SRAM 2 force no ISO*/ +#define RTC_CNTL_INTER_RAM2_FORCE_NOISO (BIT(23)) +#define RTC_CNTL_INTER_RAM2_FORCE_NOISO_M (BIT(23)) +#define RTC_CNTL_INTER_RAM2_FORCE_NOISO_V 0x1 +#define RTC_CNTL_INTER_RAM2_FORCE_NOISO_S 23 +/* RTC_CNTL_INTER_RAM2_FORCE_ISO : R/W ;bitpos:[22] ;default: 1'd0 ; */ +/*description: internal SRAM 2 force ISO*/ +#define RTC_CNTL_INTER_RAM2_FORCE_ISO (BIT(22)) +#define RTC_CNTL_INTER_RAM2_FORCE_ISO_M (BIT(22)) +#define RTC_CNTL_INTER_RAM2_FORCE_ISO_V 0x1 +#define RTC_CNTL_INTER_RAM2_FORCE_ISO_S 22 +/* RTC_CNTL_INTER_RAM1_FORCE_NOISO : R/W ;bitpos:[21] ;default: 1'd1 ; */ +/*description: internal SRAM 1 force no ISO*/ +#define RTC_CNTL_INTER_RAM1_FORCE_NOISO (BIT(21)) +#define RTC_CNTL_INTER_RAM1_FORCE_NOISO_M (BIT(21)) +#define RTC_CNTL_INTER_RAM1_FORCE_NOISO_V 0x1 +#define RTC_CNTL_INTER_RAM1_FORCE_NOISO_S 21 +/* RTC_CNTL_INTER_RAM1_FORCE_ISO : R/W ;bitpos:[20] ;default: 1'd0 ; */ +/*description: internal SRAM 1 force ISO*/ +#define RTC_CNTL_INTER_RAM1_FORCE_ISO (BIT(20)) +#define RTC_CNTL_INTER_RAM1_FORCE_ISO_M (BIT(20)) +#define RTC_CNTL_INTER_RAM1_FORCE_ISO_V 0x1 +#define RTC_CNTL_INTER_RAM1_FORCE_ISO_S 20 +/* RTC_CNTL_INTER_RAM0_FORCE_NOISO : R/W ;bitpos:[19] ;default: 1'd1 ; */ +/*description: internal SRAM 0 force no ISO*/ +#define RTC_CNTL_INTER_RAM0_FORCE_NOISO (BIT(19)) +#define RTC_CNTL_INTER_RAM0_FORCE_NOISO_M (BIT(19)) +#define RTC_CNTL_INTER_RAM0_FORCE_NOISO_V 0x1 +#define RTC_CNTL_INTER_RAM0_FORCE_NOISO_S 19 +/* RTC_CNTL_INTER_RAM0_FORCE_ISO : R/W ;bitpos:[18] ;default: 1'd0 ; */ +/*description: internal SRAM 0 force ISO*/ +#define RTC_CNTL_INTER_RAM0_FORCE_ISO (BIT(18)) +#define RTC_CNTL_INTER_RAM0_FORCE_ISO_M (BIT(18)) +#define RTC_CNTL_INTER_RAM0_FORCE_ISO_V 0x1 +#define RTC_CNTL_INTER_RAM0_FORCE_ISO_S 18 +/* RTC_CNTL_ROM0_FORCE_NOISO : R/W ;bitpos:[17] ;default: 1'd1 ; */ +/*description: ROM force no ISO*/ +#define RTC_CNTL_ROM0_FORCE_NOISO (BIT(17)) +#define RTC_CNTL_ROM0_FORCE_NOISO_M (BIT(17)) +#define RTC_CNTL_ROM0_FORCE_NOISO_V 0x1 +#define RTC_CNTL_ROM0_FORCE_NOISO_S 17 +/* RTC_CNTL_ROM0_FORCE_ISO : R/W ;bitpos:[16] ;default: 1'd0 ; */ +/*description: ROM force ISO*/ +#define RTC_CNTL_ROM0_FORCE_ISO (BIT(16)) +#define RTC_CNTL_ROM0_FORCE_ISO_M (BIT(16)) +#define RTC_CNTL_ROM0_FORCE_ISO_V 0x1 +#define RTC_CNTL_ROM0_FORCE_ISO_S 16 +/* RTC_CNTL_DG_PAD_FORCE_HOLD : R/W ;bitpos:[15] ;default: 1'd0 ; */ +/*description: digital pad force hold*/ +#define RTC_CNTL_DG_PAD_FORCE_HOLD (BIT(15)) +#define RTC_CNTL_DG_PAD_FORCE_HOLD_M (BIT(15)) +#define RTC_CNTL_DG_PAD_FORCE_HOLD_V 0x1 +#define RTC_CNTL_DG_PAD_FORCE_HOLD_S 15 +/* RTC_CNTL_DG_PAD_FORCE_UNHOLD : R/W ;bitpos:[14] ;default: 1'd1 ; */ +/*description: digital pad force un-hold*/ +#define RTC_CNTL_DG_PAD_FORCE_UNHOLD (BIT(14)) +#define RTC_CNTL_DG_PAD_FORCE_UNHOLD_M (BIT(14)) +#define RTC_CNTL_DG_PAD_FORCE_UNHOLD_V 0x1 +#define RTC_CNTL_DG_PAD_FORCE_UNHOLD_S 14 +/* RTC_CNTL_DG_PAD_FORCE_ISO : R/W ;bitpos:[13] ;default: 1'd0 ; */ +/*description: digital pad force ISO*/ +#define RTC_CNTL_DG_PAD_FORCE_ISO (BIT(13)) +#define RTC_CNTL_DG_PAD_FORCE_ISO_M (BIT(13)) +#define RTC_CNTL_DG_PAD_FORCE_ISO_V 0x1 +#define RTC_CNTL_DG_PAD_FORCE_ISO_S 13 +/* RTC_CNTL_DG_PAD_FORCE_NOISO : R/W ;bitpos:[12] ;default: 1'd1 ; */ +/*description: digital pad force no ISO*/ +#define RTC_CNTL_DG_PAD_FORCE_NOISO (BIT(12)) +#define RTC_CNTL_DG_PAD_FORCE_NOISO_M (BIT(12)) +#define RTC_CNTL_DG_PAD_FORCE_NOISO_V 0x1 +#define RTC_CNTL_DG_PAD_FORCE_NOISO_S 12 +/* RTC_CNTL_DG_PAD_AUTOHOLD_EN : R/W ;bitpos:[11] ;default: 1'd0 ; */ +/*description: digital pad enable auto-hold*/ +#define RTC_CNTL_DG_PAD_AUTOHOLD_EN (BIT(11)) +#define RTC_CNTL_DG_PAD_AUTOHOLD_EN_M (BIT(11)) +#define RTC_CNTL_DG_PAD_AUTOHOLD_EN_V 0x1 +#define RTC_CNTL_DG_PAD_AUTOHOLD_EN_S 11 +/* RTC_CNTL_CLR_DG_PAD_AUTOHOLD : WO ;bitpos:[10] ;default: 1'd0 ; */ +/*description: wtite only register to clear digital pad auto-hold*/ +#define RTC_CNTL_CLR_DG_PAD_AUTOHOLD (BIT(10)) +#define RTC_CNTL_CLR_DG_PAD_AUTOHOLD_M (BIT(10)) +#define RTC_CNTL_CLR_DG_PAD_AUTOHOLD_V 0x1 +#define RTC_CNTL_CLR_DG_PAD_AUTOHOLD_S 10 +/* RTC_CNTL_DG_PAD_AUTOHOLD : RO ;bitpos:[9] ;default: 1'd0 ; */ +/*description: read only register to indicate digital pad auto-hold status*/ +#define RTC_CNTL_DG_PAD_AUTOHOLD (BIT(9)) +#define RTC_CNTL_DG_PAD_AUTOHOLD_M (BIT(9)) +#define RTC_CNTL_DG_PAD_AUTOHOLD_V 0x1 +#define RTC_CNTL_DG_PAD_AUTOHOLD_S 9 +/* RTC_CNTL_DIG_ISO_FORCE_ON : R/W ;bitpos:[8] ;default: 1'd0 ; */ +/*description: */ +#define RTC_CNTL_DIG_ISO_FORCE_ON (BIT(8)) +#define RTC_CNTL_DIG_ISO_FORCE_ON_M (BIT(8)) +#define RTC_CNTL_DIG_ISO_FORCE_ON_V 0x1 +#define RTC_CNTL_DIG_ISO_FORCE_ON_S 8 +/* RTC_CNTL_DIG_ISO_FORCE_OFF : R/W ;bitpos:[7] ;default: 1'd0 ; */ +/*description: */ +#define RTC_CNTL_DIG_ISO_FORCE_OFF (BIT(7)) +#define RTC_CNTL_DIG_ISO_FORCE_OFF_M (BIT(7)) +#define RTC_CNTL_DIG_ISO_FORCE_OFF_V 0x1 +#define RTC_CNTL_DIG_ISO_FORCE_OFF_S 7 + +/* Useful groups of RTC_CNTL_DIG_ISO_REG bits */ +#define RTC_CNTL_CPU_ROM_RAM_FORCE_ISO \ + (RTC_CNTL_INTER_RAM4_FORCE_ISO | RTC_CNTL_INTER_RAM3_FORCE_ISO |\ + RTC_CNTL_INTER_RAM2_FORCE_ISO | RTC_CNTL_INTER_RAM1_FORCE_ISO |\ + RTC_CNTL_INTER_RAM0_FORCE_ISO | RTC_CNTL_ROM0_FORCE_ISO) +#define RTC_CNTL_CPU_ROM_RAM_FORCE_NOISO \ + (RTC_CNTL_INTER_RAM4_FORCE_NOISO | RTC_CNTL_INTER_RAM3_FORCE_NOISO |\ + RTC_CNTL_INTER_RAM2_FORCE_NOISO | RTC_CNTL_INTER_RAM1_FORCE_NOISO |\ + RTC_CNTL_INTER_RAM0_FORCE_NOISO | RTC_CNTL_ROM0_FORCE_NOISO) + +#define RTC_CNTL_WDTCONFIG0_REG (DR_REG_RTCCNTL_BASE + 0x8c) +/* RTC_CNTL_WDT_EN : R/W ;bitpos:[31] ;default: 1'h0 ; */ +/*description: enable RTC WDT*/ +#define RTC_CNTL_WDT_EN (BIT(31)) +#define RTC_CNTL_WDT_EN_M (BIT(31)) +#define RTC_CNTL_WDT_EN_V 0x1 +#define RTC_CNTL_WDT_EN_S 31 +/* RTC_CNTL_WDT_STG0 : R/W ;bitpos:[30:28] ;default: 3'h0 ; */ +/*description: 1: interrupt stage en 2: CPU reset stage en 3: system reset + stage en 4: RTC reset stage en*/ +#define RTC_CNTL_WDT_STG0 0x00000007 +#define RTC_CNTL_WDT_STG0_M ((RTC_CNTL_WDT_STG0_V)<<(RTC_CNTL_WDT_STG0_S)) +#define RTC_CNTL_WDT_STG0_V 0x7 +#define RTC_CNTL_WDT_STG0_S 28 +/* RTC_CNTL_WDT_STG1 : R/W ;bitpos:[27:25] ;default: 3'h0 ; */ +/*description: 1: interrupt stage en 2: CPU reset stage en 3: system reset + stage en 4: RTC reset stage en*/ +#define RTC_CNTL_WDT_STG1 0x00000007 +#define RTC_CNTL_WDT_STG1_M ((RTC_CNTL_WDT_STG1_V)<<(RTC_CNTL_WDT_STG1_S)) +#define RTC_CNTL_WDT_STG1_V 0x7 +#define RTC_CNTL_WDT_STG1_S 25 +/* RTC_CNTL_WDT_STG2 : R/W ;bitpos:[24:22] ;default: 3'h0 ; */ +/*description: 1: interrupt stage en 2: CPU reset stage en 3: system reset + stage en 4: RTC reset stage en*/ +#define RTC_CNTL_WDT_STG2 0x00000007 +#define RTC_CNTL_WDT_STG2_M ((RTC_CNTL_WDT_STG2_V)<<(RTC_CNTL_WDT_STG2_S)) +#define RTC_CNTL_WDT_STG2_V 0x7 +#define RTC_CNTL_WDT_STG2_S 22 +/* RTC_CNTL_WDT_STG3 : R/W ;bitpos:[21:19] ;default: 3'h0 ; */ +/*description: 1: interrupt stage en 2: CPU reset stage en 3: system reset + stage en 4: RTC reset stage en*/ +#define RTC_CNTL_WDT_STG3 0x00000007 +#define RTC_CNTL_WDT_STG3_M ((RTC_CNTL_WDT_STG3_V)<<(RTC_CNTL_WDT_STG3_S)) +#define RTC_CNTL_WDT_STG3_V 0x7 +#define RTC_CNTL_WDT_STG3_S 19 +/* RTC_CNTL_WDT_EDGE_INT_EN : R/W ;bitpos:[18] ;default: 1'h0 ; */ +/*description: N/A*/ +#define RTC_CNTL_WDT_EDGE_INT_EN (BIT(18)) +#define RTC_CNTL_WDT_EDGE_INT_EN_M (BIT(18)) +#define RTC_CNTL_WDT_EDGE_INT_EN_V 0x1 +#define RTC_CNTL_WDT_EDGE_INT_EN_S 18 +/* RTC_CNTL_WDT_LEVEL_INT_EN : R/W ;bitpos:[17] ;default: 1'h0 ; */ +/*description: N/A*/ +#define RTC_CNTL_WDT_LEVEL_INT_EN (BIT(17)) +#define RTC_CNTL_WDT_LEVEL_INT_EN_M (BIT(17)) +#define RTC_CNTL_WDT_LEVEL_INT_EN_V 0x1 +#define RTC_CNTL_WDT_LEVEL_INT_EN_S 17 +/* RTC_CNTL_WDT_CPU_RESET_LENGTH : R/W ;bitpos:[16:14] ;default: 3'h1 ; */ +/*description: CPU reset counter length*/ +#define RTC_CNTL_WDT_CPU_RESET_LENGTH 0x00000007 +#define RTC_CNTL_WDT_CPU_RESET_LENGTH_M ((RTC_CNTL_WDT_CPU_RESET_LENGTH_V)<<(RTC_CNTL_WDT_CPU_RESET_LENGTH_S)) +#define RTC_CNTL_WDT_CPU_RESET_LENGTH_V 0x7 +#define RTC_CNTL_WDT_CPU_RESET_LENGTH_S 14 +/* RTC_CNTL_WDT_SYS_RESET_LENGTH : R/W ;bitpos:[13:11] ;default: 3'h1 ; */ +/*description: system reset counter length*/ +#define RTC_CNTL_WDT_SYS_RESET_LENGTH 0x00000007 +#define RTC_CNTL_WDT_SYS_RESET_LENGTH_M ((RTC_CNTL_WDT_SYS_RESET_LENGTH_V)<<(RTC_CNTL_WDT_SYS_RESET_LENGTH_S)) +#define RTC_CNTL_WDT_SYS_RESET_LENGTH_V 0x7 +#define RTC_CNTL_WDT_SYS_RESET_LENGTH_S 11 +/* RTC_CNTL_WDT_FLASHBOOT_MOD_EN : R/W ;bitpos:[10] ;default: 1'h1 ; */ +/*description: enable WDT in flash boot*/ +#define RTC_CNTL_WDT_FLASHBOOT_MOD_EN (BIT(10)) +#define RTC_CNTL_WDT_FLASHBOOT_MOD_EN_M (BIT(10)) +#define RTC_CNTL_WDT_FLASHBOOT_MOD_EN_V 0x1 +#define RTC_CNTL_WDT_FLASHBOOT_MOD_EN_S 10 +/* RTC_CNTL_WDT_PROCPU_RESET_EN : R/W ;bitpos:[9] ;default: 1'd0 ; */ +/*description: enable WDT reset PRO CPU*/ +#define RTC_CNTL_WDT_PROCPU_RESET_EN (BIT(9)) +#define RTC_CNTL_WDT_PROCPU_RESET_EN_M (BIT(9)) +#define RTC_CNTL_WDT_PROCPU_RESET_EN_V 0x1 +#define RTC_CNTL_WDT_PROCPU_RESET_EN_S 9 +/* RTC_CNTL_WDT_APPCPU_RESET_EN : R/W ;bitpos:[8] ;default: 1'd0 ; */ +/*description: enable WDT reset APP CPU*/ +#define RTC_CNTL_WDT_APPCPU_RESET_EN (BIT(8)) +#define RTC_CNTL_WDT_APPCPU_RESET_EN_M (BIT(8)) +#define RTC_CNTL_WDT_APPCPU_RESET_EN_V 0x1 +#define RTC_CNTL_WDT_APPCPU_RESET_EN_S 8 +/* RTC_CNTL_WDT_PAUSE_IN_SLP : R/W ;bitpos:[7] ;default: 1'd1 ; */ +/*description: pause WDT in sleep*/ +#define RTC_CNTL_WDT_PAUSE_IN_SLP (BIT(7)) +#define RTC_CNTL_WDT_PAUSE_IN_SLP_M (BIT(7)) +#define RTC_CNTL_WDT_PAUSE_IN_SLP_V 0x1 +#define RTC_CNTL_WDT_PAUSE_IN_SLP_S 7 +/* RTC_CNTL_WDT_STGX : */ +/*description: stage action selection values */ +#define RTC_WDT_STG_SEL_OFF 0 +#define RTC_WDT_STG_SEL_INT 1 +#define RTC_WDT_STG_SEL_RESET_CPU 2 +#define RTC_WDT_STG_SEL_RESET_SYSTEM 3 +#define RTC_WDT_STG_SEL_RESET_RTC 4 + +#define RTC_CNTL_WDTCONFIG1_REG (DR_REG_RTCCNTL_BASE + 0x90) +/* RTC_CNTL_WDT_STG0_HOLD : R/W ;bitpos:[31:0] ;default: 32'd128000 ; */ +/*description: */ +#define RTC_CNTL_WDT_STG0_HOLD 0xFFFFFFFF +#define RTC_CNTL_WDT_STG0_HOLD_M ((RTC_CNTL_WDT_STG0_HOLD_V)<<(RTC_CNTL_WDT_STG0_HOLD_S)) +#define RTC_CNTL_WDT_STG0_HOLD_V 0xFFFFFFFF +#define RTC_CNTL_WDT_STG0_HOLD_S 0 + +#define RTC_CNTL_WDTCONFIG2_REG (DR_REG_RTCCNTL_BASE + 0x94) +/* RTC_CNTL_WDT_STG1_HOLD : R/W ;bitpos:[31:0] ;default: 32'd80000 ; */ +/*description: */ +#define RTC_CNTL_WDT_STG1_HOLD 0xFFFFFFFF +#define RTC_CNTL_WDT_STG1_HOLD_M ((RTC_CNTL_WDT_STG1_HOLD_V)<<(RTC_CNTL_WDT_STG1_HOLD_S)) +#define RTC_CNTL_WDT_STG1_HOLD_V 0xFFFFFFFF +#define RTC_CNTL_WDT_STG1_HOLD_S 0 + +#define RTC_CNTL_WDTCONFIG3_REG (DR_REG_RTCCNTL_BASE + 0x98) +/* RTC_CNTL_WDT_STG2_HOLD : R/W ;bitpos:[31:0] ;default: 32'hfff ; */ +/*description: */ +#define RTC_CNTL_WDT_STG2_HOLD 0xFFFFFFFF +#define RTC_CNTL_WDT_STG2_HOLD_M ((RTC_CNTL_WDT_STG2_HOLD_V)<<(RTC_CNTL_WDT_STG2_HOLD_S)) +#define RTC_CNTL_WDT_STG2_HOLD_V 0xFFFFFFFF +#define RTC_CNTL_WDT_STG2_HOLD_S 0 + +#define RTC_CNTL_WDTCONFIG4_REG (DR_REG_RTCCNTL_BASE + 0x9c) +/* RTC_CNTL_WDT_STG3_HOLD : R/W ;bitpos:[31:0] ;default: 32'hfff ; */ +/*description: */ +#define RTC_CNTL_WDT_STG3_HOLD 0xFFFFFFFF +#define RTC_CNTL_WDT_STG3_HOLD_M ((RTC_CNTL_WDT_STG3_HOLD_V)<<(RTC_CNTL_WDT_STG3_HOLD_S)) +#define RTC_CNTL_WDT_STG3_HOLD_V 0xFFFFFFFF +#define RTC_CNTL_WDT_STG3_HOLD_S 0 + +#define RTC_CNTL_WDTFEED_REG (DR_REG_RTCCNTL_BASE + 0xa0) +/* RTC_CNTL_WDT_FEED : WO ;bitpos:[31] ;default: 1'd0 ; */ +/*description: */ +#define RTC_CNTL_WDT_FEED (BIT(31)) +#define RTC_CNTL_WDT_FEED_M (BIT(31)) +#define RTC_CNTL_WDT_FEED_V 0x1 +#define RTC_CNTL_WDT_FEED_S 31 + +#define RTC_CNTL_WDTWPROTECT_REG (DR_REG_RTCCNTL_BASE + 0xa4) +/* RTC_CNTL_WDT_WKEY : R/W ;bitpos:[31:0] ;default: 32'h50d83aa1 ; */ +/*description: */ +#define RTC_CNTL_WDT_WKEY 0xFFFFFFFF +#define RTC_CNTL_WDT_WKEY_M ((RTC_CNTL_WDT_WKEY_V)<<(RTC_CNTL_WDT_WKEY_S)) +#define RTC_CNTL_WDT_WKEY_V 0xFFFFFFFF +#define RTC_CNTL_WDT_WKEY_S 0 + +#define RTC_CNTL_TEST_MUX_REG (DR_REG_RTCCNTL_BASE + 0xa8) +/* RTC_CNTL_DTEST_RTC : R/W ;bitpos:[31:30] ;default: 2'd0 ; */ +/*description: DTEST_RTC*/ +#define RTC_CNTL_DTEST_RTC 0x00000003 +#define RTC_CNTL_DTEST_RTC_M ((RTC_CNTL_DTEST_RTC_V)<<(RTC_CNTL_DTEST_RTC_S)) +#define RTC_CNTL_DTEST_RTC_V 0x3 +#define RTC_CNTL_DTEST_RTC_S 30 +/* RTC_CNTL_ENT_RTC : R/W ;bitpos:[29] ;default: 1'd0 ; */ +/*description: ENT_RTC*/ +#define RTC_CNTL_ENT_RTC (BIT(29)) +#define RTC_CNTL_ENT_RTC_M (BIT(29)) +#define RTC_CNTL_ENT_RTC_V 0x1 +#define RTC_CNTL_ENT_RTC_S 29 + +#define RTC_CNTL_SW_CPU_STALL_REG (DR_REG_RTCCNTL_BASE + 0xac) +/* RTC_CNTL_SW_STALL_PROCPU_C1 : R/W ;bitpos:[31:26] ;default: 6'b0 ; */ +/*description: {reg_sw_stall_procpu_c1[5:0] reg_sw_stall_procpu_c0[1:0]} == + 0x86 will stall PRO CPU*/ +#define RTC_CNTL_SW_STALL_PROCPU_C1 0x0000003F +#define RTC_CNTL_SW_STALL_PROCPU_C1_M ((RTC_CNTL_SW_STALL_PROCPU_C1_V)<<(RTC_CNTL_SW_STALL_PROCPU_C1_S)) +#define RTC_CNTL_SW_STALL_PROCPU_C1_V 0x3F +#define RTC_CNTL_SW_STALL_PROCPU_C1_S 26 +/* RTC_CNTL_SW_STALL_APPCPU_C1 : R/W ;bitpos:[25:20] ;default: 6'b0 ; */ +/*description: {reg_sw_stall_appcpu_c1[5:0] reg_sw_stall_appcpu_c0[1:0]} == + 0x86 will stall APP CPU*/ +#define RTC_CNTL_SW_STALL_APPCPU_C1 0x0000003F +#define RTC_CNTL_SW_STALL_APPCPU_C1_M ((RTC_CNTL_SW_STALL_APPCPU_C1_V)<<(RTC_CNTL_SW_STALL_APPCPU_C1_S)) +#define RTC_CNTL_SW_STALL_APPCPU_C1_V 0x3F +#define RTC_CNTL_SW_STALL_APPCPU_C1_S 20 + +#define RTC_CNTL_STORE4_REG (DR_REG_RTCCNTL_BASE + 0xb0) +/* RTC_CNTL_SCRATCH4 : R/W ;bitpos:[31:0] ;default: 0 ; */ +/*description: 32-bit general purpose retention register*/ +#define RTC_CNTL_SCRATCH4 0xFFFFFFFF +#define RTC_CNTL_SCRATCH4_M ((RTC_CNTL_SCRATCH4_V)<<(RTC_CNTL_SCRATCH4_S)) +#define RTC_CNTL_SCRATCH4_V 0xFFFFFFFF +#define RTC_CNTL_SCRATCH4_S 0 + +#define RTC_CNTL_STORE5_REG (DR_REG_RTCCNTL_BASE + 0xb4) +/* RTC_CNTL_SCRATCH5 : R/W ;bitpos:[31:0] ;default: 0 ; */ +/*description: 32-bit general purpose retention register*/ +#define RTC_CNTL_SCRATCH5 0xFFFFFFFF +#define RTC_CNTL_SCRATCH5_M ((RTC_CNTL_SCRATCH5_V)<<(RTC_CNTL_SCRATCH5_S)) +#define RTC_CNTL_SCRATCH5_V 0xFFFFFFFF +#define RTC_CNTL_SCRATCH5_S 0 + +#define RTC_CNTL_STORE6_REG (DR_REG_RTCCNTL_BASE + 0xb8) +/* RTC_CNTL_SCRATCH6 : R/W ;bitpos:[31:0] ;default: 0 ; */ +/*description: 32-bit general purpose retention register*/ +#define RTC_CNTL_SCRATCH6 0xFFFFFFFF +#define RTC_CNTL_SCRATCH6_M ((RTC_CNTL_SCRATCH6_V)<<(RTC_CNTL_SCRATCH6_S)) +#define RTC_CNTL_SCRATCH6_V 0xFFFFFFFF +#define RTC_CNTL_SCRATCH6_S 0 + +#define RTC_CNTL_STORE7_REG (DR_REG_RTCCNTL_BASE + 0xbc) +/* RTC_CNTL_SCRATCH7 : R/W ;bitpos:[31:0] ;default: 0 ; */ +/*description: 32-bit general purpose retention register*/ +#define RTC_CNTL_SCRATCH7 0xFFFFFFFF +#define RTC_CNTL_SCRATCH7_M ((RTC_CNTL_SCRATCH7_V)<<(RTC_CNTL_SCRATCH7_S)) +#define RTC_CNTL_SCRATCH7_V 0xFFFFFFFF +#define RTC_CNTL_SCRATCH7_S 0 + +#define RTC_CNTL_LOW_POWER_ST_REG (DR_REG_RTCCNTL_BASE + 0xc0) +/* RTC_CNTL_RDY_FOR_WAKEUP : R/0; bitpos:[19]; default: 0 */ +/*description: 1 if RTC controller is ready to execute WAKE instruction, 0 otherwise */ +#define RTC_CNTL_RDY_FOR_WAKEUP (BIT(19)) +#define RTC_CNTL_RDY_FOR_WAKEUP_M (BIT(19)) +#define RTC_CNTL_RDY_FOR_WAKEUP_V 0x1 +#define RTC_CNTL_RDY_FOR_WAKEUP_S 19 + +/* Compatibility definition */ +#define RTC_CNTL_DIAG0_REG RTC_CNTL_LOW_POWER_ST_REG +/* RTC_CNTL_LOW_POWER_DIAG0 : RO ;bitpos:[31:0] ;default: 0 ; */ +/*description: */ +#define RTC_CNTL_LOW_POWER_DIAG0 0xFFFFFFFF +#define RTC_CNTL_LOW_POWER_DIAG0_M ((RTC_CNTL_LOW_POWER_DIAG0_V)<<(RTC_CNTL_LOW_POWER_DIAG0_S)) +#define RTC_CNTL_LOW_POWER_DIAG0_V 0xFFFFFFFF +#define RTC_CNTL_LOW_POWER_DIAG0_S 0 + +#define RTC_CNTL_DIAG1_REG (DR_REG_RTCCNTL_BASE + 0xc4) +/* RTC_CNTL_LOW_POWER_DIAG1 : RO ;bitpos:[31:0] ;default: 0 ; */ +/*description: */ +#define RTC_CNTL_LOW_POWER_DIAG1 0xFFFFFFFF +#define RTC_CNTL_LOW_POWER_DIAG1_M ((RTC_CNTL_LOW_POWER_DIAG1_V)<<(RTC_CNTL_LOW_POWER_DIAG1_S)) +#define RTC_CNTL_LOW_POWER_DIAG1_V 0xFFFFFFFF +#define RTC_CNTL_LOW_POWER_DIAG1_S 0 + +#define RTC_CNTL_HOLD_FORCE_REG (DR_REG_RTCCNTL_BASE + 0xc8) +/* RTC_CNTL_X32N_HOLD_FORCE : R/W ;bitpos:[17] ;default: 1'b0 ; */ +/*description: */ +#define RTC_CNTL_X32N_HOLD_FORCE (BIT(17)) +#define RTC_CNTL_X32N_HOLD_FORCE_M (BIT(17)) +#define RTC_CNTL_X32N_HOLD_FORCE_V 0x1 +#define RTC_CNTL_X32N_HOLD_FORCE_S 17 +/* RTC_CNTL_X32P_HOLD_FORCE : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define RTC_CNTL_X32P_HOLD_FORCE (BIT(16)) +#define RTC_CNTL_X32P_HOLD_FORCE_M (BIT(16)) +#define RTC_CNTL_X32P_HOLD_FORCE_V 0x1 +#define RTC_CNTL_X32P_HOLD_FORCE_S 16 +/* RTC_CNTL_TOUCH_PAD7_HOLD_FORCE : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define RTC_CNTL_TOUCH_PAD7_HOLD_FORCE (BIT(15)) +#define RTC_CNTL_TOUCH_PAD7_HOLD_FORCE_M (BIT(15)) +#define RTC_CNTL_TOUCH_PAD7_HOLD_FORCE_V 0x1 +#define RTC_CNTL_TOUCH_PAD7_HOLD_FORCE_S 15 +/* RTC_CNTL_TOUCH_PAD6_HOLD_FORCE : R/W ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define RTC_CNTL_TOUCH_PAD6_HOLD_FORCE (BIT(14)) +#define RTC_CNTL_TOUCH_PAD6_HOLD_FORCE_M (BIT(14)) +#define RTC_CNTL_TOUCH_PAD6_HOLD_FORCE_V 0x1 +#define RTC_CNTL_TOUCH_PAD6_HOLD_FORCE_S 14 +/* RTC_CNTL_TOUCH_PAD5_HOLD_FORCE : R/W ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define RTC_CNTL_TOUCH_PAD5_HOLD_FORCE (BIT(13)) +#define RTC_CNTL_TOUCH_PAD5_HOLD_FORCE_M (BIT(13)) +#define RTC_CNTL_TOUCH_PAD5_HOLD_FORCE_V 0x1 +#define RTC_CNTL_TOUCH_PAD5_HOLD_FORCE_S 13 +/* RTC_CNTL_TOUCH_PAD4_HOLD_FORCE : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define RTC_CNTL_TOUCH_PAD4_HOLD_FORCE (BIT(12)) +#define RTC_CNTL_TOUCH_PAD4_HOLD_FORCE_M (BIT(12)) +#define RTC_CNTL_TOUCH_PAD4_HOLD_FORCE_V 0x1 +#define RTC_CNTL_TOUCH_PAD4_HOLD_FORCE_S 12 +/* RTC_CNTL_TOUCH_PAD3_HOLD_FORCE : R/W ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define RTC_CNTL_TOUCH_PAD3_HOLD_FORCE (BIT(11)) +#define RTC_CNTL_TOUCH_PAD3_HOLD_FORCE_M (BIT(11)) +#define RTC_CNTL_TOUCH_PAD3_HOLD_FORCE_V 0x1 +#define RTC_CNTL_TOUCH_PAD3_HOLD_FORCE_S 11 +/* RTC_CNTL_TOUCH_PAD2_HOLD_FORCE : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define RTC_CNTL_TOUCH_PAD2_HOLD_FORCE (BIT(10)) +#define RTC_CNTL_TOUCH_PAD2_HOLD_FORCE_M (BIT(10)) +#define RTC_CNTL_TOUCH_PAD2_HOLD_FORCE_V 0x1 +#define RTC_CNTL_TOUCH_PAD2_HOLD_FORCE_S 10 +/* RTC_CNTL_TOUCH_PAD1_HOLD_FORCE : R/W ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define RTC_CNTL_TOUCH_PAD1_HOLD_FORCE (BIT(9)) +#define RTC_CNTL_TOUCH_PAD1_HOLD_FORCE_M (BIT(9)) +#define RTC_CNTL_TOUCH_PAD1_HOLD_FORCE_V 0x1 +#define RTC_CNTL_TOUCH_PAD1_HOLD_FORCE_S 9 +/* RTC_CNTL_TOUCH_PAD0_HOLD_FORCE : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define RTC_CNTL_TOUCH_PAD0_HOLD_FORCE (BIT(8)) +#define RTC_CNTL_TOUCH_PAD0_HOLD_FORCE_M (BIT(8)) +#define RTC_CNTL_TOUCH_PAD0_HOLD_FORCE_V 0x1 +#define RTC_CNTL_TOUCH_PAD0_HOLD_FORCE_S 8 +/* RTC_CNTL_SENSE4_HOLD_FORCE : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define RTC_CNTL_SENSE4_HOLD_FORCE (BIT(7)) +#define RTC_CNTL_SENSE4_HOLD_FORCE_M (BIT(7)) +#define RTC_CNTL_SENSE4_HOLD_FORCE_V 0x1 +#define RTC_CNTL_SENSE4_HOLD_FORCE_S 7 +/* RTC_CNTL_SENSE3_HOLD_FORCE : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define RTC_CNTL_SENSE3_HOLD_FORCE (BIT(6)) +#define RTC_CNTL_SENSE3_HOLD_FORCE_M (BIT(6)) +#define RTC_CNTL_SENSE3_HOLD_FORCE_V 0x1 +#define RTC_CNTL_SENSE3_HOLD_FORCE_S 6 +/* RTC_CNTL_SENSE2_HOLD_FORCE : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define RTC_CNTL_SENSE2_HOLD_FORCE (BIT(5)) +#define RTC_CNTL_SENSE2_HOLD_FORCE_M (BIT(5)) +#define RTC_CNTL_SENSE2_HOLD_FORCE_V 0x1 +#define RTC_CNTL_SENSE2_HOLD_FORCE_S 5 +/* RTC_CNTL_SENSE1_HOLD_FORCE : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define RTC_CNTL_SENSE1_HOLD_FORCE (BIT(4)) +#define RTC_CNTL_SENSE1_HOLD_FORCE_M (BIT(4)) +#define RTC_CNTL_SENSE1_HOLD_FORCE_V 0x1 +#define RTC_CNTL_SENSE1_HOLD_FORCE_S 4 +/* RTC_CNTL_PDAC2_HOLD_FORCE : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define RTC_CNTL_PDAC2_HOLD_FORCE (BIT(3)) +#define RTC_CNTL_PDAC2_HOLD_FORCE_M (BIT(3)) +#define RTC_CNTL_PDAC2_HOLD_FORCE_V 0x1 +#define RTC_CNTL_PDAC2_HOLD_FORCE_S 3 +/* RTC_CNTL_PDAC1_HOLD_FORCE : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define RTC_CNTL_PDAC1_HOLD_FORCE (BIT(2)) +#define RTC_CNTL_PDAC1_HOLD_FORCE_M (BIT(2)) +#define RTC_CNTL_PDAC1_HOLD_FORCE_V 0x1 +#define RTC_CNTL_PDAC1_HOLD_FORCE_S 2 +/* RTC_CNTL_ADC2_HOLD_FORCE : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define RTC_CNTL_ADC2_HOLD_FORCE (BIT(1)) +#define RTC_CNTL_ADC2_HOLD_FORCE_M (BIT(1)) +#define RTC_CNTL_ADC2_HOLD_FORCE_V 0x1 +#define RTC_CNTL_ADC2_HOLD_FORCE_S 1 +/* RTC_CNTL_ADC1_HOLD_FORCE : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define RTC_CNTL_ADC1_HOLD_FORCE (BIT(0)) +#define RTC_CNTL_ADC1_HOLD_FORCE_M (BIT(0)) +#define RTC_CNTL_ADC1_HOLD_FORCE_V 0x1 +#define RTC_CNTL_ADC1_HOLD_FORCE_S 0 + +#define RTC_CNTL_EXT_WAKEUP1_REG (DR_REG_RTCCNTL_BASE + 0xcc) +/* RTC_CNTL_EXT_WAKEUP1_STATUS_CLR : WO ;bitpos:[18] ;default: 1'd0 ; */ +/*description: clear ext wakeup1 status*/ +#define RTC_CNTL_EXT_WAKEUP1_STATUS_CLR (BIT(18)) +#define RTC_CNTL_EXT_WAKEUP1_STATUS_CLR_M (BIT(18)) +#define RTC_CNTL_EXT_WAKEUP1_STATUS_CLR_V 0x1 +#define RTC_CNTL_EXT_WAKEUP1_STATUS_CLR_S 18 +/* RTC_CNTL_EXT_WAKEUP1_SEL : R/W ;bitpos:[17:0] ;default: 18'd0 ; */ +/*description: Bitmap to select RTC pads for ext wakeup1*/ +#define RTC_CNTL_EXT_WAKEUP1_SEL 0x0003FFFF +#define RTC_CNTL_EXT_WAKEUP1_SEL_M ((RTC_CNTL_EXT_WAKEUP1_SEL_V)<<(RTC_CNTL_EXT_WAKEUP1_SEL_S)) +#define RTC_CNTL_EXT_WAKEUP1_SEL_V 0x3FFFF +#define RTC_CNTL_EXT_WAKEUP1_SEL_S 0 + +#define RTC_CNTL_EXT_WAKEUP1_STATUS_REG (DR_REG_RTCCNTL_BASE + 0xd0) +/* RTC_CNTL_EXT_WAKEUP1_STATUS : RO ;bitpos:[17:0] ;default: 18'd0 ; */ +/*description: ext wakeup1 status*/ +#define RTC_CNTL_EXT_WAKEUP1_STATUS 0x0003FFFF +#define RTC_CNTL_EXT_WAKEUP1_STATUS_M ((RTC_CNTL_EXT_WAKEUP1_STATUS_V)<<(RTC_CNTL_EXT_WAKEUP1_STATUS_S)) +#define RTC_CNTL_EXT_WAKEUP1_STATUS_V 0x3FFFF +#define RTC_CNTL_EXT_WAKEUP1_STATUS_S 0 + +#define RTC_CNTL_BROWN_OUT_REG (DR_REG_RTCCNTL_BASE + 0xd4) +/* RTC_CNTL_BROWN_OUT_DET : RO ;bitpos:[31] ;default: 1'b0 ; */ +/*description: brown out detect*/ +#define RTC_CNTL_BROWN_OUT_DET (BIT(31)) +#define RTC_CNTL_BROWN_OUT_DET_M (BIT(31)) +#define RTC_CNTL_BROWN_OUT_DET_V 0x1 +#define RTC_CNTL_BROWN_OUT_DET_S 31 +/* RTC_CNTL_BROWN_OUT_ENA : R/W ;bitpos:[30] ;default: 1'b0 ; */ +/*description: enable brown out*/ +#define RTC_CNTL_BROWN_OUT_ENA (BIT(30)) +#define RTC_CNTL_BROWN_OUT_ENA_M (BIT(30)) +#define RTC_CNTL_BROWN_OUT_ENA_V 0x1 +#define RTC_CNTL_BROWN_OUT_ENA_S 30 +/* RTC_CNTL_DBROWN_OUT_THRES : R/W ;bitpos:[29:27] ;default: 3'b010 ; */ +/*description: brown out threshold*/ +#define RTC_CNTL_DBROWN_OUT_THRES 0x00000007 +#define RTC_CNTL_DBROWN_OUT_THRES_M ((RTC_CNTL_DBROWN_OUT_THRES_V)<<(RTC_CNTL_DBROWN_OUT_THRES_S)) +#define RTC_CNTL_DBROWN_OUT_THRES_V 0x7 +#define RTC_CNTL_DBROWN_OUT_THRES_S 27 +/* RTC_CNTL_BROWN_OUT_RST_ENA : R/W ;bitpos:[26] ;default: 1'b0 ; */ +/*description: enable brown out reset*/ +#define RTC_CNTL_BROWN_OUT_RST_ENA (BIT(26)) +#define RTC_CNTL_BROWN_OUT_RST_ENA_M (BIT(26)) +#define RTC_CNTL_BROWN_OUT_RST_ENA_V 0x1 +#define RTC_CNTL_BROWN_OUT_RST_ENA_S 26 +/* RTC_CNTL_BROWN_OUT_RST_WAIT : R/W ;bitpos:[25:16] ;default: 10'h3ff ; */ +/*description: brown out reset wait cycles*/ +#define RTC_CNTL_BROWN_OUT_RST_WAIT 0x000003FF +#define RTC_CNTL_BROWN_OUT_RST_WAIT_M ((RTC_CNTL_BROWN_OUT_RST_WAIT_V)<<(RTC_CNTL_BROWN_OUT_RST_WAIT_S)) +#define RTC_CNTL_BROWN_OUT_RST_WAIT_V 0x3FF +#define RTC_CNTL_BROWN_OUT_RST_WAIT_S 16 +/* RTC_CNTL_BROWN_OUT_PD_RF_ENA : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: enable power down RF when brown out happens*/ +#define RTC_CNTL_BROWN_OUT_PD_RF_ENA (BIT(15)) +#define RTC_CNTL_BROWN_OUT_PD_RF_ENA_M (BIT(15)) +#define RTC_CNTL_BROWN_OUT_PD_RF_ENA_V 0x1 +#define RTC_CNTL_BROWN_OUT_PD_RF_ENA_S 15 +/* RTC_CNTL_BROWN_OUT_CLOSE_FLASH_ENA : R/W ;bitpos:[14] ;default: 1'b0 ; */ +/*description: enable close flash when brown out happens*/ +#define RTC_CNTL_BROWN_OUT_CLOSE_FLASH_ENA (BIT(14)) +#define RTC_CNTL_BROWN_OUT_CLOSE_FLASH_ENA_M (BIT(14)) +#define RTC_CNTL_BROWN_OUT_CLOSE_FLASH_ENA_V 0x1 +#define RTC_CNTL_BROWN_OUT_CLOSE_FLASH_ENA_S 14 + +#define RTC_MEM_CONF (DR_REG_RTCCNTL_BASE + 0x40 * 4) +#define RTC_MEM_CRC_FINISH (BIT(31)) +#define RTC_MEM_CRC_FINISH_M (BIT(31)) +#define RTC_MEM_CRC_FINISH_V 0x1 +#define RTC_MEM_CRC_FINISH_S (31) +#define RTC_MEM_CRC_LEN (0x7ff) +#define RTC_MEM_CRC_LEN_M ((RTC_MEM_CRC_LEN_V)<<(RTC_MEM_CRC_LEN_S)) +#define RTC_MEM_CRC_LEN_V (0x7ff) +#define RTC_MEM_CRC_LEN_S (20) +#define RTC_MEM_CRC_ADDR (0x7ff) +#define RTC_MEM_CRC_ADDR_M ((RTC_MEM_CRC_ADDR_V)<<(RTC_MEM_CRC_ADDR_S)) +#define RTC_MEM_CRC_ADDR_V (0x7ff) +#define RTC_MEM_CRC_ADDR_S (9) +#define RTC_MEM_CRC_START (BIT(8)) +#define RTC_MEM_CRC_START_M (BIT(8)) +#define RTC_MEM_CRC_START_V 0x1 +#define RTC_MEM_CRC_START_S (8) +#define RTC_MEM_PID_CONF (0xff) +#define RTC_MEM_PID_CONF_M (0xff) +#define RTC_MEM_PID_CONF_V (0xff) +#define RTC_MEM_PID_CONF_S (0) + +#define RTC_MEM_CRC_RES (DR_REG_RTCCNTL_BASE + 0x41 * 4) + +#define RTC_CNTL_DATE_REG (DR_REG_RTCCNTL_BASE + 0x13c) +/* RTC_CNTL_CNTL_DATE : R/W ;bitpos:[27:0] ;default: 28'h1604280 ; */ +/*description: */ +#define RTC_CNTL_CNTL_DATE 0x0FFFFFFF +#define RTC_CNTL_CNTL_DATE_M ((RTC_CNTL_CNTL_DATE_V)<<(RTC_CNTL_CNTL_DATE_S)) +#define RTC_CNTL_CNTL_DATE_V 0xFFFFFFF +#define RTC_CNTL_CNTL_DATE_S 0 +#define RTC_CNTL_RTC_CNTL_DATE_VERSION 0x1604280 + + + + +#endif /*_SOC_RTC_CNTL_REG_H_ */ + + diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/rtc_cntl_struct.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/rtc_cntl_struct.h new file mode 100644 index 0000000000000..b7d2e8bd0fcc9 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/rtc_cntl_struct.h @@ -0,0 +1,566 @@ +// 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. +#ifndef _SOC_RTC_CNTL_STRUCT_H_ +#define _SOC_RTC_CNTL_STRUCT_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef volatile struct rtc_cntl_dev_s { + union { + struct { + uint32_t sw_stall_appcpu_c0: 2; /*{reg_sw_stall_appcpu_c1[5:0] reg_sw_stall_appcpu_c0[1:0]} == 0x86 will stall APP CPU*/ + uint32_t sw_stall_procpu_c0: 2; /*{reg_sw_stall_procpu_c1[5:0] reg_sw_stall_procpu_c0[1:0]} == 0x86 will stall PRO CPU*/ + uint32_t sw_appcpu_rst: 1; /*APP CPU SW reset*/ + uint32_t sw_procpu_rst: 1; /*PRO CPU SW reset*/ + uint32_t bb_i2c_force_pd: 1; /*BB_I2C force power down*/ + uint32_t bb_i2c_force_pu: 1; /*BB_I2C force power up*/ + uint32_t bbpll_i2c_force_pd: 1; /*BB_PLL _I2C force power down*/ + uint32_t bbpll_i2c_force_pu: 1; /*BB_PLL_I2C force power up*/ + uint32_t bbpll_force_pd: 1; /*BB_PLL force power down*/ + uint32_t bbpll_force_pu: 1; /*BB_PLL force power up*/ + uint32_t xtl_force_pd: 1; /*crystall force power down*/ + uint32_t xtl_force_pu: 1; /*crystall force power up*/ + uint32_t bias_sleep_folw_8m: 1; /*BIAS_SLEEP follow CK8M*/ + uint32_t bias_force_sleep: 1; /*BIAS_SLEEP force sleep*/ + uint32_t bias_force_nosleep: 1; /*BIAS_SLEEP force no sleep*/ + uint32_t bias_i2c_folw_8m: 1; /*BIAS_I2C follow CK8M*/ + uint32_t bias_i2c_force_pd: 1; /*BIAS_I2C force power down*/ + uint32_t bias_i2c_force_pu: 1; /*BIAS_I2C force power up*/ + uint32_t bias_core_folw_8m: 1; /*BIAS_CORE follow CK8M*/ + uint32_t bias_core_force_pd: 1; /*BIAS_CORE force power down*/ + uint32_t bias_core_force_pu: 1; /*BIAS_CORE force power up*/ + uint32_t xtl_force_iso: 1; + uint32_t pll_force_iso: 1; + uint32_t analog_force_iso: 1; + uint32_t xtl_force_noiso: 1; + uint32_t pll_force_noiso: 1; + uint32_t analog_force_noiso: 1; + uint32_t dg_wrap_force_rst: 1; /*digital wrap force reset in deep sleep*/ + uint32_t dg_wrap_force_norst: 1; /*digital core force no reset in deep sleep*/ + uint32_t sw_sys_rst: 1; /*SW system reset*/ + }; + uint32_t val; + } options0; + uint32_t slp_timer0; /*RTC sleep timer low 32 bits*/ + union { + struct { + uint32_t slp_val_hi: 16; /*RTC sleep timer high 16 bits*/ + uint32_t main_timer_alarm_en: 1; /*timer alarm enable bit*/ + uint32_t reserved17: 15; + }; + uint32_t val; + } slp_timer1; + union { + struct { + uint32_t reserved0: 30; + uint32_t valid: 1; /*To indicate the register is updated*/ + uint32_t update: 1; /*Set 1: to update register with RTC timer*/ + }; + uint32_t val; + } time_update; + uint32_t time0; /*RTC timer low 32 bits*/ + union { + struct { + uint32_t time_hi:16; /*RTC timer high 16 bits*/ + uint32_t reserved16: 16; + }; + uint32_t val; + } time1; + union { + struct { + uint32_t reserved0: 20; + uint32_t touch_wakeup_force_en: 1; /*touch controller force wake up*/ + uint32_t ulp_cp_wakeup_force_en: 1; /*ULP-coprocessor force wake up*/ + uint32_t apb2rtc_bridge_sel: 1; /*1: APB to RTC using bridge 0: APB to RTC using sync*/ + uint32_t touch_slp_timer_en: 1; /*touch timer enable bit*/ + uint32_t ulp_cp_slp_timer_en: 1; /*ULP-coprocessor timer enable bit*/ + uint32_t reserved25: 3; + uint32_t sdio_active_ind: 1; /*SDIO active indication*/ + uint32_t slp_wakeup: 1; /*sleep wakeup bit*/ + uint32_t slp_reject: 1; /*sleep reject bit*/ + uint32_t sleep_en: 1; /*sleep enable bit*/ + }; + uint32_t val; + } state0; + union { + struct { + uint32_t cpu_stall_en: 1; /*CPU stall enable bit*/ + uint32_t cpu_stall_wait: 5; /*CPU stall wait cycles in fast_clk_rtc*/ + uint32_t ck8m_wait: 8; /*CK8M wait cycles in slow_clk_rtc*/ + uint32_t xtl_buf_wait: 10; /*XTAL wait cycles in slow_clk_rtc*/ + uint32_t pll_buf_wait: 8; /*PLL wait cycles in slow_clk_rtc*/ + }; + uint32_t val; + } timer1; + union { + struct { + uint32_t reserved0: 15; + uint32_t ulpcp_touch_start_wait: 9; /*wait cycles in slow_clk_rtc before ULP-coprocessor / touch controller start to work*/ + uint32_t min_time_ck8m_off: 8; /*minimal cycles in slow_clk_rtc for CK8M in power down state*/ + }; + uint32_t val; + } timer2; + union { + struct { + uint32_t wifi_wait_timer: 9; + uint32_t wifi_powerup_timer: 7; + uint32_t rom_ram_wait_timer: 9; + uint32_t rom_ram_powerup_timer: 7; + }; + uint32_t val; + } timer3; + union { + struct { + uint32_t rtc_wait_timer: 9; + uint32_t rtc_powerup_timer: 7; + uint32_t dg_wrap_wait_timer: 9; + uint32_t dg_wrap_powerup_timer: 7; + }; + uint32_t val; + } timer4; + union { + struct { + uint32_t ulp_cp_subtimer_prediv: 8; + uint32_t min_slp_val: 8; /*minimal sleep cycles in slow_clk_rtc*/ + uint32_t rtcmem_wait_timer: 9; + uint32_t rtcmem_powerup_timer: 7; + }; + uint32_t val; + } timer5; + union { + struct { + uint32_t reserved0: 23; + uint32_t plla_force_pd: 1; /*PLLA force power down*/ + uint32_t plla_force_pu: 1; /*PLLA force power up*/ + uint32_t bbpll_cal_slp_start: 1; /*start BBPLL calibration during sleep*/ + uint32_t pvtmon_pu: 1; /*1: PVTMON power up otherwise power down*/ + uint32_t txrf_i2c_pu: 1; /*1: TXRF_I2C power up otherwise power down*/ + uint32_t rfrx_pbus_pu: 1; /*1: RFRX_PBUS power up otherwise power down*/ + uint32_t reserved29: 1; + uint32_t ckgen_i2c_pu: 1; /*1: CKGEN_I2C power up otherwise power down*/ + uint32_t pll_i2c_pu: 1; /*1: PLL_I2C power up otherwise power down*/ + }; + uint32_t val; + } ana_conf; + union { + struct { + uint32_t reset_cause_procpu: 6; /*reset cause of PRO CPU*/ + uint32_t reset_cause_appcpu: 6; /*reset cause of APP CPU*/ + uint32_t appcpu_stat_vector_sel: 1; /*APP CPU state vector sel*/ + uint32_t procpu_stat_vector_sel: 1; /*PRO CPU state vector sel*/ + uint32_t reserved14: 18; + }; + uint32_t val; + } reset_state; + union { + struct { + uint32_t wakeup_cause: 11; /*wakeup cause*/ + uint32_t rtc_wakeup_ena: 11; /*wakeup enable bitmap*/ + uint32_t gpio_wakeup_filter: 1; /*enable filter for gpio wakeup event*/ + uint32_t reserved23: 9; + }; + uint32_t val; + } wakeup_state; + union { + struct { + uint32_t slp_wakeup: 1; /*enable sleep wakeup interrupt*/ + uint32_t slp_reject: 1; /*enable sleep reject interrupt*/ + uint32_t sdio_idle: 1; /*enable SDIO idle interrupt*/ + uint32_t rtc_wdt: 1; /*enable RTC WDT interrupt*/ + uint32_t rtc_time_valid: 1; /*enable RTC time valid interrupt*/ + uint32_t rtc_ulp_cp: 1; /*enable ULP-coprocessor interrupt*/ + uint32_t rtc_touch: 1; /*enable touch interrupt*/ + uint32_t rtc_brown_out: 1; /*enable brown out interrupt*/ + uint32_t rtc_main_timer: 1; /*enable RTC main timer interrupt*/ + uint32_t reserved9: 23; + }; + uint32_t val; + } int_ena; + union { + struct { + uint32_t slp_wakeup: 1; /*sleep wakeup interrupt raw*/ + uint32_t slp_reject: 1; /*sleep reject interrupt raw*/ + uint32_t sdio_idle: 1; /*SDIO idle interrupt raw*/ + uint32_t rtc_wdt: 1; /*RTC WDT interrupt raw*/ + uint32_t rtc_time_valid: 1; /*RTC time valid interrupt raw*/ + uint32_t rtc_ulp_cp: 1; /*ULP-coprocessor interrupt raw*/ + uint32_t rtc_touch: 1; /*touch interrupt raw*/ + uint32_t rtc_brown_out: 1; /*brown out interrupt raw*/ + uint32_t rtc_main_timer: 1; /*RTC main timer interrupt raw*/ + uint32_t reserved9: 23; + }; + uint32_t val; + } int_raw; + union { + struct { + uint32_t slp_wakeup: 1; /*sleep wakeup interrupt state*/ + uint32_t slp_reject: 1; /*sleep reject interrupt state*/ + uint32_t sdio_idle: 1; /*SDIO idle interrupt state*/ + uint32_t rtc_wdt: 1; /*RTC WDT interrupt state*/ + uint32_t rtc_time_valid: 1; /*RTC time valid interrupt state*/ + uint32_t rtc_sar: 1; /*ULP-coprocessor interrupt state*/ + uint32_t rtc_touch: 1; /*touch interrupt state*/ + uint32_t rtc_brown_out: 1; /*brown out interrupt state*/ + uint32_t rtc_main_timer: 1; /*RTC main timer interrupt state*/ + uint32_t reserved9: 23; + }; + uint32_t val; + } int_st; + union { + struct { + uint32_t slp_wakeup: 1; /*Clear sleep wakeup interrupt state*/ + uint32_t slp_reject: 1; /*Clear sleep reject interrupt state*/ + uint32_t sdio_idle: 1; /*Clear SDIO idle interrupt state*/ + uint32_t rtc_wdt: 1; /*Clear RTC WDT interrupt state*/ + uint32_t rtc_time_valid: 1; /*Clear RTC time valid interrupt state*/ + uint32_t rtc_sar: 1; /*Clear ULP-coprocessor interrupt state*/ + uint32_t rtc_touch: 1; /*Clear touch interrupt state*/ + uint32_t rtc_brown_out: 1; /*Clear brown out interrupt state*/ + uint32_t rtc_main_timer: 1; /*Clear RTC main timer interrupt state*/ + uint32_t reserved9: 23; + }; + uint32_t val; + } int_clr; + uint32_t rtc_store0; /*32-bit general purpose retention register*/ + uint32_t rtc_store1; /*32-bit general purpose retention register*/ + uint32_t rtc_store2; /*32-bit general purpose retention register*/ + uint32_t rtc_store3; /*32-bit general purpose retention register*/ + union { + struct { + uint32_t reserved0: 30; + uint32_t ctr_lv: 1; /*0: power down XTAL at high level 1: power down XTAL at low level*/ + uint32_t ctr_en: 1; /*enable control XTAL by external pads*/ + }; + uint32_t val; + } ext_xtl_conf; + union { + struct { + uint32_t reserved0: 30; + uint32_t wakeup0_lv: 1; /*0: external wakeup at low level 1: external wakeup at high level*/ + uint32_t wakeup1_lv: 1; /*0: external wakeup at low level 1: external wakeup at high level*/ + }; + uint32_t val; + } ext_wakeup_conf; + union { + struct { + uint32_t reserved0: 24; + uint32_t gpio_reject_en: 1; /*enable GPIO reject*/ + uint32_t sdio_reject_en: 1; /*enable SDIO reject*/ + uint32_t light_slp_reject_en: 1; /*enable reject for light sleep*/ + uint32_t deep_slp_reject_en: 1; /*enable reject for deep sleep*/ + uint32_t reject_cause: 4; /*sleep reject cause*/ + }; + uint32_t val; + } slp_reject_conf; + union { + struct { + uint32_t reserved0: 29; + uint32_t cpusel_conf: 1; /*CPU sel option*/ + uint32_t cpuperiod_sel: 2; /*CPU period sel*/ + }; + uint32_t val; + } cpu_period_conf; + union { + struct { + uint32_t reserved0: 22; + uint32_t sdio_act_dnum:10; + }; + uint32_t val; + } sdio_act_conf; + union { + struct { + uint32_t reserved0: 4; + uint32_t ck8m_div: 2; /*CK8M_D256_OUT divider. 00: div128 01: div256 10: div512 11: div1024.*/ + uint32_t enb_ck8m: 1; /*disable CK8M and CK8M_D256_OUT*/ + uint32_t enb_ck8m_div: 1; /*1: CK8M_D256_OUT is actually CK8M 0: CK8M_D256_OUT is CK8M divided by 256*/ + uint32_t dig_xtal32k_en: 1; /*enable CK_XTAL_32K for digital core (no relationship with RTC core)*/ + uint32_t dig_clk8m_d256_en: 1; /*enable CK8M_D256_OUT for digital core (no relationship with RTC core)*/ + uint32_t dig_clk8m_en: 1; /*enable CK8M for digital core (no relationship with RTC core)*/ + uint32_t ck8m_dfreq_force: 1; + uint32_t ck8m_div_sel: 3; /*divider = reg_ck8m_div_sel + 1*/ + uint32_t xtal_force_nogating: 1; /*XTAL force no gating during sleep*/ + uint32_t ck8m_force_nogating: 1; /*CK8M force no gating during sleep*/ + uint32_t ck8m_dfreq: 8; /*CK8M_DFREQ*/ + uint32_t ck8m_force_pd: 1; /*CK8M force power down*/ + uint32_t ck8m_force_pu: 1; /*CK8M force power up*/ + uint32_t soc_clk_sel: 2; /*SOC clock sel. 0: XTAL 1: PLL 2: CK8M 3: APLL*/ + uint32_t fast_clk_rtc_sel: 1; /*fast_clk_rtc sel. 0: XTAL div 4 1: CK8M*/ + uint32_t ana_clk_rtc_sel: 2; /*slow_clk_rtc sel. 0: SLOW_CK 1: CK_XTAL_32K 2: CK8M_D256_OUT*/ + }; + uint32_t val; + } clk_conf; + union { + struct { + uint32_t reserved0: 21; + uint32_t sdio_pd_en: 1; /*power down SDIO_REG in sleep. Only active when reg_sdio_force = 0*/ + uint32_t sdio_force: 1; /*1: use SW option to control SDIO_REG 0: use state machine*/ + uint32_t sdio_tieh: 1; /*SW option for SDIO_TIEH. Only active when reg_sdio_force = 1*/ + uint32_t reg1p8_ready: 1; /*read only register for REG1P8_READY*/ + uint32_t drefl_sdio: 2; /*SW option for DREFL_SDIO. Only active when reg_sdio_force = 1*/ + uint32_t drefm_sdio: 2; /*SW option for DREFM_SDIO. Only active when reg_sdio_force = 1*/ + uint32_t drefh_sdio: 2; /*SW option for DREFH_SDIO. Only active when reg_sdio_force = 1*/ + uint32_t xpd_sdio: 1; /*SW option for XPD_SDIO_REG. Only active when reg_sdio_force = 1*/ + }; + uint32_t val; + } sdio_conf; + union { + struct { + uint32_t reserved0: 24; + uint32_t dbg_atten: 2; /*DBG_ATTEN*/ + uint32_t enb_sck_xtal: 1; /*ENB_SCK_XTAL*/ + uint32_t inc_heartbeat_refresh: 1; /*INC_HEARTBEAT_REFRESH*/ + uint32_t dec_heartbeat_period: 1; /*DEC_HEARTBEAT_PERIOD*/ + uint32_t inc_heartbeat_period: 1; /*INC_HEARTBEAT_PERIOD*/ + uint32_t dec_heartbeat_width: 1; /*DEC_HEARTBEAT_WIDTH*/ + uint32_t rst_bias_i2c: 1; /*RST_BIAS_I2C*/ + }; + uint32_t val; + } bias_conf; + union { + struct { + uint32_t reserved0: 7; + uint32_t sck_dcap_force: 1; /*N/A*/ + uint32_t dig_dbias_slp: 3; /*DIG_REG_DBIAS during sleep*/ + uint32_t dig_dbias_wak: 3; /*DIG_REG_DBIAS during wakeup*/ + uint32_t sck_dcap: 8; /*SCK_DCAP*/ + uint32_t rtc_dbias_slp: 3; /*RTC_DBIAS during sleep*/ + uint32_t rtc_dbias_wak: 3; /*RTC_DBIAS during wakeup*/ + uint32_t rtc_dboost_force_pd: 1; /*RTC_DBOOST force power down*/ + uint32_t rtc_dboost_force_pu: 1; /*RTC_DBOOST force power up*/ + uint32_t rtc_force_pd: 1; /*RTC_REG force power down (for RTC_REG power down means decrease the voltage to 0.8v or lower )*/ + uint32_t rtc_force_pu: 1; /*RTC_REG force power up*/ + }; + uint32_t val; + } rtc; + union { + struct { + uint32_t fastmem_force_noiso: 1; /*Fast RTC memory force no ISO*/ + uint32_t fastmem_force_iso: 1; /*Fast RTC memory force ISO*/ + uint32_t slowmem_force_noiso: 1; /*RTC memory force no ISO*/ + uint32_t slowmem_force_iso: 1; /*RTC memory force ISO*/ + uint32_t rtc_force_iso: 1; /*rtc_peri force ISO*/ + uint32_t force_noiso: 1; /*rtc_peri force no ISO*/ + uint32_t fastmem_folw_cpu: 1; /*1: Fast RTC memory PD following CPU 0: fast RTC memory PD following RTC state machine*/ + uint32_t fastmem_force_lpd: 1; /*Fast RTC memory force PD*/ + uint32_t fastmem_force_lpu: 1; /*Fast RTC memory force no PD*/ + uint32_t slowmem_folw_cpu: 1; /*1: RTC memory PD following CPU 0: RTC memory PD following RTC state machine*/ + uint32_t slowmem_force_lpd: 1; /*RTC memory force PD*/ + uint32_t slowmem_force_lpu: 1; /*RTC memory force no PD*/ + uint32_t fastmem_force_pd: 1; /*Fast RTC memory force power down*/ + uint32_t fastmem_force_pu: 1; /*Fast RTC memory force power up*/ + uint32_t fastmem_pd_en: 1; /*enable power down fast RTC memory in sleep*/ + uint32_t slowmem_force_pd: 1; /*RTC memory force power down*/ + uint32_t slowmem_force_pu: 1; /*RTC memory force power up*/ + uint32_t slowmem_pd_en: 1; /*enable power down RTC memory in sleep*/ + uint32_t pwc_force_pd: 1; /*rtc_peri force power down*/ + uint32_t pwc_force_pu: 1; /*rtc_peri force power up*/ + uint32_t pd_en: 1; /*enable power down rtc_peri in sleep*/ + uint32_t reserved21: 11; + }; + uint32_t val; + } rtc_pwc; + union { + struct { + uint32_t reserved0: 3; + uint32_t lslp_mem_force_pd: 1; /*memories in digital core force PD in sleep*/ + uint32_t lslp_mem_force_pu: 1; /*memories in digital core force no PD in sleep*/ + uint32_t rom0_force_pd: 1; /*ROM force power down*/ + uint32_t rom0_force_pu: 1; /*ROM force power up*/ + uint32_t inter_ram0_force_pd: 1; /*internal SRAM 0 force power down*/ + uint32_t inter_ram0_force_pu: 1; /*internal SRAM 0 force power up*/ + uint32_t inter_ram1_force_pd: 1; /*internal SRAM 1 force power down*/ + uint32_t inter_ram1_force_pu: 1; /*internal SRAM 1 force power up*/ + uint32_t inter_ram2_force_pd: 1; /*internal SRAM 2 force power down*/ + uint32_t inter_ram2_force_pu: 1; /*internal SRAM 2 force power up*/ + uint32_t inter_ram3_force_pd: 1; /*internal SRAM 3 force power down*/ + uint32_t inter_ram3_force_pu: 1; /*internal SRAM 3 force power up*/ + uint32_t inter_ram4_force_pd: 1; /*internal SRAM 4 force power down*/ + uint32_t inter_ram4_force_pu: 1; /*internal SRAM 4 force power up*/ + uint32_t wifi_force_pd: 1; /*wifi force power down*/ + uint32_t wifi_force_pu: 1; /*wifi force power up*/ + uint32_t dg_wrap_force_pd: 1; /*digital core force power down*/ + uint32_t dg_wrap_force_pu: 1; /*digital core force power up*/ + uint32_t reserved21: 3; + uint32_t rom0_pd_en: 1; /*enable power down ROM in sleep*/ + uint32_t inter_ram0_pd_en: 1; /*enable power down internal SRAM 0 in sleep*/ + uint32_t inter_ram1_pd_en: 1; /*enable power down internal SRAM 1 in sleep*/ + uint32_t inter_ram2_pd_en: 1; /*enable power down internal SRAM 2 in sleep*/ + uint32_t inter_ram3_pd_en: 1; /*enable power down internal SRAM 3 in sleep*/ + uint32_t inter_ram4_pd_en: 1; /*enable power down internal SRAM 4 in sleep*/ + uint32_t wifi_pd_en: 1; /*enable power down wifi in sleep*/ + uint32_t dg_wrap_pd_en: 1; /*enable power down digital core in sleep*/ + }; + uint32_t val; + } dig_pwc; + union { + struct { + uint32_t reserved0: 7; + uint32_t dig_iso_force_off: 1; + uint32_t dig_iso_force_on: 1; + uint32_t dg_pad_autohold: 1; /*read only register to indicate digital pad auto-hold status*/ + uint32_t clr_dg_pad_autohold: 1; /*wtite only register to clear digital pad auto-hold*/ + uint32_t dg_pad_autohold_en: 1; /*digital pad enable auto-hold*/ + uint32_t dg_pad_force_noiso: 1; /*digital pad force no ISO*/ + uint32_t dg_pad_force_iso: 1; /*digital pad force ISO*/ + uint32_t dg_pad_force_unhold: 1; /*digital pad force un-hold*/ + uint32_t dg_pad_force_hold: 1; /*digital pad force hold*/ + uint32_t rom0_force_iso: 1; /*ROM force ISO*/ + uint32_t rom0_force_noiso: 1; /*ROM force no ISO*/ + uint32_t inter_ram0_force_iso: 1; /*internal SRAM 0 force ISO*/ + uint32_t inter_ram0_force_noiso: 1; /*internal SRAM 0 force no ISO*/ + uint32_t inter_ram1_force_iso: 1; /*internal SRAM 1 force ISO*/ + uint32_t inter_ram1_force_noiso: 1; /*internal SRAM 1 force no ISO*/ + uint32_t inter_ram2_force_iso: 1; /*internal SRAM 2 force ISO*/ + uint32_t inter_ram2_force_noiso: 1; /*internal SRAM 2 force no ISO*/ + uint32_t inter_ram3_force_iso: 1; /*internal SRAM 3 force ISO*/ + uint32_t inter_ram3_force_noiso: 1; /*internal SRAM 3 force no ISO*/ + uint32_t inter_ram4_force_iso: 1; /*internal SRAM 4 force ISO*/ + uint32_t inter_ram4_force_noiso: 1; /*internal SRAM 4 force no ISO*/ + uint32_t wifi_force_iso: 1; /*wifi force ISO*/ + uint32_t wifi_force_noiso: 1; /*wifi force no ISO*/ + uint32_t dg_wrap_force_iso: 1; /*digital core force ISO*/ + uint32_t dg_wrap_force_noiso: 1; /*digital core force no ISO*/ + }; + uint32_t val; + } dig_iso; + union { + struct { + uint32_t reserved0: 7; + uint32_t pause_in_slp: 1; /*pause WDT in sleep*/ + uint32_t appcpu_reset_en: 1; /*enable WDT reset APP CPU*/ + uint32_t procpu_reset_en: 1; /*enable WDT reset PRO CPU*/ + uint32_t flashboot_mod_en: 1; /*enable WDT in flash boot*/ + uint32_t sys_reset_length: 3; /*system reset counter length*/ + uint32_t cpu_reset_length: 3; /*CPU reset counter length*/ + uint32_t level_int_en: 1; /*N/A*/ + uint32_t edge_int_en: 1; /*N/A*/ + uint32_t stg3: 3; /*1: interrupt stage en 2: CPU reset stage en 3: system reset stage en 4: RTC reset stage en*/ + uint32_t stg2: 3; /*1: interrupt stage en 2: CPU reset stage en 3: system reset stage en 4: RTC reset stage en*/ + uint32_t stg1: 3; /*1: interrupt stage en 2: CPU reset stage en 3: system reset stage en 4: RTC reset stage en*/ + uint32_t stg0: 3; /*1: interrupt stage en 2: CPU reset stage en 3: system reset stage en 4: RTC reset stage en*/ + uint32_t en: 1; /*enable RTC WDT*/ + }; + uint32_t val; + } wdt_config0; + uint32_t wdt_config1; /**/ + uint32_t wdt_config2; /**/ + uint32_t wdt_config3; /**/ + uint32_t wdt_config4; /**/ + union { + struct { + uint32_t reserved0: 31; + uint32_t feed: 1; + }; + uint32_t val; + } wdt_feed; + uint32_t wdt_wprotect; /**/ + union { + struct { + uint32_t reserved0: 29; + uint32_t ent_rtc: 1; /*ENT_RTC*/ + uint32_t dtest_rtc: 2; /*DTEST_RTC*/ + }; + uint32_t val; + } test_mux; + union { + struct { + uint32_t reserved0: 20; + uint32_t appcpu_c1: 6; /*{reg_sw_stall_appcpu_c1[5:0] reg_sw_stall_appcpu_c0[1:0]} == 0x86 will stall APP CPU*/ + uint32_t procpu_c1: 6; /*{reg_sw_stall_procpu_c1[5:0] reg_sw_stall_procpu_c0[1:0]} == 0x86 will stall PRO CPU*/ + }; + uint32_t val; + } sw_cpu_stall; + uint32_t store4; /*32-bit general purpose retention register*/ + uint32_t store5; /*32-bit general purpose retention register*/ + uint32_t store6; /*32-bit general purpose retention register*/ + uint32_t store7; /*32-bit general purpose retention register*/ + uint32_t diag0; /**/ + uint32_t diag1; /**/ + union { + struct { + uint32_t adc1_hold_force: 1; + uint32_t adc2_hold_force: 1; + uint32_t pdac1_hold_force: 1; + uint32_t pdac2_hold_force: 1; + uint32_t sense1_hold_force: 1; + uint32_t sense2_hold_force: 1; + uint32_t sense3_hold_force: 1; + uint32_t sense4_hold_force: 1; + uint32_t touch_pad0_hold_force: 1; + uint32_t touch_pad1_hold_force: 1; + uint32_t touch_pad2_hold_force: 1; + uint32_t touch_pad3_hold_force: 1; + uint32_t touch_pad4_hold_force: 1; + uint32_t touch_pad5_hold_force: 1; + uint32_t touch_pad6_hold_force: 1; + uint32_t touch_pad7_hold_force: 1; + uint32_t x32p_hold_force: 1; + uint32_t x32n_hold_force: 1; + uint32_t reserved18: 14; + }; + uint32_t val; + } hold_force; + union { + struct { + uint32_t ext_wakeup1_sel: 18; /*Bitmap to select RTC pads for ext wakeup1*/ + uint32_t ext_wakeup1_status_clr: 1; /*clear ext wakeup1 status*/ + uint32_t reserved19: 13; + }; + uint32_t val; + } ext_wakeup1; + union { + struct { + uint32_t ext_wakeup1_status:18; /*ext wakeup1 status*/ + uint32_t reserved18: 14; + }; + uint32_t val; + } ext_wakeup1_status; + union { + struct { + uint32_t reserved0: 14; + uint32_t close_flash_ena: 1; /*enable close flash when brown out happens*/ + uint32_t pd_rf_ena: 1; /*enable power down RF when brown out happens*/ + uint32_t rst_wait: 10; /*brown out reset wait cycles*/ + uint32_t rst_ena: 1; /*enable brown out reset*/ + uint32_t thres: 3; /*brown out threshold*/ + uint32_t ena: 1; /*enable brown out*/ + uint32_t det: 1; /*brown out detect*/ + }; + uint32_t val; + } brown_out; + uint32_t reserved_39; + uint32_t reserved_3d; + uint32_t reserved_41; + uint32_t reserved_45; + uint32_t reserved_49; + uint32_t reserved_4d; + union { + struct { + uint32_t date: 28; + uint32_t reserved28: 4; + }; + uint32_t val; + } date; +} rtc_cntl_dev_t; +extern rtc_cntl_dev_t RTCCNTL; + +#ifdef __cplusplus +} +#endif + +#endif /* _SOC_RTC_CNTL_STRUCT_H_ */ diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/rtc_i2c_reg.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/rtc_i2c_reg.h new file mode 100644 index 0000000000000..556a455663146 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/rtc_i2c_reg.h @@ -0,0 +1,288 @@ +// Copyright 2016-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. + +#pragma once + +#include "soc.h" + +/** + * This file lists peripheral registers of an I2C controller which is part of the RTC. + * ULP coprocessor uses this controller to implement I2C_RD and I2C_WR instructions. + * + * Part of the functionality of this controller (such as slave mode, and multi-byte + * transfers) is not wired to the ULP, and is such, is not available to the + * ULP programs. + */ + +#define RTC_I2C_SCL_LOW_PERIOD_REG (DR_REG_RTC_I2C_BASE + 0x000) +/* RTC_I2C_SCL_LOW_PERIOD : R/W ;bitpos:[18:0] ;default: 19'b0 ; */ +/*description: number of cycles that scl == 0 */ +#define RTC_I2C_SCL_LOW_PERIOD 0x1FFFFFF +#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 0x1FFFFFF +#define RTC_I2C_SCL_LOW_PERIOD_S 0 + +#define RTC_I2C_CTRL_REG (DR_REG_RTC_I2C_BASE + 0x004) +/* RTC_I2C_RX_LSB_FIRST : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: Receive LSB first */ +#define RTC_I2C_RX_LSB_FIRST BIT(7) +#define RTC_I2C_RX_LSB_FIRST_M BIT(7) +#define RTC_I2C_RX_LSB_FIRST_V (1) +#define RTC_I2C_RX_LSB_FIRST_S (7) +/* RTC_I2C_TX_LSB_FIRST : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: Send LSB first */ +#define RTC_I2C_TX_LSB_FIRST BIT(6) +#define RTC_I2C_TX_LSB_FIRST_M BIT(6) +#define RTC_I2C_TX_LSB_FIRST_V (1) +#define RTC_I2C_TX_LSB_FIRST_S (6) +/* RTC_I2C_TRANS_START : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: Force to generate start condition */ +#define RTC_I2C_TRANS_START BIT(5) +#define RTC_I2C_TRANS_START_M BIT(5) +#define RTC_I2C_TRANS_START_V (1) +#define RTC_I2C_TRANS_START_S (5) +/* RTC_I2C_MS_MODE : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: Master (1) or slave (0) */ +#define RTC_I2C_MS_MODE BIT(4) +#define RTC_I2C_MS_MODE_M BIT(4) +#define RTC_I2C_MS_MODE_V (1) +#define RTC_I2C_MS_MODE_S (4) +/* RTC_I2C_SCL_FORCE_OUT : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: SCL is push-pull (1) or open-drain (0) */ +#define RTC_I2C_SCL_FORCE_OUT BIT(1) +#define RTC_I2C_SCL_FORCE_OUT_M BIT(1) +#define RTC_I2C_SCL_FORCE_OUT_V (1) +#define RTC_I2C_SCL_FORCE_OUT_S (1) +/* RTC_I2C_SDA_FORCE_OUT : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: SDA is push-pull (1) or open-drain (0) */ +#define RTC_I2C_SDA_FORCE_OUT BIT(0) +#define RTC_I2C_SDA_FORCE_OUT_M BIT(0) +#define RTC_I2C_SDA_FORCE_OUT_V (1) +#define RTC_I2C_SDA_FORCE_OUT_S (0) + +#define RTC_I2C_DEBUG_STATUS_REG (DR_REG_RTC_I2C_BASE + 0x008) +/* RTC_I2C_SCL_STATE : R/W ;bitpos:[30:28] ;default: 3'b0 ; */ +/*description: state of SCL state machine */ +#define RTC_I2C_SCL_STATE 0x7 +#define RTC_I2C_SCL_STATE_M ((RTC_I2C_SCL_STATE_V)<<(RTC_I2C_SCL_STATE_S)) +#define RTC_I2C_SCL_STATE_V 0x7 +#define RTC_I2C_SCL_STATE_S 28 +/* RTC_I2C_MAIN_STATE : R/W ;bitpos:[27:25] ;default: 3'b0 ; */ +/*description: state of the main state machine */ +#define RTC_I2C_MAIN_STATE 0x7 +#define RTC_I2C_MAIN_STATE_M ((RTC_I2C_MAIN_STATE_V)<<(RTC_I2C_MAIN_STATE_S)) +#define RTC_I2C_MAIN_STATE_V 0x7 +#define RTC_I2C_MAIN_STATE_S 25 +/* RTC_I2C_BYTE_TRANS : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: 8 bit transmit done */ +#define RTC_I2C_BYTE_TRANS BIT(6) +#define RTC_I2C_BYTE_TRANS_M BIT(6) +#define RTC_I2C_BYTE_TRANS_V (1) +#define RTC_I2C_BYTE_TRANS_S (6) +/* RTC_I2C_SLAVE_ADDR_MATCH : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: When working as a slave, whether address was matched */ +#define RTC_I2C_SLAVE_ADDR_MATCH BIT(5) +#define RTC_I2C_SLAVE_ADDR_MATCH_M BIT(5) +#define RTC_I2C_SLAVE_ADDR_MATCH_V (1) +#define RTC_I2C_SLAVE_ADDR_MATCH_S (5) +/* RTC_I2C_BUS_BUSY : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: operation is in progress */ +#define RTC_I2C_BUS_BUSY BIT(4) +#define RTC_I2C_BUS_BUSY_M BIT(4) +#define RTC_I2C_BUS_BUSY_V (1) +#define RTC_I2C_BUS_BUSY_S (4) +/* RTC_I2C_ARB_LOST : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: When working as a master, lost control of I2C bus */ +#define RTC_I2C_ARB_LOST BIT(3) +#define RTC_I2C_ARB_LOST_M BIT(3) +#define RTC_I2C_ARB_LOST_V (1) +#define RTC_I2C_ARB_LOST_S (3) +/* RTC_I2C_TIMED_OUT : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: Transfer has timed out */ +#define RTC_I2C_TIMED_OUT BIT(2) +#define RTC_I2C_TIMED_OUT_M BIT(2) +#define RTC_I2C_TIMED_OUT_V (1) +#define RTC_I2C_TIMED_OUT_S (2) +/* RTC_I2C_SLAVE_RW : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: When working as a slave, the value of R/W bit received */ +#define RTC_I2C_SLAVE_RW BIT(1) +#define RTC_I2C_SLAVE_RW_M BIT(1) +#define RTC_I2C_SLAVE_RW_V (1) +#define RTC_I2C_SLAVE_RW_S (1) +/* RTC_I2C_ACK_VAL : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: The value of an acknowledge signal on the bus */ +#define RTC_I2C_ACK_VAL BIT(0) +#define RTC_I2C_ACK_VAL_M BIT(0) +#define RTC_I2C_ACK_VAL_V (1) +#define RTC_I2C_ACK_VAL_S (0) + +#define RTC_I2C_TIMEOUT_REG (DR_REG_RTC_I2C_BASE + 0x00c) +/* RTC_I2C_TIMEOUT : R/W ;bitpos:[19:0] ;default: 20'b0 ; */ +/*description: Maximum number of FAST_CLK cycles that the transmission can take */ +#define RTC_I2C_TIMEOUT 0xFFFFF +#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 + +#define RTC_I2C_SLAVE_ADDR_REG (DR_REG_RTC_I2C_BASE + 0x010) +/* RTC_I2C_SLAVE_ADDR_10BIT : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: Set if local slave address is 10-bit */ +#define RTC_I2C_SLAVE_ADDR_10BIT BIT(31) +#define RTC_I2C_SLAVE_ADDR_10BIT_M BIT(31) +#define RTC_I2C_SLAVE_ADDR_10BIT_V (1) +#define RTC_I2C_SLAVE_ADDR_10BIT_S (31) +/* RTC_I2C_SLAVE_ADDR : R/W ;bitpos:[14:0] ;default: 15'b0 ; */ +/*description: local slave address */ +#define RTC_I2C_SLAVE_ADDR 0x7FFF +#define RTC_I2C_SLAVE_ADDR_M ((RTC_I2C_SLAVE_ADDR_V)<<(RTC_I2C_SLAVE_ADDR_S)) +#define RTC_I2C_SLAVE_ADDR_V 0x7FFF +#define RTC_I2C_SLAVE_ADDR_S 0 + +/* Result of last read operation. Not used directly as the data will be + * returned to the ULP. Listed for debugging purposes. + */ +#define RTC_I2C_DATA_REG (DR_REG_RTC_I2C_BASE + 0x01c) + +/* Interrupt registers; since the interrupt from RTC_I2C is not connected, + * these registers are only listed for debugging purposes. + */ + +/* Interrupt raw status register */ +#define RTC_I2C_INT_RAW_REG (DR_REG_RTC_I2C_BASE + 0x020) +/* RTC_I2C_TIME_OUT_INT_RAW : R/O ;bitpos:[7] ;default: 1'b0 ; */ +/*description: time out interrupt raw status */ +#define RTC_I2C_TIME_OUT_INT_RAW BIT(7) +#define RTC_I2C_TIME_OUT_INT_RAW_M BIT(7) +#define RTC_I2C_TIME_OUT_INT_RAW_V (1) +#define RTC_I2C_TIME_OUT_INT_RAW_S (7) +/* RTC_I2C_TRANS_COMPLETE_INT_RAW : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: Stop condition has been detected interrupt raw status */ +#define RTC_I2C_TRANS_COMPLETE_INT_RAW BIT(6) +#define RTC_I2C_TRANS_COMPLETE_INT_RAW_M BIT(6) +#define RTC_I2C_TRANS_COMPLETE_INT_RAW_V (1) +#define RTC_I2C_TRANS_COMPLETE_INT_RAW_S (6) +/* RTC_I2C_MASTER_TRANS_COMPLETE_INT_RAW : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define RTC_I2C_MASTER_TRANS_COMPLETE_INT_RAW BIT(5) +#define RTC_I2C_MASTER_TRANS_COMPLETE_INT_RAW_M BIT(5) +#define RTC_I2C_MASTER_TRANS_COMPLETE_INT_RAW_V (1) +#define RTC_I2C_MASTER_TRANS_COMPLETE_INT_RAW_S (5) +/* RTC_I2C_ARBITRATION_LOST_INT_RAW : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: Master lost arbitration */ +#define RTC_I2C_ARBITRATION_LOST_INT_RAW BIT(4) +#define RTC_I2C_ARBITRATION_LOST_INT_RAW_M BIT(4) +#define RTC_I2C_ARBITRATION_LOST_INT_RAW_V (1) +#define RTC_I2C_ARBITRATION_LOST_INT_RAW_S (4) +/* RTC_I2C_SLAVE_TRANS_COMPLETE_INT_RAW : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: Slave accepted 1 byte and address matched */ +#define RTC_I2C_SLAVE_TRANS_COMPLETE_INT_RAW BIT(3) +#define RTC_I2C_SLAVE_TRANS_COMPLETE_INT_RAW_M BIT(3) +#define RTC_I2C_SLAVE_TRANS_COMPLETE_INT_RAW_V (1) +#define RTC_I2C_SLAVE_TRANS_COMPLETE_INT_RAW_S (3) + +/* Interrupt clear register */ +#define RTC_I2C_INT_CLR_REG (DR_REG_RTC_I2C_BASE + 0x024) +/* RTC_I2C_TIME_OUT_INT_CLR : W/O ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define RTC_I2C_TIME_OUT_INT_CLR BIT(8) +#define RTC_I2C_TIME_OUT_INT_CLR_M BIT(8) +#define RTC_I2C_TIME_OUT_INT_CLR_V (1) +#define RTC_I2C_TIME_OUT_INT_CLR_S (8) +/* RTC_I2C_TRANS_COMPLETE_INT_CLR : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define RTC_I2C_TRANS_COMPLETE_INT_CLR BIT(7) +#define RTC_I2C_TRANS_COMPLETE_INT_CLR_M BIT(7) +#define RTC_I2C_TRANS_COMPLETE_INT_CLR_V (1) +#define RTC_I2C_TRANS_COMPLETE_INT_CLR_S (7) +/* RTC_I2C_MASTER_TRANS_COMPLETE_INT_CLR : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define RTC_I2C_MASTER_TRANS_COMPLETE_INT_CLR BIT(6) +#define RTC_I2C_MASTER_TRANS_COMPLETE_INT_CLR_M BIT(6) +#define RTC_I2C_MASTER_TRANS_COMPLETE_INT_CLR_V (1) +#define RTC_I2C_MASTER_TRANS_COMPLETE_INT_CLR_S (6) +/* RTC_I2C_ARBITRATION_LOST_INT_CLR : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define RTC_I2C_ARBITRATION_LOST_INT_CLR BIT(5) +#define RTC_I2C_ARBITRATION_LOST_INT_CLR_M BIT(5) +#define RTC_I2C_ARBITRATION_LOST_INT_CLR_V (1) +#define RTC_I2C_ARBITRATION_LOST_INT_CLR_S (5) +/* RTC_I2C_SLAVE_TRANS_COMPLETE_INT_CLR : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define RTC_I2C_SLAVE_TRANS_COMPLETE_INT_CLR BIT(4) +#define RTC_I2C_SLAVE_TRANS_COMPLETE_INT_CLR_M BIT(4) +#define RTC_I2C_SLAVE_TRANS_COMPLETE_INT_CLR_V (1) +#define RTC_I2C_SLAVE_TRANS_COMPLETE_INT_CLR_S (4) + +/* Interrupt enable register. + * Bit definitions are not given here, because interrupt functionality + * of RTC_I2C is not used. + */ +#define RTC_I2C_INT_EN_REG (DR_REG_RTC_I2C_BASE + 0x028) + +/* Masked interrupt status register. + * Bit definitions are not given here, because interrupt functionality + * of RTC_I2C is not used. + */ +#define RTC_I2C_INT_ST_REG (DR_REG_RTC_I2C_BASE + 0x02c) + +#define RTC_I2C_SDA_DUTY_REG (DR_REG_RTC_I2C_BASE + 0x030) +/* RTC_I2C_SDA_DUTY : R/W ;bitpos:[19:0] ;default: 20'b0 ; */ +/*description: Number of FAST_CLK cycles SDA will switch after falling edge of SCL */ +#define RTC_I2C_SDA_DUTY 0xFFFFF +#define RTC_I2C_SDA_DUTY_M ((RTC_I2C_SDA_DUTY_V)<<(RTC_I2C_SDA_DUTY_S)) +#define RTC_I2C_SDA_DUTY_V 0xFFFFF +#define RTC_I2C_SDA_DUTY_S 0 + +#define RTC_I2C_SCL_HIGH_PERIOD_REG (DR_REG_RTC_I2C_BASE + 0x038) +/* RTC_I2C_SCL_HIGH_PERIOD : R/W ;bitpos:[19:0] ;default: 20'b0 ; */ +/*description: Number of FAST_CLK cycles for SCL to be high */ +#define RTC_I2C_SCL_HIGH_PERIOD 0xFFFFF +#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 + +#define RTC_I2C_SCL_START_PERIOD_REG (DR_REG_RTC_I2C_BASE + 0x040) +/* RTC_I2C_SCL_START_PERIOD : R/W ;bitpos:[19:0] ;default: 20'b0 ; */ +/*description: Number of FAST_CLK cycles to wait before generating start condition */ +#define RTC_I2C_SCL_START_PERIOD 0xFFFFF +#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 +#define RTC_I2C_SCL_START_PERIOD_S 0 + +#define RTC_I2C_SCL_STOP_PERIOD_REG (DR_REG_RTC_I2C_BASE + 0x044) +/* RTC_I2C_SCL_STOP_PERIOD : R/W ;bitpos:[19:0] ;default: 20'b0 ; */ +/*description: Number of FAST_CLK cycles to wait before generating stop condition */ +#define RTC_I2C_SCL_STOP_PERIOD 0xFFFFF +#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 +#define RTC_I2C_SCL_STOP_PERIOD_S 0 + +/* A block of 16 RTC_I2C_CMD registers which describe I2C operation to be + * performed. Unused when ULP is controlling RTC_I2C. + */ +#define RTC_I2C_CMD_REG_COUNT 16 +#define RTC_I2C_CMD_REG(i) (DR_REG_RTC_I2C_BASE + 0x048 + (i) * 4) +/* RTC_I2C_CMD_DONE : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: Bit is set by HW when command is done */ +#define RTC_I2C_CMD_DONE BIT(31) +#define RTC_I2C_CMD_DONE_M BIT(31) +#define RTC_I2C_CMD_DONE_V (1) +#define RTC_I2C_CMD_DONE_S (31) +/* RTC_I2C_VAL : R/W ;bitpos:[13:0] ;default: 14'b0 ; */ +/*description: Command content */ +#define RTC_I2C_VAL 0 +#define RTC_I2C_VAL_M ((RTC_I2C_VAL_V)<<(RTC_I2C_VAL_S)) +#define RTC_I2C_VAL_V 0x3FFF +#define RTC_I2C_VAL_S 0 + diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/rtc_io_caps.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/rtc_io_caps.h new file mode 100644 index 0000000000000..29d4ec645f61b --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/rtc_io_caps.h @@ -0,0 +1,21 @@ +// 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. + +#ifndef _SOC_RTC_IO_CAPS_H_ +#define _SOC_RTC_IO_CAPS_H_ + +#define SOC_RTC_IO_PIN_COUNT 18 +#define SOC_PIN_FUNC_RTC_IO 0 + +#endif \ No newline at end of file diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/rtc_io_channel.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/rtc_io_channel.h new file mode 100644 index 0000000000000..2a5b42586715e --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/rtc_io_channel.h @@ -0,0 +1,75 @@ +// 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. + +#ifndef _SOC_RTC_IO_CHANNEL_H +#define _SOC_RTC_IO_CHANNEL_H + +#define RTC_GPIO_NUMBER 18 + +//RTC GPIO channels +#define RTCIO_GPIO36_CHANNEL 0 //RTCIO_CHANNEL_0 +#define RTCIO_CHANNEL_0_GPIO_NUM 36 + +#define RTCIO_GPIO37_CHANNEL 1 //RTCIO_CHANNEL_1 +#define RTCIO_CHANNEL_1_GPIO_NUM 37 + +#define RTCIO_GPIO38_CHANNEL 2 //RTCIO_CHANNEL_2 +#define RTCIO_CHANNEL_2_GPIO_NUM 38 + +#define RTCIO_GPIO39_CHANNEL 3 //RTCIO_CHANNEL_3 +#define RTCIO_CHANNEL_3_GPIO_NUM 39 + +#define RTCIO_GPIO34_CHANNEL 4 //RTCIO_CHANNEL_4 +#define RTCIO_CHANNEL_4_GPIO_NUM 34 + +#define RTCIO_GPIO35_CHANNEL 5 //RTCIO_CHANNEL_5 +#define RTCIO_CHANNEL_5_GPIO_NUM 35 + +#define RTCIO_GPIO25_CHANNEL 6 //RTCIO_CHANNEL_6 +#define RTCIO_CHANNEL_6_GPIO_NUM 25 + +#define RTCIO_GPIO26_CHANNEL 7 //RTCIO_CHANNEL_7 +#define RTCIO_CHANNEL_7_GPIO_NUM 26 + +#define RTCIO_GPIO33_CHANNEL 8 //RTCIO_CHANNEL_8 +#define RTCIO_CHANNEL_8_GPIO_NUM 33 + +#define RTCIO_GPIO32_CHANNEL 9 //RTCIO_CHANNEL_9 +#define RTCIO_CHANNEL_9_GPIO_NUM 32 + +#define RTCIO_GPIO4_CHANNEL 10 //RTCIO_CHANNEL_10 +#define RTCIO_CHANNEL_10_GPIO_NUM 4 + +#define RTCIO_GPIO0_CHANNEL 11 //RTCIO_CHANNEL_11 +#define RTCIO_CHANNEL_11_GPIO_NUM 0 + +#define RTCIO_GPIO2_CHANNEL 12 //RTCIO_CHANNEL_12 +#define RTCIO_CHANNEL_12_GPIO_NUM 2 + +#define RTCIO_GPIO15_CHANNEL 13 //RTCIO_CHANNEL_13 +#define RTCIO_CHANNEL_13_GPIO_NUM 15 + +#define RTCIO_GPIO13_CHANNEL 14 //RTCIO_CHANNEL_14 +#define RTCIO_CHANNEL_14_GPIO_NUM 13 + +#define RTCIO_GPIO12_CHANNEL 15 //RTCIO_CHANNEL_15 +#define RTCIO_CHANNEL_15_GPIO_NUM 12 + +#define RTCIO_GPIO14_CHANNEL 16 //RTCIO_CHANNEL_16 +#define RTCIO_CHANNEL_16_GPIO_NUM 14 + +#define RTCIO_GPIO27_CHANNEL 17 //RTCIO_CHANNEL_17 +#define RTCIO_CHANNEL_17_GPIO_NUM 27 + +#endif diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/rtc_io_reg.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/rtc_io_reg.h new file mode 100644 index 0000000000000..5a3ce10d422fb --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/rtc_io_reg.h @@ -0,0 +1,1954 @@ +// 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. +#ifndef _SOC_RTC_IO_REG_H_ +#define _SOC_RTC_IO_REG_H_ + + +#include "soc.h" +#define RTC_GPIO_OUT_REG (DR_REG_RTCIO_BASE + 0x0) +/* RTC_GPIO_OUT_DATA : R/W ;bitpos:[31:14] ;default: 0 ; */ +/*description: GPIO0~17 output value*/ +#define RTC_GPIO_OUT_DATA 0x0003FFFF +#define RTC_GPIO_OUT_DATA_M ((RTC_GPIO_OUT_DATA_V)<<(RTC_GPIO_OUT_DATA_S)) +#define RTC_GPIO_OUT_DATA_V 0x3FFFF +#define RTC_GPIO_OUT_DATA_S 14 + +#define RTC_GPIO_OUT_W1TS_REG (DR_REG_RTCIO_BASE + 0x4) +/* RTC_GPIO_OUT_DATA_W1TS : WO ;bitpos:[31:14] ;default: 0 ; */ +/*description: GPIO0~17 output value write 1 to set*/ +#define RTC_GPIO_OUT_DATA_W1TS 0x0003FFFF +#define RTC_GPIO_OUT_DATA_W1TS_M ((RTC_GPIO_OUT_DATA_W1TS_V)<<(RTC_GPIO_OUT_DATA_W1TS_S)) +#define RTC_GPIO_OUT_DATA_W1TS_V 0x3FFFF +#define RTC_GPIO_OUT_DATA_W1TS_S 14 + +#define RTC_GPIO_OUT_W1TC_REG (DR_REG_RTCIO_BASE + 0x8) +/* RTC_GPIO_OUT_DATA_W1TC : WO ;bitpos:[31:14] ;default: 0 ; */ +/*description: GPIO0~17 output value write 1 to clear*/ +#define RTC_GPIO_OUT_DATA_W1TC 0x0003FFFF +#define RTC_GPIO_OUT_DATA_W1TC_M ((RTC_GPIO_OUT_DATA_W1TC_V)<<(RTC_GPIO_OUT_DATA_W1TC_S)) +#define RTC_GPIO_OUT_DATA_W1TC_V 0x3FFFF +#define RTC_GPIO_OUT_DATA_W1TC_S 14 + +#define RTC_GPIO_ENABLE_REG (DR_REG_RTCIO_BASE + 0xc) +/* RTC_GPIO_ENABLE : R/W ;bitpos:[31:14] ;default: 0 ; */ +/*description: GPIO0~17 output enable*/ +#define RTC_GPIO_ENABLE 0x0003FFFF +#define RTC_GPIO_ENABLE_M ((RTC_GPIO_ENABLE_V)<<(RTC_GPIO_ENABLE_S)) +#define RTC_GPIO_ENABLE_V 0x3FFFF +#define RTC_GPIO_ENABLE_S 14 + +#define RTC_GPIO_ENABLE_W1TS_REG (DR_REG_RTCIO_BASE + 0x10) +/* RTC_GPIO_ENABLE_W1TS : WO ;bitpos:[31:14] ;default: 0 ; */ +/*description: GPIO0~17 output enable write 1 to set*/ +#define RTC_GPIO_ENABLE_W1TS 0x0003FFFF +#define RTC_GPIO_ENABLE_W1TS_M ((RTC_GPIO_ENABLE_W1TS_V)<<(RTC_GPIO_ENABLE_W1TS_S)) +#define RTC_GPIO_ENABLE_W1TS_V 0x3FFFF +#define RTC_GPIO_ENABLE_W1TS_S 14 + +#define RTC_GPIO_ENABLE_W1TC_REG (DR_REG_RTCIO_BASE + 0x14) +/* RTC_GPIO_ENABLE_W1TC : WO ;bitpos:[31:14] ;default: 0 ; */ +/*description: GPIO0~17 output enable write 1 to clear*/ +#define RTC_GPIO_ENABLE_W1TC 0x0003FFFF +#define RTC_GPIO_ENABLE_W1TC_M ((RTC_GPIO_ENABLE_W1TC_V)<<(RTC_GPIO_ENABLE_W1TC_S)) +#define RTC_GPIO_ENABLE_W1TC_V 0x3FFFF +#define RTC_GPIO_ENABLE_W1TC_S 14 + +#define RTC_GPIO_STATUS_REG (DR_REG_RTCIO_BASE + 0x18) +/* RTC_GPIO_STATUS_INT : R/W ;bitpos:[31:14] ;default: 0 ; */ +/*description: GPIO0~17 interrupt status*/ +#define RTC_GPIO_STATUS_INT 0x0003FFFF +#define RTC_GPIO_STATUS_INT_M ((RTC_GPIO_STATUS_INT_V)<<(RTC_GPIO_STATUS_INT_S)) +#define RTC_GPIO_STATUS_INT_V 0x3FFFF +#define RTC_GPIO_STATUS_INT_S 14 + +#define RTC_GPIO_STATUS_W1TS_REG (DR_REG_RTCIO_BASE + 0x1c) +/* RTC_GPIO_STATUS_INT_W1TS : WO ;bitpos:[31:14] ;default: 0 ; */ +/*description: GPIO0~17 interrupt status write 1 to set*/ +#define RTC_GPIO_STATUS_INT_W1TS 0x0003FFFF +#define RTC_GPIO_STATUS_INT_W1TS_M ((RTC_GPIO_STATUS_INT_W1TS_V)<<(RTC_GPIO_STATUS_INT_W1TS_S)) +#define RTC_GPIO_STATUS_INT_W1TS_V 0x3FFFF +#define RTC_GPIO_STATUS_INT_W1TS_S 14 + +#define RTC_GPIO_STATUS_W1TC_REG (DR_REG_RTCIO_BASE + 0x20) +/* RTC_GPIO_STATUS_INT_W1TC : WO ;bitpos:[31:14] ;default: 0 ; */ +/*description: GPIO0~17 interrupt status write 1 to clear*/ +#define RTC_GPIO_STATUS_INT_W1TC 0x0003FFFF +#define RTC_GPIO_STATUS_INT_W1TC_M ((RTC_GPIO_STATUS_INT_W1TC_V)<<(RTC_GPIO_STATUS_INT_W1TC_S)) +#define RTC_GPIO_STATUS_INT_W1TC_V 0x3FFFF +#define RTC_GPIO_STATUS_INT_W1TC_S 14 + +#define RTC_GPIO_IN_REG (DR_REG_RTCIO_BASE + 0x24) +/* RTC_GPIO_IN_NEXT : RO ;bitpos:[31:14] ;default: ; */ +/*description: GPIO0~17 input value*/ +#define RTC_GPIO_IN_NEXT 0x0003FFFF +#define RTC_GPIO_IN_NEXT_M ((RTC_GPIO_IN_NEXT_V)<<(RTC_GPIO_IN_NEXT_S)) +#define RTC_GPIO_IN_NEXT_V 0x3FFFF +#define RTC_GPIO_IN_NEXT_S 14 + +#define RTC_GPIO_PIN0_REG (DR_REG_RTCIO_BASE + 0x28) +/* RTC_GPIO_PIN0_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: 0 ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define RTC_GPIO_PIN0_WAKEUP_ENABLE (BIT(10)) +#define RTC_GPIO_PIN0_WAKEUP_ENABLE_M (BIT(10)) +#define RTC_GPIO_PIN0_WAKEUP_ENABLE_V 0x1 +#define RTC_GPIO_PIN0_WAKEUP_ENABLE_S 10 +/* RTC_GPIO_PIN0_INT_TYPE : R/W ;bitpos:[9:7] ;default: 0 ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define RTC_GPIO_PIN0_INT_TYPE 0x00000007 +#define RTC_GPIO_PIN0_INT_TYPE_M ((RTC_GPIO_PIN0_INT_TYPE_V)<<(RTC_GPIO_PIN0_INT_TYPE_S)) +#define RTC_GPIO_PIN0_INT_TYPE_V 0x7 +#define RTC_GPIO_PIN0_INT_TYPE_S 7 +/* RTC_GPIO_PIN0_PAD_DRIVER : R/W ;bitpos:[2] ;default: 0 ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define RTC_GPIO_PIN0_PAD_DRIVER (BIT(2)) +#define RTC_GPIO_PIN0_PAD_DRIVER_M (BIT(2)) +#define RTC_GPIO_PIN0_PAD_DRIVER_V 0x1 +#define RTC_GPIO_PIN0_PAD_DRIVER_S 2 + +#define RTC_GPIO_PIN1_REG (DR_REG_RTCIO_BASE + 0x2c) +/* RTC_GPIO_PIN1_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: 0 ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define RTC_GPIO_PIN1_WAKEUP_ENABLE (BIT(10)) +#define RTC_GPIO_PIN1_WAKEUP_ENABLE_M (BIT(10)) +#define RTC_GPIO_PIN1_WAKEUP_ENABLE_V 0x1 +#define RTC_GPIO_PIN1_WAKEUP_ENABLE_S 10 +/* RTC_GPIO_PIN1_INT_TYPE : R/W ;bitpos:[9:7] ;default: 0 ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define RTC_GPIO_PIN1_INT_TYPE 0x00000007 +#define RTC_GPIO_PIN1_INT_TYPE_M ((RTC_GPIO_PIN1_INT_TYPE_V)<<(RTC_GPIO_PIN1_INT_TYPE_S)) +#define RTC_GPIO_PIN1_INT_TYPE_V 0x7 +#define RTC_GPIO_PIN1_INT_TYPE_S 7 +/* RTC_GPIO_PIN1_PAD_DRIVER : R/W ;bitpos:[2] ;default: 0 ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define RTC_GPIO_PIN1_PAD_DRIVER (BIT(2)) +#define RTC_GPIO_PIN1_PAD_DRIVER_M (BIT(2)) +#define RTC_GPIO_PIN1_PAD_DRIVER_V 0x1 +#define RTC_GPIO_PIN1_PAD_DRIVER_S 2 + +#define RTC_GPIO_PIN2_REG (DR_REG_RTCIO_BASE + 0x30) +/* RTC_GPIO_PIN2_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: 0 ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define RTC_GPIO_PIN2_WAKEUP_ENABLE (BIT(10)) +#define RTC_GPIO_PIN2_WAKEUP_ENABLE_M (BIT(10)) +#define RTC_GPIO_PIN2_WAKEUP_ENABLE_V 0x1 +#define RTC_GPIO_PIN2_WAKEUP_ENABLE_S 10 +/* RTC_GPIO_PIN2_INT_TYPE : R/W ;bitpos:[9:7] ;default: 0 ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define RTC_GPIO_PIN2_INT_TYPE 0x00000007 +#define RTC_GPIO_PIN2_INT_TYPE_M ((RTC_GPIO_PIN2_INT_TYPE_V)<<(RTC_GPIO_PIN2_INT_TYPE_S)) +#define RTC_GPIO_PIN2_INT_TYPE_V 0x7 +#define RTC_GPIO_PIN2_INT_TYPE_S 7 +/* RTC_GPIO_PIN2_PAD_DRIVER : R/W ;bitpos:[2] ;default: 0 ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define RTC_GPIO_PIN2_PAD_DRIVER (BIT(2)) +#define RTC_GPIO_PIN2_PAD_DRIVER_M (BIT(2)) +#define RTC_GPIO_PIN2_PAD_DRIVER_V 0x1 +#define RTC_GPIO_PIN2_PAD_DRIVER_S 2 + +#define RTC_GPIO_PIN3_REG (DR_REG_RTCIO_BASE + 0x34) +/* RTC_GPIO_PIN3_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: 0 ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define RTC_GPIO_PIN3_WAKEUP_ENABLE (BIT(10)) +#define RTC_GPIO_PIN3_WAKEUP_ENABLE_M (BIT(10)) +#define RTC_GPIO_PIN3_WAKEUP_ENABLE_V 0x1 +#define RTC_GPIO_PIN3_WAKEUP_ENABLE_S 10 +/* RTC_GPIO_PIN3_INT_TYPE : R/W ;bitpos:[9:7] ;default: 0 ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define RTC_GPIO_PIN3_INT_TYPE 0x00000007 +#define RTC_GPIO_PIN3_INT_TYPE_M ((RTC_GPIO_PIN3_INT_TYPE_V)<<(RTC_GPIO_PIN3_INT_TYPE_S)) +#define RTC_GPIO_PIN3_INT_TYPE_V 0x7 +#define RTC_GPIO_PIN3_INT_TYPE_S 7 +/* RTC_GPIO_PIN3_PAD_DRIVER : R/W ;bitpos:[2] ;default: 0 ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define RTC_GPIO_PIN3_PAD_DRIVER (BIT(2)) +#define RTC_GPIO_PIN3_PAD_DRIVER_M (BIT(2)) +#define RTC_GPIO_PIN3_PAD_DRIVER_V 0x1 +#define RTC_GPIO_PIN3_PAD_DRIVER_S 2 + +#define RTC_GPIO_PIN4_REG (DR_REG_RTCIO_BASE + 0x38) +/* RTC_GPIO_PIN4_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: 0 ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define RTC_GPIO_PIN4_WAKEUP_ENABLE (BIT(10)) +#define RTC_GPIO_PIN4_WAKEUP_ENABLE_M (BIT(10)) +#define RTC_GPIO_PIN4_WAKEUP_ENABLE_V 0x1 +#define RTC_GPIO_PIN4_WAKEUP_ENABLE_S 10 +/* RTC_GPIO_PIN4_INT_TYPE : R/W ;bitpos:[9:7] ;default: 0 ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define RTC_GPIO_PIN4_INT_TYPE 0x00000007 +#define RTC_GPIO_PIN4_INT_TYPE_M ((RTC_GPIO_PIN4_INT_TYPE_V)<<(RTC_GPIO_PIN4_INT_TYPE_S)) +#define RTC_GPIO_PIN4_INT_TYPE_V 0x7 +#define RTC_GPIO_PIN4_INT_TYPE_S 7 +/* RTC_GPIO_PIN4_PAD_DRIVER : R/W ;bitpos:[2] ;default: 0 ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define RTC_GPIO_PIN4_PAD_DRIVER (BIT(2)) +#define RTC_GPIO_PIN4_PAD_DRIVER_M (BIT(2)) +#define RTC_GPIO_PIN4_PAD_DRIVER_V 0x1 +#define RTC_GPIO_PIN4_PAD_DRIVER_S 2 + +#define RTC_GPIO_PIN5_REG (DR_REG_RTCIO_BASE + 0x3c) +/* RTC_GPIO_PIN5_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: 0 ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define RTC_GPIO_PIN5_WAKEUP_ENABLE (BIT(10)) +#define RTC_GPIO_PIN5_WAKEUP_ENABLE_M (BIT(10)) +#define RTC_GPIO_PIN5_WAKEUP_ENABLE_V 0x1 +#define RTC_GPIO_PIN5_WAKEUP_ENABLE_S 10 +/* RTC_GPIO_PIN5_INT_TYPE : R/W ;bitpos:[9:7] ;default: 0 ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define RTC_GPIO_PIN5_INT_TYPE 0x00000007 +#define RTC_GPIO_PIN5_INT_TYPE_M ((RTC_GPIO_PIN5_INT_TYPE_V)<<(RTC_GPIO_PIN5_INT_TYPE_S)) +#define RTC_GPIO_PIN5_INT_TYPE_V 0x7 +#define RTC_GPIO_PIN5_INT_TYPE_S 7 +/* RTC_GPIO_PIN5_PAD_DRIVER : R/W ;bitpos:[2] ;default: 0 ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define RTC_GPIO_PIN5_PAD_DRIVER (BIT(2)) +#define RTC_GPIO_PIN5_PAD_DRIVER_M (BIT(2)) +#define RTC_GPIO_PIN5_PAD_DRIVER_V 0x1 +#define RTC_GPIO_PIN5_PAD_DRIVER_S 2 + +#define RTC_GPIO_PIN6_REG (DR_REG_RTCIO_BASE + 0x40) +/* RTC_GPIO_PIN6_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: 0 ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define RTC_GPIO_PIN6_WAKEUP_ENABLE (BIT(10)) +#define RTC_GPIO_PIN6_WAKEUP_ENABLE_M (BIT(10)) +#define RTC_GPIO_PIN6_WAKEUP_ENABLE_V 0x1 +#define RTC_GPIO_PIN6_WAKEUP_ENABLE_S 10 +/* RTC_GPIO_PIN6_INT_TYPE : R/W ;bitpos:[9:7] ;default: 0 ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define RTC_GPIO_PIN6_INT_TYPE 0x00000007 +#define RTC_GPIO_PIN6_INT_TYPE_M ((RTC_GPIO_PIN6_INT_TYPE_V)<<(RTC_GPIO_PIN6_INT_TYPE_S)) +#define RTC_GPIO_PIN6_INT_TYPE_V 0x7 +#define RTC_GPIO_PIN6_INT_TYPE_S 7 +/* RTC_GPIO_PIN6_PAD_DRIVER : R/W ;bitpos:[2] ;default: 0 ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define RTC_GPIO_PIN6_PAD_DRIVER (BIT(2)) +#define RTC_GPIO_PIN6_PAD_DRIVER_M (BIT(2)) +#define RTC_GPIO_PIN6_PAD_DRIVER_V 0x1 +#define RTC_GPIO_PIN6_PAD_DRIVER_S 2 + +#define RTC_GPIO_PIN7_REG (DR_REG_RTCIO_BASE + 0x44) +/* RTC_GPIO_PIN7_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: 0 ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define RTC_GPIO_PIN7_WAKEUP_ENABLE (BIT(10)) +#define RTC_GPIO_PIN7_WAKEUP_ENABLE_M (BIT(10)) +#define RTC_GPIO_PIN7_WAKEUP_ENABLE_V 0x1 +#define RTC_GPIO_PIN7_WAKEUP_ENABLE_S 10 +/* RTC_GPIO_PIN7_INT_TYPE : R/W ;bitpos:[9:7] ;default: 0 ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define RTC_GPIO_PIN7_INT_TYPE 0x00000007 +#define RTC_GPIO_PIN7_INT_TYPE_M ((RTC_GPIO_PIN7_INT_TYPE_V)<<(RTC_GPIO_PIN7_INT_TYPE_S)) +#define RTC_GPIO_PIN7_INT_TYPE_V 0x7 +#define RTC_GPIO_PIN7_INT_TYPE_S 7 +/* RTC_GPIO_PIN7_PAD_DRIVER : R/W ;bitpos:[2] ;default: 0 ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define RTC_GPIO_PIN7_PAD_DRIVER (BIT(2)) +#define RTC_GPIO_PIN7_PAD_DRIVER_M (BIT(2)) +#define RTC_GPIO_PIN7_PAD_DRIVER_V 0x1 +#define RTC_GPIO_PIN7_PAD_DRIVER_S 2 + +#define RTC_GPIO_PIN8_REG (DR_REG_RTCIO_BASE + 0x48) +/* RTC_GPIO_PIN8_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: 0 ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define RTC_GPIO_PIN8_WAKEUP_ENABLE (BIT(10)) +#define RTC_GPIO_PIN8_WAKEUP_ENABLE_M (BIT(10)) +#define RTC_GPIO_PIN8_WAKEUP_ENABLE_V 0x1 +#define RTC_GPIO_PIN8_WAKEUP_ENABLE_S 10 +/* RTC_GPIO_PIN8_INT_TYPE : R/W ;bitpos:[9:7] ;default: 0 ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define RTC_GPIO_PIN8_INT_TYPE 0x00000007 +#define RTC_GPIO_PIN8_INT_TYPE_M ((RTC_GPIO_PIN8_INT_TYPE_V)<<(RTC_GPIO_PIN8_INT_TYPE_S)) +#define RTC_GPIO_PIN8_INT_TYPE_V 0x7 +#define RTC_GPIO_PIN8_INT_TYPE_S 7 +/* RTC_GPIO_PIN8_PAD_DRIVER : R/W ;bitpos:[2] ;default: 0 ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define RTC_GPIO_PIN8_PAD_DRIVER (BIT(2)) +#define RTC_GPIO_PIN8_PAD_DRIVER_M (BIT(2)) +#define RTC_GPIO_PIN8_PAD_DRIVER_V 0x1 +#define RTC_GPIO_PIN8_PAD_DRIVER_S 2 + +#define RTC_GPIO_PIN9_REG (DR_REG_RTCIO_BASE + 0x4c) +/* RTC_GPIO_PIN9_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: 0 ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define RTC_GPIO_PIN9_WAKEUP_ENABLE (BIT(10)) +#define RTC_GPIO_PIN9_WAKEUP_ENABLE_M (BIT(10)) +#define RTC_GPIO_PIN9_WAKEUP_ENABLE_V 0x1 +#define RTC_GPIO_PIN9_WAKEUP_ENABLE_S 10 +/* RTC_GPIO_PIN9_INT_TYPE : R/W ;bitpos:[9:7] ;default: 0 ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define RTC_GPIO_PIN9_INT_TYPE 0x00000007 +#define RTC_GPIO_PIN9_INT_TYPE_M ((RTC_GPIO_PIN9_INT_TYPE_V)<<(RTC_GPIO_PIN9_INT_TYPE_S)) +#define RTC_GPIO_PIN9_INT_TYPE_V 0x7 +#define RTC_GPIO_PIN9_INT_TYPE_S 7 +/* RTC_GPIO_PIN9_PAD_DRIVER : R/W ;bitpos:[2] ;default: 0 ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define RTC_GPIO_PIN9_PAD_DRIVER (BIT(2)) +#define RTC_GPIO_PIN9_PAD_DRIVER_M (BIT(2)) +#define RTC_GPIO_PIN9_PAD_DRIVER_V 0x1 +#define RTC_GPIO_PIN9_PAD_DRIVER_S 2 + +#define RTC_GPIO_PIN10_REG (DR_REG_RTCIO_BASE + 0x50) +/* RTC_GPIO_PIN10_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: 0 ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define RTC_GPIO_PIN10_WAKEUP_ENABLE (BIT(10)) +#define RTC_GPIO_PIN10_WAKEUP_ENABLE_M (BIT(10)) +#define RTC_GPIO_PIN10_WAKEUP_ENABLE_V 0x1 +#define RTC_GPIO_PIN10_WAKEUP_ENABLE_S 10 +/* RTC_GPIO_PIN10_INT_TYPE : R/W ;bitpos:[9:7] ;default: 0 ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define RTC_GPIO_PIN10_INT_TYPE 0x00000007 +#define RTC_GPIO_PIN10_INT_TYPE_M ((RTC_GPIO_PIN10_INT_TYPE_V)<<(RTC_GPIO_PIN10_INT_TYPE_S)) +#define RTC_GPIO_PIN10_INT_TYPE_V 0x7 +#define RTC_GPIO_PIN10_INT_TYPE_S 7 +/* RTC_GPIO_PIN10_PAD_DRIVER : R/W ;bitpos:[2] ;default: 0 ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define RTC_GPIO_PIN10_PAD_DRIVER (BIT(2)) +#define RTC_GPIO_PIN10_PAD_DRIVER_M (BIT(2)) +#define RTC_GPIO_PIN10_PAD_DRIVER_V 0x1 +#define RTC_GPIO_PIN10_PAD_DRIVER_S 2 + +#define RTC_GPIO_PIN11_REG (DR_REG_RTCIO_BASE + 0x54) +/* RTC_GPIO_PIN11_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: 0 ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define RTC_GPIO_PIN11_WAKEUP_ENABLE (BIT(10)) +#define RTC_GPIO_PIN11_WAKEUP_ENABLE_M (BIT(10)) +#define RTC_GPIO_PIN11_WAKEUP_ENABLE_V 0x1 +#define RTC_GPIO_PIN11_WAKEUP_ENABLE_S 10 +/* RTC_GPIO_PIN11_INT_TYPE : R/W ;bitpos:[9:7] ;default: 0 ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define RTC_GPIO_PIN11_INT_TYPE 0x00000007 +#define RTC_GPIO_PIN11_INT_TYPE_M ((RTC_GPIO_PIN11_INT_TYPE_V)<<(RTC_GPIO_PIN11_INT_TYPE_S)) +#define RTC_GPIO_PIN11_INT_TYPE_V 0x7 +#define RTC_GPIO_PIN11_INT_TYPE_S 7 +/* RTC_GPIO_PIN11_PAD_DRIVER : R/W ;bitpos:[2] ;default: 0 ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define RTC_GPIO_PIN11_PAD_DRIVER (BIT(2)) +#define RTC_GPIO_PIN11_PAD_DRIVER_M (BIT(2)) +#define RTC_GPIO_PIN11_PAD_DRIVER_V 0x1 +#define RTC_GPIO_PIN11_PAD_DRIVER_S 2 + +#define RTC_GPIO_PIN12_REG (DR_REG_RTCIO_BASE + 0x58) +/* RTC_GPIO_PIN12_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: 0 ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define RTC_GPIO_PIN12_WAKEUP_ENABLE (BIT(10)) +#define RTC_GPIO_PIN12_WAKEUP_ENABLE_M (BIT(10)) +#define RTC_GPIO_PIN12_WAKEUP_ENABLE_V 0x1 +#define RTC_GPIO_PIN12_WAKEUP_ENABLE_S 10 +/* RTC_GPIO_PIN12_INT_TYPE : R/W ;bitpos:[9:7] ;default: 0 ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define RTC_GPIO_PIN12_INT_TYPE 0x00000007 +#define RTC_GPIO_PIN12_INT_TYPE_M ((RTC_GPIO_PIN12_INT_TYPE_V)<<(RTC_GPIO_PIN12_INT_TYPE_S)) +#define RTC_GPIO_PIN12_INT_TYPE_V 0x7 +#define RTC_GPIO_PIN12_INT_TYPE_S 7 +/* RTC_GPIO_PIN12_PAD_DRIVER : R/W ;bitpos:[2] ;default: 0 ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define RTC_GPIO_PIN12_PAD_DRIVER (BIT(2)) +#define RTC_GPIO_PIN12_PAD_DRIVER_M (BIT(2)) +#define RTC_GPIO_PIN12_PAD_DRIVER_V 0x1 +#define RTC_GPIO_PIN12_PAD_DRIVER_S 2 + +#define RTC_GPIO_PIN13_REG (DR_REG_RTCIO_BASE + 0x5c) +/* RTC_GPIO_PIN13_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: 0 ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define RTC_GPIO_PIN13_WAKEUP_ENABLE (BIT(10)) +#define RTC_GPIO_PIN13_WAKEUP_ENABLE_M (BIT(10)) +#define RTC_GPIO_PIN13_WAKEUP_ENABLE_V 0x1 +#define RTC_GPIO_PIN13_WAKEUP_ENABLE_S 10 +/* RTC_GPIO_PIN13_INT_TYPE : R/W ;bitpos:[9:7] ;default: 0 ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define RTC_GPIO_PIN13_INT_TYPE 0x00000007 +#define RTC_GPIO_PIN13_INT_TYPE_M ((RTC_GPIO_PIN13_INT_TYPE_V)<<(RTC_GPIO_PIN13_INT_TYPE_S)) +#define RTC_GPIO_PIN13_INT_TYPE_V 0x7 +#define RTC_GPIO_PIN13_INT_TYPE_S 7 +/* RTC_GPIO_PIN13_PAD_DRIVER : R/W ;bitpos:[2] ;default: 0 ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define RTC_GPIO_PIN13_PAD_DRIVER (BIT(2)) +#define RTC_GPIO_PIN13_PAD_DRIVER_M (BIT(2)) +#define RTC_GPIO_PIN13_PAD_DRIVER_V 0x1 +#define RTC_GPIO_PIN13_PAD_DRIVER_S 2 + +#define RTC_GPIO_PIN14_REG (DR_REG_RTCIO_BASE + 0x60) +/* RTC_GPIO_PIN14_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: 0 ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define RTC_GPIO_PIN14_WAKEUP_ENABLE (BIT(10)) +#define RTC_GPIO_PIN14_WAKEUP_ENABLE_M (BIT(10)) +#define RTC_GPIO_PIN14_WAKEUP_ENABLE_V 0x1 +#define RTC_GPIO_PIN14_WAKEUP_ENABLE_S 10 +/* RTC_GPIO_PIN14_INT_TYPE : R/W ;bitpos:[9:7] ;default: 0 ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define RTC_GPIO_PIN14_INT_TYPE 0x00000007 +#define RTC_GPIO_PIN14_INT_TYPE_M ((RTC_GPIO_PIN14_INT_TYPE_V)<<(RTC_GPIO_PIN14_INT_TYPE_S)) +#define RTC_GPIO_PIN14_INT_TYPE_V 0x7 +#define RTC_GPIO_PIN14_INT_TYPE_S 7 +/* RTC_GPIO_PIN14_PAD_DRIVER : R/W ;bitpos:[2] ;default: 0 ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define RTC_GPIO_PIN14_PAD_DRIVER (BIT(2)) +#define RTC_GPIO_PIN14_PAD_DRIVER_M (BIT(2)) +#define RTC_GPIO_PIN14_PAD_DRIVER_V 0x1 +#define RTC_GPIO_PIN14_PAD_DRIVER_S 2 + +#define RTC_GPIO_PIN15_REG (DR_REG_RTCIO_BASE + 0x64) +/* RTC_GPIO_PIN15_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: 0 ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define RTC_GPIO_PIN15_WAKEUP_ENABLE (BIT(10)) +#define RTC_GPIO_PIN15_WAKEUP_ENABLE_M (BIT(10)) +#define RTC_GPIO_PIN15_WAKEUP_ENABLE_V 0x1 +#define RTC_GPIO_PIN15_WAKEUP_ENABLE_S 10 +/* RTC_GPIO_PIN15_INT_TYPE : R/W ;bitpos:[9:7] ;default: 0 ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define RTC_GPIO_PIN15_INT_TYPE 0x00000007 +#define RTC_GPIO_PIN15_INT_TYPE_M ((RTC_GPIO_PIN15_INT_TYPE_V)<<(RTC_GPIO_PIN15_INT_TYPE_S)) +#define RTC_GPIO_PIN15_INT_TYPE_V 0x7 +#define RTC_GPIO_PIN15_INT_TYPE_S 7 +/* RTC_GPIO_PIN15_PAD_DRIVER : R/W ;bitpos:[2] ;default: 0 ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define RTC_GPIO_PIN15_PAD_DRIVER (BIT(2)) +#define RTC_GPIO_PIN15_PAD_DRIVER_M (BIT(2)) +#define RTC_GPIO_PIN15_PAD_DRIVER_V 0x1 +#define RTC_GPIO_PIN15_PAD_DRIVER_S 2 + +#define RTC_GPIO_PIN16_REG (DR_REG_RTCIO_BASE + 0x68) +/* RTC_GPIO_PIN16_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: 0 ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define RTC_GPIO_PIN16_WAKEUP_ENABLE (BIT(10)) +#define RTC_GPIO_PIN16_WAKEUP_ENABLE_M (BIT(10)) +#define RTC_GPIO_PIN16_WAKEUP_ENABLE_V 0x1 +#define RTC_GPIO_PIN16_WAKEUP_ENABLE_S 10 +/* RTC_GPIO_PIN16_INT_TYPE : R/W ;bitpos:[9:7] ;default: 0 ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define RTC_GPIO_PIN16_INT_TYPE 0x00000007 +#define RTC_GPIO_PIN16_INT_TYPE_M ((RTC_GPIO_PIN16_INT_TYPE_V)<<(RTC_GPIO_PIN16_INT_TYPE_S)) +#define RTC_GPIO_PIN16_INT_TYPE_V 0x7 +#define RTC_GPIO_PIN16_INT_TYPE_S 7 +/* RTC_GPIO_PIN16_PAD_DRIVER : R/W ;bitpos:[2] ;default: 0 ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define RTC_GPIO_PIN16_PAD_DRIVER (BIT(2)) +#define RTC_GPIO_PIN16_PAD_DRIVER_M (BIT(2)) +#define RTC_GPIO_PIN16_PAD_DRIVER_V 0x1 +#define RTC_GPIO_PIN16_PAD_DRIVER_S 2 + +#define RTC_GPIO_PIN17_REG (DR_REG_RTCIO_BASE + 0x6c) +/* RTC_GPIO_PIN17_WAKEUP_ENABLE : R/W ;bitpos:[10] ;default: 0 ; */ +/*description: GPIO wake up enable only available in light sleep*/ +#define RTC_GPIO_PIN17_WAKEUP_ENABLE (BIT(10)) +#define RTC_GPIO_PIN17_WAKEUP_ENABLE_M (BIT(10)) +#define RTC_GPIO_PIN17_WAKEUP_ENABLE_V 0x1 +#define RTC_GPIO_PIN17_WAKEUP_ENABLE_S 10 +/* RTC_GPIO_PIN17_INT_TYPE : R/W ;bitpos:[9:7] ;default: 0 ; */ +/*description: if set to 0: GPIO interrupt disable if set to 1: rising edge + trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ +#define RTC_GPIO_PIN17_INT_TYPE 0x00000007 +#define RTC_GPIO_PIN17_INT_TYPE_M ((RTC_GPIO_PIN17_INT_TYPE_V)<<(RTC_GPIO_PIN17_INT_TYPE_S)) +#define RTC_GPIO_PIN17_INT_TYPE_V 0x7 +#define RTC_GPIO_PIN17_INT_TYPE_S 7 +/* RTC_GPIO_PIN17_PAD_DRIVER : R/W ;bitpos:[2] ;default: 0 ; */ +/*description: if set to 0: normal output if set to 1: open drain*/ +#define RTC_GPIO_PIN17_PAD_DRIVER (BIT(2)) +#define RTC_GPIO_PIN17_PAD_DRIVER_M (BIT(2)) +#define RTC_GPIO_PIN17_PAD_DRIVER_V 0x1 +#define RTC_GPIO_PIN17_PAD_DRIVER_S 2 + +#define RTC_IO_RTC_DEBUG_SEL_REG (DR_REG_RTCIO_BASE + 0x70) +/* RTC_IO_DEBUG_12M_NO_GATING : R/W ;bitpos:[25] ;default: 1'd0 ; */ +/*description: */ +#define RTC_IO_DEBUG_12M_NO_GATING (BIT(25)) +#define RTC_IO_DEBUG_12M_NO_GATING_M (BIT(25)) +#define RTC_IO_DEBUG_12M_NO_GATING_V 0x1 +#define RTC_IO_DEBUG_12M_NO_GATING_S 25 +/* RTC_IO_DEBUG_SEL4 : R/W ;bitpos:[24:20] ;default: 5'd0 ; */ +/*description: */ +#define RTC_IO_DEBUG_SEL4 0x0000001F +#define RTC_IO_DEBUG_SEL4_M ((RTC_IO_DEBUG_SEL4_V)<<(RTC_IO_DEBUG_SEL4_S)) +#define RTC_IO_DEBUG_SEL4_V 0x1F +#define RTC_IO_DEBUG_SEL4_S 20 +/* RTC_IO_DEBUG_SEL3 : R/W ;bitpos:[19:15] ;default: 5'd0 ; */ +/*description: */ +#define RTC_IO_DEBUG_SEL3 0x0000001F +#define RTC_IO_DEBUG_SEL3_M ((RTC_IO_DEBUG_SEL3_V)<<(RTC_IO_DEBUG_SEL3_S)) +#define RTC_IO_DEBUG_SEL3_V 0x1F +#define RTC_IO_DEBUG_SEL3_S 15 +/* RTC_IO_DEBUG_SEL2 : R/W ;bitpos:[14:10] ;default: 5'd0 ; */ +/*description: */ +#define RTC_IO_DEBUG_SEL2 0x0000001F +#define RTC_IO_DEBUG_SEL2_M ((RTC_IO_DEBUG_SEL2_V)<<(RTC_IO_DEBUG_SEL2_S)) +#define RTC_IO_DEBUG_SEL2_V 0x1F +#define RTC_IO_DEBUG_SEL2_S 10 +/* RTC_IO_DEBUG_SEL1 : R/W ;bitpos:[9:5] ;default: 5'd0 ; */ +/*description: */ +#define RTC_IO_DEBUG_SEL1 0x0000001F +#define RTC_IO_DEBUG_SEL1_M ((RTC_IO_DEBUG_SEL1_V)<<(RTC_IO_DEBUG_SEL1_S)) +#define RTC_IO_DEBUG_SEL1_V 0x1F +#define RTC_IO_DEBUG_SEL1_S 5 +/* RTC_IO_DEBUG_SEL0 : R/W ;bitpos:[4:0] ;default: 5'd0 ; */ +/*description: */ +#define RTC_IO_DEBUG_SEL0 0x0000001F +#define RTC_IO_DEBUG_SEL0_M ((RTC_IO_DEBUG_SEL0_V)<<(RTC_IO_DEBUG_SEL0_S)) +#define RTC_IO_DEBUG_SEL0_V 0x1F +#define RTC_IO_DEBUG_SEL0_S 0 +#define RTC_IO_DEBUG_SEL0_8M 1 +#define RTC_IO_DEBUG_SEL0_32K_XTAL 4 +#define RTC_IO_DEBUG_SEL0_150K_OSC 5 + +#define RTC_IO_DIG_PAD_HOLD_REG (DR_REG_RTCIO_BASE + 0x74) +/* RTC_IO_DIG_PAD_HOLD : R/W ;bitpos:[31:0] ;default: 1'd0 ; */ +/*description: select the digital pad hold value.*/ +#define RTC_IO_DIG_PAD_HOLD 0xFFFFFFFF +#define RTC_IO_DIG_PAD_HOLD_M ((RTC_IO_DIG_PAD_HOLD_V)<<(RTC_IO_DIG_PAD_HOLD_S)) +#define RTC_IO_DIG_PAD_HOLD_V 0xFFFFFFFF +#define RTC_IO_DIG_PAD_HOLD_S 0 + +#define RTC_IO_HALL_SENS_REG (DR_REG_RTCIO_BASE + 0x78) +/* RTC_IO_XPD_HALL : R/W ;bitpos:[31] ;default: 1'd0 ; */ +/*description: Power on hall sensor and connect to VP and VN*/ +#define RTC_IO_XPD_HALL (BIT(31)) +#define RTC_IO_XPD_HALL_M (BIT(31)) +#define RTC_IO_XPD_HALL_V 0x1 +#define RTC_IO_XPD_HALL_S 31 +/* RTC_IO_HALL_PHASE : R/W ;bitpos:[30] ;default: 1'd0 ; */ +/*description: Reverse phase of hall sensor*/ +#define RTC_IO_HALL_PHASE (BIT(30)) +#define RTC_IO_HALL_PHASE_M (BIT(30)) +#define RTC_IO_HALL_PHASE_V 0x1 +#define RTC_IO_HALL_PHASE_S 30 + +#define RTC_IO_SENSOR_PADS_REG (DR_REG_RTCIO_BASE + 0x7c) +/* RTC_IO_SENSE1_HOLD : R/W ;bitpos:[31] ;default: 1'd0 ; */ +/*description: hold the current value of the output when setting the hold to Ò1Ó*/ +#define RTC_IO_SENSE1_HOLD (BIT(31)) +#define RTC_IO_SENSE1_HOLD_M (BIT(31)) +#define RTC_IO_SENSE1_HOLD_V 0x1 +#define RTC_IO_SENSE1_HOLD_S 31 +/* RTC_IO_SENSE2_HOLD : R/W ;bitpos:[30] ;default: 1'd0 ; */ +/*description: hold the current value of the output when setting the hold to Ò1Ó*/ +#define RTC_IO_SENSE2_HOLD (BIT(30)) +#define RTC_IO_SENSE2_HOLD_M (BIT(30)) +#define RTC_IO_SENSE2_HOLD_V 0x1 +#define RTC_IO_SENSE2_HOLD_S 30 +/* RTC_IO_SENSE3_HOLD : R/W ;bitpos:[29] ;default: 1'd0 ; */ +/*description: hold the current value of the output when setting the hold to Ò1Ó*/ +#define RTC_IO_SENSE3_HOLD (BIT(29)) +#define RTC_IO_SENSE3_HOLD_M (BIT(29)) +#define RTC_IO_SENSE3_HOLD_V 0x1 +#define RTC_IO_SENSE3_HOLD_S 29 +/* RTC_IO_SENSE4_HOLD : R/W ;bitpos:[28] ;default: 1'd0 ; */ +/*description: hold the current value of the output when setting the hold to Ò1Ó*/ +#define RTC_IO_SENSE4_HOLD (BIT(28)) +#define RTC_IO_SENSE4_HOLD_M (BIT(28)) +#define RTC_IO_SENSE4_HOLD_V 0x1 +#define RTC_IO_SENSE4_HOLD_S 28 +/* RTC_IO_SENSE1_MUX_SEL : R/W ;bitpos:[27] ;default: 1'd0 ; */ +/*description: Ò1Ó select the digital function Ó0Óslection the rtc function*/ +#define RTC_IO_SENSE1_MUX_SEL (BIT(27)) +#define RTC_IO_SENSE1_MUX_SEL_M (BIT(27)) +#define RTC_IO_SENSE1_MUX_SEL_V 0x1 +#define RTC_IO_SENSE1_MUX_SEL_S 27 +/* RTC_IO_SENSE2_MUX_SEL : R/W ;bitpos:[26] ;default: 1'd0 ; */ +/*description: Ò1Ó select the digital function Ó0Óslection the rtc function*/ +#define RTC_IO_SENSE2_MUX_SEL (BIT(26)) +#define RTC_IO_SENSE2_MUX_SEL_M (BIT(26)) +#define RTC_IO_SENSE2_MUX_SEL_V 0x1 +#define RTC_IO_SENSE2_MUX_SEL_S 26 +/* RTC_IO_SENSE3_MUX_SEL : R/W ;bitpos:[25] ;default: 1'd0 ; */ +/*description: Ò1Ó select the digital function Ó0Óslection the rtc function*/ +#define RTC_IO_SENSE3_MUX_SEL (BIT(25)) +#define RTC_IO_SENSE3_MUX_SEL_M (BIT(25)) +#define RTC_IO_SENSE3_MUX_SEL_V 0x1 +#define RTC_IO_SENSE3_MUX_SEL_S 25 +/* RTC_IO_SENSE4_MUX_SEL : R/W ;bitpos:[24] ;default: 1'd0 ; */ +/*description: Ò1Ó select the digital function Ó0Óslection the rtc function*/ +#define RTC_IO_SENSE4_MUX_SEL (BIT(24)) +#define RTC_IO_SENSE4_MUX_SEL_M (BIT(24)) +#define RTC_IO_SENSE4_MUX_SEL_V 0x1 +#define RTC_IO_SENSE4_MUX_SEL_S 24 +/* RTC_IO_SENSE1_FUN_SEL : R/W ;bitpos:[23:22] ;default: 2'd0 ; */ +/*description: the functional selection signal of the pad*/ +#define RTC_IO_SENSE1_FUN_SEL 0x00000003 +#define RTC_IO_SENSE1_FUN_SEL_M ((RTC_IO_SENSE1_FUN_SEL_V)<<(RTC_IO_SENSE1_FUN_SEL_S)) +#define RTC_IO_SENSE1_FUN_SEL_V 0x3 +#define RTC_IO_SENSE1_FUN_SEL_S 22 +/* RTC_IO_SENSE1_SLP_SEL : R/W ;bitpos:[21] ;default: 1'd0 ; */ +/*description: the sleep status selection signal of the pad*/ +#define RTC_IO_SENSE1_SLP_SEL (BIT(21)) +#define RTC_IO_SENSE1_SLP_SEL_M (BIT(21)) +#define RTC_IO_SENSE1_SLP_SEL_V 0x1 +#define RTC_IO_SENSE1_SLP_SEL_S 21 +/* RTC_IO_SENSE1_SLP_IE : R/W ;bitpos:[20] ;default: 1'd0 ; */ +/*description: the input enable of the pad in sleep status*/ +#define RTC_IO_SENSE1_SLP_IE (BIT(20)) +#define RTC_IO_SENSE1_SLP_IE_M (BIT(20)) +#define RTC_IO_SENSE1_SLP_IE_V 0x1 +#define RTC_IO_SENSE1_SLP_IE_S 20 +/* RTC_IO_SENSE1_FUN_IE : R/W ;bitpos:[19] ;default: 1'd0 ; */ +/*description: the input enable of the pad*/ +#define RTC_IO_SENSE1_FUN_IE (BIT(19)) +#define RTC_IO_SENSE1_FUN_IE_M (BIT(19)) +#define RTC_IO_SENSE1_FUN_IE_V 0x1 +#define RTC_IO_SENSE1_FUN_IE_S 19 +/* RTC_IO_SENSE2_FUN_SEL : R/W ;bitpos:[18:17] ;default: 2'd0 ; */ +/*description: the functional selection signal of the pad*/ +#define RTC_IO_SENSE2_FUN_SEL 0x00000003 +#define RTC_IO_SENSE2_FUN_SEL_M ((RTC_IO_SENSE2_FUN_SEL_V)<<(RTC_IO_SENSE2_FUN_SEL_S)) +#define RTC_IO_SENSE2_FUN_SEL_V 0x3 +#define RTC_IO_SENSE2_FUN_SEL_S 17 +/* RTC_IO_SENSE2_SLP_SEL : R/W ;bitpos:[16] ;default: 1'd0 ; */ +/*description: the sleep status selection signal of the pad*/ +#define RTC_IO_SENSE2_SLP_SEL (BIT(16)) +#define RTC_IO_SENSE2_SLP_SEL_M (BIT(16)) +#define RTC_IO_SENSE2_SLP_SEL_V 0x1 +#define RTC_IO_SENSE2_SLP_SEL_S 16 +/* RTC_IO_SENSE2_SLP_IE : R/W ;bitpos:[15] ;default: 1'd0 ; */ +/*description: the input enable of the pad in sleep status*/ +#define RTC_IO_SENSE2_SLP_IE (BIT(15)) +#define RTC_IO_SENSE2_SLP_IE_M (BIT(15)) +#define RTC_IO_SENSE2_SLP_IE_V 0x1 +#define RTC_IO_SENSE2_SLP_IE_S 15 +/* RTC_IO_SENSE2_FUN_IE : R/W ;bitpos:[14] ;default: 1'd0 ; */ +/*description: the input enable of the pad*/ +#define RTC_IO_SENSE2_FUN_IE (BIT(14)) +#define RTC_IO_SENSE2_FUN_IE_M (BIT(14)) +#define RTC_IO_SENSE2_FUN_IE_V 0x1 +#define RTC_IO_SENSE2_FUN_IE_S 14 +/* RTC_IO_SENSE3_FUN_SEL : R/W ;bitpos:[13:12] ;default: 2'd0 ; */ +/*description: the functional selection signal of the pad*/ +#define RTC_IO_SENSE3_FUN_SEL 0x00000003 +#define RTC_IO_SENSE3_FUN_SEL_M ((RTC_IO_SENSE3_FUN_SEL_V)<<(RTC_IO_SENSE3_FUN_SEL_S)) +#define RTC_IO_SENSE3_FUN_SEL_V 0x3 +#define RTC_IO_SENSE3_FUN_SEL_S 12 +/* RTC_IO_SENSE3_SLP_SEL : R/W ;bitpos:[11] ;default: 1'd0 ; */ +/*description: the sleep status selection signal of the pad*/ +#define RTC_IO_SENSE3_SLP_SEL (BIT(11)) +#define RTC_IO_SENSE3_SLP_SEL_M (BIT(11)) +#define RTC_IO_SENSE3_SLP_SEL_V 0x1 +#define RTC_IO_SENSE3_SLP_SEL_S 11 +/* RTC_IO_SENSE3_SLP_IE : R/W ;bitpos:[10] ;default: 1'd0 ; */ +/*description: the input enable of the pad in sleep status*/ +#define RTC_IO_SENSE3_SLP_IE (BIT(10)) +#define RTC_IO_SENSE3_SLP_IE_M (BIT(10)) +#define RTC_IO_SENSE3_SLP_IE_V 0x1 +#define RTC_IO_SENSE3_SLP_IE_S 10 +/* RTC_IO_SENSE3_FUN_IE : R/W ;bitpos:[9] ;default: 1'd0 ; */ +/*description: the input enable of the pad*/ +#define RTC_IO_SENSE3_FUN_IE (BIT(9)) +#define RTC_IO_SENSE3_FUN_IE_M (BIT(9)) +#define RTC_IO_SENSE3_FUN_IE_V 0x1 +#define RTC_IO_SENSE3_FUN_IE_S 9 +/* RTC_IO_SENSE4_FUN_SEL : R/W ;bitpos:[8:7] ;default: 2'd0 ; */ +/*description: the functional selection signal of the pad*/ +#define RTC_IO_SENSE4_FUN_SEL 0x00000003 +#define RTC_IO_SENSE4_FUN_SEL_M ((RTC_IO_SENSE4_FUN_SEL_V)<<(RTC_IO_SENSE4_FUN_SEL_S)) +#define RTC_IO_SENSE4_FUN_SEL_V 0x3 +#define RTC_IO_SENSE4_FUN_SEL_S 7 +/* RTC_IO_SENSE4_SLP_SEL : R/W ;bitpos:[6] ;default: 1'd0 ; */ +/*description: the sleep status selection signal of the pad*/ +#define RTC_IO_SENSE4_SLP_SEL (BIT(6)) +#define RTC_IO_SENSE4_SLP_SEL_M (BIT(6)) +#define RTC_IO_SENSE4_SLP_SEL_V 0x1 +#define RTC_IO_SENSE4_SLP_SEL_S 6 +/* RTC_IO_SENSE4_SLP_IE : R/W ;bitpos:[5] ;default: 1'd0 ; */ +/*description: the input enable of the pad in sleep status*/ +#define RTC_IO_SENSE4_SLP_IE (BIT(5)) +#define RTC_IO_SENSE4_SLP_IE_M (BIT(5)) +#define RTC_IO_SENSE4_SLP_IE_V 0x1 +#define RTC_IO_SENSE4_SLP_IE_S 5 +/* RTC_IO_SENSE4_FUN_IE : R/W ;bitpos:[4] ;default: 1'd0 ; */ +/*description: the input enable of the pad*/ +#define RTC_IO_SENSE4_FUN_IE (BIT(4)) +#define RTC_IO_SENSE4_FUN_IE_M (BIT(4)) +#define RTC_IO_SENSE4_FUN_IE_V 0x1 +#define RTC_IO_SENSE4_FUN_IE_S 4 + +#define RTC_IO_ADC_PAD_REG (DR_REG_RTCIO_BASE + 0x80) +/* RTC_IO_ADC1_HOLD : R/W ;bitpos:[31] ;default: 1'd0 ; */ +/*description: hold the current value of the output when setting the hold to Ò1Ó*/ +#define RTC_IO_ADC1_HOLD (BIT(31)) +#define RTC_IO_ADC1_HOLD_M (BIT(31)) +#define RTC_IO_ADC1_HOLD_V 0x1 +#define RTC_IO_ADC1_HOLD_S 31 +/* RTC_IO_ADC2_HOLD : R/W ;bitpos:[30] ;default: 1'd0 ; */ +/*description: hold the current value of the output when setting the hold to Ò1Ó*/ +#define RTC_IO_ADC2_HOLD (BIT(30)) +#define RTC_IO_ADC2_HOLD_M (BIT(30)) +#define RTC_IO_ADC2_HOLD_V 0x1 +#define RTC_IO_ADC2_HOLD_S 30 +/* RTC_IO_ADC1_MUX_SEL : R/W ;bitpos:[29] ;default: 1'd0 ; */ +/*description: Ò1Ó select the digital function Ó0Óslection the rtc function*/ +#define RTC_IO_ADC1_MUX_SEL (BIT(29)) +#define RTC_IO_ADC1_MUX_SEL_M (BIT(29)) +#define RTC_IO_ADC1_MUX_SEL_V 0x1 +#define RTC_IO_ADC1_MUX_SEL_S 29 +/* RTC_IO_ADC2_MUX_SEL : R/W ;bitpos:[28] ;default: 1'd0 ; */ +/*description: Ò1Ó select the digital function Ó0Óslection the rtc function*/ +#define RTC_IO_ADC2_MUX_SEL (BIT(28)) +#define RTC_IO_ADC2_MUX_SEL_M (BIT(28)) +#define RTC_IO_ADC2_MUX_SEL_V 0x1 +#define RTC_IO_ADC2_MUX_SEL_S 28 +/* RTC_IO_ADC1_FUN_SEL : R/W ;bitpos:[27:26] ;default: 2'd0 ; */ +/*description: the functional selection signal of the pad*/ +#define RTC_IO_ADC1_FUN_SEL 0x00000003 +#define RTC_IO_ADC1_FUN_SEL_M ((RTC_IO_ADC1_FUN_SEL_V)<<(RTC_IO_ADC1_FUN_SEL_S)) +#define RTC_IO_ADC1_FUN_SEL_V 0x3 +#define RTC_IO_ADC1_FUN_SEL_S 26 +/* RTC_IO_ADC1_SLP_SEL : R/W ;bitpos:[25] ;default: 1'd0 ; */ +/*description: the sleep status selection signal of the pad*/ +#define RTC_IO_ADC1_SLP_SEL (BIT(25)) +#define RTC_IO_ADC1_SLP_SEL_M (BIT(25)) +#define RTC_IO_ADC1_SLP_SEL_V 0x1 +#define RTC_IO_ADC1_SLP_SEL_S 25 +/* RTC_IO_ADC1_SLP_IE : R/W ;bitpos:[24] ;default: 1'd0 ; */ +/*description: the input enable of the pad in sleep status*/ +#define RTC_IO_ADC1_SLP_IE (BIT(24)) +#define RTC_IO_ADC1_SLP_IE_M (BIT(24)) +#define RTC_IO_ADC1_SLP_IE_V 0x1 +#define RTC_IO_ADC1_SLP_IE_S 24 +/* RTC_IO_ADC1_FUN_IE : R/W ;bitpos:[23] ;default: 1'd0 ; */ +/*description: the input enable of the pad*/ +#define RTC_IO_ADC1_FUN_IE (BIT(23)) +#define RTC_IO_ADC1_FUN_IE_M (BIT(23)) +#define RTC_IO_ADC1_FUN_IE_V 0x1 +#define RTC_IO_ADC1_FUN_IE_S 23 +/* RTC_IO_ADC2_FUN_SEL : R/W ;bitpos:[22:21] ;default: 2'd0 ; */ +/*description: the functional selection signal of the pad*/ +#define RTC_IO_ADC2_FUN_SEL 0x00000003 +#define RTC_IO_ADC2_FUN_SEL_M ((RTC_IO_ADC2_FUN_SEL_V)<<(RTC_IO_ADC2_FUN_SEL_S)) +#define RTC_IO_ADC2_FUN_SEL_V 0x3 +#define RTC_IO_ADC2_FUN_SEL_S 21 +/* RTC_IO_ADC2_SLP_SEL : R/W ;bitpos:[20] ;default: 1'd0 ; */ +/*description: the sleep status selection signal of the pad*/ +#define RTC_IO_ADC2_SLP_SEL (BIT(20)) +#define RTC_IO_ADC2_SLP_SEL_M (BIT(20)) +#define RTC_IO_ADC2_SLP_SEL_V 0x1 +#define RTC_IO_ADC2_SLP_SEL_S 20 +/* RTC_IO_ADC2_SLP_IE : R/W ;bitpos:[19] ;default: 1'd0 ; */ +/*description: the input enable of the pad in sleep status*/ +#define RTC_IO_ADC2_SLP_IE (BIT(19)) +#define RTC_IO_ADC2_SLP_IE_M (BIT(19)) +#define RTC_IO_ADC2_SLP_IE_V 0x1 +#define RTC_IO_ADC2_SLP_IE_S 19 +/* RTC_IO_ADC2_FUN_IE : R/W ;bitpos:[18] ;default: 1'd0 ; */ +/*description: the input enable of the pad*/ +#define RTC_IO_ADC2_FUN_IE (BIT(18)) +#define RTC_IO_ADC2_FUN_IE_M (BIT(18)) +#define RTC_IO_ADC2_FUN_IE_V 0x1 +#define RTC_IO_ADC2_FUN_IE_S 18 + +#define RTC_IO_PAD_DAC1_REG (DR_REG_RTCIO_BASE + 0x84) +/* RTC_IO_PDAC1_DRV : R/W ;bitpos:[31:30] ;default: 2'd2 ; */ +/*description: the driver strength of the pad*/ +#define RTC_IO_PDAC1_DRV 0x00000003 +#define RTC_IO_PDAC1_DRV_M ((RTC_IO_PDAC1_DRV_V)<<(RTC_IO_PDAC1_DRV_S)) +#define RTC_IO_PDAC1_DRV_V 0x3 +#define RTC_IO_PDAC1_DRV_S 30 +/* RTC_IO_PDAC1_HOLD : R/W ;bitpos:[29] ;default: 1'd0 ; */ +/*description: hold the current value of the output when setting the hold to Ò1Ó*/ +#define RTC_IO_PDAC1_HOLD (BIT(29)) +#define RTC_IO_PDAC1_HOLD_M (BIT(29)) +#define RTC_IO_PDAC1_HOLD_V 0x1 +#define RTC_IO_PDAC1_HOLD_S 29 +/* RTC_IO_PDAC1_RDE : R/W ;bitpos:[28] ;default: 1'd0 ; */ +/*description: the pull down enable of the pad*/ +#define RTC_IO_PDAC1_RDE (BIT(28)) +#define RTC_IO_PDAC1_RDE_M (BIT(28)) +#define RTC_IO_PDAC1_RDE_V 0x1 +#define RTC_IO_PDAC1_RDE_S 28 +/* RTC_IO_PDAC1_RUE : R/W ;bitpos:[27] ;default: 1'd0 ; */ +/*description: the pull up enable of the pad*/ +#define RTC_IO_PDAC1_RUE (BIT(27)) +#define RTC_IO_PDAC1_RUE_M (BIT(27)) +#define RTC_IO_PDAC1_RUE_V 0x1 +#define RTC_IO_PDAC1_RUE_S 27 +/* RTC_IO_PDAC1_DAC : R/W ;bitpos:[26:19] ;default: 8'd0 ; */ +/*description: PAD DAC1 control code.*/ +#define RTC_IO_PDAC1_DAC 0x000000FF +#define RTC_IO_PDAC1_DAC_M ((RTC_IO_PDAC1_DAC_V)<<(RTC_IO_PDAC1_DAC_S)) +#define RTC_IO_PDAC1_DAC_V 0xFF +#define RTC_IO_PDAC1_DAC_S 19 +/* RTC_IO_PDAC1_XPD_DAC : R/W ;bitpos:[18] ;default: 1'd0 ; */ +/*description: Power on DAC1. Usually we need to tristate PDAC1 if we power + on the DAC i.e. IE=0 OE=0 RDE=0 RUE=0*/ +#define RTC_IO_PDAC1_XPD_DAC (BIT(18)) +#define RTC_IO_PDAC1_XPD_DAC_M (BIT(18)) +#define RTC_IO_PDAC1_XPD_DAC_V 0x1 +#define RTC_IO_PDAC1_XPD_DAC_S 18 +/* RTC_IO_PDAC1_MUX_SEL : R/W ;bitpos:[17] ;default: 1'd0 ; */ +/*description: Ò1Ó select the digital function Ó0Óslection the rtc function*/ +#define RTC_IO_PDAC1_MUX_SEL (BIT(17)) +#define RTC_IO_PDAC1_MUX_SEL_M (BIT(17)) +#define RTC_IO_PDAC1_MUX_SEL_V 0x1 +#define RTC_IO_PDAC1_MUX_SEL_S 17 +/* RTC_IO_PDAC1_FUN_SEL : R/W ;bitpos:[16:15] ;default: 2'd0 ; */ +/*description: the functional selection signal of the pad*/ +#define RTC_IO_PDAC1_FUN_SEL 0x00000003 +#define RTC_IO_PDAC1_FUN_SEL_M ((RTC_IO_PDAC1_FUN_SEL_V)<<(RTC_IO_PDAC1_FUN_SEL_S)) +#define RTC_IO_PDAC1_FUN_SEL_V 0x3 +#define RTC_IO_PDAC1_FUN_SEL_S 15 +/* RTC_IO_PDAC1_SLP_SEL : R/W ;bitpos:[14] ;default: 1'd0 ; */ +/*description: the sleep status selection signal of the pad*/ +#define RTC_IO_PDAC1_SLP_SEL (BIT(14)) +#define RTC_IO_PDAC1_SLP_SEL_M (BIT(14)) +#define RTC_IO_PDAC1_SLP_SEL_V 0x1 +#define RTC_IO_PDAC1_SLP_SEL_S 14 +/* RTC_IO_PDAC1_SLP_IE : R/W ;bitpos:[13] ;default: 1'd0 ; */ +/*description: the input enable of the pad in sleep status*/ +#define RTC_IO_PDAC1_SLP_IE (BIT(13)) +#define RTC_IO_PDAC1_SLP_IE_M (BIT(13)) +#define RTC_IO_PDAC1_SLP_IE_V 0x1 +#define RTC_IO_PDAC1_SLP_IE_S 13 +/* RTC_IO_PDAC1_SLP_OE : R/W ;bitpos:[12] ;default: 1'd0 ; */ +/*description: the output enable of the pad in sleep status*/ +#define RTC_IO_PDAC1_SLP_OE (BIT(12)) +#define RTC_IO_PDAC1_SLP_OE_M (BIT(12)) +#define RTC_IO_PDAC1_SLP_OE_V 0x1 +#define RTC_IO_PDAC1_SLP_OE_S 12 +/* RTC_IO_PDAC1_FUN_IE : R/W ;bitpos:[11] ;default: 1'd0 ; */ +/*description: the input enable of the pad*/ +#define RTC_IO_PDAC1_FUN_IE (BIT(11)) +#define RTC_IO_PDAC1_FUN_IE_M (BIT(11)) +#define RTC_IO_PDAC1_FUN_IE_V 0x1 +#define RTC_IO_PDAC1_FUN_IE_S 11 +/* RTC_IO_PDAC1_DAC_XPD_FORCE : R/W ;bitpos:[10] ;default: 1'd0 ; */ +/*description: Power on DAC1. Usually we need to tristate PDAC1 if we power + on the DAC i.e. IE=0 OE=0 RDE=0 RUE=0*/ +#define RTC_IO_PDAC1_DAC_XPD_FORCE (BIT(10)) +#define RTC_IO_PDAC1_DAC_XPD_FORCE_M (BIT(10)) +#define RTC_IO_PDAC1_DAC_XPD_FORCE_V 0x1 +#define RTC_IO_PDAC1_DAC_XPD_FORCE_S 10 + +#define RTC_IO_PAD_DAC2_REG (DR_REG_RTCIO_BASE + 0x88) +/* RTC_IO_PDAC2_DRV : R/W ;bitpos:[31:30] ;default: 2'd2 ; */ +/*description: the driver strength of the pad*/ +#define RTC_IO_PDAC2_DRV 0x00000003 +#define RTC_IO_PDAC2_DRV_M ((RTC_IO_PDAC2_DRV_V)<<(RTC_IO_PDAC2_DRV_S)) +#define RTC_IO_PDAC2_DRV_V 0x3 +#define RTC_IO_PDAC2_DRV_S 30 +/* RTC_IO_PDAC2_HOLD : R/W ;bitpos:[29] ;default: 1'd0 ; */ +/*description: hold the current value of the output when setting the hold to Ò1Ó*/ +#define RTC_IO_PDAC2_HOLD (BIT(29)) +#define RTC_IO_PDAC2_HOLD_M (BIT(29)) +#define RTC_IO_PDAC2_HOLD_V 0x1 +#define RTC_IO_PDAC2_HOLD_S 29 +/* RTC_IO_PDAC2_RDE : R/W ;bitpos:[28] ;default: 1'd0 ; */ +/*description: the pull down enable of the pad*/ +#define RTC_IO_PDAC2_RDE (BIT(28)) +#define RTC_IO_PDAC2_RDE_M (BIT(28)) +#define RTC_IO_PDAC2_RDE_V 0x1 +#define RTC_IO_PDAC2_RDE_S 28 +/* RTC_IO_PDAC2_RUE : R/W ;bitpos:[27] ;default: 1'd0 ; */ +/*description: the pull up enable of the pad*/ +#define RTC_IO_PDAC2_RUE (BIT(27)) +#define RTC_IO_PDAC2_RUE_M (BIT(27)) +#define RTC_IO_PDAC2_RUE_V 0x1 +#define RTC_IO_PDAC2_RUE_S 27 +/* RTC_IO_PDAC2_DAC : R/W ;bitpos:[26:19] ;default: 8'd0 ; */ +/*description: PAD DAC2 control code.*/ +#define RTC_IO_PDAC2_DAC 0x000000FF +#define RTC_IO_PDAC2_DAC_M ((RTC_IO_PDAC2_DAC_V)<<(RTC_IO_PDAC2_DAC_S)) +#define RTC_IO_PDAC2_DAC_V 0xFF +#define RTC_IO_PDAC2_DAC_S 19 +/* RTC_IO_PDAC2_XPD_DAC : R/W ;bitpos:[18] ;default: 1'd0 ; */ +/*description: Power on DAC2. Usually we need to tristate PDAC1 if we power + on the DAC i.e. IE=0 OE=0 RDE=0 RUE=0*/ +#define RTC_IO_PDAC2_XPD_DAC (BIT(18)) +#define RTC_IO_PDAC2_XPD_DAC_M (BIT(18)) +#define RTC_IO_PDAC2_XPD_DAC_V 0x1 +#define RTC_IO_PDAC2_XPD_DAC_S 18 +/* RTC_IO_PDAC2_MUX_SEL : R/W ;bitpos:[17] ;default: 1'd0 ; */ +/*description: Ò1Ó select the digital function Ó0Óslection the rtc function*/ +#define RTC_IO_PDAC2_MUX_SEL (BIT(17)) +#define RTC_IO_PDAC2_MUX_SEL_M (BIT(17)) +#define RTC_IO_PDAC2_MUX_SEL_V 0x1 +#define RTC_IO_PDAC2_MUX_SEL_S 17 +/* RTC_IO_PDAC2_FUN_SEL : R/W ;bitpos:[16:15] ;default: 2'd0 ; */ +/*description: the functional selection signal of the pad*/ +#define RTC_IO_PDAC2_FUN_SEL 0x00000003 +#define RTC_IO_PDAC2_FUN_SEL_M ((RTC_IO_PDAC2_FUN_SEL_V)<<(RTC_IO_PDAC2_FUN_SEL_S)) +#define RTC_IO_PDAC2_FUN_SEL_V 0x3 +#define RTC_IO_PDAC2_FUN_SEL_S 15 +/* RTC_IO_PDAC2_SLP_SEL : R/W ;bitpos:[14] ;default: 1'd0 ; */ +/*description: the sleep status selection signal of the pad*/ +#define RTC_IO_PDAC2_SLP_SEL (BIT(14)) +#define RTC_IO_PDAC2_SLP_SEL_M (BIT(14)) +#define RTC_IO_PDAC2_SLP_SEL_V 0x1 +#define RTC_IO_PDAC2_SLP_SEL_S 14 +/* RTC_IO_PDAC2_SLP_IE : R/W ;bitpos:[13] ;default: 1'd0 ; */ +/*description: the input enable of the pad in sleep status*/ +#define RTC_IO_PDAC2_SLP_IE (BIT(13)) +#define RTC_IO_PDAC2_SLP_IE_M (BIT(13)) +#define RTC_IO_PDAC2_SLP_IE_V 0x1 +#define RTC_IO_PDAC2_SLP_IE_S 13 +/* RTC_IO_PDAC2_SLP_OE : R/W ;bitpos:[12] ;default: 1'd0 ; */ +/*description: the output enable of the pad in sleep status*/ +#define RTC_IO_PDAC2_SLP_OE (BIT(12)) +#define RTC_IO_PDAC2_SLP_OE_M (BIT(12)) +#define RTC_IO_PDAC2_SLP_OE_V 0x1 +#define RTC_IO_PDAC2_SLP_OE_S 12 +/* RTC_IO_PDAC2_FUN_IE : R/W ;bitpos:[11] ;default: 1'd0 ; */ +/*description: the input enable of the pad*/ +#define RTC_IO_PDAC2_FUN_IE (BIT(11)) +#define RTC_IO_PDAC2_FUN_IE_M (BIT(11)) +#define RTC_IO_PDAC2_FUN_IE_V 0x1 +#define RTC_IO_PDAC2_FUN_IE_S 11 +/* RTC_IO_PDAC2_DAC_XPD_FORCE : R/W ;bitpos:[10] ;default: 1'd0 ; */ +/*description: Power on DAC2. Usually we need to tristate PDAC2 if we power + on the DAC i.e. IE=0 OE=0 RDE=0 RUE=0*/ +#define RTC_IO_PDAC2_DAC_XPD_FORCE (BIT(10)) +#define RTC_IO_PDAC2_DAC_XPD_FORCE_M (BIT(10)) +#define RTC_IO_PDAC2_DAC_XPD_FORCE_V 0x1 +#define RTC_IO_PDAC2_DAC_XPD_FORCE_S 10 + +#define RTC_IO_XTAL_32K_PAD_REG (DR_REG_RTCIO_BASE + 0x8c) +/* RTC_IO_X32N_DRV : R/W ;bitpos:[31:30] ;default: 2'd2 ; */ +/*description: the driver strength of the pad*/ +#define RTC_IO_X32N_DRV 0x00000003 +#define RTC_IO_X32N_DRV_M ((RTC_IO_X32N_DRV_V)<<(RTC_IO_X32N_DRV_S)) +#define RTC_IO_X32N_DRV_V 0x3 +#define RTC_IO_X32N_DRV_S 30 +/* RTC_IO_X32N_HOLD : R/W ;bitpos:[29] ;default: 1'd0 ; */ +/*description: hold the current value of the output when setting the hold to Ò1Ó*/ +#define RTC_IO_X32N_HOLD (BIT(29)) +#define RTC_IO_X32N_HOLD_M (BIT(29)) +#define RTC_IO_X32N_HOLD_V 0x1 +#define RTC_IO_X32N_HOLD_S 29 +/* RTC_IO_X32N_RDE : R/W ;bitpos:[28] ;default: 1'd0 ; */ +/*description: the pull down enable of the pad*/ +#define RTC_IO_X32N_RDE (BIT(28)) +#define RTC_IO_X32N_RDE_M (BIT(28)) +#define RTC_IO_X32N_RDE_V 0x1 +#define RTC_IO_X32N_RDE_S 28 +/* RTC_IO_X32N_RUE : R/W ;bitpos:[27] ;default: 1'd0 ; */ +/*description: the pull up enable of the pad*/ +#define RTC_IO_X32N_RUE (BIT(27)) +#define RTC_IO_X32N_RUE_M (BIT(27)) +#define RTC_IO_X32N_RUE_V 0x1 +#define RTC_IO_X32N_RUE_S 27 +/* RTC_IO_X32P_DRV : R/W ;bitpos:[26:25] ;default: 2'd2 ; */ +/*description: the driver strength of the pad*/ +#define RTC_IO_X32P_DRV 0x00000003 +#define RTC_IO_X32P_DRV_M ((RTC_IO_X32P_DRV_V)<<(RTC_IO_X32P_DRV_S)) +#define RTC_IO_X32P_DRV_V 0x3 +#define RTC_IO_X32P_DRV_S 25 +/* RTC_IO_X32P_HOLD : R/W ;bitpos:[24] ;default: 1'd0 ; */ +/*description: hold the current value of the output when setting the hold to Ò1Ó*/ +#define RTC_IO_X32P_HOLD (BIT(24)) +#define RTC_IO_X32P_HOLD_M (BIT(24)) +#define RTC_IO_X32P_HOLD_V 0x1 +#define RTC_IO_X32P_HOLD_S 24 +/* RTC_IO_X32P_RDE : R/W ;bitpos:[23] ;default: 1'd0 ; */ +/*description: the pull down enable of the pad*/ +#define RTC_IO_X32P_RDE (BIT(23)) +#define RTC_IO_X32P_RDE_M (BIT(23)) +#define RTC_IO_X32P_RDE_V 0x1 +#define RTC_IO_X32P_RDE_S 23 +/* RTC_IO_X32P_RUE : R/W ;bitpos:[22] ;default: 1'd0 ; */ +/*description: the pull up enable of the pad*/ +#define RTC_IO_X32P_RUE (BIT(22)) +#define RTC_IO_X32P_RUE_M (BIT(22)) +#define RTC_IO_X32P_RUE_V 0x1 +#define RTC_IO_X32P_RUE_S 22 +/* RTC_IO_DAC_XTAL_32K : R/W ;bitpos:[21:20] ;default: 2'b01 ; */ +/*description: 32K XTAL bias current DAC.*/ +#define RTC_IO_DAC_XTAL_32K 0x00000003 +#define RTC_IO_DAC_XTAL_32K_M ((RTC_IO_DAC_XTAL_32K_V)<<(RTC_IO_DAC_XTAL_32K_S)) +#define RTC_IO_DAC_XTAL_32K_V 0x3 +#define RTC_IO_DAC_XTAL_32K_S 20 +/* RTC_IO_XPD_XTAL_32K : R/W ;bitpos:[19] ;default: 1'd0 ; */ +/*description: Power up 32kHz crystal oscillator*/ +#define RTC_IO_XPD_XTAL_32K (BIT(19)) +#define RTC_IO_XPD_XTAL_32K_M (BIT(19)) +#define RTC_IO_XPD_XTAL_32K_V 0x1 +#define RTC_IO_XPD_XTAL_32K_S 19 +/* RTC_IO_X32N_MUX_SEL : R/W ;bitpos:[18] ;default: 1'd0 ; */ +/*description: Ò1Ó select the digital function Ó0Óslection the rtc function*/ +#define RTC_IO_X32N_MUX_SEL (BIT(18)) +#define RTC_IO_X32N_MUX_SEL_M (BIT(18)) +#define RTC_IO_X32N_MUX_SEL_V 0x1 +#define RTC_IO_X32N_MUX_SEL_S 18 +/* RTC_IO_X32P_MUX_SEL : R/W ;bitpos:[17] ;default: 1'd0 ; */ +/*description: Ò1Ó select the digital function Ó0Óslection the rtc function*/ +#define RTC_IO_X32P_MUX_SEL (BIT(17)) +#define RTC_IO_X32P_MUX_SEL_M (BIT(17)) +#define RTC_IO_X32P_MUX_SEL_V 0x1 +#define RTC_IO_X32P_MUX_SEL_S 17 +/* RTC_IO_X32N_FUN_SEL : R/W ;bitpos:[16:15] ;default: 2'd0 ; */ +/*description: the functional selection signal of the pad*/ +#define RTC_IO_X32N_FUN_SEL 0x00000003 +#define RTC_IO_X32N_FUN_SEL_M ((RTC_IO_X32N_FUN_SEL_V)<<(RTC_IO_X32N_FUN_SEL_S)) +#define RTC_IO_X32N_FUN_SEL_V 0x3 +#define RTC_IO_X32N_FUN_SEL_S 15 +/* RTC_IO_X32N_SLP_SEL : R/W ;bitpos:[14] ;default: 1'd0 ; */ +/*description: the sleep status selection signal of the pad*/ +#define RTC_IO_X32N_SLP_SEL (BIT(14)) +#define RTC_IO_X32N_SLP_SEL_M (BIT(14)) +#define RTC_IO_X32N_SLP_SEL_V 0x1 +#define RTC_IO_X32N_SLP_SEL_S 14 +/* RTC_IO_X32N_SLP_IE : R/W ;bitpos:[13] ;default: 1'd0 ; */ +/*description: the input enable of the pad in sleep status*/ +#define RTC_IO_X32N_SLP_IE (BIT(13)) +#define RTC_IO_X32N_SLP_IE_M (BIT(13)) +#define RTC_IO_X32N_SLP_IE_V 0x1 +#define RTC_IO_X32N_SLP_IE_S 13 +/* RTC_IO_X32N_SLP_OE : R/W ;bitpos:[12] ;default: 1'd0 ; */ +/*description: the output enable of the pad in sleep status*/ +#define RTC_IO_X32N_SLP_OE (BIT(12)) +#define RTC_IO_X32N_SLP_OE_M (BIT(12)) +#define RTC_IO_X32N_SLP_OE_V 0x1 +#define RTC_IO_X32N_SLP_OE_S 12 +/* RTC_IO_X32N_FUN_IE : R/W ;bitpos:[11] ;default: 1'd0 ; */ +/*description: the input enable of the pad*/ +#define RTC_IO_X32N_FUN_IE (BIT(11)) +#define RTC_IO_X32N_FUN_IE_M (BIT(11)) +#define RTC_IO_X32N_FUN_IE_V 0x1 +#define RTC_IO_X32N_FUN_IE_S 11 +/* RTC_IO_X32P_FUN_SEL : R/W ;bitpos:[10:9] ;default: 2'd0 ; */ +/*description: the functional selection signal of the pad*/ +#define RTC_IO_X32P_FUN_SEL 0x00000003 +#define RTC_IO_X32P_FUN_SEL_M ((RTC_IO_X32P_FUN_SEL_V)<<(RTC_IO_X32P_FUN_SEL_S)) +#define RTC_IO_X32P_FUN_SEL_V 0x3 +#define RTC_IO_X32P_FUN_SEL_S 9 +/* RTC_IO_X32P_SLP_SEL : R/W ;bitpos:[8] ;default: 1'd0 ; */ +/*description: the sleep status selection signal of the pad*/ +#define RTC_IO_X32P_SLP_SEL (BIT(8)) +#define RTC_IO_X32P_SLP_SEL_M (BIT(8)) +#define RTC_IO_X32P_SLP_SEL_V 0x1 +#define RTC_IO_X32P_SLP_SEL_S 8 +/* RTC_IO_X32P_SLP_IE : R/W ;bitpos:[7] ;default: 1'd0 ; */ +/*description: the input enable of the pad in sleep status*/ +#define RTC_IO_X32P_SLP_IE (BIT(7)) +#define RTC_IO_X32P_SLP_IE_M (BIT(7)) +#define RTC_IO_X32P_SLP_IE_V 0x1 +#define RTC_IO_X32P_SLP_IE_S 7 +/* RTC_IO_X32P_SLP_OE : R/W ;bitpos:[6] ;default: 1'd0 ; */ +/*description: the output enable of the pad in sleep status*/ +#define RTC_IO_X32P_SLP_OE (BIT(6)) +#define RTC_IO_X32P_SLP_OE_M (BIT(6)) +#define RTC_IO_X32P_SLP_OE_V 0x1 +#define RTC_IO_X32P_SLP_OE_S 6 +/* RTC_IO_X32P_FUN_IE : R/W ;bitpos:[5] ;default: 1'd0 ; */ +/*description: the input enable of the pad*/ +#define RTC_IO_X32P_FUN_IE (BIT(5)) +#define RTC_IO_X32P_FUN_IE_M (BIT(5)) +#define RTC_IO_X32P_FUN_IE_V 0x1 +#define RTC_IO_X32P_FUN_IE_S 5 +/* RTC_IO_DRES_XTAL_32K : R/W ;bitpos:[4:3] ;default: 2'b10 ; */ +/*description: 32K XTAL resistor bias control.*/ +#define RTC_IO_DRES_XTAL_32K 0x00000003 +#define RTC_IO_DRES_XTAL_32K_M ((RTC_IO_DRES_XTAL_32K_V)<<(RTC_IO_DRES_XTAL_32K_S)) +#define RTC_IO_DRES_XTAL_32K_V 0x3 +#define RTC_IO_DRES_XTAL_32K_S 3 +/* RTC_IO_DBIAS_XTAL_32K : R/W ;bitpos:[2:1] ;default: 2'b00 ; */ +/*description: 32K XTAL self-bias reference control.*/ +#define RTC_IO_DBIAS_XTAL_32K 0x00000003 +#define RTC_IO_DBIAS_XTAL_32K_M ((RTC_IO_DBIAS_XTAL_32K_V)<<(RTC_IO_DBIAS_XTAL_32K_S)) +#define RTC_IO_DBIAS_XTAL_32K_V 0x3 +#define RTC_IO_DBIAS_XTAL_32K_S 1 + +#define RTC_IO_TOUCH_CFG_REG (DR_REG_RTCIO_BASE + 0x90) +/* RTC_IO_TOUCH_XPD_BIAS : R/W ;bitpos:[31] ;default: 1'd0 ; */ +/*description: touch sensor bias power on.*/ +#define RTC_IO_TOUCH_XPD_BIAS (BIT(31)) +#define RTC_IO_TOUCH_XPD_BIAS_M (BIT(31)) +#define RTC_IO_TOUCH_XPD_BIAS_V 0x1 +#define RTC_IO_TOUCH_XPD_BIAS_S 31 +/* RTC_IO_TOUCH_DREFH : R/W ;bitpos:[30:29] ;default: 2'b11 ; */ +/*description: touch sensor saw wave top voltage.*/ +#define RTC_IO_TOUCH_DREFH 0x00000003 +#define RTC_IO_TOUCH_DREFH_M ((RTC_IO_TOUCH_DREFH_V)<<(RTC_IO_TOUCH_DREFH_S)) +#define RTC_IO_TOUCH_DREFH_V 0x3 +#define RTC_IO_TOUCH_DREFH_S 29 +/* RTC_IO_TOUCH_DREFL : R/W ;bitpos:[28:27] ;default: 2'b00 ; */ +/*description: touch sensor saw wave bottom voltage.*/ +#define RTC_IO_TOUCH_DREFL 0x00000003 +#define RTC_IO_TOUCH_DREFL_M ((RTC_IO_TOUCH_DREFL_V)<<(RTC_IO_TOUCH_DREFL_S)) +#define RTC_IO_TOUCH_DREFL_V 0x3 +#define RTC_IO_TOUCH_DREFL_S 27 +/* RTC_IO_TOUCH_DRANGE : R/W ;bitpos:[26:25] ;default: 2'b11 ; */ +/*description: touch sensor saw wave voltage range.*/ +#define RTC_IO_TOUCH_DRANGE 0x00000003 +#define RTC_IO_TOUCH_DRANGE_M ((RTC_IO_TOUCH_DRANGE_V)<<(RTC_IO_TOUCH_DRANGE_S)) +#define RTC_IO_TOUCH_DRANGE_V 0x3 +#define RTC_IO_TOUCH_DRANGE_S 25 +/* RTC_IO_TOUCH_DCUR : R/W ;bitpos:[24:23] ;default: 2'b00 ; */ +/*description: touch sensor bias current. Should have option to tie with BIAS_SLEEP(When + BIAS_SLEEP this setting is available*/ +#define RTC_IO_TOUCH_DCUR 0x00000003 +#define RTC_IO_TOUCH_DCUR_M ((RTC_IO_TOUCH_DCUR_V)<<(RTC_IO_TOUCH_DCUR_S)) +#define RTC_IO_TOUCH_DCUR_V 0x3 +#define RTC_IO_TOUCH_DCUR_S 23 + +#define RTC_IO_TOUCH_PAD0_REG (DR_REG_RTCIO_BASE + 0x94) +/* RTC_IO_TOUCH_PAD0_HOLD : R/W ;bitpos:[31] ;default: 1'd0 ; */ +/*description: hold the current value of the output when setting the hold to Ò1Ó*/ +#define RTC_IO_TOUCH_PAD0_HOLD (BIT(31)) +#define RTC_IO_TOUCH_PAD0_HOLD_M (BIT(31)) +#define RTC_IO_TOUCH_PAD0_HOLD_V 0x1 +#define RTC_IO_TOUCH_PAD0_HOLD_S 31 +/* RTC_IO_TOUCH_PAD0_DRV : R/W ;bitpos:[30:29] ;default: 2'd2 ; */ +/*description: the driver strength of the pad*/ +#define RTC_IO_TOUCH_PAD0_DRV 0x00000003 +#define RTC_IO_TOUCH_PAD0_DRV_M ((RTC_IO_TOUCH_PAD0_DRV_V)<<(RTC_IO_TOUCH_PAD0_DRV_S)) +#define RTC_IO_TOUCH_PAD0_DRV_V 0x3 +#define RTC_IO_TOUCH_PAD0_DRV_S 29 +/* RTC_IO_TOUCH_PAD0_RDE : R/W ;bitpos:[28] ;default: 1'd1 ; */ +/*description: the pull down enable of the pad*/ +#define RTC_IO_TOUCH_PAD0_RDE (BIT(28)) +#define RTC_IO_TOUCH_PAD0_RDE_M (BIT(28)) +#define RTC_IO_TOUCH_PAD0_RDE_V 0x1 +#define RTC_IO_TOUCH_PAD0_RDE_S 28 +/* RTC_IO_TOUCH_PAD0_RUE : R/W ;bitpos:[27] ;default: 1'd0 ; */ +/*description: the pull up enable of the pad*/ +#define RTC_IO_TOUCH_PAD0_RUE (BIT(27)) +#define RTC_IO_TOUCH_PAD0_RUE_M (BIT(27)) +#define RTC_IO_TOUCH_PAD0_RUE_V 0x1 +#define RTC_IO_TOUCH_PAD0_RUE_S 27 +/* RTC_IO_TOUCH_PAD0_DAC : R/W ;bitpos:[25:23] ;default: 3'h4 ; */ +/*description: touch sensor slope control. 3-bit for each touch panel default 100.*/ +#define RTC_IO_TOUCH_PAD0_DAC 0x00000007 +#define RTC_IO_TOUCH_PAD0_DAC_M ((RTC_IO_TOUCH_PAD0_DAC_V)<<(RTC_IO_TOUCH_PAD0_DAC_S)) +#define RTC_IO_TOUCH_PAD0_DAC_V 0x7 +#define RTC_IO_TOUCH_PAD0_DAC_S 23 +/* RTC_IO_TOUCH_PAD0_START : R/W ;bitpos:[22] ;default: 1'd0 ; */ +/*description: start touch sensor.*/ +#define RTC_IO_TOUCH_PAD0_START (BIT(22)) +#define RTC_IO_TOUCH_PAD0_START_M (BIT(22)) +#define RTC_IO_TOUCH_PAD0_START_V 0x1 +#define RTC_IO_TOUCH_PAD0_START_S 22 +/* RTC_IO_TOUCH_PAD0_TIE_OPT : R/W ;bitpos:[21] ;default: 1'd0 ; */ +/*description: default touch sensor tie option. 0: tie low 1: tie high.*/ +#define RTC_IO_TOUCH_PAD0_TIE_OPT (BIT(21)) +#define RTC_IO_TOUCH_PAD0_TIE_OPT_M (BIT(21)) +#define RTC_IO_TOUCH_PAD0_TIE_OPT_V 0x1 +#define RTC_IO_TOUCH_PAD0_TIE_OPT_S 21 +/* RTC_IO_TOUCH_PAD0_XPD : R/W ;bitpos:[20] ;default: 1'd0 ; */ +/*description: touch sensor power on.*/ +#define RTC_IO_TOUCH_PAD0_XPD (BIT(20)) +#define RTC_IO_TOUCH_PAD0_XPD_M (BIT(20)) +#define RTC_IO_TOUCH_PAD0_XPD_V 0x1 +#define RTC_IO_TOUCH_PAD0_XPD_S 20 +/* RTC_IO_TOUCH_PAD0_MUX_SEL : R/W ;bitpos:[19] ;default: 1'd0 ; */ +/*description: Ò1Ó select the digital function Ó0Óslection the rtc function*/ +#define RTC_IO_TOUCH_PAD0_MUX_SEL (BIT(19)) +#define RTC_IO_TOUCH_PAD0_MUX_SEL_M (BIT(19)) +#define RTC_IO_TOUCH_PAD0_MUX_SEL_V 0x1 +#define RTC_IO_TOUCH_PAD0_MUX_SEL_S 19 +/* RTC_IO_TOUCH_PAD0_FUN_SEL : R/W ;bitpos:[18:17] ;default: 2'd0 ; */ +/*description: the functional selection signal of the pad*/ +#define RTC_IO_TOUCH_PAD0_FUN_SEL 0x00000003 +#define RTC_IO_TOUCH_PAD0_FUN_SEL_M ((RTC_IO_TOUCH_PAD0_FUN_SEL_V)<<(RTC_IO_TOUCH_PAD0_FUN_SEL_S)) +#define RTC_IO_TOUCH_PAD0_FUN_SEL_V 0x3 +#define RTC_IO_TOUCH_PAD0_FUN_SEL_S 17 +/* RTC_IO_TOUCH_PAD0_SLP_SEL : R/W ;bitpos:[16] ;default: 1'd0 ; */ +/*description: the sleep status selection signal of the pad*/ +#define RTC_IO_TOUCH_PAD0_SLP_SEL (BIT(16)) +#define RTC_IO_TOUCH_PAD0_SLP_SEL_M (BIT(16)) +#define RTC_IO_TOUCH_PAD0_SLP_SEL_V 0x1 +#define RTC_IO_TOUCH_PAD0_SLP_SEL_S 16 +/* RTC_IO_TOUCH_PAD0_SLP_IE : R/W ;bitpos:[15] ;default: 1'd0 ; */ +/*description: the input enable of the pad in sleep status*/ +#define RTC_IO_TOUCH_PAD0_SLP_IE (BIT(15)) +#define RTC_IO_TOUCH_PAD0_SLP_IE_M (BIT(15)) +#define RTC_IO_TOUCH_PAD0_SLP_IE_V 0x1 +#define RTC_IO_TOUCH_PAD0_SLP_IE_S 15 +/* RTC_IO_TOUCH_PAD0_SLP_OE : R/W ;bitpos:[14] ;default: 1'd0 ; */ +/*description: the output enable of the pad in sleep status*/ +#define RTC_IO_TOUCH_PAD0_SLP_OE (BIT(14)) +#define RTC_IO_TOUCH_PAD0_SLP_OE_M (BIT(14)) +#define RTC_IO_TOUCH_PAD0_SLP_OE_V 0x1 +#define RTC_IO_TOUCH_PAD0_SLP_OE_S 14 +/* RTC_IO_TOUCH_PAD0_FUN_IE : R/W ;bitpos:[13] ;default: 1'd0 ; */ +/*description: the input enable of the pad*/ +#define RTC_IO_TOUCH_PAD0_FUN_IE (BIT(13)) +#define RTC_IO_TOUCH_PAD0_FUN_IE_M (BIT(13)) +#define RTC_IO_TOUCH_PAD0_FUN_IE_V 0x1 +#define RTC_IO_TOUCH_PAD0_FUN_IE_S 13 +/* RTC_IO_TOUCH_PAD0_TO_GPIO : R/W ;bitpos:[12] ;default: 1'd0 ; */ +/*description: connect the rtc pad input to digital pad input Ó0Ó is availbale GPIO4*/ +#define RTC_IO_TOUCH_PAD0_TO_GPIO (BIT(12)) +#define RTC_IO_TOUCH_PAD0_TO_GPIO_M (BIT(12)) +#define RTC_IO_TOUCH_PAD0_TO_GPIO_V 0x1 +#define RTC_IO_TOUCH_PAD0_TO_GPIO_S 12 + +#define RTC_IO_TOUCH_PAD1_REG (DR_REG_RTCIO_BASE + 0x98) +/* RTC_IO_TOUCH_PAD1_HOLD : R/W ;bitpos:[31] ;default: 1'd0 ; */ +/*description: */ +#define RTC_IO_TOUCH_PAD1_HOLD (BIT(31)) +#define RTC_IO_TOUCH_PAD1_HOLD_M (BIT(31)) +#define RTC_IO_TOUCH_PAD1_HOLD_V 0x1 +#define RTC_IO_TOUCH_PAD1_HOLD_S 31 +/* RTC_IO_TOUCH_PAD1_DRV : R/W ;bitpos:[30:29] ;default: 2'd2 ; */ +/*description: the driver strength of the pad*/ +#define RTC_IO_TOUCH_PAD1_DRV 0x00000003 +#define RTC_IO_TOUCH_PAD1_DRV_M ((RTC_IO_TOUCH_PAD1_DRV_V)<<(RTC_IO_TOUCH_PAD1_DRV_S)) +#define RTC_IO_TOUCH_PAD1_DRV_V 0x3 +#define RTC_IO_TOUCH_PAD1_DRV_S 29 +/* RTC_IO_TOUCH_PAD1_RDE : R/W ;bitpos:[28] ;default: 1'd0 ; */ +/*description: the pull down enable of the pad*/ +#define RTC_IO_TOUCH_PAD1_RDE (BIT(28)) +#define RTC_IO_TOUCH_PAD1_RDE_M (BIT(28)) +#define RTC_IO_TOUCH_PAD1_RDE_V 0x1 +#define RTC_IO_TOUCH_PAD1_RDE_S 28 +/* RTC_IO_TOUCH_PAD1_RUE : R/W ;bitpos:[27] ;default: 1'd1 ; */ +/*description: the pull up enable of the pad*/ +#define RTC_IO_TOUCH_PAD1_RUE (BIT(27)) +#define RTC_IO_TOUCH_PAD1_RUE_M (BIT(27)) +#define RTC_IO_TOUCH_PAD1_RUE_V 0x1 +#define RTC_IO_TOUCH_PAD1_RUE_S 27 +/* RTC_IO_TOUCH_PAD1_DAC : R/W ;bitpos:[25:23] ;default: 3'h4 ; */ +/*description: touch sensor slope control. 3-bit for each touch panel default 100.*/ +#define RTC_IO_TOUCH_PAD1_DAC 0x00000007 +#define RTC_IO_TOUCH_PAD1_DAC_M ((RTC_IO_TOUCH_PAD1_DAC_V)<<(RTC_IO_TOUCH_PAD1_DAC_S)) +#define RTC_IO_TOUCH_PAD1_DAC_V 0x7 +#define RTC_IO_TOUCH_PAD1_DAC_S 23 +/* RTC_IO_TOUCH_PAD1_START : R/W ;bitpos:[22] ;default: 1'd0 ; */ +/*description: start touch sensor.*/ +#define RTC_IO_TOUCH_PAD1_START (BIT(22)) +#define RTC_IO_TOUCH_PAD1_START_M (BIT(22)) +#define RTC_IO_TOUCH_PAD1_START_V 0x1 +#define RTC_IO_TOUCH_PAD1_START_S 22 +/* RTC_IO_TOUCH_PAD1_TIE_OPT : R/W ;bitpos:[21] ;default: 1'd0 ; */ +/*description: default touch sensor tie option. 0: tie low 1: tie high.*/ +#define RTC_IO_TOUCH_PAD1_TIE_OPT (BIT(21)) +#define RTC_IO_TOUCH_PAD1_TIE_OPT_M (BIT(21)) +#define RTC_IO_TOUCH_PAD1_TIE_OPT_V 0x1 +#define RTC_IO_TOUCH_PAD1_TIE_OPT_S 21 +/* RTC_IO_TOUCH_PAD1_XPD : R/W ;bitpos:[20] ;default: 1'd0 ; */ +/*description: touch sensor power on.*/ +#define RTC_IO_TOUCH_PAD1_XPD (BIT(20)) +#define RTC_IO_TOUCH_PAD1_XPD_M (BIT(20)) +#define RTC_IO_TOUCH_PAD1_XPD_V 0x1 +#define RTC_IO_TOUCH_PAD1_XPD_S 20 +/* RTC_IO_TOUCH_PAD1_MUX_SEL : R/W ;bitpos:[19] ;default: 1'd0 ; */ +/*description: Ò1Ó select the digital function Ó0Óslection the rtc function*/ +#define RTC_IO_TOUCH_PAD1_MUX_SEL (BIT(19)) +#define RTC_IO_TOUCH_PAD1_MUX_SEL_M (BIT(19)) +#define RTC_IO_TOUCH_PAD1_MUX_SEL_V 0x1 +#define RTC_IO_TOUCH_PAD1_MUX_SEL_S 19 +/* RTC_IO_TOUCH_PAD1_FUN_SEL : R/W ;bitpos:[18:17] ;default: 2'd0 ; */ +/*description: the functional selection signal of the pad*/ +#define RTC_IO_TOUCH_PAD1_FUN_SEL 0x00000003 +#define RTC_IO_TOUCH_PAD1_FUN_SEL_M ((RTC_IO_TOUCH_PAD1_FUN_SEL_V)<<(RTC_IO_TOUCH_PAD1_FUN_SEL_S)) +#define RTC_IO_TOUCH_PAD1_FUN_SEL_V 0x3 +#define RTC_IO_TOUCH_PAD1_FUN_SEL_S 17 +/* RTC_IO_TOUCH_PAD1_SLP_SEL : R/W ;bitpos:[16] ;default: 1'd0 ; */ +/*description: the sleep status selection signal of the pad*/ +#define RTC_IO_TOUCH_PAD1_SLP_SEL (BIT(16)) +#define RTC_IO_TOUCH_PAD1_SLP_SEL_M (BIT(16)) +#define RTC_IO_TOUCH_PAD1_SLP_SEL_V 0x1 +#define RTC_IO_TOUCH_PAD1_SLP_SEL_S 16 +/* RTC_IO_TOUCH_PAD1_SLP_IE : R/W ;bitpos:[15] ;default: 1'd0 ; */ +/*description: the input enable of the pad in sleep status*/ +#define RTC_IO_TOUCH_PAD1_SLP_IE (BIT(15)) +#define RTC_IO_TOUCH_PAD1_SLP_IE_M (BIT(15)) +#define RTC_IO_TOUCH_PAD1_SLP_IE_V 0x1 +#define RTC_IO_TOUCH_PAD1_SLP_IE_S 15 +/* RTC_IO_TOUCH_PAD1_SLP_OE : R/W ;bitpos:[14] ;default: 1'd0 ; */ +/*description: the output enable of the pad in sleep status*/ +#define RTC_IO_TOUCH_PAD1_SLP_OE (BIT(14)) +#define RTC_IO_TOUCH_PAD1_SLP_OE_M (BIT(14)) +#define RTC_IO_TOUCH_PAD1_SLP_OE_V 0x1 +#define RTC_IO_TOUCH_PAD1_SLP_OE_S 14 +/* RTC_IO_TOUCH_PAD1_FUN_IE : R/W ;bitpos:[13] ;default: 1'd0 ; */ +/*description: the input enable of the pad*/ +#define RTC_IO_TOUCH_PAD1_FUN_IE (BIT(13)) +#define RTC_IO_TOUCH_PAD1_FUN_IE_M (BIT(13)) +#define RTC_IO_TOUCH_PAD1_FUN_IE_V 0x1 +#define RTC_IO_TOUCH_PAD1_FUN_IE_S 13 +/* RTC_IO_TOUCH_PAD1_TO_GPIO : R/W ;bitpos:[12] ;default: 1'd0 ; */ +/*description: connect the rtc pad input to digital pad input Ó0Ó is availbale.GPIO0*/ +#define RTC_IO_TOUCH_PAD1_TO_GPIO (BIT(12)) +#define RTC_IO_TOUCH_PAD1_TO_GPIO_M (BIT(12)) +#define RTC_IO_TOUCH_PAD1_TO_GPIO_V 0x1 +#define RTC_IO_TOUCH_PAD1_TO_GPIO_S 12 + +#define RTC_IO_TOUCH_PAD2_REG (DR_REG_RTCIO_BASE + 0x9c) +/* RTC_IO_TOUCH_PAD2_HOLD : R/W ;bitpos:[31] ;default: 1'd0 ; */ +/*description: hold the current value of the output when setting the hold to Ò1Ó*/ +#define RTC_IO_TOUCH_PAD2_HOLD (BIT(31)) +#define RTC_IO_TOUCH_PAD2_HOLD_M (BIT(31)) +#define RTC_IO_TOUCH_PAD2_HOLD_V 0x1 +#define RTC_IO_TOUCH_PAD2_HOLD_S 31 +/* RTC_IO_TOUCH_PAD2_DRV : R/W ;bitpos:[30:29] ;default: 2'd2 ; */ +/*description: the driver strength of the pad*/ +#define RTC_IO_TOUCH_PAD2_DRV 0x00000003 +#define RTC_IO_TOUCH_PAD2_DRV_M ((RTC_IO_TOUCH_PAD2_DRV_V)<<(RTC_IO_TOUCH_PAD2_DRV_S)) +#define RTC_IO_TOUCH_PAD2_DRV_V 0x3 +#define RTC_IO_TOUCH_PAD2_DRV_S 29 +/* RTC_IO_TOUCH_PAD2_RDE : R/W ;bitpos:[28] ;default: 1'd1 ; */ +/*description: the pull down enable of the pad*/ +#define RTC_IO_TOUCH_PAD2_RDE (BIT(28)) +#define RTC_IO_TOUCH_PAD2_RDE_M (BIT(28)) +#define RTC_IO_TOUCH_PAD2_RDE_V 0x1 +#define RTC_IO_TOUCH_PAD2_RDE_S 28 +/* RTC_IO_TOUCH_PAD2_RUE : R/W ;bitpos:[27] ;default: 1'd0 ; */ +/*description: the pull up enable of the pad*/ +#define RTC_IO_TOUCH_PAD2_RUE (BIT(27)) +#define RTC_IO_TOUCH_PAD2_RUE_M (BIT(27)) +#define RTC_IO_TOUCH_PAD2_RUE_V 0x1 +#define RTC_IO_TOUCH_PAD2_RUE_S 27 +/* RTC_IO_TOUCH_PAD2_DAC : R/W ;bitpos:[25:23] ;default: 3'h4 ; */ +/*description: touch sensor slope control. 3-bit for each touch panel default 100.*/ +#define RTC_IO_TOUCH_PAD2_DAC 0x00000007 +#define RTC_IO_TOUCH_PAD2_DAC_M ((RTC_IO_TOUCH_PAD2_DAC_V)<<(RTC_IO_TOUCH_PAD2_DAC_S)) +#define RTC_IO_TOUCH_PAD2_DAC_V 0x7 +#define RTC_IO_TOUCH_PAD2_DAC_S 23 +/* RTC_IO_TOUCH_PAD2_START : R/W ;bitpos:[22] ;default: 1'd0 ; */ +/*description: start touch sensor.*/ +#define RTC_IO_TOUCH_PAD2_START (BIT(22)) +#define RTC_IO_TOUCH_PAD2_START_M (BIT(22)) +#define RTC_IO_TOUCH_PAD2_START_V 0x1 +#define RTC_IO_TOUCH_PAD2_START_S 22 +/* RTC_IO_TOUCH_PAD2_TIE_OPT : R/W ;bitpos:[21] ;default: 1'd0 ; */ +/*description: default touch sensor tie option. 0: tie low 1: tie high.*/ +#define RTC_IO_TOUCH_PAD2_TIE_OPT (BIT(21)) +#define RTC_IO_TOUCH_PAD2_TIE_OPT_M (BIT(21)) +#define RTC_IO_TOUCH_PAD2_TIE_OPT_V 0x1 +#define RTC_IO_TOUCH_PAD2_TIE_OPT_S 21 +/* RTC_IO_TOUCH_PAD2_XPD : R/W ;bitpos:[20] ;default: 1'd0 ; */ +/*description: touch sensor power on.*/ +#define RTC_IO_TOUCH_PAD2_XPD (BIT(20)) +#define RTC_IO_TOUCH_PAD2_XPD_M (BIT(20)) +#define RTC_IO_TOUCH_PAD2_XPD_V 0x1 +#define RTC_IO_TOUCH_PAD2_XPD_S 20 +/* RTC_IO_TOUCH_PAD2_MUX_SEL : R/W ;bitpos:[19] ;default: 1'd0 ; */ +/*description: Ò1Ó select the digital function Ó0Óslection the rtc function*/ +#define RTC_IO_TOUCH_PAD2_MUX_SEL (BIT(19)) +#define RTC_IO_TOUCH_PAD2_MUX_SEL_M (BIT(19)) +#define RTC_IO_TOUCH_PAD2_MUX_SEL_V 0x1 +#define RTC_IO_TOUCH_PAD2_MUX_SEL_S 19 +/* RTC_IO_TOUCH_PAD2_FUN_SEL : R/W ;bitpos:[18:17] ;default: 2'd0 ; */ +/*description: the functional selection signal of the pad*/ +#define RTC_IO_TOUCH_PAD2_FUN_SEL 0x00000003 +#define RTC_IO_TOUCH_PAD2_FUN_SEL_M ((RTC_IO_TOUCH_PAD2_FUN_SEL_V)<<(RTC_IO_TOUCH_PAD2_FUN_SEL_S)) +#define RTC_IO_TOUCH_PAD2_FUN_SEL_V 0x3 +#define RTC_IO_TOUCH_PAD2_FUN_SEL_S 17 +/* RTC_IO_TOUCH_PAD2_SLP_SEL : R/W ;bitpos:[16] ;default: 1'd0 ; */ +/*description: the sleep status selection signal of the pad*/ +#define RTC_IO_TOUCH_PAD2_SLP_SEL (BIT(16)) +#define RTC_IO_TOUCH_PAD2_SLP_SEL_M (BIT(16)) +#define RTC_IO_TOUCH_PAD2_SLP_SEL_V 0x1 +#define RTC_IO_TOUCH_PAD2_SLP_SEL_S 16 +/* RTC_IO_TOUCH_PAD2_SLP_IE : R/W ;bitpos:[15] ;default: 1'd0 ; */ +/*description: the input enable of the pad in sleep status*/ +#define RTC_IO_TOUCH_PAD2_SLP_IE (BIT(15)) +#define RTC_IO_TOUCH_PAD2_SLP_IE_M (BIT(15)) +#define RTC_IO_TOUCH_PAD2_SLP_IE_V 0x1 +#define RTC_IO_TOUCH_PAD2_SLP_IE_S 15 +/* RTC_IO_TOUCH_PAD2_SLP_OE : R/W ;bitpos:[14] ;default: 1'd0 ; */ +/*description: the output enable of the pad in sleep status*/ +#define RTC_IO_TOUCH_PAD2_SLP_OE (BIT(14)) +#define RTC_IO_TOUCH_PAD2_SLP_OE_M (BIT(14)) +#define RTC_IO_TOUCH_PAD2_SLP_OE_V 0x1 +#define RTC_IO_TOUCH_PAD2_SLP_OE_S 14 +/* RTC_IO_TOUCH_PAD2_FUN_IE : R/W ;bitpos:[13] ;default: 1'd0 ; */ +/*description: the input enable of the pad*/ +#define RTC_IO_TOUCH_PAD2_FUN_IE (BIT(13)) +#define RTC_IO_TOUCH_PAD2_FUN_IE_M (BIT(13)) +#define RTC_IO_TOUCH_PAD2_FUN_IE_V 0x1 +#define RTC_IO_TOUCH_PAD2_FUN_IE_S 13 +/* RTC_IO_TOUCH_PAD2_TO_GPIO : R/W ;bitpos:[12] ;default: 1'd0 ; */ +/*description: connect the rtc pad input to digital pad input Ó0Ó is availbale.GPIO2*/ +#define RTC_IO_TOUCH_PAD2_TO_GPIO (BIT(12)) +#define RTC_IO_TOUCH_PAD2_TO_GPIO_M (BIT(12)) +#define RTC_IO_TOUCH_PAD2_TO_GPIO_V 0x1 +#define RTC_IO_TOUCH_PAD2_TO_GPIO_S 12 + +#define RTC_IO_TOUCH_PAD3_REG (DR_REG_RTCIO_BASE + 0xa0) +/* RTC_IO_TOUCH_PAD3_HOLD : R/W ;bitpos:[31] ;default: 1'd0 ; */ +/*description: hold the current value of the output when setting the hold to Ò1Ó*/ +#define RTC_IO_TOUCH_PAD3_HOLD (BIT(31)) +#define RTC_IO_TOUCH_PAD3_HOLD_M (BIT(31)) +#define RTC_IO_TOUCH_PAD3_HOLD_V 0x1 +#define RTC_IO_TOUCH_PAD3_HOLD_S 31 +/* RTC_IO_TOUCH_PAD3_DRV : R/W ;bitpos:[30:29] ;default: 2'd2 ; */ +/*description: the driver strength of the pad*/ +#define RTC_IO_TOUCH_PAD3_DRV 0x00000003 +#define RTC_IO_TOUCH_PAD3_DRV_M ((RTC_IO_TOUCH_PAD3_DRV_V)<<(RTC_IO_TOUCH_PAD3_DRV_S)) +#define RTC_IO_TOUCH_PAD3_DRV_V 0x3 +#define RTC_IO_TOUCH_PAD3_DRV_S 29 +/* RTC_IO_TOUCH_PAD3_RDE : R/W ;bitpos:[28] ;default: 1'd0 ; */ +/*description: the pull down enable of the pad*/ +#define RTC_IO_TOUCH_PAD3_RDE (BIT(28)) +#define RTC_IO_TOUCH_PAD3_RDE_M (BIT(28)) +#define RTC_IO_TOUCH_PAD3_RDE_V 0x1 +#define RTC_IO_TOUCH_PAD3_RDE_S 28 +/* RTC_IO_TOUCH_PAD3_RUE : R/W ;bitpos:[27] ;default: 1'd1 ; */ +/*description: the pull up enable of the pad*/ +#define RTC_IO_TOUCH_PAD3_RUE (BIT(27)) +#define RTC_IO_TOUCH_PAD3_RUE_M (BIT(27)) +#define RTC_IO_TOUCH_PAD3_RUE_V 0x1 +#define RTC_IO_TOUCH_PAD3_RUE_S 27 +/* RTC_IO_TOUCH_PAD3_DAC : R/W ;bitpos:[25:23] ;default: 3'h4 ; */ +/*description: touch sensor slope control. 3-bit for each touch panel default 100.*/ +#define RTC_IO_TOUCH_PAD3_DAC 0x00000007 +#define RTC_IO_TOUCH_PAD3_DAC_M ((RTC_IO_TOUCH_PAD3_DAC_V)<<(RTC_IO_TOUCH_PAD3_DAC_S)) +#define RTC_IO_TOUCH_PAD3_DAC_V 0x7 +#define RTC_IO_TOUCH_PAD3_DAC_S 23 +/* RTC_IO_TOUCH_PAD3_START : R/W ;bitpos:[22] ;default: 1'd0 ; */ +/*description: start touch sensor.*/ +#define RTC_IO_TOUCH_PAD3_START (BIT(22)) +#define RTC_IO_TOUCH_PAD3_START_M (BIT(22)) +#define RTC_IO_TOUCH_PAD3_START_V 0x1 +#define RTC_IO_TOUCH_PAD3_START_S 22 +/* RTC_IO_TOUCH_PAD3_TIE_OPT : R/W ;bitpos:[21] ;default: 1'd0 ; */ +/*description: default touch sensor tie option. 0: tie low 1: tie high.*/ +#define RTC_IO_TOUCH_PAD3_TIE_OPT (BIT(21)) +#define RTC_IO_TOUCH_PAD3_TIE_OPT_M (BIT(21)) +#define RTC_IO_TOUCH_PAD3_TIE_OPT_V 0x1 +#define RTC_IO_TOUCH_PAD3_TIE_OPT_S 21 +/* RTC_IO_TOUCH_PAD3_XPD : R/W ;bitpos:[20] ;default: 1'd0 ; */ +/*description: touch sensor power on.*/ +#define RTC_IO_TOUCH_PAD3_XPD (BIT(20)) +#define RTC_IO_TOUCH_PAD3_XPD_M (BIT(20)) +#define RTC_IO_TOUCH_PAD3_XPD_V 0x1 +#define RTC_IO_TOUCH_PAD3_XPD_S 20 +/* RTC_IO_TOUCH_PAD3_MUX_SEL : R/W ;bitpos:[19] ;default: 1'd0 ; */ +/*description: Ò1Ó select the digital function Ó0Óslection the rtc function*/ +#define RTC_IO_TOUCH_PAD3_MUX_SEL (BIT(19)) +#define RTC_IO_TOUCH_PAD3_MUX_SEL_M (BIT(19)) +#define RTC_IO_TOUCH_PAD3_MUX_SEL_V 0x1 +#define RTC_IO_TOUCH_PAD3_MUX_SEL_S 19 +/* RTC_IO_TOUCH_PAD3_FUN_SEL : R/W ;bitpos:[18:17] ;default: 2'd0 ; */ +/*description: the functional selection signal of the pad*/ +#define RTC_IO_TOUCH_PAD3_FUN_SEL 0x00000003 +#define RTC_IO_TOUCH_PAD3_FUN_SEL_M ((RTC_IO_TOUCH_PAD3_FUN_SEL_V)<<(RTC_IO_TOUCH_PAD3_FUN_SEL_S)) +#define RTC_IO_TOUCH_PAD3_FUN_SEL_V 0x3 +#define RTC_IO_TOUCH_PAD3_FUN_SEL_S 17 +/* RTC_IO_TOUCH_PAD3_SLP_SEL : R/W ;bitpos:[16] ;default: 1'd0 ; */ +/*description: the sleep status selection signal of the pad*/ +#define RTC_IO_TOUCH_PAD3_SLP_SEL (BIT(16)) +#define RTC_IO_TOUCH_PAD3_SLP_SEL_M (BIT(16)) +#define RTC_IO_TOUCH_PAD3_SLP_SEL_V 0x1 +#define RTC_IO_TOUCH_PAD3_SLP_SEL_S 16 +/* RTC_IO_TOUCH_PAD3_SLP_IE : R/W ;bitpos:[15] ;default: 1'd0 ; */ +/*description: the input enable of the pad in sleep status*/ +#define RTC_IO_TOUCH_PAD3_SLP_IE (BIT(15)) +#define RTC_IO_TOUCH_PAD3_SLP_IE_M (BIT(15)) +#define RTC_IO_TOUCH_PAD3_SLP_IE_V 0x1 +#define RTC_IO_TOUCH_PAD3_SLP_IE_S 15 +/* RTC_IO_TOUCH_PAD3_SLP_OE : R/W ;bitpos:[14] ;default: 1'd0 ; */ +/*description: the output enable of the pad in sleep status*/ +#define RTC_IO_TOUCH_PAD3_SLP_OE (BIT(14)) +#define RTC_IO_TOUCH_PAD3_SLP_OE_M (BIT(14)) +#define RTC_IO_TOUCH_PAD3_SLP_OE_V 0x1 +#define RTC_IO_TOUCH_PAD3_SLP_OE_S 14 +/* RTC_IO_TOUCH_PAD3_FUN_IE : R/W ;bitpos:[13] ;default: 1'd0 ; */ +/*description: the input enable of the pad*/ +#define RTC_IO_TOUCH_PAD3_FUN_IE (BIT(13)) +#define RTC_IO_TOUCH_PAD3_FUN_IE_M (BIT(13)) +#define RTC_IO_TOUCH_PAD3_FUN_IE_V 0x1 +#define RTC_IO_TOUCH_PAD3_FUN_IE_S 13 +/* RTC_IO_TOUCH_PAD3_TO_GPIO : R/W ;bitpos:[12] ;default: 1'd0 ; */ +/*description: connect the rtc pad input to digital pad input Ó0Ó is availbale.MTDO*/ +#define RTC_IO_TOUCH_PAD3_TO_GPIO (BIT(12)) +#define RTC_IO_TOUCH_PAD3_TO_GPIO_M (BIT(12)) +#define RTC_IO_TOUCH_PAD3_TO_GPIO_V 0x1 +#define RTC_IO_TOUCH_PAD3_TO_GPIO_S 12 + +#define RTC_IO_TOUCH_PAD4_REG (DR_REG_RTCIO_BASE + 0xa4) +/* RTC_IO_TOUCH_PAD4_HOLD : R/W ;bitpos:[31] ;default: 1'd0 ; */ +/*description: hold the current value of the output when setting the hold to Ò1Ó*/ +#define RTC_IO_TOUCH_PAD4_HOLD (BIT(31)) +#define RTC_IO_TOUCH_PAD4_HOLD_M (BIT(31)) +#define RTC_IO_TOUCH_PAD4_HOLD_V 0x1 +#define RTC_IO_TOUCH_PAD4_HOLD_S 31 +/* RTC_IO_TOUCH_PAD4_DRV : R/W ;bitpos:[30:29] ;default: 2'd2 ; */ +/*description: the driver strength of the pad*/ +#define RTC_IO_TOUCH_PAD4_DRV 0x00000003 +#define RTC_IO_TOUCH_PAD4_DRV_M ((RTC_IO_TOUCH_PAD4_DRV_V)<<(RTC_IO_TOUCH_PAD4_DRV_S)) +#define RTC_IO_TOUCH_PAD4_DRV_V 0x3 +#define RTC_IO_TOUCH_PAD4_DRV_S 29 +/* RTC_IO_TOUCH_PAD4_RDE : R/W ;bitpos:[28] ;default: 1'd1 ; */ +/*description: the pull down enable of the pad*/ +#define RTC_IO_TOUCH_PAD4_RDE (BIT(28)) +#define RTC_IO_TOUCH_PAD4_RDE_M (BIT(28)) +#define RTC_IO_TOUCH_PAD4_RDE_V 0x1 +#define RTC_IO_TOUCH_PAD4_RDE_S 28 +/* RTC_IO_TOUCH_PAD4_RUE : R/W ;bitpos:[27] ;default: 1'd0 ; */ +/*description: the pull up enable of the pad*/ +#define RTC_IO_TOUCH_PAD4_RUE (BIT(27)) +#define RTC_IO_TOUCH_PAD4_RUE_M (BIT(27)) +#define RTC_IO_TOUCH_PAD4_RUE_V 0x1 +#define RTC_IO_TOUCH_PAD4_RUE_S 27 +/* RTC_IO_TOUCH_PAD4_DAC : R/W ;bitpos:[25:23] ;default: 3'h4 ; */ +/*description: touch sensor slope control. 3-bit for each touch panel default 100.*/ +#define RTC_IO_TOUCH_PAD4_DAC 0x00000007 +#define RTC_IO_TOUCH_PAD4_DAC_M ((RTC_IO_TOUCH_PAD4_DAC_V)<<(RTC_IO_TOUCH_PAD4_DAC_S)) +#define RTC_IO_TOUCH_PAD4_DAC_V 0x7 +#define RTC_IO_TOUCH_PAD4_DAC_S 23 +/* RTC_IO_TOUCH_PAD4_START : R/W ;bitpos:[22] ;default: 1'd0 ; */ +/*description: start touch sensor.*/ +#define RTC_IO_TOUCH_PAD4_START (BIT(22)) +#define RTC_IO_TOUCH_PAD4_START_M (BIT(22)) +#define RTC_IO_TOUCH_PAD4_START_V 0x1 +#define RTC_IO_TOUCH_PAD4_START_S 22 +/* RTC_IO_TOUCH_PAD4_TIE_OPT : R/W ;bitpos:[21] ;default: 1'd0 ; */ +/*description: default touch sensor tie option. 0: tie low 1: tie high.*/ +#define RTC_IO_TOUCH_PAD4_TIE_OPT (BIT(21)) +#define RTC_IO_TOUCH_PAD4_TIE_OPT_M (BIT(21)) +#define RTC_IO_TOUCH_PAD4_TIE_OPT_V 0x1 +#define RTC_IO_TOUCH_PAD4_TIE_OPT_S 21 +/* RTC_IO_TOUCH_PAD4_XPD : R/W ;bitpos:[20] ;default: 1'd0 ; */ +/*description: touch sensor power on.*/ +#define RTC_IO_TOUCH_PAD4_XPD (BIT(20)) +#define RTC_IO_TOUCH_PAD4_XPD_M (BIT(20)) +#define RTC_IO_TOUCH_PAD4_XPD_V 0x1 +#define RTC_IO_TOUCH_PAD4_XPD_S 20 +/* RTC_IO_TOUCH_PAD4_MUX_SEL : R/W ;bitpos:[19] ;default: 1'd0 ; */ +/*description: Ò1Ó select the digital function Ó0Óslection the rtc function*/ +#define RTC_IO_TOUCH_PAD4_MUX_SEL (BIT(19)) +#define RTC_IO_TOUCH_PAD4_MUX_SEL_M (BIT(19)) +#define RTC_IO_TOUCH_PAD4_MUX_SEL_V 0x1 +#define RTC_IO_TOUCH_PAD4_MUX_SEL_S 19 +/* RTC_IO_TOUCH_PAD4_FUN_SEL : R/W ;bitpos:[18:17] ;default: 2'd0 ; */ +/*description: the functional selection signal of the pad*/ +#define RTC_IO_TOUCH_PAD4_FUN_SEL 0x00000003 +#define RTC_IO_TOUCH_PAD4_FUN_SEL_M ((RTC_IO_TOUCH_PAD4_FUN_SEL_V)<<(RTC_IO_TOUCH_PAD4_FUN_SEL_S)) +#define RTC_IO_TOUCH_PAD4_FUN_SEL_V 0x3 +#define RTC_IO_TOUCH_PAD4_FUN_SEL_S 17 +/* RTC_IO_TOUCH_PAD4_SLP_SEL : R/W ;bitpos:[16] ;default: 1'd0 ; */ +/*description: the sleep status selection signal of the pad*/ +#define RTC_IO_TOUCH_PAD4_SLP_SEL (BIT(16)) +#define RTC_IO_TOUCH_PAD4_SLP_SEL_M (BIT(16)) +#define RTC_IO_TOUCH_PAD4_SLP_SEL_V 0x1 +#define RTC_IO_TOUCH_PAD4_SLP_SEL_S 16 +/* RTC_IO_TOUCH_PAD4_SLP_IE : R/W ;bitpos:[15] ;default: 1'd0 ; */ +/*description: the input enable of the pad in sleep status*/ +#define RTC_IO_TOUCH_PAD4_SLP_IE (BIT(15)) +#define RTC_IO_TOUCH_PAD4_SLP_IE_M (BIT(15)) +#define RTC_IO_TOUCH_PAD4_SLP_IE_V 0x1 +#define RTC_IO_TOUCH_PAD4_SLP_IE_S 15 +/* RTC_IO_TOUCH_PAD4_SLP_OE : R/W ;bitpos:[14] ;default: 1'd0 ; */ +/*description: the output enable of the pad in sleep status*/ +#define RTC_IO_TOUCH_PAD4_SLP_OE (BIT(14)) +#define RTC_IO_TOUCH_PAD4_SLP_OE_M (BIT(14)) +#define RTC_IO_TOUCH_PAD4_SLP_OE_V 0x1 +#define RTC_IO_TOUCH_PAD4_SLP_OE_S 14 +/* RTC_IO_TOUCH_PAD4_FUN_IE : R/W ;bitpos:[13] ;default: 1'd0 ; */ +/*description: the input enable of the pad*/ +#define RTC_IO_TOUCH_PAD4_FUN_IE (BIT(13)) +#define RTC_IO_TOUCH_PAD4_FUN_IE_M (BIT(13)) +#define RTC_IO_TOUCH_PAD4_FUN_IE_V 0x1 +#define RTC_IO_TOUCH_PAD4_FUN_IE_S 13 +/* RTC_IO_TOUCH_PAD4_TO_GPIO : R/W ;bitpos:[12] ;default: 1'd0 ; */ +/*description: connect the rtc pad input to digital pad input Ó0Ó is availbale.MTCK*/ +#define RTC_IO_TOUCH_PAD4_TO_GPIO (BIT(12)) +#define RTC_IO_TOUCH_PAD4_TO_GPIO_M (BIT(12)) +#define RTC_IO_TOUCH_PAD4_TO_GPIO_V 0x1 +#define RTC_IO_TOUCH_PAD4_TO_GPIO_S 12 + +#define RTC_IO_TOUCH_PAD5_REG (DR_REG_RTCIO_BASE + 0xa8) +/* RTC_IO_TOUCH_PAD5_HOLD : R/W ;bitpos:[31] ;default: 1'd0 ; */ +/*description: hold the current value of the output when setting the hold to Ò1Ó*/ +#define RTC_IO_TOUCH_PAD5_HOLD (BIT(31)) +#define RTC_IO_TOUCH_PAD5_HOLD_M (BIT(31)) +#define RTC_IO_TOUCH_PAD5_HOLD_V 0x1 +#define RTC_IO_TOUCH_PAD5_HOLD_S 31 +/* RTC_IO_TOUCH_PAD5_DRV : R/W ;bitpos:[30:29] ;default: 2'd2 ; */ +/*description: the driver strength of the pad*/ +#define RTC_IO_TOUCH_PAD5_DRV 0x00000003 +#define RTC_IO_TOUCH_PAD5_DRV_M ((RTC_IO_TOUCH_PAD5_DRV_V)<<(RTC_IO_TOUCH_PAD5_DRV_S)) +#define RTC_IO_TOUCH_PAD5_DRV_V 0x3 +#define RTC_IO_TOUCH_PAD5_DRV_S 29 +/* RTC_IO_TOUCH_PAD5_RDE : R/W ;bitpos:[28] ;default: 1'd1 ; */ +/*description: the pull down enable of the pad*/ +#define RTC_IO_TOUCH_PAD5_RDE (BIT(28)) +#define RTC_IO_TOUCH_PAD5_RDE_M (BIT(28)) +#define RTC_IO_TOUCH_PAD5_RDE_V 0x1 +#define RTC_IO_TOUCH_PAD5_RDE_S 28 +/* RTC_IO_TOUCH_PAD5_RUE : R/W ;bitpos:[27] ;default: 1'd0 ; */ +/*description: the pull up enable of the pad*/ +#define RTC_IO_TOUCH_PAD5_RUE (BIT(27)) +#define RTC_IO_TOUCH_PAD5_RUE_M (BIT(27)) +#define RTC_IO_TOUCH_PAD5_RUE_V 0x1 +#define RTC_IO_TOUCH_PAD5_RUE_S 27 +/* RTC_IO_TOUCH_PAD5_DAC : R/W ;bitpos:[25:23] ;default: 3'h4 ; */ +/*description: touch sensor slope control. 3-bit for each touch panel default 100.*/ +#define RTC_IO_TOUCH_PAD5_DAC 0x00000007 +#define RTC_IO_TOUCH_PAD5_DAC_M ((RTC_IO_TOUCH_PAD5_DAC_V)<<(RTC_IO_TOUCH_PAD5_DAC_S)) +#define RTC_IO_TOUCH_PAD5_DAC_V 0x7 +#define RTC_IO_TOUCH_PAD5_DAC_S 23 +/* RTC_IO_TOUCH_PAD5_START : R/W ;bitpos:[22] ;default: 1'd0 ; */ +/*description: start touch sensor.*/ +#define RTC_IO_TOUCH_PAD5_START (BIT(22)) +#define RTC_IO_TOUCH_PAD5_START_M (BIT(22)) +#define RTC_IO_TOUCH_PAD5_START_V 0x1 +#define RTC_IO_TOUCH_PAD5_START_S 22 +/* RTC_IO_TOUCH_PAD5_TIE_OPT : R/W ;bitpos:[21] ;default: 1'd0 ; */ +/*description: default touch sensor tie option. 0: tie low 1: tie high.*/ +#define RTC_IO_TOUCH_PAD5_TIE_OPT (BIT(21)) +#define RTC_IO_TOUCH_PAD5_TIE_OPT_M (BIT(21)) +#define RTC_IO_TOUCH_PAD5_TIE_OPT_V 0x1 +#define RTC_IO_TOUCH_PAD5_TIE_OPT_S 21 +/* RTC_IO_TOUCH_PAD5_XPD : R/W ;bitpos:[20] ;default: 1'd0 ; */ +/*description: touch sensor power on.*/ +#define RTC_IO_TOUCH_PAD5_XPD (BIT(20)) +#define RTC_IO_TOUCH_PAD5_XPD_M (BIT(20)) +#define RTC_IO_TOUCH_PAD5_XPD_V 0x1 +#define RTC_IO_TOUCH_PAD5_XPD_S 20 +/* RTC_IO_TOUCH_PAD5_MUX_SEL : R/W ;bitpos:[19] ;default: 1'd0 ; */ +/*description: Ò1Ó select the digital function Ó0Óslection the rtc function*/ +#define RTC_IO_TOUCH_PAD5_MUX_SEL (BIT(19)) +#define RTC_IO_TOUCH_PAD5_MUX_SEL_M (BIT(19)) +#define RTC_IO_TOUCH_PAD5_MUX_SEL_V 0x1 +#define RTC_IO_TOUCH_PAD5_MUX_SEL_S 19 +/* RTC_IO_TOUCH_PAD5_FUN_SEL : R/W ;bitpos:[18:17] ;default: 2'd0 ; */ +/*description: the functional selection signal of the pad*/ +#define RTC_IO_TOUCH_PAD5_FUN_SEL 0x00000003 +#define RTC_IO_TOUCH_PAD5_FUN_SEL_M ((RTC_IO_TOUCH_PAD5_FUN_SEL_V)<<(RTC_IO_TOUCH_PAD5_FUN_SEL_S)) +#define RTC_IO_TOUCH_PAD5_FUN_SEL_V 0x3 +#define RTC_IO_TOUCH_PAD5_FUN_SEL_S 17 +/* RTC_IO_TOUCH_PAD5_SLP_SEL : R/W ;bitpos:[16] ;default: 1'd0 ; */ +/*description: the sleep status selection signal of the pad*/ +#define RTC_IO_TOUCH_PAD5_SLP_SEL (BIT(16)) +#define RTC_IO_TOUCH_PAD5_SLP_SEL_M (BIT(16)) +#define RTC_IO_TOUCH_PAD5_SLP_SEL_V 0x1 +#define RTC_IO_TOUCH_PAD5_SLP_SEL_S 16 +/* RTC_IO_TOUCH_PAD5_SLP_IE : R/W ;bitpos:[15] ;default: 1'd0 ; */ +/*description: the input enable of the pad in sleep status*/ +#define RTC_IO_TOUCH_PAD5_SLP_IE (BIT(15)) +#define RTC_IO_TOUCH_PAD5_SLP_IE_M (BIT(15)) +#define RTC_IO_TOUCH_PAD5_SLP_IE_V 0x1 +#define RTC_IO_TOUCH_PAD5_SLP_IE_S 15 +/* RTC_IO_TOUCH_PAD5_SLP_OE : R/W ;bitpos:[14] ;default: 1'd0 ; */ +/*description: the output enable of the pad in sleep status*/ +#define RTC_IO_TOUCH_PAD5_SLP_OE (BIT(14)) +#define RTC_IO_TOUCH_PAD5_SLP_OE_M (BIT(14)) +#define RTC_IO_TOUCH_PAD5_SLP_OE_V 0x1 +#define RTC_IO_TOUCH_PAD5_SLP_OE_S 14 +/* RTC_IO_TOUCH_PAD5_FUN_IE : R/W ;bitpos:[13] ;default: 1'd0 ; */ +/*description: the input enable of the pad*/ +#define RTC_IO_TOUCH_PAD5_FUN_IE (BIT(13)) +#define RTC_IO_TOUCH_PAD5_FUN_IE_M (BIT(13)) +#define RTC_IO_TOUCH_PAD5_FUN_IE_V 0x1 +#define RTC_IO_TOUCH_PAD5_FUN_IE_S 13 +/* RTC_IO_TOUCH_PAD5_TO_GPIO : R/W ;bitpos:[12] ;default: 1'd0 ; */ +/*description: connect the rtc pad input to digital pad input Ó0Ó is availbale.MTDI*/ +#define RTC_IO_TOUCH_PAD5_TO_GPIO (BIT(12)) +#define RTC_IO_TOUCH_PAD5_TO_GPIO_M (BIT(12)) +#define RTC_IO_TOUCH_PAD5_TO_GPIO_V 0x1 +#define RTC_IO_TOUCH_PAD5_TO_GPIO_S 12 + +#define RTC_IO_TOUCH_PAD6_REG (DR_REG_RTCIO_BASE + 0xac) +/* RTC_IO_TOUCH_PAD6_HOLD : R/W ;bitpos:[31] ;default: 1'd0 ; */ +/*description: hold the current value of the output when setting the hold to Ò1Ó*/ +#define RTC_IO_TOUCH_PAD6_HOLD (BIT(31)) +#define RTC_IO_TOUCH_PAD6_HOLD_M (BIT(31)) +#define RTC_IO_TOUCH_PAD6_HOLD_V 0x1 +#define RTC_IO_TOUCH_PAD6_HOLD_S 31 +/* RTC_IO_TOUCH_PAD6_DRV : R/W ;bitpos:[30:29] ;default: 2'd2 ; */ +/*description: the driver strength of the pad*/ +#define RTC_IO_TOUCH_PAD6_DRV 0x00000003 +#define RTC_IO_TOUCH_PAD6_DRV_M ((RTC_IO_TOUCH_PAD6_DRV_V)<<(RTC_IO_TOUCH_PAD6_DRV_S)) +#define RTC_IO_TOUCH_PAD6_DRV_V 0x3 +#define RTC_IO_TOUCH_PAD6_DRV_S 29 +/* RTC_IO_TOUCH_PAD6_RDE : R/W ;bitpos:[28] ;default: 1'd0 ; */ +/*description: the pull down enable of the pad*/ +#define RTC_IO_TOUCH_PAD6_RDE (BIT(28)) +#define RTC_IO_TOUCH_PAD6_RDE_M (BIT(28)) +#define RTC_IO_TOUCH_PAD6_RDE_V 0x1 +#define RTC_IO_TOUCH_PAD6_RDE_S 28 +/* RTC_IO_TOUCH_PAD6_RUE : R/W ;bitpos:[27] ;default: 1'd1 ; */ +/*description: the pull up enable of the pad*/ +#define RTC_IO_TOUCH_PAD6_RUE (BIT(27)) +#define RTC_IO_TOUCH_PAD6_RUE_M (BIT(27)) +#define RTC_IO_TOUCH_PAD6_RUE_V 0x1 +#define RTC_IO_TOUCH_PAD6_RUE_S 27 +/* RTC_IO_TOUCH_PAD6_DAC : R/W ;bitpos:[25:23] ;default: 3'h4 ; */ +/*description: touch sensor slope control. 3-bit for each touch panel default 100.*/ +#define RTC_IO_TOUCH_PAD6_DAC 0x00000007 +#define RTC_IO_TOUCH_PAD6_DAC_M ((RTC_IO_TOUCH_PAD6_DAC_V)<<(RTC_IO_TOUCH_PAD6_DAC_S)) +#define RTC_IO_TOUCH_PAD6_DAC_V 0x7 +#define RTC_IO_TOUCH_PAD6_DAC_S 23 +/* RTC_IO_TOUCH_PAD6_START : R/W ;bitpos:[22] ;default: 1'd0 ; */ +/*description: start touch sensor.*/ +#define RTC_IO_TOUCH_PAD6_START (BIT(22)) +#define RTC_IO_TOUCH_PAD6_START_M (BIT(22)) +#define RTC_IO_TOUCH_PAD6_START_V 0x1 +#define RTC_IO_TOUCH_PAD6_START_S 22 +/* RTC_IO_TOUCH_PAD6_TIE_OPT : R/W ;bitpos:[21] ;default: 1'd0 ; */ +/*description: default touch sensor tie option. 0: tie low 1: tie high.*/ +#define RTC_IO_TOUCH_PAD6_TIE_OPT (BIT(21)) +#define RTC_IO_TOUCH_PAD6_TIE_OPT_M (BIT(21)) +#define RTC_IO_TOUCH_PAD6_TIE_OPT_V 0x1 +#define RTC_IO_TOUCH_PAD6_TIE_OPT_S 21 +/* RTC_IO_TOUCH_PAD6_XPD : R/W ;bitpos:[20] ;default: 1'd0 ; */ +/*description: touch sensor power on.*/ +#define RTC_IO_TOUCH_PAD6_XPD (BIT(20)) +#define RTC_IO_TOUCH_PAD6_XPD_M (BIT(20)) +#define RTC_IO_TOUCH_PAD6_XPD_V 0x1 +#define RTC_IO_TOUCH_PAD6_XPD_S 20 +/* RTC_IO_TOUCH_PAD6_MUX_SEL : R/W ;bitpos:[19] ;default: 1'd0 ; */ +/*description: Ò1Ó select the digital function Ó0Óslection the rtc function*/ +#define RTC_IO_TOUCH_PAD6_MUX_SEL (BIT(19)) +#define RTC_IO_TOUCH_PAD6_MUX_SEL_M (BIT(19)) +#define RTC_IO_TOUCH_PAD6_MUX_SEL_V 0x1 +#define RTC_IO_TOUCH_PAD6_MUX_SEL_S 19 +/* RTC_IO_TOUCH_PAD6_FUN_SEL : R/W ;bitpos:[18:17] ;default: 2'd0 ; */ +/*description: the functional selection signal of the pad*/ +#define RTC_IO_TOUCH_PAD6_FUN_SEL 0x00000003 +#define RTC_IO_TOUCH_PAD6_FUN_SEL_M ((RTC_IO_TOUCH_PAD6_FUN_SEL_V)<<(RTC_IO_TOUCH_PAD6_FUN_SEL_S)) +#define RTC_IO_TOUCH_PAD6_FUN_SEL_V 0x3 +#define RTC_IO_TOUCH_PAD6_FUN_SEL_S 17 +/* RTC_IO_TOUCH_PAD6_SLP_SEL : R/W ;bitpos:[16] ;default: 1'd0 ; */ +/*description: the sleep status selection signal of the pad*/ +#define RTC_IO_TOUCH_PAD6_SLP_SEL (BIT(16)) +#define RTC_IO_TOUCH_PAD6_SLP_SEL_M (BIT(16)) +#define RTC_IO_TOUCH_PAD6_SLP_SEL_V 0x1 +#define RTC_IO_TOUCH_PAD6_SLP_SEL_S 16 +/* RTC_IO_TOUCH_PAD6_SLP_IE : R/W ;bitpos:[15] ;default: 1'd0 ; */ +/*description: the input enable of the pad in sleep status*/ +#define RTC_IO_TOUCH_PAD6_SLP_IE (BIT(15)) +#define RTC_IO_TOUCH_PAD6_SLP_IE_M (BIT(15)) +#define RTC_IO_TOUCH_PAD6_SLP_IE_V 0x1 +#define RTC_IO_TOUCH_PAD6_SLP_IE_S 15 +/* RTC_IO_TOUCH_PAD6_SLP_OE : R/W ;bitpos:[14] ;default: 1'd0 ; */ +/*description: the output enable of the pad in sleep status*/ +#define RTC_IO_TOUCH_PAD6_SLP_OE (BIT(14)) +#define RTC_IO_TOUCH_PAD6_SLP_OE_M (BIT(14)) +#define RTC_IO_TOUCH_PAD6_SLP_OE_V 0x1 +#define RTC_IO_TOUCH_PAD6_SLP_OE_S 14 +/* RTC_IO_TOUCH_PAD6_FUN_IE : R/W ;bitpos:[13] ;default: 1'd0 ; */ +/*description: the input enable of the pad*/ +#define RTC_IO_TOUCH_PAD6_FUN_IE (BIT(13)) +#define RTC_IO_TOUCH_PAD6_FUN_IE_M (BIT(13)) +#define RTC_IO_TOUCH_PAD6_FUN_IE_V 0x1 +#define RTC_IO_TOUCH_PAD6_FUN_IE_S 13 +/* RTC_IO_TOUCH_PAD6_TO_GPIO : R/W ;bitpos:[12] ;default: 1'd0 ; */ +/*description: connect the rtc pad input to digital pad input Ó0Ó is availbale.MTMS*/ +#define RTC_IO_TOUCH_PAD6_TO_GPIO (BIT(12)) +#define RTC_IO_TOUCH_PAD6_TO_GPIO_M (BIT(12)) +#define RTC_IO_TOUCH_PAD6_TO_GPIO_V 0x1 +#define RTC_IO_TOUCH_PAD6_TO_GPIO_S 12 + +#define RTC_IO_TOUCH_PAD7_REG (DR_REG_RTCIO_BASE + 0xb0) +/* RTC_IO_TOUCH_PAD7_HOLD : R/W ;bitpos:[31] ;default: 1'd0 ; */ +/*description: hold the current value of the output when setting the hold to Ò1Ó*/ +#define RTC_IO_TOUCH_PAD7_HOLD (BIT(31)) +#define RTC_IO_TOUCH_PAD7_HOLD_M (BIT(31)) +#define RTC_IO_TOUCH_PAD7_HOLD_V 0x1 +#define RTC_IO_TOUCH_PAD7_HOLD_S 31 +/* RTC_IO_TOUCH_PAD7_DRV : R/W ;bitpos:[30:29] ;default: 2'd2 ; */ +/*description: the driver strength of the pad*/ +#define RTC_IO_TOUCH_PAD7_DRV 0x00000003 +#define RTC_IO_TOUCH_PAD7_DRV_M ((RTC_IO_TOUCH_PAD7_DRV_V)<<(RTC_IO_TOUCH_PAD7_DRV_S)) +#define RTC_IO_TOUCH_PAD7_DRV_V 0x3 +#define RTC_IO_TOUCH_PAD7_DRV_S 29 +/* RTC_IO_TOUCH_PAD7_RDE : R/W ;bitpos:[28] ;default: 1'd0 ; */ +/*description: the pull down enable of the pad*/ +#define RTC_IO_TOUCH_PAD7_RDE (BIT(28)) +#define RTC_IO_TOUCH_PAD7_RDE_M (BIT(28)) +#define RTC_IO_TOUCH_PAD7_RDE_V 0x1 +#define RTC_IO_TOUCH_PAD7_RDE_S 28 +/* RTC_IO_TOUCH_PAD7_RUE : R/W ;bitpos:[27] ;default: 1'd0 ; */ +/*description: the pull up enable of the pad*/ +#define RTC_IO_TOUCH_PAD7_RUE (BIT(27)) +#define RTC_IO_TOUCH_PAD7_RUE_M (BIT(27)) +#define RTC_IO_TOUCH_PAD7_RUE_V 0x1 +#define RTC_IO_TOUCH_PAD7_RUE_S 27 +/* RTC_IO_TOUCH_PAD7_DAC : R/W ;bitpos:[25:23] ;default: 3'h4 ; */ +/*description: touch sensor slope control. 3-bit for each touch panel default 100.*/ +#define RTC_IO_TOUCH_PAD7_DAC 0x00000007 +#define RTC_IO_TOUCH_PAD7_DAC_M ((RTC_IO_TOUCH_PAD7_DAC_V)<<(RTC_IO_TOUCH_PAD7_DAC_S)) +#define RTC_IO_TOUCH_PAD7_DAC_V 0x7 +#define RTC_IO_TOUCH_PAD7_DAC_S 23 +/* RTC_IO_TOUCH_PAD7_START : R/W ;bitpos:[22] ;default: 1'd0 ; */ +/*description: start touch sensor.*/ +#define RTC_IO_TOUCH_PAD7_START (BIT(22)) +#define RTC_IO_TOUCH_PAD7_START_M (BIT(22)) +#define RTC_IO_TOUCH_PAD7_START_V 0x1 +#define RTC_IO_TOUCH_PAD7_START_S 22 +/* RTC_IO_TOUCH_PAD7_TIE_OPT : R/W ;bitpos:[21] ;default: 1'd0 ; */ +/*description: default touch sensor tie option. 0: tie low 1: tie high.*/ +#define RTC_IO_TOUCH_PAD7_TIE_OPT (BIT(21)) +#define RTC_IO_TOUCH_PAD7_TIE_OPT_M (BIT(21)) +#define RTC_IO_TOUCH_PAD7_TIE_OPT_V 0x1 +#define RTC_IO_TOUCH_PAD7_TIE_OPT_S 21 +/* RTC_IO_TOUCH_PAD7_XPD : R/W ;bitpos:[20] ;default: 1'd0 ; */ +/*description: touch sensor power on.*/ +#define RTC_IO_TOUCH_PAD7_XPD (BIT(20)) +#define RTC_IO_TOUCH_PAD7_XPD_M (BIT(20)) +#define RTC_IO_TOUCH_PAD7_XPD_V 0x1 +#define RTC_IO_TOUCH_PAD7_XPD_S 20 +/* RTC_IO_TOUCH_PAD7_MUX_SEL : R/W ;bitpos:[19] ;default: 1'd0 ; */ +/*description: Ò1Ó select the digital function Ó0Óslection the rtc function*/ +#define RTC_IO_TOUCH_PAD7_MUX_SEL (BIT(19)) +#define RTC_IO_TOUCH_PAD7_MUX_SEL_M (BIT(19)) +#define RTC_IO_TOUCH_PAD7_MUX_SEL_V 0x1 +#define RTC_IO_TOUCH_PAD7_MUX_SEL_S 19 +/* RTC_IO_TOUCH_PAD7_FUN_SEL : R/W ;bitpos:[18:17] ;default: 2'd0 ; */ +/*description: the functional selection signal of the pad*/ +#define RTC_IO_TOUCH_PAD7_FUN_SEL 0x00000003 +#define RTC_IO_TOUCH_PAD7_FUN_SEL_M ((RTC_IO_TOUCH_PAD7_FUN_SEL_V)<<(RTC_IO_TOUCH_PAD7_FUN_SEL_S)) +#define RTC_IO_TOUCH_PAD7_FUN_SEL_V 0x3 +#define RTC_IO_TOUCH_PAD7_FUN_SEL_S 17 +/* RTC_IO_TOUCH_PAD7_SLP_SEL : R/W ;bitpos:[16] ;default: 1'd0 ; */ +/*description: the sleep status selection signal of the pad*/ +#define RTC_IO_TOUCH_PAD7_SLP_SEL (BIT(16)) +#define RTC_IO_TOUCH_PAD7_SLP_SEL_M (BIT(16)) +#define RTC_IO_TOUCH_PAD7_SLP_SEL_V 0x1 +#define RTC_IO_TOUCH_PAD7_SLP_SEL_S 16 +/* RTC_IO_TOUCH_PAD7_SLP_IE : R/W ;bitpos:[15] ;default: 1'd0 ; */ +/*description: the input enable of the pad in sleep status*/ +#define RTC_IO_TOUCH_PAD7_SLP_IE (BIT(15)) +#define RTC_IO_TOUCH_PAD7_SLP_IE_M (BIT(15)) +#define RTC_IO_TOUCH_PAD7_SLP_IE_V 0x1 +#define RTC_IO_TOUCH_PAD7_SLP_IE_S 15 +/* RTC_IO_TOUCH_PAD7_SLP_OE : R/W ;bitpos:[14] ;default: 1'd0 ; */ +/*description: the output enable of the pad in sleep status*/ +#define RTC_IO_TOUCH_PAD7_SLP_OE (BIT(14)) +#define RTC_IO_TOUCH_PAD7_SLP_OE_M (BIT(14)) +#define RTC_IO_TOUCH_PAD7_SLP_OE_V 0x1 +#define RTC_IO_TOUCH_PAD7_SLP_OE_S 14 +/* RTC_IO_TOUCH_PAD7_FUN_IE : R/W ;bitpos:[13] ;default: 1'd0 ; */ +/*description: the input enable of the pad*/ +#define RTC_IO_TOUCH_PAD7_FUN_IE (BIT(13)) +#define RTC_IO_TOUCH_PAD7_FUN_IE_M (BIT(13)) +#define RTC_IO_TOUCH_PAD7_FUN_IE_V 0x1 +#define RTC_IO_TOUCH_PAD7_FUN_IE_S 13 +/* RTC_IO_TOUCH_PAD7_TO_GPIO : R/W ;bitpos:[12] ;default: 1'd0 ; */ +/*description: connect the rtc pad input to digital pad input Ó0Ó is availbale.GPIO27*/ +#define RTC_IO_TOUCH_PAD7_TO_GPIO (BIT(12)) +#define RTC_IO_TOUCH_PAD7_TO_GPIO_M (BIT(12)) +#define RTC_IO_TOUCH_PAD7_TO_GPIO_V 0x1 +#define RTC_IO_TOUCH_PAD7_TO_GPIO_S 12 + +#define RTC_IO_TOUCH_PAD8_REG (DR_REG_RTCIO_BASE + 0xb4) +/* RTC_IO_TOUCH_PAD8_DAC : R/W ;bitpos:[25:23] ;default: 3'h4 ; */ +/*description: touch sensor slope control. 3-bit for each touch panel default 100.*/ +#define RTC_IO_TOUCH_PAD8_DAC 0x00000007 +#define RTC_IO_TOUCH_PAD8_DAC_M ((RTC_IO_TOUCH_PAD8_DAC_V)<<(RTC_IO_TOUCH_PAD8_DAC_S)) +#define RTC_IO_TOUCH_PAD8_DAC_V 0x7 +#define RTC_IO_TOUCH_PAD8_DAC_S 23 +/* RTC_IO_TOUCH_PAD8_START : R/W ;bitpos:[22] ;default: 1'd0 ; */ +/*description: start touch sensor.*/ +#define RTC_IO_TOUCH_PAD8_START (BIT(22)) +#define RTC_IO_TOUCH_PAD8_START_M (BIT(22)) +#define RTC_IO_TOUCH_PAD8_START_V 0x1 +#define RTC_IO_TOUCH_PAD8_START_S 22 +/* RTC_IO_TOUCH_PAD8_TIE_OPT : R/W ;bitpos:[21] ;default: 1'd0 ; */ +/*description: default touch sensor tie option. 0: tie low 1: tie high.*/ +#define RTC_IO_TOUCH_PAD8_TIE_OPT (BIT(21)) +#define RTC_IO_TOUCH_PAD8_TIE_OPT_M (BIT(21)) +#define RTC_IO_TOUCH_PAD8_TIE_OPT_V 0x1 +#define RTC_IO_TOUCH_PAD8_TIE_OPT_S 21 +/* RTC_IO_TOUCH_PAD8_XPD : R/W ;bitpos:[20] ;default: 1'd0 ; */ +/*description: touch sensor power on.*/ +#define RTC_IO_TOUCH_PAD8_XPD (BIT(20)) +#define RTC_IO_TOUCH_PAD8_XPD_M (BIT(20)) +#define RTC_IO_TOUCH_PAD8_XPD_V 0x1 +#define RTC_IO_TOUCH_PAD8_XPD_S 20 +/* RTC_IO_TOUCH_PAD8_TO_GPIO : R/W ;bitpos:[19] ;default: 1'd0 ; */ +/*description: connect the rtc pad input to digital pad input Ó0Ó is availbale*/ +#define RTC_IO_TOUCH_PAD8_TO_GPIO (BIT(19)) +#define RTC_IO_TOUCH_PAD8_TO_GPIO_M (BIT(19)) +#define RTC_IO_TOUCH_PAD8_TO_GPIO_V 0x1 +#define RTC_IO_TOUCH_PAD8_TO_GPIO_S 19 + +#define RTC_IO_TOUCH_PAD9_REG (DR_REG_RTCIO_BASE + 0xb8) +/* RTC_IO_TOUCH_PAD9_DAC : R/W ;bitpos:[25:23] ;default: 3'h4 ; */ +/*description: touch sensor slope control. 3-bit for each touch panel default 100.*/ +#define RTC_IO_TOUCH_PAD9_DAC 0x00000007 +#define RTC_IO_TOUCH_PAD9_DAC_M ((RTC_IO_TOUCH_PAD9_DAC_V)<<(RTC_IO_TOUCH_PAD9_DAC_S)) +#define RTC_IO_TOUCH_PAD9_DAC_V 0x7 +#define RTC_IO_TOUCH_PAD9_DAC_S 23 +/* RTC_IO_TOUCH_PAD9_START : R/W ;bitpos:[22] ;default: 1'd0 ; */ +/*description: start touch sensor.*/ +#define RTC_IO_TOUCH_PAD9_START (BIT(22)) +#define RTC_IO_TOUCH_PAD9_START_M (BIT(22)) +#define RTC_IO_TOUCH_PAD9_START_V 0x1 +#define RTC_IO_TOUCH_PAD9_START_S 22 +/* RTC_IO_TOUCH_PAD9_TIE_OPT : R/W ;bitpos:[21] ;default: 1'd0 ; */ +/*description: default touch sensor tie option. 0: tie low 1: tie high.*/ +#define RTC_IO_TOUCH_PAD9_TIE_OPT (BIT(21)) +#define RTC_IO_TOUCH_PAD9_TIE_OPT_M (BIT(21)) +#define RTC_IO_TOUCH_PAD9_TIE_OPT_V 0x1 +#define RTC_IO_TOUCH_PAD9_TIE_OPT_S 21 +/* RTC_IO_TOUCH_PAD9_XPD : R/W ;bitpos:[20] ;default: 1'd0 ; */ +/*description: touch sensor power on.*/ +#define RTC_IO_TOUCH_PAD9_XPD (BIT(20)) +#define RTC_IO_TOUCH_PAD9_XPD_M (BIT(20)) +#define RTC_IO_TOUCH_PAD9_XPD_V 0x1 +#define RTC_IO_TOUCH_PAD9_XPD_S 20 +/* RTC_IO_TOUCH_PAD9_TO_GPIO : R/W ;bitpos:[19] ;default: 1'd0 ; */ +/*description: connect the rtc pad input to digital pad input Ó0Ó is availbale*/ +#define RTC_IO_TOUCH_PAD9_TO_GPIO (BIT(19)) +#define RTC_IO_TOUCH_PAD9_TO_GPIO_M (BIT(19)) +#define RTC_IO_TOUCH_PAD9_TO_GPIO_V 0x1 +#define RTC_IO_TOUCH_PAD9_TO_GPIO_S 19 + +#define RTC_IO_EXT_WAKEUP0_REG (DR_REG_RTCIO_BASE + 0xbc) +/* RTC_IO_EXT_WAKEUP0_SEL : R/W ;bitpos:[31:27] ;default: 5'd0 ; */ +/*description: select the wakeup source Ó0Ó select GPIO0 Ó1Ó select GPIO2 ...Ò17Ó select GPIO17*/ +#define RTC_IO_EXT_WAKEUP0_SEL 0x0000001F +#define RTC_IO_EXT_WAKEUP0_SEL_M ((RTC_IO_EXT_WAKEUP0_SEL_V)<<(RTC_IO_EXT_WAKEUP0_SEL_S)) +#define RTC_IO_EXT_WAKEUP0_SEL_V 0x1F +#define RTC_IO_EXT_WAKEUP0_SEL_S 27 + +#define RTC_IO_XTL_EXT_CTR_REG (DR_REG_RTCIO_BASE + 0xc0) +/* RTC_IO_XTL_EXT_CTR_SEL : R/W ;bitpos:[31:27] ;default: 5'd0 ; */ +/*description: select the external xtl power source Ó0Ó select GPIO0 Ó1Ó select + GPIO2 ...Ò17Ó select GPIO17*/ +#define RTC_IO_XTL_EXT_CTR_SEL 0x0000001F +#define RTC_IO_XTL_EXT_CTR_SEL_M ((RTC_IO_XTL_EXT_CTR_SEL_V)<<(RTC_IO_XTL_EXT_CTR_SEL_S)) +#define RTC_IO_XTL_EXT_CTR_SEL_V 0x1F +#define RTC_IO_XTL_EXT_CTR_SEL_S 27 + +#define RTC_IO_SAR_I2C_IO_REG (DR_REG_RTCIO_BASE + 0xc4) +/* RTC_IO_SAR_I2C_SDA_SEL : R/W ;bitpos:[31:30] ;default: 2'd0 ; */ +/*description: Ò0Ó using TOUCH_PAD[1] as i2c sda Ò1Ó using TOUCH_PAD[3] as i2c sda*/ +#define RTC_IO_SAR_I2C_SDA_SEL 0x00000003 +#define RTC_IO_SAR_I2C_SDA_SEL_M ((RTC_IO_SAR_I2C_SDA_SEL_V)<<(RTC_IO_SAR_I2C_SDA_SEL_S)) +#define RTC_IO_SAR_I2C_SDA_SEL_V 0x3 +#define RTC_IO_SAR_I2C_SDA_SEL_S 30 +/* RTC_IO_SAR_I2C_SCL_SEL : R/W ;bitpos:[29:28] ;default: 2'd0 ; */ +/*description: Ò0Ó using TOUCH_PAD[0] as i2c clk Ò1Ó using TOUCH_PAD[2] as i2c clk*/ +#define RTC_IO_SAR_I2C_SCL_SEL 0x00000003 +#define RTC_IO_SAR_I2C_SCL_SEL_M ((RTC_IO_SAR_I2C_SCL_SEL_V)<<(RTC_IO_SAR_I2C_SCL_SEL_S)) +#define RTC_IO_SAR_I2C_SCL_SEL_V 0x3 +#define RTC_IO_SAR_I2C_SCL_SEL_S 28 +/* RTC_IO_SAR_DEBUG_BIT_SEL : R/W ;bitpos:[27:23] ;default: 5'h0 ; */ +/*description: */ +#define RTC_IO_SAR_DEBUG_BIT_SEL 0x0000001F +#define RTC_IO_SAR_DEBUG_BIT_SEL_M ((RTC_IO_SAR_DEBUG_BIT_SEL_V)<<(RTC_IO_SAR_DEBUG_BIT_SEL_S)) +#define RTC_IO_SAR_DEBUG_BIT_SEL_V 0x1F +#define RTC_IO_SAR_DEBUG_BIT_SEL_S 23 + +#define RTC_IO_DATE_REG (DR_REG_RTCIO_BASE + 0xc8) +/* RTC_IO_IO_DATE : R/W ;bitpos:[27:0] ;default: 28'h1603160 ; */ +/*description: date*/ +#define RTC_IO_IO_DATE 0x0FFFFFFF +#define RTC_IO_IO_DATE_M ((RTC_IO_IO_DATE_V)<<(RTC_IO_IO_DATE_S)) +#define RTC_IO_IO_DATE_V 0xFFFFFFF +#define RTC_IO_IO_DATE_S 0 +#define RTC_IO_RTC_IO_DATE_VERSION 0x1703160 + + + + +#endif /*_SOC_RTC_IO_REG_H_ */ + + diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/rtc_io_struct.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/rtc_io_struct.h new file mode 100644 index 0000000000000..785ec6c5d8f66 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/rtc_io_struct.h @@ -0,0 +1,293 @@ +// 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. +#ifndef _SOC_RTC_IO_STRUCT_H_ +#define _SOC_RTC_IO_STRUCT_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef volatile struct rtc_io_dev_s { + union { + struct { + uint32_t reserved0: 14; + uint32_t data:18; /*GPIO0~17 output value*/ + }; + uint32_t val; + } out; + union { + struct { + uint32_t reserved0: 14; + uint32_t w1ts:18; /*GPIO0~17 output value write 1 to set*/ + }; + uint32_t val; + } out_w1ts; + union { + struct { + uint32_t reserved0: 14; + uint32_t w1tc:18; /*GPIO0~17 output value write 1 to clear*/ + }; + uint32_t val; + } out_w1tc; + union { + struct { + uint32_t reserved0: 14; + uint32_t enable:18; /*GPIO0~17 output enable*/ + }; + uint32_t val; + } enable; + union { + struct { + uint32_t reserved0: 14; + uint32_t w1ts:18; /*GPIO0~17 output enable write 1 to set*/ + }; + uint32_t val; + } enable_w1ts; + union { + struct { + uint32_t reserved0: 14; + uint32_t w1tc:18; /*GPIO0~17 output enable write 1 to clear*/ + }; + uint32_t val; + } enable_w1tc; + union { + struct { + uint32_t reserved0: 14; + uint32_t status:18; /*GPIO0~17 interrupt status*/ + }; + uint32_t val; + } status; + union { + struct { + uint32_t reserved0: 14; + uint32_t w1ts:18; /*GPIO0~17 interrupt status write 1 to set*/ + }; + uint32_t val; + } status_w1ts; + union { + struct { + uint32_t reserved0: 14; + uint32_t w1tc:18; /*GPIO0~17 interrupt status write 1 to clear*/ + }; + uint32_t val; + } status_w1tc; + union { + struct { + uint32_t reserved0: 14; + uint32_t in:18; /*GPIO0~17 input value*/ + }; + uint32_t val; + } in_val; + union { + struct { + uint32_t reserved0: 2; + uint32_t pad_driver: 1; /*if set to 0: normal output if set to 1: open drain*/ + uint32_t reserved3: 4; + uint32_t int_type: 3; /*if set to 0: GPIO interrupt disable if set to 1: rising edge trigger if set to 2: falling edge trigger if set to 3: any edge trigger if set to 4: low level trigger if set to 5: high level trigger*/ + uint32_t wakeup_enable: 1; /*GPIO wake up enable only available in light sleep*/ + uint32_t reserved11: 21; + }; + uint32_t val; + } pin[18]; + union { + struct { + uint32_t sel0: 5; + uint32_t sel1: 5; + uint32_t sel2: 5; + uint32_t sel3: 5; + uint32_t sel4: 5; + uint32_t no_gating_12m: 1; + uint32_t reserved26: 6; + }; + uint32_t val; + } debug_sel; + uint32_t dig_pad_hold; /*select the digital pad hold value.*/ + union { + struct { + uint32_t reserved0: 30; + uint32_t hall_phase: 1; /*Reverse phase of hall sensor*/ + uint32_t xpd_hall: 1; /*Power on hall sensor and connect to VP and VN*/ + }; + uint32_t val; + } hall_sens; + union { + struct { + uint32_t reserved0: 4; + uint32_t sense4_fun_ie: 1; /*the input enable of the pad*/ + uint32_t sense4_slp_ie: 1; /*the input enable of the pad in sleep status*/ + uint32_t sense4_slp_sel: 1; /*the sleep status selection signal of the pad*/ + uint32_t sense4_fun_sel: 2; /*the functional selection signal of the pad*/ + uint32_t sense3_fun_ie: 1; /*the input enable of the pad*/ + uint32_t sense3_slp_ie: 1; /*the input enable of the pad in sleep status*/ + uint32_t sense3_slp_sel: 1; /*the sleep status selection signal of the pad*/ + uint32_t sense3_fun_sel: 2; /*the functional selection signal of the pad*/ + uint32_t sense2_fun_ie: 1; /*the input enable of the pad*/ + uint32_t sense2_slp_ie: 1; /*the input enable of the pad in sleep status*/ + uint32_t sense2_slp_sel: 1; /*the sleep status selection signal of the pad*/ + uint32_t sense2_fun_sel: 2; /*the functional selection signal of the pad*/ + uint32_t sense1_fun_ie: 1; /*the input enable of the pad*/ + uint32_t sense1_slp_ie: 1; /*the input enable of the pad in sleep status*/ + uint32_t sense1_slp_sel: 1; /*the sleep status selection signal of the pad*/ + uint32_t sense1_fun_sel: 2; /*the functional selection signal of the pad*/ + uint32_t sense4_mux_sel: 1; /*�1� select the digital function �0�slection the rtc function*/ + uint32_t sense3_mux_sel: 1; /*�1� select the digital function �0�slection the rtc function*/ + uint32_t sense2_mux_sel: 1; /*�1� select the digital function �0�slection the rtc function*/ + uint32_t sense1_mux_sel: 1; /*�1� select the digital function �0�slection the rtc function*/ + uint32_t sense4_hold: 1; /*hold the current value of the output when setting the hold to �1�*/ + uint32_t sense3_hold: 1; /*hold the current value of the output when setting the hold to �1�*/ + uint32_t sense2_hold: 1; /*hold the current value of the output when setting the hold to �1�*/ + uint32_t sense1_hold: 1; /*hold the current value of the output when setting the hold to �1�*/ + }; + uint32_t val; + } sensor_pads; + union { + struct { + uint32_t reserved0: 18; + uint32_t adc2_fun_ie: 1; /*the input enable of the pad*/ + uint32_t adc2_slp_ie: 1; /*the input enable of the pad in sleep status*/ + uint32_t adc2_slp_sel: 1; /*the sleep status selection signal of the pad*/ + uint32_t adc2_fun_sel: 2; /*the functional selection signal of the pad*/ + uint32_t adc1_fun_ie: 1; /*the input enable of the pad*/ + uint32_t adc1_slp_ie: 1; /*the input enable of the pad in sleep status*/ + uint32_t adc1_slp_sel: 1; /*the sleep status selection signal of the pad*/ + uint32_t adc1_fun_sel: 2; /*the functional selection signal of the pad*/ + uint32_t adc2_mux_sel: 1; /*�1� select the digital function �0�slection the rtc function*/ + uint32_t adc1_mux_sel: 1; /*�1� select the digital function �0�slection the rtc function*/ + uint32_t adc2_hold: 1; /*hold the current value of the output when setting the hold to �1�*/ + uint32_t adc1_hold: 1; /*hold the current value of the output when setting the hold to �1�*/ + }; + uint32_t val; + } adc_pad; + union { + struct { + uint32_t reserved0: 10; + uint32_t dac_xpd_force: 1; /*Power on DAC1. Usually we need to tristate PDAC1 if we power on the DAC i.e. IE=0 OE=0 RDE=0 RUE=0*/ + uint32_t fun_ie: 1; /*the input enable of the pad*/ + uint32_t slp_oe: 1; /*the output enable of the pad in sleep status*/ + uint32_t slp_ie: 1; /*the input enable of the pad in sleep status*/ + uint32_t slp_sel: 1; /*the sleep status selection signal of the pad*/ + uint32_t fun_sel: 2; /*the functional selection signal of the pad*/ + uint32_t mux_sel: 1; /*�1� select the digital function �0�slection the rtc function*/ + uint32_t xpd_dac: 1; /*Power on DAC1. Usually we need to tristate PDAC1 if we power on the DAC i.e. IE=0 OE=0 RDE=0 RUE=0*/ + uint32_t dac: 8; /*PAD DAC1 control code.*/ + uint32_t rue: 1; /*the pull up enable of the pad*/ + uint32_t rde: 1; /*the pull down enable of the pad*/ + uint32_t hold: 1; /*hold the current value of the output when setting the hold to �1�*/ + uint32_t drv: 2; /*the driver strength of the pad*/ + }; + uint32_t val; + } pad_dac[2]; + union { + struct { + uint32_t reserved0: 1; + uint32_t dbias_xtal_32k: 2; /*32K XTAL self-bias reference control.*/ + uint32_t dres_xtal_32k: 2; /*32K XTAL resistor bias control.*/ + uint32_t x32p_fun_ie: 1; /*the input enable of the pad*/ + uint32_t x32p_slp_oe: 1; /*the output enable of the pad in sleep status*/ + uint32_t x32p_slp_ie: 1; /*the input enable of the pad in sleep status*/ + uint32_t x32p_slp_sel: 1; /*the sleep status selection signal of the pad*/ + uint32_t x32p_fun_sel: 2; /*the functional selection signal of the pad*/ + uint32_t x32n_fun_ie: 1; /*the input enable of the pad*/ + uint32_t x32n_slp_oe: 1; /*the output enable of the pad in sleep status*/ + uint32_t x32n_slp_ie: 1; /*the input enable of the pad in sleep status*/ + uint32_t x32n_slp_sel: 1; /*the sleep status selection signal of the pad*/ + uint32_t x32n_fun_sel: 2; /*the functional selection signal of the pad*/ + uint32_t x32p_mux_sel: 1; /*�1� select the digital function �0�slection the rtc function*/ + uint32_t x32n_mux_sel: 1; /*�1� select the digital function �0�slection the rtc function*/ + uint32_t xpd_xtal_32k: 1; /*Power up 32kHz crystal oscillator*/ + uint32_t dac_xtal_32k: 2; /*32K XTAL bias current DAC.*/ + uint32_t x32p_rue: 1; /*the pull up enable of the pad*/ + uint32_t x32p_rde: 1; /*the pull down enable of the pad*/ + uint32_t x32p_hold: 1; /*hold the current value of the output when setting the hold to �1�*/ + uint32_t x32p_drv: 2; /*the driver strength of the pad*/ + uint32_t x32n_rue: 1; /*the pull up enable of the pad*/ + uint32_t x32n_rde: 1; /*the pull down enable of the pad*/ + uint32_t x32n_hold: 1; /*hold the current value of the output when setting the hold to �1�*/ + uint32_t x32n_drv: 2; /*the driver strength of the pad*/ + }; + uint32_t val; + } xtal_32k_pad; + union { + struct { + uint32_t reserved0: 23; + uint32_t dcur: 2; /*touch sensor bias current. Should have option to tie with BIAS_SLEEP(When BIAS_SLEEP this setting is available*/ + uint32_t drange: 2; /*touch sensor saw wave voltage range.*/ + uint32_t drefl: 2; /*touch sensor saw wave bottom voltage.*/ + uint32_t drefh: 2; /*touch sensor saw wave top voltage.*/ + uint32_t xpd_bias: 1; /*touch sensor bias power on.*/ + }; + uint32_t val; + } touch_cfg; + union { + struct { + uint32_t reserved0: 12; + uint32_t to_gpio: 1; /*connect the rtc pad input to digital pad input �0� is availbale GPIO4*/ + uint32_t fun_ie: 1; /*the input enable of the pad*/ + uint32_t slp_oe: 1; /*the output enable of the pad in sleep status*/ + uint32_t slp_ie: 1; /*the input enable of the pad in sleep status*/ + uint32_t slp_sel: 1; /*the sleep status selection signal of the pad*/ + uint32_t fun_sel: 2; /*the functional selection signal of the pad*/ + uint32_t mux_sel: 1; /*�1� select the digital function �0�slection the rtc function*/ + uint32_t xpd: 1; /*touch sensor power on.*/ + uint32_t tie_opt: 1; /*default touch sensor tie option. 0: tie low 1: tie high.*/ + uint32_t start: 1; /*start touch sensor.*/ + uint32_t dac: 3; /*touch sensor slope control. 3-bit for each touch panel default 100.*/ + uint32_t reserved26: 1; + uint32_t rue: 1; /*the pull up enable of the pad*/ + uint32_t rde: 1; /*the pull down enable of the pad*/ + uint32_t drv: 2; /*the driver strength of the pad*/ + uint32_t hold: 1; /*hold the current value of the output when setting the hold to �1�*/ + }; + uint32_t val; + } touch_pad[10]; + union { + struct { + uint32_t reserved0: 27; + uint32_t sel: 5; /*select the wakeup source �0� select GPIO0 �1� select GPIO2 ...�17� select GPIO17*/ + }; + uint32_t val; + } ext_wakeup0; + union { + struct { + uint32_t reserved0: 27; + uint32_t sel: 5; /*select the external xtl power source �0� select GPIO0 �1� select GPIO2 ...�17� select GPIO17*/ + }; + uint32_t val; + } xtl_ext_ctr; + union { + struct { + uint32_t reserved0: 23; + uint32_t debug_bit_sel: 5; + uint32_t scl_sel: 2; /*�0� using TOUCH_PAD[0] as i2c clk �1� using TOUCH_PAD[2] as i2c clk*/ + uint32_t sda_sel: 2; /*�0� using TOUCH_PAD[1] as i2c sda �1� using TOUCH_PAD[3] as i2c sda*/ + }; + uint32_t val; + } sar_i2c_io; + union { + struct { + uint32_t date: 28; /*date*/ + uint32_t reserved28: 4; + }; + uint32_t val; + } date; +} rtc_io_dev_t; +extern rtc_io_dev_t RTCIO; + +#ifdef __cplusplus +} +#endif + +#endif /* _SOC_RTC_IO_STRUCT_H_ */ diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/sdio_slave_pins.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/sdio_slave_pins.h new file mode 100644 index 0000000000000..97c8bec07fd38 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/sdio_slave_pins.h @@ -0,0 +1,34 @@ +// 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. + +#ifndef _SOC_SDIO_SLAVE_PINS_H_ +#define _SOC_SDIO_SLAVE_PINS_H_ + +#define SDIO_SLAVE_SLOT0_IOMUX_PIN_NUM_CLK 6 +#define SDIO_SLAVE_SLOT0_IOMUX_PIN_NUM_CMD 11 +#define SDIO_SLAVE_SLOT0_IOMUX_PIN_NUM_D0 7 +#define SDIO_SLAVE_SLOT0_IOMUX_PIN_NUM_D1 8 +#define SDIO_SLAVE_SLOT0_IOMUX_PIN_NUM_D2 9 +#define SDIO_SLAVE_SLOT0_IOMUX_PIN_NUM_D3 10 +#define SDIO_SLAVE_SLOT0_FUNC 0 + +#define SDIO_SLAVE_SLOT1_IOMUX_PIN_NUM_CLK 14 +#define SDIO_SLAVE_SLOT1_IOMUX_PIN_NUM_CMD 15 +#define SDIO_SLAVE_SLOT1_IOMUX_PIN_NUM_D0 2 +#define SDIO_SLAVE_SLOT1_IOMUX_PIN_NUM_D1 4 +#define SDIO_SLAVE_SLOT1_IOMUX_PIN_NUM_D2 12 +#define SDIO_SLAVE_SLOT1_IOMUX_PIN_NUM_D3 13 +#define SDIO_SLAVE_SLOT1_FUNC 4 + +#endif /* _SOC_SDIO_SLAVE_PINS_H_ */ \ No newline at end of file diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/sdmmc_pins.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/sdmmc_pins.h new file mode 100644 index 0000000000000..c0b328239ade2 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/sdmmc_pins.h @@ -0,0 +1,38 @@ +// 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. + +#ifndef _SOC_SDMMC_PINS_H_ +#define _SOC_SDMMC_PINS_H_ + +#define SDMMC_SLOT0_IOMUX_PIN_NUM_CLK 6 +#define SDMMC_SLOT0_IOMUX_PIN_NUM_CMD 11 +#define SDMMC_SLOT0_IOMUX_PIN_NUM_D0 7 +#define SDMMC_SLOT0_IOMUX_PIN_NUM_D1 8 +#define SDMMC_SLOT0_IOMUX_PIN_NUM_D2 9 +#define SDMMC_SLOT0_IOMUX_PIN_NUM_D3 10 +#define SDMMC_SLOT0_IOMUX_PIN_NUM_D4 16 +#define SDMMC_SLOT0_IOMUX_PIN_NUM_D5 17 +#define SDMMC_SLOT0_IOMUX_PIN_NUM_D6 5 +#define SDMMC_SLOT0_IOMUX_PIN_NUM_D7 18 +#define SDMMC_SLOT0_FUNC 0 + +#define SDMMC_SLOT1_IOMUX_PIN_NUM_CLK 14 +#define SDMMC_SLOT1_IOMUX_PIN_NUM_CMD 15 +#define SDMMC_SLOT1_IOMUX_PIN_NUM_D0 2 +#define SDMMC_SLOT1_IOMUX_PIN_NUM_D1 4 +#define SDMMC_SLOT1_IOMUX_PIN_NUM_D2 12 +#define SDMMC_SLOT1_IOMUX_PIN_NUM_D3 13 +#define SDMMC_SLOT1_FUNC 4 + +#endif /* _SOC_SDMMC_PINS_H_ */ \ No newline at end of file diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/sdmmc_reg.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/sdmmc_reg.h new file mode 100644 index 0000000000000..0e92f68224498 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/sdmmc_reg.h @@ -0,0 +1,97 @@ +// 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. +#ifndef _SOC_SDMMC_REG_H_ +#define _SOC_SDMMC_REG_H_ +#include "soc.h" + +#define SDMMC_CTRL_REG (DR_REG_SDMMC_BASE + 0x00) +#define SDMMC_PWREN_REG (DR_REG_SDMMC_BASE + 0x04) +#define SDMMC_CLKDIV_REG (DR_REG_SDMMC_BASE + 0x08) +#define SDMMC_CLKSRC_REG (DR_REG_SDMMC_BASE + 0x0c) +#define SDMMC_CLKENA_REG (DR_REG_SDMMC_BASE + 0x10) +#define SDMMC_TMOUT_REG (DR_REG_SDMMC_BASE + 0x14) +#define SDMMC_CTYPE_REG (DR_REG_SDMMC_BASE + 0x18) +#define SDMMC_BLKSIZ_REG (DR_REG_SDMMC_BASE + 0x1c) +#define SDMMC_BYTCNT_REG (DR_REG_SDMMC_BASE + 0x20) +#define SDMMC_INTMASK_REG (DR_REG_SDMMC_BASE + 0x24) +#define SDMMC_CMDARG_REG (DR_REG_SDMMC_BASE + 0x28) +#define SDMMC_CMD_REG (DR_REG_SDMMC_BASE + 0x2c) +#define SDMMC_RESP0_REG (DR_REG_SDMMC_BASE + 0x30) +#define SDMMC_RESP1_REG (DR_REG_SDMMC_BASE + 0x34) +#define SDMMC_RESP2_REG (DR_REG_SDMMC_BASE + 0x38) +#define SDMMC_RESP3_REG (DR_REG_SDMMC_BASE + 0x3c) + +#define SDMMC_MINTSTS_REG (DR_REG_SDMMC_BASE + 0x40) +#define SDMMC_RINTSTS_REG (DR_REG_SDMMC_BASE + 0x44) +#define SDMMC_STATUS_REG (DR_REG_SDMMC_BASE + 0x48) +#define SDMMC_FIFOTH_REG (DR_REG_SDMMC_BASE + 0x4c) +#define SDMMC_CDETECT_REG (DR_REG_SDMMC_BASE + 0x50) +#define SDMMC_WRTPRT_REG (DR_REG_SDMMC_BASE + 0x54) +#define SDMMC_GPIO_REG (DR_REG_SDMMC_BASE + 0x58) +#define SDMMC_TCBCNT_REG (DR_REG_SDMMC_BASE + 0x5c) +#define SDMMC_TBBCNT_REG (DR_REG_SDMMC_BASE + 0x60) +#define SDMMC_DEBNCE_REG (DR_REG_SDMMC_BASE + 0x64) +#define SDMMC_USRID_REG (DR_REG_SDMMC_BASE + 0x68) +#define SDMMC_VERID_REG (DR_REG_SDMMC_BASE + 0x6c) +#define SDMMC_HCON_REG (DR_REG_SDMMC_BASE + 0x70) +#define SDMMC_UHS_REG_REG (DR_REG_SDMMC_BASE + 0x74) +#define SDMMC_RST_N_REG (DR_REG_SDMMC_BASE + 0x78) +#define SDMMC_BMOD_REG (DR_REG_SDMMC_BASE + 0x80) +#define SDMMC_PLDMND_REG (DR_REG_SDMMC_BASE + 0x84) +#define SDMMC_DBADDR_REG (DR_REG_SDMMC_BASE + 0x88) +#define SDMMC_DBADDRU_REG (DR_REG_SDMMC_BASE + 0x8c) +#define SDMMC_IDSTS_REG (DR_REG_SDMMC_BASE + 0x8c) +#define SDMMC_IDINTEN_REG (DR_REG_SDMMC_BASE + 0x90) +#define SDMMC_DSCADDR_REG (DR_REG_SDMMC_BASE + 0x94) +#define SDMMC_DSCADDRL_REG (DR_REG_SDMMC_BASE + 0x98) +#define SDMMC_DSCADDRU_REG (DR_REG_SDMMC_BASE + 0x9c) +#define SDMMC_BUFADDRL_REG (DR_REG_SDMMC_BASE + 0xa0) +#define SDMMC_BUFADDRU_REG (DR_REG_SDMMC_BASE + 0xa4) +#define SDMMC_CARDTHRCTL_REG (DR_REG_SDMMC_BASE + 0x100) +#define SDMMC_BACK_END_POWER_REG (DR_REG_SDMMC_BASE + 0x104) +#define SDMMC_UHS_REG_EXT_REG (DR_REG_SDMMC_BASE + 0x108) +#define SDMMC_EMMC_DDR_REG_REG (DR_REG_SDMMC_BASE + 0x10c) +#define SDMMC_ENABLE_SHIFT_REG (DR_REG_SDMMC_BASE + 0x110) + +#define SDMMC_CLOCK_REG (DR_REG_SDMMC_BASE + 0x800) + +#define SDMMC_INTMASK_IO_SLOT1 BIT(17) +#define SDMMC_INTMASK_IO_SLOT0 BIT(16) +#define SDMMC_INTMASK_EBE BIT(15) +#define SDMMC_INTMASK_ACD BIT(14) +#define SDMMC_INTMASK_SBE BIT(13) +#define SDMMC_INTMASK_BCI BIT(13) +#define SDMMC_INTMASK_HLE BIT(12) +#define SDMMC_INTMASK_FRUN BIT(11) +#define SDMMC_INTMASK_HTO BIT(10) +#define SDMMC_INTMASK_DTO BIT(9) +#define SDMMC_INTMASK_RTO BIT(8) +#define SDMMC_INTMASK_DCRC BIT(7) +#define SDMMC_INTMASK_RCRC BIT(6) +#define SDMMC_INTMASK_RXDR BIT(5) +#define SDMMC_INTMASK_TXDR BIT(4) +#define SDMMC_INTMASK_DATA_OVER BIT(3) +#define SDMMC_INTMASK_CMD_DONE BIT(2) +#define SDMMC_INTMASK_RESP_ERR BIT(1) +#define SDMMC_INTMASK_CD BIT(0) + +#define SDMMC_IDMAC_INTMASK_AI BIT(9) +#define SDMMC_IDMAC_INTMASK_NI BIT(8) +#define SDMMC_IDMAC_INTMASK_CES BIT(5) +#define SDMMC_IDMAC_INTMASK_DU BIT(4) +#define SDMMC_IDMAC_INTMASK_FBE BIT(2) +#define SDMMC_IDMAC_INTMASK_RI BIT(1) +#define SDMMC_IDMAC_INTMASK_TI BIT(0) + +#endif /* _SOC_SDMMC_REG_H_ */ diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/sdmmc_struct.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/sdmmc_struct.h new file mode 100644 index 0000000000000..8a3bd8fcf6f1d --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/sdmmc_struct.h @@ -0,0 +1,393 @@ +// 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. +#ifndef _SOC_SDMMC_STRUCT_H_ +#define _SOC_SDMMC_STRUCT_H_ + +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct sdmmc_desc_s { + uint32_t reserved1: 1; + uint32_t disable_int_on_completion: 1; + uint32_t last_descriptor: 1; + uint32_t first_descriptor: 1; + uint32_t second_address_chained: 1; + uint32_t end_of_ring: 1; + uint32_t reserved2: 24; + uint32_t card_error_summary: 1; + uint32_t owned_by_idmac: 1; + uint32_t buffer1_size: 13; + uint32_t buffer2_size: 13; + uint32_t reserved3: 6; + void* buffer1_ptr; + union { + void* buffer2_ptr; + void* next_desc_ptr; + }; +} sdmmc_desc_t; + +#define SDMMC_DMA_MAX_BUF_LEN 4096 + +_Static_assert(sizeof(sdmmc_desc_t) == 16, "invalid size of sdmmc_desc_t structure"); + + +typedef struct sdmmc_hw_cmd_s { + uint32_t cmd_index: 6; ///< Command index + uint32_t response_expect: 1; ///< set if response is expected + uint32_t response_long: 1; ///< 0: short response expected, 1: long response expected + uint32_t check_response_crc: 1; ///< set if controller should check response CRC + uint32_t data_expected: 1; ///< 0: no data expected, 1: data expected + uint32_t rw: 1; ///< 0: read from card, 1: write to card (don't care if no data expected) + uint32_t stream_mode: 1; ///< 0: block transfer, 1: stream transfer (don't care if no data expected) + uint32_t send_auto_stop: 1; ///< set to send stop at the end of the transfer + uint32_t wait_complete: 1; ///< 0: send command at once, 1: wait for previous command to complete + uint32_t stop_abort_cmd: 1; ///< set if this is a stop or abort command intended to stop current transfer + uint32_t send_init: 1; ///< set to send init sequence (80 clocks of 1) + uint32_t card_num: 5; ///< card number + uint32_t update_clk_reg: 1; ///< 0: normal command, 1: don't send command, just update clock registers + uint32_t read_ceata: 1; ///< set if performing read from CE-ATA device + uint32_t ccs_expected: 1; ///< set if CCS is expected from CE-ATA device + uint32_t enable_boot: 1; ///< set for mandatory boot mode + uint32_t expect_boot_ack: 1; ///< when set along with enable_boot, controller expects boot ack pattern + uint32_t disable_boot: 1; ///< set to terminate boot operation (don't set along with enable_boot) + uint32_t boot_mode: 1; ///< 0: mandatory boot operation, 1: alternate boot operation + uint32_t volt_switch: 1; ///< set to enable voltage switching (for CMD11 only) + uint32_t use_hold_reg: 1; ///< clear to bypass HOLD register + uint32_t reserved: 1; + uint32_t start_command: 1; ///< Start command; once command is sent to the card, bit is cleared. +} sdmmc_hw_cmd_t; ///< command format used in cmd register; this structure is defined to make it easier to build command values + +_Static_assert(sizeof(sdmmc_hw_cmd_t) == 4, "invalid size of sdmmc_cmd_t structure"); + + +typedef volatile struct sdmmc_dev_s { + union { + struct { + uint32_t controller_reset: 1; + uint32_t fifo_reset: 1; + uint32_t dma_reset: 1; + uint32_t reserved1: 1; + uint32_t int_enable: 1; + uint32_t dma_enable: 1; + uint32_t read_wait: 1; + uint32_t send_irq_response: 1; + uint32_t abort_read_data: 1; + uint32_t send_ccsd: 1; + uint32_t send_auto_stop_ccsd: 1; + uint32_t ceata_device_interrupt_status: 1; + uint32_t reserved2: 4; + uint32_t card_voltage_a: 4; + uint32_t card_voltage_b: 4; + uint32_t enable_od_pullup: 1; + uint32_t use_internal_dma: 1; + uint32_t reserved3: 6; + }; + uint32_t val; + } ctrl; + + uint32_t pwren; ///< 1: enable power to card, 0: disable power to card + + union { + struct { + uint32_t div0: 8; ///< 0: bypass, 1-255: divide clock by (2*div0). + uint32_t div1: 8; ///< 0: bypass, 1-255: divide clock by (2*div0). + uint32_t div2: 8; ///< 0: bypass, 1-255: divide clock by (2*div0). + uint32_t div3: 8; ///< 0: bypass, 1-255: divide clock by (2*div0). + }; + uint32_t val; + } clkdiv; + + union { + struct { + uint32_t card0: 2; ///< 0-3: select clock divider for card 0 among div0-div3 + uint32_t card1: 2; ///< 0-3: select clock divider for card 1 among div0-div3 + uint32_t reserved: 28; + }; + uint32_t val; + } clksrc; + + union { + struct { + uint32_t cclk_enable: 16; ///< 1: enable clock to card, 0: disable clock + uint32_t cclk_low_power: 16; ///< 1: enable clock gating when card is idle, 0: disable clock gating + }; + uint32_t val; + } clkena; + + union { + struct { + uint32_t response: 8; ///< response timeout, in card output clock cycles + uint32_t data: 24; ///< data read timeout, in card output clock cycles + }; + uint32_t val; + } tmout; + + union { + struct { + uint32_t card_width: 16; ///< one bit for each card: 0: 1-bit mode, 1: 4-bit mode + uint32_t card_width_8: 16; ///< one bit for each card: 0: not 8-bit mode (corresponding card_width bit is used), 1: 8-bit mode (card_width bit is ignored) + }; + uint32_t val; + } ctype; + + uint32_t blksiz: 16; ///< block size, default 0x200 + uint32_t : 16; + + uint32_t bytcnt; ///< number of bytes to be transferred + + union { + struct { + uint32_t cd: 1; ///< Card detect interrupt enable + uint32_t re: 1; ///< Response error interrupt enable + uint32_t cmd_done: 1; ///< Command done interrupt enable + uint32_t dto: 1; ///< Data transfer over interrupt enable + uint32_t txdr: 1; ///< Transmit FIFO data request interrupt enable + uint32_t rxdr: 1; ///< Receive FIFO data request interrupt enable + uint32_t rcrc: 1; ///< Response CRC error interrupt enable + uint32_t dcrc: 1; ///< Data CRC error interrupt enable + uint32_t rto: 1; ///< Response timeout interrupt enable + uint32_t drto: 1; ///< Data read timeout interrupt enable + uint32_t hto: 1; ///< Data starvation-by-host timeout interrupt enable + uint32_t frun: 1; ///< FIFO underrun/overrun error interrupt enable + uint32_t hle: 1; ///< Hardware locked write error interrupt enable + uint32_t sbi_bci: 1; ///< Start bit error / busy clear interrupt enable + uint32_t acd: 1; ///< Auto command done interrupt enable + uint32_t ebe: 1; ///< End bit error / write no CRC interrupt enable + uint32_t sdio: 16; ///< SDIO interrupt enable + }; + uint32_t val; + } intmask; + + uint32_t cmdarg; ///< Command argument to be passed to card + + sdmmc_hw_cmd_t cmd; + + uint32_t resp[4]; ///< Response from card + + union { + struct { + uint32_t cd: 1; ///< Card detect interrupt masked status + uint32_t re: 1; ///< Response error interrupt masked status + uint32_t cmd_done: 1; ///< Command done interrupt masked status + uint32_t dto: 1; ///< Data transfer over interrupt masked status + uint32_t txdr: 1; ///< Transmit FIFO data request interrupt masked status + uint32_t rxdr: 1; ///< Receive FIFO data request interrupt masked status + uint32_t rcrc: 1; ///< Response CRC error interrupt masked status + uint32_t dcrc: 1; ///< Data CRC error interrupt masked status + uint32_t rto: 1; ///< Response timeout interrupt masked status + uint32_t drto: 1; ///< Data read timeout interrupt masked status + uint32_t hto: 1; ///< Data starvation-by-host timeout interrupt masked status + uint32_t frun: 1; ///< FIFO underrun/overrun error interrupt masked status + uint32_t hle: 1; ///< Hardware locked write error interrupt masked status + uint32_t sbi_bci: 1; ///< Start bit error / busy clear interrupt masked status + uint32_t acd: 1; ///< Auto command done interrupt masked status + uint32_t ebe: 1; ///< End bit error / write no CRC interrupt masked status + uint32_t sdio: 16; ///< SDIO interrupt masked status + }; + uint32_t val; + } mintsts; + + union { + struct { + uint32_t cd: 1; ///< Card detect raw interrupt status + uint32_t re: 1; ///< Response error raw interrupt status + uint32_t cmd_done: 1; ///< Command done raw interrupt status + uint32_t dto: 1; ///< Data transfer over raw interrupt status + uint32_t txdr: 1; ///< Transmit FIFO data request raw interrupt status + uint32_t rxdr: 1; ///< Receive FIFO data request raw interrupt status + uint32_t rcrc: 1; ///< Response CRC error raw interrupt status + uint32_t dcrc: 1; ///< Data CRC error raw interrupt status + uint32_t rto: 1; ///< Response timeout raw interrupt status + uint32_t drto: 1; ///< Data read timeout raw interrupt status + uint32_t hto: 1; ///< Data starvation-by-host timeout raw interrupt status + uint32_t frun: 1; ///< FIFO underrun/overrun error raw interrupt status + uint32_t hle: 1; ///< Hardware locked write error raw interrupt status + uint32_t sbi_bci: 1; ///< Start bit error / busy clear raw interrupt status + uint32_t acd: 1; ///< Auto command done raw interrupt status + uint32_t ebe: 1; ///< End bit error / write no CRC raw interrupt status + uint32_t sdio: 16; ///< SDIO raw interrupt status + }; + uint32_t val; + } rintsts; ///< interrupts can be cleared by writing this register + + union { + struct { + uint32_t fifo_rx_watermark: 1; ///< FIFO reached receive watermark level + uint32_t fifo_tx_watermark: 1; ///< FIFO reached transmit watermark level + uint32_t fifo_empty: 1; ///< FIFO is empty + uint32_t fifo_full: 1; ///< FIFO is full + uint32_t cmd_fsm_state: 4; ///< command FSM state + uint32_t data3_status: 1; ///< this bit reads 1 if card is present + uint32_t data_busy: 1; ///< this bit reads 1 if card is busy + uint32_t data_fsm_busy: 1; ///< this bit reads 1 if transmit/receive FSM is busy + uint32_t response_index: 6; ///< index of the previous response + uint32_t fifo_count: 13; ///< number of filled locations in the FIFO + uint32_t dma_ack: 1; ///< DMA acknowledge signal + uint32_t dma_req: 1; ///< DMA request signal + }; + uint32_t val; + } status; + + union { + struct { + uint32_t tx_watermark: 12; ///< FIFO TX watermark level + uint32_t reserved1: 4; + uint32_t rx_watermark: 12; ///< FIFO RX watermark level + uint32_t dw_dma_mts: 3; + uint32_t reserved2: 1; + }; + uint32_t val; + } fifoth; + + union { + struct { + uint32_t cards: 2; ///< bit N reads 0 if card N is present + uint32_t reserved: 30; + }; + uint32_t val; + } cdetect; + + union { + struct { + uint32_t cards: 2; ///< bit N reads 1 if card N is write protected + uint32_t reserved: 30; + }; + uint32_t val; + } wrtprt; + + uint32_t gpio; ///< unused + uint32_t tcbcnt; ///< transferred (to card) byte count + uint32_t tbbcnt; ///< transferred from host to FIFO byte count + + union { + struct { + uint32_t debounce_count: 24; ///< number of host cycles used by debounce filter, typical time should be 5-25ms + uint32_t reserved: 8; + }; + } debnce; + + uint32_t usrid; ///< user ID + uint32_t verid; ///< IP block version + uint32_t hcon; ///< compile-time IP configuration + union { + struct { + uint32_t voltage: 16; ///< voltage control for slots; no-op on ESP32. + uint32_t ddr: 16; ///< bit N enables DDR mode for card N + }; + } uhs; ///< UHS related settings + + union { + struct { + uint32_t cards: 2; ///< bit N resets card N, active low + uint32_t reserved: 30; + }; + } rst_n; + + uint32_t reserved_7c; + + union { + struct { + uint32_t sw_reset: 1; ///< set to reset DMA controller + uint32_t fb: 1; ///< set if AHB master performs fixed burst transfers + uint32_t dsl: 5; ///< descriptor skip length: number of words to skip between two unchained descriptors + uint32_t enable: 1; ///< set to enable IDMAC + uint32_t pbl: 3; ///< programmable burst length + uint32_t reserved: 21; + }; + uint32_t val; + } bmod; + + uint32_t pldmnd; ///< set any bit to resume IDMAC FSM from suspended state + sdmmc_desc_t* dbaddr; ///< descriptor list base + + union { + struct { + uint32_t ti: 1; ///< transmit interrupt status + uint32_t ri: 1; ///< receive interrupt status + uint32_t fbe: 1; ///< fatal bus error + uint32_t reserved1: 1; + uint32_t du: 1; ///< descriptor unavailable + uint32_t ces: 1; ///< card error summary + uint32_t reserved2: 2; + uint32_t nis: 1; ///< normal interrupt summary + uint32_t fbe_code: 3; ///< code of fatal bus error + uint32_t fsm: 4; ///< DMAC FSM state + uint32_t reserved3: 15; + }; + uint32_t val; + } idsts; + + union { + struct { + uint32_t ti: 1; ///< transmit interrupt enable + uint32_t ri: 1; ///< receive interrupt enable + uint32_t fbe: 1; ///< fatal bus error interrupt enable + uint32_t reserved1: 1; + uint32_t du: 1; ///< descriptor unavailable interrupt enable + uint32_t ces: 1; ///< card error interrupt enable + uint32_t reserved2: 2; + uint32_t ni: 1; ///< normal interrupt interrupt enable + uint32_t ai: 1; ///< abnormal interrupt enable + uint32_t reserved3: 22; + }; + uint32_t val; + } idinten; + + uint32_t dscaddr; ///< current host descriptor address + uint32_t dscaddrl; ///< unused + uint32_t dscaddru; ///< unused + uint32_t bufaddrl; ///< unused + uint32_t bufaddru; ///< unused + uint32_t reserved_a8[22]; + union { + struct { + uint32_t read_thr_en : 1; ///< initiate transfer only if FIFO has more space than the read threshold + uint32_t busy_clr_int_en : 1; ///< enable generation of busy clear interrupts + uint32_t write_thr_en : 1; ///< equivalent of read_thr_en for writes + uint32_t reserved1 : 13; + uint32_t card_threshold : 12; ///< threshold value for reads/writes, in bytes + }; + uint32_t val; + } cardthrctl; + uint32_t back_end_power; + uint32_t uhs_reg_ext; + uint32_t emmc_ddr_reg; + uint32_t enable_shift; + uint32_t reserved_114[443]; + union { + struct { + uint32_t phase_dout: 3; ///< phase of data output clock (0x0: 0, 0x1: 90, 0x4: 180, 0x6: 270) + uint32_t phase_din: 3; ///< phase of data input clock + uint32_t phase_core: 3; ///< phase of the clock to SDMMC peripheral + uint32_t div_factor_p: 4; ///< controls clock period; it will be (div_factor_p + 1) / 160MHz + uint32_t div_factor_h: 4; ///< controls length of high pulse; it will be (div_factor_h + 1) / 160MHz + uint32_t div_factor_m: 4; ///< should be equal to div_factor_p + }; + uint32_t val; + } clock; +} sdmmc_dev_t; +extern sdmmc_dev_t SDMMC; + +_Static_assert(sizeof(sdmmc_dev_t) == 0x804, "invalid size of sdmmc_dev_t structure"); + +#ifdef __cplusplus +} +#endif + +#endif //_SOC_SDMMC_STRUCT_H_ diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/sens_reg.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/sens_reg.h new file mode 100644 index 0000000000000..34834376e8967 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/sens_reg.h @@ -0,0 +1,1068 @@ +// 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. +#ifndef _SOC_SENS_REG_H_ +#define _SOC_SENS_REG_H_ + + +#include "soc.h" +#define SENS_SAR_READ_CTRL_REG (DR_REG_SENS_BASE + 0x0000) +/* SENS_SAR1_DATA_INV : R/W ;bitpos:[28] ;default: 1'd0 ; */ +/*description: Invert SAR ADC1 data*/ +#define SENS_SAR1_DATA_INV (BIT(28)) +#define SENS_SAR1_DATA_INV_M (BIT(28)) +#define SENS_SAR1_DATA_INV_V 0x1 +#define SENS_SAR1_DATA_INV_S 28 +/* SENS_SAR1_DIG_FORCE : R/W ;bitpos:[27] ;default: 1'd0 ; */ +/*description: 1: SAR ADC1 controlled by DIG ADC1 CTRL 0: SAR ADC1 controlled by RTC ADC1 CTRL*/ +#define SENS_SAR1_DIG_FORCE (BIT(27)) +#define SENS_SAR1_DIG_FORCE_M (BIT(27)) +#define SENS_SAR1_DIG_FORCE_V 0x1 +#define SENS_SAR1_DIG_FORCE_S 27 +/* SENS_SAR1_SAMPLE_NUM : R/W ;bitpos:[26:19] ;default: 8'd0 ; */ +/*description: */ +#define SENS_SAR1_SAMPLE_NUM 0x000000FF +#define SENS_SAR1_SAMPLE_NUM_M ((SENS_SAR1_SAMPLE_NUM_V)<<(SENS_SAR1_SAMPLE_NUM_S)) +#define SENS_SAR1_SAMPLE_NUM_V 0xFF +#define SENS_SAR1_SAMPLE_NUM_S 19 +/* SENS_SAR1_CLK_GATED : R/W ;bitpos:[18] ;default: 1'b1 ; */ +/*description: */ +#define SENS_SAR1_CLK_GATED (BIT(18)) +#define SENS_SAR1_CLK_GATED_M (BIT(18)) +#define SENS_SAR1_CLK_GATED_V 0x1 +#define SENS_SAR1_CLK_GATED_S 18 +/* SENS_SAR1_SAMPLE_BIT : R/W ;bitpos:[17:16] ;default: 2'd3 ; */ +/*description: 00: for 9-bit width 01: for 10-bit width 10: for 11-bit width + 11: for 12-bit width*/ +#define SENS_SAR1_SAMPLE_BIT 0x00000003 +#define SENS_SAR1_SAMPLE_BIT_M ((SENS_SAR1_SAMPLE_BIT_V)<<(SENS_SAR1_SAMPLE_BIT_S)) +#define SENS_SAR1_SAMPLE_BIT_V 0x3 +#define SENS_SAR1_SAMPLE_BIT_S 16 +/* SENS_SAR1_SAMPLE_CYCLE : R/W ;bitpos:[15:8] ;default: 8'd9 ; */ +/*description: sample cycles for SAR ADC1*/ +#define SENS_SAR1_SAMPLE_CYCLE 0x000000FF +#define SENS_SAR1_SAMPLE_CYCLE_M ((SENS_SAR1_SAMPLE_CYCLE_V)<<(SENS_SAR1_SAMPLE_CYCLE_S)) +#define SENS_SAR1_SAMPLE_CYCLE_V 0xFF +#define SENS_SAR1_SAMPLE_CYCLE_S 8 +/* SENS_SAR1_CLK_DIV : R/W ;bitpos:[7:0] ;default: 8'd2 ; */ +/*description: clock divider*/ +#define SENS_SAR1_CLK_DIV 0x000000FF +#define SENS_SAR1_CLK_DIV_M ((SENS_SAR1_CLK_DIV_V)<<(SENS_SAR1_CLK_DIV_S)) +#define SENS_SAR1_CLK_DIV_V 0xFF +#define SENS_SAR1_CLK_DIV_S 0 + +#define SENS_SAR_READ_STATUS1_REG (DR_REG_SENS_BASE + 0x0004) +/* SENS_SAR1_READER_STATUS : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define SENS_SAR1_READER_STATUS 0xFFFFFFFF +#define SENS_SAR1_READER_STATUS_M ((SENS_SAR1_READER_STATUS_V)<<(SENS_SAR1_READER_STATUS_S)) +#define SENS_SAR1_READER_STATUS_V 0xFFFFFFFF +#define SENS_SAR1_READER_STATUS_S 0 + +#define SENS_SAR_MEAS_WAIT1_REG (DR_REG_SENS_BASE + 0x0008) +/* SENS_SAR_AMP_WAIT2 : R/W ;bitpos:[31:16] ;default: 16'd10 ; */ +/*description: */ +#define SENS_SAR_AMP_WAIT2 0x0000FFFF +#define SENS_SAR_AMP_WAIT2_M ((SENS_SAR_AMP_WAIT2_V)<<(SENS_SAR_AMP_WAIT2_S)) +#define SENS_SAR_AMP_WAIT2_V 0xFFFF +#define SENS_SAR_AMP_WAIT2_S 16 +/* SENS_SAR_AMP_WAIT1 : R/W ;bitpos:[15:0] ;default: 16'd10 ; */ +/*description: */ +#define SENS_SAR_AMP_WAIT1 0x0000FFFF +#define SENS_SAR_AMP_WAIT1_M ((SENS_SAR_AMP_WAIT1_V)<<(SENS_SAR_AMP_WAIT1_S)) +#define SENS_SAR_AMP_WAIT1_V 0xFFFF +#define SENS_SAR_AMP_WAIT1_S 0 + +#define SENS_SAR_MEAS_WAIT2_REG (DR_REG_SENS_BASE + 0x000c) +/* SENS_SAR2_RSTB_WAIT : R/W ;bitpos:[27:20] ;default: 8'd2 ; */ +/*description: */ +#define SENS_SAR2_RSTB_WAIT 0x000000FF +#define SENS_SAR2_RSTB_WAIT_M ((SENS_SAR2_RSTB_WAIT_V)<<(SENS_SAR2_RSTB_WAIT_S)) +#define SENS_SAR2_RSTB_WAIT_V 0xFF +#define SENS_SAR2_RSTB_WAIT_S 20 +/* SENS_FORCE_XPD_SAR : R/W ;bitpos:[19:18] ;default: 2'd0 ; */ +/*description: */ +#define SENS_FORCE_XPD_SAR 0x00000003 +#define SENS_FORCE_XPD_SAR_M ((SENS_FORCE_XPD_SAR_V)<<(SENS_FORCE_XPD_SAR_S)) +#define SENS_FORCE_XPD_SAR_V 0x3 +#define SENS_FORCE_XPD_SAR_S 18 +#define SENS_FORCE_XPD_SAR_SW_M (BIT1) +#define SENS_FORCE_XPD_SAR_FSM 0 // Use FSM to control power down +#define SENS_FORCE_XPD_SAR_PD 2 // Force power down +#define SENS_FORCE_XPD_SAR_PU 3 // Force power up +/* SENS_FORCE_XPD_AMP : R/W ;bitpos:[17:16] ;default: 2'd0 ; */ +/*description: */ +#define SENS_FORCE_XPD_AMP 0x00000003 +#define SENS_FORCE_XPD_AMP_M ((SENS_FORCE_XPD_AMP_V)<<(SENS_FORCE_XPD_AMP_S)) +#define SENS_FORCE_XPD_AMP_V 0x3 +#define SENS_FORCE_XPD_AMP_S 16 +#define SENS_FORCE_XPD_AMP_FSM 0 // Use FSM to control power down +#define SENS_FORCE_XPD_AMP_PD 2 // Force power down +#define SENS_FORCE_XPD_AMP_PU 3 // Force power up +/* SENS_SAR_AMP_WAIT3 : R/W ;bitpos:[15:0] ;default: 16'd10 ; */ +/*description: */ +#define SENS_SAR_AMP_WAIT3 0x0000FFFF +#define SENS_SAR_AMP_WAIT3_M ((SENS_SAR_AMP_WAIT3_V)<<(SENS_SAR_AMP_WAIT3_S)) +#define SENS_SAR_AMP_WAIT3_V 0xFFFF +#define SENS_SAR_AMP_WAIT3_S 0 + +#define SENS_SAR_MEAS_CTRL_REG (DR_REG_SENS_BASE + 0x0010) +/* SENS_SAR2_XPD_WAIT : R/W ;bitpos:[31:24] ;default: 8'h7 ; */ +/*description: */ +#define SENS_SAR2_XPD_WAIT 0x000000FF +#define SENS_SAR2_XPD_WAIT_M ((SENS_SAR2_XPD_WAIT_V)<<(SENS_SAR2_XPD_WAIT_S)) +#define SENS_SAR2_XPD_WAIT_V 0xFF +#define SENS_SAR2_XPD_WAIT_S 24 +/* SENS_SAR_RSTB_FSM : R/W ;bitpos:[23:20] ;default: 4'b0000 ; */ +/*description: */ +#define SENS_SAR_RSTB_FSM 0x0000000F +#define SENS_SAR_RSTB_FSM_M ((SENS_SAR_RSTB_FSM_V)<<(SENS_SAR_RSTB_FSM_S)) +#define SENS_SAR_RSTB_FSM_V 0xF +#define SENS_SAR_RSTB_FSM_S 20 +/* SENS_XPD_SAR_FSM : R/W ;bitpos:[19:16] ;default: 4'b0111 ; */ +/*description: */ +#define SENS_XPD_SAR_FSM 0x0000000F +#define SENS_XPD_SAR_FSM_M ((SENS_XPD_SAR_FSM_V)<<(SENS_XPD_SAR_FSM_S)) +#define SENS_XPD_SAR_FSM_V 0xF +#define SENS_XPD_SAR_FSM_S 16 +/* SENS_AMP_SHORT_REF_GND_FSM : R/W ;bitpos:[15:12] ;default: 4'b0011 ; */ +/*description: */ +#define SENS_AMP_SHORT_REF_GND_FSM 0x0000000F +#define SENS_AMP_SHORT_REF_GND_FSM_M ((SENS_AMP_SHORT_REF_GND_FSM_V)<<(SENS_AMP_SHORT_REF_GND_FSM_S)) +#define SENS_AMP_SHORT_REF_GND_FSM_V 0xF +#define SENS_AMP_SHORT_REF_GND_FSM_S 12 +/* SENS_AMP_SHORT_REF_FSM : R/W ;bitpos:[11:8] ;default: 4'b0011 ; */ +/*description: */ +#define SENS_AMP_SHORT_REF_FSM 0x0000000F +#define SENS_AMP_SHORT_REF_FSM_M ((SENS_AMP_SHORT_REF_FSM_V)<<(SENS_AMP_SHORT_REF_FSM_S)) +#define SENS_AMP_SHORT_REF_FSM_V 0xF +#define SENS_AMP_SHORT_REF_FSM_S 8 +/* SENS_AMP_RST_FB_FSM : R/W ;bitpos:[7:4] ;default: 4'b1000 ; */ +/*description: */ +#define SENS_AMP_RST_FB_FSM 0x0000000F +#define SENS_AMP_RST_FB_FSM_M ((SENS_AMP_RST_FB_FSM_V)<<(SENS_AMP_RST_FB_FSM_S)) +#define SENS_AMP_RST_FB_FSM_V 0xF +#define SENS_AMP_RST_FB_FSM_S 4 +/* SENS_XPD_SAR_AMP_FSM : R/W ;bitpos:[3:0] ;default: 4'b1111 ; */ +/*description: */ +#define SENS_XPD_SAR_AMP_FSM 0x0000000F +#define SENS_XPD_SAR_AMP_FSM_M ((SENS_XPD_SAR_AMP_FSM_V)<<(SENS_XPD_SAR_AMP_FSM_S)) +#define SENS_XPD_SAR_AMP_FSM_V 0xF +#define SENS_XPD_SAR_AMP_FSM_S 0 + +#define SENS_SAR_READ_STATUS2_REG (DR_REG_SENS_BASE + 0x0014) +/* SENS_SAR2_READER_STATUS : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define SENS_SAR2_READER_STATUS 0xFFFFFFFF +#define SENS_SAR2_READER_STATUS_M ((SENS_SAR2_READER_STATUS_V)<<(SENS_SAR2_READER_STATUS_S)) +#define SENS_SAR2_READER_STATUS_V 0xFFFFFFFF +#define SENS_SAR2_READER_STATUS_S 0 + +#define SENS_ULP_CP_SLEEP_CYC0_REG (DR_REG_SENS_BASE + 0x0018) +/* SENS_SLEEP_CYCLES_S0 : R/W ;bitpos:[31:0] ;default: 32'd200 ; */ +/*description: sleep cycles for ULP-coprocessor timer*/ +#define SENS_SLEEP_CYCLES_S0 0xFFFFFFFF +#define SENS_SLEEP_CYCLES_S0_M ((SENS_SLEEP_CYCLES_S0_V)<<(SENS_SLEEP_CYCLES_S0_S)) +#define SENS_SLEEP_CYCLES_S0_V 0xFFFFFFFF +#define SENS_SLEEP_CYCLES_S0_S 0 + +#define SENS_ULP_CP_SLEEP_CYC1_REG (DR_REG_SENS_BASE + 0x001c) +/* SENS_SLEEP_CYCLES_S1 : R/W ;bitpos:[31:0] ;default: 32'd100 ; */ +/*description: */ +#define SENS_SLEEP_CYCLES_S1 0xFFFFFFFF +#define SENS_SLEEP_CYCLES_S1_M ((SENS_SLEEP_CYCLES_S1_V)<<(SENS_SLEEP_CYCLES_S1_S)) +#define SENS_SLEEP_CYCLES_S1_V 0xFFFFFFFF +#define SENS_SLEEP_CYCLES_S1_S 0 + +#define SENS_ULP_CP_SLEEP_CYC2_REG (DR_REG_SENS_BASE + 0x0020) +/* SENS_SLEEP_CYCLES_S2 : R/W ;bitpos:[31:0] ;default: 32'd50 ; */ +/*description: */ +#define SENS_SLEEP_CYCLES_S2 0xFFFFFFFF +#define SENS_SLEEP_CYCLES_S2_M ((SENS_SLEEP_CYCLES_S2_V)<<(SENS_SLEEP_CYCLES_S2_S)) +#define SENS_SLEEP_CYCLES_S2_V 0xFFFFFFFF +#define SENS_SLEEP_CYCLES_S2_S 0 + +#define SENS_ULP_CP_SLEEP_CYC3_REG (DR_REG_SENS_BASE + 0x0024) +/* SENS_SLEEP_CYCLES_S3 : R/W ;bitpos:[31:0] ;default: 32'd40 ; */ +/*description: */ +#define SENS_SLEEP_CYCLES_S3 0xFFFFFFFF +#define SENS_SLEEP_CYCLES_S3_M ((SENS_SLEEP_CYCLES_S3_V)<<(SENS_SLEEP_CYCLES_S3_S)) +#define SENS_SLEEP_CYCLES_S3_V 0xFFFFFFFF +#define SENS_SLEEP_CYCLES_S3_S 0 + +#define SENS_ULP_CP_SLEEP_CYC4_REG (DR_REG_SENS_BASE + 0x0028) +/* SENS_SLEEP_CYCLES_S4 : R/W ;bitpos:[31:0] ;default: 32'd20 ; */ +/*description: */ +#define SENS_SLEEP_CYCLES_S4 0xFFFFFFFF +#define SENS_SLEEP_CYCLES_S4_M ((SENS_SLEEP_CYCLES_S4_V)<<(SENS_SLEEP_CYCLES_S4_S)) +#define SENS_SLEEP_CYCLES_S4_V 0xFFFFFFFF +#define SENS_SLEEP_CYCLES_S4_S 0 + +#define SENS_SAR_START_FORCE_REG (DR_REG_SENS_BASE + 0x002c) +/* SENS_SAR2_PWDET_EN : R/W ;bitpos:[24] ;default: 1'b0 ; */ +/*description: N/A*/ +#define SENS_SAR2_PWDET_EN (BIT(24)) +#define SENS_SAR2_PWDET_EN_M (BIT(24)) +#define SENS_SAR2_PWDET_EN_V 0x1 +#define SENS_SAR2_PWDET_EN_S 24 +/* SENS_SAR1_STOP : R/W ;bitpos:[23] ;default: 1'b0 ; */ +/*description: stop SAR ADC1 conversion*/ +#define SENS_SAR1_STOP (BIT(23)) +#define SENS_SAR1_STOP_M (BIT(23)) +#define SENS_SAR1_STOP_V 0x1 +#define SENS_SAR1_STOP_S 23 +/* SENS_SAR2_STOP : R/W ;bitpos:[22] ;default: 1'b0 ; */ +/*description: stop SAR ADC2 conversion*/ +#define SENS_SAR2_STOP (BIT(22)) +#define SENS_SAR2_STOP_M (BIT(22)) +#define SENS_SAR2_STOP_V 0x1 +#define SENS_SAR2_STOP_S 22 +/* SENS_PC_INIT : R/W ;bitpos:[21:11] ;default: 11'b0 ; */ +/*description: initialized PC for ULP-coprocessor*/ +#define SENS_PC_INIT 0x000007FF +#define SENS_PC_INIT_M ((SENS_PC_INIT_V)<<(SENS_PC_INIT_S)) +#define SENS_PC_INIT_V 0x7FF +#define SENS_PC_INIT_S 11 +/* SENS_SARCLK_EN : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define SENS_SARCLK_EN (BIT(10)) +#define SENS_SARCLK_EN_M (BIT(10)) +#define SENS_SARCLK_EN_V 0x1 +#define SENS_SARCLK_EN_S 10 +/* SENS_ULP_CP_START_TOP : R/W ;bitpos:[9] ;default: 1'b0 ; */ +/*description: Write 1 to start ULP-coprocessor only active when reg_ulp_cp_force_start_top + = 1*/ +#define SENS_ULP_CP_START_TOP (BIT(9)) +#define SENS_ULP_CP_START_TOP_M (BIT(9)) +#define SENS_ULP_CP_START_TOP_V 0x1 +#define SENS_ULP_CP_START_TOP_S 9 +/* SENS_ULP_CP_FORCE_START_TOP : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: 1: ULP-coprocessor is started by SW 0: ULP-coprocessor is started by timer*/ +#define SENS_ULP_CP_FORCE_START_TOP (BIT(8)) +#define SENS_ULP_CP_FORCE_START_TOP_M (BIT(8)) +#define SENS_ULP_CP_FORCE_START_TOP_V 0x1 +#define SENS_ULP_CP_FORCE_START_TOP_S 8 +/* SENS_SAR2_PWDET_CCT : R/W ;bitpos:[7:5] ;default: 3'b0 ; */ +/*description: SAR2_PWDET_CCT PA power detector capacitance tuning.*/ +#define SENS_SAR2_PWDET_CCT 0x00000007 +#define SENS_SAR2_PWDET_CCT_M ((SENS_SAR2_PWDET_CCT_V)<<(SENS_SAR2_PWDET_CCT_S)) +#define SENS_SAR2_PWDET_CCT_V 0x7 +#define SENS_SAR2_PWDET_CCT_S 5 +/* SENS_SAR2_EN_TEST : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: SAR2_EN_TEST only active when reg_sar2_dig_force = 0*/ +#define SENS_SAR2_EN_TEST (BIT(4)) +#define SENS_SAR2_EN_TEST_M (BIT(4)) +#define SENS_SAR2_EN_TEST_V 0x1 +#define SENS_SAR2_EN_TEST_S 4 +/* SENS_SAR2_BIT_WIDTH : R/W ;bitpos:[3:2] ;default: 2'b11 ; */ +/*description: 00: 9 bit 01: 10 bits 10: 11bits 11: 12bits*/ +#define SENS_SAR2_BIT_WIDTH 0x00000003 +#define SENS_SAR2_BIT_WIDTH_M ((SENS_SAR2_BIT_WIDTH_V)<<(SENS_SAR2_BIT_WIDTH_S)) +#define SENS_SAR2_BIT_WIDTH_V 0x3 +#define SENS_SAR2_BIT_WIDTH_S 2 +/* SENS_SAR1_BIT_WIDTH : R/W ;bitpos:[1:0] ;default: 2'b11 ; */ +/*description: 00: 9 bit 01: 10 bits 10: 11bits 11: 12bits*/ +#define SENS_SAR1_BIT_WIDTH 0x00000003 +#define SENS_SAR1_BIT_WIDTH_M ((SENS_SAR1_BIT_WIDTH_V)<<(SENS_SAR1_BIT_WIDTH_S)) +#define SENS_SAR1_BIT_WIDTH_V 0x3 +#define SENS_SAR1_BIT_WIDTH_S 0 + +#define SENS_SAR_MEM_WR_CTRL_REG (DR_REG_SENS_BASE + 0x0030) +/* SENS_RTC_MEM_WR_OFFST_CLR : WO ;bitpos:[22] ;default: 1'd0 ; */ +/*description: */ +#define SENS_RTC_MEM_WR_OFFST_CLR (BIT(22)) +#define SENS_RTC_MEM_WR_OFFST_CLR_M (BIT(22)) +#define SENS_RTC_MEM_WR_OFFST_CLR_V 0x1 +#define SENS_RTC_MEM_WR_OFFST_CLR_S 22 +/* SENS_MEM_WR_ADDR_SIZE : R/W ;bitpos:[21:11] ;default: 11'd512 ; */ +/*description: */ +#define SENS_MEM_WR_ADDR_SIZE 0x000007FF +#define SENS_MEM_WR_ADDR_SIZE_M ((SENS_MEM_WR_ADDR_SIZE_V)<<(SENS_MEM_WR_ADDR_SIZE_S)) +#define SENS_MEM_WR_ADDR_SIZE_V 0x7FF +#define SENS_MEM_WR_ADDR_SIZE_S 11 +/* SENS_MEM_WR_ADDR_INIT : R/W ;bitpos:[10:0] ;default: 11'd512 ; */ +/*description: */ +#define SENS_MEM_WR_ADDR_INIT 0x000007FF +#define SENS_MEM_WR_ADDR_INIT_M ((SENS_MEM_WR_ADDR_INIT_V)<<(SENS_MEM_WR_ADDR_INIT_S)) +#define SENS_MEM_WR_ADDR_INIT_V 0x7FF +#define SENS_MEM_WR_ADDR_INIT_S 0 + +#define SENS_SAR_ATTEN1_REG (DR_REG_SENS_BASE + 0x0034) +/* SENS_SAR1_ATTEN : R/W ;bitpos:[31:0] ;default: 32'hffffffff ; */ +/*description: 2-bit attenuation for each pad 11:1dB 10:6dB 01:3dB 00:0dB*/ +#define SENS_SAR1_ATTEN 0xFFFFFFFF +#define SENS_SAR1_ATTEN_M ((SENS_SAR1_ATTEN_V)<<(SENS_SAR1_ATTEN_S)) +#define SENS_SAR1_ATTEN_V 0xFFFFFFFF +#define SENS_SAR1_ATTEN_S 0 +#define SENS_SAR1_ATTEN_VAL_MASK 0x3 +#define SENS_SAR2_ATTEN_VAL_MASK 0x3 + +#define SENS_SAR_ATTEN2_REG (DR_REG_SENS_BASE + 0x0038) +/* SENS_SAR2_ATTEN : R/W ;bitpos:[31:0] ;default: 32'hffffffff ; */ +/*description: 2-bit attenuation for each pad 11:1dB 10:6dB 01:3dB 00:0dB*/ +#define SENS_SAR2_ATTEN 0xFFFFFFFF +#define SENS_SAR2_ATTEN_M ((SENS_SAR2_ATTEN_V)<<(SENS_SAR2_ATTEN_S)) +#define SENS_SAR2_ATTEN_V 0xFFFFFFFF +#define SENS_SAR2_ATTEN_S 0 + +#define SENS_SAR_SLAVE_ADDR1_REG (DR_REG_SENS_BASE + 0x003c) +/* SENS_MEAS_STATUS : RO ;bitpos:[29:22] ;default: 8'h0 ; */ +/*description: */ +#define SENS_MEAS_STATUS 0x000000FF +#define SENS_MEAS_STATUS_M ((SENS_MEAS_STATUS_V)<<(SENS_MEAS_STATUS_S)) +#define SENS_MEAS_STATUS_V 0xFF +#define SENS_MEAS_STATUS_S 22 +/* SENS_I2C_SLAVE_ADDR0 : R/W ;bitpos:[21:11] ;default: 11'h0 ; */ +/*description: */ +#define SENS_I2C_SLAVE_ADDR0 0x000007FF +#define SENS_I2C_SLAVE_ADDR0_M ((SENS_I2C_SLAVE_ADDR0_V)<<(SENS_I2C_SLAVE_ADDR0_S)) +#define SENS_I2C_SLAVE_ADDR0_V 0x7FF +#define SENS_I2C_SLAVE_ADDR0_S 11 +/* SENS_I2C_SLAVE_ADDR1 : R/W ;bitpos:[10:0] ;default: 11'h0 ; */ +/*description: */ +#define SENS_I2C_SLAVE_ADDR1 0x000007FF +#define SENS_I2C_SLAVE_ADDR1_M ((SENS_I2C_SLAVE_ADDR1_V)<<(SENS_I2C_SLAVE_ADDR1_S)) +#define SENS_I2C_SLAVE_ADDR1_V 0x7FF +#define SENS_I2C_SLAVE_ADDR1_S 0 + +#define SENS_SAR_SLAVE_ADDR2_REG (DR_REG_SENS_BASE + 0x0040) +/* SENS_I2C_SLAVE_ADDR2 : R/W ;bitpos:[21:11] ;default: 11'h0 ; */ +/*description: */ +#define SENS_I2C_SLAVE_ADDR2 0x000007FF +#define SENS_I2C_SLAVE_ADDR2_M ((SENS_I2C_SLAVE_ADDR2_V)<<(SENS_I2C_SLAVE_ADDR2_S)) +#define SENS_I2C_SLAVE_ADDR2_V 0x7FF +#define SENS_I2C_SLAVE_ADDR2_S 11 +/* SENS_I2C_SLAVE_ADDR3 : R/W ;bitpos:[10:0] ;default: 11'h0 ; */ +/*description: */ +#define SENS_I2C_SLAVE_ADDR3 0x000007FF +#define SENS_I2C_SLAVE_ADDR3_M ((SENS_I2C_SLAVE_ADDR3_V)<<(SENS_I2C_SLAVE_ADDR3_S)) +#define SENS_I2C_SLAVE_ADDR3_V 0x7FF +#define SENS_I2C_SLAVE_ADDR3_S 0 + +#define SENS_SAR_SLAVE_ADDR3_REG (DR_REG_SENS_BASE + 0x0044) +/* SENS_TSENS_RDY_OUT : RO ;bitpos:[30] ;default: 1'h0 ; */ +/*description: indicate temperature sensor out ready*/ +#define SENS_TSENS_RDY_OUT (BIT(30)) +#define SENS_TSENS_RDY_OUT_M (BIT(30)) +#define SENS_TSENS_RDY_OUT_V 0x1 +#define SENS_TSENS_RDY_OUT_S 30 +/* SENS_TSENS_OUT : RO ;bitpos:[29:22] ;default: 8'h0 ; */ +/*description: temperature sensor data out*/ +#define SENS_TSENS_OUT 0x000000FF +#define SENS_TSENS_OUT_M ((SENS_TSENS_OUT_V)<<(SENS_TSENS_OUT_S)) +#define SENS_TSENS_OUT_V 0xFF +#define SENS_TSENS_OUT_S 22 +/* SENS_I2C_SLAVE_ADDR4 : R/W ;bitpos:[21:11] ;default: 11'h0 ; */ +/*description: */ +#define SENS_I2C_SLAVE_ADDR4 0x000007FF +#define SENS_I2C_SLAVE_ADDR4_M ((SENS_I2C_SLAVE_ADDR4_V)<<(SENS_I2C_SLAVE_ADDR4_S)) +#define SENS_I2C_SLAVE_ADDR4_V 0x7FF +#define SENS_I2C_SLAVE_ADDR4_S 11 +/* SENS_I2C_SLAVE_ADDR5 : R/W ;bitpos:[10:0] ;default: 11'h0 ; */ +/*description: */ +#define SENS_I2C_SLAVE_ADDR5 0x000007FF +#define SENS_I2C_SLAVE_ADDR5_M ((SENS_I2C_SLAVE_ADDR5_V)<<(SENS_I2C_SLAVE_ADDR5_S)) +#define SENS_I2C_SLAVE_ADDR5_V 0x7FF +#define SENS_I2C_SLAVE_ADDR5_S 0 + +#define SENS_SAR_SLAVE_ADDR4_REG (DR_REG_SENS_BASE + 0x0048) +/* SENS_I2C_DONE : RO ;bitpos:[30] ;default: 1'h0 ; */ +/*description: indicate I2C done*/ +#define SENS_I2C_DONE (BIT(30)) +#define SENS_I2C_DONE_M (BIT(30)) +#define SENS_I2C_DONE_V 0x1 +#define SENS_I2C_DONE_S 30 +/* SENS_I2C_RDATA : RO ;bitpos:[29:22] ;default: 8'h0 ; */ +/*description: I2C read data*/ +#define SENS_I2C_RDATA 0x000000FF +#define SENS_I2C_RDATA_M ((SENS_I2C_RDATA_V)<<(SENS_I2C_RDATA_S)) +#define SENS_I2C_RDATA_V 0xFF +#define SENS_I2C_RDATA_S 22 +/* SENS_I2C_SLAVE_ADDR6 : R/W ;bitpos:[21:11] ;default: 11'h0 ; */ +/*description: */ +#define SENS_I2C_SLAVE_ADDR6 0x000007FF +#define SENS_I2C_SLAVE_ADDR6_M ((SENS_I2C_SLAVE_ADDR6_V)<<(SENS_I2C_SLAVE_ADDR6_S)) +#define SENS_I2C_SLAVE_ADDR6_V 0x7FF +#define SENS_I2C_SLAVE_ADDR6_S 11 +/* SENS_I2C_SLAVE_ADDR7 : R/W ;bitpos:[10:0] ;default: 11'h0 ; */ +/*description: */ +#define SENS_I2C_SLAVE_ADDR7 0x000007FF +#define SENS_I2C_SLAVE_ADDR7_M ((SENS_I2C_SLAVE_ADDR7_V)<<(SENS_I2C_SLAVE_ADDR7_S)) +#define SENS_I2C_SLAVE_ADDR7_V 0x7FF +#define SENS_I2C_SLAVE_ADDR7_S 0 + +#define SENS_SAR_TSENS_CTRL_REG (DR_REG_SENS_BASE + 0x004c) +/* SENS_TSENS_DUMP_OUT : R/W ;bitpos:[26] ;default: 1'b0 ; */ +/*description: temperature sensor dump out only active when reg_tsens_power_up_force = 1*/ +#define SENS_TSENS_DUMP_OUT (BIT(26)) +#define SENS_TSENS_DUMP_OUT_M (BIT(26)) +#define SENS_TSENS_DUMP_OUT_V 0x1 +#define SENS_TSENS_DUMP_OUT_S 26 +/* SENS_TSENS_POWER_UP_FORCE : R/W ;bitpos:[25] ;default: 1'b0 ; */ +/*description: 1: dump out & power up controlled by SW 0: by FSM*/ +#define SENS_TSENS_POWER_UP_FORCE (BIT(25)) +#define SENS_TSENS_POWER_UP_FORCE_M (BIT(25)) +#define SENS_TSENS_POWER_UP_FORCE_V 0x1 +#define SENS_TSENS_POWER_UP_FORCE_S 25 +/* SENS_TSENS_POWER_UP : R/W ;bitpos:[24] ;default: 1'b0 ; */ +/*description: temperature sensor power up*/ +#define SENS_TSENS_POWER_UP (BIT(24)) +#define SENS_TSENS_POWER_UP_M (BIT(24)) +#define SENS_TSENS_POWER_UP_V 0x1 +#define SENS_TSENS_POWER_UP_S 24 +/* SENS_TSENS_CLK_DIV : R/W ;bitpos:[23:16] ;default: 8'd6 ; */ +/*description: temperature sensor clock divider*/ +#define SENS_TSENS_CLK_DIV 0x000000FF +#define SENS_TSENS_CLK_DIV_M ((SENS_TSENS_CLK_DIV_V)<<(SENS_TSENS_CLK_DIV_S)) +#define SENS_TSENS_CLK_DIV_V 0xFF +#define SENS_TSENS_CLK_DIV_S 16 +/* SENS_TSENS_IN_INV : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: invert temperature sensor data*/ +#define SENS_TSENS_IN_INV (BIT(15)) +#define SENS_TSENS_IN_INV_M (BIT(15)) +#define SENS_TSENS_IN_INV_V 0x1 +#define SENS_TSENS_IN_INV_S 15 +/* SENS_TSENS_CLK_GATED : R/W ;bitpos:[14] ;default: 1'b1 ; */ +/*description: */ +#define SENS_TSENS_CLK_GATED (BIT(14)) +#define SENS_TSENS_CLK_GATED_M (BIT(14)) +#define SENS_TSENS_CLK_GATED_V 0x1 +#define SENS_TSENS_CLK_GATED_S 14 +/* SENS_TSENS_CLK_INV : R/W ;bitpos:[13] ;default: 1'b1 ; */ +/*description: */ +#define SENS_TSENS_CLK_INV (BIT(13)) +#define SENS_TSENS_CLK_INV_M (BIT(13)) +#define SENS_TSENS_CLK_INV_V 0x1 +#define SENS_TSENS_CLK_INV_S 13 +/* SENS_TSENS_XPD_FORCE : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define SENS_TSENS_XPD_FORCE (BIT(12)) +#define SENS_TSENS_XPD_FORCE_M (BIT(12)) +#define SENS_TSENS_XPD_FORCE_V 0x1 +#define SENS_TSENS_XPD_FORCE_S 12 +/* SENS_TSENS_XPD_WAIT : R/W ;bitpos:[11:0] ;default: 12'h2 ; */ +/*description: */ +#define SENS_TSENS_XPD_WAIT 0x00000FFF +#define SENS_TSENS_XPD_WAIT_M ((SENS_TSENS_XPD_WAIT_V)<<(SENS_TSENS_XPD_WAIT_S)) +#define SENS_TSENS_XPD_WAIT_V 0xFFF +#define SENS_TSENS_XPD_WAIT_S 0 + +#define SENS_SAR_I2C_CTRL_REG (DR_REG_SENS_BASE + 0x0050) +/* SENS_SAR_I2C_START_FORCE : R/W ;bitpos:[29] ;default: 1'b0 ; */ +/*description: 1: I2C started by SW 0: I2C started by FSM*/ +#define SENS_SAR_I2C_START_FORCE (BIT(29)) +#define SENS_SAR_I2C_START_FORCE_M (BIT(29)) +#define SENS_SAR_I2C_START_FORCE_V 0x1 +#define SENS_SAR_I2C_START_FORCE_S 29 +/* SENS_SAR_I2C_START : R/W ;bitpos:[28] ;default: 1'b0 ; */ +/*description: start I2C only active when reg_sar_i2c_start_force = 1*/ +#define SENS_SAR_I2C_START (BIT(28)) +#define SENS_SAR_I2C_START_M (BIT(28)) +#define SENS_SAR_I2C_START_V 0x1 +#define SENS_SAR_I2C_START_S 28 +/* SENS_SAR_I2C_CTRL : R/W ;bitpos:[27:0] ;default: 28'b0 ; */ +/*description: I2C control data only active when reg_sar_i2c_start_force = 1*/ +#define SENS_SAR_I2C_CTRL 0x0FFFFFFF +#define SENS_SAR_I2C_CTRL_M ((SENS_SAR_I2C_CTRL_V)<<(SENS_SAR_I2C_CTRL_S)) +#define SENS_SAR_I2C_CTRL_V 0xFFFFFFF +#define SENS_SAR_I2C_CTRL_S 0 + +#define SENS_SAR_MEAS_START1_REG (DR_REG_SENS_BASE + 0x0054) +/* SENS_SAR1_EN_PAD_FORCE : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: 1: SAR ADC1 pad enable bitmap is controlled by SW 0: SAR ADC1 + pad enable bitmap is controlled by ULP-coprocessor*/ +#define SENS_SAR1_EN_PAD_FORCE (BIT(31)) +#define SENS_SAR1_EN_PAD_FORCE_M (BIT(31)) +#define SENS_SAR1_EN_PAD_FORCE_V 0x1 +#define SENS_SAR1_EN_PAD_FORCE_S 31 +/* SENS_SAR1_EN_PAD : R/W ;bitpos:[30:19] ;default: 12'b0 ; */ +/*description: SAR ADC1 pad enable bitmap only active when reg_sar1_en_pad_force = 1*/ +#define SENS_SAR1_EN_PAD 0x00000FFF +#define SENS_SAR1_EN_PAD_M ((SENS_SAR1_EN_PAD_V)<<(SENS_SAR1_EN_PAD_S)) +#define SENS_SAR1_EN_PAD_V 0xFFF +#define SENS_SAR1_EN_PAD_S 19 +/* SENS_MEAS1_START_FORCE : R/W ;bitpos:[18] ;default: 1'b0 ; */ +/*description: 1: SAR ADC1 controller (in RTC) is started by SW 0: SAR ADC1 + controller is started by ULP-coprocessor*/ +#define SENS_MEAS1_START_FORCE (BIT(18)) +#define SENS_MEAS1_START_FORCE_M (BIT(18)) +#define SENS_MEAS1_START_FORCE_V 0x1 +#define SENS_MEAS1_START_FORCE_S 18 +/* SENS_MEAS1_START_SAR : R/W ;bitpos:[17] ;default: 1'b0 ; */ +/*description: SAR ADC1 controller (in RTC) starts conversion only active when + reg_meas1_start_force = 1*/ +#define SENS_MEAS1_START_SAR (BIT(17)) +#define SENS_MEAS1_START_SAR_M (BIT(17)) +#define SENS_MEAS1_START_SAR_V 0x1 +#define SENS_MEAS1_START_SAR_S 17 +/* SENS_MEAS1_DONE_SAR : RO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: SAR ADC1 conversion done indication*/ +#define SENS_MEAS1_DONE_SAR (BIT(16)) +#define SENS_MEAS1_DONE_SAR_M (BIT(16)) +#define SENS_MEAS1_DONE_SAR_V 0x1 +#define SENS_MEAS1_DONE_SAR_S 16 +/* SENS_MEAS1_DATA_SAR : RO ;bitpos:[15:0] ;default: 16'b0 ; */ +/*description: SAR ADC1 data*/ +#define SENS_MEAS1_DATA_SAR 0x0000FFFF +#define SENS_MEAS1_DATA_SAR_M ((SENS_MEAS1_DATA_SAR_V)<<(SENS_MEAS1_DATA_SAR_S)) +#define SENS_MEAS1_DATA_SAR_V 0xFFFF +#define SENS_MEAS1_DATA_SAR_S 0 + +#define SENS_SAR_TOUCH_CTRL1_REG (DR_REG_SENS_BASE + 0x0058) +/* SENS_HALL_PHASE_FORCE : R/W ;bitpos:[27] ;default: 1'b0 ; */ +/*description: 1: HALL PHASE is controlled by SW 0: HALL PHASE is controlled + by FSM in ULP-coprocessor*/ +#define SENS_HALL_PHASE_FORCE (BIT(27)) +#define SENS_HALL_PHASE_FORCE_M (BIT(27)) +#define SENS_HALL_PHASE_FORCE_V 0x1 +#define SENS_HALL_PHASE_FORCE_S 27 +/* SENS_XPD_HALL_FORCE : R/W ;bitpos:[26] ;default: 1'b0 ; */ +/*description: 1: XPD HALL is controlled by SW. 0: XPD HALL is controlled by + FSM in ULP-coprocessor*/ +#define SENS_XPD_HALL_FORCE (BIT(26)) +#define SENS_XPD_HALL_FORCE_M (BIT(26)) +#define SENS_XPD_HALL_FORCE_V 0x1 +#define SENS_XPD_HALL_FORCE_S 26 +/* SENS_TOUCH_OUT_1EN : R/W ;bitpos:[25] ;default: 1'b1 ; */ +/*description: 1: wakeup interrupt is generated if SET1 is "touched" 0: + wakeup interrupt is generated only if SET1 & SET2 is both "touched"*/ +#define SENS_TOUCH_OUT_1EN (BIT(25)) +#define SENS_TOUCH_OUT_1EN_M (BIT(25)) +#define SENS_TOUCH_OUT_1EN_V 0x1 +#define SENS_TOUCH_OUT_1EN_S 25 +/* SENS_TOUCH_OUT_SEL : R/W ;bitpos:[24] ;default: 1'b0 ; */ +/*description: 1: when the counter is greater then the threshold the touch + pad is considered as "touched" 0: when the counter is less than the threshold the touch pad is considered as "touched"*/ +#define SENS_TOUCH_OUT_SEL (BIT(24)) +#define SENS_TOUCH_OUT_SEL_M (BIT(24)) +#define SENS_TOUCH_OUT_SEL_V 0x1 +#define SENS_TOUCH_OUT_SEL_S 24 +/* SENS_TOUCH_XPD_WAIT : R/W ;bitpos:[23:16] ;default: 8'h4 ; */ +/*description: the waiting cycles (in 8MHz) between TOUCH_START and TOUCH_XPD*/ +#define SENS_TOUCH_XPD_WAIT 0x000000FF +#define SENS_TOUCH_XPD_WAIT_M ((SENS_TOUCH_XPD_WAIT_V)<<(SENS_TOUCH_XPD_WAIT_S)) +#define SENS_TOUCH_XPD_WAIT_V 0xFF +#define SENS_TOUCH_XPD_WAIT_S 16 +/* SENS_TOUCH_MEAS_DELAY : R/W ;bitpos:[15:0] ;default: 16'h1000 ; */ +/*description: the meas length (in 8MHz)*/ +#define SENS_TOUCH_MEAS_DELAY 0x0000FFFF +#define SENS_TOUCH_MEAS_DELAY_M ((SENS_TOUCH_MEAS_DELAY_V)<<(SENS_TOUCH_MEAS_DELAY_S)) +#define SENS_TOUCH_MEAS_DELAY_V 0xFFFF +#define SENS_TOUCH_MEAS_DELAY_S 0 + +#define SENS_SAR_TOUCH_THRES1_REG (DR_REG_SENS_BASE + 0x005c) +/* SENS_TOUCH_OUT_TH0 : R/W ;bitpos:[31:16] ;default: 16'h0 ; */ +/*description: the threshold for touch pad 0*/ +#define SENS_TOUCH_OUT_TH0 0x0000FFFF +#define SENS_TOUCH_OUT_TH0_M ((SENS_TOUCH_OUT_TH0_V)<<(SENS_TOUCH_OUT_TH0_S)) +#define SENS_TOUCH_OUT_TH0_V 0xFFFF +#define SENS_TOUCH_OUT_TH0_S 16 +/* SENS_TOUCH_OUT_TH1 : R/W ;bitpos:[15:0] ;default: 16'h0 ; */ +/*description: the threshold for touch pad 1*/ +#define SENS_TOUCH_OUT_TH1 0x0000FFFF +#define SENS_TOUCH_OUT_TH1_M ((SENS_TOUCH_OUT_TH1_V)<<(SENS_TOUCH_OUT_TH1_S)) +#define SENS_TOUCH_OUT_TH1_V 0xFFFF +#define SENS_TOUCH_OUT_TH1_S 0 + +#define SENS_SAR_TOUCH_THRES2_REG (DR_REG_SENS_BASE + 0x0060) +/* SENS_TOUCH_OUT_TH2 : R/W ;bitpos:[31:16] ;default: 16'h0 ; */ +/*description: the threshold for touch pad 2*/ +#define SENS_TOUCH_OUT_TH2 0x0000FFFF +#define SENS_TOUCH_OUT_TH2_M ((SENS_TOUCH_OUT_TH2_V)<<(SENS_TOUCH_OUT_TH2_S)) +#define SENS_TOUCH_OUT_TH2_V 0xFFFF +#define SENS_TOUCH_OUT_TH2_S 16 +/* SENS_TOUCH_OUT_TH3 : R/W ;bitpos:[15:0] ;default: 16'h0 ; */ +/*description: the threshold for touch pad 3*/ +#define SENS_TOUCH_OUT_TH3 0x0000FFFF +#define SENS_TOUCH_OUT_TH3_M ((SENS_TOUCH_OUT_TH3_V)<<(SENS_TOUCH_OUT_TH3_S)) +#define SENS_TOUCH_OUT_TH3_V 0xFFFF +#define SENS_TOUCH_OUT_TH3_S 0 + +#define SENS_SAR_TOUCH_THRES3_REG (DR_REG_SENS_BASE + 0x0064) +/* SENS_TOUCH_OUT_TH4 : R/W ;bitpos:[31:16] ;default: 16'h0 ; */ +/*description: the threshold for touch pad 4*/ +#define SENS_TOUCH_OUT_TH4 0x0000FFFF +#define SENS_TOUCH_OUT_TH4_M ((SENS_TOUCH_OUT_TH4_V)<<(SENS_TOUCH_OUT_TH4_S)) +#define SENS_TOUCH_OUT_TH4_V 0xFFFF +#define SENS_TOUCH_OUT_TH4_S 16 +/* SENS_TOUCH_OUT_TH5 : R/W ;bitpos:[15:0] ;default: 16'h0 ; */ +/*description: the threshold for touch pad 5*/ +#define SENS_TOUCH_OUT_TH5 0x0000FFFF +#define SENS_TOUCH_OUT_TH5_M ((SENS_TOUCH_OUT_TH5_V)<<(SENS_TOUCH_OUT_TH5_S)) +#define SENS_TOUCH_OUT_TH5_V 0xFFFF +#define SENS_TOUCH_OUT_TH5_S 0 + +#define SENS_SAR_TOUCH_THRES4_REG (DR_REG_SENS_BASE + 0x0068) +/* SENS_TOUCH_OUT_TH6 : R/W ;bitpos:[31:16] ;default: 16'h0 ; */ +/*description: the threshold for touch pad 6*/ +#define SENS_TOUCH_OUT_TH6 0x0000FFFF +#define SENS_TOUCH_OUT_TH6_M ((SENS_TOUCH_OUT_TH6_V)<<(SENS_TOUCH_OUT_TH6_S)) +#define SENS_TOUCH_OUT_TH6_V 0xFFFF +#define SENS_TOUCH_OUT_TH6_S 16 +/* SENS_TOUCH_OUT_TH7 : R/W ;bitpos:[15:0] ;default: 16'h0 ; */ +/*description: the threshold for touch pad 7*/ +#define SENS_TOUCH_OUT_TH7 0x0000FFFF +#define SENS_TOUCH_OUT_TH7_M ((SENS_TOUCH_OUT_TH7_V)<<(SENS_TOUCH_OUT_TH7_S)) +#define SENS_TOUCH_OUT_TH7_V 0xFFFF +#define SENS_TOUCH_OUT_TH7_S 0 + +#define SENS_SAR_TOUCH_THRES5_REG (DR_REG_SENS_BASE + 0x006c) +/* SENS_TOUCH_OUT_TH8 : R/W ;bitpos:[31:16] ;default: 16'h0 ; */ +/*description: the threshold for touch pad 8*/ +#define SENS_TOUCH_OUT_TH8 0x0000FFFF +#define SENS_TOUCH_OUT_TH8_M ((SENS_TOUCH_OUT_TH8_V)<<(SENS_TOUCH_OUT_TH8_S)) +#define SENS_TOUCH_OUT_TH8_V 0xFFFF +#define SENS_TOUCH_OUT_TH8_S 16 +/* SENS_TOUCH_OUT_TH9 : R/W ;bitpos:[15:0] ;default: 16'h0 ; */ +/*description: the threshold for touch pad 9*/ +#define SENS_TOUCH_OUT_TH9 0x0000FFFF +#define SENS_TOUCH_OUT_TH9_M ((SENS_TOUCH_OUT_TH9_V)<<(SENS_TOUCH_OUT_TH9_S)) +#define SENS_TOUCH_OUT_TH9_V 0xFFFF +#define SENS_TOUCH_OUT_TH9_S 0 + +#define SENS_SAR_TOUCH_OUT1_REG (DR_REG_SENS_BASE + 0x0070) +/* SENS_TOUCH_MEAS_OUT0 : RO ;bitpos:[31:16] ;default: 16'h0 ; */ +/*description: the counter for touch pad 0*/ +#define SENS_TOUCH_MEAS_OUT0 0x0000FFFF +#define SENS_TOUCH_MEAS_OUT0_M ((SENS_TOUCH_MEAS_OUT0_V)<<(SENS_TOUCH_MEAS_OUT0_S)) +#define SENS_TOUCH_MEAS_OUT0_V 0xFFFF +#define SENS_TOUCH_MEAS_OUT0_S 16 +/* SENS_TOUCH_MEAS_OUT1 : RO ;bitpos:[15:0] ;default: 16'h0 ; */ +/*description: the counter for touch pad 1*/ +#define SENS_TOUCH_MEAS_OUT1 0x0000FFFF +#define SENS_TOUCH_MEAS_OUT1_M ((SENS_TOUCH_MEAS_OUT1_V)<<(SENS_TOUCH_MEAS_OUT1_S)) +#define SENS_TOUCH_MEAS_OUT1_V 0xFFFF +#define SENS_TOUCH_MEAS_OUT1_S 0 + +#define SENS_SAR_TOUCH_OUT2_REG (DR_REG_SENS_BASE + 0x0074) +/* SENS_TOUCH_MEAS_OUT2 : RO ;bitpos:[31:16] ;default: 16'h0 ; */ +/*description: the counter for touch pad 2*/ +#define SENS_TOUCH_MEAS_OUT2 0x0000FFFF +#define SENS_TOUCH_MEAS_OUT2_M ((SENS_TOUCH_MEAS_OUT2_V)<<(SENS_TOUCH_MEAS_OUT2_S)) +#define SENS_TOUCH_MEAS_OUT2_V 0xFFFF +#define SENS_TOUCH_MEAS_OUT2_S 16 +/* SENS_TOUCH_MEAS_OUT3 : RO ;bitpos:[15:0] ;default: 16'h0 ; */ +/*description: the counter for touch pad 3*/ +#define SENS_TOUCH_MEAS_OUT3 0x0000FFFF +#define SENS_TOUCH_MEAS_OUT3_M ((SENS_TOUCH_MEAS_OUT3_V)<<(SENS_TOUCH_MEAS_OUT3_S)) +#define SENS_TOUCH_MEAS_OUT3_V 0xFFFF +#define SENS_TOUCH_MEAS_OUT3_S 0 + +#define SENS_SAR_TOUCH_OUT3_REG (DR_REG_SENS_BASE + 0x0078) +/* SENS_TOUCH_MEAS_OUT4 : RO ;bitpos:[31:16] ;default: 16'h0 ; */ +/*description: the counter for touch pad 4*/ +#define SENS_TOUCH_MEAS_OUT4 0x0000FFFF +#define SENS_TOUCH_MEAS_OUT4_M ((SENS_TOUCH_MEAS_OUT4_V)<<(SENS_TOUCH_MEAS_OUT4_S)) +#define SENS_TOUCH_MEAS_OUT4_V 0xFFFF +#define SENS_TOUCH_MEAS_OUT4_S 16 +/* SENS_TOUCH_MEAS_OUT5 : RO ;bitpos:[15:0] ;default: 16'h0 ; */ +/*description: the counter for touch pad 5*/ +#define SENS_TOUCH_MEAS_OUT5 0x0000FFFF +#define SENS_TOUCH_MEAS_OUT5_M ((SENS_TOUCH_MEAS_OUT5_V)<<(SENS_TOUCH_MEAS_OUT5_S)) +#define SENS_TOUCH_MEAS_OUT5_V 0xFFFF +#define SENS_TOUCH_MEAS_OUT5_S 0 + +#define SENS_SAR_TOUCH_OUT4_REG (DR_REG_SENS_BASE + 0x007c) +/* SENS_TOUCH_MEAS_OUT6 : RO ;bitpos:[31:16] ;default: 16'h0 ; */ +/*description: the counter for touch pad 6*/ +#define SENS_TOUCH_MEAS_OUT6 0x0000FFFF +#define SENS_TOUCH_MEAS_OUT6_M ((SENS_TOUCH_MEAS_OUT6_V)<<(SENS_TOUCH_MEAS_OUT6_S)) +#define SENS_TOUCH_MEAS_OUT6_V 0xFFFF +#define SENS_TOUCH_MEAS_OUT6_S 16 +/* SENS_TOUCH_MEAS_OUT7 : RO ;bitpos:[15:0] ;default: 16'h0 ; */ +/*description: the counter for touch pad 7*/ +#define SENS_TOUCH_MEAS_OUT7 0x0000FFFF +#define SENS_TOUCH_MEAS_OUT7_M ((SENS_TOUCH_MEAS_OUT7_V)<<(SENS_TOUCH_MEAS_OUT7_S)) +#define SENS_TOUCH_MEAS_OUT7_V 0xFFFF +#define SENS_TOUCH_MEAS_OUT7_S 0 + +#define SENS_SAR_TOUCH_OUT5_REG (DR_REG_SENS_BASE + 0x0080) +/* SENS_TOUCH_MEAS_OUT8 : RO ;bitpos:[31:16] ;default: 16'h0 ; */ +/*description: the counter for touch pad 8*/ +#define SENS_TOUCH_MEAS_OUT8 0x0000FFFF +#define SENS_TOUCH_MEAS_OUT8_M ((SENS_TOUCH_MEAS_OUT8_V)<<(SENS_TOUCH_MEAS_OUT8_S)) +#define SENS_TOUCH_MEAS_OUT8_V 0xFFFF +#define SENS_TOUCH_MEAS_OUT8_S 16 +/* SENS_TOUCH_MEAS_OUT9 : RO ;bitpos:[15:0] ;default: 16'h0 ; */ +/*description: the counter for touch pad 9*/ +#define SENS_TOUCH_MEAS_OUT9 0x0000FFFF +#define SENS_TOUCH_MEAS_OUT9_M ((SENS_TOUCH_MEAS_OUT9_V)<<(SENS_TOUCH_MEAS_OUT9_S)) +#define SENS_TOUCH_MEAS_OUT9_V 0xFFFF +#define SENS_TOUCH_MEAS_OUT9_S 0 + +#define SENS_SAR_TOUCH_CTRL2_REG (DR_REG_SENS_BASE + 0x0084) +/* SENS_TOUCH_MEAS_EN_CLR : WO ;bitpos:[30] ;default: 1'h0 ; */ +/*description: to clear reg_touch_meas_en*/ +#define SENS_TOUCH_MEAS_EN_CLR (BIT(30)) +#define SENS_TOUCH_MEAS_EN_CLR_M (BIT(30)) +#define SENS_TOUCH_MEAS_EN_CLR_V 0x1 +#define SENS_TOUCH_MEAS_EN_CLR_S 30 +/* SENS_TOUCH_SLEEP_CYCLES : R/W ;bitpos:[29:14] ;default: 16'h100 ; */ +/*description: sleep cycles for timer*/ +#define SENS_TOUCH_SLEEP_CYCLES 0x0000FFFF +#define SENS_TOUCH_SLEEP_CYCLES_M ((SENS_TOUCH_SLEEP_CYCLES_V)<<(SENS_TOUCH_SLEEP_CYCLES_S)) +#define SENS_TOUCH_SLEEP_CYCLES_V 0xFFFF +#define SENS_TOUCH_SLEEP_CYCLES_S 14 +/* SENS_TOUCH_START_FORCE : R/W ;bitpos:[13] ;default: 1'h0 ; */ +/*description: 1: to start touch fsm by SW 0: to start touch fsm by timer*/ +#define SENS_TOUCH_START_FORCE (BIT(13)) +#define SENS_TOUCH_START_FORCE_M (BIT(13)) +#define SENS_TOUCH_START_FORCE_V 0x1 +#define SENS_TOUCH_START_FORCE_S 13 +/* SENS_TOUCH_START_EN : R/W ;bitpos:[12] ;default: 1'h0 ; */ +/*description: 1: start touch fsm valid when reg_touch_start_force is set*/ +#define SENS_TOUCH_START_EN (BIT(12)) +#define SENS_TOUCH_START_EN_M (BIT(12)) +#define SENS_TOUCH_START_EN_V 0x1 +#define SENS_TOUCH_START_EN_S 12 +/* SENS_TOUCH_START_FSM_EN : R/W ;bitpos:[11] ;default: 1'h1 ; */ +/*description: 1: TOUCH_START & TOUCH_XPD is controlled by touch fsm 0: TOUCH_START + & TOUCH_XPD is controlled by registers*/ +#define SENS_TOUCH_START_FSM_EN (BIT(11)) +#define SENS_TOUCH_START_FSM_EN_M (BIT(11)) +#define SENS_TOUCH_START_FSM_EN_V 0x1 +#define SENS_TOUCH_START_FSM_EN_S 11 +/* SENS_TOUCH_MEAS_DONE : RO ;bitpos:[10] ;default: 1'h0 ; */ +/*description: fsm set 1 to indicate touch touch meas is done*/ +#define SENS_TOUCH_MEAS_DONE (BIT(10)) +#define SENS_TOUCH_MEAS_DONE_M (BIT(10)) +#define SENS_TOUCH_MEAS_DONE_V 0x1 +#define SENS_TOUCH_MEAS_DONE_S 10 +/* SENS_TOUCH_MEAS_EN : RO ;bitpos:[9:0] ;default: 10'h0 ; */ +/*description: 10-bit register to indicate which pads are "touched"*/ +#define SENS_TOUCH_MEAS_EN 0x000003FF +#define SENS_TOUCH_MEAS_EN_M ((SENS_TOUCH_MEAS_EN_V)<<(SENS_TOUCH_MEAS_EN_S)) +#define SENS_TOUCH_MEAS_EN_V 0x3FF +#define SENS_TOUCH_MEAS_EN_S 0 + +#define SENS_SAR_TOUCH_ENABLE_REG (DR_REG_SENS_BASE + 0x008c) +/* SENS_TOUCH_PAD_OUTEN1 : R/W ;bitpos:[29:20] ;default: 10'h3ff ; */ +/*description: Bitmap defining SET1 for generating wakeup interrupt. SET1 is + "touched" only if at least one of touch pad in SET1 is "touched".*/ +#define SENS_TOUCH_PAD_OUTEN1 0x000003FF +#define SENS_TOUCH_PAD_OUTEN1_M ((SENS_TOUCH_PAD_OUTEN1_V)<<(SENS_TOUCH_PAD_OUTEN1_S)) +#define SENS_TOUCH_PAD_OUTEN1_V 0x3FF +#define SENS_TOUCH_PAD_OUTEN1_S 20 +/* SENS_TOUCH_PAD_OUTEN2 : R/W ;bitpos:[19:10] ;default: 10'h3ff ; */ +/*description: Bitmap defining SET2 for generating wakeup interrupt. SET2 is + "touched" only if at least one of touch pad in SET2 is "touched".*/ +#define SENS_TOUCH_PAD_OUTEN2 0x000003FF +#define SENS_TOUCH_PAD_OUTEN2_M ((SENS_TOUCH_PAD_OUTEN2_V)<<(SENS_TOUCH_PAD_OUTEN2_S)) +#define SENS_TOUCH_PAD_OUTEN2_V 0x3FF +#define SENS_TOUCH_PAD_OUTEN2_S 10 +/* SENS_TOUCH_PAD_WORKEN : R/W ;bitpos:[9:0] ;default: 10'h3ff ; */ +/*description: Bitmap defining the working set during the measurement.*/ +#define SENS_TOUCH_PAD_WORKEN 0x000003FF +#define SENS_TOUCH_PAD_WORKEN_M ((SENS_TOUCH_PAD_WORKEN_V)<<(SENS_TOUCH_PAD_WORKEN_S)) +#define SENS_TOUCH_PAD_WORKEN_V 0x3FF +#define SENS_TOUCH_PAD_WORKEN_S 0 + +#define SENS_SAR_READ_CTRL2_REG (DR_REG_SENS_BASE + 0x0090) +/* SENS_SAR2_DATA_INV : R/W ;bitpos:[29] ;default: 1'b0 ; */ +/*description: Invert SAR ADC2 data*/ +#define SENS_SAR2_DATA_INV (BIT(29)) +#define SENS_SAR2_DATA_INV_M (BIT(29)) +#define SENS_SAR2_DATA_INV_V 0x1 +#define SENS_SAR2_DATA_INV_S 29 +/* SENS_SAR2_DIG_FORCE : R/W ;bitpos:[28] ;default: 1'b0 ; */ +/*description: 1: SAR ADC2 controlled by DIG ADC2 CTRL or PWDET CTRL 0: SAR + ADC2 controlled by RTC ADC2 CTRL*/ +#define SENS_SAR2_DIG_FORCE (BIT(28)) +#define SENS_SAR2_DIG_FORCE_M (BIT(28)) +#define SENS_SAR2_DIG_FORCE_V 0x1 +#define SENS_SAR2_DIG_FORCE_S 28 +/* SENS_SAR2_PWDET_FORCE : R/W ;bitpos:[27] ;default: 1'b0 ; */ +/*description: */ +#define SENS_SAR2_PWDET_FORCE (BIT(27)) +#define SENS_SAR2_PWDET_FORCE_M (BIT(27)) +#define SENS_SAR2_PWDET_FORCE_V 0x1 +#define SENS_SAR2_PWDET_FORCE_S 27 +/* SENS_SAR2_SAMPLE_NUM : R/W ;bitpos:[26:19] ;default: 8'd0 ; */ +/*description: */ +#define SENS_SAR2_SAMPLE_NUM 0x000000FF +#define SENS_SAR2_SAMPLE_NUM_M ((SENS_SAR2_SAMPLE_NUM_V)<<(SENS_SAR2_SAMPLE_NUM_S)) +#define SENS_SAR2_SAMPLE_NUM_V 0xFF +#define SENS_SAR2_SAMPLE_NUM_S 19 +/* SENS_SAR2_CLK_GATED : R/W ;bitpos:[18] ;default: 1'b1 ; */ +/*description: */ +#define SENS_SAR2_CLK_GATED (BIT(18)) +#define SENS_SAR2_CLK_GATED_M (BIT(18)) +#define SENS_SAR2_CLK_GATED_V 0x1 +#define SENS_SAR2_CLK_GATED_S 18 +/* SENS_SAR2_SAMPLE_BIT : R/W ;bitpos:[17:16] ;default: 2'd3 ; */ +/*description: 00: for 9-bit width 01: for 10-bit width 10: for 11-bit width + 11: for 12-bit width*/ +#define SENS_SAR2_SAMPLE_BIT 0x00000003 +#define SENS_SAR2_SAMPLE_BIT_M ((SENS_SAR2_SAMPLE_BIT_V)<<(SENS_SAR2_SAMPLE_BIT_S)) +#define SENS_SAR2_SAMPLE_BIT_V 0x3 +#define SENS_SAR2_SAMPLE_BIT_S 16 +/* SENS_SAR2_SAMPLE_CYCLE : R/W ;bitpos:[15:8] ;default: 8'd9 ; */ +/*description: sample cycles for SAR ADC2*/ +#define SENS_SAR2_SAMPLE_CYCLE 0x000000FF +#define SENS_SAR2_SAMPLE_CYCLE_M ((SENS_SAR2_SAMPLE_CYCLE_V)<<(SENS_SAR2_SAMPLE_CYCLE_S)) +#define SENS_SAR2_SAMPLE_CYCLE_V 0xFF +#define SENS_SAR2_SAMPLE_CYCLE_S 8 +/* SENS_SAR2_CLK_DIV : R/W ;bitpos:[7:0] ;default: 8'd2 ; */ +/*description: clock divider*/ +#define SENS_SAR2_CLK_DIV 0x000000FF +#define SENS_SAR2_CLK_DIV_M ((SENS_SAR2_CLK_DIV_V)<<(SENS_SAR2_CLK_DIV_S)) +#define SENS_SAR2_CLK_DIV_V 0xFF +#define SENS_SAR2_CLK_DIV_S 0 + +#define SENS_SAR_MEAS_START2_REG (DR_REG_SENS_BASE + 0x0094) +/* SENS_SAR2_EN_PAD_FORCE : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: 1: SAR ADC2 pad enable bitmap is controlled by SW 0: SAR ADC2 + pad enable bitmap is controlled by ULP-coprocessor*/ +#define SENS_SAR2_EN_PAD_FORCE (BIT(31)) +#define SENS_SAR2_EN_PAD_FORCE_M (BIT(31)) +#define SENS_SAR2_EN_PAD_FORCE_V 0x1 +#define SENS_SAR2_EN_PAD_FORCE_S 31 +/* SENS_SAR2_EN_PAD : R/W ;bitpos:[30:19] ;default: 12'b0 ; */ +/*description: SAR ADC2 pad enable bitmap only active when reg_sar2_en_pad_force = 1*/ +#define SENS_SAR2_EN_PAD 0x00000FFF +#define SENS_SAR2_EN_PAD_M ((SENS_SAR2_EN_PAD_V)<<(SENS_SAR2_EN_PAD_S)) +#define SENS_SAR2_EN_PAD_V 0xFFF +#define SENS_SAR2_EN_PAD_S 19 +/* SENS_MEAS2_START_FORCE : R/W ;bitpos:[18] ;default: 1'b0 ; */ +/*description: 1: SAR ADC2 controller (in RTC) is started by SW 0: SAR ADC2 + controller is started by ULP-coprocessor*/ +#define SENS_MEAS2_START_FORCE (BIT(18)) +#define SENS_MEAS2_START_FORCE_M (BIT(18)) +#define SENS_MEAS2_START_FORCE_V 0x1 +#define SENS_MEAS2_START_FORCE_S 18 +/* SENS_MEAS2_START_SAR : R/W ;bitpos:[17] ;default: 1'b0 ; */ +/*description: SAR ADC2 controller (in RTC) starts conversion only active when + reg_meas2_start_force = 1*/ +#define SENS_MEAS2_START_SAR (BIT(17)) +#define SENS_MEAS2_START_SAR_M (BIT(17)) +#define SENS_MEAS2_START_SAR_V 0x1 +#define SENS_MEAS2_START_SAR_S 17 +/* SENS_MEAS2_DONE_SAR : RO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: SAR ADC2 conversion done indication*/ +#define SENS_MEAS2_DONE_SAR (BIT(16)) +#define SENS_MEAS2_DONE_SAR_M (BIT(16)) +#define SENS_MEAS2_DONE_SAR_V 0x1 +#define SENS_MEAS2_DONE_SAR_S 16 +/* SENS_MEAS2_DATA_SAR : RO ;bitpos:[15:0] ;default: 16'b0 ; */ +/*description: SAR ADC2 data*/ +#define SENS_MEAS2_DATA_SAR 0x0000FFFF +#define SENS_MEAS2_DATA_SAR_M ((SENS_MEAS2_DATA_SAR_V)<<(SENS_MEAS2_DATA_SAR_S)) +#define SENS_MEAS2_DATA_SAR_V 0xFFFF +#define SENS_MEAS2_DATA_SAR_S 0 + +#define SENS_SAR_DAC_CTRL1_REG (DR_REG_SENS_BASE + 0x0098) +/* SENS_DAC_CLK_INV : R/W ;bitpos:[25] ;default: 1'b0 ; */ +/*description: 1: invert PDAC_CLK*/ +#define SENS_DAC_CLK_INV (BIT(25)) +#define SENS_DAC_CLK_INV_M (BIT(25)) +#define SENS_DAC_CLK_INV_V 0x1 +#define SENS_DAC_CLK_INV_S 25 +/* SENS_DAC_CLK_FORCE_HIGH : R/W ;bitpos:[24] ;default: 1'b0 ; */ +/*description: 1: force PDAC_CLK to high*/ +#define SENS_DAC_CLK_FORCE_HIGH (BIT(24)) +#define SENS_DAC_CLK_FORCE_HIGH_M (BIT(24)) +#define SENS_DAC_CLK_FORCE_HIGH_V 0x1 +#define SENS_DAC_CLK_FORCE_HIGH_S 24 +/* SENS_DAC_CLK_FORCE_LOW : R/W ;bitpos:[23] ;default: 1'b0 ; */ +/*description: 1: force PDAC_CLK to low*/ +#define SENS_DAC_CLK_FORCE_LOW (BIT(23)) +#define SENS_DAC_CLK_FORCE_LOW_M (BIT(23)) +#define SENS_DAC_CLK_FORCE_LOW_V 0x1 +#define SENS_DAC_CLK_FORCE_LOW_S 23 +/* SENS_DAC_DIG_FORCE : R/W ;bitpos:[22] ;default: 1'b0 ; */ +/*description: 1: DAC1 & DAC2 use DMA 0: DAC1 & DAC2 do not use DMA*/ +#define SENS_DAC_DIG_FORCE (BIT(22)) +#define SENS_DAC_DIG_FORCE_M (BIT(22)) +#define SENS_DAC_DIG_FORCE_V 0x1 +#define SENS_DAC_DIG_FORCE_S 22 +/* SENS_DEBUG_BIT_SEL : R/W ;bitpos:[21:17] ;default: 5'b0 ; */ +/*description: */ +#define SENS_DEBUG_BIT_SEL 0x0000001F +#define SENS_DEBUG_BIT_SEL_M ((SENS_DEBUG_BIT_SEL_V)<<(SENS_DEBUG_BIT_SEL_S)) +#define SENS_DEBUG_BIT_SEL_V 0x1F +#define SENS_DEBUG_BIT_SEL_S 17 +/* SENS_SW_TONE_EN : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: 1: enable CW generator 0: disable CW generator*/ +#define SENS_SW_TONE_EN (BIT(16)) +#define SENS_SW_TONE_EN_M (BIT(16)) +#define SENS_SW_TONE_EN_V 0x1 +#define SENS_SW_TONE_EN_S 16 +/* SENS_SW_FSTEP : R/W ;bitpos:[15:0] ;default: 16'b0 ; */ +/*description: frequency step for CW generator can be used to adjust the frequency*/ +#define SENS_SW_FSTEP 0x0000FFFF +#define SENS_SW_FSTEP_M ((SENS_SW_FSTEP_V)<<(SENS_SW_FSTEP_S)) +#define SENS_SW_FSTEP_V 0xFFFF +#define SENS_SW_FSTEP_S 0 + +#define SENS_SAR_DAC_CTRL2_REG (DR_REG_SENS_BASE + 0x009c) +/* SENS_DAC_CW_EN2 : R/W ;bitpos:[25] ;default: 1'b1 ; */ +/*description: 1: to select CW generator as source to PDAC2_DAC[7:0] 0: to + select register reg_pdac2_dac[7:0] as source to PDAC2_DAC[7:0]*/ +#define SENS_DAC_CW_EN2 (BIT(25)) +#define SENS_DAC_CW_EN2_M (BIT(25)) +#define SENS_DAC_CW_EN2_V 0x1 +#define SENS_DAC_CW_EN2_S 25 +/* SENS_DAC_CW_EN1 : R/W ;bitpos:[24] ;default: 1'b1 ; */ +/*description: 1: to select CW generator as source to PDAC1_DAC[7:0] 0: to + select register reg_pdac1_dac[7:0] as source to PDAC1_DAC[7:0]*/ +#define SENS_DAC_CW_EN1 (BIT(24)) +#define SENS_DAC_CW_EN1_M (BIT(24)) +#define SENS_DAC_CW_EN1_V 0x1 +#define SENS_DAC_CW_EN1_S 24 +/* SENS_DAC_INV2 : R/W ;bitpos:[23:22] ;default: 2'b0 ; */ +/*description: 00: do not invert any bits 01: invert all bits 10: invert MSB + 11: invert all bits except MSB*/ +#define SENS_DAC_INV2 0x00000003 +#define SENS_DAC_INV2_M ((SENS_DAC_INV2_V)<<(SENS_DAC_INV2_S)) +#define SENS_DAC_INV2_V 0x3 +#define SENS_DAC_INV2_S 22 +/* SENS_DAC_INV1 : R/W ;bitpos:[21:20] ;default: 2'b0 ; */ +/*description: 00: do not invert any bits 01: invert all bits 10: invert MSB + 11: invert all bits except MSB*/ +#define SENS_DAC_INV1 0x00000003 +#define SENS_DAC_INV1_M ((SENS_DAC_INV1_V)<<(SENS_DAC_INV1_S)) +#define SENS_DAC_INV1_V 0x3 +#define SENS_DAC_INV1_S 20 +/* SENS_DAC_SCALE2 : R/W ;bitpos:[19:18] ;default: 2'b0 ; */ +/*description: 00: no scale 01: scale to 1/2 10: scale to 1/4 scale to 1/8*/ +#define SENS_DAC_SCALE2 0x00000003 +#define SENS_DAC_SCALE2_M ((SENS_DAC_SCALE2_V)<<(SENS_DAC_SCALE2_S)) +#define SENS_DAC_SCALE2_V 0x3 +#define SENS_DAC_SCALE2_S 18 +/* SENS_DAC_SCALE1 : R/W ;bitpos:[17:16] ;default: 2'b0 ; */ +/*description: 00: no scale 01: scale to 1/2 10: scale to 1/4 scale to 1/8*/ +#define SENS_DAC_SCALE1 0x00000003 +#define SENS_DAC_SCALE1_M ((SENS_DAC_SCALE1_V)<<(SENS_DAC_SCALE1_S)) +#define SENS_DAC_SCALE1_V 0x3 +#define SENS_DAC_SCALE1_S 16 +/* SENS_DAC_DC2 : R/W ;bitpos:[15:8] ;default: 8'b0 ; */ +/*description: DC offset for DAC2 CW generator*/ +#define SENS_DAC_DC2 0x000000FF +#define SENS_DAC_DC2_M ((SENS_DAC_DC2_V)<<(SENS_DAC_DC2_S)) +#define SENS_DAC_DC2_V 0xFF +#define SENS_DAC_DC2_S 8 +/* SENS_DAC_DC1 : R/W ;bitpos:[7:0] ;default: 8'b0 ; */ +/*description: DC offset for DAC1 CW generator*/ +#define SENS_DAC_DC1 0x000000FF +#define SENS_DAC_DC1_M ((SENS_DAC_DC1_V)<<(SENS_DAC_DC1_S)) +#define SENS_DAC_DC1_V 0xFF +#define SENS_DAC_DC1_S 0 + +#define SENS_SAR_MEAS_CTRL2_REG (DR_REG_SENS_BASE + 0x0a0) +/* SENS_AMP_SHORT_REF_GND_FORCE : R/W ;bitpos:[18:17] ;default: 2'b0 ; */ +/*description: */ +#define SENS_AMP_SHORT_REF_GND_FORCE 0x00000003 +#define SENS_AMP_SHORT_REF_GND_FORCE_M ((SENS_AMP_SHORT_REF_GND_FORCE_V)<<(SENS_AMP_SHORT_REF_GND_FORCE_S)) +#define SENS_AMP_SHORT_REF_GND_FORCE_V 0x3 +#define SENS_AMP_SHORT_REF_GND_FORCE_S 17 +#define SENS_AMP_SHORT_REF_GND_FORCE_FSM 0 // Use FSM to control power down +#define SENS_AMP_SHORT_REF_GND_FORCE_PD 2 // Force power down +#define SENS_AMP_SHORT_REF_GND_FORCE_PU 3 // Force power up +/* SENS_AMP_SHORT_REF_FORCE : R/W ;bitpos:[16:15] ;default: 2'b0 ; */ +/*description: */ +#define SENS_AMP_SHORT_REF_FORCE 0x00000003 +#define SENS_AMP_SHORT_REF_FORCE_M ((SENS_AMP_SHORT_REF_FORCE_V)<<(SENS_AMP_SHORT_REF_FORCE_S)) +#define SENS_AMP_SHORT_REF_FORCE_V 0x3 +#define SENS_AMP_SHORT_REF_FORCE_S 15 +#define SENS_AMP_SHORT_REF_FORCE_FSM 0 // Use FSM to control power down +#define SENS_AMP_SHORT_REF_FORCE_PD 2 // Force power down +#define SENS_AMP_SHORT_REF_FORCE_PU 3 // Force power up +/* SENS_AMP_RST_FB_FORCE : R/W ;bitpos:[14:13] ;default: 2'b0 ; */ +/*description: */ +#define SENS_AMP_RST_FB_FORCE 0x00000003 +#define SENS_AMP_RST_FB_FORCE_M ((SENS_AMP_RST_FB_FORCE_V)<<(SENS_AMP_RST_FB_FORCE_S)) +#define SENS_AMP_RST_FB_FORCE_V 0x3 +#define SENS_AMP_RST_FB_FORCE_S 13 +#define SENS_AMP_RST_FB_FORCE_FSM 0 // Use FSM to control power down +#define SENS_AMP_RST_FB_FORCE_PD 2 // Force power down +#define SENS_AMP_RST_FB_FORCE_PU 3 // Force power up +/* SENS_SAR2_RSTB_FORCE : R/W ;bitpos:[12:11] ;default: 2'b0 ; */ +/*description: */ +#define SENS_SAR2_RSTB_FORCE 0x00000003 +#define SENS_SAR2_RSTB_FORCE_M ((SENS_SAR2_RSTB_FORCE_V)<<(SENS_SAR2_RSTB_FORCE_S)) +#define SENS_SAR2_RSTB_FORCE_V 0x3 +#define SENS_SAR2_RSTB_FORCE_S 11 +#define SENS_SAR2_RSTB_FORCE_FSM 0 // Use FSM to control power down +#define SENS_SAR2_RSTB_FORCE_PD 2 // Force power down +#define SENS_SAR2_RSTB_FORCE_PU 3 // Force power up +/* SENS_SAR_RSTB_FSM_IDLE : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define SENS_SAR_RSTB_FSM_IDLE (BIT(10)) +#define SENS_SAR_RSTB_FSM_IDLE_M (BIT(10)) +#define SENS_SAR_RSTB_FSM_IDLE_V 0x1 +#define SENS_SAR_RSTB_FSM_IDLE_S 10 +/* SENS_XPD_SAR_FSM_IDLE : R/W ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define SENS_XPD_SAR_FSM_IDLE (BIT(9)) +#define SENS_XPD_SAR_FSM_IDLE_M (BIT(9)) +#define SENS_XPD_SAR_FSM_IDLE_V 0x1 +#define SENS_XPD_SAR_FSM_IDLE_S 9 +/* SENS_AMP_SHORT_REF_GND_FSM_IDLE : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define SENS_AMP_SHORT_REF_GND_FSM_IDLE (BIT(8)) +#define SENS_AMP_SHORT_REF_GND_FSM_IDLE_M (BIT(8)) +#define SENS_AMP_SHORT_REF_GND_FSM_IDLE_V 0x1 +#define SENS_AMP_SHORT_REF_GND_FSM_IDLE_S 8 +/* SENS_AMP_SHORT_REF_FSM_IDLE : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define SENS_AMP_SHORT_REF_FSM_IDLE (BIT(7)) +#define SENS_AMP_SHORT_REF_FSM_IDLE_M (BIT(7)) +#define SENS_AMP_SHORT_REF_FSM_IDLE_V 0x1 +#define SENS_AMP_SHORT_REF_FSM_IDLE_S 7 +/* SENS_AMP_RST_FB_FSM_IDLE : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define SENS_AMP_RST_FB_FSM_IDLE (BIT(6)) +#define SENS_AMP_RST_FB_FSM_IDLE_M (BIT(6)) +#define SENS_AMP_RST_FB_FSM_IDLE_V 0x1 +#define SENS_AMP_RST_FB_FSM_IDLE_S 6 +/* SENS_XPD_SAR_AMP_FSM_IDLE : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define SENS_XPD_SAR_AMP_FSM_IDLE (BIT(5)) +#define SENS_XPD_SAR_AMP_FSM_IDLE_M (BIT(5)) +#define SENS_XPD_SAR_AMP_FSM_IDLE_V 0x1 +#define SENS_XPD_SAR_AMP_FSM_IDLE_S 5 +/* SENS_SAR1_DAC_XPD_FSM_IDLE : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define SENS_SAR1_DAC_XPD_FSM_IDLE (BIT(4)) +#define SENS_SAR1_DAC_XPD_FSM_IDLE_M (BIT(4)) +#define SENS_SAR1_DAC_XPD_FSM_IDLE_V 0x1 +#define SENS_SAR1_DAC_XPD_FSM_IDLE_S 4 +/* SENS_SAR1_DAC_XPD_FSM : R/W ;bitpos:[3:0] ;default: 4'b0011 ; */ +/*description: */ +#define SENS_SAR1_DAC_XPD_FSM 0x0000000F +#define SENS_SAR1_DAC_XPD_FSM_M ((SENS_SAR1_DAC_XPD_FSM_V)<<(SENS_SAR1_DAC_XPD_FSM_S)) +#define SENS_SAR1_DAC_XPD_FSM_V 0xF +#define SENS_SAR1_DAC_XPD_FSM_S 0 + +#define SENS_SAR_NOUSE_REG (DR_REG_SENS_BASE + 0x00F8) +/* SENS_SAR_NOUSE : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define SENS_SAR_NOUSE 0xFFFFFFFF +#define SENS_SAR_NOUSE_M ((SENS_SAR_NOUSE_V)<<(SENS_SAR_NOUSE_S)) +#define SENS_SAR_NOUSE_V 0xFFFFFFFF +#define SENS_SAR_NOUSE_S 0 + +#define SENS_SARDATE_REG (DR_REG_SENS_BASE + 0x00FC) +/* SENS_SAR_DATE : R/W ;bitpos:[27:0] ;default: 28'h1605180 ; */ +/*description: */ +#define SENS_SAR_DATE 0x0FFFFFFF +#define SENS_SAR_DATE_M ((SENS_SAR_DATE_V)<<(SENS_SAR_DATE_S)) +#define SENS_SAR_DATE_V 0xFFFFFFF +#define SENS_SAR_DATE_S 0 + + + + +#endif /*_SOC_SENS_REG_H_ */ + + diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/sens_struct.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/sens_struct.h new file mode 100644 index 0000000000000..f0d892ce82e62 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/sens_struct.h @@ -0,0 +1,328 @@ +// 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. +#ifndef _SOC_SENS_STRUCT_H_ +#define _SOC_SENS_STRUCT_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef volatile struct sens_dev_s { + union { + struct { + uint32_t sar1_clk_div: 8; + uint32_t sar1_sample_cycle: 8; + uint32_t sar1_sample_bit: 2; + uint32_t sar1_clk_gated: 1; + uint32_t sar1_sample_num: 8; + uint32_t sar1_dig_force: 1; /*1: ADC1 is controlled by the digital controller 0: RTC controller*/ + uint32_t sar1_data_inv: 1; + uint32_t reserved29: 3; + }; + uint32_t val; + } sar_read_ctrl; + uint32_t sar_read_status1; /**/ + union { + struct { + uint32_t sar_amp_wait1:16; + uint32_t sar_amp_wait2:16; + }; + uint32_t val; + } sar_meas_wait1; + union { + struct { + uint32_t sar_amp_wait3: 16; + uint32_t force_xpd_amp: 2; + uint32_t force_xpd_sar: 2; + uint32_t sar2_rstb_wait: 8; + uint32_t reserved28: 4; + }; + uint32_t val; + } sar_meas_wait2; + union { + struct { + uint32_t xpd_sar_amp_fsm: 4; + uint32_t amp_rst_fb_fsm: 4; + uint32_t amp_short_ref_fsm: 4; + uint32_t amp_short_ref_gnd_fsm: 4; + uint32_t xpd_sar_fsm: 4; + uint32_t sar_rstb_fsm: 4; + uint32_t sar2_xpd_wait: 8; + }; + uint32_t val; + } sar_meas_ctrl; + uint32_t sar_read_status2; /**/ + uint32_t ulp_cp_sleep_cyc0; /**/ + uint32_t ulp_cp_sleep_cyc1; /**/ + uint32_t ulp_cp_sleep_cyc2; /**/ + uint32_t ulp_cp_sleep_cyc3; /**/ + uint32_t ulp_cp_sleep_cyc4; /**/ + union { + struct { + uint32_t sar1_bit_width: 2; + uint32_t sar2_bit_width: 2; + uint32_t sar2_en_test: 1; + uint32_t sar2_pwdet_cct: 3; + uint32_t ulp_cp_force_start_top: 1; + uint32_t ulp_cp_start_top: 1; + uint32_t sarclk_en: 1; + uint32_t pc_init: 11; + uint32_t sar2_stop: 1; + uint32_t sar1_stop: 1; + uint32_t sar2_pwdet_en: 1; + uint32_t reserved25: 7; + }; + uint32_t val; + } sar_start_force; + union { + struct { + uint32_t mem_wr_addr_init: 11; + uint32_t mem_wr_addr_size: 11; + uint32_t rtc_mem_wr_offst_clr: 1; + uint32_t reserved23: 9; + }; + uint32_t val; + } sar_mem_wr_ctrl; + uint32_t sar_atten1; /**/ + uint32_t sar_atten2; /**/ + union { + struct { + uint32_t i2c_slave_addr1: 11; + uint32_t i2c_slave_addr0: 11; + uint32_t meas_status: 8; + uint32_t reserved30: 2; + }; + uint32_t val; + } sar_slave_addr1; + union { + struct { + uint32_t i2c_slave_addr3:11; + uint32_t i2c_slave_addr2:11; + uint32_t reserved22: 10; + }; + uint32_t val; + } sar_slave_addr2; + union { + struct { + uint32_t i2c_slave_addr5:11; + uint32_t i2c_slave_addr4:11; + uint32_t tsens_out: 8; + uint32_t tsens_rdy_out: 1; + uint32_t reserved31: 1; + }; + uint32_t val; + } sar_slave_addr3; + union { + struct { + uint32_t i2c_slave_addr7:11; + uint32_t i2c_slave_addr6:11; + uint32_t i2c_rdata: 8; + uint32_t i2c_done: 1; + uint32_t reserved31: 1; + }; + uint32_t val; + } sar_slave_addr4; + union { + struct { + uint32_t tsens_xpd_wait: 12; + uint32_t tsens_xpd_force: 1; + uint32_t tsens_clk_inv: 1; + uint32_t tsens_clk_gated: 1; + uint32_t tsens_in_inv: 1; + uint32_t tsens_clk_div: 8; + uint32_t tsens_power_up: 1; + uint32_t tsens_power_up_force: 1; + uint32_t tsens_dump_out: 1; + uint32_t reserved27: 5; + }; + uint32_t val; + } sar_tctrl; + union { + struct { + uint32_t sar_i2c_ctrl: 28; + uint32_t sar_i2c_start: 1; + uint32_t sar_i2c_start_force: 1; + uint32_t reserved30: 2; + }; + uint32_t val; + } sar_i2c_ctrl; + union { + struct { + uint32_t meas1_data_sar: 16; + uint32_t meas1_done_sar: 1; + uint32_t meas1_start_sar: 1; + uint32_t meas1_start_force: 1; /*1: ADC1 is controlled by the digital or RTC controller 0: Ulp coprocessor*/ + uint32_t sar1_en_pad: 12; + uint32_t sar1_en_pad_force: 1; /*1: Data ports are controlled by the digital or RTC controller 0: Ulp coprocessor*/ + }; + uint32_t val; + } sar_meas_start1; + union { + struct { + uint32_t touch_meas_delay:16; + uint32_t touch_xpd_wait: 8; + uint32_t touch_out_sel: 1; + uint32_t touch_out_1en: 1; + uint32_t xpd_hall_force: 1; /*1: Power of hall sensor is controlled by the digital or RTC controller 0: Ulp coprocessor*/ + uint32_t hall_phase_force: 1; /*1: Phase of hall sensor is controlled by the digital or RTC controller 0: Ulp coprocessor*/ + uint32_t reserved28: 4; + }; + uint32_t val; + } sar_touch_ctrl1; + union { + struct { + uint32_t l_thresh: 16; + uint32_t h_thresh: 16; + }; + uint32_t val; + } touch_thresh[5]; + union { + struct { + uint32_t l_val: 16; + uint32_t h_val: 16; + }; + uint32_t val; + } touch_meas[5]; + union { + struct { + uint32_t touch_meas_en: 10; + uint32_t touch_meas_done: 1; + uint32_t touch_start_fsm_en: 1; + uint32_t touch_start_en: 1; + uint32_t touch_start_force: 1; + uint32_t touch_sleep_cycles:16; + uint32_t touch_meas_en_clr: 1; + uint32_t reserved31: 1; + }; + uint32_t val; + } sar_touch_ctrl2; + uint32_t reserved_88; + union { + struct { + uint32_t touch_pad_worken:10; + uint32_t touch_pad_outen2:10; + uint32_t touch_pad_outen1:10; + uint32_t reserved30: 2; + }; + uint32_t val; + } sar_touch_enable; + union { + struct { + uint32_t sar2_clk_div: 8; + uint32_t sar2_sample_cycle: 8; + uint32_t sar2_sample_bit: 2; + uint32_t sar2_clk_gated: 1; + uint32_t sar2_sample_num: 8; + uint32_t sar2_pwdet_force: 1; /*1: ADC2 is controlled by PWDET 0: digital or RTC controller*/ + uint32_t sar2_dig_force: 1; /*1: ADC2 is controlled by the digital controller 0: RTC controller*/ + uint32_t sar2_data_inv: 1; + uint32_t reserved30: 2; + }; + uint32_t val; + } sar_read_ctrl2; + union { + struct { + uint32_t meas2_data_sar: 16; + uint32_t meas2_done_sar: 1; + uint32_t meas2_start_sar: 1; + uint32_t meas2_start_force: 1; /*1: ADC2 is controlled by the digital or RTC controller 0: Ulp coprocessor*/ + uint32_t sar2_en_pad: 12; + uint32_t sar2_en_pad_force: 1; /*1: Data ports are controlled by the digital or RTC controller 0: Ulp coprocessor*/ + }; + uint32_t val; + } sar_meas_start2; + union { + struct { + uint32_t sw_fstep: 16; + uint32_t sw_tone_en: 1; + uint32_t debug_bit_sel: 5; + uint32_t dac_dig_force: 1; + uint32_t dac_clk_force_low: 1; + uint32_t dac_clk_force_high: 1; + uint32_t dac_clk_inv: 1; + uint32_t reserved26: 6; + }; + uint32_t val; + } sar_dac_ctrl1; + union { + struct { + uint32_t dac_dc1: 8; + uint32_t dac_dc2: 8; + uint32_t dac_scale1: 2; + uint32_t dac_scale2: 2; + uint32_t dac_inv1: 2; + uint32_t dac_inv2: 2; + uint32_t dac_cw_en1: 1; + uint32_t dac_cw_en2: 1; + uint32_t reserved26: 6; + }; + uint32_t val; + } sar_dac_ctrl2; + union { + struct { + uint32_t sar1_dac_xpd_fsm: 4; + uint32_t sar1_dac_xpd_fsm_idle: 1; + uint32_t xpd_sar_amp_fsm_idle: 1; + uint32_t amp_rst_fb_fsm_idle: 1; + uint32_t amp_short_ref_fsm_idle: 1; + uint32_t amp_short_ref_gnd_fsm_idle: 1; + uint32_t xpd_sar_fsm_idle: 1; + uint32_t sar_rstb_fsm_idle: 1; + uint32_t sar2_rstb_force: 2; + uint32_t amp_rst_fb_force: 2; + uint32_t amp_short_ref_force: 2; + uint32_t amp_short_ref_gnd_force: 2; + uint32_t reserved19: 13; + }; + uint32_t val; + } sar_meas_ctrl2; + 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 sar_nouse; /**/ + union { + struct { + uint32_t sar_date: 28; + uint32_t reserved28: 4; + }; + uint32_t val; + } sardate; +} sens_dev_t; +extern sens_dev_t SENS; + +#ifdef __cplusplus +} +#endif + +#endif /* _SOC_SENS_STRUCT_H_ */ diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/sigmadelta_caps.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/sigmadelta_caps.h new file mode 100644 index 0000000000000..53035d185507d --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/sigmadelta_caps.h @@ -0,0 +1,37 @@ +// 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. + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +// ESP32 have 1 SIGMADELTA peripheral. +#define SIGMADELTA_PORT_0 (0) /*!< SIGMADELTA port 0 */ +#define SIGMADELTA_PORT_MAX (1) /*!< SIGMADELTA port max */ +#define SOC_SIGMADELTA_NUM (SIGMADELTA_PORT_MAX) + +#define SIGMADELTA_CHANNEL_0 (0) /*!< Sigma-delta channel 0 */ +#define SIGMADELTA_CHANNEL_1 (1) /*!< Sigma-delta channel 1 */ +#define SIGMADELTA_CHANNEL_2 (2) /*!< Sigma-delta channel 2 */ +#define SIGMADELTA_CHANNEL_3 (3) /*!< Sigma-delta channel 3 */ +#define SIGMADELTA_CHANNEL_4 (4) /*!< Sigma-delta channel 4 */ +#define SIGMADELTA_CHANNEL_5 (5) /*!< Sigma-delta channel 5 */ +#define SIGMADELTA_CHANNEL_6 (6) /*!< Sigma-delta channel 6 */ +#define SIGMADELTA_CHANNEL_7 (7) /*!< Sigma-delta channel 7 */ +#define SIGMADELTA_CHANNEL_MAX (8) + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/slc_reg.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/slc_reg.h new file mode 100644 index 0000000000000..3d4541cccbcfd --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/slc_reg.h @@ -0,0 +1,3244 @@ +// 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. +#ifndef _SOC_SLC_REG_H_ +#define _SOC_SLC_REG_H_ + + +#include "soc.h" +#define SLC_CONF0_REG (DR_REG_SLC_BASE + 0x0) +/* SLC_SLC1_TOKEN_SEL : R/W ;bitpos:[31] ;default: 1'h1 ; */ +/*description: */ +#define SLC_SLC1_TOKEN_SEL (BIT(31)) +#define SLC_SLC1_TOKEN_SEL_M (BIT(31)) +#define SLC_SLC1_TOKEN_SEL_V 0x1 +#define SLC_SLC1_TOKEN_SEL_S 31 +/* SLC_SLC1_TOKEN_AUTO_CLR : R/W ;bitpos:[30] ;default: 1'h1 ; */ +/*description: */ +#define SLC_SLC1_TOKEN_AUTO_CLR (BIT(30)) +#define SLC_SLC1_TOKEN_AUTO_CLR_M (BIT(30)) +#define SLC_SLC1_TOKEN_AUTO_CLR_V 0x1 +#define SLC_SLC1_TOKEN_AUTO_CLR_S 30 +/* SLC_SLC1_TXDATA_BURST_EN : R/W ;bitpos:[29] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC1_TXDATA_BURST_EN (BIT(29)) +#define SLC_SLC1_TXDATA_BURST_EN_M (BIT(29)) +#define SLC_SLC1_TXDATA_BURST_EN_V 0x1 +#define SLC_SLC1_TXDATA_BURST_EN_S 29 +/* SLC_SLC1_TXDSCR_BURST_EN : R/W ;bitpos:[28] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC1_TXDSCR_BURST_EN (BIT(28)) +#define SLC_SLC1_TXDSCR_BURST_EN_M (BIT(28)) +#define SLC_SLC1_TXDSCR_BURST_EN_V 0x1 +#define SLC_SLC1_TXDSCR_BURST_EN_S 28 +/* SLC_SLC1_TXLINK_AUTO_RET : R/W ;bitpos:[27] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC1_TXLINK_AUTO_RET (BIT(27)) +#define SLC_SLC1_TXLINK_AUTO_RET_M (BIT(27)) +#define SLC_SLC1_TXLINK_AUTO_RET_V 0x1 +#define SLC_SLC1_TXLINK_AUTO_RET_S 27 +/* SLC_SLC1_RXLINK_AUTO_RET : R/W ;bitpos:[26] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC1_RXLINK_AUTO_RET (BIT(26)) +#define SLC_SLC1_RXLINK_AUTO_RET_M (BIT(26)) +#define SLC_SLC1_RXLINK_AUTO_RET_V 0x1 +#define SLC_SLC1_RXLINK_AUTO_RET_S 26 +/* SLC_SLC1_RXDATA_BURST_EN : R/W ;bitpos:[25] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC1_RXDATA_BURST_EN (BIT(25)) +#define SLC_SLC1_RXDATA_BURST_EN_M (BIT(25)) +#define SLC_SLC1_RXDATA_BURST_EN_V 0x1 +#define SLC_SLC1_RXDATA_BURST_EN_S 25 +/* SLC_SLC1_RXDSCR_BURST_EN : R/W ;bitpos:[24] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC1_RXDSCR_BURST_EN (BIT(24)) +#define SLC_SLC1_RXDSCR_BURST_EN_M (BIT(24)) +#define SLC_SLC1_RXDSCR_BURST_EN_V 0x1 +#define SLC_SLC1_RXDSCR_BURST_EN_S 24 +/* SLC_SLC1_RX_NO_RESTART_CLR : R/W ;bitpos:[23] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_NO_RESTART_CLR (BIT(23)) +#define SLC_SLC1_RX_NO_RESTART_CLR_M (BIT(23)) +#define SLC_SLC1_RX_NO_RESTART_CLR_V 0x1 +#define SLC_SLC1_RX_NO_RESTART_CLR_S 23 +/* SLC_SLC1_RX_AUTO_WRBACK : R/W ;bitpos:[22] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_AUTO_WRBACK (BIT(22)) +#define SLC_SLC1_RX_AUTO_WRBACK_M (BIT(22)) +#define SLC_SLC1_RX_AUTO_WRBACK_V 0x1 +#define SLC_SLC1_RX_AUTO_WRBACK_S 22 +/* SLC_SLC1_RX_LOOP_TEST : R/W ;bitpos:[21] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC1_RX_LOOP_TEST (BIT(21)) +#define SLC_SLC1_RX_LOOP_TEST_M (BIT(21)) +#define SLC_SLC1_RX_LOOP_TEST_V 0x1 +#define SLC_SLC1_RX_LOOP_TEST_S 21 +/* SLC_SLC1_TX_LOOP_TEST : R/W ;bitpos:[20] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC1_TX_LOOP_TEST (BIT(20)) +#define SLC_SLC1_TX_LOOP_TEST_M (BIT(20)) +#define SLC_SLC1_TX_LOOP_TEST_V 0x1 +#define SLC_SLC1_TX_LOOP_TEST_S 20 +/* SLC_SLC1_WR_RETRY_MASK_EN : R/W ;bitpos:[19] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC1_WR_RETRY_MASK_EN (BIT(19)) +#define SLC_SLC1_WR_RETRY_MASK_EN_M (BIT(19)) +#define SLC_SLC1_WR_RETRY_MASK_EN_V 0x1 +#define SLC_SLC1_WR_RETRY_MASK_EN_S 19 +/* SLC_SLC0_WR_RETRY_MASK_EN : R/W ;bitpos:[18] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC0_WR_RETRY_MASK_EN (BIT(18)) +#define SLC_SLC0_WR_RETRY_MASK_EN_M (BIT(18)) +#define SLC_SLC0_WR_RETRY_MASK_EN_V 0x1 +#define SLC_SLC0_WR_RETRY_MASK_EN_S 18 +/* SLC_SLC1_RX_RST : R/W ;bitpos:[17] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_RST (BIT(17)) +#define SLC_SLC1_RX_RST_M (BIT(17)) +#define SLC_SLC1_RX_RST_V 0x1 +#define SLC_SLC1_RX_RST_S 17 +/* SLC_SLC1_TX_RST : R/W ;bitpos:[16] ;default: 1'h0 ; */ +/*description: */ +#define SLC_SLC1_TX_RST (BIT(16)) +#define SLC_SLC1_TX_RST_M (BIT(16)) +#define SLC_SLC1_TX_RST_V 0x1 +#define SLC_SLC1_TX_RST_S 16 +/* SLC_SLC0_TOKEN_SEL : R/W ;bitpos:[15] ;default: 1'h1 ; */ +/*description: */ +#define SLC_SLC0_TOKEN_SEL (BIT(15)) +#define SLC_SLC0_TOKEN_SEL_M (BIT(15)) +#define SLC_SLC0_TOKEN_SEL_V 0x1 +#define SLC_SLC0_TOKEN_SEL_S 15 +/* SLC_SLC0_TOKEN_AUTO_CLR : R/W ;bitpos:[14] ;default: 1'h1 ; */ +/*description: */ +#define SLC_SLC0_TOKEN_AUTO_CLR (BIT(14)) +#define SLC_SLC0_TOKEN_AUTO_CLR_M (BIT(14)) +#define SLC_SLC0_TOKEN_AUTO_CLR_V 0x1 +#define SLC_SLC0_TOKEN_AUTO_CLR_S 14 +/* SLC_SLC0_TXDATA_BURST_EN : R/W ;bitpos:[13] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC0_TXDATA_BURST_EN (BIT(13)) +#define SLC_SLC0_TXDATA_BURST_EN_M (BIT(13)) +#define SLC_SLC0_TXDATA_BURST_EN_V 0x1 +#define SLC_SLC0_TXDATA_BURST_EN_S 13 +/* SLC_SLC0_TXDSCR_BURST_EN : R/W ;bitpos:[12] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC0_TXDSCR_BURST_EN (BIT(12)) +#define SLC_SLC0_TXDSCR_BURST_EN_M (BIT(12)) +#define SLC_SLC0_TXDSCR_BURST_EN_V 0x1 +#define SLC_SLC0_TXDSCR_BURST_EN_S 12 +/* SLC_SLC0_TXLINK_AUTO_RET : R/W ;bitpos:[11] ;default: 1'h1 ; */ +/*description: */ +#define SLC_SLC0_TXLINK_AUTO_RET (BIT(11)) +#define SLC_SLC0_TXLINK_AUTO_RET_M (BIT(11)) +#define SLC_SLC0_TXLINK_AUTO_RET_V 0x1 +#define SLC_SLC0_TXLINK_AUTO_RET_S 11 +/* SLC_SLC0_RXLINK_AUTO_RET : R/W ;bitpos:[10] ;default: 1'h1 ; */ +/*description: */ +#define SLC_SLC0_RXLINK_AUTO_RET (BIT(10)) +#define SLC_SLC0_RXLINK_AUTO_RET_M (BIT(10)) +#define SLC_SLC0_RXLINK_AUTO_RET_V 0x1 +#define SLC_SLC0_RXLINK_AUTO_RET_S 10 +/* SLC_SLC0_RXDATA_BURST_EN : R/W ;bitpos:[9] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC0_RXDATA_BURST_EN (BIT(9)) +#define SLC_SLC0_RXDATA_BURST_EN_M (BIT(9)) +#define SLC_SLC0_RXDATA_BURST_EN_V 0x1 +#define SLC_SLC0_RXDATA_BURST_EN_S 9 +/* SLC_SLC0_RXDSCR_BURST_EN : R/W ;bitpos:[8] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC0_RXDSCR_BURST_EN (BIT(8)) +#define SLC_SLC0_RXDSCR_BURST_EN_M (BIT(8)) +#define SLC_SLC0_RXDSCR_BURST_EN_V 0x1 +#define SLC_SLC0_RXDSCR_BURST_EN_S 8 +/* SLC_SLC0_RX_NO_RESTART_CLR : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_NO_RESTART_CLR (BIT(7)) +#define SLC_SLC0_RX_NO_RESTART_CLR_M (BIT(7)) +#define SLC_SLC0_RX_NO_RESTART_CLR_V 0x1 +#define SLC_SLC0_RX_NO_RESTART_CLR_S 7 +/* SLC_SLC0_RX_AUTO_WRBACK : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_AUTO_WRBACK (BIT(6)) +#define SLC_SLC0_RX_AUTO_WRBACK_M (BIT(6)) +#define SLC_SLC0_RX_AUTO_WRBACK_V 0x1 +#define SLC_SLC0_RX_AUTO_WRBACK_S 6 +/* SLC_SLC0_RX_LOOP_TEST : R/W ;bitpos:[5] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC0_RX_LOOP_TEST (BIT(5)) +#define SLC_SLC0_RX_LOOP_TEST_M (BIT(5)) +#define SLC_SLC0_RX_LOOP_TEST_V 0x1 +#define SLC_SLC0_RX_LOOP_TEST_S 5 +/* SLC_SLC0_TX_LOOP_TEST : R/W ;bitpos:[4] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC0_TX_LOOP_TEST (BIT(4)) +#define SLC_SLC0_TX_LOOP_TEST_M (BIT(4)) +#define SLC_SLC0_TX_LOOP_TEST_V 0x1 +#define SLC_SLC0_TX_LOOP_TEST_S 4 +/* SLC_AHBM_RST : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define SLC_AHBM_RST (BIT(3)) +#define SLC_AHBM_RST_M (BIT(3)) +#define SLC_AHBM_RST_V 0x1 +#define SLC_AHBM_RST_S 3 +/* SLC_AHBM_FIFO_RST : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define SLC_AHBM_FIFO_RST (BIT(2)) +#define SLC_AHBM_FIFO_RST_M (BIT(2)) +#define SLC_AHBM_FIFO_RST_V 0x1 +#define SLC_AHBM_FIFO_RST_S 2 +/* SLC_SLC0_RX_RST : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_RST (BIT(1)) +#define SLC_SLC0_RX_RST_M (BIT(1)) +#define SLC_SLC0_RX_RST_V 0x1 +#define SLC_SLC0_RX_RST_S 1 +/* SLC_SLC0_TX_RST : R/W ;bitpos:[0] ;default: 1'h0 ; */ +/*description: */ +#define SLC_SLC0_TX_RST (BIT(0)) +#define SLC_SLC0_TX_RST_M (BIT(0)) +#define SLC_SLC0_TX_RST_V 0x1 +#define SLC_SLC0_TX_RST_S 0 + +#define SLC_0INT_RAW_REG (DR_REG_SLC_BASE + 0x4) +/* SLC_SLC0_RX_QUICK_EOF_INT_RAW : RO ;bitpos:[26] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_QUICK_EOF_INT_RAW (BIT(26)) +#define SLC_SLC0_RX_QUICK_EOF_INT_RAW_M (BIT(26)) +#define SLC_SLC0_RX_QUICK_EOF_INT_RAW_V 0x1 +#define SLC_SLC0_RX_QUICK_EOF_INT_RAW_S 26 +/* SLC_CMD_DTC_INT_RAW : RO ;bitpos:[25] ;default: 1'b0 ; */ +/*description: */ +#define SLC_CMD_DTC_INT_RAW (BIT(25)) +#define SLC_CMD_DTC_INT_RAW_M (BIT(25)) +#define SLC_CMD_DTC_INT_RAW_V 0x1 +#define SLC_CMD_DTC_INT_RAW_S 25 +/* SLC_SLC0_TX_ERR_EOF_INT_RAW : RO ;bitpos:[24] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_ERR_EOF_INT_RAW (BIT(24)) +#define SLC_SLC0_TX_ERR_EOF_INT_RAW_M (BIT(24)) +#define SLC_SLC0_TX_ERR_EOF_INT_RAW_V 0x1 +#define SLC_SLC0_TX_ERR_EOF_INT_RAW_S 24 +/* SLC_SLC0_WR_RETRY_DONE_INT_RAW : RO ;bitpos:[23] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_WR_RETRY_DONE_INT_RAW (BIT(23)) +#define SLC_SLC0_WR_RETRY_DONE_INT_RAW_M (BIT(23)) +#define SLC_SLC0_WR_RETRY_DONE_INT_RAW_V 0x1 +#define SLC_SLC0_WR_RETRY_DONE_INT_RAW_S 23 +/* SLC_SLC0_HOST_RD_ACK_INT_RAW : RO ;bitpos:[22] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_HOST_RD_ACK_INT_RAW (BIT(22)) +#define SLC_SLC0_HOST_RD_ACK_INT_RAW_M (BIT(22)) +#define SLC_SLC0_HOST_RD_ACK_INT_RAW_V 0x1 +#define SLC_SLC0_HOST_RD_ACK_INT_RAW_S 22 +/* SLC_SLC0_TX_DSCR_EMPTY_INT_RAW : RO ;bitpos:[21] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_DSCR_EMPTY_INT_RAW (BIT(21)) +#define SLC_SLC0_TX_DSCR_EMPTY_INT_RAW_M (BIT(21)) +#define SLC_SLC0_TX_DSCR_EMPTY_INT_RAW_V 0x1 +#define SLC_SLC0_TX_DSCR_EMPTY_INT_RAW_S 21 +/* SLC_SLC0_RX_DSCR_ERR_INT_RAW : RO ;bitpos:[20] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_DSCR_ERR_INT_RAW (BIT(20)) +#define SLC_SLC0_RX_DSCR_ERR_INT_RAW_M (BIT(20)) +#define SLC_SLC0_RX_DSCR_ERR_INT_RAW_V 0x1 +#define SLC_SLC0_RX_DSCR_ERR_INT_RAW_S 20 +/* SLC_SLC0_TX_DSCR_ERR_INT_RAW : RO ;bitpos:[19] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_DSCR_ERR_INT_RAW (BIT(19)) +#define SLC_SLC0_TX_DSCR_ERR_INT_RAW_M (BIT(19)) +#define SLC_SLC0_TX_DSCR_ERR_INT_RAW_V 0x1 +#define SLC_SLC0_TX_DSCR_ERR_INT_RAW_S 19 +/* SLC_SLC0_TOHOST_INT_RAW : RO ;bitpos:[18] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TOHOST_INT_RAW (BIT(18)) +#define SLC_SLC0_TOHOST_INT_RAW_M (BIT(18)) +#define SLC_SLC0_TOHOST_INT_RAW_V 0x1 +#define SLC_SLC0_TOHOST_INT_RAW_S 18 +/* SLC_SLC0_RX_EOF_INT_RAW : RO ;bitpos:[17] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_EOF_INT_RAW (BIT(17)) +#define SLC_SLC0_RX_EOF_INT_RAW_M (BIT(17)) +#define SLC_SLC0_RX_EOF_INT_RAW_V 0x1 +#define SLC_SLC0_RX_EOF_INT_RAW_S 17 +/* SLC_SLC0_RX_DONE_INT_RAW : RO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_DONE_INT_RAW (BIT(16)) +#define SLC_SLC0_RX_DONE_INT_RAW_M (BIT(16)) +#define SLC_SLC0_RX_DONE_INT_RAW_V 0x1 +#define SLC_SLC0_RX_DONE_INT_RAW_S 16 +/* SLC_SLC0_TX_SUC_EOF_INT_RAW : RO ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_SUC_EOF_INT_RAW (BIT(15)) +#define SLC_SLC0_TX_SUC_EOF_INT_RAW_M (BIT(15)) +#define SLC_SLC0_TX_SUC_EOF_INT_RAW_V 0x1 +#define SLC_SLC0_TX_SUC_EOF_INT_RAW_S 15 +/* SLC_SLC0_TX_DONE_INT_RAW : RO ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_DONE_INT_RAW (BIT(14)) +#define SLC_SLC0_TX_DONE_INT_RAW_M (BIT(14)) +#define SLC_SLC0_TX_DONE_INT_RAW_V 0x1 +#define SLC_SLC0_TX_DONE_INT_RAW_S 14 +/* SLC_SLC0_TOKEN1_1TO0_INT_RAW : RO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TOKEN1_1TO0_INT_RAW (BIT(13)) +#define SLC_SLC0_TOKEN1_1TO0_INT_RAW_M (BIT(13)) +#define SLC_SLC0_TOKEN1_1TO0_INT_RAW_V 0x1 +#define SLC_SLC0_TOKEN1_1TO0_INT_RAW_S 13 +/* SLC_SLC0_TOKEN0_1TO0_INT_RAW : RO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TOKEN0_1TO0_INT_RAW (BIT(12)) +#define SLC_SLC0_TOKEN0_1TO0_INT_RAW_M (BIT(12)) +#define SLC_SLC0_TOKEN0_1TO0_INT_RAW_V 0x1 +#define SLC_SLC0_TOKEN0_1TO0_INT_RAW_S 12 +/* SLC_SLC0_TX_OVF_INT_RAW : RO ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_OVF_INT_RAW (BIT(11)) +#define SLC_SLC0_TX_OVF_INT_RAW_M (BIT(11)) +#define SLC_SLC0_TX_OVF_INT_RAW_V 0x1 +#define SLC_SLC0_TX_OVF_INT_RAW_S 11 +/* SLC_SLC0_RX_UDF_INT_RAW : RO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_UDF_INT_RAW (BIT(10)) +#define SLC_SLC0_RX_UDF_INT_RAW_M (BIT(10)) +#define SLC_SLC0_RX_UDF_INT_RAW_V 0x1 +#define SLC_SLC0_RX_UDF_INT_RAW_S 10 +/* SLC_SLC0_TX_START_INT_RAW : RO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_START_INT_RAW (BIT(9)) +#define SLC_SLC0_TX_START_INT_RAW_M (BIT(9)) +#define SLC_SLC0_TX_START_INT_RAW_V 0x1 +#define SLC_SLC0_TX_START_INT_RAW_S 9 +/* SLC_SLC0_RX_START_INT_RAW : RO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_START_INT_RAW (BIT(8)) +#define SLC_SLC0_RX_START_INT_RAW_M (BIT(8)) +#define SLC_SLC0_RX_START_INT_RAW_V 0x1 +#define SLC_SLC0_RX_START_INT_RAW_S 8 +/* SLC_FRHOST_BIT7_INT_RAW : RO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT7_INT_RAW (BIT(7)) +#define SLC_FRHOST_BIT7_INT_RAW_M (BIT(7)) +#define SLC_FRHOST_BIT7_INT_RAW_V 0x1 +#define SLC_FRHOST_BIT7_INT_RAW_S 7 +/* SLC_FRHOST_BIT6_INT_RAW : RO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT6_INT_RAW (BIT(6)) +#define SLC_FRHOST_BIT6_INT_RAW_M (BIT(6)) +#define SLC_FRHOST_BIT6_INT_RAW_V 0x1 +#define SLC_FRHOST_BIT6_INT_RAW_S 6 +/* SLC_FRHOST_BIT5_INT_RAW : RO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT5_INT_RAW (BIT(5)) +#define SLC_FRHOST_BIT5_INT_RAW_M (BIT(5)) +#define SLC_FRHOST_BIT5_INT_RAW_V 0x1 +#define SLC_FRHOST_BIT5_INT_RAW_S 5 +/* SLC_FRHOST_BIT4_INT_RAW : RO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT4_INT_RAW (BIT(4)) +#define SLC_FRHOST_BIT4_INT_RAW_M (BIT(4)) +#define SLC_FRHOST_BIT4_INT_RAW_V 0x1 +#define SLC_FRHOST_BIT4_INT_RAW_S 4 +/* SLC_FRHOST_BIT3_INT_RAW : RO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT3_INT_RAW (BIT(3)) +#define SLC_FRHOST_BIT3_INT_RAW_M (BIT(3)) +#define SLC_FRHOST_BIT3_INT_RAW_V 0x1 +#define SLC_FRHOST_BIT3_INT_RAW_S 3 +/* SLC_FRHOST_BIT2_INT_RAW : RO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT2_INT_RAW (BIT(2)) +#define SLC_FRHOST_BIT2_INT_RAW_M (BIT(2)) +#define SLC_FRHOST_BIT2_INT_RAW_V 0x1 +#define SLC_FRHOST_BIT2_INT_RAW_S 2 +/* SLC_FRHOST_BIT1_INT_RAW : RO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT1_INT_RAW (BIT(1)) +#define SLC_FRHOST_BIT1_INT_RAW_M (BIT(1)) +#define SLC_FRHOST_BIT1_INT_RAW_V 0x1 +#define SLC_FRHOST_BIT1_INT_RAW_S 1 +/* SLC_FRHOST_BIT0_INT_RAW : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT0_INT_RAW (BIT(0)) +#define SLC_FRHOST_BIT0_INT_RAW_M (BIT(0)) +#define SLC_FRHOST_BIT0_INT_RAW_V 0x1 +#define SLC_FRHOST_BIT0_INT_RAW_S 0 + +#define SLC_0INT_ST_REG (DR_REG_SLC_BASE + 0x8) +/* SLC_SLC0_RX_QUICK_EOF_INT_ST : RO ;bitpos:[26] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_QUICK_EOF_INT_ST (BIT(26)) +#define SLC_SLC0_RX_QUICK_EOF_INT_ST_M (BIT(26)) +#define SLC_SLC0_RX_QUICK_EOF_INT_ST_V 0x1 +#define SLC_SLC0_RX_QUICK_EOF_INT_ST_S 26 +/* SLC_CMD_DTC_INT_ST : RO ;bitpos:[25] ;default: 1'b0 ; */ +/*description: */ +#define SLC_CMD_DTC_INT_ST (BIT(25)) +#define SLC_CMD_DTC_INT_ST_M (BIT(25)) +#define SLC_CMD_DTC_INT_ST_V 0x1 +#define SLC_CMD_DTC_INT_ST_S 25 +/* SLC_SLC0_TX_ERR_EOF_INT_ST : RO ;bitpos:[24] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_ERR_EOF_INT_ST (BIT(24)) +#define SLC_SLC0_TX_ERR_EOF_INT_ST_M (BIT(24)) +#define SLC_SLC0_TX_ERR_EOF_INT_ST_V 0x1 +#define SLC_SLC0_TX_ERR_EOF_INT_ST_S 24 +/* SLC_SLC0_WR_RETRY_DONE_INT_ST : RO ;bitpos:[23] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_WR_RETRY_DONE_INT_ST (BIT(23)) +#define SLC_SLC0_WR_RETRY_DONE_INT_ST_M (BIT(23)) +#define SLC_SLC0_WR_RETRY_DONE_INT_ST_V 0x1 +#define SLC_SLC0_WR_RETRY_DONE_INT_ST_S 23 +/* SLC_SLC0_HOST_RD_ACK_INT_ST : RO ;bitpos:[22] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_HOST_RD_ACK_INT_ST (BIT(22)) +#define SLC_SLC0_HOST_RD_ACK_INT_ST_M (BIT(22)) +#define SLC_SLC0_HOST_RD_ACK_INT_ST_V 0x1 +#define SLC_SLC0_HOST_RD_ACK_INT_ST_S 22 +/* SLC_SLC0_TX_DSCR_EMPTY_INT_ST : RO ;bitpos:[21] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_DSCR_EMPTY_INT_ST (BIT(21)) +#define SLC_SLC0_TX_DSCR_EMPTY_INT_ST_M (BIT(21)) +#define SLC_SLC0_TX_DSCR_EMPTY_INT_ST_V 0x1 +#define SLC_SLC0_TX_DSCR_EMPTY_INT_ST_S 21 +/* SLC_SLC0_RX_DSCR_ERR_INT_ST : RO ;bitpos:[20] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_DSCR_ERR_INT_ST (BIT(20)) +#define SLC_SLC0_RX_DSCR_ERR_INT_ST_M (BIT(20)) +#define SLC_SLC0_RX_DSCR_ERR_INT_ST_V 0x1 +#define SLC_SLC0_RX_DSCR_ERR_INT_ST_S 20 +/* SLC_SLC0_TX_DSCR_ERR_INT_ST : RO ;bitpos:[19] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_DSCR_ERR_INT_ST (BIT(19)) +#define SLC_SLC0_TX_DSCR_ERR_INT_ST_M (BIT(19)) +#define SLC_SLC0_TX_DSCR_ERR_INT_ST_V 0x1 +#define SLC_SLC0_TX_DSCR_ERR_INT_ST_S 19 +/* SLC_SLC0_TOHOST_INT_ST : RO ;bitpos:[18] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TOHOST_INT_ST (BIT(18)) +#define SLC_SLC0_TOHOST_INT_ST_M (BIT(18)) +#define SLC_SLC0_TOHOST_INT_ST_V 0x1 +#define SLC_SLC0_TOHOST_INT_ST_S 18 +/* SLC_SLC0_RX_EOF_INT_ST : RO ;bitpos:[17] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_EOF_INT_ST (BIT(17)) +#define SLC_SLC0_RX_EOF_INT_ST_M (BIT(17)) +#define SLC_SLC0_RX_EOF_INT_ST_V 0x1 +#define SLC_SLC0_RX_EOF_INT_ST_S 17 +/* SLC_SLC0_RX_DONE_INT_ST : RO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_DONE_INT_ST (BIT(16)) +#define SLC_SLC0_RX_DONE_INT_ST_M (BIT(16)) +#define SLC_SLC0_RX_DONE_INT_ST_V 0x1 +#define SLC_SLC0_RX_DONE_INT_ST_S 16 +/* SLC_SLC0_TX_SUC_EOF_INT_ST : RO ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_SUC_EOF_INT_ST (BIT(15)) +#define SLC_SLC0_TX_SUC_EOF_INT_ST_M (BIT(15)) +#define SLC_SLC0_TX_SUC_EOF_INT_ST_V 0x1 +#define SLC_SLC0_TX_SUC_EOF_INT_ST_S 15 +/* SLC_SLC0_TX_DONE_INT_ST : RO ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_DONE_INT_ST (BIT(14)) +#define SLC_SLC0_TX_DONE_INT_ST_M (BIT(14)) +#define SLC_SLC0_TX_DONE_INT_ST_V 0x1 +#define SLC_SLC0_TX_DONE_INT_ST_S 14 +/* SLC_SLC0_TOKEN1_1TO0_INT_ST : RO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TOKEN1_1TO0_INT_ST (BIT(13)) +#define SLC_SLC0_TOKEN1_1TO0_INT_ST_M (BIT(13)) +#define SLC_SLC0_TOKEN1_1TO0_INT_ST_V 0x1 +#define SLC_SLC0_TOKEN1_1TO0_INT_ST_S 13 +/* SLC_SLC0_TOKEN0_1TO0_INT_ST : RO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TOKEN0_1TO0_INT_ST (BIT(12)) +#define SLC_SLC0_TOKEN0_1TO0_INT_ST_M (BIT(12)) +#define SLC_SLC0_TOKEN0_1TO0_INT_ST_V 0x1 +#define SLC_SLC0_TOKEN0_1TO0_INT_ST_S 12 +/* SLC_SLC0_TX_OVF_INT_ST : RO ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_OVF_INT_ST (BIT(11)) +#define SLC_SLC0_TX_OVF_INT_ST_M (BIT(11)) +#define SLC_SLC0_TX_OVF_INT_ST_V 0x1 +#define SLC_SLC0_TX_OVF_INT_ST_S 11 +/* SLC_SLC0_RX_UDF_INT_ST : RO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_UDF_INT_ST (BIT(10)) +#define SLC_SLC0_RX_UDF_INT_ST_M (BIT(10)) +#define SLC_SLC0_RX_UDF_INT_ST_V 0x1 +#define SLC_SLC0_RX_UDF_INT_ST_S 10 +/* SLC_SLC0_TX_START_INT_ST : RO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_START_INT_ST (BIT(9)) +#define SLC_SLC0_TX_START_INT_ST_M (BIT(9)) +#define SLC_SLC0_TX_START_INT_ST_V 0x1 +#define SLC_SLC0_TX_START_INT_ST_S 9 +/* SLC_SLC0_RX_START_INT_ST : RO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_START_INT_ST (BIT(8)) +#define SLC_SLC0_RX_START_INT_ST_M (BIT(8)) +#define SLC_SLC0_RX_START_INT_ST_V 0x1 +#define SLC_SLC0_RX_START_INT_ST_S 8 +/* SLC_FRHOST_BIT7_INT_ST : RO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT7_INT_ST (BIT(7)) +#define SLC_FRHOST_BIT7_INT_ST_M (BIT(7)) +#define SLC_FRHOST_BIT7_INT_ST_V 0x1 +#define SLC_FRHOST_BIT7_INT_ST_S 7 +/* SLC_FRHOST_BIT6_INT_ST : RO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT6_INT_ST (BIT(6)) +#define SLC_FRHOST_BIT6_INT_ST_M (BIT(6)) +#define SLC_FRHOST_BIT6_INT_ST_V 0x1 +#define SLC_FRHOST_BIT6_INT_ST_S 6 +/* SLC_FRHOST_BIT5_INT_ST : RO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT5_INT_ST (BIT(5)) +#define SLC_FRHOST_BIT5_INT_ST_M (BIT(5)) +#define SLC_FRHOST_BIT5_INT_ST_V 0x1 +#define SLC_FRHOST_BIT5_INT_ST_S 5 +/* SLC_FRHOST_BIT4_INT_ST : RO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT4_INT_ST (BIT(4)) +#define SLC_FRHOST_BIT4_INT_ST_M (BIT(4)) +#define SLC_FRHOST_BIT4_INT_ST_V 0x1 +#define SLC_FRHOST_BIT4_INT_ST_S 4 +/* SLC_FRHOST_BIT3_INT_ST : RO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT3_INT_ST (BIT(3)) +#define SLC_FRHOST_BIT3_INT_ST_M (BIT(3)) +#define SLC_FRHOST_BIT3_INT_ST_V 0x1 +#define SLC_FRHOST_BIT3_INT_ST_S 3 +/* SLC_FRHOST_BIT2_INT_ST : RO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT2_INT_ST (BIT(2)) +#define SLC_FRHOST_BIT2_INT_ST_M (BIT(2)) +#define SLC_FRHOST_BIT2_INT_ST_V 0x1 +#define SLC_FRHOST_BIT2_INT_ST_S 2 +/* SLC_FRHOST_BIT1_INT_ST : RO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT1_INT_ST (BIT(1)) +#define SLC_FRHOST_BIT1_INT_ST_M (BIT(1)) +#define SLC_FRHOST_BIT1_INT_ST_V 0x1 +#define SLC_FRHOST_BIT1_INT_ST_S 1 +/* SLC_FRHOST_BIT0_INT_ST : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT0_INT_ST (BIT(0)) +#define SLC_FRHOST_BIT0_INT_ST_M (BIT(0)) +#define SLC_FRHOST_BIT0_INT_ST_V 0x1 +#define SLC_FRHOST_BIT0_INT_ST_S 0 + +#define SLC_0INT_ENA_REG (DR_REG_SLC_BASE + 0xC) +/* SLC_SLC0_RX_QUICK_EOF_INT_ENA : R/W ;bitpos:[26] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_QUICK_EOF_INT_ENA (BIT(26)) +#define SLC_SLC0_RX_QUICK_EOF_INT_ENA_M (BIT(26)) +#define SLC_SLC0_RX_QUICK_EOF_INT_ENA_V 0x1 +#define SLC_SLC0_RX_QUICK_EOF_INT_ENA_S 26 +/* SLC_CMD_DTC_INT_ENA : R/W ;bitpos:[25] ;default: 1'b0 ; */ +/*description: */ +#define SLC_CMD_DTC_INT_ENA (BIT(25)) +#define SLC_CMD_DTC_INT_ENA_M (BIT(25)) +#define SLC_CMD_DTC_INT_ENA_V 0x1 +#define SLC_CMD_DTC_INT_ENA_S 25 +/* SLC_SLC0_TX_ERR_EOF_INT_ENA : R/W ;bitpos:[24] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_ERR_EOF_INT_ENA (BIT(24)) +#define SLC_SLC0_TX_ERR_EOF_INT_ENA_M (BIT(24)) +#define SLC_SLC0_TX_ERR_EOF_INT_ENA_V 0x1 +#define SLC_SLC0_TX_ERR_EOF_INT_ENA_S 24 +/* SLC_SLC0_WR_RETRY_DONE_INT_ENA : R/W ;bitpos:[23] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_WR_RETRY_DONE_INT_ENA (BIT(23)) +#define SLC_SLC0_WR_RETRY_DONE_INT_ENA_M (BIT(23)) +#define SLC_SLC0_WR_RETRY_DONE_INT_ENA_V 0x1 +#define SLC_SLC0_WR_RETRY_DONE_INT_ENA_S 23 +/* SLC_SLC0_HOST_RD_ACK_INT_ENA : R/W ;bitpos:[22] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_HOST_RD_ACK_INT_ENA (BIT(22)) +#define SLC_SLC0_HOST_RD_ACK_INT_ENA_M (BIT(22)) +#define SLC_SLC0_HOST_RD_ACK_INT_ENA_V 0x1 +#define SLC_SLC0_HOST_RD_ACK_INT_ENA_S 22 +/* SLC_SLC0_TX_DSCR_EMPTY_INT_ENA : R/W ;bitpos:[21] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_DSCR_EMPTY_INT_ENA (BIT(21)) +#define SLC_SLC0_TX_DSCR_EMPTY_INT_ENA_M (BIT(21)) +#define SLC_SLC0_TX_DSCR_EMPTY_INT_ENA_V 0x1 +#define SLC_SLC0_TX_DSCR_EMPTY_INT_ENA_S 21 +/* SLC_SLC0_RX_DSCR_ERR_INT_ENA : R/W ;bitpos:[20] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_DSCR_ERR_INT_ENA (BIT(20)) +#define SLC_SLC0_RX_DSCR_ERR_INT_ENA_M (BIT(20)) +#define SLC_SLC0_RX_DSCR_ERR_INT_ENA_V 0x1 +#define SLC_SLC0_RX_DSCR_ERR_INT_ENA_S 20 +/* SLC_SLC0_TX_DSCR_ERR_INT_ENA : R/W ;bitpos:[19] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_DSCR_ERR_INT_ENA (BIT(19)) +#define SLC_SLC0_TX_DSCR_ERR_INT_ENA_M (BIT(19)) +#define SLC_SLC0_TX_DSCR_ERR_INT_ENA_V 0x1 +#define SLC_SLC0_TX_DSCR_ERR_INT_ENA_S 19 +/* SLC_SLC0_TOHOST_INT_ENA : R/W ;bitpos:[18] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TOHOST_INT_ENA (BIT(18)) +#define SLC_SLC0_TOHOST_INT_ENA_M (BIT(18)) +#define SLC_SLC0_TOHOST_INT_ENA_V 0x1 +#define SLC_SLC0_TOHOST_INT_ENA_S 18 +/* SLC_SLC0_RX_EOF_INT_ENA : R/W ;bitpos:[17] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_EOF_INT_ENA (BIT(17)) +#define SLC_SLC0_RX_EOF_INT_ENA_M (BIT(17)) +#define SLC_SLC0_RX_EOF_INT_ENA_V 0x1 +#define SLC_SLC0_RX_EOF_INT_ENA_S 17 +/* SLC_SLC0_RX_DONE_INT_ENA : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_DONE_INT_ENA (BIT(16)) +#define SLC_SLC0_RX_DONE_INT_ENA_M (BIT(16)) +#define SLC_SLC0_RX_DONE_INT_ENA_V 0x1 +#define SLC_SLC0_RX_DONE_INT_ENA_S 16 +/* SLC_SLC0_TX_SUC_EOF_INT_ENA : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_SUC_EOF_INT_ENA (BIT(15)) +#define SLC_SLC0_TX_SUC_EOF_INT_ENA_M (BIT(15)) +#define SLC_SLC0_TX_SUC_EOF_INT_ENA_V 0x1 +#define SLC_SLC0_TX_SUC_EOF_INT_ENA_S 15 +/* SLC_SLC0_TX_DONE_INT_ENA : R/W ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_DONE_INT_ENA (BIT(14)) +#define SLC_SLC0_TX_DONE_INT_ENA_M (BIT(14)) +#define SLC_SLC0_TX_DONE_INT_ENA_V 0x1 +#define SLC_SLC0_TX_DONE_INT_ENA_S 14 +/* SLC_SLC0_TOKEN1_1TO0_INT_ENA : R/W ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TOKEN1_1TO0_INT_ENA (BIT(13)) +#define SLC_SLC0_TOKEN1_1TO0_INT_ENA_M (BIT(13)) +#define SLC_SLC0_TOKEN1_1TO0_INT_ENA_V 0x1 +#define SLC_SLC0_TOKEN1_1TO0_INT_ENA_S 13 +/* SLC_SLC0_TOKEN0_1TO0_INT_ENA : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TOKEN0_1TO0_INT_ENA (BIT(12)) +#define SLC_SLC0_TOKEN0_1TO0_INT_ENA_M (BIT(12)) +#define SLC_SLC0_TOKEN0_1TO0_INT_ENA_V 0x1 +#define SLC_SLC0_TOKEN0_1TO0_INT_ENA_S 12 +/* SLC_SLC0_TX_OVF_INT_ENA : R/W ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_OVF_INT_ENA (BIT(11)) +#define SLC_SLC0_TX_OVF_INT_ENA_M (BIT(11)) +#define SLC_SLC0_TX_OVF_INT_ENA_V 0x1 +#define SLC_SLC0_TX_OVF_INT_ENA_S 11 +/* SLC_SLC0_RX_UDF_INT_ENA : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_UDF_INT_ENA (BIT(10)) +#define SLC_SLC0_RX_UDF_INT_ENA_M (BIT(10)) +#define SLC_SLC0_RX_UDF_INT_ENA_V 0x1 +#define SLC_SLC0_RX_UDF_INT_ENA_S 10 +/* SLC_SLC0_TX_START_INT_ENA : R/W ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_START_INT_ENA (BIT(9)) +#define SLC_SLC0_TX_START_INT_ENA_M (BIT(9)) +#define SLC_SLC0_TX_START_INT_ENA_V 0x1 +#define SLC_SLC0_TX_START_INT_ENA_S 9 +/* SLC_SLC0_RX_START_INT_ENA : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_START_INT_ENA (BIT(8)) +#define SLC_SLC0_RX_START_INT_ENA_M (BIT(8)) +#define SLC_SLC0_RX_START_INT_ENA_V 0x1 +#define SLC_SLC0_RX_START_INT_ENA_S 8 +/* SLC_FRHOST_BIT7_INT_ENA : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT7_INT_ENA (BIT(7)) +#define SLC_FRHOST_BIT7_INT_ENA_M (BIT(7)) +#define SLC_FRHOST_BIT7_INT_ENA_V 0x1 +#define SLC_FRHOST_BIT7_INT_ENA_S 7 +/* SLC_FRHOST_BIT6_INT_ENA : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT6_INT_ENA (BIT(6)) +#define SLC_FRHOST_BIT6_INT_ENA_M (BIT(6)) +#define SLC_FRHOST_BIT6_INT_ENA_V 0x1 +#define SLC_FRHOST_BIT6_INT_ENA_S 6 +/* SLC_FRHOST_BIT5_INT_ENA : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT5_INT_ENA (BIT(5)) +#define SLC_FRHOST_BIT5_INT_ENA_M (BIT(5)) +#define SLC_FRHOST_BIT5_INT_ENA_V 0x1 +#define SLC_FRHOST_BIT5_INT_ENA_S 5 +/* SLC_FRHOST_BIT4_INT_ENA : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT4_INT_ENA (BIT(4)) +#define SLC_FRHOST_BIT4_INT_ENA_M (BIT(4)) +#define SLC_FRHOST_BIT4_INT_ENA_V 0x1 +#define SLC_FRHOST_BIT4_INT_ENA_S 4 +/* SLC_FRHOST_BIT3_INT_ENA : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT3_INT_ENA (BIT(3)) +#define SLC_FRHOST_BIT3_INT_ENA_M (BIT(3)) +#define SLC_FRHOST_BIT3_INT_ENA_V 0x1 +#define SLC_FRHOST_BIT3_INT_ENA_S 3 +/* SLC_FRHOST_BIT2_INT_ENA : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT2_INT_ENA (BIT(2)) +#define SLC_FRHOST_BIT2_INT_ENA_M (BIT(2)) +#define SLC_FRHOST_BIT2_INT_ENA_V 0x1 +#define SLC_FRHOST_BIT2_INT_ENA_S 2 +/* SLC_FRHOST_BIT1_INT_ENA : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT1_INT_ENA (BIT(1)) +#define SLC_FRHOST_BIT1_INT_ENA_M (BIT(1)) +#define SLC_FRHOST_BIT1_INT_ENA_V 0x1 +#define SLC_FRHOST_BIT1_INT_ENA_S 1 +/* SLC_FRHOST_BIT0_INT_ENA : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT0_INT_ENA (BIT(0)) +#define SLC_FRHOST_BIT0_INT_ENA_M (BIT(0)) +#define SLC_FRHOST_BIT0_INT_ENA_V 0x1 +#define SLC_FRHOST_BIT0_INT_ENA_S 0 + +#define SLC_0INT_CLR_REG (DR_REG_SLC_BASE + 0x10) +/* SLC_SLC0_RX_QUICK_EOF_INT_CLR : WO ;bitpos:[26] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_QUICK_EOF_INT_CLR (BIT(26)) +#define SLC_SLC0_RX_QUICK_EOF_INT_CLR_M (BIT(26)) +#define SLC_SLC0_RX_QUICK_EOF_INT_CLR_V 0x1 +#define SLC_SLC0_RX_QUICK_EOF_INT_CLR_S 26 +/* SLC_CMD_DTC_INT_CLR : WO ;bitpos:[25] ;default: 1'b0 ; */ +/*description: */ +#define SLC_CMD_DTC_INT_CLR (BIT(25)) +#define SLC_CMD_DTC_INT_CLR_M (BIT(25)) +#define SLC_CMD_DTC_INT_CLR_V 0x1 +#define SLC_CMD_DTC_INT_CLR_S 25 +/* SLC_SLC0_TX_ERR_EOF_INT_CLR : WO ;bitpos:[24] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_ERR_EOF_INT_CLR (BIT(24)) +#define SLC_SLC0_TX_ERR_EOF_INT_CLR_M (BIT(24)) +#define SLC_SLC0_TX_ERR_EOF_INT_CLR_V 0x1 +#define SLC_SLC0_TX_ERR_EOF_INT_CLR_S 24 +/* SLC_SLC0_WR_RETRY_DONE_INT_CLR : WO ;bitpos:[23] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_WR_RETRY_DONE_INT_CLR (BIT(23)) +#define SLC_SLC0_WR_RETRY_DONE_INT_CLR_M (BIT(23)) +#define SLC_SLC0_WR_RETRY_DONE_INT_CLR_V 0x1 +#define SLC_SLC0_WR_RETRY_DONE_INT_CLR_S 23 +/* SLC_SLC0_HOST_RD_ACK_INT_CLR : WO ;bitpos:[22] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_HOST_RD_ACK_INT_CLR (BIT(22)) +#define SLC_SLC0_HOST_RD_ACK_INT_CLR_M (BIT(22)) +#define SLC_SLC0_HOST_RD_ACK_INT_CLR_V 0x1 +#define SLC_SLC0_HOST_RD_ACK_INT_CLR_S 22 +/* SLC_SLC0_TX_DSCR_EMPTY_INT_CLR : WO ;bitpos:[21] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_DSCR_EMPTY_INT_CLR (BIT(21)) +#define SLC_SLC0_TX_DSCR_EMPTY_INT_CLR_M (BIT(21)) +#define SLC_SLC0_TX_DSCR_EMPTY_INT_CLR_V 0x1 +#define SLC_SLC0_TX_DSCR_EMPTY_INT_CLR_S 21 +/* SLC_SLC0_RX_DSCR_ERR_INT_CLR : WO ;bitpos:[20] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_DSCR_ERR_INT_CLR (BIT(20)) +#define SLC_SLC0_RX_DSCR_ERR_INT_CLR_M (BIT(20)) +#define SLC_SLC0_RX_DSCR_ERR_INT_CLR_V 0x1 +#define SLC_SLC0_RX_DSCR_ERR_INT_CLR_S 20 +/* SLC_SLC0_TX_DSCR_ERR_INT_CLR : WO ;bitpos:[19] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_DSCR_ERR_INT_CLR (BIT(19)) +#define SLC_SLC0_TX_DSCR_ERR_INT_CLR_M (BIT(19)) +#define SLC_SLC0_TX_DSCR_ERR_INT_CLR_V 0x1 +#define SLC_SLC0_TX_DSCR_ERR_INT_CLR_S 19 +/* SLC_SLC0_TOHOST_INT_CLR : WO ;bitpos:[18] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TOHOST_INT_CLR (BIT(18)) +#define SLC_SLC0_TOHOST_INT_CLR_M (BIT(18)) +#define SLC_SLC0_TOHOST_INT_CLR_V 0x1 +#define SLC_SLC0_TOHOST_INT_CLR_S 18 +/* SLC_SLC0_RX_EOF_INT_CLR : WO ;bitpos:[17] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_EOF_INT_CLR (BIT(17)) +#define SLC_SLC0_RX_EOF_INT_CLR_M (BIT(17)) +#define SLC_SLC0_RX_EOF_INT_CLR_V 0x1 +#define SLC_SLC0_RX_EOF_INT_CLR_S 17 +/* SLC_SLC0_RX_DONE_INT_CLR : WO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_DONE_INT_CLR (BIT(16)) +#define SLC_SLC0_RX_DONE_INT_CLR_M (BIT(16)) +#define SLC_SLC0_RX_DONE_INT_CLR_V 0x1 +#define SLC_SLC0_RX_DONE_INT_CLR_S 16 +/* SLC_SLC0_TX_SUC_EOF_INT_CLR : WO ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_SUC_EOF_INT_CLR (BIT(15)) +#define SLC_SLC0_TX_SUC_EOF_INT_CLR_M (BIT(15)) +#define SLC_SLC0_TX_SUC_EOF_INT_CLR_V 0x1 +#define SLC_SLC0_TX_SUC_EOF_INT_CLR_S 15 +/* SLC_SLC0_TX_DONE_INT_CLR : WO ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_DONE_INT_CLR (BIT(14)) +#define SLC_SLC0_TX_DONE_INT_CLR_M (BIT(14)) +#define SLC_SLC0_TX_DONE_INT_CLR_V 0x1 +#define SLC_SLC0_TX_DONE_INT_CLR_S 14 +/* SLC_SLC0_TOKEN1_1TO0_INT_CLR : WO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TOKEN1_1TO0_INT_CLR (BIT(13)) +#define SLC_SLC0_TOKEN1_1TO0_INT_CLR_M (BIT(13)) +#define SLC_SLC0_TOKEN1_1TO0_INT_CLR_V 0x1 +#define SLC_SLC0_TOKEN1_1TO0_INT_CLR_S 13 +/* SLC_SLC0_TOKEN0_1TO0_INT_CLR : WO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TOKEN0_1TO0_INT_CLR (BIT(12)) +#define SLC_SLC0_TOKEN0_1TO0_INT_CLR_M (BIT(12)) +#define SLC_SLC0_TOKEN0_1TO0_INT_CLR_V 0x1 +#define SLC_SLC0_TOKEN0_1TO0_INT_CLR_S 12 +/* SLC_SLC0_TX_OVF_INT_CLR : WO ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_OVF_INT_CLR (BIT(11)) +#define SLC_SLC0_TX_OVF_INT_CLR_M (BIT(11)) +#define SLC_SLC0_TX_OVF_INT_CLR_V 0x1 +#define SLC_SLC0_TX_OVF_INT_CLR_S 11 +/* SLC_SLC0_RX_UDF_INT_CLR : WO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_UDF_INT_CLR (BIT(10)) +#define SLC_SLC0_RX_UDF_INT_CLR_M (BIT(10)) +#define SLC_SLC0_RX_UDF_INT_CLR_V 0x1 +#define SLC_SLC0_RX_UDF_INT_CLR_S 10 +/* SLC_SLC0_TX_START_INT_CLR : WO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_START_INT_CLR (BIT(9)) +#define SLC_SLC0_TX_START_INT_CLR_M (BIT(9)) +#define SLC_SLC0_TX_START_INT_CLR_V 0x1 +#define SLC_SLC0_TX_START_INT_CLR_S 9 +/* SLC_SLC0_RX_START_INT_CLR : WO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_START_INT_CLR (BIT(8)) +#define SLC_SLC0_RX_START_INT_CLR_M (BIT(8)) +#define SLC_SLC0_RX_START_INT_CLR_V 0x1 +#define SLC_SLC0_RX_START_INT_CLR_S 8 +/* SLC_FRHOST_BIT7_INT_CLR : WO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT7_INT_CLR (BIT(7)) +#define SLC_FRHOST_BIT7_INT_CLR_M (BIT(7)) +#define SLC_FRHOST_BIT7_INT_CLR_V 0x1 +#define SLC_FRHOST_BIT7_INT_CLR_S 7 +/* SLC_FRHOST_BIT6_INT_CLR : WO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT6_INT_CLR (BIT(6)) +#define SLC_FRHOST_BIT6_INT_CLR_M (BIT(6)) +#define SLC_FRHOST_BIT6_INT_CLR_V 0x1 +#define SLC_FRHOST_BIT6_INT_CLR_S 6 +/* SLC_FRHOST_BIT5_INT_CLR : WO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT5_INT_CLR (BIT(5)) +#define SLC_FRHOST_BIT5_INT_CLR_M (BIT(5)) +#define SLC_FRHOST_BIT5_INT_CLR_V 0x1 +#define SLC_FRHOST_BIT5_INT_CLR_S 5 +/* SLC_FRHOST_BIT4_INT_CLR : WO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT4_INT_CLR (BIT(4)) +#define SLC_FRHOST_BIT4_INT_CLR_M (BIT(4)) +#define SLC_FRHOST_BIT4_INT_CLR_V 0x1 +#define SLC_FRHOST_BIT4_INT_CLR_S 4 +/* SLC_FRHOST_BIT3_INT_CLR : WO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT3_INT_CLR (BIT(3)) +#define SLC_FRHOST_BIT3_INT_CLR_M (BIT(3)) +#define SLC_FRHOST_BIT3_INT_CLR_V 0x1 +#define SLC_FRHOST_BIT3_INT_CLR_S 3 +/* SLC_FRHOST_BIT2_INT_CLR : WO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT2_INT_CLR (BIT(2)) +#define SLC_FRHOST_BIT2_INT_CLR_M (BIT(2)) +#define SLC_FRHOST_BIT2_INT_CLR_V 0x1 +#define SLC_FRHOST_BIT2_INT_CLR_S 2 +/* SLC_FRHOST_BIT1_INT_CLR : WO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT1_INT_CLR (BIT(1)) +#define SLC_FRHOST_BIT1_INT_CLR_M (BIT(1)) +#define SLC_FRHOST_BIT1_INT_CLR_V 0x1 +#define SLC_FRHOST_BIT1_INT_CLR_S 1 +/* SLC_FRHOST_BIT0_INT_CLR : WO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT0_INT_CLR (BIT(0)) +#define SLC_FRHOST_BIT0_INT_CLR_M (BIT(0)) +#define SLC_FRHOST_BIT0_INT_CLR_V 0x1 +#define SLC_FRHOST_BIT0_INT_CLR_S 0 + +#define SLC_1INT_RAW_REG (DR_REG_SLC_BASE + 0x14) +/* SLC_SLC1_TX_ERR_EOF_INT_RAW : RO ;bitpos:[24] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_ERR_EOF_INT_RAW (BIT(24)) +#define SLC_SLC1_TX_ERR_EOF_INT_RAW_M (BIT(24)) +#define SLC_SLC1_TX_ERR_EOF_INT_RAW_V 0x1 +#define SLC_SLC1_TX_ERR_EOF_INT_RAW_S 24 +/* SLC_SLC1_WR_RETRY_DONE_INT_RAW : RO ;bitpos:[23] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_WR_RETRY_DONE_INT_RAW (BIT(23)) +#define SLC_SLC1_WR_RETRY_DONE_INT_RAW_M (BIT(23)) +#define SLC_SLC1_WR_RETRY_DONE_INT_RAW_V 0x1 +#define SLC_SLC1_WR_RETRY_DONE_INT_RAW_S 23 +/* SLC_SLC1_HOST_RD_ACK_INT_RAW : RO ;bitpos:[22] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_HOST_RD_ACK_INT_RAW (BIT(22)) +#define SLC_SLC1_HOST_RD_ACK_INT_RAW_M (BIT(22)) +#define SLC_SLC1_HOST_RD_ACK_INT_RAW_V 0x1 +#define SLC_SLC1_HOST_RD_ACK_INT_RAW_S 22 +/* SLC_SLC1_TX_DSCR_EMPTY_INT_RAW : RO ;bitpos:[21] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_DSCR_EMPTY_INT_RAW (BIT(21)) +#define SLC_SLC1_TX_DSCR_EMPTY_INT_RAW_M (BIT(21)) +#define SLC_SLC1_TX_DSCR_EMPTY_INT_RAW_V 0x1 +#define SLC_SLC1_TX_DSCR_EMPTY_INT_RAW_S 21 +/* SLC_SLC1_RX_DSCR_ERR_INT_RAW : RO ;bitpos:[20] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_DSCR_ERR_INT_RAW (BIT(20)) +#define SLC_SLC1_RX_DSCR_ERR_INT_RAW_M (BIT(20)) +#define SLC_SLC1_RX_DSCR_ERR_INT_RAW_V 0x1 +#define SLC_SLC1_RX_DSCR_ERR_INT_RAW_S 20 +/* SLC_SLC1_TX_DSCR_ERR_INT_RAW : RO ;bitpos:[19] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_DSCR_ERR_INT_RAW (BIT(19)) +#define SLC_SLC1_TX_DSCR_ERR_INT_RAW_M (BIT(19)) +#define SLC_SLC1_TX_DSCR_ERR_INT_RAW_V 0x1 +#define SLC_SLC1_TX_DSCR_ERR_INT_RAW_S 19 +/* SLC_SLC1_TOHOST_INT_RAW : RO ;bitpos:[18] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TOHOST_INT_RAW (BIT(18)) +#define SLC_SLC1_TOHOST_INT_RAW_M (BIT(18)) +#define SLC_SLC1_TOHOST_INT_RAW_V 0x1 +#define SLC_SLC1_TOHOST_INT_RAW_S 18 +/* SLC_SLC1_RX_EOF_INT_RAW : RO ;bitpos:[17] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_EOF_INT_RAW (BIT(17)) +#define SLC_SLC1_RX_EOF_INT_RAW_M (BIT(17)) +#define SLC_SLC1_RX_EOF_INT_RAW_V 0x1 +#define SLC_SLC1_RX_EOF_INT_RAW_S 17 +/* SLC_SLC1_RX_DONE_INT_RAW : RO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_DONE_INT_RAW (BIT(16)) +#define SLC_SLC1_RX_DONE_INT_RAW_M (BIT(16)) +#define SLC_SLC1_RX_DONE_INT_RAW_V 0x1 +#define SLC_SLC1_RX_DONE_INT_RAW_S 16 +/* SLC_SLC1_TX_SUC_EOF_INT_RAW : RO ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_SUC_EOF_INT_RAW (BIT(15)) +#define SLC_SLC1_TX_SUC_EOF_INT_RAW_M (BIT(15)) +#define SLC_SLC1_TX_SUC_EOF_INT_RAW_V 0x1 +#define SLC_SLC1_TX_SUC_EOF_INT_RAW_S 15 +/* SLC_SLC1_TX_DONE_INT_RAW : RO ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_DONE_INT_RAW (BIT(14)) +#define SLC_SLC1_TX_DONE_INT_RAW_M (BIT(14)) +#define SLC_SLC1_TX_DONE_INT_RAW_V 0x1 +#define SLC_SLC1_TX_DONE_INT_RAW_S 14 +/* SLC_SLC1_TOKEN1_1TO0_INT_RAW : RO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TOKEN1_1TO0_INT_RAW (BIT(13)) +#define SLC_SLC1_TOKEN1_1TO0_INT_RAW_M (BIT(13)) +#define SLC_SLC1_TOKEN1_1TO0_INT_RAW_V 0x1 +#define SLC_SLC1_TOKEN1_1TO0_INT_RAW_S 13 +/* SLC_SLC1_TOKEN0_1TO0_INT_RAW : RO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TOKEN0_1TO0_INT_RAW (BIT(12)) +#define SLC_SLC1_TOKEN0_1TO0_INT_RAW_M (BIT(12)) +#define SLC_SLC1_TOKEN0_1TO0_INT_RAW_V 0x1 +#define SLC_SLC1_TOKEN0_1TO0_INT_RAW_S 12 +/* SLC_SLC1_TX_OVF_INT_RAW : RO ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_OVF_INT_RAW (BIT(11)) +#define SLC_SLC1_TX_OVF_INT_RAW_M (BIT(11)) +#define SLC_SLC1_TX_OVF_INT_RAW_V 0x1 +#define SLC_SLC1_TX_OVF_INT_RAW_S 11 +/* SLC_SLC1_RX_UDF_INT_RAW : RO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_UDF_INT_RAW (BIT(10)) +#define SLC_SLC1_RX_UDF_INT_RAW_M (BIT(10)) +#define SLC_SLC1_RX_UDF_INT_RAW_V 0x1 +#define SLC_SLC1_RX_UDF_INT_RAW_S 10 +/* SLC_SLC1_TX_START_INT_RAW : RO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_START_INT_RAW (BIT(9)) +#define SLC_SLC1_TX_START_INT_RAW_M (BIT(9)) +#define SLC_SLC1_TX_START_INT_RAW_V 0x1 +#define SLC_SLC1_TX_START_INT_RAW_S 9 +/* SLC_SLC1_RX_START_INT_RAW : RO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_START_INT_RAW (BIT(8)) +#define SLC_SLC1_RX_START_INT_RAW_M (BIT(8)) +#define SLC_SLC1_RX_START_INT_RAW_V 0x1 +#define SLC_SLC1_RX_START_INT_RAW_S 8 +/* SLC_FRHOST_BIT15_INT_RAW : RO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT15_INT_RAW (BIT(7)) +#define SLC_FRHOST_BIT15_INT_RAW_M (BIT(7)) +#define SLC_FRHOST_BIT15_INT_RAW_V 0x1 +#define SLC_FRHOST_BIT15_INT_RAW_S 7 +/* SLC_FRHOST_BIT14_INT_RAW : RO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT14_INT_RAW (BIT(6)) +#define SLC_FRHOST_BIT14_INT_RAW_M (BIT(6)) +#define SLC_FRHOST_BIT14_INT_RAW_V 0x1 +#define SLC_FRHOST_BIT14_INT_RAW_S 6 +/* SLC_FRHOST_BIT13_INT_RAW : RO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT13_INT_RAW (BIT(5)) +#define SLC_FRHOST_BIT13_INT_RAW_M (BIT(5)) +#define SLC_FRHOST_BIT13_INT_RAW_V 0x1 +#define SLC_FRHOST_BIT13_INT_RAW_S 5 +/* SLC_FRHOST_BIT12_INT_RAW : RO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT12_INT_RAW (BIT(4)) +#define SLC_FRHOST_BIT12_INT_RAW_M (BIT(4)) +#define SLC_FRHOST_BIT12_INT_RAW_V 0x1 +#define SLC_FRHOST_BIT12_INT_RAW_S 4 +/* SLC_FRHOST_BIT11_INT_RAW : RO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT11_INT_RAW (BIT(3)) +#define SLC_FRHOST_BIT11_INT_RAW_M (BIT(3)) +#define SLC_FRHOST_BIT11_INT_RAW_V 0x1 +#define SLC_FRHOST_BIT11_INT_RAW_S 3 +/* SLC_FRHOST_BIT10_INT_RAW : RO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT10_INT_RAW (BIT(2)) +#define SLC_FRHOST_BIT10_INT_RAW_M (BIT(2)) +#define SLC_FRHOST_BIT10_INT_RAW_V 0x1 +#define SLC_FRHOST_BIT10_INT_RAW_S 2 +/* SLC_FRHOST_BIT9_INT_RAW : RO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT9_INT_RAW (BIT(1)) +#define SLC_FRHOST_BIT9_INT_RAW_M (BIT(1)) +#define SLC_FRHOST_BIT9_INT_RAW_V 0x1 +#define SLC_FRHOST_BIT9_INT_RAW_S 1 +/* SLC_FRHOST_BIT8_INT_RAW : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT8_INT_RAW (BIT(0)) +#define SLC_FRHOST_BIT8_INT_RAW_M (BIT(0)) +#define SLC_FRHOST_BIT8_INT_RAW_V 0x1 +#define SLC_FRHOST_BIT8_INT_RAW_S 0 + +#define SLC_1INT_ST_REG (DR_REG_SLC_BASE + 0x18) +/* SLC_SLC1_TX_ERR_EOF_INT_ST : RO ;bitpos:[24] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_ERR_EOF_INT_ST (BIT(24)) +#define SLC_SLC1_TX_ERR_EOF_INT_ST_M (BIT(24)) +#define SLC_SLC1_TX_ERR_EOF_INT_ST_V 0x1 +#define SLC_SLC1_TX_ERR_EOF_INT_ST_S 24 +/* SLC_SLC1_WR_RETRY_DONE_INT_ST : RO ;bitpos:[23] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_WR_RETRY_DONE_INT_ST (BIT(23)) +#define SLC_SLC1_WR_RETRY_DONE_INT_ST_M (BIT(23)) +#define SLC_SLC1_WR_RETRY_DONE_INT_ST_V 0x1 +#define SLC_SLC1_WR_RETRY_DONE_INT_ST_S 23 +/* SLC_SLC1_HOST_RD_ACK_INT_ST : RO ;bitpos:[22] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_HOST_RD_ACK_INT_ST (BIT(22)) +#define SLC_SLC1_HOST_RD_ACK_INT_ST_M (BIT(22)) +#define SLC_SLC1_HOST_RD_ACK_INT_ST_V 0x1 +#define SLC_SLC1_HOST_RD_ACK_INT_ST_S 22 +/* SLC_SLC1_TX_DSCR_EMPTY_INT_ST : RO ;bitpos:[21] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_DSCR_EMPTY_INT_ST (BIT(21)) +#define SLC_SLC1_TX_DSCR_EMPTY_INT_ST_M (BIT(21)) +#define SLC_SLC1_TX_DSCR_EMPTY_INT_ST_V 0x1 +#define SLC_SLC1_TX_DSCR_EMPTY_INT_ST_S 21 +/* SLC_SLC1_RX_DSCR_ERR_INT_ST : RO ;bitpos:[20] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_DSCR_ERR_INT_ST (BIT(20)) +#define SLC_SLC1_RX_DSCR_ERR_INT_ST_M (BIT(20)) +#define SLC_SLC1_RX_DSCR_ERR_INT_ST_V 0x1 +#define SLC_SLC1_RX_DSCR_ERR_INT_ST_S 20 +/* SLC_SLC1_TX_DSCR_ERR_INT_ST : RO ;bitpos:[19] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_DSCR_ERR_INT_ST (BIT(19)) +#define SLC_SLC1_TX_DSCR_ERR_INT_ST_M (BIT(19)) +#define SLC_SLC1_TX_DSCR_ERR_INT_ST_V 0x1 +#define SLC_SLC1_TX_DSCR_ERR_INT_ST_S 19 +/* SLC_SLC1_TOHOST_INT_ST : RO ;bitpos:[18] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TOHOST_INT_ST (BIT(18)) +#define SLC_SLC1_TOHOST_INT_ST_M (BIT(18)) +#define SLC_SLC1_TOHOST_INT_ST_V 0x1 +#define SLC_SLC1_TOHOST_INT_ST_S 18 +/* SLC_SLC1_RX_EOF_INT_ST : RO ;bitpos:[17] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_EOF_INT_ST (BIT(17)) +#define SLC_SLC1_RX_EOF_INT_ST_M (BIT(17)) +#define SLC_SLC1_RX_EOF_INT_ST_V 0x1 +#define SLC_SLC1_RX_EOF_INT_ST_S 17 +/* SLC_SLC1_RX_DONE_INT_ST : RO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_DONE_INT_ST (BIT(16)) +#define SLC_SLC1_RX_DONE_INT_ST_M (BIT(16)) +#define SLC_SLC1_RX_DONE_INT_ST_V 0x1 +#define SLC_SLC1_RX_DONE_INT_ST_S 16 +/* SLC_SLC1_TX_SUC_EOF_INT_ST : RO ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_SUC_EOF_INT_ST (BIT(15)) +#define SLC_SLC1_TX_SUC_EOF_INT_ST_M (BIT(15)) +#define SLC_SLC1_TX_SUC_EOF_INT_ST_V 0x1 +#define SLC_SLC1_TX_SUC_EOF_INT_ST_S 15 +/* SLC_SLC1_TX_DONE_INT_ST : RO ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_DONE_INT_ST (BIT(14)) +#define SLC_SLC1_TX_DONE_INT_ST_M (BIT(14)) +#define SLC_SLC1_TX_DONE_INT_ST_V 0x1 +#define SLC_SLC1_TX_DONE_INT_ST_S 14 +/* SLC_SLC1_TOKEN1_1TO0_INT_ST : RO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TOKEN1_1TO0_INT_ST (BIT(13)) +#define SLC_SLC1_TOKEN1_1TO0_INT_ST_M (BIT(13)) +#define SLC_SLC1_TOKEN1_1TO0_INT_ST_V 0x1 +#define SLC_SLC1_TOKEN1_1TO0_INT_ST_S 13 +/* SLC_SLC1_TOKEN0_1TO0_INT_ST : RO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TOKEN0_1TO0_INT_ST (BIT(12)) +#define SLC_SLC1_TOKEN0_1TO0_INT_ST_M (BIT(12)) +#define SLC_SLC1_TOKEN0_1TO0_INT_ST_V 0x1 +#define SLC_SLC1_TOKEN0_1TO0_INT_ST_S 12 +/* SLC_SLC1_TX_OVF_INT_ST : RO ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_OVF_INT_ST (BIT(11)) +#define SLC_SLC1_TX_OVF_INT_ST_M (BIT(11)) +#define SLC_SLC1_TX_OVF_INT_ST_V 0x1 +#define SLC_SLC1_TX_OVF_INT_ST_S 11 +/* SLC_SLC1_RX_UDF_INT_ST : RO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_UDF_INT_ST (BIT(10)) +#define SLC_SLC1_RX_UDF_INT_ST_M (BIT(10)) +#define SLC_SLC1_RX_UDF_INT_ST_V 0x1 +#define SLC_SLC1_RX_UDF_INT_ST_S 10 +/* SLC_SLC1_TX_START_INT_ST : RO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_START_INT_ST (BIT(9)) +#define SLC_SLC1_TX_START_INT_ST_M (BIT(9)) +#define SLC_SLC1_TX_START_INT_ST_V 0x1 +#define SLC_SLC1_TX_START_INT_ST_S 9 +/* SLC_SLC1_RX_START_INT_ST : RO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_START_INT_ST (BIT(8)) +#define SLC_SLC1_RX_START_INT_ST_M (BIT(8)) +#define SLC_SLC1_RX_START_INT_ST_V 0x1 +#define SLC_SLC1_RX_START_INT_ST_S 8 +/* SLC_FRHOST_BIT15_INT_ST : RO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT15_INT_ST (BIT(7)) +#define SLC_FRHOST_BIT15_INT_ST_M (BIT(7)) +#define SLC_FRHOST_BIT15_INT_ST_V 0x1 +#define SLC_FRHOST_BIT15_INT_ST_S 7 +/* SLC_FRHOST_BIT14_INT_ST : RO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT14_INT_ST (BIT(6)) +#define SLC_FRHOST_BIT14_INT_ST_M (BIT(6)) +#define SLC_FRHOST_BIT14_INT_ST_V 0x1 +#define SLC_FRHOST_BIT14_INT_ST_S 6 +/* SLC_FRHOST_BIT13_INT_ST : RO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT13_INT_ST (BIT(5)) +#define SLC_FRHOST_BIT13_INT_ST_M (BIT(5)) +#define SLC_FRHOST_BIT13_INT_ST_V 0x1 +#define SLC_FRHOST_BIT13_INT_ST_S 5 +/* SLC_FRHOST_BIT12_INT_ST : RO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT12_INT_ST (BIT(4)) +#define SLC_FRHOST_BIT12_INT_ST_M (BIT(4)) +#define SLC_FRHOST_BIT12_INT_ST_V 0x1 +#define SLC_FRHOST_BIT12_INT_ST_S 4 +/* SLC_FRHOST_BIT11_INT_ST : RO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT11_INT_ST (BIT(3)) +#define SLC_FRHOST_BIT11_INT_ST_M (BIT(3)) +#define SLC_FRHOST_BIT11_INT_ST_V 0x1 +#define SLC_FRHOST_BIT11_INT_ST_S 3 +/* SLC_FRHOST_BIT10_INT_ST : RO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT10_INT_ST (BIT(2)) +#define SLC_FRHOST_BIT10_INT_ST_M (BIT(2)) +#define SLC_FRHOST_BIT10_INT_ST_V 0x1 +#define SLC_FRHOST_BIT10_INT_ST_S 2 +/* SLC_FRHOST_BIT9_INT_ST : RO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT9_INT_ST (BIT(1)) +#define SLC_FRHOST_BIT9_INT_ST_M (BIT(1)) +#define SLC_FRHOST_BIT9_INT_ST_V 0x1 +#define SLC_FRHOST_BIT9_INT_ST_S 1 +/* SLC_FRHOST_BIT8_INT_ST : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT8_INT_ST (BIT(0)) +#define SLC_FRHOST_BIT8_INT_ST_M (BIT(0)) +#define SLC_FRHOST_BIT8_INT_ST_V 0x1 +#define SLC_FRHOST_BIT8_INT_ST_S 0 + +#define SLC_1INT_ENA_REG (DR_REG_SLC_BASE + 0x1C) +/* SLC_SLC1_TX_ERR_EOF_INT_ENA : R/W ;bitpos:[24] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_ERR_EOF_INT_ENA (BIT(24)) +#define SLC_SLC1_TX_ERR_EOF_INT_ENA_M (BIT(24)) +#define SLC_SLC1_TX_ERR_EOF_INT_ENA_V 0x1 +#define SLC_SLC1_TX_ERR_EOF_INT_ENA_S 24 +/* SLC_SLC1_WR_RETRY_DONE_INT_ENA : R/W ;bitpos:[23] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_WR_RETRY_DONE_INT_ENA (BIT(23)) +#define SLC_SLC1_WR_RETRY_DONE_INT_ENA_M (BIT(23)) +#define SLC_SLC1_WR_RETRY_DONE_INT_ENA_V 0x1 +#define SLC_SLC1_WR_RETRY_DONE_INT_ENA_S 23 +/* SLC_SLC1_HOST_RD_ACK_INT_ENA : R/W ;bitpos:[22] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_HOST_RD_ACK_INT_ENA (BIT(22)) +#define SLC_SLC1_HOST_RD_ACK_INT_ENA_M (BIT(22)) +#define SLC_SLC1_HOST_RD_ACK_INT_ENA_V 0x1 +#define SLC_SLC1_HOST_RD_ACK_INT_ENA_S 22 +/* SLC_SLC1_TX_DSCR_EMPTY_INT_ENA : R/W ;bitpos:[21] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_DSCR_EMPTY_INT_ENA (BIT(21)) +#define SLC_SLC1_TX_DSCR_EMPTY_INT_ENA_M (BIT(21)) +#define SLC_SLC1_TX_DSCR_EMPTY_INT_ENA_V 0x1 +#define SLC_SLC1_TX_DSCR_EMPTY_INT_ENA_S 21 +/* SLC_SLC1_RX_DSCR_ERR_INT_ENA : R/W ;bitpos:[20] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_DSCR_ERR_INT_ENA (BIT(20)) +#define SLC_SLC1_RX_DSCR_ERR_INT_ENA_M (BIT(20)) +#define SLC_SLC1_RX_DSCR_ERR_INT_ENA_V 0x1 +#define SLC_SLC1_RX_DSCR_ERR_INT_ENA_S 20 +/* SLC_SLC1_TX_DSCR_ERR_INT_ENA : R/W ;bitpos:[19] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_DSCR_ERR_INT_ENA (BIT(19)) +#define SLC_SLC1_TX_DSCR_ERR_INT_ENA_M (BIT(19)) +#define SLC_SLC1_TX_DSCR_ERR_INT_ENA_V 0x1 +#define SLC_SLC1_TX_DSCR_ERR_INT_ENA_S 19 +/* SLC_SLC1_TOHOST_INT_ENA : R/W ;bitpos:[18] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TOHOST_INT_ENA (BIT(18)) +#define SLC_SLC1_TOHOST_INT_ENA_M (BIT(18)) +#define SLC_SLC1_TOHOST_INT_ENA_V 0x1 +#define SLC_SLC1_TOHOST_INT_ENA_S 18 +/* SLC_SLC1_RX_EOF_INT_ENA : R/W ;bitpos:[17] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_EOF_INT_ENA (BIT(17)) +#define SLC_SLC1_RX_EOF_INT_ENA_M (BIT(17)) +#define SLC_SLC1_RX_EOF_INT_ENA_V 0x1 +#define SLC_SLC1_RX_EOF_INT_ENA_S 17 +/* SLC_SLC1_RX_DONE_INT_ENA : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_DONE_INT_ENA (BIT(16)) +#define SLC_SLC1_RX_DONE_INT_ENA_M (BIT(16)) +#define SLC_SLC1_RX_DONE_INT_ENA_V 0x1 +#define SLC_SLC1_RX_DONE_INT_ENA_S 16 +/* SLC_SLC1_TX_SUC_EOF_INT_ENA : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_SUC_EOF_INT_ENA (BIT(15)) +#define SLC_SLC1_TX_SUC_EOF_INT_ENA_M (BIT(15)) +#define SLC_SLC1_TX_SUC_EOF_INT_ENA_V 0x1 +#define SLC_SLC1_TX_SUC_EOF_INT_ENA_S 15 +/* SLC_SLC1_TX_DONE_INT_ENA : R/W ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_DONE_INT_ENA (BIT(14)) +#define SLC_SLC1_TX_DONE_INT_ENA_M (BIT(14)) +#define SLC_SLC1_TX_DONE_INT_ENA_V 0x1 +#define SLC_SLC1_TX_DONE_INT_ENA_S 14 +/* SLC_SLC1_TOKEN1_1TO0_INT_ENA : R/W ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TOKEN1_1TO0_INT_ENA (BIT(13)) +#define SLC_SLC1_TOKEN1_1TO0_INT_ENA_M (BIT(13)) +#define SLC_SLC1_TOKEN1_1TO0_INT_ENA_V 0x1 +#define SLC_SLC1_TOKEN1_1TO0_INT_ENA_S 13 +/* SLC_SLC1_TOKEN0_1TO0_INT_ENA : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TOKEN0_1TO0_INT_ENA (BIT(12)) +#define SLC_SLC1_TOKEN0_1TO0_INT_ENA_M (BIT(12)) +#define SLC_SLC1_TOKEN0_1TO0_INT_ENA_V 0x1 +#define SLC_SLC1_TOKEN0_1TO0_INT_ENA_S 12 +/* SLC_SLC1_TX_OVF_INT_ENA : R/W ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_OVF_INT_ENA (BIT(11)) +#define SLC_SLC1_TX_OVF_INT_ENA_M (BIT(11)) +#define SLC_SLC1_TX_OVF_INT_ENA_V 0x1 +#define SLC_SLC1_TX_OVF_INT_ENA_S 11 +/* SLC_SLC1_RX_UDF_INT_ENA : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_UDF_INT_ENA (BIT(10)) +#define SLC_SLC1_RX_UDF_INT_ENA_M (BIT(10)) +#define SLC_SLC1_RX_UDF_INT_ENA_V 0x1 +#define SLC_SLC1_RX_UDF_INT_ENA_S 10 +/* SLC_SLC1_TX_START_INT_ENA : R/W ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_START_INT_ENA (BIT(9)) +#define SLC_SLC1_TX_START_INT_ENA_M (BIT(9)) +#define SLC_SLC1_TX_START_INT_ENA_V 0x1 +#define SLC_SLC1_TX_START_INT_ENA_S 9 +/* SLC_SLC1_RX_START_INT_ENA : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_START_INT_ENA (BIT(8)) +#define SLC_SLC1_RX_START_INT_ENA_M (BIT(8)) +#define SLC_SLC1_RX_START_INT_ENA_V 0x1 +#define SLC_SLC1_RX_START_INT_ENA_S 8 +/* SLC_FRHOST_BIT15_INT_ENA : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT15_INT_ENA (BIT(7)) +#define SLC_FRHOST_BIT15_INT_ENA_M (BIT(7)) +#define SLC_FRHOST_BIT15_INT_ENA_V 0x1 +#define SLC_FRHOST_BIT15_INT_ENA_S 7 +/* SLC_FRHOST_BIT14_INT_ENA : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT14_INT_ENA (BIT(6)) +#define SLC_FRHOST_BIT14_INT_ENA_M (BIT(6)) +#define SLC_FRHOST_BIT14_INT_ENA_V 0x1 +#define SLC_FRHOST_BIT14_INT_ENA_S 6 +/* SLC_FRHOST_BIT13_INT_ENA : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT13_INT_ENA (BIT(5)) +#define SLC_FRHOST_BIT13_INT_ENA_M (BIT(5)) +#define SLC_FRHOST_BIT13_INT_ENA_V 0x1 +#define SLC_FRHOST_BIT13_INT_ENA_S 5 +/* SLC_FRHOST_BIT12_INT_ENA : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT12_INT_ENA (BIT(4)) +#define SLC_FRHOST_BIT12_INT_ENA_M (BIT(4)) +#define SLC_FRHOST_BIT12_INT_ENA_V 0x1 +#define SLC_FRHOST_BIT12_INT_ENA_S 4 +/* SLC_FRHOST_BIT11_INT_ENA : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT11_INT_ENA (BIT(3)) +#define SLC_FRHOST_BIT11_INT_ENA_M (BIT(3)) +#define SLC_FRHOST_BIT11_INT_ENA_V 0x1 +#define SLC_FRHOST_BIT11_INT_ENA_S 3 +/* SLC_FRHOST_BIT10_INT_ENA : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT10_INT_ENA (BIT(2)) +#define SLC_FRHOST_BIT10_INT_ENA_M (BIT(2)) +#define SLC_FRHOST_BIT10_INT_ENA_V 0x1 +#define SLC_FRHOST_BIT10_INT_ENA_S 2 +/* SLC_FRHOST_BIT9_INT_ENA : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT9_INT_ENA (BIT(1)) +#define SLC_FRHOST_BIT9_INT_ENA_M (BIT(1)) +#define SLC_FRHOST_BIT9_INT_ENA_V 0x1 +#define SLC_FRHOST_BIT9_INT_ENA_S 1 +/* SLC_FRHOST_BIT8_INT_ENA : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT8_INT_ENA (BIT(0)) +#define SLC_FRHOST_BIT8_INT_ENA_M (BIT(0)) +#define SLC_FRHOST_BIT8_INT_ENA_V 0x1 +#define SLC_FRHOST_BIT8_INT_ENA_S 0 + +#define SLC_1INT_CLR_REG (DR_REG_SLC_BASE + 0x20) +/* SLC_SLC1_TX_ERR_EOF_INT_CLR : WO ;bitpos:[24] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_ERR_EOF_INT_CLR (BIT(24)) +#define SLC_SLC1_TX_ERR_EOF_INT_CLR_M (BIT(24)) +#define SLC_SLC1_TX_ERR_EOF_INT_CLR_V 0x1 +#define SLC_SLC1_TX_ERR_EOF_INT_CLR_S 24 +/* SLC_SLC1_WR_RETRY_DONE_INT_CLR : WO ;bitpos:[23] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_WR_RETRY_DONE_INT_CLR (BIT(23)) +#define SLC_SLC1_WR_RETRY_DONE_INT_CLR_M (BIT(23)) +#define SLC_SLC1_WR_RETRY_DONE_INT_CLR_V 0x1 +#define SLC_SLC1_WR_RETRY_DONE_INT_CLR_S 23 +/* SLC_SLC1_HOST_RD_ACK_INT_CLR : WO ;bitpos:[22] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_HOST_RD_ACK_INT_CLR (BIT(22)) +#define SLC_SLC1_HOST_RD_ACK_INT_CLR_M (BIT(22)) +#define SLC_SLC1_HOST_RD_ACK_INT_CLR_V 0x1 +#define SLC_SLC1_HOST_RD_ACK_INT_CLR_S 22 +/* SLC_SLC1_TX_DSCR_EMPTY_INT_CLR : WO ;bitpos:[21] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_DSCR_EMPTY_INT_CLR (BIT(21)) +#define SLC_SLC1_TX_DSCR_EMPTY_INT_CLR_M (BIT(21)) +#define SLC_SLC1_TX_DSCR_EMPTY_INT_CLR_V 0x1 +#define SLC_SLC1_TX_DSCR_EMPTY_INT_CLR_S 21 +/* SLC_SLC1_RX_DSCR_ERR_INT_CLR : WO ;bitpos:[20] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_DSCR_ERR_INT_CLR (BIT(20)) +#define SLC_SLC1_RX_DSCR_ERR_INT_CLR_M (BIT(20)) +#define SLC_SLC1_RX_DSCR_ERR_INT_CLR_V 0x1 +#define SLC_SLC1_RX_DSCR_ERR_INT_CLR_S 20 +/* SLC_SLC1_TX_DSCR_ERR_INT_CLR : WO ;bitpos:[19] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_DSCR_ERR_INT_CLR (BIT(19)) +#define SLC_SLC1_TX_DSCR_ERR_INT_CLR_M (BIT(19)) +#define SLC_SLC1_TX_DSCR_ERR_INT_CLR_V 0x1 +#define SLC_SLC1_TX_DSCR_ERR_INT_CLR_S 19 +/* SLC_SLC1_TOHOST_INT_CLR : WO ;bitpos:[18] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TOHOST_INT_CLR (BIT(18)) +#define SLC_SLC1_TOHOST_INT_CLR_M (BIT(18)) +#define SLC_SLC1_TOHOST_INT_CLR_V 0x1 +#define SLC_SLC1_TOHOST_INT_CLR_S 18 +/* SLC_SLC1_RX_EOF_INT_CLR : WO ;bitpos:[17] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_EOF_INT_CLR (BIT(17)) +#define SLC_SLC1_RX_EOF_INT_CLR_M (BIT(17)) +#define SLC_SLC1_RX_EOF_INT_CLR_V 0x1 +#define SLC_SLC1_RX_EOF_INT_CLR_S 17 +/* SLC_SLC1_RX_DONE_INT_CLR : WO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_DONE_INT_CLR (BIT(16)) +#define SLC_SLC1_RX_DONE_INT_CLR_M (BIT(16)) +#define SLC_SLC1_RX_DONE_INT_CLR_V 0x1 +#define SLC_SLC1_RX_DONE_INT_CLR_S 16 +/* SLC_SLC1_TX_SUC_EOF_INT_CLR : WO ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_SUC_EOF_INT_CLR (BIT(15)) +#define SLC_SLC1_TX_SUC_EOF_INT_CLR_M (BIT(15)) +#define SLC_SLC1_TX_SUC_EOF_INT_CLR_V 0x1 +#define SLC_SLC1_TX_SUC_EOF_INT_CLR_S 15 +/* SLC_SLC1_TX_DONE_INT_CLR : WO ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_DONE_INT_CLR (BIT(14)) +#define SLC_SLC1_TX_DONE_INT_CLR_M (BIT(14)) +#define SLC_SLC1_TX_DONE_INT_CLR_V 0x1 +#define SLC_SLC1_TX_DONE_INT_CLR_S 14 +/* SLC_SLC1_TOKEN1_1TO0_INT_CLR : WO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TOKEN1_1TO0_INT_CLR (BIT(13)) +#define SLC_SLC1_TOKEN1_1TO0_INT_CLR_M (BIT(13)) +#define SLC_SLC1_TOKEN1_1TO0_INT_CLR_V 0x1 +#define SLC_SLC1_TOKEN1_1TO0_INT_CLR_S 13 +/* SLC_SLC1_TOKEN0_1TO0_INT_CLR : WO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TOKEN0_1TO0_INT_CLR (BIT(12)) +#define SLC_SLC1_TOKEN0_1TO0_INT_CLR_M (BIT(12)) +#define SLC_SLC1_TOKEN0_1TO0_INT_CLR_V 0x1 +#define SLC_SLC1_TOKEN0_1TO0_INT_CLR_S 12 +/* SLC_SLC1_TX_OVF_INT_CLR : WO ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_OVF_INT_CLR (BIT(11)) +#define SLC_SLC1_TX_OVF_INT_CLR_M (BIT(11)) +#define SLC_SLC1_TX_OVF_INT_CLR_V 0x1 +#define SLC_SLC1_TX_OVF_INT_CLR_S 11 +/* SLC_SLC1_RX_UDF_INT_CLR : WO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_UDF_INT_CLR (BIT(10)) +#define SLC_SLC1_RX_UDF_INT_CLR_M (BIT(10)) +#define SLC_SLC1_RX_UDF_INT_CLR_V 0x1 +#define SLC_SLC1_RX_UDF_INT_CLR_S 10 +/* SLC_SLC1_TX_START_INT_CLR : WO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_START_INT_CLR (BIT(9)) +#define SLC_SLC1_TX_START_INT_CLR_M (BIT(9)) +#define SLC_SLC1_TX_START_INT_CLR_V 0x1 +#define SLC_SLC1_TX_START_INT_CLR_S 9 +/* SLC_SLC1_RX_START_INT_CLR : WO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_START_INT_CLR (BIT(8)) +#define SLC_SLC1_RX_START_INT_CLR_M (BIT(8)) +#define SLC_SLC1_RX_START_INT_CLR_V 0x1 +#define SLC_SLC1_RX_START_INT_CLR_S 8 +/* SLC_FRHOST_BIT15_INT_CLR : WO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT15_INT_CLR (BIT(7)) +#define SLC_FRHOST_BIT15_INT_CLR_M (BIT(7)) +#define SLC_FRHOST_BIT15_INT_CLR_V 0x1 +#define SLC_FRHOST_BIT15_INT_CLR_S 7 +/* SLC_FRHOST_BIT14_INT_CLR : WO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT14_INT_CLR (BIT(6)) +#define SLC_FRHOST_BIT14_INT_CLR_M (BIT(6)) +#define SLC_FRHOST_BIT14_INT_CLR_V 0x1 +#define SLC_FRHOST_BIT14_INT_CLR_S 6 +/* SLC_FRHOST_BIT13_INT_CLR : WO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT13_INT_CLR (BIT(5)) +#define SLC_FRHOST_BIT13_INT_CLR_M (BIT(5)) +#define SLC_FRHOST_BIT13_INT_CLR_V 0x1 +#define SLC_FRHOST_BIT13_INT_CLR_S 5 +/* SLC_FRHOST_BIT12_INT_CLR : WO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT12_INT_CLR (BIT(4)) +#define SLC_FRHOST_BIT12_INT_CLR_M (BIT(4)) +#define SLC_FRHOST_BIT12_INT_CLR_V 0x1 +#define SLC_FRHOST_BIT12_INT_CLR_S 4 +/* SLC_FRHOST_BIT11_INT_CLR : WO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT11_INT_CLR (BIT(3)) +#define SLC_FRHOST_BIT11_INT_CLR_M (BIT(3)) +#define SLC_FRHOST_BIT11_INT_CLR_V 0x1 +#define SLC_FRHOST_BIT11_INT_CLR_S 3 +/* SLC_FRHOST_BIT10_INT_CLR : WO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT10_INT_CLR (BIT(2)) +#define SLC_FRHOST_BIT10_INT_CLR_M (BIT(2)) +#define SLC_FRHOST_BIT10_INT_CLR_V 0x1 +#define SLC_FRHOST_BIT10_INT_CLR_S 2 +/* SLC_FRHOST_BIT9_INT_CLR : WO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT9_INT_CLR (BIT(1)) +#define SLC_FRHOST_BIT9_INT_CLR_M (BIT(1)) +#define SLC_FRHOST_BIT9_INT_CLR_V 0x1 +#define SLC_FRHOST_BIT9_INT_CLR_S 1 +/* SLC_FRHOST_BIT8_INT_CLR : WO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT8_INT_CLR (BIT(0)) +#define SLC_FRHOST_BIT8_INT_CLR_M (BIT(0)) +#define SLC_FRHOST_BIT8_INT_CLR_V 0x1 +#define SLC_FRHOST_BIT8_INT_CLR_S 0 + +#define SLC_RX_STATUS_REG (DR_REG_SLC_BASE + 0x24) +/* SLC_SLC1_RX_EMPTY : RO ;bitpos:[17] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC1_RX_EMPTY (BIT(17)) +#define SLC_SLC1_RX_EMPTY_M (BIT(17)) +#define SLC_SLC1_RX_EMPTY_V 0x1 +#define SLC_SLC1_RX_EMPTY_S 17 +/* SLC_SLC1_RX_FULL : RO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_FULL (BIT(16)) +#define SLC_SLC1_RX_FULL_M (BIT(16)) +#define SLC_SLC1_RX_FULL_V 0x1 +#define SLC_SLC1_RX_FULL_S 16 +/* SLC_SLC0_RX_EMPTY : RO ;bitpos:[1] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC0_RX_EMPTY (BIT(1)) +#define SLC_SLC0_RX_EMPTY_M (BIT(1)) +#define SLC_SLC0_RX_EMPTY_V 0x1 +#define SLC_SLC0_RX_EMPTY_S 1 +/* SLC_SLC0_RX_FULL : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_FULL (BIT(0)) +#define SLC_SLC0_RX_FULL_M (BIT(0)) +#define SLC_SLC0_RX_FULL_V 0x1 +#define SLC_SLC0_RX_FULL_S 0 + +#define SLC_0RXFIFO_PUSH_REG (DR_REG_SLC_BASE + 0x28) +/* SLC_SLC0_RXFIFO_PUSH : R/W ;bitpos:[16] ;default: 1'h0 ; */ +/*description: */ +#define SLC_SLC0_RXFIFO_PUSH (BIT(16)) +#define SLC_SLC0_RXFIFO_PUSH_M (BIT(16)) +#define SLC_SLC0_RXFIFO_PUSH_V 0x1 +#define SLC_SLC0_RXFIFO_PUSH_S 16 +/* SLC_SLC0_RXFIFO_WDATA : R/W ;bitpos:[8:0] ;default: 9'h0 ; */ +/*description: */ +#define SLC_SLC0_RXFIFO_WDATA 0x000001FF +#define SLC_SLC0_RXFIFO_WDATA_M ((SLC_SLC0_RXFIFO_WDATA_V)<<(SLC_SLC0_RXFIFO_WDATA_S)) +#define SLC_SLC0_RXFIFO_WDATA_V 0x1FF +#define SLC_SLC0_RXFIFO_WDATA_S 0 + +#define SLC_1RXFIFO_PUSH_REG (DR_REG_SLC_BASE + 0x2C) +/* SLC_SLC1_RXFIFO_PUSH : R/W ;bitpos:[16] ;default: 1'h0 ; */ +/*description: */ +#define SLC_SLC1_RXFIFO_PUSH (BIT(16)) +#define SLC_SLC1_RXFIFO_PUSH_M (BIT(16)) +#define SLC_SLC1_RXFIFO_PUSH_V 0x1 +#define SLC_SLC1_RXFIFO_PUSH_S 16 +/* SLC_SLC1_RXFIFO_WDATA : R/W ;bitpos:[8:0] ;default: 9'h0 ; */ +/*description: */ +#define SLC_SLC1_RXFIFO_WDATA 0x000001FF +#define SLC_SLC1_RXFIFO_WDATA_M ((SLC_SLC1_RXFIFO_WDATA_V)<<(SLC_SLC1_RXFIFO_WDATA_S)) +#define SLC_SLC1_RXFIFO_WDATA_V 0x1FF +#define SLC_SLC1_RXFIFO_WDATA_S 0 + +#define SLC_TX_STATUS_REG (DR_REG_SLC_BASE + 0x30) +/* SLC_SLC1_TX_EMPTY : RO ;bitpos:[17] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC1_TX_EMPTY (BIT(17)) +#define SLC_SLC1_TX_EMPTY_M (BIT(17)) +#define SLC_SLC1_TX_EMPTY_V 0x1 +#define SLC_SLC1_TX_EMPTY_S 17 +/* SLC_SLC1_TX_FULL : RO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_FULL (BIT(16)) +#define SLC_SLC1_TX_FULL_M (BIT(16)) +#define SLC_SLC1_TX_FULL_V 0x1 +#define SLC_SLC1_TX_FULL_S 16 +/* SLC_SLC0_TX_EMPTY : RO ;bitpos:[1] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC0_TX_EMPTY (BIT(1)) +#define SLC_SLC0_TX_EMPTY_M (BIT(1)) +#define SLC_SLC0_TX_EMPTY_V 0x1 +#define SLC_SLC0_TX_EMPTY_S 1 +/* SLC_SLC0_TX_FULL : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_FULL (BIT(0)) +#define SLC_SLC0_TX_FULL_M (BIT(0)) +#define SLC_SLC0_TX_FULL_V 0x1 +#define SLC_SLC0_TX_FULL_S 0 + +#define SLC_0TXFIFO_POP_REG (DR_REG_SLC_BASE + 0x34) +/* SLC_SLC0_TXFIFO_POP : R/W ;bitpos:[16] ;default: 1'h0 ; */ +/*description: */ +#define SLC_SLC0_TXFIFO_POP (BIT(16)) +#define SLC_SLC0_TXFIFO_POP_M (BIT(16)) +#define SLC_SLC0_TXFIFO_POP_V 0x1 +#define SLC_SLC0_TXFIFO_POP_S 16 +/* SLC_SLC0_TXFIFO_RDATA : RO ;bitpos:[10:0] ;default: 11'h0 ; */ +/*description: */ +#define SLC_SLC0_TXFIFO_RDATA 0x000007FF +#define SLC_SLC0_TXFIFO_RDATA_M ((SLC_SLC0_TXFIFO_RDATA_V)<<(SLC_SLC0_TXFIFO_RDATA_S)) +#define SLC_SLC0_TXFIFO_RDATA_V 0x7FF +#define SLC_SLC0_TXFIFO_RDATA_S 0 + +#define SLC_1TXFIFO_POP_REG (DR_REG_SLC_BASE + 0x38) +/* SLC_SLC1_TXFIFO_POP : R/W ;bitpos:[16] ;default: 1'h0 ; */ +/*description: */ +#define SLC_SLC1_TXFIFO_POP (BIT(16)) +#define SLC_SLC1_TXFIFO_POP_M (BIT(16)) +#define SLC_SLC1_TXFIFO_POP_V 0x1 +#define SLC_SLC1_TXFIFO_POP_S 16 +/* SLC_SLC1_TXFIFO_RDATA : RO ;bitpos:[10:0] ;default: 11'h0 ; */ +/*description: */ +#define SLC_SLC1_TXFIFO_RDATA 0x000007FF +#define SLC_SLC1_TXFIFO_RDATA_M ((SLC_SLC1_TXFIFO_RDATA_V)<<(SLC_SLC1_TXFIFO_RDATA_S)) +#define SLC_SLC1_TXFIFO_RDATA_V 0x7FF +#define SLC_SLC1_TXFIFO_RDATA_S 0 + +#define SLC_0RX_LINK_REG (DR_REG_SLC_BASE + 0x3C) +/* SLC_SLC0_RXLINK_PARK : RO ;bitpos:[31] ;default: 1'h0 ; */ +/*description: */ +#define SLC_SLC0_RXLINK_PARK (BIT(31)) +#define SLC_SLC0_RXLINK_PARK_M (BIT(31)) +#define SLC_SLC0_RXLINK_PARK_V 0x1 +#define SLC_SLC0_RXLINK_PARK_S 31 +/* SLC_SLC0_RXLINK_RESTART : R/W ;bitpos:[30] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RXLINK_RESTART (BIT(30)) +#define SLC_SLC0_RXLINK_RESTART_M (BIT(30)) +#define SLC_SLC0_RXLINK_RESTART_V 0x1 +#define SLC_SLC0_RXLINK_RESTART_S 30 +/* SLC_SLC0_RXLINK_START : R/W ;bitpos:[29] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RXLINK_START (BIT(29)) +#define SLC_SLC0_RXLINK_START_M (BIT(29)) +#define SLC_SLC0_RXLINK_START_V 0x1 +#define SLC_SLC0_RXLINK_START_S 29 +/* SLC_SLC0_RXLINK_STOP : R/W ;bitpos:[28] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RXLINK_STOP (BIT(28)) +#define SLC_SLC0_RXLINK_STOP_M (BIT(28)) +#define SLC_SLC0_RXLINK_STOP_V 0x1 +#define SLC_SLC0_RXLINK_STOP_S 28 +/* SLC_SLC0_RXLINK_ADDR : R/W ;bitpos:[19:0] ;default: 20'h0 ; */ +/*description: */ +#define SLC_SLC0_RXLINK_ADDR 0x000FFFFF +#define SLC_SLC0_RXLINK_ADDR_M ((SLC_SLC0_RXLINK_ADDR_V)<<(SLC_SLC0_RXLINK_ADDR_S)) +#define SLC_SLC0_RXLINK_ADDR_V 0xFFFFF +#define SLC_SLC0_RXLINK_ADDR_S 0 + +#define SLC_0TX_LINK_REG (DR_REG_SLC_BASE + 0x40) +/* SLC_SLC0_TXLINK_PARK : RO ;bitpos:[31] ;default: 1'h0 ; */ +/*description: */ +#define SLC_SLC0_TXLINK_PARK (BIT(31)) +#define SLC_SLC0_TXLINK_PARK_M (BIT(31)) +#define SLC_SLC0_TXLINK_PARK_V 0x1 +#define SLC_SLC0_TXLINK_PARK_S 31 +/* SLC_SLC0_TXLINK_RESTART : R/W ;bitpos:[30] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TXLINK_RESTART (BIT(30)) +#define SLC_SLC0_TXLINK_RESTART_M (BIT(30)) +#define SLC_SLC0_TXLINK_RESTART_V 0x1 +#define SLC_SLC0_TXLINK_RESTART_S 30 +/* SLC_SLC0_TXLINK_START : R/W ;bitpos:[29] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TXLINK_START (BIT(29)) +#define SLC_SLC0_TXLINK_START_M (BIT(29)) +#define SLC_SLC0_TXLINK_START_V 0x1 +#define SLC_SLC0_TXLINK_START_S 29 +/* SLC_SLC0_TXLINK_STOP : R/W ;bitpos:[28] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TXLINK_STOP (BIT(28)) +#define SLC_SLC0_TXLINK_STOP_M (BIT(28)) +#define SLC_SLC0_TXLINK_STOP_V 0x1 +#define SLC_SLC0_TXLINK_STOP_S 28 +/* SLC_SLC0_TXLINK_ADDR : R/W ;bitpos:[19:0] ;default: 20'h0 ; */ +/*description: */ +#define SLC_SLC0_TXLINK_ADDR 0x000FFFFF +#define SLC_SLC0_TXLINK_ADDR_M ((SLC_SLC0_TXLINK_ADDR_V)<<(SLC_SLC0_TXLINK_ADDR_S)) +#define SLC_SLC0_TXLINK_ADDR_V 0xFFFFF +#define SLC_SLC0_TXLINK_ADDR_S 0 + +#define SLC_1RX_LINK_REG (DR_REG_SLC_BASE + 0x44) +/* SLC_SLC1_RXLINK_PARK : RO ;bitpos:[31] ;default: 1'h0 ; */ +/*description: */ +#define SLC_SLC1_RXLINK_PARK (BIT(31)) +#define SLC_SLC1_RXLINK_PARK_M (BIT(31)) +#define SLC_SLC1_RXLINK_PARK_V 0x1 +#define SLC_SLC1_RXLINK_PARK_S 31 +/* SLC_SLC1_RXLINK_RESTART : R/W ;bitpos:[30] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RXLINK_RESTART (BIT(30)) +#define SLC_SLC1_RXLINK_RESTART_M (BIT(30)) +#define SLC_SLC1_RXLINK_RESTART_V 0x1 +#define SLC_SLC1_RXLINK_RESTART_S 30 +/* SLC_SLC1_RXLINK_START : R/W ;bitpos:[29] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RXLINK_START (BIT(29)) +#define SLC_SLC1_RXLINK_START_M (BIT(29)) +#define SLC_SLC1_RXLINK_START_V 0x1 +#define SLC_SLC1_RXLINK_START_S 29 +/* SLC_SLC1_RXLINK_STOP : R/W ;bitpos:[28] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RXLINK_STOP (BIT(28)) +#define SLC_SLC1_RXLINK_STOP_M (BIT(28)) +#define SLC_SLC1_RXLINK_STOP_V 0x1 +#define SLC_SLC1_RXLINK_STOP_S 28 +/* SLC_SLC1_BT_PACKET : R/W ;bitpos:[20] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC1_BT_PACKET (BIT(20)) +#define SLC_SLC1_BT_PACKET_M (BIT(20)) +#define SLC_SLC1_BT_PACKET_V 0x1 +#define SLC_SLC1_BT_PACKET_S 20 +/* SLC_SLC1_RXLINK_ADDR : R/W ;bitpos:[19:0] ;default: 20'h0 ; */ +/*description: */ +#define SLC_SLC1_RXLINK_ADDR 0x000FFFFF +#define SLC_SLC1_RXLINK_ADDR_M ((SLC_SLC1_RXLINK_ADDR_V)<<(SLC_SLC1_RXLINK_ADDR_S)) +#define SLC_SLC1_RXLINK_ADDR_V 0xFFFFF +#define SLC_SLC1_RXLINK_ADDR_S 0 + +#define SLC_1TX_LINK_REG (DR_REG_SLC_BASE + 0x48) +/* SLC_SLC1_TXLINK_PARK : RO ;bitpos:[31] ;default: 1'h0 ; */ +/*description: */ +#define SLC_SLC1_TXLINK_PARK (BIT(31)) +#define SLC_SLC1_TXLINK_PARK_M (BIT(31)) +#define SLC_SLC1_TXLINK_PARK_V 0x1 +#define SLC_SLC1_TXLINK_PARK_S 31 +/* SLC_SLC1_TXLINK_RESTART : R/W ;bitpos:[30] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TXLINK_RESTART (BIT(30)) +#define SLC_SLC1_TXLINK_RESTART_M (BIT(30)) +#define SLC_SLC1_TXLINK_RESTART_V 0x1 +#define SLC_SLC1_TXLINK_RESTART_S 30 +/* SLC_SLC1_TXLINK_START : R/W ;bitpos:[29] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TXLINK_START (BIT(29)) +#define SLC_SLC1_TXLINK_START_M (BIT(29)) +#define SLC_SLC1_TXLINK_START_V 0x1 +#define SLC_SLC1_TXLINK_START_S 29 +/* SLC_SLC1_TXLINK_STOP : R/W ;bitpos:[28] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TXLINK_STOP (BIT(28)) +#define SLC_SLC1_TXLINK_STOP_M (BIT(28)) +#define SLC_SLC1_TXLINK_STOP_V 0x1 +#define SLC_SLC1_TXLINK_STOP_S 28 +/* SLC_SLC1_TXLINK_ADDR : R/W ;bitpos:[19:0] ;default: 20'h0 ; */ +/*description: */ +#define SLC_SLC1_TXLINK_ADDR 0x000FFFFF +#define SLC_SLC1_TXLINK_ADDR_M ((SLC_SLC1_TXLINK_ADDR_V)<<(SLC_SLC1_TXLINK_ADDR_S)) +#define SLC_SLC1_TXLINK_ADDR_V 0xFFFFF +#define SLC_SLC1_TXLINK_ADDR_S 0 + +#define SLC_INTVEC_TOHOST_REG (DR_REG_SLC_BASE + 0x4C) +/* SLC_SLC1_TOHOST_INTVEC : WO ;bitpos:[23:16] ;default: 8'h0 ; */ +/*description: */ +#define SLC_SLC1_TOHOST_INTVEC 0x000000FF +#define SLC_SLC1_TOHOST_INTVEC_M ((SLC_SLC1_TOHOST_INTVEC_V)<<(SLC_SLC1_TOHOST_INTVEC_S)) +#define SLC_SLC1_TOHOST_INTVEC_V 0xFF +#define SLC_SLC1_TOHOST_INTVEC_S 16 +/* SLC_SLC0_TOHOST_INTVEC : WO ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: */ +#define SLC_SLC0_TOHOST_INTVEC 0x000000FF +#define SLC_SLC0_TOHOST_INTVEC_M ((SLC_SLC0_TOHOST_INTVEC_V)<<(SLC_SLC0_TOHOST_INTVEC_S)) +#define SLC_SLC0_TOHOST_INTVEC_V 0xFF +#define SLC_SLC0_TOHOST_INTVEC_S 0 + +#define SLC_0TOKEN0_REG (DR_REG_SLC_BASE + 0x50) +/* SLC_SLC0_TOKEN0 : RO ;bitpos:[27:16] ;default: 12'h0 ; */ +/*description: */ +#define SLC_SLC0_TOKEN0 0x00000FFF +#define SLC_SLC0_TOKEN0_M ((SLC_SLC0_TOKEN0_V)<<(SLC_SLC0_TOKEN0_S)) +#define SLC_SLC0_TOKEN0_V 0xFFF +#define SLC_SLC0_TOKEN0_S 16 +/* SLC_SLC0_TOKEN0_INC_MORE : WO ;bitpos:[14] ;default: 1'h0 ; */ +/*description: */ +#define SLC_SLC0_TOKEN0_INC_MORE (BIT(14)) +#define SLC_SLC0_TOKEN0_INC_MORE_M (BIT(14)) +#define SLC_SLC0_TOKEN0_INC_MORE_V 0x1 +#define SLC_SLC0_TOKEN0_INC_MORE_S 14 +/* SLC_SLC0_TOKEN0_INC : WO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TOKEN0_INC (BIT(13)) +#define SLC_SLC0_TOKEN0_INC_M (BIT(13)) +#define SLC_SLC0_TOKEN0_INC_V 0x1 +#define SLC_SLC0_TOKEN0_INC_S 13 +/* SLC_SLC0_TOKEN0_WR : WO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TOKEN0_WR (BIT(12)) +#define SLC_SLC0_TOKEN0_WR_M (BIT(12)) +#define SLC_SLC0_TOKEN0_WR_V 0x1 +#define SLC_SLC0_TOKEN0_WR_S 12 +/* SLC_SLC0_TOKEN0_WDATA : WO ;bitpos:[11:0] ;default: 12'h0 ; */ +/*description: */ +#define SLC_SLC0_TOKEN0_WDATA 0x00000FFF +#define SLC_SLC0_TOKEN0_WDATA_M ((SLC_SLC0_TOKEN0_WDATA_V)<<(SLC_SLC0_TOKEN0_WDATA_S)) +#define SLC_SLC0_TOKEN0_WDATA_V 0xFFF +#define SLC_SLC0_TOKEN0_WDATA_S 0 + +#define SLC_0TOKEN1_REG (DR_REG_SLC_BASE + 0x54) +/* SLC_SLC0_TOKEN1 : RO ;bitpos:[27:16] ;default: 12'h0 ; */ +/*description: */ +#define SLC_SLC0_TOKEN1 0x00000FFF +#define SLC_SLC0_TOKEN1_M ((SLC_SLC0_TOKEN1_V)<<(SLC_SLC0_TOKEN1_S)) +#define SLC_SLC0_TOKEN1_V 0xFFF +#define SLC_SLC0_TOKEN1_S 16 +/* SLC_SLC0_TOKEN1_INC_MORE : WO ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TOKEN1_INC_MORE (BIT(14)) +#define SLC_SLC0_TOKEN1_INC_MORE_M (BIT(14)) +#define SLC_SLC0_TOKEN1_INC_MORE_V 0x1 +#define SLC_SLC0_TOKEN1_INC_MORE_S 14 +/* SLC_SLC0_TOKEN1_INC : WO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TOKEN1_INC (BIT(13)) +#define SLC_SLC0_TOKEN1_INC_M (BIT(13)) +#define SLC_SLC0_TOKEN1_INC_V 0x1 +#define SLC_SLC0_TOKEN1_INC_S 13 +/* SLC_SLC0_TOKEN1_WR : WO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TOKEN1_WR (BIT(12)) +#define SLC_SLC0_TOKEN1_WR_M (BIT(12)) +#define SLC_SLC0_TOKEN1_WR_V 0x1 +#define SLC_SLC0_TOKEN1_WR_S 12 +/* SLC_SLC0_TOKEN1_WDATA : WO ;bitpos:[11:0] ;default: 12'h0 ; */ +/*description: */ +#define SLC_SLC0_TOKEN1_WDATA 0x00000FFF +#define SLC_SLC0_TOKEN1_WDATA_M ((SLC_SLC0_TOKEN1_WDATA_V)<<(SLC_SLC0_TOKEN1_WDATA_S)) +#define SLC_SLC0_TOKEN1_WDATA_V 0xFFF +#define SLC_SLC0_TOKEN1_WDATA_S 0 + +#define SLC_1TOKEN0_REG (DR_REG_SLC_BASE + 0x58) +/* SLC_SLC1_TOKEN0 : RO ;bitpos:[27:16] ;default: 12'h0 ; */ +/*description: */ +#define SLC_SLC1_TOKEN0 0x00000FFF +#define SLC_SLC1_TOKEN0_M ((SLC_SLC1_TOKEN0_V)<<(SLC_SLC1_TOKEN0_S)) +#define SLC_SLC1_TOKEN0_V 0xFFF +#define SLC_SLC1_TOKEN0_S 16 +/* SLC_SLC1_TOKEN0_INC_MORE : WO ;bitpos:[14] ;default: 1'h0 ; */ +/*description: */ +#define SLC_SLC1_TOKEN0_INC_MORE (BIT(14)) +#define SLC_SLC1_TOKEN0_INC_MORE_M (BIT(14)) +#define SLC_SLC1_TOKEN0_INC_MORE_V 0x1 +#define SLC_SLC1_TOKEN0_INC_MORE_S 14 +/* SLC_SLC1_TOKEN0_INC : WO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TOKEN0_INC (BIT(13)) +#define SLC_SLC1_TOKEN0_INC_M (BIT(13)) +#define SLC_SLC1_TOKEN0_INC_V 0x1 +#define SLC_SLC1_TOKEN0_INC_S 13 +/* SLC_SLC1_TOKEN0_WR : WO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TOKEN0_WR (BIT(12)) +#define SLC_SLC1_TOKEN0_WR_M (BIT(12)) +#define SLC_SLC1_TOKEN0_WR_V 0x1 +#define SLC_SLC1_TOKEN0_WR_S 12 +/* SLC_SLC1_TOKEN0_WDATA : WO ;bitpos:[11:0] ;default: 12'h0 ; */ +/*description: */ +#define SLC_SLC1_TOKEN0_WDATA 0x00000FFF +#define SLC_SLC1_TOKEN0_WDATA_M ((SLC_SLC1_TOKEN0_WDATA_V)<<(SLC_SLC1_TOKEN0_WDATA_S)) +#define SLC_SLC1_TOKEN0_WDATA_V 0xFFF +#define SLC_SLC1_TOKEN0_WDATA_S 0 + +#define SLC_1TOKEN1_REG (DR_REG_SLC_BASE + 0x5C) +/* SLC_SLC1_TOKEN1 : RO ;bitpos:[27:16] ;default: 12'h0 ; */ +/*description: */ +#define SLC_SLC1_TOKEN1 0x00000FFF +#define SLC_SLC1_TOKEN1_M ((SLC_SLC1_TOKEN1_V)<<(SLC_SLC1_TOKEN1_S)) +#define SLC_SLC1_TOKEN1_V 0xFFF +#define SLC_SLC1_TOKEN1_S 16 +/* SLC_SLC1_TOKEN1_INC_MORE : WO ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TOKEN1_INC_MORE (BIT(14)) +#define SLC_SLC1_TOKEN1_INC_MORE_M (BIT(14)) +#define SLC_SLC1_TOKEN1_INC_MORE_V 0x1 +#define SLC_SLC1_TOKEN1_INC_MORE_S 14 +/* SLC_SLC1_TOKEN1_INC : WO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TOKEN1_INC (BIT(13)) +#define SLC_SLC1_TOKEN1_INC_M (BIT(13)) +#define SLC_SLC1_TOKEN1_INC_V 0x1 +#define SLC_SLC1_TOKEN1_INC_S 13 +/* SLC_SLC1_TOKEN1_WR : WO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TOKEN1_WR (BIT(12)) +#define SLC_SLC1_TOKEN1_WR_M (BIT(12)) +#define SLC_SLC1_TOKEN1_WR_V 0x1 +#define SLC_SLC1_TOKEN1_WR_S 12 +/* SLC_SLC1_TOKEN1_WDATA : WO ;bitpos:[11:0] ;default: 12'h0 ; */ +/*description: */ +#define SLC_SLC1_TOKEN1_WDATA 0x00000FFF +#define SLC_SLC1_TOKEN1_WDATA_M ((SLC_SLC1_TOKEN1_WDATA_V)<<(SLC_SLC1_TOKEN1_WDATA_S)) +#define SLC_SLC1_TOKEN1_WDATA_V 0xFFF +#define SLC_SLC1_TOKEN1_WDATA_S 0 + +#define SLC_CONF1_REG (DR_REG_SLC_BASE + 0x60) +/* SLC_CLK_EN : R/W ;bitpos:[22] ;default: 1'b0 ; */ +/*description: */ +#define SLC_CLK_EN (BIT(22)) +#define SLC_CLK_EN_M (BIT(22)) +#define SLC_CLK_EN_V 0x1 +#define SLC_CLK_EN_S 22 +/* SLC_SLC1_RX_STITCH_EN : R/W ;bitpos:[21] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC1_RX_STITCH_EN (BIT(21)) +#define SLC_SLC1_RX_STITCH_EN_M (BIT(21)) +#define SLC_SLC1_RX_STITCH_EN_V 0x1 +#define SLC_SLC1_RX_STITCH_EN_S 21 +/* SLC_SLC1_TX_STITCH_EN : R/W ;bitpos:[20] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC1_TX_STITCH_EN (BIT(20)) +#define SLC_SLC1_TX_STITCH_EN_M (BIT(20)) +#define SLC_SLC1_TX_STITCH_EN_V 0x1 +#define SLC_SLC1_TX_STITCH_EN_S 20 +/* SLC_HOST_INT_LEVEL_SEL : R/W ;bitpos:[19] ;default: 1'b0 ; */ +/*description: */ +#define SLC_HOST_INT_LEVEL_SEL (BIT(19)) +#define SLC_HOST_INT_LEVEL_SEL_M (BIT(19)) +#define SLC_HOST_INT_LEVEL_SEL_V 0x1 +#define SLC_HOST_INT_LEVEL_SEL_S 19 +/* SLC_SLC1_RX_CHECK_SUM_EN : R/W ;bitpos:[18] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_CHECK_SUM_EN (BIT(18)) +#define SLC_SLC1_RX_CHECK_SUM_EN_M (BIT(18)) +#define SLC_SLC1_RX_CHECK_SUM_EN_V 0x1 +#define SLC_SLC1_RX_CHECK_SUM_EN_S 18 +/* SLC_SLC1_TX_CHECK_SUM_EN : R/W ;bitpos:[17] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_CHECK_SUM_EN (BIT(17)) +#define SLC_SLC1_TX_CHECK_SUM_EN_M (BIT(17)) +#define SLC_SLC1_TX_CHECK_SUM_EN_V 0x1 +#define SLC_SLC1_TX_CHECK_SUM_EN_S 17 +/* SLC_SLC1_CHECK_OWNER : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_CHECK_OWNER (BIT(16)) +#define SLC_SLC1_CHECK_OWNER_M (BIT(16)) +#define SLC_SLC1_CHECK_OWNER_V 0x1 +#define SLC_SLC1_CHECK_OWNER_S 16 +/* SLC_SLC0_RX_STITCH_EN : R/W ;bitpos:[6] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC0_RX_STITCH_EN (BIT(6)) +#define SLC_SLC0_RX_STITCH_EN_M (BIT(6)) +#define SLC_SLC0_RX_STITCH_EN_V 0x1 +#define SLC_SLC0_RX_STITCH_EN_S 6 +/* SLC_SLC0_TX_STITCH_EN : R/W ;bitpos:[5] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC0_TX_STITCH_EN (BIT(5)) +#define SLC_SLC0_TX_STITCH_EN_M (BIT(5)) +#define SLC_SLC0_TX_STITCH_EN_V 0x1 +#define SLC_SLC0_TX_STITCH_EN_S 5 +/* SLC_SLC0_LEN_AUTO_CLR : R/W ;bitpos:[4] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC0_LEN_AUTO_CLR (BIT(4)) +#define SLC_SLC0_LEN_AUTO_CLR_M (BIT(4)) +#define SLC_SLC0_LEN_AUTO_CLR_V 0x1 +#define SLC_SLC0_LEN_AUTO_CLR_S 4 +/* SLC_CMD_HOLD_EN : R/W ;bitpos:[3] ;default: 1'b1 ; */ +/*description: */ +#define SLC_CMD_HOLD_EN (BIT(3)) +#define SLC_CMD_HOLD_EN_M (BIT(3)) +#define SLC_CMD_HOLD_EN_V 0x1 +#define SLC_CMD_HOLD_EN_S 3 +/* SLC_SLC0_RX_CHECK_SUM_EN : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_CHECK_SUM_EN (BIT(2)) +#define SLC_SLC0_RX_CHECK_SUM_EN_M (BIT(2)) +#define SLC_SLC0_RX_CHECK_SUM_EN_V 0x1 +#define SLC_SLC0_RX_CHECK_SUM_EN_S 2 +/* SLC_SLC0_TX_CHECK_SUM_EN : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_CHECK_SUM_EN (BIT(1)) +#define SLC_SLC0_TX_CHECK_SUM_EN_M (BIT(1)) +#define SLC_SLC0_TX_CHECK_SUM_EN_V 0x1 +#define SLC_SLC0_TX_CHECK_SUM_EN_S 1 +/* SLC_SLC0_CHECK_OWNER : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_CHECK_OWNER (BIT(0)) +#define SLC_SLC0_CHECK_OWNER_M (BIT(0)) +#define SLC_SLC0_CHECK_OWNER_V 0x1 +#define SLC_SLC0_CHECK_OWNER_S 0 + +#define SLC_0_STATE0_REG (DR_REG_SLC_BASE + 0x64) +/* SLC_SLC0_STATE0 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define SLC_SLC0_STATE0 0xFFFFFFFF +#define SLC_SLC0_STATE0_M ((SLC_SLC0_STATE0_V)<<(SLC_SLC0_STATE0_S)) +#define SLC_SLC0_STATE0_V 0xFFFFFFFF +#define SLC_SLC0_STATE0_S 0 + +#define SLC_0_STATE1_REG (DR_REG_SLC_BASE + 0x68) +/* SLC_SLC0_STATE1 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define SLC_SLC0_STATE1 0xFFFFFFFF +#define SLC_SLC0_STATE1_M ((SLC_SLC0_STATE1_V)<<(SLC_SLC0_STATE1_S)) +#define SLC_SLC0_STATE1_V 0xFFFFFFFF +#define SLC_SLC0_STATE1_S 0 + +#define SLC_1_STATE0_REG (DR_REG_SLC_BASE + 0x6C) +/* SLC_SLC1_STATE0 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define SLC_SLC1_STATE0 0xFFFFFFFF +#define SLC_SLC1_STATE0_M ((SLC_SLC1_STATE0_V)<<(SLC_SLC1_STATE0_S)) +#define SLC_SLC1_STATE0_V 0xFFFFFFFF +#define SLC_SLC1_STATE0_S 0 + +#define SLC_1_STATE1_REG (DR_REG_SLC_BASE + 0x70) +/* SLC_SLC1_STATE1 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define SLC_SLC1_STATE1 0xFFFFFFFF +#define SLC_SLC1_STATE1_M ((SLC_SLC1_STATE1_V)<<(SLC_SLC1_STATE1_S)) +#define SLC_SLC1_STATE1_V 0xFFFFFFFF +#define SLC_SLC1_STATE1_S 0 + +#define SLC_BRIDGE_CONF_REG (DR_REG_SLC_BASE + 0x74) +/* SLC_TX_PUSH_IDLE_NUM : R/W ;bitpos:[31:16] ;default: 16'ha ; */ +/*description: */ +#define SLC_TX_PUSH_IDLE_NUM 0x0000FFFF +#define SLC_TX_PUSH_IDLE_NUM_M ((SLC_TX_PUSH_IDLE_NUM_V)<<(SLC_TX_PUSH_IDLE_NUM_S)) +#define SLC_TX_PUSH_IDLE_NUM_V 0xFFFF +#define SLC_TX_PUSH_IDLE_NUM_S 16 +/* SLC_SLC1_TX_DUMMY_MODE : R/W ;bitpos:[14] ;default: 1'h1 ; */ +/*description: */ +#define SLC_SLC1_TX_DUMMY_MODE (BIT(14)) +#define SLC_SLC1_TX_DUMMY_MODE_M (BIT(14)) +#define SLC_SLC1_TX_DUMMY_MODE_V 0x1 +#define SLC_SLC1_TX_DUMMY_MODE_S 14 +/* SLC_HDA_MAP_128K : R/W ;bitpos:[13] ;default: 1'h1 ; */ +/*description: */ +#define SLC_HDA_MAP_128K (BIT(13)) +#define SLC_HDA_MAP_128K_M (BIT(13)) +#define SLC_HDA_MAP_128K_V 0x1 +#define SLC_HDA_MAP_128K_S 13 +/* SLC_SLC0_TX_DUMMY_MODE : R/W ;bitpos:[12] ;default: 1'h1 ; */ +/*description: */ +#define SLC_SLC0_TX_DUMMY_MODE (BIT(12)) +#define SLC_SLC0_TX_DUMMY_MODE_M (BIT(12)) +#define SLC_SLC0_TX_DUMMY_MODE_V 0x1 +#define SLC_SLC0_TX_DUMMY_MODE_S 12 +/* SLC_FIFO_MAP_ENA : R/W ;bitpos:[11:8] ;default: 4'h7 ; */ +/*description: */ +#define SLC_FIFO_MAP_ENA 0x0000000F +#define SLC_FIFO_MAP_ENA_M ((SLC_FIFO_MAP_ENA_V)<<(SLC_FIFO_MAP_ENA_S)) +#define SLC_FIFO_MAP_ENA_V 0xF +#define SLC_FIFO_MAP_ENA_S 8 +/* SLC_TXEOF_ENA : R/W ;bitpos:[5:0] ;default: 6'h20 ; */ +/*description: */ +#define SLC_TXEOF_ENA 0x0000003F +#define SLC_TXEOF_ENA_M ((SLC_TXEOF_ENA_V)<<(SLC_TXEOF_ENA_S)) +#define SLC_TXEOF_ENA_V 0x3F +#define SLC_TXEOF_ENA_S 0 + +#define SLC_0_TO_EOF_DES_ADDR_REG (DR_REG_SLC_BASE + 0x78) +/* SLC_SLC0_TO_EOF_DES_ADDR : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define SLC_SLC0_TO_EOF_DES_ADDR 0xFFFFFFFF +#define SLC_SLC0_TO_EOF_DES_ADDR_M ((SLC_SLC0_TO_EOF_DES_ADDR_V)<<(SLC_SLC0_TO_EOF_DES_ADDR_S)) +#define SLC_SLC0_TO_EOF_DES_ADDR_V 0xFFFFFFFF +#define SLC_SLC0_TO_EOF_DES_ADDR_S 0 + +#define SLC_0_TX_EOF_DES_ADDR_REG (DR_REG_SLC_BASE + 0x7C) +/* SLC_SLC0_TX_SUC_EOF_DES_ADDR : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define SLC_SLC0_TX_SUC_EOF_DES_ADDR 0xFFFFFFFF +#define SLC_SLC0_TX_SUC_EOF_DES_ADDR_M ((SLC_SLC0_TX_SUC_EOF_DES_ADDR_V)<<(SLC_SLC0_TX_SUC_EOF_DES_ADDR_S)) +#define SLC_SLC0_TX_SUC_EOF_DES_ADDR_V 0xFFFFFFFF +#define SLC_SLC0_TX_SUC_EOF_DES_ADDR_S 0 + +#define SLC_0_TO_EOF_BFR_DES_ADDR_REG (DR_REG_SLC_BASE + 0x80) +/* SLC_SLC0_TO_EOF_BFR_DES_ADDR : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define SLC_SLC0_TO_EOF_BFR_DES_ADDR 0xFFFFFFFF +#define SLC_SLC0_TO_EOF_BFR_DES_ADDR_M ((SLC_SLC0_TO_EOF_BFR_DES_ADDR_V)<<(SLC_SLC0_TO_EOF_BFR_DES_ADDR_S)) +#define SLC_SLC0_TO_EOF_BFR_DES_ADDR_V 0xFFFFFFFF +#define SLC_SLC0_TO_EOF_BFR_DES_ADDR_S 0 + +#define SLC_1_TO_EOF_DES_ADDR_REG (DR_REG_SLC_BASE + 0x84) +/* SLC_SLC1_TO_EOF_DES_ADDR : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define SLC_SLC1_TO_EOF_DES_ADDR 0xFFFFFFFF +#define SLC_SLC1_TO_EOF_DES_ADDR_M ((SLC_SLC1_TO_EOF_DES_ADDR_V)<<(SLC_SLC1_TO_EOF_DES_ADDR_S)) +#define SLC_SLC1_TO_EOF_DES_ADDR_V 0xFFFFFFFF +#define SLC_SLC1_TO_EOF_DES_ADDR_S 0 + +#define SLC_1_TX_EOF_DES_ADDR_REG (DR_REG_SLC_BASE + 0x88) +/* SLC_SLC1_TX_SUC_EOF_DES_ADDR : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define SLC_SLC1_TX_SUC_EOF_DES_ADDR 0xFFFFFFFF +#define SLC_SLC1_TX_SUC_EOF_DES_ADDR_M ((SLC_SLC1_TX_SUC_EOF_DES_ADDR_V)<<(SLC_SLC1_TX_SUC_EOF_DES_ADDR_S)) +#define SLC_SLC1_TX_SUC_EOF_DES_ADDR_V 0xFFFFFFFF +#define SLC_SLC1_TX_SUC_EOF_DES_ADDR_S 0 + +#define SLC_1_TO_EOF_BFR_DES_ADDR_REG (DR_REG_SLC_BASE + 0x8C) +/* SLC_SLC1_TO_EOF_BFR_DES_ADDR : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define SLC_SLC1_TO_EOF_BFR_DES_ADDR 0xFFFFFFFF +#define SLC_SLC1_TO_EOF_BFR_DES_ADDR_M ((SLC_SLC1_TO_EOF_BFR_DES_ADDR_V)<<(SLC_SLC1_TO_EOF_BFR_DES_ADDR_S)) +#define SLC_SLC1_TO_EOF_BFR_DES_ADDR_V 0xFFFFFFFF +#define SLC_SLC1_TO_EOF_BFR_DES_ADDR_S 0 + +#define SLC_AHB_TEST_REG (DR_REG_SLC_BASE + 0x90) +/* SLC_AHB_TESTADDR : R/W ;bitpos:[5:4] ;default: 2'b0 ; */ +/*description: */ +#define SLC_AHB_TESTADDR 0x00000003 +#define SLC_AHB_TESTADDR_M ((SLC_AHB_TESTADDR_V)<<(SLC_AHB_TESTADDR_S)) +#define SLC_AHB_TESTADDR_V 0x3 +#define SLC_AHB_TESTADDR_S 4 +/* SLC_AHB_TESTMODE : R/W ;bitpos:[2:0] ;default: 3'b0 ; */ +/*description: */ +#define SLC_AHB_TESTMODE 0x00000007 +#define SLC_AHB_TESTMODE_M ((SLC_AHB_TESTMODE_V)<<(SLC_AHB_TESTMODE_S)) +#define SLC_AHB_TESTMODE_V 0x7 +#define SLC_AHB_TESTMODE_S 0 + +#define SLC_SDIO_ST_REG (DR_REG_SLC_BASE + 0x94) +/* SLC_FUNC2_ACC_STATE : RO ;bitpos:[28:24] ;default: 5'b0 ; */ +/*description: */ +#define SLC_FUNC2_ACC_STATE 0x0000001F +#define SLC_FUNC2_ACC_STATE_M ((SLC_FUNC2_ACC_STATE_V)<<(SLC_FUNC2_ACC_STATE_S)) +#define SLC_FUNC2_ACC_STATE_V 0x1F +#define SLC_FUNC2_ACC_STATE_S 24 +/* SLC_FUNC1_ACC_STATE : RO ;bitpos:[20:16] ;default: 5'b0 ; */ +/*description: */ +#define SLC_FUNC1_ACC_STATE 0x0000001F +#define SLC_FUNC1_ACC_STATE_M ((SLC_FUNC1_ACC_STATE_V)<<(SLC_FUNC1_ACC_STATE_S)) +#define SLC_FUNC1_ACC_STATE_V 0x1F +#define SLC_FUNC1_ACC_STATE_S 16 +/* SLC_BUS_ST : RO ;bitpos:[14:12] ;default: 3'b0 ; */ +/*description: */ +#define SLC_BUS_ST 0x00000007 +#define SLC_BUS_ST_M ((SLC_BUS_ST_V)<<(SLC_BUS_ST_S)) +#define SLC_BUS_ST_V 0x7 +#define SLC_BUS_ST_S 12 +/* SLC_SDIO_WAKEUP : RO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SDIO_WAKEUP (BIT(8)) +#define SLC_SDIO_WAKEUP_M (BIT(8)) +#define SLC_SDIO_WAKEUP_V 0x1 +#define SLC_SDIO_WAKEUP_S 8 +/* SLC_FUNC_ST : RO ;bitpos:[7:4] ;default: 4'b0 ; */ +/*description: */ +#define SLC_FUNC_ST 0x0000000F +#define SLC_FUNC_ST_M ((SLC_FUNC_ST_V)<<(SLC_FUNC_ST_S)) +#define SLC_FUNC_ST_V 0xF +#define SLC_FUNC_ST_S 4 +/* SLC_CMD_ST : RO ;bitpos:[2:0] ;default: 3'b0 ; */ +/*description: */ +#define SLC_CMD_ST 0x00000007 +#define SLC_CMD_ST_M ((SLC_CMD_ST_V)<<(SLC_CMD_ST_S)) +#define SLC_CMD_ST_V 0x7 +#define SLC_CMD_ST_S 0 + +#define SLC_RX_DSCR_CONF_REG (DR_REG_SLC_BASE + 0x98) +/* SLC_SLC1_RD_RETRY_THRESHOLD : R/W ;bitpos:[31:21] ;default: 11'h80 ; */ +/*description: */ +#define SLC_SLC1_RD_RETRY_THRESHOLD 0x000007FF +#define SLC_SLC1_RD_RETRY_THRESHOLD_M ((SLC_SLC1_RD_RETRY_THRESHOLD_V)<<(SLC_SLC1_RD_RETRY_THRESHOLD_S)) +#define SLC_SLC1_RD_RETRY_THRESHOLD_V 0x7FF +#define SLC_SLC1_RD_RETRY_THRESHOLD_S 21 +/* SLC_SLC1_RX_FILL_EN : R/W ;bitpos:[20] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC1_RX_FILL_EN (BIT(20)) +#define SLC_SLC1_RX_FILL_EN_M (BIT(20)) +#define SLC_SLC1_RX_FILL_EN_V 0x1 +#define SLC_SLC1_RX_FILL_EN_S 20 +/* SLC_SLC1_RX_EOF_MODE : R/W ;bitpos:[19] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC1_RX_EOF_MODE (BIT(19)) +#define SLC_SLC1_RX_EOF_MODE_M (BIT(19)) +#define SLC_SLC1_RX_EOF_MODE_V 0x1 +#define SLC_SLC1_RX_EOF_MODE_S 19 +/* SLC_SLC1_RX_FILL_MODE : R/W ;bitpos:[18] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_FILL_MODE (BIT(18)) +#define SLC_SLC1_RX_FILL_MODE_M (BIT(18)) +#define SLC_SLC1_RX_FILL_MODE_V 0x1 +#define SLC_SLC1_RX_FILL_MODE_S 18 +/* SLC_SLC1_INFOR_NO_REPLACE : R/W ;bitpos:[17] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC1_INFOR_NO_REPLACE (BIT(17)) +#define SLC_SLC1_INFOR_NO_REPLACE_M (BIT(17)) +#define SLC_SLC1_INFOR_NO_REPLACE_V 0x1 +#define SLC_SLC1_INFOR_NO_REPLACE_S 17 +/* SLC_SLC1_TOKEN_NO_REPLACE : R/W ;bitpos:[16] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC1_TOKEN_NO_REPLACE (BIT(16)) +#define SLC_SLC1_TOKEN_NO_REPLACE_M (BIT(16)) +#define SLC_SLC1_TOKEN_NO_REPLACE_V 0x1 +#define SLC_SLC1_TOKEN_NO_REPLACE_S 16 +/* SLC_SLC0_RD_RETRY_THRESHOLD : R/W ;bitpos:[15:5] ;default: 11'h80 ; */ +/*description: */ +#define SLC_SLC0_RD_RETRY_THRESHOLD 0x000007FF +#define SLC_SLC0_RD_RETRY_THRESHOLD_M ((SLC_SLC0_RD_RETRY_THRESHOLD_V)<<(SLC_SLC0_RD_RETRY_THRESHOLD_S)) +#define SLC_SLC0_RD_RETRY_THRESHOLD_V 0x7FF +#define SLC_SLC0_RD_RETRY_THRESHOLD_S 5 +/* SLC_SLC0_RX_FILL_EN : R/W ;bitpos:[4] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC0_RX_FILL_EN (BIT(4)) +#define SLC_SLC0_RX_FILL_EN_M (BIT(4)) +#define SLC_SLC0_RX_FILL_EN_V 0x1 +#define SLC_SLC0_RX_FILL_EN_S 4 +/* SLC_SLC0_RX_EOF_MODE : R/W ;bitpos:[3] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC0_RX_EOF_MODE (BIT(3)) +#define SLC_SLC0_RX_EOF_MODE_M (BIT(3)) +#define SLC_SLC0_RX_EOF_MODE_V 0x1 +#define SLC_SLC0_RX_EOF_MODE_S 3 +/* SLC_SLC0_RX_FILL_MODE : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_FILL_MODE (BIT(2)) +#define SLC_SLC0_RX_FILL_MODE_M (BIT(2)) +#define SLC_SLC0_RX_FILL_MODE_V 0x1 +#define SLC_SLC0_RX_FILL_MODE_S 2 +/* SLC_SLC0_INFOR_NO_REPLACE : R/W ;bitpos:[1] ;default: 1'b1 ; */ +/*description: */ +#define SLC_SLC0_INFOR_NO_REPLACE (BIT(1)) +#define SLC_SLC0_INFOR_NO_REPLACE_M (BIT(1)) +#define SLC_SLC0_INFOR_NO_REPLACE_V 0x1 +#define SLC_SLC0_INFOR_NO_REPLACE_S 1 +/* SLC_SLC0_TOKEN_NO_REPLACE : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TOKEN_NO_REPLACE (BIT(0)) +#define SLC_SLC0_TOKEN_NO_REPLACE_M (BIT(0)) +#define SLC_SLC0_TOKEN_NO_REPLACE_V 0x1 +#define SLC_SLC0_TOKEN_NO_REPLACE_S 0 + +#define SLC_0_TXLINK_DSCR_REG (DR_REG_SLC_BASE + 0x9C) +/* SLC_SLC0_TXLINK_DSCR : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define SLC_SLC0_TXLINK_DSCR 0xFFFFFFFF +#define SLC_SLC0_TXLINK_DSCR_M ((SLC_SLC0_TXLINK_DSCR_V)<<(SLC_SLC0_TXLINK_DSCR_S)) +#define SLC_SLC0_TXLINK_DSCR_V 0xFFFFFFFF +#define SLC_SLC0_TXLINK_DSCR_S 0 + +#define SLC_0_TXLINK_DSCR_BF0_REG (DR_REG_SLC_BASE + 0xA0) +/* SLC_SLC0_TXLINK_DSCR_BF0 : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define SLC_SLC0_TXLINK_DSCR_BF0 0xFFFFFFFF +#define SLC_SLC0_TXLINK_DSCR_BF0_M ((SLC_SLC0_TXLINK_DSCR_BF0_V)<<(SLC_SLC0_TXLINK_DSCR_BF0_S)) +#define SLC_SLC0_TXLINK_DSCR_BF0_V 0xFFFFFFFF +#define SLC_SLC0_TXLINK_DSCR_BF0_S 0 + +#define SLC_0_TXLINK_DSCR_BF1_REG (DR_REG_SLC_BASE + 0xA4) +/* SLC_SLC0_TXLINK_DSCR_BF1 : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define SLC_SLC0_TXLINK_DSCR_BF1 0xFFFFFFFF +#define SLC_SLC0_TXLINK_DSCR_BF1_M ((SLC_SLC0_TXLINK_DSCR_BF1_V)<<(SLC_SLC0_TXLINK_DSCR_BF1_S)) +#define SLC_SLC0_TXLINK_DSCR_BF1_V 0xFFFFFFFF +#define SLC_SLC0_TXLINK_DSCR_BF1_S 0 + +#define SLC_0_RXLINK_DSCR_REG (DR_REG_SLC_BASE + 0xA8) +/* SLC_SLC0_RXLINK_DSCR : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define SLC_SLC0_RXLINK_DSCR 0xFFFFFFFF +#define SLC_SLC0_RXLINK_DSCR_M ((SLC_SLC0_RXLINK_DSCR_V)<<(SLC_SLC0_RXLINK_DSCR_S)) +#define SLC_SLC0_RXLINK_DSCR_V 0xFFFFFFFF +#define SLC_SLC0_RXLINK_DSCR_S 0 + +#define SLC_0_RXLINK_DSCR_BF0_REG (DR_REG_SLC_BASE + 0xAC) +/* SLC_SLC0_RXLINK_DSCR_BF0 : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define SLC_SLC0_RXLINK_DSCR_BF0 0xFFFFFFFF +#define SLC_SLC0_RXLINK_DSCR_BF0_M ((SLC_SLC0_RXLINK_DSCR_BF0_V)<<(SLC_SLC0_RXLINK_DSCR_BF0_S)) +#define SLC_SLC0_RXLINK_DSCR_BF0_V 0xFFFFFFFF +#define SLC_SLC0_RXLINK_DSCR_BF0_S 0 + +#define SLC_0_RXLINK_DSCR_BF1_REG (DR_REG_SLC_BASE + 0xB0) +/* SLC_SLC0_RXLINK_DSCR_BF1 : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define SLC_SLC0_RXLINK_DSCR_BF1 0xFFFFFFFF +#define SLC_SLC0_RXLINK_DSCR_BF1_M ((SLC_SLC0_RXLINK_DSCR_BF1_V)<<(SLC_SLC0_RXLINK_DSCR_BF1_S)) +#define SLC_SLC0_RXLINK_DSCR_BF1_V 0xFFFFFFFF +#define SLC_SLC0_RXLINK_DSCR_BF1_S 0 + +#define SLC_1_TXLINK_DSCR_REG (DR_REG_SLC_BASE + 0xB4) +/* SLC_SLC1_TXLINK_DSCR : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define SLC_SLC1_TXLINK_DSCR 0xFFFFFFFF +#define SLC_SLC1_TXLINK_DSCR_M ((SLC_SLC1_TXLINK_DSCR_V)<<(SLC_SLC1_TXLINK_DSCR_S)) +#define SLC_SLC1_TXLINK_DSCR_V 0xFFFFFFFF +#define SLC_SLC1_TXLINK_DSCR_S 0 + +#define SLC_1_TXLINK_DSCR_BF0_REG (DR_REG_SLC_BASE + 0xB8) +/* SLC_SLC1_TXLINK_DSCR_BF0 : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define SLC_SLC1_TXLINK_DSCR_BF0 0xFFFFFFFF +#define SLC_SLC1_TXLINK_DSCR_BF0_M ((SLC_SLC1_TXLINK_DSCR_BF0_V)<<(SLC_SLC1_TXLINK_DSCR_BF0_S)) +#define SLC_SLC1_TXLINK_DSCR_BF0_V 0xFFFFFFFF +#define SLC_SLC1_TXLINK_DSCR_BF0_S 0 + +#define SLC_1_TXLINK_DSCR_BF1_REG (DR_REG_SLC_BASE + 0xBC) +/* SLC_SLC1_TXLINK_DSCR_BF1 : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define SLC_SLC1_TXLINK_DSCR_BF1 0xFFFFFFFF +#define SLC_SLC1_TXLINK_DSCR_BF1_M ((SLC_SLC1_TXLINK_DSCR_BF1_V)<<(SLC_SLC1_TXLINK_DSCR_BF1_S)) +#define SLC_SLC1_TXLINK_DSCR_BF1_V 0xFFFFFFFF +#define SLC_SLC1_TXLINK_DSCR_BF1_S 0 + +#define SLC_1_RXLINK_DSCR_REG (DR_REG_SLC_BASE + 0xC0) +/* SLC_SLC1_RXLINK_DSCR : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define SLC_SLC1_RXLINK_DSCR 0xFFFFFFFF +#define SLC_SLC1_RXLINK_DSCR_M ((SLC_SLC1_RXLINK_DSCR_V)<<(SLC_SLC1_RXLINK_DSCR_S)) +#define SLC_SLC1_RXLINK_DSCR_V 0xFFFFFFFF +#define SLC_SLC1_RXLINK_DSCR_S 0 + +#define SLC_1_RXLINK_DSCR_BF0_REG (DR_REG_SLC_BASE + 0xC4) +/* SLC_SLC1_RXLINK_DSCR_BF0 : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define SLC_SLC1_RXLINK_DSCR_BF0 0xFFFFFFFF +#define SLC_SLC1_RXLINK_DSCR_BF0_M ((SLC_SLC1_RXLINK_DSCR_BF0_V)<<(SLC_SLC1_RXLINK_DSCR_BF0_S)) +#define SLC_SLC1_RXLINK_DSCR_BF0_V 0xFFFFFFFF +#define SLC_SLC1_RXLINK_DSCR_BF0_S 0 + +#define SLC_1_RXLINK_DSCR_BF1_REG (DR_REG_SLC_BASE + 0xC8) +/* SLC_SLC1_RXLINK_DSCR_BF1 : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define SLC_SLC1_RXLINK_DSCR_BF1 0xFFFFFFFF +#define SLC_SLC1_RXLINK_DSCR_BF1_M ((SLC_SLC1_RXLINK_DSCR_BF1_V)<<(SLC_SLC1_RXLINK_DSCR_BF1_S)) +#define SLC_SLC1_RXLINK_DSCR_BF1_V 0xFFFFFFFF +#define SLC_SLC1_RXLINK_DSCR_BF1_S 0 + +#define SLC_0_TX_ERREOF_DES_ADDR_REG (DR_REG_SLC_BASE + 0xCC) +/* SLC_SLC0_TX_ERR_EOF_DES_ADDR : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define SLC_SLC0_TX_ERR_EOF_DES_ADDR 0xFFFFFFFF +#define SLC_SLC0_TX_ERR_EOF_DES_ADDR_M ((SLC_SLC0_TX_ERR_EOF_DES_ADDR_V)<<(SLC_SLC0_TX_ERR_EOF_DES_ADDR_S)) +#define SLC_SLC0_TX_ERR_EOF_DES_ADDR_V 0xFFFFFFFF +#define SLC_SLC0_TX_ERR_EOF_DES_ADDR_S 0 + +#define SLC_1_TX_ERREOF_DES_ADDR_REG (DR_REG_SLC_BASE + 0xD0) +/* SLC_SLC1_TX_ERR_EOF_DES_ADDR : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define SLC_SLC1_TX_ERR_EOF_DES_ADDR 0xFFFFFFFF +#define SLC_SLC1_TX_ERR_EOF_DES_ADDR_M ((SLC_SLC1_TX_ERR_EOF_DES_ADDR_V)<<(SLC_SLC1_TX_ERR_EOF_DES_ADDR_S)) +#define SLC_SLC1_TX_ERR_EOF_DES_ADDR_V 0xFFFFFFFF +#define SLC_SLC1_TX_ERR_EOF_DES_ADDR_S 0 + +#define SLC_TOKEN_LAT_REG (DR_REG_SLC_BASE + 0xD4) +/* SLC_SLC1_TOKEN : RO ;bitpos:[27:16] ;default: 12'b0 ; */ +/*description: */ +#define SLC_SLC1_TOKEN 0x00000FFF +#define SLC_SLC1_TOKEN_M ((SLC_SLC1_TOKEN_V)<<(SLC_SLC1_TOKEN_S)) +#define SLC_SLC1_TOKEN_V 0xFFF +#define SLC_SLC1_TOKEN_S 16 +/* SLC_SLC0_TOKEN : RO ;bitpos:[11:0] ;default: 12'b0 ; */ +/*description: */ +#define SLC_SLC0_TOKEN 0x00000FFF +#define SLC_SLC0_TOKEN_M ((SLC_SLC0_TOKEN_V)<<(SLC_SLC0_TOKEN_S)) +#define SLC_SLC0_TOKEN_V 0xFFF +#define SLC_SLC0_TOKEN_S 0 + +#define SLC_TX_DSCR_CONF_REG (DR_REG_SLC_BASE + 0xD8) +/* SLC_WR_RETRY_THRESHOLD : R/W ;bitpos:[10:0] ;default: 11'h80 ; */ +/*description: */ +#define SLC_WR_RETRY_THRESHOLD 0x000007FF +#define SLC_WR_RETRY_THRESHOLD_M ((SLC_WR_RETRY_THRESHOLD_V)<<(SLC_WR_RETRY_THRESHOLD_S)) +#define SLC_WR_RETRY_THRESHOLD_V 0x7FF +#define SLC_WR_RETRY_THRESHOLD_S 0 + +#define SLC_CMD_INFOR0_REG (DR_REG_SLC_BASE + 0xDC) +/* SLC_CMD_CONTENT0 : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define SLC_CMD_CONTENT0 0xFFFFFFFF +#define SLC_CMD_CONTENT0_M ((SLC_CMD_CONTENT0_V)<<(SLC_CMD_CONTENT0_S)) +#define SLC_CMD_CONTENT0_V 0xFFFFFFFF +#define SLC_CMD_CONTENT0_S 0 + +#define SLC_CMD_INFOR1_REG (DR_REG_SLC_BASE + 0xE0) +/* SLC_CMD_CONTENT1 : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define SLC_CMD_CONTENT1 0xFFFFFFFF +#define SLC_CMD_CONTENT1_M ((SLC_CMD_CONTENT1_V)<<(SLC_CMD_CONTENT1_S)) +#define SLC_CMD_CONTENT1_V 0xFFFFFFFF +#define SLC_CMD_CONTENT1_S 0 + +#define SLC_0_LEN_CONF_REG (DR_REG_SLC_BASE + 0xE4) +/* SLC_SLC0_TX_NEW_PKT_IND : RO ;bitpos:[28] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_NEW_PKT_IND (BIT(28)) +#define SLC_SLC0_TX_NEW_PKT_IND_M (BIT(28)) +#define SLC_SLC0_TX_NEW_PKT_IND_V 0x1 +#define SLC_SLC0_TX_NEW_PKT_IND_S 28 +/* SLC_SLC0_RX_NEW_PKT_IND : RO ;bitpos:[27] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_NEW_PKT_IND (BIT(27)) +#define SLC_SLC0_RX_NEW_PKT_IND_M (BIT(27)) +#define SLC_SLC0_RX_NEW_PKT_IND_V 0x1 +#define SLC_SLC0_RX_NEW_PKT_IND_S 27 +/* SLC_SLC0_TX_GET_USED_DSCR : WO ;bitpos:[26] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_GET_USED_DSCR (BIT(26)) +#define SLC_SLC0_TX_GET_USED_DSCR_M (BIT(26)) +#define SLC_SLC0_TX_GET_USED_DSCR_V 0x1 +#define SLC_SLC0_TX_GET_USED_DSCR_S 26 +/* SLC_SLC0_RX_GET_USED_DSCR : WO ;bitpos:[25] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_GET_USED_DSCR (BIT(25)) +#define SLC_SLC0_RX_GET_USED_DSCR_M (BIT(25)) +#define SLC_SLC0_RX_GET_USED_DSCR_V 0x1 +#define SLC_SLC0_RX_GET_USED_DSCR_S 25 +/* SLC_SLC0_TX_PACKET_LOAD_EN : R/W ;bitpos:[24] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_PACKET_LOAD_EN (BIT(24)) +#define SLC_SLC0_TX_PACKET_LOAD_EN_M (BIT(24)) +#define SLC_SLC0_TX_PACKET_LOAD_EN_V 0x1 +#define SLC_SLC0_TX_PACKET_LOAD_EN_S 24 +/* SLC_SLC0_RX_PACKET_LOAD_EN : R/W ;bitpos:[23] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_PACKET_LOAD_EN (BIT(23)) +#define SLC_SLC0_RX_PACKET_LOAD_EN_M (BIT(23)) +#define SLC_SLC0_RX_PACKET_LOAD_EN_V 0x1 +#define SLC_SLC0_RX_PACKET_LOAD_EN_S 23 +/* SLC_SLC0_LEN_INC_MORE : WO ;bitpos:[22] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_LEN_INC_MORE (BIT(22)) +#define SLC_SLC0_LEN_INC_MORE_M (BIT(22)) +#define SLC_SLC0_LEN_INC_MORE_V 0x1 +#define SLC_SLC0_LEN_INC_MORE_S 22 +/* SLC_SLC0_LEN_INC : WO ;bitpos:[21] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_LEN_INC (BIT(21)) +#define SLC_SLC0_LEN_INC_M (BIT(21)) +#define SLC_SLC0_LEN_INC_V 0x1 +#define SLC_SLC0_LEN_INC_S 21 +/* SLC_SLC0_LEN_WR : WO ;bitpos:[20] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_LEN_WR (BIT(20)) +#define SLC_SLC0_LEN_WR_M (BIT(20)) +#define SLC_SLC0_LEN_WR_V 0x1 +#define SLC_SLC0_LEN_WR_S 20 +/* SLC_SLC0_LEN_WDATA : WO ;bitpos:[19:0] ;default: 20'h0 ; */ +/*description: */ +#define SLC_SLC0_LEN_WDATA 0x000FFFFF +#define SLC_SLC0_LEN_WDATA_M ((SLC_SLC0_LEN_WDATA_V)<<(SLC_SLC0_LEN_WDATA_S)) +#define SLC_SLC0_LEN_WDATA_V 0xFFFFF +#define SLC_SLC0_LEN_WDATA_S 0 + +#define SLC_0_LENGTH_REG (DR_REG_SLC_BASE + 0xE8) +/* SLC_SLC0_LEN : RO ;bitpos:[19:0] ;default: 20'h0 ; */ +/*description: */ +#define SLC_SLC0_LEN 0x000FFFFF +#define SLC_SLC0_LEN_M ((SLC_SLC0_LEN_V)<<(SLC_SLC0_LEN_S)) +#define SLC_SLC0_LEN_V 0xFFFFF +#define SLC_SLC0_LEN_S 0 + +#define SLC_0_TXPKT_H_DSCR_REG (DR_REG_SLC_BASE + 0xEC) +/* SLC_SLC0_TX_PKT_H_DSCR_ADDR : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define SLC_SLC0_TX_PKT_H_DSCR_ADDR 0xFFFFFFFF +#define SLC_SLC0_TX_PKT_H_DSCR_ADDR_M ((SLC_SLC0_TX_PKT_H_DSCR_ADDR_V)<<(SLC_SLC0_TX_PKT_H_DSCR_ADDR_S)) +#define SLC_SLC0_TX_PKT_H_DSCR_ADDR_V 0xFFFFFFFF +#define SLC_SLC0_TX_PKT_H_DSCR_ADDR_S 0 + +#define SLC_0_TXPKT_E_DSCR_REG (DR_REG_SLC_BASE + 0xF0) +/* SLC_SLC0_TX_PKT_E_DSCR_ADDR : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define SLC_SLC0_TX_PKT_E_DSCR_ADDR 0xFFFFFFFF +#define SLC_SLC0_TX_PKT_E_DSCR_ADDR_M ((SLC_SLC0_TX_PKT_E_DSCR_ADDR_V)<<(SLC_SLC0_TX_PKT_E_DSCR_ADDR_S)) +#define SLC_SLC0_TX_PKT_E_DSCR_ADDR_V 0xFFFFFFFF +#define SLC_SLC0_TX_PKT_E_DSCR_ADDR_S 0 + +#define SLC_0_RXPKT_H_DSCR_REG (DR_REG_SLC_BASE + 0xF4) +/* SLC_SLC0_RX_PKT_H_DSCR_ADDR : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define SLC_SLC0_RX_PKT_H_DSCR_ADDR 0xFFFFFFFF +#define SLC_SLC0_RX_PKT_H_DSCR_ADDR_M ((SLC_SLC0_RX_PKT_H_DSCR_ADDR_V)<<(SLC_SLC0_RX_PKT_H_DSCR_ADDR_S)) +#define SLC_SLC0_RX_PKT_H_DSCR_ADDR_V 0xFFFFFFFF +#define SLC_SLC0_RX_PKT_H_DSCR_ADDR_S 0 + +#define SLC_0_RXPKT_E_DSCR_REG (DR_REG_SLC_BASE + 0xF8) +/* SLC_SLC0_RX_PKT_E_DSCR_ADDR : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define SLC_SLC0_RX_PKT_E_DSCR_ADDR 0xFFFFFFFF +#define SLC_SLC0_RX_PKT_E_DSCR_ADDR_M ((SLC_SLC0_RX_PKT_E_DSCR_ADDR_V)<<(SLC_SLC0_RX_PKT_E_DSCR_ADDR_S)) +#define SLC_SLC0_RX_PKT_E_DSCR_ADDR_V 0xFFFFFFFF +#define SLC_SLC0_RX_PKT_E_DSCR_ADDR_S 0 + +#define SLC_0_TXPKTU_H_DSCR_REG (DR_REG_SLC_BASE + 0xFC) +/* SLC_SLC0_TX_PKT_START_DSCR_ADDR : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define SLC_SLC0_TX_PKT_START_DSCR_ADDR 0xFFFFFFFF +#define SLC_SLC0_TX_PKT_START_DSCR_ADDR_M ((SLC_SLC0_TX_PKT_START_DSCR_ADDR_V)<<(SLC_SLC0_TX_PKT_START_DSCR_ADDR_S)) +#define SLC_SLC0_TX_PKT_START_DSCR_ADDR_V 0xFFFFFFFF +#define SLC_SLC0_TX_PKT_START_DSCR_ADDR_S 0 + +#define SLC_0_TXPKTU_E_DSCR_REG (DR_REG_SLC_BASE + 0x100) +/* SLC_SLC0_TX_PKT_END_DSCR_ADDR : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define SLC_SLC0_TX_PKT_END_DSCR_ADDR 0xFFFFFFFF +#define SLC_SLC0_TX_PKT_END_DSCR_ADDR_M ((SLC_SLC0_TX_PKT_END_DSCR_ADDR_V)<<(SLC_SLC0_TX_PKT_END_DSCR_ADDR_S)) +#define SLC_SLC0_TX_PKT_END_DSCR_ADDR_V 0xFFFFFFFF +#define SLC_SLC0_TX_PKT_END_DSCR_ADDR_S 0 + +#define SLC_0_RXPKTU_H_DSCR_REG (DR_REG_SLC_BASE + 0x104) +/* SLC_SLC0_RX_PKT_START_DSCR_ADDR : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define SLC_SLC0_RX_PKT_START_DSCR_ADDR 0xFFFFFFFF +#define SLC_SLC0_RX_PKT_START_DSCR_ADDR_M ((SLC_SLC0_RX_PKT_START_DSCR_ADDR_V)<<(SLC_SLC0_RX_PKT_START_DSCR_ADDR_S)) +#define SLC_SLC0_RX_PKT_START_DSCR_ADDR_V 0xFFFFFFFF +#define SLC_SLC0_RX_PKT_START_DSCR_ADDR_S 0 + +#define SLC_0_RXPKTU_E_DSCR_REG (DR_REG_SLC_BASE + 0x108) +/* SLC_SLC0_RX_PKT_END_DSCR_ADDR : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define SLC_SLC0_RX_PKT_END_DSCR_ADDR 0xFFFFFFFF +#define SLC_SLC0_RX_PKT_END_DSCR_ADDR_M ((SLC_SLC0_RX_PKT_END_DSCR_ADDR_V)<<(SLC_SLC0_RX_PKT_END_DSCR_ADDR_S)) +#define SLC_SLC0_RX_PKT_END_DSCR_ADDR_V 0xFFFFFFFF +#define SLC_SLC0_RX_PKT_END_DSCR_ADDR_S 0 + +#define SLC_SEQ_POSITION_REG (DR_REG_SLC_BASE + 0x114) +/* SLC_SLC1_SEQ_POSITION : R/W ;bitpos:[15:8] ;default: 8'h5 ; */ +/*description: */ +#define SLC_SLC1_SEQ_POSITION 0x000000FF +#define SLC_SLC1_SEQ_POSITION_M ((SLC_SLC1_SEQ_POSITION_V)<<(SLC_SLC1_SEQ_POSITION_S)) +#define SLC_SLC1_SEQ_POSITION_V 0xFF +#define SLC_SLC1_SEQ_POSITION_S 8 +/* SLC_SLC0_SEQ_POSITION : R/W ;bitpos:[7:0] ;default: 8'h9 ; */ +/*description: */ +#define SLC_SLC0_SEQ_POSITION 0x000000FF +#define SLC_SLC0_SEQ_POSITION_M ((SLC_SLC0_SEQ_POSITION_V)<<(SLC_SLC0_SEQ_POSITION_S)) +#define SLC_SLC0_SEQ_POSITION_V 0xFF +#define SLC_SLC0_SEQ_POSITION_S 0 + +#define SLC_0_DSCR_REC_CONF_REG (DR_REG_SLC_BASE + 0x118) +/* SLC_SLC0_RX_DSCR_REC_LIM : R/W ;bitpos:[9:0] ;default: 10'h3ff ; */ +/*description: */ +#define SLC_SLC0_RX_DSCR_REC_LIM 0x000003FF +#define SLC_SLC0_RX_DSCR_REC_LIM_M ((SLC_SLC0_RX_DSCR_REC_LIM_V)<<(SLC_SLC0_RX_DSCR_REC_LIM_S)) +#define SLC_SLC0_RX_DSCR_REC_LIM_V 0x3FF +#define SLC_SLC0_RX_DSCR_REC_LIM_S 0 + +#define SLC_SDIO_CRC_ST0_REG (DR_REG_SLC_BASE + 0x11C) +/* SLC_DAT3_CRC_ERR_CNT : RO ;bitpos:[31:24] ;default: 8'h0 ; */ +/*description: */ +#define SLC_DAT3_CRC_ERR_CNT 0x000000FF +#define SLC_DAT3_CRC_ERR_CNT_M ((SLC_DAT3_CRC_ERR_CNT_V)<<(SLC_DAT3_CRC_ERR_CNT_S)) +#define SLC_DAT3_CRC_ERR_CNT_V 0xFF +#define SLC_DAT3_CRC_ERR_CNT_S 24 +/* SLC_DAT2_CRC_ERR_CNT : RO ;bitpos:[23:16] ;default: 8'h0 ; */ +/*description: */ +#define SLC_DAT2_CRC_ERR_CNT 0x000000FF +#define SLC_DAT2_CRC_ERR_CNT_M ((SLC_DAT2_CRC_ERR_CNT_V)<<(SLC_DAT2_CRC_ERR_CNT_S)) +#define SLC_DAT2_CRC_ERR_CNT_V 0xFF +#define SLC_DAT2_CRC_ERR_CNT_S 16 +/* SLC_DAT1_CRC_ERR_CNT : RO ;bitpos:[15:8] ;default: 8'h0 ; */ +/*description: */ +#define SLC_DAT1_CRC_ERR_CNT 0x000000FF +#define SLC_DAT1_CRC_ERR_CNT_M ((SLC_DAT1_CRC_ERR_CNT_V)<<(SLC_DAT1_CRC_ERR_CNT_S)) +#define SLC_DAT1_CRC_ERR_CNT_V 0xFF +#define SLC_DAT1_CRC_ERR_CNT_S 8 +/* SLC_DAT0_CRC_ERR_CNT : RO ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: */ +#define SLC_DAT0_CRC_ERR_CNT 0x000000FF +#define SLC_DAT0_CRC_ERR_CNT_M ((SLC_DAT0_CRC_ERR_CNT_V)<<(SLC_DAT0_CRC_ERR_CNT_S)) +#define SLC_DAT0_CRC_ERR_CNT_V 0xFF +#define SLC_DAT0_CRC_ERR_CNT_S 0 + +#define SLC_SDIO_CRC_ST1_REG (DR_REG_SLC_BASE + 0x120) +/* SLC_ERR_CNT_CLR : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: */ +#define SLC_ERR_CNT_CLR (BIT(31)) +#define SLC_ERR_CNT_CLR_M (BIT(31)) +#define SLC_ERR_CNT_CLR_V 0x1 +#define SLC_ERR_CNT_CLR_S 31 +/* SLC_CMD_CRC_ERR_CNT : RO ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: */ +#define SLC_CMD_CRC_ERR_CNT 0x000000FF +#define SLC_CMD_CRC_ERR_CNT_M ((SLC_CMD_CRC_ERR_CNT_V)<<(SLC_CMD_CRC_ERR_CNT_S)) +#define SLC_CMD_CRC_ERR_CNT_V 0xFF +#define SLC_CMD_CRC_ERR_CNT_S 0 + +#define SLC_0_EOF_START_DES_REG (DR_REG_SLC_BASE + 0x124) +/* SLC_SLC0_EOF_START_DES_ADDR : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define SLC_SLC0_EOF_START_DES_ADDR 0xFFFFFFFF +#define SLC_SLC0_EOF_START_DES_ADDR_M ((SLC_SLC0_EOF_START_DES_ADDR_V)<<(SLC_SLC0_EOF_START_DES_ADDR_S)) +#define SLC_SLC0_EOF_START_DES_ADDR_V 0xFFFFFFFF +#define SLC_SLC0_EOF_START_DES_ADDR_S 0 + +#define SLC_0_PUSH_DSCR_ADDR_REG (DR_REG_SLC_BASE + 0x128) +/* SLC_SLC0_RX_PUSH_DSCR_ADDR : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_PUSH_DSCR_ADDR 0xFFFFFFFF +#define SLC_SLC0_RX_PUSH_DSCR_ADDR_M ((SLC_SLC0_RX_PUSH_DSCR_ADDR_V)<<(SLC_SLC0_RX_PUSH_DSCR_ADDR_S)) +#define SLC_SLC0_RX_PUSH_DSCR_ADDR_V 0xFFFFFFFF +#define SLC_SLC0_RX_PUSH_DSCR_ADDR_S 0 + +#define SLC_0_DONE_DSCR_ADDR_REG (DR_REG_SLC_BASE + 0x12C) +/* SLC_SLC0_RX_DONE_DSCR_ADDR : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_DONE_DSCR_ADDR 0xFFFFFFFF +#define SLC_SLC0_RX_DONE_DSCR_ADDR_M ((SLC_SLC0_RX_DONE_DSCR_ADDR_V)<<(SLC_SLC0_RX_DONE_DSCR_ADDR_S)) +#define SLC_SLC0_RX_DONE_DSCR_ADDR_V 0xFFFFFFFF +#define SLC_SLC0_RX_DONE_DSCR_ADDR_S 0 + +#define SLC_0_SUB_START_DES_REG (DR_REG_SLC_BASE + 0x130) +/* SLC_SLC0_SUB_PAC_START_DSCR_ADDR : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: */ +#define SLC_SLC0_SUB_PAC_START_DSCR_ADDR 0xFFFFFFFF +#define SLC_SLC0_SUB_PAC_START_DSCR_ADDR_M ((SLC_SLC0_SUB_PAC_START_DSCR_ADDR_V)<<(SLC_SLC0_SUB_PAC_START_DSCR_ADDR_S)) +#define SLC_SLC0_SUB_PAC_START_DSCR_ADDR_V 0xFFFFFFFF +#define SLC_SLC0_SUB_PAC_START_DSCR_ADDR_S 0 + +#define SLC_0_DSCR_CNT_REG (DR_REG_SLC_BASE + 0x134) +/* SLC_SLC0_RX_GET_EOF_OCC : RO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_GET_EOF_OCC (BIT(16)) +#define SLC_SLC0_RX_GET_EOF_OCC_M (BIT(16)) +#define SLC_SLC0_RX_GET_EOF_OCC_V 0x1 +#define SLC_SLC0_RX_GET_EOF_OCC_S 16 +/* SLC_SLC0_RX_DSCR_CNT_LAT : RO ;bitpos:[9:0] ;default: 10'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_DSCR_CNT_LAT 0x000003FF +#define SLC_SLC0_RX_DSCR_CNT_LAT_M ((SLC_SLC0_RX_DSCR_CNT_LAT_V)<<(SLC_SLC0_RX_DSCR_CNT_LAT_S)) +#define SLC_SLC0_RX_DSCR_CNT_LAT_V 0x3FF +#define SLC_SLC0_RX_DSCR_CNT_LAT_S 0 + +#define SLC_0_LEN_LIM_CONF_REG (DR_REG_SLC_BASE + 0x138) +/* SLC_SLC0_LEN_LIM : R/W ;bitpos:[19:0] ;default: 20'h5400 ; */ +/*description: */ +#define SLC_SLC0_LEN_LIM 0x000FFFFF +#define SLC_SLC0_LEN_LIM_M ((SLC_SLC0_LEN_LIM_V)<<(SLC_SLC0_LEN_LIM_S)) +#define SLC_SLC0_LEN_LIM_V 0xFFFFF +#define SLC_SLC0_LEN_LIM_S 0 + +#define SLC_0INT_ST1_REG (DR_REG_SLC_BASE + 0x13C) +/* SLC_SLC0_RX_QUICK_EOF_INT_ST1 : RO ;bitpos:[26] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_QUICK_EOF_INT_ST1 (BIT(26)) +#define SLC_SLC0_RX_QUICK_EOF_INT_ST1_M (BIT(26)) +#define SLC_SLC0_RX_QUICK_EOF_INT_ST1_V 0x1 +#define SLC_SLC0_RX_QUICK_EOF_INT_ST1_S 26 +/* SLC_CMD_DTC_INT_ST1 : RO ;bitpos:[25] ;default: 1'b0 ; */ +/*description: */ +#define SLC_CMD_DTC_INT_ST1 (BIT(25)) +#define SLC_CMD_DTC_INT_ST1_M (BIT(25)) +#define SLC_CMD_DTC_INT_ST1_V 0x1 +#define SLC_CMD_DTC_INT_ST1_S 25 +/* SLC_SLC0_TX_ERR_EOF_INT_ST1 : RO ;bitpos:[24] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_ERR_EOF_INT_ST1 (BIT(24)) +#define SLC_SLC0_TX_ERR_EOF_INT_ST1_M (BIT(24)) +#define SLC_SLC0_TX_ERR_EOF_INT_ST1_V 0x1 +#define SLC_SLC0_TX_ERR_EOF_INT_ST1_S 24 +/* SLC_SLC0_WR_RETRY_DONE_INT_ST1 : RO ;bitpos:[23] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_WR_RETRY_DONE_INT_ST1 (BIT(23)) +#define SLC_SLC0_WR_RETRY_DONE_INT_ST1_M (BIT(23)) +#define SLC_SLC0_WR_RETRY_DONE_INT_ST1_V 0x1 +#define SLC_SLC0_WR_RETRY_DONE_INT_ST1_S 23 +/* SLC_SLC0_HOST_RD_ACK_INT_ST1 : RO ;bitpos:[22] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_HOST_RD_ACK_INT_ST1 (BIT(22)) +#define SLC_SLC0_HOST_RD_ACK_INT_ST1_M (BIT(22)) +#define SLC_SLC0_HOST_RD_ACK_INT_ST1_V 0x1 +#define SLC_SLC0_HOST_RD_ACK_INT_ST1_S 22 +/* SLC_SLC0_TX_DSCR_EMPTY_INT_ST1 : RO ;bitpos:[21] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_DSCR_EMPTY_INT_ST1 (BIT(21)) +#define SLC_SLC0_TX_DSCR_EMPTY_INT_ST1_M (BIT(21)) +#define SLC_SLC0_TX_DSCR_EMPTY_INT_ST1_V 0x1 +#define SLC_SLC0_TX_DSCR_EMPTY_INT_ST1_S 21 +/* SLC_SLC0_RX_DSCR_ERR_INT_ST1 : RO ;bitpos:[20] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_DSCR_ERR_INT_ST1 (BIT(20)) +#define SLC_SLC0_RX_DSCR_ERR_INT_ST1_M (BIT(20)) +#define SLC_SLC0_RX_DSCR_ERR_INT_ST1_V 0x1 +#define SLC_SLC0_RX_DSCR_ERR_INT_ST1_S 20 +/* SLC_SLC0_TX_DSCR_ERR_INT_ST1 : RO ;bitpos:[19] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_DSCR_ERR_INT_ST1 (BIT(19)) +#define SLC_SLC0_TX_DSCR_ERR_INT_ST1_M (BIT(19)) +#define SLC_SLC0_TX_DSCR_ERR_INT_ST1_V 0x1 +#define SLC_SLC0_TX_DSCR_ERR_INT_ST1_S 19 +/* SLC_SLC0_TOHOST_INT_ST1 : RO ;bitpos:[18] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TOHOST_INT_ST1 (BIT(18)) +#define SLC_SLC0_TOHOST_INT_ST1_M (BIT(18)) +#define SLC_SLC0_TOHOST_INT_ST1_V 0x1 +#define SLC_SLC0_TOHOST_INT_ST1_S 18 +/* SLC_SLC0_RX_EOF_INT_ST1 : RO ;bitpos:[17] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_EOF_INT_ST1 (BIT(17)) +#define SLC_SLC0_RX_EOF_INT_ST1_M (BIT(17)) +#define SLC_SLC0_RX_EOF_INT_ST1_V 0x1 +#define SLC_SLC0_RX_EOF_INT_ST1_S 17 +/* SLC_SLC0_RX_DONE_INT_ST1 : RO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_DONE_INT_ST1 (BIT(16)) +#define SLC_SLC0_RX_DONE_INT_ST1_M (BIT(16)) +#define SLC_SLC0_RX_DONE_INT_ST1_V 0x1 +#define SLC_SLC0_RX_DONE_INT_ST1_S 16 +/* SLC_SLC0_TX_SUC_EOF_INT_ST1 : RO ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_SUC_EOF_INT_ST1 (BIT(15)) +#define SLC_SLC0_TX_SUC_EOF_INT_ST1_M (BIT(15)) +#define SLC_SLC0_TX_SUC_EOF_INT_ST1_V 0x1 +#define SLC_SLC0_TX_SUC_EOF_INT_ST1_S 15 +/* SLC_SLC0_TX_DONE_INT_ST1 : RO ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_DONE_INT_ST1 (BIT(14)) +#define SLC_SLC0_TX_DONE_INT_ST1_M (BIT(14)) +#define SLC_SLC0_TX_DONE_INT_ST1_V 0x1 +#define SLC_SLC0_TX_DONE_INT_ST1_S 14 +/* SLC_SLC0_TOKEN1_1TO0_INT_ST1 : RO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TOKEN1_1TO0_INT_ST1 (BIT(13)) +#define SLC_SLC0_TOKEN1_1TO0_INT_ST1_M (BIT(13)) +#define SLC_SLC0_TOKEN1_1TO0_INT_ST1_V 0x1 +#define SLC_SLC0_TOKEN1_1TO0_INT_ST1_S 13 +/* SLC_SLC0_TOKEN0_1TO0_INT_ST1 : RO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TOKEN0_1TO0_INT_ST1 (BIT(12)) +#define SLC_SLC0_TOKEN0_1TO0_INT_ST1_M (BIT(12)) +#define SLC_SLC0_TOKEN0_1TO0_INT_ST1_V 0x1 +#define SLC_SLC0_TOKEN0_1TO0_INT_ST1_S 12 +/* SLC_SLC0_TX_OVF_INT_ST1 : RO ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_OVF_INT_ST1 (BIT(11)) +#define SLC_SLC0_TX_OVF_INT_ST1_M (BIT(11)) +#define SLC_SLC0_TX_OVF_INT_ST1_V 0x1 +#define SLC_SLC0_TX_OVF_INT_ST1_S 11 +/* SLC_SLC0_RX_UDF_INT_ST1 : RO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_UDF_INT_ST1 (BIT(10)) +#define SLC_SLC0_RX_UDF_INT_ST1_M (BIT(10)) +#define SLC_SLC0_RX_UDF_INT_ST1_V 0x1 +#define SLC_SLC0_RX_UDF_INT_ST1_S 10 +/* SLC_SLC0_TX_START_INT_ST1 : RO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_START_INT_ST1 (BIT(9)) +#define SLC_SLC0_TX_START_INT_ST1_M (BIT(9)) +#define SLC_SLC0_TX_START_INT_ST1_V 0x1 +#define SLC_SLC0_TX_START_INT_ST1_S 9 +/* SLC_SLC0_RX_START_INT_ST1 : RO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_START_INT_ST1 (BIT(8)) +#define SLC_SLC0_RX_START_INT_ST1_M (BIT(8)) +#define SLC_SLC0_RX_START_INT_ST1_V 0x1 +#define SLC_SLC0_RX_START_INT_ST1_S 8 +/* SLC_FRHOST_BIT7_INT_ST1 : RO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT7_INT_ST1 (BIT(7)) +#define SLC_FRHOST_BIT7_INT_ST1_M (BIT(7)) +#define SLC_FRHOST_BIT7_INT_ST1_V 0x1 +#define SLC_FRHOST_BIT7_INT_ST1_S 7 +/* SLC_FRHOST_BIT6_INT_ST1 : RO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT6_INT_ST1 (BIT(6)) +#define SLC_FRHOST_BIT6_INT_ST1_M (BIT(6)) +#define SLC_FRHOST_BIT6_INT_ST1_V 0x1 +#define SLC_FRHOST_BIT6_INT_ST1_S 6 +/* SLC_FRHOST_BIT5_INT_ST1 : RO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT5_INT_ST1 (BIT(5)) +#define SLC_FRHOST_BIT5_INT_ST1_M (BIT(5)) +#define SLC_FRHOST_BIT5_INT_ST1_V 0x1 +#define SLC_FRHOST_BIT5_INT_ST1_S 5 +/* SLC_FRHOST_BIT4_INT_ST1 : RO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT4_INT_ST1 (BIT(4)) +#define SLC_FRHOST_BIT4_INT_ST1_M (BIT(4)) +#define SLC_FRHOST_BIT4_INT_ST1_V 0x1 +#define SLC_FRHOST_BIT4_INT_ST1_S 4 +/* SLC_FRHOST_BIT3_INT_ST1 : RO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT3_INT_ST1 (BIT(3)) +#define SLC_FRHOST_BIT3_INT_ST1_M (BIT(3)) +#define SLC_FRHOST_BIT3_INT_ST1_V 0x1 +#define SLC_FRHOST_BIT3_INT_ST1_S 3 +/* SLC_FRHOST_BIT2_INT_ST1 : RO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT2_INT_ST1 (BIT(2)) +#define SLC_FRHOST_BIT2_INT_ST1_M (BIT(2)) +#define SLC_FRHOST_BIT2_INT_ST1_V 0x1 +#define SLC_FRHOST_BIT2_INT_ST1_S 2 +/* SLC_FRHOST_BIT1_INT_ST1 : RO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT1_INT_ST1 (BIT(1)) +#define SLC_FRHOST_BIT1_INT_ST1_M (BIT(1)) +#define SLC_FRHOST_BIT1_INT_ST1_V 0x1 +#define SLC_FRHOST_BIT1_INT_ST1_S 1 +/* SLC_FRHOST_BIT0_INT_ST1 : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT0_INT_ST1 (BIT(0)) +#define SLC_FRHOST_BIT0_INT_ST1_M (BIT(0)) +#define SLC_FRHOST_BIT0_INT_ST1_V 0x1 +#define SLC_FRHOST_BIT0_INT_ST1_S 0 + +#define SLC_0INT_ENA1_REG (DR_REG_SLC_BASE + 0x140) +/* SLC_SLC0_RX_QUICK_EOF_INT_ENA1 : R/W ;bitpos:[26] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_QUICK_EOF_INT_ENA1 (BIT(26)) +#define SLC_SLC0_RX_QUICK_EOF_INT_ENA1_M (BIT(26)) +#define SLC_SLC0_RX_QUICK_EOF_INT_ENA1_V 0x1 +#define SLC_SLC0_RX_QUICK_EOF_INT_ENA1_S 26 +/* SLC_CMD_DTC_INT_ENA1 : R/W ;bitpos:[25] ;default: 1'b0 ; */ +/*description: */ +#define SLC_CMD_DTC_INT_ENA1 (BIT(25)) +#define SLC_CMD_DTC_INT_ENA1_M (BIT(25)) +#define SLC_CMD_DTC_INT_ENA1_V 0x1 +#define SLC_CMD_DTC_INT_ENA1_S 25 +/* SLC_SLC0_TX_ERR_EOF_INT_ENA1 : R/W ;bitpos:[24] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_ERR_EOF_INT_ENA1 (BIT(24)) +#define SLC_SLC0_TX_ERR_EOF_INT_ENA1_M (BIT(24)) +#define SLC_SLC0_TX_ERR_EOF_INT_ENA1_V 0x1 +#define SLC_SLC0_TX_ERR_EOF_INT_ENA1_S 24 +/* SLC_SLC0_WR_RETRY_DONE_INT_ENA1 : R/W ;bitpos:[23] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_WR_RETRY_DONE_INT_ENA1 (BIT(23)) +#define SLC_SLC0_WR_RETRY_DONE_INT_ENA1_M (BIT(23)) +#define SLC_SLC0_WR_RETRY_DONE_INT_ENA1_V 0x1 +#define SLC_SLC0_WR_RETRY_DONE_INT_ENA1_S 23 +/* SLC_SLC0_HOST_RD_ACK_INT_ENA1 : R/W ;bitpos:[22] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_HOST_RD_ACK_INT_ENA1 (BIT(22)) +#define SLC_SLC0_HOST_RD_ACK_INT_ENA1_M (BIT(22)) +#define SLC_SLC0_HOST_RD_ACK_INT_ENA1_V 0x1 +#define SLC_SLC0_HOST_RD_ACK_INT_ENA1_S 22 +/* SLC_SLC0_TX_DSCR_EMPTY_INT_ENA1 : R/W ;bitpos:[21] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_DSCR_EMPTY_INT_ENA1 (BIT(21)) +#define SLC_SLC0_TX_DSCR_EMPTY_INT_ENA1_M (BIT(21)) +#define SLC_SLC0_TX_DSCR_EMPTY_INT_ENA1_V 0x1 +#define SLC_SLC0_TX_DSCR_EMPTY_INT_ENA1_S 21 +/* SLC_SLC0_RX_DSCR_ERR_INT_ENA1 : R/W ;bitpos:[20] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_DSCR_ERR_INT_ENA1 (BIT(20)) +#define SLC_SLC0_RX_DSCR_ERR_INT_ENA1_M (BIT(20)) +#define SLC_SLC0_RX_DSCR_ERR_INT_ENA1_V 0x1 +#define SLC_SLC0_RX_DSCR_ERR_INT_ENA1_S 20 +/* SLC_SLC0_TX_DSCR_ERR_INT_ENA1 : R/W ;bitpos:[19] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_DSCR_ERR_INT_ENA1 (BIT(19)) +#define SLC_SLC0_TX_DSCR_ERR_INT_ENA1_M (BIT(19)) +#define SLC_SLC0_TX_DSCR_ERR_INT_ENA1_V 0x1 +#define SLC_SLC0_TX_DSCR_ERR_INT_ENA1_S 19 +/* SLC_SLC0_TOHOST_INT_ENA1 : R/W ;bitpos:[18] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TOHOST_INT_ENA1 (BIT(18)) +#define SLC_SLC0_TOHOST_INT_ENA1_M (BIT(18)) +#define SLC_SLC0_TOHOST_INT_ENA1_V 0x1 +#define SLC_SLC0_TOHOST_INT_ENA1_S 18 +/* SLC_SLC0_RX_EOF_INT_ENA1 : R/W ;bitpos:[17] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_EOF_INT_ENA1 (BIT(17)) +#define SLC_SLC0_RX_EOF_INT_ENA1_M (BIT(17)) +#define SLC_SLC0_RX_EOF_INT_ENA1_V 0x1 +#define SLC_SLC0_RX_EOF_INT_ENA1_S 17 +/* SLC_SLC0_RX_DONE_INT_ENA1 : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_DONE_INT_ENA1 (BIT(16)) +#define SLC_SLC0_RX_DONE_INT_ENA1_M (BIT(16)) +#define SLC_SLC0_RX_DONE_INT_ENA1_V 0x1 +#define SLC_SLC0_RX_DONE_INT_ENA1_S 16 +/* SLC_SLC0_TX_SUC_EOF_INT_ENA1 : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_SUC_EOF_INT_ENA1 (BIT(15)) +#define SLC_SLC0_TX_SUC_EOF_INT_ENA1_M (BIT(15)) +#define SLC_SLC0_TX_SUC_EOF_INT_ENA1_V 0x1 +#define SLC_SLC0_TX_SUC_EOF_INT_ENA1_S 15 +/* SLC_SLC0_TX_DONE_INT_ENA1 : R/W ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_DONE_INT_ENA1 (BIT(14)) +#define SLC_SLC0_TX_DONE_INT_ENA1_M (BIT(14)) +#define SLC_SLC0_TX_DONE_INT_ENA1_V 0x1 +#define SLC_SLC0_TX_DONE_INT_ENA1_S 14 +/* SLC_SLC0_TOKEN1_1TO0_INT_ENA1 : R/W ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TOKEN1_1TO0_INT_ENA1 (BIT(13)) +#define SLC_SLC0_TOKEN1_1TO0_INT_ENA1_M (BIT(13)) +#define SLC_SLC0_TOKEN1_1TO0_INT_ENA1_V 0x1 +#define SLC_SLC0_TOKEN1_1TO0_INT_ENA1_S 13 +/* SLC_SLC0_TOKEN0_1TO0_INT_ENA1 : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TOKEN0_1TO0_INT_ENA1 (BIT(12)) +#define SLC_SLC0_TOKEN0_1TO0_INT_ENA1_M (BIT(12)) +#define SLC_SLC0_TOKEN0_1TO0_INT_ENA1_V 0x1 +#define SLC_SLC0_TOKEN0_1TO0_INT_ENA1_S 12 +/* SLC_SLC0_TX_OVF_INT_ENA1 : R/W ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_OVF_INT_ENA1 (BIT(11)) +#define SLC_SLC0_TX_OVF_INT_ENA1_M (BIT(11)) +#define SLC_SLC0_TX_OVF_INT_ENA1_V 0x1 +#define SLC_SLC0_TX_OVF_INT_ENA1_S 11 +/* SLC_SLC0_RX_UDF_INT_ENA1 : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_UDF_INT_ENA1 (BIT(10)) +#define SLC_SLC0_RX_UDF_INT_ENA1_M (BIT(10)) +#define SLC_SLC0_RX_UDF_INT_ENA1_V 0x1 +#define SLC_SLC0_RX_UDF_INT_ENA1_S 10 +/* SLC_SLC0_TX_START_INT_ENA1 : R/W ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_TX_START_INT_ENA1 (BIT(9)) +#define SLC_SLC0_TX_START_INT_ENA1_M (BIT(9)) +#define SLC_SLC0_TX_START_INT_ENA1_V 0x1 +#define SLC_SLC0_TX_START_INT_ENA1_S 9 +/* SLC_SLC0_RX_START_INT_ENA1 : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC0_RX_START_INT_ENA1 (BIT(8)) +#define SLC_SLC0_RX_START_INT_ENA1_M (BIT(8)) +#define SLC_SLC0_RX_START_INT_ENA1_V 0x1 +#define SLC_SLC0_RX_START_INT_ENA1_S 8 +/* SLC_FRHOST_BIT7_INT_ENA1 : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT7_INT_ENA1 (BIT(7)) +#define SLC_FRHOST_BIT7_INT_ENA1_M (BIT(7)) +#define SLC_FRHOST_BIT7_INT_ENA1_V 0x1 +#define SLC_FRHOST_BIT7_INT_ENA1_S 7 +/* SLC_FRHOST_BIT6_INT_ENA1 : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT6_INT_ENA1 (BIT(6)) +#define SLC_FRHOST_BIT6_INT_ENA1_M (BIT(6)) +#define SLC_FRHOST_BIT6_INT_ENA1_V 0x1 +#define SLC_FRHOST_BIT6_INT_ENA1_S 6 +/* SLC_FRHOST_BIT5_INT_ENA1 : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT5_INT_ENA1 (BIT(5)) +#define SLC_FRHOST_BIT5_INT_ENA1_M (BIT(5)) +#define SLC_FRHOST_BIT5_INT_ENA1_V 0x1 +#define SLC_FRHOST_BIT5_INT_ENA1_S 5 +/* SLC_FRHOST_BIT4_INT_ENA1 : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT4_INT_ENA1 (BIT(4)) +#define SLC_FRHOST_BIT4_INT_ENA1_M (BIT(4)) +#define SLC_FRHOST_BIT4_INT_ENA1_V 0x1 +#define SLC_FRHOST_BIT4_INT_ENA1_S 4 +/* SLC_FRHOST_BIT3_INT_ENA1 : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT3_INT_ENA1 (BIT(3)) +#define SLC_FRHOST_BIT3_INT_ENA1_M (BIT(3)) +#define SLC_FRHOST_BIT3_INT_ENA1_V 0x1 +#define SLC_FRHOST_BIT3_INT_ENA1_S 3 +/* SLC_FRHOST_BIT2_INT_ENA1 : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT2_INT_ENA1 (BIT(2)) +#define SLC_FRHOST_BIT2_INT_ENA1_M (BIT(2)) +#define SLC_FRHOST_BIT2_INT_ENA1_V 0x1 +#define SLC_FRHOST_BIT2_INT_ENA1_S 2 +/* SLC_FRHOST_BIT1_INT_ENA1 : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT1_INT_ENA1 (BIT(1)) +#define SLC_FRHOST_BIT1_INT_ENA1_M (BIT(1)) +#define SLC_FRHOST_BIT1_INT_ENA1_V 0x1 +#define SLC_FRHOST_BIT1_INT_ENA1_S 1 +/* SLC_FRHOST_BIT0_INT_ENA1 : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT0_INT_ENA1 (BIT(0)) +#define SLC_FRHOST_BIT0_INT_ENA1_M (BIT(0)) +#define SLC_FRHOST_BIT0_INT_ENA1_V 0x1 +#define SLC_FRHOST_BIT0_INT_ENA1_S 0 + +#define SLC_1INT_ST1_REG (DR_REG_SLC_BASE + 0x144) +/* SLC_SLC1_TX_ERR_EOF_INT_ST1 : RO ;bitpos:[24] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_ERR_EOF_INT_ST1 (BIT(24)) +#define SLC_SLC1_TX_ERR_EOF_INT_ST1_M (BIT(24)) +#define SLC_SLC1_TX_ERR_EOF_INT_ST1_V 0x1 +#define SLC_SLC1_TX_ERR_EOF_INT_ST1_S 24 +/* SLC_SLC1_WR_RETRY_DONE_INT_ST1 : RO ;bitpos:[23] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_WR_RETRY_DONE_INT_ST1 (BIT(23)) +#define SLC_SLC1_WR_RETRY_DONE_INT_ST1_M (BIT(23)) +#define SLC_SLC1_WR_RETRY_DONE_INT_ST1_V 0x1 +#define SLC_SLC1_WR_RETRY_DONE_INT_ST1_S 23 +/* SLC_SLC1_HOST_RD_ACK_INT_ST1 : RO ;bitpos:[22] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_HOST_RD_ACK_INT_ST1 (BIT(22)) +#define SLC_SLC1_HOST_RD_ACK_INT_ST1_M (BIT(22)) +#define SLC_SLC1_HOST_RD_ACK_INT_ST1_V 0x1 +#define SLC_SLC1_HOST_RD_ACK_INT_ST1_S 22 +/* SLC_SLC1_TX_DSCR_EMPTY_INT_ST1 : RO ;bitpos:[21] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_DSCR_EMPTY_INT_ST1 (BIT(21)) +#define SLC_SLC1_TX_DSCR_EMPTY_INT_ST1_M (BIT(21)) +#define SLC_SLC1_TX_DSCR_EMPTY_INT_ST1_V 0x1 +#define SLC_SLC1_TX_DSCR_EMPTY_INT_ST1_S 21 +/* SLC_SLC1_RX_DSCR_ERR_INT_ST1 : RO ;bitpos:[20] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_DSCR_ERR_INT_ST1 (BIT(20)) +#define SLC_SLC1_RX_DSCR_ERR_INT_ST1_M (BIT(20)) +#define SLC_SLC1_RX_DSCR_ERR_INT_ST1_V 0x1 +#define SLC_SLC1_RX_DSCR_ERR_INT_ST1_S 20 +/* SLC_SLC1_TX_DSCR_ERR_INT_ST1 : RO ;bitpos:[19] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_DSCR_ERR_INT_ST1 (BIT(19)) +#define SLC_SLC1_TX_DSCR_ERR_INT_ST1_M (BIT(19)) +#define SLC_SLC1_TX_DSCR_ERR_INT_ST1_V 0x1 +#define SLC_SLC1_TX_DSCR_ERR_INT_ST1_S 19 +/* SLC_SLC1_TOHOST_INT_ST1 : RO ;bitpos:[18] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TOHOST_INT_ST1 (BIT(18)) +#define SLC_SLC1_TOHOST_INT_ST1_M (BIT(18)) +#define SLC_SLC1_TOHOST_INT_ST1_V 0x1 +#define SLC_SLC1_TOHOST_INT_ST1_S 18 +/* SLC_SLC1_RX_EOF_INT_ST1 : RO ;bitpos:[17] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_EOF_INT_ST1 (BIT(17)) +#define SLC_SLC1_RX_EOF_INT_ST1_M (BIT(17)) +#define SLC_SLC1_RX_EOF_INT_ST1_V 0x1 +#define SLC_SLC1_RX_EOF_INT_ST1_S 17 +/* SLC_SLC1_RX_DONE_INT_ST1 : RO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_DONE_INT_ST1 (BIT(16)) +#define SLC_SLC1_RX_DONE_INT_ST1_M (BIT(16)) +#define SLC_SLC1_RX_DONE_INT_ST1_V 0x1 +#define SLC_SLC1_RX_DONE_INT_ST1_S 16 +/* SLC_SLC1_TX_SUC_EOF_INT_ST1 : RO ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_SUC_EOF_INT_ST1 (BIT(15)) +#define SLC_SLC1_TX_SUC_EOF_INT_ST1_M (BIT(15)) +#define SLC_SLC1_TX_SUC_EOF_INT_ST1_V 0x1 +#define SLC_SLC1_TX_SUC_EOF_INT_ST1_S 15 +/* SLC_SLC1_TX_DONE_INT_ST1 : RO ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_DONE_INT_ST1 (BIT(14)) +#define SLC_SLC1_TX_DONE_INT_ST1_M (BIT(14)) +#define SLC_SLC1_TX_DONE_INT_ST1_V 0x1 +#define SLC_SLC1_TX_DONE_INT_ST1_S 14 +/* SLC_SLC1_TOKEN1_1TO0_INT_ST1 : RO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TOKEN1_1TO0_INT_ST1 (BIT(13)) +#define SLC_SLC1_TOKEN1_1TO0_INT_ST1_M (BIT(13)) +#define SLC_SLC1_TOKEN1_1TO0_INT_ST1_V 0x1 +#define SLC_SLC1_TOKEN1_1TO0_INT_ST1_S 13 +/* SLC_SLC1_TOKEN0_1TO0_INT_ST1 : RO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TOKEN0_1TO0_INT_ST1 (BIT(12)) +#define SLC_SLC1_TOKEN0_1TO0_INT_ST1_M (BIT(12)) +#define SLC_SLC1_TOKEN0_1TO0_INT_ST1_V 0x1 +#define SLC_SLC1_TOKEN0_1TO0_INT_ST1_S 12 +/* SLC_SLC1_TX_OVF_INT_ST1 : RO ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_OVF_INT_ST1 (BIT(11)) +#define SLC_SLC1_TX_OVF_INT_ST1_M (BIT(11)) +#define SLC_SLC1_TX_OVF_INT_ST1_V 0x1 +#define SLC_SLC1_TX_OVF_INT_ST1_S 11 +/* SLC_SLC1_RX_UDF_INT_ST1 : RO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_UDF_INT_ST1 (BIT(10)) +#define SLC_SLC1_RX_UDF_INT_ST1_M (BIT(10)) +#define SLC_SLC1_RX_UDF_INT_ST1_V 0x1 +#define SLC_SLC1_RX_UDF_INT_ST1_S 10 +/* SLC_SLC1_TX_START_INT_ST1 : RO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_START_INT_ST1 (BIT(9)) +#define SLC_SLC1_TX_START_INT_ST1_M (BIT(9)) +#define SLC_SLC1_TX_START_INT_ST1_V 0x1 +#define SLC_SLC1_TX_START_INT_ST1_S 9 +/* SLC_SLC1_RX_START_INT_ST1 : RO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_START_INT_ST1 (BIT(8)) +#define SLC_SLC1_RX_START_INT_ST1_M (BIT(8)) +#define SLC_SLC1_RX_START_INT_ST1_V 0x1 +#define SLC_SLC1_RX_START_INT_ST1_S 8 +/* SLC_FRHOST_BIT15_INT_ST1 : RO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT15_INT_ST1 (BIT(7)) +#define SLC_FRHOST_BIT15_INT_ST1_M (BIT(7)) +#define SLC_FRHOST_BIT15_INT_ST1_V 0x1 +#define SLC_FRHOST_BIT15_INT_ST1_S 7 +/* SLC_FRHOST_BIT14_INT_ST1 : RO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT14_INT_ST1 (BIT(6)) +#define SLC_FRHOST_BIT14_INT_ST1_M (BIT(6)) +#define SLC_FRHOST_BIT14_INT_ST1_V 0x1 +#define SLC_FRHOST_BIT14_INT_ST1_S 6 +/* SLC_FRHOST_BIT13_INT_ST1 : RO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT13_INT_ST1 (BIT(5)) +#define SLC_FRHOST_BIT13_INT_ST1_M (BIT(5)) +#define SLC_FRHOST_BIT13_INT_ST1_V 0x1 +#define SLC_FRHOST_BIT13_INT_ST1_S 5 +/* SLC_FRHOST_BIT12_INT_ST1 : RO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT12_INT_ST1 (BIT(4)) +#define SLC_FRHOST_BIT12_INT_ST1_M (BIT(4)) +#define SLC_FRHOST_BIT12_INT_ST1_V 0x1 +#define SLC_FRHOST_BIT12_INT_ST1_S 4 +/* SLC_FRHOST_BIT11_INT_ST1 : RO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT11_INT_ST1 (BIT(3)) +#define SLC_FRHOST_BIT11_INT_ST1_M (BIT(3)) +#define SLC_FRHOST_BIT11_INT_ST1_V 0x1 +#define SLC_FRHOST_BIT11_INT_ST1_S 3 +/* SLC_FRHOST_BIT10_INT_ST1 : RO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT10_INT_ST1 (BIT(2)) +#define SLC_FRHOST_BIT10_INT_ST1_M (BIT(2)) +#define SLC_FRHOST_BIT10_INT_ST1_V 0x1 +#define SLC_FRHOST_BIT10_INT_ST1_S 2 +/* SLC_FRHOST_BIT9_INT_ST1 : RO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT9_INT_ST1 (BIT(1)) +#define SLC_FRHOST_BIT9_INT_ST1_M (BIT(1)) +#define SLC_FRHOST_BIT9_INT_ST1_V 0x1 +#define SLC_FRHOST_BIT9_INT_ST1_S 1 +/* SLC_FRHOST_BIT8_INT_ST1 : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT8_INT_ST1 (BIT(0)) +#define SLC_FRHOST_BIT8_INT_ST1_M (BIT(0)) +#define SLC_FRHOST_BIT8_INT_ST1_V 0x1 +#define SLC_FRHOST_BIT8_INT_ST1_S 0 + +#define SLC_1INT_ENA1_REG (DR_REG_SLC_BASE + 0x148) +/* SLC_SLC1_TX_ERR_EOF_INT_ENA1 : R/W ;bitpos:[24] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_ERR_EOF_INT_ENA1 (BIT(24)) +#define SLC_SLC1_TX_ERR_EOF_INT_ENA1_M (BIT(24)) +#define SLC_SLC1_TX_ERR_EOF_INT_ENA1_V 0x1 +#define SLC_SLC1_TX_ERR_EOF_INT_ENA1_S 24 +/* SLC_SLC1_WR_RETRY_DONE_INT_ENA1 : R/W ;bitpos:[23] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_WR_RETRY_DONE_INT_ENA1 (BIT(23)) +#define SLC_SLC1_WR_RETRY_DONE_INT_ENA1_M (BIT(23)) +#define SLC_SLC1_WR_RETRY_DONE_INT_ENA1_V 0x1 +#define SLC_SLC1_WR_RETRY_DONE_INT_ENA1_S 23 +/* SLC_SLC1_HOST_RD_ACK_INT_ENA1 : R/W ;bitpos:[22] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_HOST_RD_ACK_INT_ENA1 (BIT(22)) +#define SLC_SLC1_HOST_RD_ACK_INT_ENA1_M (BIT(22)) +#define SLC_SLC1_HOST_RD_ACK_INT_ENA1_V 0x1 +#define SLC_SLC1_HOST_RD_ACK_INT_ENA1_S 22 +/* SLC_SLC1_TX_DSCR_EMPTY_INT_ENA1 : R/W ;bitpos:[21] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_DSCR_EMPTY_INT_ENA1 (BIT(21)) +#define SLC_SLC1_TX_DSCR_EMPTY_INT_ENA1_M (BIT(21)) +#define SLC_SLC1_TX_DSCR_EMPTY_INT_ENA1_V 0x1 +#define SLC_SLC1_TX_DSCR_EMPTY_INT_ENA1_S 21 +/* SLC_SLC1_RX_DSCR_ERR_INT_ENA1 : R/W ;bitpos:[20] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_DSCR_ERR_INT_ENA1 (BIT(20)) +#define SLC_SLC1_RX_DSCR_ERR_INT_ENA1_M (BIT(20)) +#define SLC_SLC1_RX_DSCR_ERR_INT_ENA1_V 0x1 +#define SLC_SLC1_RX_DSCR_ERR_INT_ENA1_S 20 +/* SLC_SLC1_TX_DSCR_ERR_INT_ENA1 : R/W ;bitpos:[19] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_DSCR_ERR_INT_ENA1 (BIT(19)) +#define SLC_SLC1_TX_DSCR_ERR_INT_ENA1_M (BIT(19)) +#define SLC_SLC1_TX_DSCR_ERR_INT_ENA1_V 0x1 +#define SLC_SLC1_TX_DSCR_ERR_INT_ENA1_S 19 +/* SLC_SLC1_TOHOST_INT_ENA1 : R/W ;bitpos:[18] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TOHOST_INT_ENA1 (BIT(18)) +#define SLC_SLC1_TOHOST_INT_ENA1_M (BIT(18)) +#define SLC_SLC1_TOHOST_INT_ENA1_V 0x1 +#define SLC_SLC1_TOHOST_INT_ENA1_S 18 +/* SLC_SLC1_RX_EOF_INT_ENA1 : R/W ;bitpos:[17] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_EOF_INT_ENA1 (BIT(17)) +#define SLC_SLC1_RX_EOF_INT_ENA1_M (BIT(17)) +#define SLC_SLC1_RX_EOF_INT_ENA1_V 0x1 +#define SLC_SLC1_RX_EOF_INT_ENA1_S 17 +/* SLC_SLC1_RX_DONE_INT_ENA1 : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_DONE_INT_ENA1 (BIT(16)) +#define SLC_SLC1_RX_DONE_INT_ENA1_M (BIT(16)) +#define SLC_SLC1_RX_DONE_INT_ENA1_V 0x1 +#define SLC_SLC1_RX_DONE_INT_ENA1_S 16 +/* SLC_SLC1_TX_SUC_EOF_INT_ENA1 : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_SUC_EOF_INT_ENA1 (BIT(15)) +#define SLC_SLC1_TX_SUC_EOF_INT_ENA1_M (BIT(15)) +#define SLC_SLC1_TX_SUC_EOF_INT_ENA1_V 0x1 +#define SLC_SLC1_TX_SUC_EOF_INT_ENA1_S 15 +/* SLC_SLC1_TX_DONE_INT_ENA1 : R/W ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_DONE_INT_ENA1 (BIT(14)) +#define SLC_SLC1_TX_DONE_INT_ENA1_M (BIT(14)) +#define SLC_SLC1_TX_DONE_INT_ENA1_V 0x1 +#define SLC_SLC1_TX_DONE_INT_ENA1_S 14 +/* SLC_SLC1_TOKEN1_1TO0_INT_ENA1 : R/W ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TOKEN1_1TO0_INT_ENA1 (BIT(13)) +#define SLC_SLC1_TOKEN1_1TO0_INT_ENA1_M (BIT(13)) +#define SLC_SLC1_TOKEN1_1TO0_INT_ENA1_V 0x1 +#define SLC_SLC1_TOKEN1_1TO0_INT_ENA1_S 13 +/* SLC_SLC1_TOKEN0_1TO0_INT_ENA1 : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TOKEN0_1TO0_INT_ENA1 (BIT(12)) +#define SLC_SLC1_TOKEN0_1TO0_INT_ENA1_M (BIT(12)) +#define SLC_SLC1_TOKEN0_1TO0_INT_ENA1_V 0x1 +#define SLC_SLC1_TOKEN0_1TO0_INT_ENA1_S 12 +/* SLC_SLC1_TX_OVF_INT_ENA1 : R/W ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_OVF_INT_ENA1 (BIT(11)) +#define SLC_SLC1_TX_OVF_INT_ENA1_M (BIT(11)) +#define SLC_SLC1_TX_OVF_INT_ENA1_V 0x1 +#define SLC_SLC1_TX_OVF_INT_ENA1_S 11 +/* SLC_SLC1_RX_UDF_INT_ENA1 : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_UDF_INT_ENA1 (BIT(10)) +#define SLC_SLC1_RX_UDF_INT_ENA1_M (BIT(10)) +#define SLC_SLC1_RX_UDF_INT_ENA1_V 0x1 +#define SLC_SLC1_RX_UDF_INT_ENA1_S 10 +/* SLC_SLC1_TX_START_INT_ENA1 : R/W ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_TX_START_INT_ENA1 (BIT(9)) +#define SLC_SLC1_TX_START_INT_ENA1_M (BIT(9)) +#define SLC_SLC1_TX_START_INT_ENA1_V 0x1 +#define SLC_SLC1_TX_START_INT_ENA1_S 9 +/* SLC_SLC1_RX_START_INT_ENA1 : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define SLC_SLC1_RX_START_INT_ENA1 (BIT(8)) +#define SLC_SLC1_RX_START_INT_ENA1_M (BIT(8)) +#define SLC_SLC1_RX_START_INT_ENA1_V 0x1 +#define SLC_SLC1_RX_START_INT_ENA1_S 8 +/* SLC_FRHOST_BIT15_INT_ENA1 : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT15_INT_ENA1 (BIT(7)) +#define SLC_FRHOST_BIT15_INT_ENA1_M (BIT(7)) +#define SLC_FRHOST_BIT15_INT_ENA1_V 0x1 +#define SLC_FRHOST_BIT15_INT_ENA1_S 7 +/* SLC_FRHOST_BIT14_INT_ENA1 : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT14_INT_ENA1 (BIT(6)) +#define SLC_FRHOST_BIT14_INT_ENA1_M (BIT(6)) +#define SLC_FRHOST_BIT14_INT_ENA1_V 0x1 +#define SLC_FRHOST_BIT14_INT_ENA1_S 6 +/* SLC_FRHOST_BIT13_INT_ENA1 : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT13_INT_ENA1 (BIT(5)) +#define SLC_FRHOST_BIT13_INT_ENA1_M (BIT(5)) +#define SLC_FRHOST_BIT13_INT_ENA1_V 0x1 +#define SLC_FRHOST_BIT13_INT_ENA1_S 5 +/* SLC_FRHOST_BIT12_INT_ENA1 : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT12_INT_ENA1 (BIT(4)) +#define SLC_FRHOST_BIT12_INT_ENA1_M (BIT(4)) +#define SLC_FRHOST_BIT12_INT_ENA1_V 0x1 +#define SLC_FRHOST_BIT12_INT_ENA1_S 4 +/* SLC_FRHOST_BIT11_INT_ENA1 : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT11_INT_ENA1 (BIT(3)) +#define SLC_FRHOST_BIT11_INT_ENA1_M (BIT(3)) +#define SLC_FRHOST_BIT11_INT_ENA1_V 0x1 +#define SLC_FRHOST_BIT11_INT_ENA1_S 3 +/* SLC_FRHOST_BIT10_INT_ENA1 : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT10_INT_ENA1 (BIT(2)) +#define SLC_FRHOST_BIT10_INT_ENA1_M (BIT(2)) +#define SLC_FRHOST_BIT10_INT_ENA1_V 0x1 +#define SLC_FRHOST_BIT10_INT_ENA1_S 2 +/* SLC_FRHOST_BIT9_INT_ENA1 : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT9_INT_ENA1 (BIT(1)) +#define SLC_FRHOST_BIT9_INT_ENA1_M (BIT(1)) +#define SLC_FRHOST_BIT9_INT_ENA1_V 0x1 +#define SLC_FRHOST_BIT9_INT_ENA1_S 1 +/* SLC_FRHOST_BIT8_INT_ENA1 : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define SLC_FRHOST_BIT8_INT_ENA1 (BIT(0)) +#define SLC_FRHOST_BIT8_INT_ENA1_M (BIT(0)) +#define SLC_FRHOST_BIT8_INT_ENA1_V 0x1 +#define SLC_FRHOST_BIT8_INT_ENA1_S 0 + +#define SLC_DATE_REG (DR_REG_SLC_BASE + 0x1F8) +/* SLC_DATE : R/W ;bitpos:[31:0] ;default: 32'h16022500 ; */ +/*description: */ +#define SLC_DATE 0xFFFFFFFF +#define SLC_DATE_M ((SLC_DATE_V)<<(SLC_DATE_S)) +#define SLC_DATE_V 0xFFFFFFFF +#define SLC_DATE_S 0 + +#define SLC_ID_REG (DR_REG_SLC_BASE + 0x1FC) +/* SLC_ID : R/W ;bitpos:[31:0] ;default: 32'h0100 ; */ +/*description: */ +#define SLC_ID 0xFFFFFFFF +#define SLC_ID_M ((SLC_ID_V)<<(SLC_ID_S)) +#define SLC_ID_V 0xFFFFFFFF +#define SLC_ID_S 0 + + + + +#endif /*_SOC_SLC_REG_H_ */ + + diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/slc_struct.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/slc_struct.h new file mode 100644 index 0000000000000..90edd22946df7 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/slc_struct.h @@ -0,0 +1,860 @@ +// 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. +#ifndef _SOC_SLC_STRUCT_H_ +#define _SOC_SLC_STRUCT_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef volatile struct slc_dev_s { + union { + struct { + uint32_t slc0_tx_rst: 1; + uint32_t slc0_rx_rst: 1; + uint32_t ahbm_fifo_rst: 1; + uint32_t ahbm_rst: 1; + uint32_t slc0_tx_loop_test: 1; + uint32_t slc0_rx_loop_test: 1; + uint32_t slc0_rx_auto_wrback: 1; + uint32_t slc0_rx_no_restart_clr: 1; + uint32_t slc0_rxdscr_burst_en: 1; + uint32_t slc0_rxdata_burst_en: 1; + uint32_t slc0_rxlink_auto_ret: 1; + uint32_t slc0_txlink_auto_ret: 1; + uint32_t slc0_txdscr_burst_en: 1; + uint32_t slc0_txdata_burst_en: 1; + uint32_t slc0_token_auto_clr: 1; + uint32_t slc0_token_sel: 1; + uint32_t slc1_tx_rst: 1; + uint32_t slc1_rx_rst: 1; + uint32_t slc0_wr_retry_mask_en: 1; + uint32_t slc1_wr_retry_mask_en: 1; + uint32_t slc1_tx_loop_test: 1; + uint32_t slc1_rx_loop_test: 1; + uint32_t slc1_rx_auto_wrback: 1; + uint32_t slc1_rx_no_restart_clr: 1; + uint32_t slc1_rxdscr_burst_en: 1; + uint32_t slc1_rxdata_burst_en: 1; + uint32_t slc1_rxlink_auto_ret: 1; + uint32_t slc1_txlink_auto_ret: 1; + uint32_t slc1_txdscr_burst_en: 1; + uint32_t slc1_txdata_burst_en: 1; + uint32_t slc1_token_auto_clr: 1; + uint32_t slc1_token_sel: 1; + }; + uint32_t val; + } conf0; + union { + struct { + uint32_t frhost_bit0: 1; + uint32_t frhost_bit1: 1; + uint32_t frhost_bit2: 1; + uint32_t frhost_bit3: 1; + uint32_t frhost_bit4: 1; + uint32_t frhost_bit5: 1; + uint32_t frhost_bit6: 1; + uint32_t frhost_bit7: 1; + uint32_t rx_start: 1; + uint32_t tx_start: 1; + uint32_t rx_udf: 1; + uint32_t tx_ovf: 1; + uint32_t token0_1to0: 1; + uint32_t token1_1to0: 1; + uint32_t tx_done: 1; + uint32_t tx_suc_eof: 1; + uint32_t rx_done: 1; + uint32_t rx_eof: 1; + uint32_t tohost: 1; + uint32_t tx_dscr_err: 1; + uint32_t rx_dscr_err: 1; + uint32_t tx_dscr_empty: 1; + uint32_t host_rd_ack: 1; + uint32_t wr_retry_done: 1; + uint32_t tx_err_eof: 1; + uint32_t cmd_dtc: 1; + uint32_t rx_quick_eof: 1; + uint32_t reserved27: 5; + }; + uint32_t val; + } slc0_int_raw; + union { + struct { + uint32_t frhost_bit0: 1; + uint32_t frhost_bit1: 1; + uint32_t frhost_bit2: 1; + uint32_t frhost_bit3: 1; + uint32_t frhost_bit4: 1; + uint32_t frhost_bit5: 1; + uint32_t frhost_bit6: 1; + uint32_t frhost_bit7: 1; + uint32_t rx_start: 1; + uint32_t tx_start: 1; + uint32_t rx_udf: 1; + uint32_t tx_ovf: 1; + uint32_t token0_1to0: 1; + uint32_t token1_1to0: 1; + uint32_t tx_done: 1; + uint32_t tx_suc_eof: 1; + uint32_t rx_done: 1; + uint32_t rx_eof: 1; + uint32_t tohost: 1; + uint32_t tx_dscr_err: 1; + uint32_t rx_dscr_err: 1; + uint32_t tx_dscr_empty: 1; + uint32_t host_rd_ack: 1; + uint32_t wr_retry_done: 1; + uint32_t tx_err_eof: 1; + uint32_t cmd_dtc: 1; + uint32_t rx_quick_eof: 1; + uint32_t reserved27: 5; + }; + uint32_t val; + } slc0_int_st; + union { + struct { + uint32_t frhost_bit0: 1; + uint32_t frhost_bit1: 1; + uint32_t frhost_bit2: 1; + uint32_t frhost_bit3: 1; + uint32_t frhost_bit4: 1; + uint32_t frhost_bit5: 1; + uint32_t frhost_bit6: 1; + uint32_t frhost_bit7: 1; + uint32_t rx_start: 1; + uint32_t tx_start: 1; + uint32_t rx_udf: 1; + uint32_t tx_ovf: 1; + uint32_t token0_1to0: 1; + uint32_t token1_1to0: 1; + uint32_t tx_done: 1; + uint32_t tx_suc_eof: 1; + uint32_t rx_done: 1; + uint32_t rx_eof: 1; + uint32_t tohost: 1; + uint32_t tx_dscr_err: 1; + uint32_t rx_dscr_err: 1; + uint32_t tx_dscr_empty: 1; + uint32_t host_rd_ack: 1; + uint32_t wr_retry_done: 1; + uint32_t tx_err_eof: 1; + uint32_t cmd_dtc: 1; + uint32_t rx_quick_eof: 1; + uint32_t reserved27: 5; + }; + uint32_t val; + } slc0_int_ena; + union { + struct { + uint32_t frhost_bit0: 1; + uint32_t frhost_bit1: 1; + uint32_t frhost_bit2: 1; + uint32_t frhost_bit3: 1; + uint32_t frhost_bit4: 1; + uint32_t frhost_bit5: 1; + uint32_t frhost_bit6: 1; + uint32_t frhost_bit7: 1; + uint32_t rx_start: 1; + uint32_t tx_start: 1; + uint32_t rx_udf: 1; + uint32_t tx_ovf: 1; + uint32_t token0_1to0: 1; + uint32_t token1_1to0: 1; + uint32_t tx_done: 1; + uint32_t tx_suc_eof: 1; + uint32_t rx_done: 1; + uint32_t rx_eof: 1; + uint32_t tohost: 1; + uint32_t tx_dscr_err: 1; + uint32_t rx_dscr_err: 1; + uint32_t tx_dscr_empty: 1; + uint32_t host_rd_ack: 1; + uint32_t wr_retry_done: 1; + uint32_t tx_err_eof: 1; + uint32_t cmd_dtc: 1; + uint32_t rx_quick_eof: 1; + uint32_t reserved27: 5; + }; + uint32_t val; + } slc0_int_clr; + union { + struct { + uint32_t frhost_bit8: 1; + uint32_t frhost_bit9: 1; + uint32_t frhost_bit10: 1; + uint32_t frhost_bit11: 1; + uint32_t frhost_bit12: 1; + uint32_t frhost_bit13: 1; + uint32_t frhost_bit14: 1; + uint32_t frhost_bit15: 1; + uint32_t rx_start: 1; + uint32_t tx_start: 1; + uint32_t rx_udf: 1; + uint32_t tx_ovf: 1; + uint32_t token0_1to0: 1; + uint32_t token1_1to0: 1; + uint32_t tx_done: 1; + uint32_t tx_suc_eof: 1; + uint32_t rx_done: 1; + uint32_t rx_eof: 1; + uint32_t tohost: 1; + uint32_t tx_dscr_err: 1; + uint32_t rx_dscr_err: 1; + uint32_t tx_dscr_empty: 1; + uint32_t host_rd_ack: 1; + uint32_t wr_retry_done: 1; + uint32_t tx_err_eof: 1; + uint32_t reserved25: 7; + }; + uint32_t val; + } slc1_int_raw; + union { + struct { + uint32_t frhost_bit8: 1; + uint32_t frhost_bit9: 1; + uint32_t frhost_bit10: 1; + uint32_t frhost_bit11: 1; + uint32_t frhost_bit12: 1; + uint32_t frhost_bit13: 1; + uint32_t frhost_bit14: 1; + uint32_t frhost_bit15: 1; + uint32_t rx_start: 1; + uint32_t tx_start: 1; + uint32_t rx_udf: 1; + uint32_t tx_ovf: 1; + uint32_t token0_1to0: 1; + uint32_t token1_1to0: 1; + uint32_t tx_done: 1; + uint32_t tx_suc_eof: 1; + uint32_t rx_done: 1; + uint32_t rx_eof: 1; + uint32_t tohost: 1; + uint32_t tx_dscr_err: 1; + uint32_t rx_dscr_err: 1; + uint32_t tx_dscr_empty: 1; + uint32_t host_rd_ack: 1; + uint32_t wr_retry_done: 1; + uint32_t tx_err_eof: 1; + uint32_t reserved25: 7; + }; + uint32_t val; + } slc1_int_st; + union { + struct { + uint32_t frhost_bit8: 1; + uint32_t frhost_bit9: 1; + uint32_t frhost_bit10: 1; + uint32_t frhost_bit11: 1; + uint32_t frhost_bit12: 1; + uint32_t frhost_bit13: 1; + uint32_t frhost_bit14: 1; + uint32_t frhost_bit15: 1; + uint32_t rx_start: 1; + uint32_t tx_start: 1; + uint32_t rx_udf: 1; + uint32_t tx_ovf: 1; + uint32_t token0_1to0: 1; + uint32_t token1_1to0: 1; + uint32_t tx_done: 1; + uint32_t tx_suc_eof: 1; + uint32_t rx_done: 1; + uint32_t rx_eof: 1; + uint32_t tohost: 1; + uint32_t tx_dscr_err: 1; + uint32_t rx_dscr_err: 1; + uint32_t tx_dscr_empty: 1; + uint32_t host_rd_ack: 1; + uint32_t wr_retry_done: 1; + uint32_t tx_err_eof: 1; + uint32_t reserved25: 7; + }; + uint32_t val; + } slc1_int_ena; + union { + struct { + uint32_t frhost_bit8: 1; + uint32_t frhost_bit9: 1; + uint32_t frhost_bit10: 1; + uint32_t frhost_bit11: 1; + uint32_t frhost_bit12: 1; + uint32_t frhost_bit13: 1; + uint32_t frhost_bit14: 1; + uint32_t frhost_bit15: 1; + uint32_t rx_start: 1; + uint32_t tx_start: 1; + uint32_t rx_udf: 1; + uint32_t tx_ovf: 1; + uint32_t token0_1to0: 1; + uint32_t token1_1to0: 1; + uint32_t tx_done: 1; + uint32_t tx_suc_eof: 1; + uint32_t rx_done: 1; + uint32_t rx_eof: 1; + uint32_t tohost: 1; + uint32_t tx_dscr_err: 1; + uint32_t rx_dscr_err: 1; + uint32_t tx_dscr_empty: 1; + uint32_t host_rd_ack: 1; + uint32_t wr_retry_done: 1; + uint32_t tx_err_eof: 1; + uint32_t reserved25: 7; + }; + uint32_t val; + } slc1_int_clr; + union { + struct { + uint32_t slc0_rx_full: 1; + uint32_t slc0_rx_empty: 1; + uint32_t reserved2: 14; + uint32_t slc1_rx_full: 1; + uint32_t slc1_rx_empty: 1; + uint32_t reserved18:14; + }; + uint32_t val; + } rx_status; + union { + struct { + uint32_t rxfifo_wdata: 9; + uint32_t reserved9: 7; + uint32_t rxfifo_push: 1; + uint32_t reserved17: 15; + }; + uint32_t val; + } slc0_rxfifo_push; + union { + struct { + uint32_t rxfifo_wdata: 9; + uint32_t reserved9: 7; + uint32_t rxfifo_push: 1; + uint32_t reserved17: 15; + }; + uint32_t val; + } slc1_rxfifo_push; + union { + struct { + uint32_t slc0_tx_full: 1; + uint32_t slc0_tx_empty: 1; + uint32_t reserved2: 14; + uint32_t slc1_tx_full: 1; + uint32_t slc1_tx_empty: 1; + uint32_t reserved18:14; + }; + uint32_t val; + } tx_status; + union { + struct { + uint32_t txfifo_rdata: 11; + uint32_t reserved11: 5; + uint32_t txfifo_pop: 1; + uint32_t reserved17: 15; + }; + uint32_t val; + } slc0_txfifo_pop; + union { + struct { + uint32_t txfifo_rdata: 11; + uint32_t reserved11: 5; + uint32_t txfifo_pop: 1; + uint32_t reserved17: 15; + }; + uint32_t val; + } slc1_txfifo_pop; + union { + struct { + uint32_t addr: 20; + uint32_t reserved20: 8; + uint32_t stop: 1; + uint32_t start: 1; + uint32_t restart: 1; + uint32_t park: 1; + }; + uint32_t val; + } slc0_rx_link; + union { + struct { + uint32_t addr: 20; + uint32_t reserved20: 8; + uint32_t stop: 1; + uint32_t start: 1; + uint32_t restart: 1; + uint32_t park: 1; + }; + uint32_t val; + } slc0_tx_link; + union { + struct { + uint32_t addr: 20; + uint32_t bt_packet: 1; + uint32_t reserved21: 7; + uint32_t stop: 1; + uint32_t start: 1; + uint32_t restart: 1; + uint32_t park: 1; + }; + uint32_t val; + } slc1_rx_link; + union { + struct { + uint32_t addr: 20; + uint32_t reserved20: 8; + uint32_t stop: 1; + uint32_t start: 1; + uint32_t restart: 1; + uint32_t park: 1; + }; + uint32_t val; + } slc1_tx_link; + union { + struct { + uint32_t slc0_intvec: 8; + uint32_t reserved8: 8; + uint32_t slc1_intvec: 8; + uint32_t reserved24: 8; + }; + uint32_t val; + } intvec_tohost; + union { + struct { + uint32_t wdata: 12; + uint32_t wr: 1; + uint32_t inc: 1; + uint32_t inc_more: 1; + uint32_t reserved15: 1; + uint32_t token0: 12; + uint32_t reserved28: 4; + }; + uint32_t val; + } slc0_token0; + union { + struct { + uint32_t wdata: 12; + uint32_t wr: 1; + uint32_t inc: 1; + uint32_t inc_more: 1; + uint32_t reserved15: 1; + uint32_t token1: 12; + uint32_t reserved28: 4; + }; + uint32_t val; + } slc0_token1; + union { + struct { + uint32_t wdata: 12; + uint32_t wr: 1; + uint32_t inc: 1; + uint32_t inc_more: 1; + uint32_t reserved15: 1; + uint32_t token0: 12; + uint32_t reserved28: 4; + }; + uint32_t val; + } slc1_token0; + union { + struct { + uint32_t wdata: 12; + uint32_t wr: 1; + uint32_t inc: 1; + uint32_t inc_more: 1; + uint32_t reserved15: 1; + uint32_t token1: 12; + uint32_t reserved28: 4; + }; + uint32_t val; + } slc1_token1; + union { + struct { + uint32_t slc0_check_owner: 1; + uint32_t slc0_tx_check_sum_en: 1; + uint32_t slc0_rx_check_sum_en: 1; + uint32_t cmd_hold_en: 1; + uint32_t slc0_len_auto_clr: 1; + uint32_t slc0_tx_stitch_en: 1; + uint32_t slc0_rx_stitch_en: 1; + uint32_t reserved7: 9; + uint32_t slc1_check_owner: 1; + uint32_t slc1_tx_check_sum_en: 1; + uint32_t slc1_rx_check_sum_en: 1; + uint32_t host_int_level_sel: 1; + uint32_t slc1_tx_stitch_en: 1; + uint32_t slc1_rx_stitch_en: 1; + uint32_t clk_en: 1; + uint32_t reserved23: 9; + }; + uint32_t val; + } conf1; + uint32_t slc0_state0; /**/ + uint32_t slc0_state1; /**/ + uint32_t slc1_state0; /**/ + uint32_t slc1_state1; /**/ + union { + struct { + uint32_t txeof_ena: 6; + uint32_t reserved6: 2; + uint32_t fifo_map_ena: 4; + uint32_t slc0_tx_dummy_mode: 1; + uint32_t hda_map_128k: 1; + uint32_t slc1_tx_dummy_mode: 1; + uint32_t reserved15: 1; + uint32_t tx_push_idle_num:16; + }; + uint32_t val; + } bridge_conf; + uint32_t slc0_to_eof_des_addr; /**/ + uint32_t slc0_tx_eof_des_addr; /**/ + uint32_t slc0_to_eof_bfr_des_addr; /**/ + uint32_t slc1_to_eof_des_addr; /**/ + uint32_t slc1_tx_eof_des_addr; /**/ + uint32_t slc1_to_eof_bfr_des_addr; /**/ + union { + struct { + uint32_t mode: 3; + uint32_t reserved3: 1; + uint32_t addr: 2; + uint32_t reserved6: 26; + }; + uint32_t val; + } ahb_test; + union { + struct { + uint32_t cmd_st: 3; + uint32_t reserved3: 1; + uint32_t func_st: 4; + uint32_t sdio_wakeup: 1; + uint32_t reserved9: 3; + uint32_t bus_st: 3; + uint32_t reserved15: 1; + uint32_t func1_acc_state: 5; + uint32_t reserved21: 3; + uint32_t func2_acc_state: 5; + uint32_t reserved29: 3; + }; + uint32_t val; + } sdio_st; + union { + struct { + uint32_t slc0_token_no_replace: 1; + uint32_t slc0_infor_no_replace: 1; + uint32_t slc0_rx_fill_mode: 1; + uint32_t slc0_rx_eof_mode: 1; + uint32_t slc0_rx_fill_en: 1; + uint32_t slc0_rd_retry_threshold:11; + uint32_t slc1_token_no_replace: 1; + uint32_t slc1_infor_no_replace: 1; + uint32_t slc1_rx_fill_mode: 1; + uint32_t slc1_rx_eof_mode: 1; + uint32_t slc1_rx_fill_en: 1; + uint32_t slc1_rd_retry_threshold:11; + }; + uint32_t val; + } rx_dscr_conf; + uint32_t slc0_txlink_dscr; /**/ + uint32_t slc0_txlink_dscr_bf0; /**/ + uint32_t slc0_txlink_dscr_bf1; /**/ + uint32_t slc0_rxlink_dscr; /**/ + uint32_t slc0_rxlink_dscr_bf0; /**/ + uint32_t slc0_rxlink_dscr_bf1; /**/ + uint32_t slc1_txlink_dscr; /**/ + uint32_t slc1_txlink_dscr_bf0; /**/ + uint32_t slc1_txlink_dscr_bf1; /**/ + uint32_t slc1_rxlink_dscr; /**/ + uint32_t slc1_rxlink_dscr_bf0; /**/ + uint32_t slc1_rxlink_dscr_bf1; /**/ + uint32_t slc0_tx_erreof_des_addr; /**/ + uint32_t slc1_tx_erreof_des_addr; /**/ + union { + struct { + uint32_t slc0_token:12; + uint32_t reserved12: 4; + uint32_t slc1_token:12; + uint32_t reserved28: 4; + }; + uint32_t val; + } token_lat; + union { + struct { + uint32_t wr_retry_threshold:11; + uint32_t reserved11: 21; + }; + uint32_t val; + } tx_dscr_conf; + uint32_t cmd_infor0; /**/ + uint32_t cmd_infor1; /**/ + union { + struct { + uint32_t len_wdata: 20; + uint32_t len_wr: 1; + uint32_t len_inc: 1; + uint32_t len_inc_more: 1; + uint32_t rx_packet_load_en: 1; + uint32_t tx_packet_load_en: 1; + uint32_t rx_get_used_dscr: 1; + uint32_t tx_get_used_dscr: 1; + uint32_t rx_new_pkt_ind: 1; + uint32_t tx_new_pkt_ind: 1; + uint32_t reserved29: 3; + }; + uint32_t val; + } slc0_len_conf; + union { + struct { + uint32_t len: 20; + uint32_t reserved20:12; + }; + uint32_t val; + } slc0_length; + uint32_t slc0_txpkt_h_dscr; /**/ + uint32_t slc0_txpkt_e_dscr; /**/ + uint32_t slc0_rxpkt_h_dscr; /**/ + uint32_t slc0_rxpkt_e_dscr; /**/ + uint32_t slc0_txpktu_h_dscr; /**/ + uint32_t slc0_txpktu_e_dscr; /**/ + uint32_t slc0_rxpktu_h_dscr; /**/ + uint32_t slc0_rxpktu_e_dscr; /**/ + uint32_t reserved_10c; + uint32_t reserved_110; + union { + struct { + uint32_t slc0_position: 8; + uint32_t slc1_position: 8; + uint32_t reserved16: 16; + }; + uint32_t val; + } seq_position; + union { + struct { + uint32_t rx_dscr_rec_lim: 10; + uint32_t reserved10: 22; + }; + uint32_t val; + } slc0_dscr_rec_conf; + union { + struct { + uint32_t dat0_crc_err_cnt: 8; + uint32_t dat1_crc_err_cnt: 8; + uint32_t dat2_crc_err_cnt: 8; + uint32_t dat3_crc_err_cnt: 8; + }; + uint32_t val; + } sdio_crc_st0; + union { + struct { + uint32_t cmd_crc_err_cnt: 8; + uint32_t reserved8: 23; + uint32_t err_cnt_clr: 1; + }; + uint32_t val; + } sdio_crc_st1; + uint32_t slc0_eof_start_des; /**/ + uint32_t slc0_push_dscr_addr; /**/ + uint32_t slc0_done_dscr_addr; /**/ + uint32_t slc0_sub_start_des; /**/ + union { + struct { + uint32_t rx_dscr_cnt_lat: 10; + uint32_t reserved10: 6; + uint32_t rx_get_eof_occ: 1; + uint32_t reserved17: 15; + }; + uint32_t val; + } slc0_dscr_cnt; + union { + struct { + uint32_t len_lim: 20; + uint32_t reserved20:12; + }; + uint32_t val; + } slc0_len_lim_conf; + union { + struct { + uint32_t frhost_bit01: 1; + uint32_t frhost_bit11: 1; + uint32_t frhost_bit21: 1; + uint32_t frhost_bit31: 1; + uint32_t frhost_bit41: 1; + uint32_t frhost_bit51: 1; + uint32_t frhost_bit61: 1; + uint32_t frhost_bit71: 1; + uint32_t rx_start1: 1; + uint32_t tx_start1: 1; + uint32_t rx_udf1: 1; + uint32_t tx_ovf1: 1; + uint32_t token0_1to01: 1; + uint32_t token1_1to01: 1; + uint32_t tx_done1: 1; + uint32_t tx_suc_eof1: 1; + uint32_t rx_done1: 1; + uint32_t rx_eof1: 1; + uint32_t tohost1: 1; + uint32_t tx_dscr_err1: 1; + uint32_t rx_dscr_err1: 1; + uint32_t tx_dscr_empty1: 1; + uint32_t host_rd_ack1: 1; + uint32_t wr_retry_done1: 1; + uint32_t tx_err_eof1: 1; + uint32_t cmd_dtc1: 1; + uint32_t rx_quick_eof1: 1; + uint32_t reserved27: 5; + }; + uint32_t val; + } slc0_int_st1; + union { + struct { + uint32_t frhost_bit01: 1; + uint32_t frhost_bit11: 1; + uint32_t frhost_bit21: 1; + uint32_t frhost_bit31: 1; + uint32_t frhost_bit41: 1; + uint32_t frhost_bit51: 1; + uint32_t frhost_bit61: 1; + uint32_t frhost_bit71: 1; + uint32_t rx_start1: 1; + uint32_t tx_start1: 1; + uint32_t rx_udf1: 1; + uint32_t tx_ovf1: 1; + uint32_t token0_1to01: 1; + uint32_t token1_1to01: 1; + uint32_t tx_done1: 1; + uint32_t tx_suc_eof1: 1; + uint32_t rx_done1: 1; + uint32_t rx_eof1: 1; + uint32_t tohost1: 1; + uint32_t tx_dscr_err1: 1; + uint32_t rx_dscr_err1: 1; + uint32_t tx_dscr_empty1: 1; + uint32_t host_rd_ack1: 1; + uint32_t wr_retry_done1: 1; + uint32_t tx_err_eof1: 1; + uint32_t cmd_dtc1: 1; + uint32_t rx_quick_eof1: 1; + uint32_t reserved27: 5; + }; + uint32_t val; + } slc0_int_ena1; + union { + struct { + uint32_t frhost_bit81: 1; + uint32_t frhost_bit91: 1; + uint32_t frhost_bit101: 1; + uint32_t frhost_bit111: 1; + uint32_t frhost_bit121: 1; + uint32_t frhost_bit131: 1; + uint32_t frhost_bit141: 1; + uint32_t frhost_bit151: 1; + uint32_t rx_start1: 1; + uint32_t tx_start1: 1; + uint32_t rx_udf1: 1; + uint32_t tx_ovf1: 1; + uint32_t token0_1to01: 1; + uint32_t token1_1to01: 1; + uint32_t tx_done1: 1; + uint32_t tx_suc_eof1: 1; + uint32_t rx_done1: 1; + uint32_t rx_eof1: 1; + uint32_t tohost1: 1; + uint32_t tx_dscr_err1: 1; + uint32_t rx_dscr_err1: 1; + uint32_t tx_dscr_empty1: 1; + uint32_t host_rd_ack1: 1; + uint32_t wr_retry_done1: 1; + uint32_t tx_err_eof1: 1; + uint32_t reserved25: 7; + }; + uint32_t val; + } slc1_int_st1; + union { + struct { + uint32_t frhost_bit81: 1; + uint32_t frhost_bit91: 1; + uint32_t frhost_bit101: 1; + uint32_t frhost_bit111: 1; + uint32_t frhost_bit121: 1; + uint32_t frhost_bit131: 1; + uint32_t frhost_bit141: 1; + uint32_t frhost_bit151: 1; + uint32_t rx_start1: 1; + uint32_t tx_start1: 1; + uint32_t rx_udf1: 1; + uint32_t tx_ovf1: 1; + uint32_t token0_1to01: 1; + uint32_t token1_1to01: 1; + uint32_t tx_done1: 1; + uint32_t tx_suc_eof1: 1; + uint32_t rx_done1: 1; + uint32_t rx_eof1: 1; + uint32_t tohost1: 1; + uint32_t tx_dscr_err1: 1; + uint32_t rx_dscr_err1: 1; + uint32_t tx_dscr_empty1: 1; + uint32_t host_rd_ack1: 1; + uint32_t wr_retry_done1: 1; + uint32_t tx_err_eof1: 1; + uint32_t reserved25: 7; + }; + uint32_t val; + } slc1_int_ena1; + 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 reserved_180; + uint32_t reserved_184; + uint32_t reserved_188; + uint32_t reserved_18c; + uint32_t reserved_190; + uint32_t reserved_194; + uint32_t reserved_198; + uint32_t reserved_19c; + uint32_t reserved_1a0; + uint32_t reserved_1a4; + uint32_t reserved_1a8; + uint32_t reserved_1ac; + uint32_t reserved_1b0; + uint32_t reserved_1b4; + uint32_t reserved_1b8; + uint32_t reserved_1bc; + uint32_t reserved_1c0; + uint32_t reserved_1c4; + uint32_t reserved_1c8; + uint32_t reserved_1cc; + uint32_t reserved_1d0; + uint32_t reserved_1d4; + uint32_t reserved_1d8; + uint32_t reserved_1dc; + uint32_t reserved_1e0; + uint32_t reserved_1e4; + uint32_t reserved_1e8; + uint32_t reserved_1ec; + uint32_t reserved_1f0; + uint32_t reserved_1f4; + uint32_t date; /**/ + uint32_t id; /**/ +} slc_dev_t; +extern slc_dev_t SLC; + +#ifdef __cplusplus +} +#endif + +#endif /* _SOC_SLC_STRUCT_H_ */ diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/soc.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/soc.h new file mode 100644 index 0000000000000..27f468aa1d1b0 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/soc.h @@ -0,0 +1,413 @@ +// Copyright 2010-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 _ESP32_SOC_H_ +#define _ESP32_SOC_H_ + +#ifndef __ASSEMBLER__ +#include +#include "../../../../esp_common/esp_assert.h" +#endif + +#include "../../../../esp_common/esp_bit_defs.h" + +#define PRO_CPU_NUM (0) +#define APP_CPU_NUM (1) + + +#define SOC_MAX_CONTIGUOUS_RAM_SIZE 0x400000 ///< Largest span of contiguous memory (DRAM or IRAM) in the address space + + +#define DR_REG_DPORT_BASE 0x3ff00000 +#define DR_REG_AES_BASE 0x3ff01000 +#define DR_REG_RSA_BASE 0x3ff02000 +#define DR_REG_SHA_BASE 0x3ff03000 +#define DR_REG_FLASH_MMU_TABLE_PRO 0x3ff10000 +#define DR_REG_FLASH_MMU_TABLE_APP 0x3ff12000 +#define DR_REG_DPORT_END 0x3ff13FFC +#define DR_REG_UART_BASE 0x3ff40000 +#define DR_REG_SPI1_BASE 0x3ff42000 +#define DR_REG_SPI0_BASE 0x3ff43000 +#define DR_REG_GPIO_BASE 0x3ff44000 +#define DR_REG_GPIO_SD_BASE 0x3ff44f00 +#define DR_REG_FE2_BASE 0x3ff45000 +#define DR_REG_FE_BASE 0x3ff46000 +#define DR_REG_FRC_TIMER_BASE 0x3ff47000 +#define DR_REG_RTCCNTL_BASE 0x3ff48000 +#define DR_REG_RTCIO_BASE 0x3ff48400 +#define DR_REG_SENS_BASE 0x3ff48800 +#define DR_REG_RTC_I2C_BASE 0x3ff48C00 +#define DR_REG_IO_MUX_BASE 0x3ff49000 +#define DR_REG_HINF_BASE 0x3ff4B000 +#define DR_REG_UHCI1_BASE 0x3ff4C000 +#define DR_REG_I2S_BASE 0x3ff4F000 +#define DR_REG_UART1_BASE 0x3ff50000 +#define DR_REG_BT_BASE 0x3ff51000 +#define DR_REG_I2C_EXT_BASE 0x3ff53000 +#define DR_REG_UHCI0_BASE 0x3ff54000 +#define DR_REG_SLCHOST_BASE 0x3ff55000 +#define DR_REG_RMT_BASE 0x3ff56000 +#define DR_REG_PCNT_BASE 0x3ff57000 +#define DR_REG_SLC_BASE 0x3ff58000 +#define DR_REG_LEDC_BASE 0x3ff59000 +#define DR_REG_EFUSE_BASE 0x3ff5A000 +#define DR_REG_SPI_ENCRYPT_BASE 0x3ff5B000 +#define DR_REG_NRX_BASE 0x3ff5CC00 +#define DR_REG_BB_BASE 0x3ff5D000 +#define DR_REG_PWM_BASE 0x3ff5E000 +#define DR_REG_TIMERGROUP0_BASE 0x3ff5F000 +#define DR_REG_TIMERGROUP1_BASE 0x3ff60000 +#define DR_REG_RTCMEM0_BASE 0x3ff61000 +#define DR_REG_RTCMEM1_BASE 0x3ff62000 +#define DR_REG_RTCMEM2_BASE 0x3ff63000 +#define DR_REG_SPI2_BASE 0x3ff64000 +#define DR_REG_SPI3_BASE 0x3ff65000 +#define DR_REG_SYSCON_BASE 0x3ff66000 +#define DR_REG_APB_CTRL_BASE 0x3ff66000 /* Old name for SYSCON, to be removed */ +#define DR_REG_I2C1_EXT_BASE 0x3ff67000 +#define DR_REG_SDMMC_BASE 0x3ff68000 +#define DR_REG_EMAC_BASE 0x3ff69000 +#define DR_REG_CAN_BASE 0x3ff6B000 +#define DR_REG_PWM1_BASE 0x3ff6C000 +#define DR_REG_I2S1_BASE 0x3ff6D000 +#define DR_REG_UART2_BASE 0x3ff6E000 +#define DR_REG_PWM2_BASE 0x3ff6F000 +#define DR_REG_PWM3_BASE 0x3ff70000 +#define PERIPHS_SPI_ENCRYPT_BASEADDR DR_REG_SPI_ENCRYPT_BASE + +//Registers Operation {{ +#define ETS_UNCACHED_ADDR(addr) (addr) +#define ETS_CACHED_ADDR(addr) (addr) + + +#ifndef __ASSEMBLER__ + +#define IS_DPORT_REG(_r) (((_r) >= DR_REG_DPORT_BASE) && (_r) <= DR_REG_DPORT_END) + +#if !defined( BOOTLOADER_BUILD ) && defined( CONFIG_ESP32_DPORT_WORKAROUND ) && defined( ESP_PLATFORM ) +#define ASSERT_IF_DPORT_REG(_r, OP) TRY_STATIC_ASSERT(!IS_DPORT_REG(_r), (Cannot use OP for DPORT registers use DPORT_##OP)); +#else +#define ASSERT_IF_DPORT_REG(_r, OP) +#endif + +//write value to register +#define REG_WRITE(_r, _v) ({ \ + ASSERT_IF_DPORT_REG((_r), REG_WRITE); \ + (*(volatile uint32_t *)(_r)) = (_v); \ + }) + +//read value from register +#define REG_READ(_r) ({ \ + ASSERT_IF_DPORT_REG((_r), REG_READ); \ + (*(volatile uint32_t *)(_r)); \ + }) + +//get bit or get bits from register +#define REG_GET_BIT(_r, _b) ({ \ + ASSERT_IF_DPORT_REG((_r), REG_GET_BIT); \ + (*(volatile uint32_t*)(_r) & (_b)); \ + }) + +//set bit or set bits to register +#define REG_SET_BIT(_r, _b) ({ \ + ASSERT_IF_DPORT_REG((_r), REG_SET_BIT); \ + (*(volatile uint32_t*)(_r) |= (_b)); \ + }) + +//clear bit or clear bits of register +#define REG_CLR_BIT(_r, _b) ({ \ + ASSERT_IF_DPORT_REG((_r), REG_CLR_BIT); \ + (*(volatile uint32_t*)(_r) &= ~(_b)); \ + }) + +//set bits of register controlled by mask +#define REG_SET_BITS(_r, _b, _m) ({ \ + ASSERT_IF_DPORT_REG((_r), REG_SET_BITS); \ + (*(volatile uint32_t*)(_r) = (*(volatile uint32_t*)(_r) & ~(_m)) | ((_b) & (_m))); \ + }) + +//get field from register, uses field _S & _V to determine mask +#define REG_GET_FIELD(_r, _f) ({ \ + ASSERT_IF_DPORT_REG((_r), REG_GET_FIELD); \ + ((REG_READ(_r) >> (_f##_S)) & (_f##_V)); \ + }) + +//set field of a register from variable, uses field _S & _V to determine mask +#define REG_SET_FIELD(_r, _f, _v) ({ \ + ASSERT_IF_DPORT_REG((_r), REG_SET_FIELD); \ + (REG_WRITE((_r),((REG_READ(_r) & ~((_f##_V) << (_f##_S)))|(((_v) & (_f##_V))<<(_f##_S))))); \ + }) + +//get field value from a variable, used when _f is not left shifted by _f##_S +#define VALUE_GET_FIELD(_r, _f) (((_r) >> (_f##_S)) & (_f)) + +//get field value from a variable, used when _f is left shifted by _f##_S +#define VALUE_GET_FIELD2(_r, _f) (((_r) & (_f))>> (_f##_S)) + +//set field value to a variable, used when _f is not left shifted by _f##_S +#define VALUE_SET_FIELD(_r, _f, _v) ((_r)=(((_r) & ~((_f) << (_f##_S)))|((_v)<<(_f##_S)))) + +//set field value to a variable, used when _f is left shifted by _f##_S +#define VALUE_SET_FIELD2(_r, _f, _v) ((_r)=(((_r) & ~(_f))|((_v)<<(_f##_S)))) + +//generate a value from a field value, used when _f is not left shifted by _f##_S +#define FIELD_TO_VALUE(_f, _v) (((_v)&(_f))<<_f##_S) + +//generate a value from a field value, used when _f is left shifted by _f##_S +#define FIELD_TO_VALUE2(_f, _v) (((_v)<<_f##_S) & (_f)) + +//read value from register +#define READ_PERI_REG(addr) ({ \ + ASSERT_IF_DPORT_REG((addr), READ_PERI_REG); \ + (*((volatile uint32_t *)ETS_UNCACHED_ADDR(addr))); \ + }) + +//write value to register +#define WRITE_PERI_REG(addr, val) ({ \ + ASSERT_IF_DPORT_REG((addr), WRITE_PERI_REG); \ + (*((volatile uint32_t *)ETS_UNCACHED_ADDR(addr))) = (uint32_t)(val); \ + }) + +//clear bits of register controlled by mask +#define CLEAR_PERI_REG_MASK(reg, mask) ({ \ + ASSERT_IF_DPORT_REG((reg), CLEAR_PERI_REG_MASK); \ + WRITE_PERI_REG((reg), (READ_PERI_REG(reg)&(~(mask)))); \ + }) + +//set bits of register controlled by mask +#define SET_PERI_REG_MASK(reg, mask) ({ \ + ASSERT_IF_DPORT_REG((reg), SET_PERI_REG_MASK); \ + WRITE_PERI_REG((reg), (READ_PERI_REG(reg)|(mask))); \ + }) + +//get bits of register controlled by mask +#define GET_PERI_REG_MASK(reg, mask) ({ \ + ASSERT_IF_DPORT_REG((reg), GET_PERI_REG_MASK); \ + (READ_PERI_REG(reg) & (mask)); \ + }) + +//get bits of register controlled by highest bit and lowest bit +#define GET_PERI_REG_BITS(reg, hipos,lowpos) ({ \ + ASSERT_IF_DPORT_REG((reg), GET_PERI_REG_BITS); \ + ((READ_PERI_REG(reg)>>(lowpos))&((1<<((hipos)-(lowpos)+1))-1)); \ + }) + +//set bits of register controlled by mask and shift +#define SET_PERI_REG_BITS(reg,bit_map,value,shift) ({ \ + ASSERT_IF_DPORT_REG((reg), SET_PERI_REG_BITS); \ + (WRITE_PERI_REG((reg),(READ_PERI_REG(reg)&(~((bit_map)<<(shift))))|(((value) & bit_map)<<(shift)) )); \ + }) + +//get field of register +#define GET_PERI_REG_BITS2(reg, mask,shift) ({ \ + ASSERT_IF_DPORT_REG((reg), GET_PERI_REG_BITS2); \ + ((READ_PERI_REG(reg)>>(shift))&(mask)); \ + }) + +#endif /* !__ASSEMBLER__ */ +//}} + +//Periheral Clock {{ +#define APB_CLK_FREQ_ROM ( 26*1000000 ) +#define CPU_CLK_FREQ_ROM APB_CLK_FREQ_ROM +#define CPU_CLK_FREQ APB_CLK_FREQ //this may be incorrect, please refer to ESP32_DEFAULT_CPU_FREQ_MHZ +#define APB_CLK_FREQ ( 80*1000000 ) //unit: Hz +#define REF_CLK_FREQ ( 1000000 ) +#define UART_CLK_FREQ APB_CLK_FREQ +#define WDT_CLK_FREQ APB_CLK_FREQ +#define TIMER_CLK_FREQ (80000000>>4) //80MHz divided by 16 +#define SPI_CLK_DIV 4 +#define TICKS_PER_US_ROM 26 // CPU is 80MHz +#define GPIO_MATRIX_DELAY_NS 25 +//}} + +/* Overall memory map */ +#define SOC_DROM_LOW 0x3F400000 +#define SOC_DROM_HIGH 0x3F800000 +#define SOC_DRAM_LOW 0x3FFAE000 +#define SOC_DRAM_HIGH 0x40000000 +#define SOC_IROM_LOW 0x400D0000 +#define SOC_IROM_HIGH 0x40400000 +#define SOC_IROM_MASK_LOW 0x40000000 +#define SOC_IROM_MASK_HIGH 0x40064F00 +#define SOC_CACHE_PRO_LOW 0x40070000 +#define SOC_CACHE_PRO_HIGH 0x40078000 +#define SOC_CACHE_APP_LOW 0x40078000 +#define SOC_CACHE_APP_HIGH 0x40080000 +#define SOC_IRAM_LOW 0x40080000 +#define SOC_IRAM_HIGH 0x400A0000 +#define SOC_RTC_IRAM_LOW 0x400C0000 +#define SOC_RTC_IRAM_HIGH 0x400C2000 +#define SOC_RTC_DRAM_LOW 0x3FF80000 +#define SOC_RTC_DRAM_HIGH 0x3FF82000 +#define SOC_RTC_DATA_LOW 0x50000000 +#define SOC_RTC_DATA_HIGH 0x50002000 +#define SOC_EXTRAM_DATA_LOW 0x3F800000 +#define SOC_EXTRAM_DATA_HIGH 0x3FC00000 + +//First and last words of the D/IRAM region, for both the DRAM address as well as the IRAM alias. +#define SOC_DIRAM_IRAM_LOW 0x400A0000 +#define SOC_DIRAM_IRAM_HIGH 0x400C0000 +#define SOC_DIRAM_DRAM_LOW 0x3FFE0000 +#define SOC_DIRAM_DRAM_HIGH 0x40000000 +// Byte order of D/IRAM regions is reversed between accessing as DRAM or IRAM +#define SOC_DIRAM_INVERTED 1 + +// Region of memory accessible via DMA. See esp_ptr_dma_capable(). +#define SOC_DMA_LOW 0x3FFAE000 +#define SOC_DMA_HIGH 0x40000000 + +// Region of memory that is byte-accessible. See esp_ptr_byte_accessible(). +#define SOC_BYTE_ACCESSIBLE_LOW 0x3FF90000 +#define SOC_BYTE_ACCESSIBLE_HIGH 0x40000000 + +//Region of memory that is internal, as in on the same silicon die as the ESP32 CPUs +//(excluding RTC data region, that's checked separately.) See esp_ptr_internal(). +#define SOC_MEM_INTERNAL_LOW 0x3FF90000 +#define SOC_MEM_INTERNAL_HIGH 0x400C2000 + +// Start (highest address) of ROM boot stack, only relevant during early boot +#define SOC_ROM_STACK_START 0x3ffe3f20 + +//Interrupt hardware source table +//This table is decided by hardware, don't touch this. +#define ETS_WIFI_MAC_INTR_SOURCE 0/**< interrupt of WiFi MAC, level*/ +#define ETS_WIFI_MAC_NMI_SOURCE 1/**< interrupt of WiFi MAC, NMI, use if MAC have bug to fix in NMI*/ +#define ETS_WIFI_BB_INTR_SOURCE 2/**< interrupt of WiFi BB, level, we can do some calibartion*/ +#define ETS_BT_MAC_INTR_SOURCE 3/**< will be cancelled*/ +#define ETS_BT_BB_INTR_SOURCE 4/**< interrupt of BT BB, level*/ +#define ETS_BT_BB_NMI_SOURCE 5/**< interrupt of BT BB, NMI, use if BB have bug to fix in NMI*/ +#define ETS_RWBT_INTR_SOURCE 6/**< interrupt of RWBT, level*/ +#define ETS_RWBLE_INTR_SOURCE 7/**< interrupt of RWBLE, level*/ +#define ETS_RWBT_NMI_SOURCE 8/**< interrupt of RWBT, NMI, use if RWBT have bug to fix in NMI*/ +#define ETS_RWBLE_NMI_SOURCE 9/**< interrupt of RWBLE, NMI, use if RWBT have bug to fix in NMI*/ +#define ETS_SLC0_INTR_SOURCE 10/**< interrupt of SLC0, level*/ +#define ETS_SLC1_INTR_SOURCE 11/**< interrupt of SLC1, level*/ +#define ETS_UHCI0_INTR_SOURCE 12/**< interrupt of UHCI0, level*/ +#define ETS_UHCI1_INTR_SOURCE 13/**< interrupt of UHCI1, level*/ +#define ETS_TG0_T0_LEVEL_INTR_SOURCE 14/**< interrupt of TIMER_GROUP0, TIMER0, level, we would like use EDGE for timer if permission*/ +#define ETS_TG0_T1_LEVEL_INTR_SOURCE 15/**< interrupt of TIMER_GROUP0, TIMER1, level, we would like use EDGE for timer if permission*/ +#define ETS_TG0_WDT_LEVEL_INTR_SOURCE 16/**< interrupt of TIMER_GROUP0, WATCHDOG, level*/ +#define ETS_TG0_LACT_LEVEL_INTR_SOURCE 17/**< interrupt of TIMER_GROUP0, LACT, level*/ +#define ETS_TG1_T0_LEVEL_INTR_SOURCE 18/**< interrupt of TIMER_GROUP1, TIMER0, level, we would like use EDGE for timer if permission*/ +#define ETS_TG1_T1_LEVEL_INTR_SOURCE 19/**< interrupt of TIMER_GROUP1, TIMER1, level, we would like use EDGE for timer if permission*/ +#define ETS_TG1_WDT_LEVEL_INTR_SOURCE 20/**< interrupt of TIMER_GROUP1, WATCHDOG, level*/ +#define ETS_TG1_LACT_LEVEL_INTR_SOURCE 21/**< interrupt of TIMER_GROUP1, LACT, level*/ +#define ETS_GPIO_INTR_SOURCE 22/**< interrupt of GPIO, level*/ +#define ETS_GPIO_NMI_SOURCE 23/**< interrupt of GPIO, NMI*/ +#define ETS_FROM_CPU_INTR0_SOURCE 24/**< interrupt0 generated from a CPU, level*/ /* Used for FreeRTOS */ +#define ETS_FROM_CPU_INTR1_SOURCE 25/**< interrupt1 generated from a CPU, level*/ /* Used for FreeRTOS */ +#define ETS_FROM_CPU_INTR2_SOURCE 26/**< interrupt2 generated from a CPU, level*/ /* Used for DPORT Access */ +#define ETS_FROM_CPU_INTR3_SOURCE 27/**< interrupt3 generated from a CPU, level*/ /* Used for DPORT Access */ +#define ETS_SPI0_INTR_SOURCE 28/**< interrupt of SPI0, level, SPI0 is for Cache Access, do not use this*/ +#define ETS_SPI1_INTR_SOURCE 29/**< interrupt of SPI1, level, SPI1 is for flash read/write, do not use this*/ +#define ETS_SPI2_INTR_SOURCE 30/**< interrupt of SPI2, level*/ +#define ETS_SPI3_INTR_SOURCE 31/**< interrupt of SPI3, level*/ +#define ETS_I2S0_INTR_SOURCE 32/**< interrupt of I2S0, level*/ +#define ETS_I2S1_INTR_SOURCE 33/**< interrupt of I2S1, level*/ +#define ETS_UART0_INTR_SOURCE 34/**< interrupt of UART0, level*/ +#define ETS_UART1_INTR_SOURCE 35/**< interrupt of UART1, level*/ +#define ETS_UART2_INTR_SOURCE 36/**< interrupt of UART2, level*/ +#define ETS_SDIO_HOST_INTR_SOURCE 37/**< interrupt of SD/SDIO/MMC HOST, level*/ +#define ETS_ETH_MAC_INTR_SOURCE 38/**< interrupt of ethernet mac, level*/ +#define ETS_PWM0_INTR_SOURCE 39/**< interrupt of PWM0, level, Reserved*/ +#define ETS_PWM1_INTR_SOURCE 40/**< interrupt of PWM1, level, Reserved*/ +#define ETS_PWM2_INTR_SOURCE 41/**< interrupt of PWM2, level*/ +#define ETS_PWM3_INTR_SOURCE 42/**< interruot of PWM3, level*/ +#define ETS_LEDC_INTR_SOURCE 43/**< interrupt of LED PWM, level*/ +#define ETS_EFUSE_INTR_SOURCE 44/**< interrupt of efuse, level, not likely to use*/ +#define ETS_CAN_INTR_SOURCE 45/**< interrupt of can, level*/ +#define ETS_RTC_CORE_INTR_SOURCE 46/**< interrupt of rtc core, level, include rtc watchdog*/ +#define ETS_RMT_INTR_SOURCE 47/**< interrupt of remote controller, level*/ +#define ETS_PCNT_INTR_SOURCE 48/**< interrupt of pluse count, level*/ +#define ETS_I2C_EXT0_INTR_SOURCE 49/**< interrupt of I2C controller1, level*/ +#define ETS_I2C_EXT1_INTR_SOURCE 50/**< interrupt of I2C controller0, level*/ +#define ETS_RSA_INTR_SOURCE 51/**< interrupt of RSA accelerator, level*/ +#define ETS_SPI1_DMA_INTR_SOURCE 52/**< interrupt of SPI1 DMA, SPI1 is for flash read/write, do not use this*/ +#define ETS_SPI2_DMA_INTR_SOURCE 53/**< interrupt of SPI2 DMA, level*/ +#define ETS_SPI3_DMA_INTR_SOURCE 54/**< interrupt of SPI3 DMA, level*/ +#define ETS_WDT_INTR_SOURCE 55/**< will be cancelled*/ +#define ETS_TIMER1_INTR_SOURCE 56/**< will be cancelled*/ +#define ETS_TIMER2_INTR_SOURCE 57/**< will be cancelled*/ +#define ETS_TG0_T0_EDGE_INTR_SOURCE 58/**< interrupt of TIMER_GROUP0, TIMER0, EDGE*/ +#define ETS_TG0_T1_EDGE_INTR_SOURCE 59/**< interrupt of TIMER_GROUP0, TIMER1, EDGE*/ +#define ETS_TG0_WDT_EDGE_INTR_SOURCE 60/**< interrupt of TIMER_GROUP0, WATCH DOG, EDGE*/ +#define ETS_TG0_LACT_EDGE_INTR_SOURCE 61/**< interrupt of TIMER_GROUP0, LACT, EDGE*/ +#define ETS_TG1_T0_EDGE_INTR_SOURCE 62/**< interrupt of TIMER_GROUP1, TIMER0, EDGE*/ +#define ETS_TG1_T1_EDGE_INTR_SOURCE 63/**< interrupt of TIMER_GROUP1, TIMER1, EDGE*/ +#define ETS_TG1_WDT_EDGE_INTR_SOURCE 64/**< interrupt of TIMER_GROUP1, WATCHDOG, EDGE*/ +#define ETS_TG1_LACT_EDGE_INTR_SOURCE 65/**< interrupt of TIMER_GROUP0, LACT, EDGE*/ +#define ETS_MMU_IA_INTR_SOURCE 66/**< interrupt of MMU Invalid Access, LEVEL*/ +#define ETS_MPU_IA_INTR_SOURCE 67/**< interrupt of MPU Invalid Access, LEVEL*/ +#define ETS_CACHE_IA_INTR_SOURCE 68/**< interrupt of Cache Invalied Access, LEVEL*/ +#define ETS_MAX_INTR_SOURCE 69/**< total number of interrupt sources*/ + +//interrupt cpu using table, Please see the core-isa.h +/************************************************************************************************************* + * Intr num Level Type PRO CPU usage APP CPU uasge + * 0 1 extern level WMAC Reserved + * 1 1 extern level BT/BLE Host HCI DMA BT/BLE Host HCI DMA + * 2 1 extern level + * 3 1 extern level + * 4 1 extern level WBB + * 5 1 extern level BT/BLE Controller BT/BLE Controller + * 6 1 timer FreeRTOS Tick(L1) FreeRTOS Tick(L1) + * 7 1 software BT/BLE VHCI BT/BLE VHCI + * 8 1 extern level BT/BLE BB(RX/TX) BT/BLE BB(RX/TX) + * 9 1 extern level + * 10 1 extern edge + * 11 3 profiling + * 12 1 extern level + * 13 1 extern level + * 14 7 nmi Reserved Reserved + * 15 3 timer FreeRTOS Tick(L3) FreeRTOS Tick(L3) + * 16 5 timer + * 17 1 extern level + * 18 1 extern level + * 19 2 extern level + * 20 2 extern level + * 21 2 extern level + * 22 3 extern edge + * 23 3 extern level + * 24 4 extern level TG1_WDT + * 25 4 extern level CACHEERR + * 26 5 extern level + * 27 3 extern level Reserved Reserved + * 28 4 extern edge DPORT ACCESS DPORT ACCESS + * 29 3 software Reserved Reserved + * 30 4 extern edge Reserved Reserved + * 31 5 extern level + ************************************************************************************************************* + */ + +//CPU0 Interrupt number reserved, not touch this. +#define ETS_WMAC_INUM 0 +#define ETS_BT_HOST_INUM 1 +#define ETS_WBB_INUM 4 +#define ETS_TG0_T1_INUM 10 /**< use edge interrupt*/ +#define ETS_FRC1_INUM 22 +#define ETS_T1_WDT_INUM 24 +#define ETS_CACHEERR_INUM 25 +#define ETS_DPORT_INUM 28 + +//CPU0 Interrupt number used in ROM, should be cancelled in SDK +#define ETS_SLC_INUM 1 +#define ETS_UART0_INUM 5 +#define ETS_UART1_INUM 5 +//Other interrupt number should be managed by the user + +//Invalid interrupt for number interrupt matrix +#define ETS_INVALID_INUM 6 + +#endif /* _ESP32_SOC_H_ */ diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/soc_caps.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/soc_caps.h new file mode 100644 index 0000000000000..bbc8e8f19fd9c --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/soc_caps.h @@ -0,0 +1,12 @@ +// The long term plan is to have a single soc_caps.h for each peripheral. +// During the refactoring and multichip support development process, we +// seperate these information into periph_caps.h for each peripheral and +// include them here. + +#pragma once + +#define SOC_MCPWM_SUPPORTED 1 +#define SOC_SDMMC_HOST_SUPPORTED 1 +#define SOC_BT_SUPPORTED 1 +#define SOC_SDIO_SLAVE_SUPPORTED 1 +#define SOC_CAN_SUPPORTED 1 diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/soc_ulp.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/soc_ulp.h new file mode 100644 index 0000000000000..e8c20d2b565fc --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/soc_ulp.h @@ -0,0 +1,46 @@ +// 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 + +// This file contains various convenience macros to be used in ULP programs. + +// Helper macros to calculate bit field width from mask, using the preprocessor. +// Used later in READ_RTC_FIELD and WRITE_RTC_FIELD. +#define IS_BIT_SET(m, i) (((m) >> (i)) & 1) +#define MASK_TO_WIDTH_HELPER1(m, i) IS_BIT_SET(m, i) +#define MASK_TO_WIDTH_HELPER2(m, i) (MASK_TO_WIDTH_HELPER1(m, i) + MASK_TO_WIDTH_HELPER1(m, i + 1)) +#define MASK_TO_WIDTH_HELPER4(m, i) (MASK_TO_WIDTH_HELPER2(m, i) + MASK_TO_WIDTH_HELPER2(m, i + 2)) +#define MASK_TO_WIDTH_HELPER8(m, i) (MASK_TO_WIDTH_HELPER4(m, i) + MASK_TO_WIDTH_HELPER4(m, i + 4)) +#define MASK_TO_WIDTH_HELPER16(m, i) (MASK_TO_WIDTH_HELPER8(m, i) + MASK_TO_WIDTH_HELPER8(m, i + 8)) +#define MASK_TO_WIDTH_HELPER32(m, i) (MASK_TO_WIDTH_HELPER16(m, i) + MASK_TO_WIDTH_HELPER16(m, i + 16)) + +// Peripheral register access macros, build around REG_RD and REG_WR instructions. +// Registers defined in rtc_cntl_reg.h, rtc_io_reg.h, sens_reg.h, and rtc_i2c_reg.h are usable with these macros. + +// Read from rtc_reg[low_bit + bit_width - 1 : low_bit] into R0, bit_width <= 16 +#define READ_RTC_REG(rtc_reg, low_bit, bit_width) \ + REG_RD (((rtc_reg) - DR_REG_RTCCNTL_BASE) / 4), ((low_bit) + (bit_width) - 1), (low_bit) + +// Write immediate value into rtc_reg[low_bit + bit_width - 1 : low_bit], bit_width <= 8 +#define WRITE_RTC_REG(rtc_reg, low_bit, bit_width, value) \ + REG_WR (((rtc_reg) - DR_REG_RTCCNTL_BASE) / 4), ((low_bit) + (bit_width) - 1), (low_bit), ((value) & 0xff) + +// Read from a field in rtc_reg into R0, up to 16 bits +#define READ_RTC_FIELD(rtc_reg, field) \ + READ_RTC_REG(rtc_reg, field ## _S, MASK_TO_WIDTH_HELPER16(field ## _V, 0)) + +// Write immediate value into a field in rtc_reg, up to 8 bits +#define WRITE_RTC_FIELD(rtc_reg, field, value) \ + WRITE_RTC_REG(rtc_reg, field ## _S, MASK_TO_WIDTH_HELPER8(field ## _V, 0), ((value) & field ## _V)) + diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/spi_caps.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/spi_caps.h new file mode 100644 index 0000000000000..d5b19b4d701e9 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/spi_caps.h @@ -0,0 +1,63 @@ +// 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. + +#pragma once + +#define SOC_SPI_PERIPH_NUM 3 +#define SOC_SPI_DMA_CHAN_NUM 2 + +#define SPI_PERIPH_NUM 3 + +#define SPI_FUNC_NUM 1 +#define SPI_IOMUX_PIN_NUM_MISO 7 +#define SPI_IOMUX_PIN_NUM_MOSI 8 +#define SPI_IOMUX_PIN_NUM_CLK 6 +#define SPI_IOMUX_PIN_NUM_CS 11 +#define SPI_IOMUX_PIN_NUM_WP 10 +#define SPI_IOMUX_PIN_NUM_HD 9 + +#define HSPI_FUNC_NUM 1 + +//For D2WD and PICO-D4 chip +#define SPI_D2WD_PIN_NUM_MISO 17 +#define SPI_D2WD_PIN_NUM_MOSI 8 +#define SPI_D2WD_PIN_NUM_CLK 6 +#define SPI_D2WD_PIN_NUM_CS 16 +#define SPI_D2WD_PIN_NUM_WP 7 +#define SPI_D2WD_PIN_NUM_HD 11 + +#define HSPI_IOMUX_PIN_NUM_MISO 12 +#define HSPI_IOMUX_PIN_NUM_MOSI 13 +#define HSPI_IOMUX_PIN_NUM_CLK 14 +#define HSPI_IOMUX_PIN_NUM_CS 15 +#define HSPI_IOMUX_PIN_NUM_WP 2 +#define HSPI_IOMUX_PIN_NUM_HD 4 + +#define VSPI_FUNC_NUM 1 +#define VSPI_IOMUX_PIN_NUM_MISO 19 +#define VSPI_IOMUX_PIN_NUM_MOSI 23 +#define VSPI_IOMUX_PIN_NUM_CLK 18 +#define VSPI_IOMUX_PIN_NUM_CS 5 +#define VSPI_IOMUX_PIN_NUM_WP 22 +#define VSPI_IOMUX_PIN_NUM_HD 21 + +#define SOC_SPI_MAXIMUM_BUFFER_SIZE 64 + +#define SOC_SPI_SUPPORT_AS_CS 1 //Support to toggle the CS while the clock toggles + +//#define SOC_SPI_SUPPORT_DDRCLK +//#define SOC_SPI_SLAVE_SUPPORT_SEG_TRANS +//#define SOC_SPI_SUPPORT_CD_SIG + +#define SOC_SPI_PERIPH_SUPPORT_MULTILINE_MODE(SPI_HOST) true diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/spi_reg.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/spi_reg.h new file mode 100644 index 0000000000000..fac2965c7861a --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/spi_reg.h @@ -0,0 +1,1713 @@ +// 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. +#ifndef __SPI_REG_H__ +#define __SPI_REG_H__ + + +#include "soc.h" +#define REG_SPI_BASE(i) (DR_REG_SPI1_BASE + (((i)>1) ? (((i)* 0x1000) + 0x20000) : (((~(i)) & 1)* 0x1000 ))) + +#define SPI_CMD_REG(i) (REG_SPI_BASE(i) + 0x0) +/* SPI_FLASH_READ : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: Read flash enable. Read flash operation will be triggered when + the bit is set. The bit will be cleared once the operation done. 1: enable 0: disable.*/ +#define SPI_FLASH_READ (BIT(31)) +#define SPI_FLASH_READ_M (BIT(31)) +#define SPI_FLASH_READ_V 0x1 +#define SPI_FLASH_READ_S 31 +/* SPI_FLASH_WREN : R/W ;bitpos:[30] ;default: 1'b0 ; */ +/*description: Write flash enable. Write enable command will be sent when the + bit is set. The bit will be cleared once the operation done. 1: enable 0: disable.*/ +#define SPI_FLASH_WREN (BIT(30)) +#define SPI_FLASH_WREN_M (BIT(30)) +#define SPI_FLASH_WREN_V 0x1 +#define SPI_FLASH_WREN_S 30 +/* SPI_FLASH_WRDI : R/W ;bitpos:[29] ;default: 1'b0 ; */ +/*description: Write flash disable. Write disable command will be sent when + the bit is set. The bit will be cleared once the operation done. 1: enable 0: disable.*/ +#define SPI_FLASH_WRDI (BIT(29)) +#define SPI_FLASH_WRDI_M (BIT(29)) +#define SPI_FLASH_WRDI_V 0x1 +#define SPI_FLASH_WRDI_S 29 +/* SPI_FLASH_RDID : R/W ;bitpos:[28] ;default: 1'b0 ; */ +/*description: Read JEDEC ID . Read ID command will be sent when the bit is + set. The bit will be cleared once the operation done. 1: enable 0: disable.*/ +#define SPI_FLASH_RDID (BIT(28)) +#define SPI_FLASH_RDID_M (BIT(28)) +#define SPI_FLASH_RDID_V 0x1 +#define SPI_FLASH_RDID_S 28 +/* SPI_FLASH_RDSR : R/W ;bitpos:[27] ;default: 1'b0 ; */ +/*description: Read status register-1. Read status operation will be triggered + when the bit is set. The bit will be cleared once the operation done.1: enable 0: disable.*/ +#define SPI_FLASH_RDSR (BIT(27)) +#define SPI_FLASH_RDSR_M (BIT(27)) +#define SPI_FLASH_RDSR_V 0x1 +#define SPI_FLASH_RDSR_S 27 +/* SPI_FLASH_WRSR : R/W ;bitpos:[26] ;default: 1'b0 ; */ +/*description: Write status register enable. Write status operation will + be triggered when the bit is set. The bit will be cleared once the operation done.1: enable 0: disable.*/ +#define SPI_FLASH_WRSR (BIT(26)) +#define SPI_FLASH_WRSR_M (BIT(26)) +#define SPI_FLASH_WRSR_V 0x1 +#define SPI_FLASH_WRSR_S 26 +/* SPI_FLASH_PP : R/W ;bitpos:[25] ;default: 1'b0 ; */ +/*description: Page program enable(1 byte ~256 bytes data to be programmed). + Page program operation will be triggered when the bit is set. The bit will be cleared once the operation done .1: enable 0: disable.*/ +#define SPI_FLASH_PP (BIT(25)) +#define SPI_FLASH_PP_M (BIT(25)) +#define SPI_FLASH_PP_V 0x1 +#define SPI_FLASH_PP_S 25 +/* SPI_FLASH_SE : R/W ;bitpos:[24] ;default: 1'b0 ; */ +/*description: Sector erase enable. A 4KB sector is erased via SPI command 20H. Sector erase operation will be triggered + when the bit is set. The bit will be cleared once the operation done.1: enable 0: disable.*/ +#define SPI_FLASH_SE (BIT(24)) +#define SPI_FLASH_SE_M (BIT(24)) +#define SPI_FLASH_SE_V 0x1 +#define SPI_FLASH_SE_S 24 +/* SPI_FLASH_BE : R/W ;bitpos:[23] ;default: 1'b0 ; */ +/*description: Block erase enable. A 64KB block is erased via SPI command D8H. Block erase operation will be triggered + when the bit is set. The bit will be cleared once the operation done.1: enable 0: disable.*/ +#define SPI_FLASH_BE (BIT(23)) +#define SPI_FLASH_BE_M (BIT(23)) +#define SPI_FLASH_BE_V 0x1 +#define SPI_FLASH_BE_S 23 +/* SPI_FLASH_CE : R/W ;bitpos:[22] ;default: 1'b0 ; */ +/*description: Chip erase enable. Chip erase operation will be triggered when + the bit is set. The bit will be cleared once the operation done.1: enable 0: disable.*/ +#define SPI_FLASH_CE (BIT(22)) +#define SPI_FLASH_CE_M (BIT(22)) +#define SPI_FLASH_CE_V 0x1 +#define SPI_FLASH_CE_S 22 +/* SPI_FLASH_DP : R/W ;bitpos:[21] ;default: 1'b0 ; */ +/*description: Drive Flash into power down. An operation will be triggered + when the bit is set. The bit will be cleared once the operation done.1: enable 0: disable.*/ +#define SPI_FLASH_DP (BIT(21)) +#define SPI_FLASH_DP_M (BIT(21)) +#define SPI_FLASH_DP_V 0x1 +#define SPI_FLASH_DP_S 21 +/* SPI_FLASH_RES : R/W ;bitpos:[20] ;default: 1'b0 ; */ +/*description: This bit combined with reg_resandres bit releases Flash from + the power-down state or high performance mode and obtains the devices ID. The bit will be cleared once the operation done.1: enable 0: disable.*/ +#define SPI_FLASH_RES (BIT(20)) +#define SPI_FLASH_RES_M (BIT(20)) +#define SPI_FLASH_RES_V 0x1 +#define SPI_FLASH_RES_S 20 +/* SPI_FLASH_HPM : R/W ;bitpos:[19] ;default: 1'b0 ; */ +/*description: Drive Flash into high performance mode. The bit will be cleared + once the operation done.1: enable 0: disable.*/ +#define SPI_FLASH_HPM (BIT(19)) +#define SPI_FLASH_HPM_M (BIT(19)) +#define SPI_FLASH_HPM_V 0x1 +#define SPI_FLASH_HPM_S 19 +/* SPI_USR : R/W ;bitpos:[18] ;default: 1'b0 ; */ +/*description: User define command enable. An operation will be triggered when + the bit is set. The bit will be cleared once the operation done.1: enable 0: disable.*/ +#define SPI_USR (BIT(18)) +#define SPI_USR_M (BIT(18)) +#define SPI_USR_V 0x1 +#define SPI_USR_S 18 +/* SPI_FLASH_PES : R/W ;bitpos:[17] ;default: 1'b0 ; */ +/*description: program erase suspend bit program erase suspend operation will + be triggered when the bit is set. The bit will be cleared once the operation done.1: enable 0: disable.*/ +#define SPI_FLASH_PES (BIT(17)) +#define SPI_FLASH_PES_M (BIT(17)) +#define SPI_FLASH_PES_V 0x1 +#define SPI_FLASH_PES_S 17 +/* SPI_FLASH_PER : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: program erase resume bit program erase suspend operation will + be triggered when the bit is set. The bit will be cleared once the operation done.1: enable 0: disable.*/ +#define SPI_FLASH_PER (BIT(16)) +#define SPI_FLASH_PER_M (BIT(16)) +#define SPI_FLASH_PER_V 0x1 +#define SPI_FLASH_PER_S 16 + +#define SPI_ADDR_REG(i) (REG_SPI_BASE(i) + 0x4) +//The CSV actually is wrong here. It indicates that the lower 8 bits of this register are reserved. This is not true, +//all 32 bits of SPI_ADDR_REG are usable/used. + +#define SPI_CTRL_REG(i) (REG_SPI_BASE(i) + 0x8) +/* SPI_WR_BIT_ORDER : R/W ;bitpos:[26] ;default: 1'b0 ; */ +/*description: In command address write-data (MOSI) phases 1: LSB firs 0: MSB first*/ +#define SPI_WR_BIT_ORDER (BIT(26)) +#define SPI_WR_BIT_ORDER_M (BIT(26)) +#define SPI_WR_BIT_ORDER_V 0x1 +#define SPI_WR_BIT_ORDER_S 26 +/* SPI_RD_BIT_ORDER : R/W ;bitpos:[25] ;default: 1'b0 ; */ +/*description: In read-data (MISO) phase 1: LSB first 0: MSB first*/ +#define SPI_RD_BIT_ORDER (BIT(25)) +#define SPI_RD_BIT_ORDER_M (BIT(25)) +#define SPI_RD_BIT_ORDER_V 0x1 +#define SPI_RD_BIT_ORDER_S 25 +/* SPI_FREAD_QIO : R/W ;bitpos:[24] ;default: 1'b0 ; */ +/*description: In the read operations address phase and read-data phase apply + 4 signals. 1: enable 0: disable.*/ +#define SPI_FREAD_QIO (BIT(24)) +#define SPI_FREAD_QIO_M (BIT(24)) +#define SPI_FREAD_QIO_V 0x1 +#define SPI_FREAD_QIO_S 24 +/* SPI_FREAD_DIO : R/W ;bitpos:[23] ;default: 1'b0 ; */ +/*description: In the read operations address phase and read-data phase apply + 2 signals. 1: enable 0: disable.*/ +#define SPI_FREAD_DIO (BIT(23)) +#define SPI_FREAD_DIO_M (BIT(23)) +#define SPI_FREAD_DIO_V 0x1 +#define SPI_FREAD_DIO_S 23 +/* SPI_WRSR_2B : R/W ;bitpos:[22] ;default: 1'b0 ; */ +/*description: two bytes data will be written to status register when it is + set. 1: enable 0: disable.*/ +#define SPI_WRSR_2B (BIT(22)) +#define SPI_WRSR_2B_M (BIT(22)) +#define SPI_WRSR_2B_V 0x1 +#define SPI_WRSR_2B_S 22 +/* SPI_WP_REG : R/W ;bitpos:[21] ;default: 1'b1 ; */ +/*description: Write protect signal output when SPI is idle. 1: output high 0: output low.*/ +#define SPI_WP_REG (BIT(21)) +#define SPI_WP_REG_M (BIT(21)) +#define SPI_WP_REG_V 0x1 +#define SPI_WP_REG_S 21 +/* SPI_FREAD_QUAD : R/W ;bitpos:[20] ;default: 1'b0 ; */ +/*description: In the read operations read-data phase apply 4 signals. 1: enable 0: disable.*/ +#define SPI_FREAD_QUAD (BIT(20)) +#define SPI_FREAD_QUAD_M (BIT(20)) +#define SPI_FREAD_QUAD_V 0x1 +#define SPI_FREAD_QUAD_S 20 +/* SPI_RESANDRES : R/W ;bitpos:[15] ;default: 1'b1 ; */ +/*description: The Device ID is read out to SPI_RD_STATUS register, this bit + combine with spi_flash_res bit. 1: enable 0: disable.*/ +#define SPI_RESANDRES (BIT(15)) +#define SPI_RESANDRES_M (BIT(15)) +#define SPI_RESANDRES_V 0x1 +#define SPI_RESANDRES_S 15 +/* SPI_FREAD_DUAL : R/W ;bitpos:[14] ;default: 1'b0 ; */ +/*description: In the read operations read-data phase apply 2 signals. 1: enable 0: disable.*/ +#define SPI_FREAD_DUAL (BIT(14)) +#define SPI_FREAD_DUAL_M (BIT(14)) +#define SPI_FREAD_DUAL_V 0x1 +#define SPI_FREAD_DUAL_S 14 +/* SPI_FASTRD_MODE : R/W ;bitpos:[13] ;default: 1'b1 ; */ +/*description: This bit enable the bits: spi_fread_qio spi_fread_dio spi_fread_qout + and spi_fread_dout. 1: enable 0: disable.*/ +#define SPI_FASTRD_MODE (BIT(13)) +#define SPI_FASTRD_MODE_M (BIT(13)) +#define SPI_FASTRD_MODE_V 0x1 +#define SPI_FASTRD_MODE_S 13 +/* SPI_WAIT_FLASH_IDLE_EN : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: wait flash idle when program flash or erase flash. 1: enable 0: disable.*/ +#define SPI_WAIT_FLASH_IDLE_EN (BIT(12)) +#define SPI_WAIT_FLASH_IDLE_EN_M (BIT(12)) +#define SPI_WAIT_FLASH_IDLE_EN_V 0x1 +#define SPI_WAIT_FLASH_IDLE_EN_S 12 +/* SPI_TX_CRC_EN : R/W ;bitpos:[11] ;default: 1'b0 ; */ +/*description: For SPI1 enable crc32 when writing encrypted data to flash. + 1: enable 0:disable*/ +#define SPI_TX_CRC_EN (BIT(11)) +#define SPI_TX_CRC_EN_M (BIT(11)) +#define SPI_TX_CRC_EN_V 0x1 +#define SPI_TX_CRC_EN_S 11 +/* SPI_FCS_CRC_EN : R/W ;bitpos:[10] ;default: 1'b1 ; */ +/*description: For SPI1 initialize crc32 module before writing encrypted data + to flash. Active low.*/ +#define SPI_FCS_CRC_EN (BIT(10)) +#define SPI_FCS_CRC_EN_M (BIT(10)) +#define SPI_FCS_CRC_EN_V 0x1 +#define SPI_FCS_CRC_EN_S 10 + +#define SPI_CTRL1_REG(i) (REG_SPI_BASE(i) + 0xC) +/* SPI_CS_HOLD_DELAY : R/W ;bitpos:[31:28] ;default: 4'h5 ; */ +/*description: SPI cs signal is delayed by spi clock cycles*/ +#define SPI_CS_HOLD_DELAY 0x0000000F +#define SPI_CS_HOLD_DELAY_M ((SPI_CS_HOLD_DELAY_V)<<(SPI_CS_HOLD_DELAY_S)) +#define SPI_CS_HOLD_DELAY_V 0xF +#define SPI_CS_HOLD_DELAY_S 28 +/* SPI_CS_HOLD_DELAY_RES : R/W ;bitpos:[27:16] ;default: 12'hfff ; */ +/*description: Delay cycles of resume Flash when resume Flash is enable by spi clock.*/ +#define SPI_CS_HOLD_DELAY_RES 0x00000FFF +#define SPI_CS_HOLD_DELAY_RES_M ((SPI_CS_HOLD_DELAY_RES_V)<<(SPI_CS_HOLD_DELAY_RES_S)) +#define SPI_CS_HOLD_DELAY_RES_V 0xFFF +#define SPI_CS_HOLD_DELAY_RES_S 16 + +#define SPI_RD_STATUS_REG(i) (REG_SPI_BASE(i) + 0x10) +/* SPI_STATUS_EXT : R/W ;bitpos:[31:24] ;default: 8'h00 ; */ +/*description: In the slave mode,it is the status for master to read out.*/ +#define SPI_STATUS_EXT 0x000000FF +#define SPI_STATUS_EXT_M ((SPI_STATUS_EXT_V)<<(SPI_STATUS_EXT_S)) +#define SPI_STATUS_EXT_V 0xFF +#define SPI_STATUS_EXT_S 24 +/* SPI_WB_MODE : R/W ;bitpos:[23:16] ;default: 8'h00 ; */ +/*description: Mode bits in the flash fast read mode, it is combined with spi_fastrd_mode bit.*/ +#define SPI_WB_MODE 0x000000FF +#define SPI_WB_MODE_M ((SPI_WB_MODE_V)<<(SPI_WB_MODE_S)) +#define SPI_WB_MODE_V 0xFF +#define SPI_WB_MODE_S 16 +/* SPI_STATUS : R/W ;bitpos:[15:0] ;default: 16'b0 ; */ +/*description: In the slave mode, it is the status for master to read out.*/ +#define SPI_STATUS 0x0000FFFF +#define SPI_STATUS_M ((SPI_STATUS_V)<<(SPI_STATUS_S)) +#define SPI_STATUS_V 0xFFFF +#define SPI_STATUS_S 0 + +#define SPI_CTRL2_REG(i) (REG_SPI_BASE(i) + 0x14) +/* SPI_CS_DELAY_NUM : R/W ;bitpos:[31:28] ;default: 4'h0 ; */ +/*description: spi_cs signal is delayed by system clock cycles*/ +#define SPI_CS_DELAY_NUM 0x0000000F +#define SPI_CS_DELAY_NUM_M ((SPI_CS_DELAY_NUM_V)<<(SPI_CS_DELAY_NUM_S)) +#define SPI_CS_DELAY_NUM_V 0xF +#define SPI_CS_DELAY_NUM_S 28 +/* SPI_CS_DELAY_MODE : R/W ;bitpos:[27:26] ;default: 2'h0 ; */ +/*description: spi_cs signal is delayed by spi_clk . 0: zero 1: if spi_ck_out_edge + or spi_ck_i_edge is set 1 delayed by half cycle else delayed by one cycle 2: if spi_ck_out_edge or spi_ck_i_edge is set 1 delayed by one cycle else delayed by half cycle 3: delayed one cycle*/ +#define SPI_CS_DELAY_MODE 0x00000003 +#define SPI_CS_DELAY_MODE_M ((SPI_CS_DELAY_MODE_V)<<(SPI_CS_DELAY_MODE_S)) +#define SPI_CS_DELAY_MODE_V 0x3 +#define SPI_CS_DELAY_MODE_S 26 +/* SPI_MOSI_DELAY_NUM : R/W ;bitpos:[25:23] ;default: 3'h0 ; */ +/*description: MOSI signals are delayed by system clock cycles*/ +#define SPI_MOSI_DELAY_NUM 0x00000007 +#define SPI_MOSI_DELAY_NUM_M ((SPI_MOSI_DELAY_NUM_V)<<(SPI_MOSI_DELAY_NUM_S)) +#define SPI_MOSI_DELAY_NUM_V 0x7 +#define SPI_MOSI_DELAY_NUM_S 23 +/* SPI_MOSI_DELAY_MODE : R/W ;bitpos:[22:21] ;default: 2'h0 ; */ +/*description: MOSI signals are delayed by spi_clk. 0: zero 1: if spi_ck_out_edge + or spi_ck_i_edge is set 1 delayed by half cycle else delayed by one cycle 2: if spi_ck_out_edge or spi_ck_i_edge is set 1 delayed by one cycle else delayed by half cycle 3: delayed one cycle*/ +#define SPI_MOSI_DELAY_MODE 0x00000003 +#define SPI_MOSI_DELAY_MODE_M ((SPI_MOSI_DELAY_MODE_V)<<(SPI_MOSI_DELAY_MODE_S)) +#define SPI_MOSI_DELAY_MODE_V 0x3 +#define SPI_MOSI_DELAY_MODE_S 21 +/* SPI_MISO_DELAY_NUM : R/W ;bitpos:[20:18] ;default: 3'h0 ; */ +/*description: MISO signals are delayed by system clock cycles*/ +#define SPI_MISO_DELAY_NUM 0x00000007 +#define SPI_MISO_DELAY_NUM_M ((SPI_MISO_DELAY_NUM_V)<<(SPI_MISO_DELAY_NUM_S)) +#define SPI_MISO_DELAY_NUM_V 0x7 +#define SPI_MISO_DELAY_NUM_S 18 +/* SPI_MISO_DELAY_MODE : R/W ;bitpos:[17:16] ;default: 2'h0 ; */ +/*description: MISO signals are delayed by spi_clk. 0: zero 1: if spi_ck_out_edge + or spi_ck_i_edge is set 1 delayed by half cycle else delayed by one cycle 2: if spi_ck_out_edge or spi_ck_i_edge is set 1 delayed by one cycle else delayed by half cycle 3: delayed one cycle*/ +#define SPI_MISO_DELAY_MODE 0x00000003 +#define SPI_MISO_DELAY_MODE_M ((SPI_MISO_DELAY_MODE_V)<<(SPI_MISO_DELAY_MODE_S)) +#define SPI_MISO_DELAY_MODE_V 0x3 +#define SPI_MISO_DELAY_MODE_S 16 +/* SPI_CK_OUT_HIGH_MODE : R/W ;bitpos:[15:12] ;default: 4'h0 ; */ +/*description: modify spi clock duty ratio when the value is lager than 8, + the bits are combined with spi_clkcnt_N bits and spi_clkcnt_H bits.*/ +#define SPI_CK_OUT_HIGH_MODE 0x0000000F +#define SPI_CK_OUT_HIGH_MODE_M ((SPI_CK_OUT_HIGH_MODE_V)<<(SPI_CK_OUT_HIGH_MODE_S)) +#define SPI_CK_OUT_HIGH_MODE_V 0xF +#define SPI_CK_OUT_HIGH_MODE_S 12 +/* SPI_CK_OUT_LOW_MODE : R/W ;bitpos:[11:8] ;default: 4'h0 ; */ +/*description: modify spi clock duty ratio when the value is lager than 8, + the bits are combined with spi_clkcnt_N bits and spi_clkcnt_L bits.*/ +#define SPI_CK_OUT_LOW_MODE 0x0000000F +#define SPI_CK_OUT_LOW_MODE_M ((SPI_CK_OUT_LOW_MODE_V)<<(SPI_CK_OUT_LOW_MODE_S)) +#define SPI_CK_OUT_LOW_MODE_V 0xF +#define SPI_CK_OUT_LOW_MODE_S 8 +/* SPI_HOLD_TIME : R/W ;bitpos:[7:4] ;default: 4'h1 ; */ +/*description: delay cycles of cs pin by spi clock, this bits combined with spi_cs_hold bit.*/ +#define SPI_HOLD_TIME 0x0000000F +#define SPI_HOLD_TIME_M ((SPI_HOLD_TIME_V)<<(SPI_HOLD_TIME_S)) +#define SPI_HOLD_TIME_V 0xF +#define SPI_HOLD_TIME_S 4 +/* SPI_SETUP_TIME : R/W ;bitpos:[3:0] ;default: 4'h1 ; */ +/*description: (cycles-1) of ¡°prepare¡± phase by spi clock, this bits combined + with spi_cs_setup bit.*/ +#define SPI_SETUP_TIME 0x0000000F +#define SPI_SETUP_TIME_M ((SPI_SETUP_TIME_V)<<(SPI_SETUP_TIME_S)) +#define SPI_SETUP_TIME_V 0xF +#define SPI_SETUP_TIME_S 0 + +#define SPI_CLOCK_REG(i) (REG_SPI_BASE(i) + 0x18) +/* SPI_CLK_EQU_SYSCLK : R/W ;bitpos:[31] ;default: 1'b1 ; */ +/*description: In the master mode 1: spi_clk is eqaul to system 0: spi_clk is + divided from system clock.*/ +#define SPI_CLK_EQU_SYSCLK (BIT(31)) +#define SPI_CLK_EQU_SYSCLK_M (BIT(31)) +#define SPI_CLK_EQU_SYSCLK_V 0x1 +#define SPI_CLK_EQU_SYSCLK_S 31 +/* SPI_CLKDIV_PRE : R/W ;bitpos:[30:18] ;default: 13'b0 ; */ +/*description: In the master mode it is pre-divider of spi_clk.*/ +#define SPI_CLKDIV_PRE 0x00001FFF +#define SPI_CLKDIV_PRE_M ((SPI_CLKDIV_PRE_V)<<(SPI_CLKDIV_PRE_S)) +#define SPI_CLKDIV_PRE_V 0x1FFF +#define SPI_CLKDIV_PRE_S 18 +/* SPI_CLKCNT_N : R/W ;bitpos:[17:12] ;default: 6'h3 ; */ +/*description: In the master mode it is the divider of spi_clk. So spi_clk frequency + is system/(spi_clkdiv_pre+1)/(spi_clkcnt_N+1)*/ +#define SPI_CLKCNT_N 0x0000003F +#define SPI_CLKCNT_N_M ((SPI_CLKCNT_N_V)<<(SPI_CLKCNT_N_S)) +#define SPI_CLKCNT_N_V 0x3F +#define SPI_CLKCNT_N_S 12 +/* SPI_CLKCNT_H : R/W ;bitpos:[11:6] ;default: 6'h1 ; */ +/*description: In the master mode it must be floor((spi_clkcnt_N+1)/2-1). In + the slave mode it must be 0.*/ +#define SPI_CLKCNT_H 0x0000003F +#define SPI_CLKCNT_H_M ((SPI_CLKCNT_H_V)<<(SPI_CLKCNT_H_S)) +#define SPI_CLKCNT_H_V 0x3F +#define SPI_CLKCNT_H_S 6 +/* SPI_CLKCNT_L : R/W ;bitpos:[5:0] ;default: 6'h3 ; */ +/*description: In the master mode it must be equal to spi_clkcnt_N. In the slave + mode it must be 0.*/ +#define SPI_CLKCNT_L 0x0000003F +#define SPI_CLKCNT_L_M ((SPI_CLKCNT_L_V)<<(SPI_CLKCNT_L_S)) +#define SPI_CLKCNT_L_V 0x3F +#define SPI_CLKCNT_L_S 0 + +#define SPI_USER_REG(i) (REG_SPI_BASE(i) + 0x1C) +/* SPI_USR_COMMAND : R/W ;bitpos:[31] ;default: 1'b1 ; */ +/*description: This bit enable the command phase of an operation.*/ +#define SPI_USR_COMMAND (BIT(31)) +#define SPI_USR_COMMAND_M (BIT(31)) +#define SPI_USR_COMMAND_V 0x1 +#define SPI_USR_COMMAND_S 31 +/* SPI_USR_ADDR : R/W ;bitpos:[30] ;default: 1'b0 ; */ +/*description: This bit enable the address phase of an operation.*/ +#define SPI_USR_ADDR (BIT(30)) +#define SPI_USR_ADDR_M (BIT(30)) +#define SPI_USR_ADDR_V 0x1 +#define SPI_USR_ADDR_S 30 +/* SPI_USR_DUMMY : R/W ;bitpos:[29] ;default: 1'b0 ; */ +/*description: This bit enable the dummy phase of an operation.*/ +#define SPI_USR_DUMMY (BIT(29)) +#define SPI_USR_DUMMY_M (BIT(29)) +#define SPI_USR_DUMMY_V 0x1 +#define SPI_USR_DUMMY_S 29 +/* SPI_USR_MISO : R/W ;bitpos:[28] ;default: 1'b0 ; */ +/*description: This bit enable the read-data phase of an operation.*/ +#define SPI_USR_MISO (BIT(28)) +#define SPI_USR_MISO_M (BIT(28)) +#define SPI_USR_MISO_V 0x1 +#define SPI_USR_MISO_S 28 +/* SPI_USR_MOSI : R/W ;bitpos:[27] ;default: 1'b0 ; */ +/*description: This bit enable the write-data phase of an operation.*/ +#define SPI_USR_MOSI (BIT(27)) +#define SPI_USR_MOSI_M (BIT(27)) +#define SPI_USR_MOSI_V 0x1 +#define SPI_USR_MOSI_S 27 +/* SPI_USR_DUMMY_IDLE : R/W ;bitpos:[26] ;default: 1'b0 ; */ +/*description: spi clock is disable in dummy phase when the bit is enable.*/ +#define SPI_USR_DUMMY_IDLE (BIT(26)) +#define SPI_USR_DUMMY_IDLE_M (BIT(26)) +#define SPI_USR_DUMMY_IDLE_V 0x1 +#define SPI_USR_DUMMY_IDLE_S 26 +/* SPI_USR_MOSI_HIGHPART : R/W ;bitpos:[25] ;default: 1'b0 ; */ +/*description: write-data phase only access to high-part of the buffer spi_w8~spi_w15. + 1: enable 0: disable.*/ +#define SPI_USR_MOSI_HIGHPART (BIT(25)) +#define SPI_USR_MOSI_HIGHPART_M (BIT(25)) +#define SPI_USR_MOSI_HIGHPART_V 0x1 +#define SPI_USR_MOSI_HIGHPART_S 25 +/* SPI_USR_MISO_HIGHPART : R/W ;bitpos:[24] ;default: 1'b0 ; */ +/*description: read-data phase only access to high-part of the buffer spi_w8~spi_w15. + 1: enable 0: disable.*/ +#define SPI_USR_MISO_HIGHPART (BIT(24)) +#define SPI_USR_MISO_HIGHPART_M (BIT(24)) +#define SPI_USR_MISO_HIGHPART_V 0x1 +#define SPI_USR_MISO_HIGHPART_S 24 +/* SPI_USR_PREP_HOLD : R/W ;bitpos:[23] ;default: 1'b0 ; */ +/*description: spi is hold at prepare state the bit combined with spi_usr_hold_pol bit.*/ +#define SPI_USR_PREP_HOLD (BIT(23)) +#define SPI_USR_PREP_HOLD_M (BIT(23)) +#define SPI_USR_PREP_HOLD_V 0x1 +#define SPI_USR_PREP_HOLD_S 23 +/* SPI_USR_CMD_HOLD : R/W ;bitpos:[22] ;default: 1'b0 ; */ +/*description: spi is hold at command state the bit combined with spi_usr_hold_pol bit.*/ +#define SPI_USR_CMD_HOLD (BIT(22)) +#define SPI_USR_CMD_HOLD_M (BIT(22)) +#define SPI_USR_CMD_HOLD_V 0x1 +#define SPI_USR_CMD_HOLD_S 22 +/* SPI_USR_ADDR_HOLD : R/W ;bitpos:[21] ;default: 1'b0 ; */ +/*description: spi is hold at address state the bit combined with spi_usr_hold_pol bit.*/ +#define SPI_USR_ADDR_HOLD (BIT(21)) +#define SPI_USR_ADDR_HOLD_M (BIT(21)) +#define SPI_USR_ADDR_HOLD_V 0x1 +#define SPI_USR_ADDR_HOLD_S 21 +/* SPI_USR_DUMMY_HOLD : R/W ;bitpos:[20] ;default: 1'b0 ; */ +/*description: spi is hold at dummy state the bit combined with spi_usr_hold_pol bit.*/ +#define SPI_USR_DUMMY_HOLD (BIT(20)) +#define SPI_USR_DUMMY_HOLD_M (BIT(20)) +#define SPI_USR_DUMMY_HOLD_V 0x1 +#define SPI_USR_DUMMY_HOLD_S 20 +/* SPI_USR_DIN_HOLD : R/W ;bitpos:[19] ;default: 1'b0 ; */ +/*description: spi is hold at data in state the bit combined with spi_usr_hold_pol bit.*/ +#define SPI_USR_DIN_HOLD (BIT(19)) +#define SPI_USR_DIN_HOLD_M (BIT(19)) +#define SPI_USR_DIN_HOLD_V 0x1 +#define SPI_USR_DIN_HOLD_S 19 +/* SPI_USR_DOUT_HOLD : R/W ;bitpos:[18] ;default: 1'b0 ; */ +/*description: spi is hold at data out state the bit combined with spi_usr_hold_pol bit.*/ +#define SPI_USR_DOUT_HOLD (BIT(18)) +#define SPI_USR_DOUT_HOLD_M (BIT(18)) +#define SPI_USR_DOUT_HOLD_V 0x1 +#define SPI_USR_DOUT_HOLD_S 18 +/* SPI_USR_HOLD_POL : R/W ;bitpos:[17] ;default: 1'b0 ; */ +/*description: It is combined with hold bits to set the polarity of spi hold + line 1: spi will be held when spi hold line is high 0: spi will be held when spi hold line is low*/ +#define SPI_USR_HOLD_POL (BIT(17)) +#define SPI_USR_HOLD_POL_M (BIT(17)) +#define SPI_USR_HOLD_POL_V 0x1 +#define SPI_USR_HOLD_POL_S 17 +/* SPI_SIO : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: Set the bit to enable 3-line half duplex communication mosi + and miso signals share the same pin. 1: enable 0: disable.*/ +#define SPI_SIO (BIT(16)) +#define SPI_SIO_M (BIT(16)) +#define SPI_SIO_V 0x1 +#define SPI_SIO_S 16 +/* SPI_FWRITE_QIO : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: In the write operations address phase and read-data phase apply 4 signals.*/ +#define SPI_FWRITE_QIO (BIT(15)) +#define SPI_FWRITE_QIO_M (BIT(15)) +#define SPI_FWRITE_QIO_V 0x1 +#define SPI_FWRITE_QIO_S 15 +/* SPI_FWRITE_DIO : R/W ;bitpos:[14] ;default: 1'b0 ; */ +/*description: In the write operations address phase and read-data phase apply 2 signals.*/ +#define SPI_FWRITE_DIO (BIT(14)) +#define SPI_FWRITE_DIO_M (BIT(14)) +#define SPI_FWRITE_DIO_V 0x1 +#define SPI_FWRITE_DIO_S 14 +/* SPI_FWRITE_QUAD : R/W ;bitpos:[13] ;default: 1'b0 ; */ +/*description: In the write operations read-data phase apply 4 signals*/ +#define SPI_FWRITE_QUAD (BIT(13)) +#define SPI_FWRITE_QUAD_M (BIT(13)) +#define SPI_FWRITE_QUAD_V 0x1 +#define SPI_FWRITE_QUAD_S 13 +/* SPI_FWRITE_DUAL : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: In the write operations read-data phase apply 2 signals*/ +#define SPI_FWRITE_DUAL (BIT(12)) +#define SPI_FWRITE_DUAL_M (BIT(12)) +#define SPI_FWRITE_DUAL_V 0x1 +#define SPI_FWRITE_DUAL_S 12 +/* SPI_WR_BYTE_ORDER : R/W ;bitpos:[11] ;default: 1'b0 ; */ +/*description: In command address write-data (MOSI) phases 1: big-endian 0: litte_endian*/ +#define SPI_WR_BYTE_ORDER (BIT(11)) +#define SPI_WR_BYTE_ORDER_M (BIT(11)) +#define SPI_WR_BYTE_ORDER_V 0x1 +#define SPI_WR_BYTE_ORDER_S 11 +/* SPI_RD_BYTE_ORDER : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: In read-data (MISO) phase 1: big-endian 0: little_endian*/ +#define SPI_RD_BYTE_ORDER (BIT(10)) +#define SPI_RD_BYTE_ORDER_M (BIT(10)) +#define SPI_RD_BYTE_ORDER_V 0x1 +#define SPI_RD_BYTE_ORDER_S 10 +/* SPI_CK_OUT_EDGE : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: the bit combined with spi_mosi_delay_mode bits to set mosi signal delay mode.*/ +#define SPI_CK_OUT_EDGE (BIT(7)) +#define SPI_CK_OUT_EDGE_M (BIT(7)) +#define SPI_CK_OUT_EDGE_V 0x1 +#define SPI_CK_OUT_EDGE_S 7 +/* SPI_CK_I_EDGE : R/W ;bitpos:[6] ;default: 1'b1 ; */ +/*description: In the slave mode the bit is same as spi_ck_out_edge in master + mode. It is combined with spi_miso_delay_mode bits.*/ +#define SPI_CK_I_EDGE (BIT(6)) +#define SPI_CK_I_EDGE_M (BIT(6)) +#define SPI_CK_I_EDGE_V 0x1 +#define SPI_CK_I_EDGE_S 6 +/* SPI_CS_SETUP : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: spi cs is enable when spi is in ¡°prepare¡± phase. 1: enable 0: disable.*/ +#define SPI_CS_SETUP (BIT(5)) +#define SPI_CS_SETUP_M (BIT(5)) +#define SPI_CS_SETUP_V 0x1 +#define SPI_CS_SETUP_S 5 +/* SPI_CS_HOLD : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: spi cs keep low when spi is in ¡°done¡± phase. 1: enable 0: disable.*/ +#define SPI_CS_HOLD (BIT(4)) +#define SPI_CS_HOLD_M (BIT(4)) +#define SPI_CS_HOLD_V 0x1 +#define SPI_CS_HOLD_S 4 +/* SPI_DOUTDIN : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: Set the bit to enable full duplex communication. 1: enable 0: disable.*/ +#define SPI_DOUTDIN (BIT(0)) +#define SPI_DOUTDIN_M (BIT(0)) +#define SPI_DOUTDIN_V 0x1 +#define SPI_DOUTDIN_S 0 + +#define SPI_USER1_REG(i) (REG_SPI_BASE(i) + 0x20) +/* SPI_USR_ADDR_BITLEN : RO ;bitpos:[31:26] ;default: 6'd23 ; */ +/*description: The length in bits of address phase. The register value shall be (bit_num-1).*/ +#define SPI_USR_ADDR_BITLEN 0x0000003F +#define SPI_USR_ADDR_BITLEN_M ((SPI_USR_ADDR_BITLEN_V)<<(SPI_USR_ADDR_BITLEN_S)) +#define SPI_USR_ADDR_BITLEN_V 0x3F +#define SPI_USR_ADDR_BITLEN_S 26 +/* SPI_USR_DUMMY_CYCLELEN : R/W ;bitpos:[7:0] ;default: 8'd7 ; */ +/*description: The length in spi_clk cycles of dummy phase. The register value + shall be (cycle_num-1).*/ +#define SPI_USR_DUMMY_CYCLELEN 0x000000FF +#define SPI_USR_DUMMY_CYCLELEN_M ((SPI_USR_DUMMY_CYCLELEN_V)<<(SPI_USR_DUMMY_CYCLELEN_S)) +#define SPI_USR_DUMMY_CYCLELEN_V 0xFF +#define SPI_USR_DUMMY_CYCLELEN_S 0 + +#define SPI_USER2_REG(i) (REG_SPI_BASE(i) + 0x24) +/* SPI_USR_COMMAND_BITLEN : R/W ;bitpos:[31:28] ;default: 4'd7 ; */ +/*description: The length in bits of command phase. The register value shall be (bit_num-1)*/ +#define SPI_USR_COMMAND_BITLEN 0x0000000F +#define SPI_USR_COMMAND_BITLEN_M ((SPI_USR_COMMAND_BITLEN_V)<<(SPI_USR_COMMAND_BITLEN_S)) +#define SPI_USR_COMMAND_BITLEN_V 0xF +#define SPI_USR_COMMAND_BITLEN_S 28 +/* SPI_USR_COMMAND_VALUE : R/W ;bitpos:[15:0] ;default: 16'b0 ; */ +/*description: The value of command.*/ +#define SPI_USR_COMMAND_VALUE 0x0000FFFF +#define SPI_USR_COMMAND_VALUE_M ((SPI_USR_COMMAND_VALUE_V)<<(SPI_USR_COMMAND_VALUE_S)) +#define SPI_USR_COMMAND_VALUE_V 0xFFFF +#define SPI_USR_COMMAND_VALUE_S 0 + +#define SPI_MOSI_DLEN_REG(i) (REG_SPI_BASE(i) + 0x28) +/* SPI_USR_MOSI_DBITLEN : R/W ;bitpos:[23:0] ;default: 24'h0 ; */ +/*description: The length in bits of write-data. The register value shall be (bit_num-1).*/ +#define SPI_USR_MOSI_DBITLEN 0x00FFFFFF +#define SPI_USR_MOSI_DBITLEN_M ((SPI_USR_MOSI_DBITLEN_V)<<(SPI_USR_MOSI_DBITLEN_S)) +#define SPI_USR_MOSI_DBITLEN_V 0xFFFFFF +#define SPI_USR_MOSI_DBITLEN_S 0 + +#define SPI_MISO_DLEN_REG(i) (REG_SPI_BASE(i) + 0x2C) +/* SPI_USR_MISO_DBITLEN : R/W ;bitpos:[23:0] ;default: 24'h0 ; */ +/*description: The length in bits of read-data. The register value shall be (bit_num-1).*/ +#define SPI_USR_MISO_DBITLEN 0x00FFFFFF +#define SPI_USR_MISO_DBITLEN_M ((SPI_USR_MISO_DBITLEN_V)<<(SPI_USR_MISO_DBITLEN_S)) +#define SPI_USR_MISO_DBITLEN_V 0xFFFFFF +#define SPI_USR_MISO_DBITLEN_S 0 + +#define SPI_SLV_WR_STATUS_REG(i) (REG_SPI_BASE(i) + 0x30) +/* SPI_SLV_WR_ST : R/W ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: In the slave mode this register are the status register for the + master to write into. In the master mode this register are the higher 32bits in the 64 bits address condition.*/ +#define SPI_SLV_WR_ST 0xFFFFFFFF +#define SPI_SLV_WR_ST_M ((SPI_SLV_WR_ST_V)<<(SPI_SLV_WR_ST_S)) +#define SPI_SLV_WR_ST_V 0xFFFFFFFF +#define SPI_SLV_WR_ST_S 0 + +#define SPI_PIN_REG(i) (REG_SPI_BASE(i) + 0x34) +/* SPI_CS_KEEP_ACTIVE : R/W ;bitpos:[30] ;default: 1'b0 ; */ +/*description: spi cs line keep low when the bit is set.*/ +#define SPI_CS_KEEP_ACTIVE (BIT(30)) +#define SPI_CS_KEEP_ACTIVE_M (BIT(30)) +#define SPI_CS_KEEP_ACTIVE_V 0x1 +#define SPI_CS_KEEP_ACTIVE_S 30 +/* SPI_CK_IDLE_EDGE : R/W ;bitpos:[29] ;default: 1'b0 ; */ +/*description: 1: spi clk line is high when idle 0: spi clk line is low when idle*/ +#define SPI_CK_IDLE_EDGE (BIT(29)) +#define SPI_CK_IDLE_EDGE_M (BIT(29)) +#define SPI_CK_IDLE_EDGE_V 0x1 +#define SPI_CK_IDLE_EDGE_S 29 +/* SPI_MASTER_CK_SEL : R/W ;bitpos:[13:11] ;default: 3'b0 ; */ +/*description: In the master mode spi cs line is enable as spi clk it is combined + with spi_cs0_dis spi_cs1_dis spi_cs2_dis.*/ +#define SPI_MASTER_CK_SEL 0x00000007 +#define SPI_MASTER_CK_SEL_M ((SPI_MASTER_CK_SEL_V)<<(SPI_MASTER_CK_SEL_S)) +#define SPI_MASTER_CK_SEL_V 0x07 +#define SPI_MASTER_CK_SEL_S 11 +/* SPI_MASTER_CS_POL : R/W ;bitpos:[8:6] ;default: 3'b0 ; */ +/*description: In the master mode the bits are the polarity of spi cs line + the value is equivalent to spi_cs ^ spi_master_cs_pol.*/ +#define SPI_MASTER_CS_POL 0x00000007 +#define SPI_MASTER_CS_POL_M ((SPI_MASTER_CS_POL_V)<<(SPI_MASTER_CS_POL_S)) +#define SPI_MASTER_CS_POL_V 0x7 +#define SPI_MASTER_CS_POL_S 6 +/* SPI_CK_DIS : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: 1: spi clk out disable 0: spi clk out enable*/ +#define SPI_CK_DIS (BIT(5)) +#define SPI_CK_DIS_M (BIT(5)) +#define SPI_CK_DIS_V 0x1 +#define SPI_CK_DIS_S 5 +/* SPI_CS2_DIS : R/W ;bitpos:[2] ;default: 1'b1 ; */ +/*description: SPI CS2 pin enable, 1: disable CS2, 0: spi_cs2 signal is from/to CS2 pin*/ +#define SPI_CS2_DIS (BIT(2)) +#define SPI_CS2_DIS_M (BIT(2)) +#define SPI_CS2_DIS_V 0x1 +#define SPI_CS2_DIS_S 2 +/* SPI_CS1_DIS : R/W ;bitpos:[1] ;default: 1'b1 ; */ +/*description: SPI CS1 pin enable, 1: disable CS1, 0: spi_cs1 signal is from/to CS1 pin*/ +#define SPI_CS1_DIS (BIT(1)) +#define SPI_CS1_DIS_M (BIT(1)) +#define SPI_CS1_DIS_V 0x1 +#define SPI_CS1_DIS_S 1 +/* SPI_CS0_DIS : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: SPI CS0 pin enable, 1: disable CS0, 0: spi_cs0 signal is from/to CS0 pin*/ +#define SPI_CS0_DIS (BIT(0)) +#define SPI_CS0_DIS_M (BIT(0)) +#define SPI_CS0_DIS_V 0x1 +#define SPI_CS0_DIS_S 0 + +#define SPI_SLAVE_REG(i) (REG_SPI_BASE(i) + 0x38) +/* SPI_SYNC_RESET : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: Software reset enable, reset the spi clock line cs line and data lines.*/ +#define SPI_SYNC_RESET (BIT(31)) +#define SPI_SYNC_RESET_M (BIT(31)) +#define SPI_SYNC_RESET_V 0x1 +#define SPI_SYNC_RESET_S 31 +/* SPI_SLAVE_MODE : R/W ;bitpos:[30] ;default: 1'b0 ; */ +/*description: 1: slave mode 0: master mode.*/ +#define SPI_SLAVE_MODE (BIT(30)) +#define SPI_SLAVE_MODE_M (BIT(30)) +#define SPI_SLAVE_MODE_V 0x1 +#define SPI_SLAVE_MODE_S 30 +/* SPI_SLV_WR_RD_BUF_EN : R/W ;bitpos:[29] ;default: 1'b0 ; */ +/*description: write and read buffer enable in the slave mode*/ +#define SPI_SLV_WR_RD_BUF_EN (BIT(29)) +#define SPI_SLV_WR_RD_BUF_EN_M (BIT(29)) +#define SPI_SLV_WR_RD_BUF_EN_V 0x1 +#define SPI_SLV_WR_RD_BUF_EN_S 29 +/* SPI_SLV_WR_RD_STA_EN : R/W ;bitpos:[28] ;default: 1'b0 ; */ +/*description: write and read status enable in the slave mode*/ +#define SPI_SLV_WR_RD_STA_EN (BIT(28)) +#define SPI_SLV_WR_RD_STA_EN_M (BIT(28)) +#define SPI_SLV_WR_RD_STA_EN_V 0x1 +#define SPI_SLV_WR_RD_STA_EN_S 28 +/* SPI_SLV_CMD_DEFINE : R/W ;bitpos:[27] ;default: 1'b0 ; */ +/*description: 1: slave mode commands are defined in SPI_SLAVE3. 0: slave mode + commands are fixed as: 1: write-status 2: write-buffer and 3: read-buffer.*/ +#define SPI_SLV_CMD_DEFINE (BIT(27)) +#define SPI_SLV_CMD_DEFINE_M (BIT(27)) +#define SPI_SLV_CMD_DEFINE_V 0x1 +#define SPI_SLV_CMD_DEFINE_S 27 +/* SPI_TRANS_CNT : RO ;bitpos:[26:23] ;default: 4'b0 ; */ +/*description: The operations counter in both the master mode and the slave + mode. 4: read-status*/ +#define SPI_TRANS_CNT 0x0000000F +#define SPI_TRANS_CNT_M ((SPI_TRANS_CNT_V)<<(SPI_TRANS_CNT_S)) +#define SPI_TRANS_CNT_V 0xF +#define SPI_TRANS_CNT_S 23 +/* SPI_SLV_LAST_STATE : RO ;bitpos:[22:20] ;default: 3'b0 ; */ +/*description: In the slave mode it is the state of spi state machine.*/ +#define SPI_SLV_LAST_STATE 0x00000007 +#define SPI_SLV_LAST_STATE_M ((SPI_SLV_LAST_STATE_V)<<(SPI_SLV_LAST_STATE_S)) +#define SPI_SLV_LAST_STATE_V 0x7 +#define SPI_SLV_LAST_STATE_S 20 +/* SPI_SLV_LAST_COMMAND : RO ;bitpos:[19:17] ;default: 3'b0 ; */ +/*description: In the slave mode it is the value of command.*/ +#define SPI_SLV_LAST_COMMAND 0x00000007 +#define SPI_SLV_LAST_COMMAND_M ((SPI_SLV_LAST_COMMAND_V)<<(SPI_SLV_LAST_COMMAND_S)) +#define SPI_SLV_LAST_COMMAND_V 0x7 +#define SPI_SLV_LAST_COMMAND_S 17 +/* SPI_CS_I_MODE : R/W ;bitpos:[11:10] ;default: 2'b0 ; */ +/*description: In the slave mode this bits used to synchronize the input spi + cs signal and eliminate spi cs jitter.*/ +#define SPI_CS_I_MODE 0x00000003 +#define SPI_CS_I_MODE_M ((SPI_CS_I_MODE_V)<<(SPI_CS_I_MODE_S)) +#define SPI_CS_I_MODE_V 0x3 +#define SPI_CS_I_MODE_S 10 +/* SPI_INT_EN : R/W ;bitpos:[9:5] ;default: 5'b1_0000 ; */ +/*description: Interrupt enable bits for the below 5 sources*/ +#define SPI_INT_EN 0x0000001F +#define SPI_INT_EN_M ((SPI_INT_EN_V)<<(SPI_INT_EN_S)) +#define SPI_INT_EN_V 0x1F +#define SPI_INT_EN_S 5 +/* SPI_TRANS_DONE : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for the completion of any operation in + both the master mode and the slave mode.*/ +#define SPI_TRANS_DONE (BIT(4)) +#define SPI_TRANS_DONE_M (BIT(4)) +#define SPI_TRANS_DONE_V 0x1 +#define SPI_TRANS_DONE_S 4 +/* SPI_SLV_WR_STA_DONE : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for the completion of write-status operation + in the slave mode.*/ +#define SPI_SLV_WR_STA_DONE (BIT(3)) +#define SPI_SLV_WR_STA_DONE_M (BIT(3)) +#define SPI_SLV_WR_STA_DONE_V 0x1 +#define SPI_SLV_WR_STA_DONE_S 3 +/* SPI_SLV_RD_STA_DONE : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for the completion of read-status operation + in the slave mode.*/ +#define SPI_SLV_RD_STA_DONE (BIT(2)) +#define SPI_SLV_RD_STA_DONE_M (BIT(2)) +#define SPI_SLV_RD_STA_DONE_V 0x1 +#define SPI_SLV_RD_STA_DONE_S 2 +/* SPI_SLV_WR_BUF_DONE : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for the completion of write-buffer operation + in the slave mode.*/ +#define SPI_SLV_WR_BUF_DONE (BIT(1)) +#define SPI_SLV_WR_BUF_DONE_M (BIT(1)) +#define SPI_SLV_WR_BUF_DONE_V 0x1 +#define SPI_SLV_WR_BUF_DONE_S 1 +/* SPI_SLV_RD_BUF_DONE : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: The interrupt raw bit for the completion of read-buffer operation + in the slave mode.*/ +#define SPI_SLV_RD_BUF_DONE (BIT(0)) +#define SPI_SLV_RD_BUF_DONE_M (BIT(0)) +#define SPI_SLV_RD_BUF_DONE_V 0x1 +#define SPI_SLV_RD_BUF_DONE_S 0 + +#define SPI_SLAVE1_REG(i) (REG_SPI_BASE(i) + 0x3C) +/* SPI_SLV_STATUS_BITLEN : R/W ;bitpos:[31:27] ;default: 5'b0 ; */ +/*description: In the slave mode it is the length of status bit.*/ +#define SPI_SLV_STATUS_BITLEN 0x0000001F +#define SPI_SLV_STATUS_BITLEN_M ((SPI_SLV_STATUS_BITLEN_V)<<(SPI_SLV_STATUS_BITLEN_S)) +#define SPI_SLV_STATUS_BITLEN_V 0x1F +#define SPI_SLV_STATUS_BITLEN_S 27 +/* SPI_SLV_STATUS_FAST_EN : R/W ;bitpos:[26] ;default: 1'b0 ; */ +/*description: In the slave mode enable fast read status.*/ +#define SPI_SLV_STATUS_FAST_EN (BIT(26)) +#define SPI_SLV_STATUS_FAST_EN_M (BIT(26)) +#define SPI_SLV_STATUS_FAST_EN_V 0x1 +#define SPI_SLV_STATUS_FAST_EN_S 26 +/* SPI_SLV_STATUS_READBACK : R/W ;bitpos:[25] ;default: 1'b1 ; */ +/*description: In the slave mode 1:read register of SPI_SLV_WR_STATUS 0: read + register of SPI_RD_STATUS.*/ +#define SPI_SLV_STATUS_READBACK (BIT(25)) +#define SPI_SLV_STATUS_READBACK_M (BIT(25)) +#define SPI_SLV_STATUS_READBACK_V 0x1 +#define SPI_SLV_STATUS_READBACK_S 25 +/* SPI_SLV_RD_ADDR_BITLEN : R/W ;bitpos:[15:10] ;default: 6'h0 ; */ +/*description: In the slave mode it is the address length in bits for read-buffer + operation. The register value shall be (bit_num-1).*/ +#define SPI_SLV_RD_ADDR_BITLEN 0x0000003F +#define SPI_SLV_RD_ADDR_BITLEN_M ((SPI_SLV_RD_ADDR_BITLEN_V)<<(SPI_SLV_RD_ADDR_BITLEN_S)) +#define SPI_SLV_RD_ADDR_BITLEN_V 0x3F +#define SPI_SLV_RD_ADDR_BITLEN_S 10 +/* SPI_SLV_WR_ADDR_BITLEN : R/W ;bitpos:[9:4] ;default: 6'h0 ; */ +/*description: In the slave mode it is the address length in bits for write-buffer + operation. The register value shall be (bit_num-1).*/ +#define SPI_SLV_WR_ADDR_BITLEN 0x0000003F +#define SPI_SLV_WR_ADDR_BITLEN_M ((SPI_SLV_WR_ADDR_BITLEN_V)<<(SPI_SLV_WR_ADDR_BITLEN_S)) +#define SPI_SLV_WR_ADDR_BITLEN_V 0x3F +#define SPI_SLV_WR_ADDR_BITLEN_S 4 +/* SPI_SLV_WRSTA_DUMMY_EN : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: In the slave mode it is the enable bit of dummy phase for write-status + operations.*/ +#define SPI_SLV_WRSTA_DUMMY_EN (BIT(3)) +#define SPI_SLV_WRSTA_DUMMY_EN_M (BIT(3)) +#define SPI_SLV_WRSTA_DUMMY_EN_V 0x1 +#define SPI_SLV_WRSTA_DUMMY_EN_S 3 +/* SPI_SLV_RDSTA_DUMMY_EN : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: In the slave mode it is the enable bit of dummy phase for read-status + operations.*/ +#define SPI_SLV_RDSTA_DUMMY_EN (BIT(2)) +#define SPI_SLV_RDSTA_DUMMY_EN_M (BIT(2)) +#define SPI_SLV_RDSTA_DUMMY_EN_V 0x1 +#define SPI_SLV_RDSTA_DUMMY_EN_S 2 +/* SPI_SLV_WRBUF_DUMMY_EN : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: In the slave mode it is the enable bit of dummy phase for write-buffer + operations.*/ +#define SPI_SLV_WRBUF_DUMMY_EN (BIT(1)) +#define SPI_SLV_WRBUF_DUMMY_EN_M (BIT(1)) +#define SPI_SLV_WRBUF_DUMMY_EN_V 0x1 +#define SPI_SLV_WRBUF_DUMMY_EN_S 1 +/* SPI_SLV_RDBUF_DUMMY_EN : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: In the slave mode it is the enable bit of dummy phase for read-buffer + operations.*/ +#define SPI_SLV_RDBUF_DUMMY_EN (BIT(0)) +#define SPI_SLV_RDBUF_DUMMY_EN_M (BIT(0)) +#define SPI_SLV_RDBUF_DUMMY_EN_V 0x1 +#define SPI_SLV_RDBUF_DUMMY_EN_S 0 + +#define SPI_SLAVE2_REG(i) (REG_SPI_BASE(i) + 0x40) +/* SPI_SLV_WRBUF_DUMMY_CYCLELEN : R/W ;bitpos:[31:24] ;default: 8'b0 ; */ +/*description: In the slave mode it is the length in spi_clk cycles of dummy + phase for write-buffer operations. The register value shall be (cycle_num-1).*/ +#define SPI_SLV_WRBUF_DUMMY_CYCLELEN 0x000000FF +#define SPI_SLV_WRBUF_DUMMY_CYCLELEN_M ((SPI_SLV_WRBUF_DUMMY_CYCLELEN_V)<<(SPI_SLV_WRBUF_DUMMY_CYCLELEN_S)) +#define SPI_SLV_WRBUF_DUMMY_CYCLELEN_V 0xFF +#define SPI_SLV_WRBUF_DUMMY_CYCLELEN_S 24 +/* SPI_SLV_RDBUF_DUMMY_CYCLELEN : R/W ;bitpos:[23:16] ;default: 8'h0 ; */ +/*description: In the slave mode it is the length in spi_clk cycles of dummy + phase for read-buffer operations. The register value shall be (cycle_num-1).*/ +#define SPI_SLV_RDBUF_DUMMY_CYCLELEN 0x000000FF +#define SPI_SLV_RDBUF_DUMMY_CYCLELEN_M ((SPI_SLV_RDBUF_DUMMY_CYCLELEN_V)<<(SPI_SLV_RDBUF_DUMMY_CYCLELEN_S)) +#define SPI_SLV_RDBUF_DUMMY_CYCLELEN_V 0xFF +#define SPI_SLV_RDBUF_DUMMY_CYCLELEN_S 16 +/* SPI_SLV_WRSTA_DUMMY_CYCLELEN : R/W ;bitpos:[15:8] ;default: 8'h0 ; */ +/*description: In the slave mode it is the length in spi_clk cycles of dummy + phase for write-status operations. The register value shall be (cycle_num-1).*/ +#define SPI_SLV_WRSTA_DUMMY_CYCLELEN 0x000000FF +#define SPI_SLV_WRSTA_DUMMY_CYCLELEN_M ((SPI_SLV_WRSTA_DUMMY_CYCLELEN_V)<<(SPI_SLV_WRSTA_DUMMY_CYCLELEN_S)) +#define SPI_SLV_WRSTA_DUMMY_CYCLELEN_V 0xFF +#define SPI_SLV_WRSTA_DUMMY_CYCLELEN_S 8 +/* SPI_SLV_RDSTA_DUMMY_CYCLELEN : R/W ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: In the slave mode it is the length in spi_clk cycles of dummy + phase for read-status operations. The register value shall be (cycle_num-1).*/ +#define SPI_SLV_RDSTA_DUMMY_CYCLELEN 0x000000FF +#define SPI_SLV_RDSTA_DUMMY_CYCLELEN_M ((SPI_SLV_RDSTA_DUMMY_CYCLELEN_V)<<(SPI_SLV_RDSTA_DUMMY_CYCLELEN_S)) +#define SPI_SLV_RDSTA_DUMMY_CYCLELEN_V 0xFF +#define SPI_SLV_RDSTA_DUMMY_CYCLELEN_S 0 + +#define SPI_SLAVE3_REG(i) (REG_SPI_BASE(i) + 0x44) +/* SPI_SLV_WRSTA_CMD_VALUE : R/W ;bitpos:[31:24] ;default: 8'b0 ; */ +/*description: In the slave mode it is the value of write-status command.*/ +#define SPI_SLV_WRSTA_CMD_VALUE 0x000000FF +#define SPI_SLV_WRSTA_CMD_VALUE_M ((SPI_SLV_WRSTA_CMD_VALUE_V)<<(SPI_SLV_WRSTA_CMD_VALUE_S)) +#define SPI_SLV_WRSTA_CMD_VALUE_V 0xFF +#define SPI_SLV_WRSTA_CMD_VALUE_S 24 +/* SPI_SLV_RDSTA_CMD_VALUE : R/W ;bitpos:[23:16] ;default: 8'b0 ; */ +/*description: In the slave mode it is the value of read-status command.*/ +#define SPI_SLV_RDSTA_CMD_VALUE 0x000000FF +#define SPI_SLV_RDSTA_CMD_VALUE_M ((SPI_SLV_RDSTA_CMD_VALUE_V)<<(SPI_SLV_RDSTA_CMD_VALUE_S)) +#define SPI_SLV_RDSTA_CMD_VALUE_V 0xFF +#define SPI_SLV_RDSTA_CMD_VALUE_S 16 +/* SPI_SLV_WRBUF_CMD_VALUE : R/W ;bitpos:[15:8] ;default: 8'b0 ; */ +/*description: In the slave mode it is the value of write-buffer command.*/ +#define SPI_SLV_WRBUF_CMD_VALUE 0x000000FF +#define SPI_SLV_WRBUF_CMD_VALUE_M ((SPI_SLV_WRBUF_CMD_VALUE_V)<<(SPI_SLV_WRBUF_CMD_VALUE_S)) +#define SPI_SLV_WRBUF_CMD_VALUE_V 0xFF +#define SPI_SLV_WRBUF_CMD_VALUE_S 8 +/* SPI_SLV_RDBUF_CMD_VALUE : R/W ;bitpos:[7:0] ;default: 8'b0 ; */ +/*description: In the slave mode it is the value of read-buffer command.*/ +#define SPI_SLV_RDBUF_CMD_VALUE 0x000000FF +#define SPI_SLV_RDBUF_CMD_VALUE_M ((SPI_SLV_RDBUF_CMD_VALUE_V)<<(SPI_SLV_RDBUF_CMD_VALUE_S)) +#define SPI_SLV_RDBUF_CMD_VALUE_V 0xFF +#define SPI_SLV_RDBUF_CMD_VALUE_S 0 + +#define SPI_SLV_WRBUF_DLEN_REG(i) (REG_SPI_BASE(i) + 0x48) +/* SPI_SLV_WRBUF_DBITLEN : R/W ;bitpos:[23:0] ;default: 24'h0 ; */ +/*description: In the slave mode it is the length in bits for write-buffer operations. + The register value shall be (bit_num-1).*/ +#define SPI_SLV_WRBUF_DBITLEN 0x00FFFFFF +#define SPI_SLV_WRBUF_DBITLEN_M ((SPI_SLV_WRBUF_DBITLEN_V)<<(SPI_SLV_WRBUF_DBITLEN_S)) +#define SPI_SLV_WRBUF_DBITLEN_V 0xFFFFFF +#define SPI_SLV_WRBUF_DBITLEN_S 0 + +#define SPI_SLV_RDBUF_DLEN_REG(i) (REG_SPI_BASE(i) + 0x4C) +/* SPI_SLV_RDBUF_DBITLEN : R/W ;bitpos:[23:0] ;default: 24'h0 ; */ +/*description: In the slave mode it is the length in bits for read-buffer operations. + The register value shall be (bit_num-1).*/ +#define SPI_SLV_RDBUF_DBITLEN 0x00FFFFFF +#define SPI_SLV_RDBUF_DBITLEN_M ((SPI_SLV_RDBUF_DBITLEN_V)<<(SPI_SLV_RDBUF_DBITLEN_S)) +#define SPI_SLV_RDBUF_DBITLEN_V 0xFFFFFF +#define SPI_SLV_RDBUF_DBITLEN_S 0 + +#define SPI_CACHE_FCTRL_REG(i) (REG_SPI_BASE(i) + 0x50) +/* SPI_CACHE_FLASH_PES_EN : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: For SPI0 spi1 send suspend command before cache read flash + 1: enable 0:disable.*/ +#define SPI_CACHE_FLASH_PES_EN (BIT(3)) +#define SPI_CACHE_FLASH_PES_EN_M (BIT(3)) +#define SPI_CACHE_FLASH_PES_EN_V 0x1 +#define SPI_CACHE_FLASH_PES_EN_S 3 +/* SPI_CACHE_FLASH_USR_CMD : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: For SPI0 cache read flash for user define command 1: enable 0:disable.*/ +#define SPI_CACHE_FLASH_USR_CMD (BIT(2)) +#define SPI_CACHE_FLASH_USR_CMD_M (BIT(2)) +#define SPI_CACHE_FLASH_USR_CMD_V 0x1 +#define SPI_CACHE_FLASH_USR_CMD_S 2 +/* SPI_CACHE_USR_CMD_4BYTE : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: For SPI0 cache read flash with 4 bytes command 1: enable 0:disable.*/ +#define SPI_CACHE_USR_CMD_4BYTE (BIT(1)) +#define SPI_CACHE_USR_CMD_4BYTE_M (BIT(1)) +#define SPI_CACHE_USR_CMD_4BYTE_V 0x1 +#define SPI_CACHE_USR_CMD_4BYTE_S 1 +/* SPI_CACHE_REQ_EN : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: For SPI0 Cache access enable 1: enable 0:disable.*/ +#define SPI_CACHE_REQ_EN (BIT(0)) +#define SPI_CACHE_REQ_EN_M (BIT(0)) +#define SPI_CACHE_REQ_EN_V 0x1 +#define SPI_CACHE_REQ_EN_S 0 + +#define SPI_CACHE_SCTRL_REG(i) (REG_SPI_BASE(i) + 0x54) +/* SPI_CACHE_SRAM_USR_WCMD : R/W ;bitpos:[28] ;default: 1'b1 ; */ +/*description: For SPI0 In the spi sram mode cache write sram for user define command*/ +#define SPI_CACHE_SRAM_USR_WCMD (BIT(28)) +#define SPI_CACHE_SRAM_USR_WCMD_M (BIT(28)) +#define SPI_CACHE_SRAM_USR_WCMD_V 0x1 +#define SPI_CACHE_SRAM_USR_WCMD_S 28 +/* SPI_SRAM_ADDR_BITLEN : R/W ;bitpos:[27:22] ;default: 6'd23 ; */ +/*description: For SPI0 In the sram mode it is the length in bits of address + phase. The register value shall be (bit_num-1).*/ +#define SPI_SRAM_ADDR_BITLEN 0x0000003F +#define SPI_SRAM_ADDR_BITLEN_M ((SPI_SRAM_ADDR_BITLEN_V)<<(SPI_SRAM_ADDR_BITLEN_S)) +#define SPI_SRAM_ADDR_BITLEN_V 0x3F +#define SPI_SRAM_ADDR_BITLEN_S 22 +/* SPI_SRAM_DUMMY_CYCLELEN : R/W ;bitpos:[21:14] ;default: 8'b1 ; */ +/*description: For SPI0 In the sram mode it is the length in bits of address + phase. The register value shall be (bit_num-1).*/ +#define SPI_SRAM_DUMMY_CYCLELEN 0x000000FF +#define SPI_SRAM_DUMMY_CYCLELEN_M ((SPI_SRAM_DUMMY_CYCLELEN_V)<<(SPI_SRAM_DUMMY_CYCLELEN_S)) +#define SPI_SRAM_DUMMY_CYCLELEN_V 0xFF +#define SPI_SRAM_DUMMY_CYCLELEN_S 14 +/* SPI_SRAM_BYTES_LEN : R/W ;bitpos:[13:6] ;default: 8'b32 ; */ +/*description: For SPI0 In the sram mode it is the byte length of spi read sram data.*/ +#define SPI_SRAM_BYTES_LEN 0x000000FF +#define SPI_SRAM_BYTES_LEN_M ((SPI_SRAM_BYTES_LEN_V)<<(SPI_SRAM_BYTES_LEN_S)) +#define SPI_SRAM_BYTES_LEN_V 0xFF +#define SPI_SRAM_BYTES_LEN_S 6 +/* SPI_CACHE_SRAM_USR_RCMD : R/W ;bitpos:[5] ;default: 1'b1 ; */ +/*description: For SPI0 In the spi sram mode cache read sram for user define command.*/ +#define SPI_CACHE_SRAM_USR_RCMD (BIT(5)) +#define SPI_CACHE_SRAM_USR_RCMD_M (BIT(5)) +#define SPI_CACHE_SRAM_USR_RCMD_V 0x1 +#define SPI_CACHE_SRAM_USR_RCMD_S 5 +/* SPI_USR_RD_SRAM_DUMMY : R/W ;bitpos:[4] ;default: 1'b1 ; */ +/*description: For SPI0 In the spi sram mode it is the enable bit of dummy + phase for read operations.*/ +#define SPI_USR_RD_SRAM_DUMMY (BIT(4)) +#define SPI_USR_RD_SRAM_DUMMY_M (BIT(4)) +#define SPI_USR_RD_SRAM_DUMMY_V 0x1 +#define SPI_USR_RD_SRAM_DUMMY_S 4 +/* SPI_USR_WR_SRAM_DUMMY : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: For SPI0 In the spi sram mode it is the enable bit of dummy + phase for write operations.*/ +#define SPI_USR_WR_SRAM_DUMMY (BIT(3)) +#define SPI_USR_WR_SRAM_DUMMY_M (BIT(3)) +#define SPI_USR_WR_SRAM_DUMMY_V 0x1 +#define SPI_USR_WR_SRAM_DUMMY_S 3 +/* SPI_USR_SRAM_QIO : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: For SPI0 In the spi sram mode spi quad I/O mode enable 1: enable 0:disable*/ +#define SPI_USR_SRAM_QIO (BIT(2)) +#define SPI_USR_SRAM_QIO_M (BIT(2)) +#define SPI_USR_SRAM_QIO_V 0x1 +#define SPI_USR_SRAM_QIO_S 2 +/* SPI_USR_SRAM_DIO : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: For SPI0 In the spi sram mode spi dual I/O mode enable 1: enable 0:disable*/ +#define SPI_USR_SRAM_DIO (BIT(1)) +#define SPI_USR_SRAM_DIO_M (BIT(1)) +#define SPI_USR_SRAM_DIO_V 0x1 +#define SPI_USR_SRAM_DIO_S 1 + +#define SPI_SRAM_CMD_REG(i) (REG_SPI_BASE(i) + 0x58) +/* SPI_SRAM_RSTIO : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: For SPI0 SRAM IO mode reset enable. SRAM IO mode reset operation + will be triggered when the bit is set. The bit will be cleared once the operation done*/ +#define SPI_SRAM_RSTIO (BIT(4)) +#define SPI_SRAM_RSTIO_M (BIT(4)) +#define SPI_SRAM_RSTIO_V 0x1 +#define SPI_SRAM_RSTIO_S 4 +/* SPI_SRAM_QIO : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: For SPI0 SRAM QIO mode enable . SRAM QIO enable command will + be send when the bit is set. The bit will be cleared once the operation done.*/ +#define SPI_SRAM_QIO (BIT(1)) +#define SPI_SRAM_QIO_M (BIT(1)) +#define SPI_SRAM_QIO_V 0x1 +#define SPI_SRAM_QIO_S 1 +/* SPI_SRAM_DIO : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: For SPI0 SRAM DIO mode enable . SRAM DIO enable command will + be send when the bit is set. The bit will be cleared once the operation done.*/ +#define SPI_SRAM_DIO (BIT(0)) +#define SPI_SRAM_DIO_M (BIT(0)) +#define SPI_SRAM_DIO_V 0x1 +#define SPI_SRAM_DIO_S 0 + +#define SPI_SRAM_DRD_CMD_REG(i) (REG_SPI_BASE(i) + 0x5C) +/* SPI_CACHE_SRAM_USR_RD_CMD_BITLEN : R/W ;bitpos:[31:28] ;default: 4'h0 ; */ +/*description: For SPI0 When cache mode is enable it is the length in bits of + command phase for SRAM. The register value shall be (bit_num-1).*/ +#define SPI_CACHE_SRAM_USR_RD_CMD_BITLEN 0x0000000F +#define SPI_CACHE_SRAM_USR_RD_CMD_BITLEN_M ((SPI_CACHE_SRAM_USR_RD_CMD_BITLEN_V)<<(SPI_CACHE_SRAM_USR_RD_CMD_BITLEN_S)) +#define SPI_CACHE_SRAM_USR_RD_CMD_BITLEN_V 0xF +#define SPI_CACHE_SRAM_USR_RD_CMD_BITLEN_S 28 +/* SPI_CACHE_SRAM_USR_RD_CMD_VALUE : R/W ;bitpos:[15:0] ;default: 16'h0 ; */ +/*description: For SPI0 When cache mode is enable it is the read command value + of command phase for SRAM.*/ +#define SPI_CACHE_SRAM_USR_RD_CMD_VALUE 0x0000FFFF +#define SPI_CACHE_SRAM_USR_RD_CMD_VALUE_M ((SPI_CACHE_SRAM_USR_RD_CMD_VALUE_V)<<(SPI_CACHE_SRAM_USR_RD_CMD_VALUE_S)) +#define SPI_CACHE_SRAM_USR_RD_CMD_VALUE_V 0xFFFF +#define SPI_CACHE_SRAM_USR_RD_CMD_VALUE_S 0 + +#define SPI_SRAM_DWR_CMD_REG(i) (REG_SPI_BASE(i) + 0x60) +/* SPI_CACHE_SRAM_USR_WR_CMD_BITLEN : R/W ;bitpos:[31:28] ;default: 4'h0 ; */ +/*description: For SPI0 When cache mode is enable it is the in bits of command + phase for SRAM. The register value shall be (bit_num-1).*/ +#define SPI_CACHE_SRAM_USR_WR_CMD_BITLEN 0x0000000F +#define SPI_CACHE_SRAM_USR_WR_CMD_BITLEN_M ((SPI_CACHE_SRAM_USR_WR_CMD_BITLEN_V)<<(SPI_CACHE_SRAM_USR_WR_CMD_BITLEN_S)) +#define SPI_CACHE_SRAM_USR_WR_CMD_BITLEN_V 0xF +#define SPI_CACHE_SRAM_USR_WR_CMD_BITLEN_S 28 +/* SPI_CACHE_SRAM_USR_WR_CMD_VALUE : R/W ;bitpos:[15:0] ;default: 16'h0 ; */ +/*description: For SPI0 When cache mode is enable it is the write command value + of command phase for SRAM.*/ +#define SPI_CACHE_SRAM_USR_WR_CMD_VALUE 0x0000FFFF +#define SPI_CACHE_SRAM_USR_WR_CMD_VALUE_M ((SPI_CACHE_SRAM_USR_WR_CMD_VALUE_V)<<(SPI_CACHE_SRAM_USR_WR_CMD_VALUE_S)) +#define SPI_CACHE_SRAM_USR_WR_CMD_VALUE_V 0xFFFF +#define SPI_CACHE_SRAM_USR_WR_CMD_VALUE_S 0 + +#define SPI_SLV_RD_BIT_REG(i) (REG_SPI_BASE(i) + 0x64) +/* SPI_SLV_RDATA_BIT : RW ;bitpos:[23:0] ;default: 24'b0 ; */ +/*description: In the slave mode it is the bit length of read data. The value + is the length - 1.*/ +#define SPI_SLV_RDATA_BIT 0x00FFFFFF +#define SPI_SLV_RDATA_BIT_M ((SPI_SLV_RDATA_BIT_V)<<(SPI_SLV_RDATA_BIT_S)) +#define SPI_SLV_RDATA_BIT_V 0xFFFFFF +#define SPI_SLV_RDATA_BIT_S 0 + +#define SPI_W0_REG(i) (REG_SPI_BASE(i) + 0x80) +/* SPI_BUF0 : R/W ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: data buffer*/ +#define SPI_BUF0 0xFFFFFFFF +#define SPI_BUF0_M ((SPI_BUF0_V)<<(SPI_BUF0_S)) +#define SPI_BUF0_V 0xFFFFFFFF +#define SPI_BUF0_S 0 + +#define SPI_W1_REG(i) (REG_SPI_BASE(i) + 0x84) +/* SPI_BUF1 : R/W ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: data buffer*/ +#define SPI_BUF1 0xFFFFFFFF +#define SPI_BUF1_M ((SPI_BUF1_V)<<(SPI_BUF1_S)) +#define SPI_BUF1_V 0xFFFFFFFF +#define SPI_BUF1_S 0 + +#define SPI_W2_REG(i) (REG_SPI_BASE(i) + 0x88) +/* SPI_BUF2 : R/W ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: data buffer*/ +#define SPI_BUF2 0xFFFFFFFF +#define SPI_BUF2_M ((SPI_BUF2_V)<<(SPI_BUF2_S)) +#define SPI_BUF2_V 0xFFFFFFFF +#define SPI_BUF2_S 0 + +#define SPI_W3_REG(i) (REG_SPI_BASE(i) + 0x8C) +/* SPI_BUF3 : R/W ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: data buffer*/ +#define SPI_BUF3 0xFFFFFFFF +#define SPI_BUF3_M ((SPI_BUF3_V)<<(SPI_BUF3_S)) +#define SPI_BUF3_V 0xFFFFFFFF +#define SPI_BUF3_S 0 + +#define SPI_W4_REG(i) (REG_SPI_BASE(i) + 0x90) +/* SPI_BUF4 : R/W ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: data buffer*/ +#define SPI_BUF4 0xFFFFFFFF +#define SPI_BUF4_M ((SPI_BUF4_V)<<(SPI_BUF4_S)) +#define SPI_BUF4_V 0xFFFFFFFF +#define SPI_BUF4_S 0 + +#define SPI_W5_REG(i) (REG_SPI_BASE(i) + 0x94) +/* SPI_BUF5 : R/W ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: data buffer*/ +#define SPI_BUF5 0xFFFFFFFF +#define SPI_BUF5_M ((SPI_BUF5_V)<<(SPI_BUF5_S)) +#define SPI_BUF5_V 0xFFFFFFFF +#define SPI_BUF5_S 0 + +#define SPI_W6_REG(i) (REG_SPI_BASE(i) + 0x98) +/* SPI_BUF6 : R/W ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: data buffer*/ +#define SPI_BUF6 0xFFFFFFFF +#define SPI_BUF6_M ((SPI_BUF6_V)<<(SPI_BUF6_S)) +#define SPI_BUF6_V 0xFFFFFFFF +#define SPI_BUF6_S 0 + +#define SPI_W7_REG(i) (REG_SPI_BASE(i) + 0x9C) +/* SPI_BUF7 : R/W ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: data buffer*/ +#define SPI_BUF7 0xFFFFFFFF +#define SPI_BUF7_M ((SPI_BUF7_V)<<(SPI_BUF7_S)) +#define SPI_BUF7_V 0xFFFFFFFF +#define SPI_BUF7_S 0 + +#define SPI_W8_REG(i) (REG_SPI_BASE(i) + 0xA0) +/* SPI_BUF8 : R/W ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: data buffer*/ +#define SPI_BUF8 0xFFFFFFFF +#define SPI_BUF8_M ((SPI_BUF8_V)<<(SPI_BUF8_S)) +#define SPI_BUF8_V 0xFFFFFFFF +#define SPI_BUF8_S 0 + +#define SPI_W9_REG(i) (REG_SPI_BASE(i) + 0xA4) +/* SPI_BUF9 : R/W ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: data buffer*/ +#define SPI_BUF9 0xFFFFFFFF +#define SPI_BUF9_M ((SPI_BUF9_V)<<(SPI_BUF9_S)) +#define SPI_BUF9_V 0xFFFFFFFF +#define SPI_BUF9_S 0 + +#define SPI_W10_REG(i) (REG_SPI_BASE(i) + 0xA8) +/* SPI_BUF10 : R/W ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: data buffer*/ +#define SPI_BUF10 0xFFFFFFFF +#define SPI_BUF10_M ((SPI_BUF10_V)<<(SPI_BUF10_S)) +#define SPI_BUF10_V 0xFFFFFFFF +#define SPI_BUF10_S 0 + +#define SPI_W11_REG(i) (REG_SPI_BASE(i) + 0xAC) +/* SPI_BUF11 : R/W ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: data buffer*/ +#define SPI_BUF11 0xFFFFFFFF +#define SPI_BUF11_M ((SPI_BUF11_V)<<(SPI_BUF11_S)) +#define SPI_BUF11_V 0xFFFFFFFF +#define SPI_BUF11_S 0 + +#define SPI_W12_REG(i) (REG_SPI_BASE(i) + 0xB0) +/* SPI_BUF12 : R/W ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: data buffer*/ +#define SPI_BUF12 0xFFFFFFFF +#define SPI_BUF12_M ((SPI_BUF12_V)<<(SPI_BUF12_S)) +#define SPI_BUF12_V 0xFFFFFFFF +#define SPI_BUF12_S 0 + +#define SPI_W13_REG(i) (REG_SPI_BASE(i) + 0xB4) +/* SPI_BUF13 : R/W ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: data buffer*/ +#define SPI_BUF13 0xFFFFFFFF +#define SPI_BUF13_M ((SPI_BUF13_V)<<(SPI_BUF13_S)) +#define SPI_BUF13_V 0xFFFFFFFF +#define SPI_BUF13_S 0 + +#define SPI_W14_REG(i) (REG_SPI_BASE(i) + 0xB8) +/* SPI_BUF14 : R/W ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: data buffer*/ +#define SPI_BUF14 0xFFFFFFFF +#define SPI_BUF14_M ((SPI_BUF14_V)<<(SPI_BUF14_S)) +#define SPI_BUF14_V 0xFFFFFFFF +#define SPI_BUF14_S 0 + +#define SPI_W15_REG(i) (REG_SPI_BASE(i) + 0xBC) +/* SPI_BUF15 : R/W ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: data buffer*/ +#define SPI_BUF15 0xFFFFFFFF +#define SPI_BUF15_M ((SPI_BUF15_V)<<(SPI_BUF15_S)) +#define SPI_BUF15_V 0xFFFFFFFF +#define SPI_BUF15_S 0 + +#define SPI_TX_CRC_REG(i) (REG_SPI_BASE(i) + 0xC0) +/* SPI_TX_CRC_DATA : R/W ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: For SPI1 the value of crc32 for 256 bits data.*/ +#define SPI_TX_CRC_DATA 0xFFFFFFFF +#define SPI_TX_CRC_DATA_M ((SPI_TX_CRC_DATA_V)<<(SPI_TX_CRC_DATA_S)) +#define SPI_TX_CRC_DATA_V 0xFFFFFFFF +#define SPI_TX_CRC_DATA_S 0 + +#define SPI_EXT0_REG(i) (REG_SPI_BASE(i) + 0xF0) +/* SPI_T_PP_ENA : R/W ;bitpos:[31] ;default: 1'b1 ; */ +/*description: page program delay enable.*/ +#define SPI_T_PP_ENA (BIT(31)) +#define SPI_T_PP_ENA_M (BIT(31)) +#define SPI_T_PP_ENA_V 0x1 +#define SPI_T_PP_ENA_S 31 +/* SPI_T_PP_SHIFT : R/W ;bitpos:[19:16] ;default: 4'd10 ; */ +/*description: page program delay time shift .*/ +#define SPI_T_PP_SHIFT 0x0000000F +#define SPI_T_PP_SHIFT_M ((SPI_T_PP_SHIFT_V)<<(SPI_T_PP_SHIFT_S)) +#define SPI_T_PP_SHIFT_V 0xF +#define SPI_T_PP_SHIFT_S 16 +/* SPI_T_PP_TIME : R/W ;bitpos:[11:0] ;default: 12'd80 ; */ +/*description: page program delay time by system clock.*/ +#define SPI_T_PP_TIME 0x00000FFF +#define SPI_T_PP_TIME_M ((SPI_T_PP_TIME_V)<<(SPI_T_PP_TIME_S)) +#define SPI_T_PP_TIME_V 0xFFF +#define SPI_T_PP_TIME_S 0 + +#define SPI_EXT1_REG(i) (REG_SPI_BASE(i) + 0xF4) +/* SPI_T_ERASE_ENA : R/W ;bitpos:[31] ;default: 1'b1 ; */ +/*description: erase flash delay enable.*/ +#define SPI_T_ERASE_ENA (BIT(31)) +#define SPI_T_ERASE_ENA_M (BIT(31)) +#define SPI_T_ERASE_ENA_V 0x1 +#define SPI_T_ERASE_ENA_S 31 +/* SPI_T_ERASE_SHIFT : R/W ;bitpos:[19:16] ;default: 4'd15 ; */ +/*description: erase flash delay time shift.*/ +#define SPI_T_ERASE_SHIFT 0x0000000F +#define SPI_T_ERASE_SHIFT_M ((SPI_T_ERASE_SHIFT_V)<<(SPI_T_ERASE_SHIFT_S)) +#define SPI_T_ERASE_SHIFT_V 0xF +#define SPI_T_ERASE_SHIFT_S 16 +/* SPI_T_ERASE_TIME : R/W ;bitpos:[11:0] ;default: 12'd0 ; */ +/*description: erase flash delay time by system clock.*/ +#define SPI_T_ERASE_TIME 0x00000FFF +#define SPI_T_ERASE_TIME_M ((SPI_T_ERASE_TIME_V)<<(SPI_T_ERASE_TIME_S)) +#define SPI_T_ERASE_TIME_V 0xFFF +#define SPI_T_ERASE_TIME_S 0 + +#define SPI_EXT2_REG(i) (REG_SPI_BASE(i) + 0xF8) +/* SPI_ST : RO ;bitpos:[2:0] ;default: 3'b0 ; */ +/*description: The status of spi state machine .*/ +#define SPI_ST 0x00000007 +#define SPI_ST_M ((SPI_ST_V)<<(SPI_ST_S)) +#define SPI_ST_V 0x7 +#define SPI_ST_S 0 + +#define SPI_EXT3_REG(i) (REG_SPI_BASE(i) + 0xFC) +/* SPI_INT_HOLD_ENA : R/W ;bitpos:[1:0] ;default: 2'b0 ; */ +/*description: This register is for two SPI masters to share the same cs clock + and data signals. The bits of one SPI are set if the other SPI is busy the SPI will be hold. 1(3): hold at ¡°idle¡± phase 2: hold at ¡°prepare¡± phase.*/ +#define SPI_INT_HOLD_ENA 0x00000003 +#define SPI_INT_HOLD_ENA_M ((SPI_INT_HOLD_ENA_V)<<(SPI_INT_HOLD_ENA_S)) +#define SPI_INT_HOLD_ENA_V 0x3 +#define SPI_INT_HOLD_ENA_S 0 + +#define SPI_DMA_CONF_REG(i) (REG_SPI_BASE(i) + 0x100) +/* SPI_DMA_CONTINUE : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: spi dma continue tx/rx data.*/ +#define SPI_DMA_CONTINUE (BIT(16)) +#define SPI_DMA_CONTINUE_M (BIT(16)) +#define SPI_DMA_CONTINUE_V 0x1 +#define SPI_DMA_CONTINUE_S 16 +/* SPI_DMA_TX_STOP : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: spi dma write data stop when in continue tx/rx mode.*/ +#define SPI_DMA_TX_STOP (BIT(15)) +#define SPI_DMA_TX_STOP_M (BIT(15)) +#define SPI_DMA_TX_STOP_V 0x1 +#define SPI_DMA_TX_STOP_S 15 +/* SPI_DMA_RX_STOP : R/W ;bitpos:[14] ;default: 1'b0 ; */ +/*description: spi dma read data stop when in continue tx/rx mode.*/ +#define SPI_DMA_RX_STOP (BIT(14)) +#define SPI_DMA_RX_STOP_M (BIT(14)) +#define SPI_DMA_RX_STOP_V 0x1 +#define SPI_DMA_RX_STOP_S 14 +/* SPI_OUT_DATA_BURST_EN : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: spi dma read data from memory in burst mode.*/ +#define SPI_OUT_DATA_BURST_EN (BIT(12)) +#define SPI_OUT_DATA_BURST_EN_M (BIT(12)) +#define SPI_OUT_DATA_BURST_EN_V 0x1 +#define SPI_OUT_DATA_BURST_EN_S 12 +/* SPI_INDSCR_BURST_EN : R/W ;bitpos:[11] ;default: 1'b0 ; */ +/*description: read descriptor use burst mode when write data to memory.*/ +#define SPI_INDSCR_BURST_EN (BIT(11)) +#define SPI_INDSCR_BURST_EN_M (BIT(11)) +#define SPI_INDSCR_BURST_EN_V 0x1 +#define SPI_INDSCR_BURST_EN_S 11 +/* SPI_OUTDSCR_BURST_EN : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: read descriptor use burst mode when read data for memory.*/ +#define SPI_OUTDSCR_BURST_EN (BIT(10)) +#define SPI_OUTDSCR_BURST_EN_M (BIT(10)) +#define SPI_OUTDSCR_BURST_EN_V 0x1 +#define SPI_OUTDSCR_BURST_EN_S 10 +/* SPI_OUT_EOF_MODE : R/W ;bitpos:[9] ;default: 1'b1 ; */ +/*description: out eof flag generation mode . 1: when dma pop all data from + fifo 0:when ahb push all data to fifo.*/ +#define SPI_OUT_EOF_MODE (BIT(9)) +#define SPI_OUT_EOF_MODE_M (BIT(9)) +#define SPI_OUT_EOF_MODE_V 0x1 +#define SPI_OUT_EOF_MODE_S 9 +/* SPI_OUT_AUTO_WRBACK : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: when the link is empty jump to next automatically.*/ +#define SPI_OUT_AUTO_WRBACK (BIT(8)) +#define SPI_OUT_AUTO_WRBACK_M (BIT(8)) +#define SPI_OUT_AUTO_WRBACK_V 0x1 +#define SPI_OUT_AUTO_WRBACK_S 8 +/* SPI_OUT_LOOP_TEST : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: Set bit to test out link.*/ +#define SPI_OUT_LOOP_TEST (BIT(7)) +#define SPI_OUT_LOOP_TEST_M (BIT(7)) +#define SPI_OUT_LOOP_TEST_V 0x1 +#define SPI_OUT_LOOP_TEST_S 7 +/* SPI_IN_LOOP_TEST : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: Set bit to test in link.*/ +#define SPI_IN_LOOP_TEST (BIT(6)) +#define SPI_IN_LOOP_TEST_M (BIT(6)) +#define SPI_IN_LOOP_TEST_V 0x1 +#define SPI_IN_LOOP_TEST_S 6 +/* SPI_AHBM_RST : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: reset spi dma ahb master.*/ +#define SPI_AHBM_RST (BIT(5)) +#define SPI_AHBM_RST_M (BIT(5)) +#define SPI_AHBM_RST_V 0x1 +#define SPI_AHBM_RST_S 5 +/* SPI_AHBM_FIFO_RST : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: reset spi dma ahb master fifo pointer.*/ +#define SPI_AHBM_FIFO_RST (BIT(4)) +#define SPI_AHBM_FIFO_RST_M (BIT(4)) +#define SPI_AHBM_FIFO_RST_V 0x1 +#define SPI_AHBM_FIFO_RST_S 4 +/* SPI_OUT_RST : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: The bit is used to reset out dma fsm and out data fifo pointer.*/ +#define SPI_OUT_RST (BIT(3)) +#define SPI_OUT_RST_M (BIT(3)) +#define SPI_OUT_RST_V 0x1 +#define SPI_OUT_RST_S 3 +/* SPI_IN_RST : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: The bit is used to reset in dma fsm and in data fifo pointer.*/ +#define SPI_IN_RST (BIT(2)) +#define SPI_IN_RST_M (BIT(2)) +#define SPI_IN_RST_V 0x1 +#define SPI_IN_RST_S 2 + +#define SPI_DMA_OUT_LINK_REG(i) (REG_SPI_BASE(i) + 0x104) +/* SPI_OUTLINK_RESTART : R/W ;bitpos:[30] ;default: 1'b0 ; */ +/*description: Set the bit to mount on new outlink descriptors.*/ +#define SPI_OUTLINK_RESTART (BIT(30)) +#define SPI_OUTLINK_RESTART_M (BIT(30)) +#define SPI_OUTLINK_RESTART_V 0x1 +#define SPI_OUTLINK_RESTART_S 30 +/* SPI_OUTLINK_START : R/W ;bitpos:[29] ;default: 1'b0 ; */ +/*description: Set the bit to start to use outlink descriptor.*/ +#define SPI_OUTLINK_START (BIT(29)) +#define SPI_OUTLINK_START_M (BIT(29)) +#define SPI_OUTLINK_START_V 0x1 +#define SPI_OUTLINK_START_S 29 +/* SPI_OUTLINK_STOP : R/W ;bitpos:[28] ;default: 1'b0 ; */ +/*description: Set the bit to stop to use outlink descriptor.*/ +#define SPI_OUTLINK_STOP (BIT(28)) +#define SPI_OUTLINK_STOP_M (BIT(28)) +#define SPI_OUTLINK_STOP_V 0x1 +#define SPI_OUTLINK_STOP_S 28 +/* SPI_OUTLINK_ADDR : R/W ;bitpos:[19:0] ;default: 20'h0 ; */ +/*description: The address of the first outlink descriptor.*/ +#define SPI_OUTLINK_ADDR 0x000FFFFF +#define SPI_OUTLINK_ADDR_M ((SPI_OUTLINK_ADDR_V)<<(SPI_OUTLINK_ADDR_S)) +#define SPI_OUTLINK_ADDR_V 0xFFFFF +#define SPI_OUTLINK_ADDR_S 0 + +#define SPI_DMA_IN_LINK_REG(i) (REG_SPI_BASE(i) + 0x108) +/* SPI_INLINK_RESTART : R/W ;bitpos:[30] ;default: 1'b0 ; */ +/*description: Set the bit to mount on new inlink descriptors.*/ +#define SPI_INLINK_RESTART (BIT(30)) +#define SPI_INLINK_RESTART_M (BIT(30)) +#define SPI_INLINK_RESTART_V 0x1 +#define SPI_INLINK_RESTART_S 30 +/* SPI_INLINK_START : R/W ;bitpos:[29] ;default: 1'b0 ; */ +/*description: Set the bit to start to use inlink descriptor.*/ +#define SPI_INLINK_START (BIT(29)) +#define SPI_INLINK_START_M (BIT(29)) +#define SPI_INLINK_START_V 0x1 +#define SPI_INLINK_START_S 29 +/* SPI_INLINK_STOP : R/W ;bitpos:[28] ;default: 1'b0 ; */ +/*description: Set the bit to stop to use inlink descriptor.*/ +#define SPI_INLINK_STOP (BIT(28)) +#define SPI_INLINK_STOP_M (BIT(28)) +#define SPI_INLINK_STOP_V 0x1 +#define SPI_INLINK_STOP_S 28 +/* SPI_INLINK_AUTO_RET : R/W ;bitpos:[20] ;default: 1'b0 ; */ +/*description: when the bit is set inlink descriptor returns to the next descriptor + while a packet is wrong*/ +#define SPI_INLINK_AUTO_RET (BIT(20)) +#define SPI_INLINK_AUTO_RET_M (BIT(20)) +#define SPI_INLINK_AUTO_RET_V 0x1 +#define SPI_INLINK_AUTO_RET_S 20 +/* SPI_INLINK_ADDR : R/W ;bitpos:[19:0] ;default: 20'h0 ; */ +/*description: The address of the first inlink descriptor.*/ +#define SPI_INLINK_ADDR 0x000FFFFF +#define SPI_INLINK_ADDR_M ((SPI_INLINK_ADDR_V)<<(SPI_INLINK_ADDR_S)) +#define SPI_INLINK_ADDR_V 0xFFFFF +#define SPI_INLINK_ADDR_S 0 + +#define SPI_DMA_STATUS_REG(i) (REG_SPI_BASE(i) + 0x10C) +/* SPI_DMA_TX_EN : RO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: spi dma write data status bit.*/ +#define SPI_DMA_TX_EN (BIT(1)) +#define SPI_DMA_TX_EN_M (BIT(1)) +#define SPI_DMA_TX_EN_V 0x1 +#define SPI_DMA_TX_EN_S 1 +/* SPI_DMA_RX_EN : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: spi dma read data status bit.*/ +#define SPI_DMA_RX_EN (BIT(0)) +#define SPI_DMA_RX_EN_M (BIT(0)) +#define SPI_DMA_RX_EN_V 0x1 +#define SPI_DMA_RX_EN_S 0 + +#define SPI_DMA_INT_ENA_REG(i) (REG_SPI_BASE(i) + 0x110) +/* SPI_OUT_TOTAL_EOF_INT_ENA : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: The enable bit for sending all the packets to host done.*/ +#define SPI_OUT_TOTAL_EOF_INT_ENA (BIT(8)) +#define SPI_OUT_TOTAL_EOF_INT_ENA_M (BIT(8)) +#define SPI_OUT_TOTAL_EOF_INT_ENA_V 0x1 +#define SPI_OUT_TOTAL_EOF_INT_ENA_S 8 +/* SPI_OUT_EOF_INT_ENA : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: The enable bit for sending a packet to host done.*/ +#define SPI_OUT_EOF_INT_ENA (BIT(7)) +#define SPI_OUT_EOF_INT_ENA_M (BIT(7)) +#define SPI_OUT_EOF_INT_ENA_V 0x1 +#define SPI_OUT_EOF_INT_ENA_S 7 +/* SPI_OUT_DONE_INT_ENA : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: The enable bit for completing usage of a outlink descriptor .*/ +#define SPI_OUT_DONE_INT_ENA (BIT(6)) +#define SPI_OUT_DONE_INT_ENA_M (BIT(6)) +#define SPI_OUT_DONE_INT_ENA_V 0x1 +#define SPI_OUT_DONE_INT_ENA_S 6 +/* SPI_IN_SUC_EOF_INT_ENA : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: The enable bit for completing receiving all the packets from host.*/ +#define SPI_IN_SUC_EOF_INT_ENA (BIT(5)) +#define SPI_IN_SUC_EOF_INT_ENA_M (BIT(5)) +#define SPI_IN_SUC_EOF_INT_ENA_V 0x1 +#define SPI_IN_SUC_EOF_INT_ENA_S 5 +/* SPI_IN_ERR_EOF_INT_ENA : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: The enable bit for receiving error.*/ +#define SPI_IN_ERR_EOF_INT_ENA (BIT(4)) +#define SPI_IN_ERR_EOF_INT_ENA_M (BIT(4)) +#define SPI_IN_ERR_EOF_INT_ENA_V 0x1 +#define SPI_IN_ERR_EOF_INT_ENA_S 4 +/* SPI_IN_DONE_INT_ENA : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: The enable bit for completing usage of a inlink descriptor.*/ +#define SPI_IN_DONE_INT_ENA (BIT(3)) +#define SPI_IN_DONE_INT_ENA_M (BIT(3)) +#define SPI_IN_DONE_INT_ENA_V 0x1 +#define SPI_IN_DONE_INT_ENA_S 3 +/* SPI_INLINK_DSCR_ERROR_INT_ENA : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: The enable bit for inlink descriptor error.*/ +#define SPI_INLINK_DSCR_ERROR_INT_ENA (BIT(2)) +#define SPI_INLINK_DSCR_ERROR_INT_ENA_M (BIT(2)) +#define SPI_INLINK_DSCR_ERROR_INT_ENA_V 0x1 +#define SPI_INLINK_DSCR_ERROR_INT_ENA_S 2 +/* SPI_OUTLINK_DSCR_ERROR_INT_ENA : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: The enable bit for outlink descriptor error.*/ +#define SPI_OUTLINK_DSCR_ERROR_INT_ENA (BIT(1)) +#define SPI_OUTLINK_DSCR_ERROR_INT_ENA_M (BIT(1)) +#define SPI_OUTLINK_DSCR_ERROR_INT_ENA_V 0x1 +#define SPI_OUTLINK_DSCR_ERROR_INT_ENA_S 1 +/* SPI_INLINK_DSCR_EMPTY_INT_ENA : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: The enable bit for lack of enough inlink descriptors.*/ +#define SPI_INLINK_DSCR_EMPTY_INT_ENA (BIT(0)) +#define SPI_INLINK_DSCR_EMPTY_INT_ENA_M (BIT(0)) +#define SPI_INLINK_DSCR_EMPTY_INT_ENA_V 0x1 +#define SPI_INLINK_DSCR_EMPTY_INT_ENA_S 0 + +#define SPI_DMA_INT_RAW_REG(i) (REG_SPI_BASE(i) + 0x114) +/* SPI_OUT_TOTAL_EOF_INT_RAW : RO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: The raw bit for sending all the packets to host done.*/ +#define SPI_OUT_TOTAL_EOF_INT_RAW (BIT(8)) +#define SPI_OUT_TOTAL_EOF_INT_RAW_M (BIT(8)) +#define SPI_OUT_TOTAL_EOF_INT_RAW_V 0x1 +#define SPI_OUT_TOTAL_EOF_INT_RAW_S 8 +/* SPI_OUT_EOF_INT_RAW : RO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: The raw bit for sending a packet to host done.*/ +#define SPI_OUT_EOF_INT_RAW (BIT(7)) +#define SPI_OUT_EOF_INT_RAW_M (BIT(7)) +#define SPI_OUT_EOF_INT_RAW_V 0x1 +#define SPI_OUT_EOF_INT_RAW_S 7 +/* SPI_OUT_DONE_INT_RAW : RO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: The raw bit for completing usage of a outlink descriptor.*/ +#define SPI_OUT_DONE_INT_RAW (BIT(6)) +#define SPI_OUT_DONE_INT_RAW_M (BIT(6)) +#define SPI_OUT_DONE_INT_RAW_V 0x1 +#define SPI_OUT_DONE_INT_RAW_S 6 +/* SPI_IN_SUC_EOF_INT_RAW : RO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: The raw bit for completing receiving all the packets from host.*/ +#define SPI_IN_SUC_EOF_INT_RAW (BIT(5)) +#define SPI_IN_SUC_EOF_INT_RAW_M (BIT(5)) +#define SPI_IN_SUC_EOF_INT_RAW_V 0x1 +#define SPI_IN_SUC_EOF_INT_RAW_S 5 +/* SPI_IN_ERR_EOF_INT_RAW : RO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: The raw bit for receiving error.*/ +#define SPI_IN_ERR_EOF_INT_RAW (BIT(4)) +#define SPI_IN_ERR_EOF_INT_RAW_M (BIT(4)) +#define SPI_IN_ERR_EOF_INT_RAW_V 0x1 +#define SPI_IN_ERR_EOF_INT_RAW_S 4 +/* SPI_IN_DONE_INT_RAW : RO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: The raw bit for completing usage of a inlink descriptor.*/ +#define SPI_IN_DONE_INT_RAW (BIT(3)) +#define SPI_IN_DONE_INT_RAW_M (BIT(3)) +#define SPI_IN_DONE_INT_RAW_V 0x1 +#define SPI_IN_DONE_INT_RAW_S 3 +/* SPI_INLINK_DSCR_ERROR_INT_RAW : RO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: The raw bit for inlink descriptor error.*/ +#define SPI_INLINK_DSCR_ERROR_INT_RAW (BIT(2)) +#define SPI_INLINK_DSCR_ERROR_INT_RAW_M (BIT(2)) +#define SPI_INLINK_DSCR_ERROR_INT_RAW_V 0x1 +#define SPI_INLINK_DSCR_ERROR_INT_RAW_S 2 +/* SPI_OUTLINK_DSCR_ERROR_INT_RAW : RO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: The raw bit for outlink descriptor error.*/ +#define SPI_OUTLINK_DSCR_ERROR_INT_RAW (BIT(1)) +#define SPI_OUTLINK_DSCR_ERROR_INT_RAW_M (BIT(1)) +#define SPI_OUTLINK_DSCR_ERROR_INT_RAW_V 0x1 +#define SPI_OUTLINK_DSCR_ERROR_INT_RAW_S 1 +/* SPI_INLINK_DSCR_EMPTY_INT_RAW : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: The raw bit for lack of enough inlink descriptors.*/ +#define SPI_INLINK_DSCR_EMPTY_INT_RAW (BIT(0)) +#define SPI_INLINK_DSCR_EMPTY_INT_RAW_M (BIT(0)) +#define SPI_INLINK_DSCR_EMPTY_INT_RAW_V 0x1 +#define SPI_INLINK_DSCR_EMPTY_INT_RAW_S 0 + +#define SPI_DMA_INT_ST_REG(i) (REG_SPI_BASE(i) + 0x118) +/* SPI_OUT_TOTAL_EOF_INT_ST : RO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: The status bit for sending all the packets to host done.*/ +#define SPI_OUT_TOTAL_EOF_INT_ST (BIT(8)) +#define SPI_OUT_TOTAL_EOF_INT_ST_M (BIT(8)) +#define SPI_OUT_TOTAL_EOF_INT_ST_V 0x1 +#define SPI_OUT_TOTAL_EOF_INT_ST_S 8 +/* SPI_OUT_EOF_INT_ST : RO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: The status bit for sending a packet to host done.*/ +#define SPI_OUT_EOF_INT_ST (BIT(7)) +#define SPI_OUT_EOF_INT_ST_M (BIT(7)) +#define SPI_OUT_EOF_INT_ST_V 0x1 +#define SPI_OUT_EOF_INT_ST_S 7 +/* SPI_OUT_DONE_INT_ST : RO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: The status bit for completing usage of a outlink descriptor.*/ +#define SPI_OUT_DONE_INT_ST (BIT(6)) +#define SPI_OUT_DONE_INT_ST_M (BIT(6)) +#define SPI_OUT_DONE_INT_ST_V 0x1 +#define SPI_OUT_DONE_INT_ST_S 6 +/* SPI_IN_SUC_EOF_INT_ST : RO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: The status bit for completing receiving all the packets from host.*/ +#define SPI_IN_SUC_EOF_INT_ST (BIT(5)) +#define SPI_IN_SUC_EOF_INT_ST_M (BIT(5)) +#define SPI_IN_SUC_EOF_INT_ST_V 0x1 +#define SPI_IN_SUC_EOF_INT_ST_S 5 +/* SPI_IN_ERR_EOF_INT_ST : RO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: The status bit for receiving error.*/ +#define SPI_IN_ERR_EOF_INT_ST (BIT(4)) +#define SPI_IN_ERR_EOF_INT_ST_M (BIT(4)) +#define SPI_IN_ERR_EOF_INT_ST_V 0x1 +#define SPI_IN_ERR_EOF_INT_ST_S 4 +/* SPI_IN_DONE_INT_ST : RO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: The status bit for completing usage of a inlink descriptor.*/ +#define SPI_IN_DONE_INT_ST (BIT(3)) +#define SPI_IN_DONE_INT_ST_M (BIT(3)) +#define SPI_IN_DONE_INT_ST_V 0x1 +#define SPI_IN_DONE_INT_ST_S 3 +/* SPI_INLINK_DSCR_ERROR_INT_ST : RO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: The status bit for inlink descriptor error.*/ +#define SPI_INLINK_DSCR_ERROR_INT_ST (BIT(2)) +#define SPI_INLINK_DSCR_ERROR_INT_ST_M (BIT(2)) +#define SPI_INLINK_DSCR_ERROR_INT_ST_V 0x1 +#define SPI_INLINK_DSCR_ERROR_INT_ST_S 2 +/* SPI_OUTLINK_DSCR_ERROR_INT_ST : RO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: The status bit for outlink descriptor error.*/ +#define SPI_OUTLINK_DSCR_ERROR_INT_ST (BIT(1)) +#define SPI_OUTLINK_DSCR_ERROR_INT_ST_M (BIT(1)) +#define SPI_OUTLINK_DSCR_ERROR_INT_ST_V 0x1 +#define SPI_OUTLINK_DSCR_ERROR_INT_ST_S 1 +/* SPI_INLINK_DSCR_EMPTY_INT_ST : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: The status bit for lack of enough inlink descriptors.*/ +#define SPI_INLINK_DSCR_EMPTY_INT_ST (BIT(0)) +#define SPI_INLINK_DSCR_EMPTY_INT_ST_M (BIT(0)) +#define SPI_INLINK_DSCR_EMPTY_INT_ST_V 0x1 +#define SPI_INLINK_DSCR_EMPTY_INT_ST_S 0 + +#define SPI_DMA_INT_CLR_REG(i) (REG_SPI_BASE(i) + 0x11C) +/* SPI_OUT_TOTAL_EOF_INT_CLR : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: The clear bit for sending all the packets to host done.*/ +#define SPI_OUT_TOTAL_EOF_INT_CLR (BIT(8)) +#define SPI_OUT_TOTAL_EOF_INT_CLR_M (BIT(8)) +#define SPI_OUT_TOTAL_EOF_INT_CLR_V 0x1 +#define SPI_OUT_TOTAL_EOF_INT_CLR_S 8 +/* SPI_OUT_EOF_INT_CLR : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: The clear bit for sending a packet to host done.*/ +#define SPI_OUT_EOF_INT_CLR (BIT(7)) +#define SPI_OUT_EOF_INT_CLR_M (BIT(7)) +#define SPI_OUT_EOF_INT_CLR_V 0x1 +#define SPI_OUT_EOF_INT_CLR_S 7 +/* SPI_OUT_DONE_INT_CLR : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: The clear bit for completing usage of a outlink descriptor.*/ +#define SPI_OUT_DONE_INT_CLR (BIT(6)) +#define SPI_OUT_DONE_INT_CLR_M (BIT(6)) +#define SPI_OUT_DONE_INT_CLR_V 0x1 +#define SPI_OUT_DONE_INT_CLR_S 6 +/* SPI_IN_SUC_EOF_INT_CLR : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: The clear bit for completing receiving all the packets from host.*/ +#define SPI_IN_SUC_EOF_INT_CLR (BIT(5)) +#define SPI_IN_SUC_EOF_INT_CLR_M (BIT(5)) +#define SPI_IN_SUC_EOF_INT_CLR_V 0x1 +#define SPI_IN_SUC_EOF_INT_CLR_S 5 +/* SPI_IN_ERR_EOF_INT_CLR : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: The clear bit for receiving error.*/ +#define SPI_IN_ERR_EOF_INT_CLR (BIT(4)) +#define SPI_IN_ERR_EOF_INT_CLR_M (BIT(4)) +#define SPI_IN_ERR_EOF_INT_CLR_V 0x1 +#define SPI_IN_ERR_EOF_INT_CLR_S 4 +/* SPI_IN_DONE_INT_CLR : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: The clear bit for completing usage of a inlink descriptor.*/ +#define SPI_IN_DONE_INT_CLR (BIT(3)) +#define SPI_IN_DONE_INT_CLR_M (BIT(3)) +#define SPI_IN_DONE_INT_CLR_V 0x1 +#define SPI_IN_DONE_INT_CLR_S 3 +/* SPI_INLINK_DSCR_ERROR_INT_CLR : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: The clear bit for inlink descriptor error.*/ +#define SPI_INLINK_DSCR_ERROR_INT_CLR (BIT(2)) +#define SPI_INLINK_DSCR_ERROR_INT_CLR_M (BIT(2)) +#define SPI_INLINK_DSCR_ERROR_INT_CLR_V 0x1 +#define SPI_INLINK_DSCR_ERROR_INT_CLR_S 2 +/* SPI_OUTLINK_DSCR_ERROR_INT_CLR : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: The clear bit for outlink descriptor error.*/ +#define SPI_OUTLINK_DSCR_ERROR_INT_CLR (BIT(1)) +#define SPI_OUTLINK_DSCR_ERROR_INT_CLR_M (BIT(1)) +#define SPI_OUTLINK_DSCR_ERROR_INT_CLR_V 0x1 +#define SPI_OUTLINK_DSCR_ERROR_INT_CLR_S 1 +/* SPI_INLINK_DSCR_EMPTY_INT_CLR : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: The clear bit for lack of enough inlink descriptors.*/ +#define SPI_INLINK_DSCR_EMPTY_INT_CLR (BIT(0)) +#define SPI_INLINK_DSCR_EMPTY_INT_CLR_M (BIT(0)) +#define SPI_INLINK_DSCR_EMPTY_INT_CLR_V 0x1 +#define SPI_INLINK_DSCR_EMPTY_INT_CLR_S 0 + +#define SPI_IN_ERR_EOF_DES_ADDR_REG(i) (REG_SPI_BASE(i) + 0x120) +/* SPI_DMA_IN_ERR_EOF_DES_ADDR : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: The inlink descriptor address when spi dma produce receiving error.*/ +#define SPI_DMA_IN_ERR_EOF_DES_ADDR 0xFFFFFFFF +#define SPI_DMA_IN_ERR_EOF_DES_ADDR_M ((SPI_DMA_IN_ERR_EOF_DES_ADDR_V)<<(SPI_DMA_IN_ERR_EOF_DES_ADDR_S)) +#define SPI_DMA_IN_ERR_EOF_DES_ADDR_V 0xFFFFFFFF +#define SPI_DMA_IN_ERR_EOF_DES_ADDR_S 0 + +#define SPI_IN_SUC_EOF_DES_ADDR_REG(i) (REG_SPI_BASE(i) + 0x124) +/* SPI_DMA_IN_SUC_EOF_DES_ADDR : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: The last inlink descriptor address when spi dma produce from_suc_eof.*/ +#define SPI_DMA_IN_SUC_EOF_DES_ADDR 0xFFFFFFFF +#define SPI_DMA_IN_SUC_EOF_DES_ADDR_M ((SPI_DMA_IN_SUC_EOF_DES_ADDR_V)<<(SPI_DMA_IN_SUC_EOF_DES_ADDR_S)) +#define SPI_DMA_IN_SUC_EOF_DES_ADDR_V 0xFFFFFFFF +#define SPI_DMA_IN_SUC_EOF_DES_ADDR_S 0 + +#define SPI_INLINK_DSCR_REG(i) (REG_SPI_BASE(i) + 0x128) +/* SPI_DMA_INLINK_DSCR : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: The content of current in descriptor pointer.*/ +#define SPI_DMA_INLINK_DSCR 0xFFFFFFFF +#define SPI_DMA_INLINK_DSCR_M ((SPI_DMA_INLINK_DSCR_V)<<(SPI_DMA_INLINK_DSCR_S)) +#define SPI_DMA_INLINK_DSCR_V 0xFFFFFFFF +#define SPI_DMA_INLINK_DSCR_S 0 + +#define SPI_INLINK_DSCR_BF0_REG(i) (REG_SPI_BASE(i) + 0x12C) +/* SPI_DMA_INLINK_DSCR_BF0 : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: The content of next in descriptor pointer.*/ +#define SPI_DMA_INLINK_DSCR_BF0 0xFFFFFFFF +#define SPI_DMA_INLINK_DSCR_BF0_M ((SPI_DMA_INLINK_DSCR_BF0_V)<<(SPI_DMA_INLINK_DSCR_BF0_S)) +#define SPI_DMA_INLINK_DSCR_BF0_V 0xFFFFFFFF +#define SPI_DMA_INLINK_DSCR_BF0_S 0 + +#define SPI_INLINK_DSCR_BF1_REG(i) (REG_SPI_BASE(i) + 0x130) +/* SPI_DMA_INLINK_DSCR_BF1 : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: The content of current in descriptor data buffer pointer.*/ +#define SPI_DMA_INLINK_DSCR_BF1 0xFFFFFFFF +#define SPI_DMA_INLINK_DSCR_BF1_M ((SPI_DMA_INLINK_DSCR_BF1_V)<<(SPI_DMA_INLINK_DSCR_BF1_S)) +#define SPI_DMA_INLINK_DSCR_BF1_V 0xFFFFFFFF +#define SPI_DMA_INLINK_DSCR_BF1_S 0 + +#define SPI_OUT_EOF_BFR_DES_ADDR_REG(i) (REG_SPI_BASE(i) + 0x134) +/* SPI_DMA_OUT_EOF_BFR_DES_ADDR : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: The address of buffer relative to the outlink descriptor that produce eof.*/ +#define SPI_DMA_OUT_EOF_BFR_DES_ADDR 0xFFFFFFFF +#define SPI_DMA_OUT_EOF_BFR_DES_ADDR_M ((SPI_DMA_OUT_EOF_BFR_DES_ADDR_V)<<(SPI_DMA_OUT_EOF_BFR_DES_ADDR_S)) +#define SPI_DMA_OUT_EOF_BFR_DES_ADDR_V 0xFFFFFFFF +#define SPI_DMA_OUT_EOF_BFR_DES_ADDR_S 0 + +#define SPI_OUT_EOF_DES_ADDR_REG(i) (REG_SPI_BASE(i) + 0x138) +/* SPI_DMA_OUT_EOF_DES_ADDR : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: The last outlink descriptor address when spi dma produce to_eof.*/ +#define SPI_DMA_OUT_EOF_DES_ADDR 0xFFFFFFFF +#define SPI_DMA_OUT_EOF_DES_ADDR_M ((SPI_DMA_OUT_EOF_DES_ADDR_V)<<(SPI_DMA_OUT_EOF_DES_ADDR_S)) +#define SPI_DMA_OUT_EOF_DES_ADDR_V 0xFFFFFFFF +#define SPI_DMA_OUT_EOF_DES_ADDR_S 0 + +#define SPI_OUTLINK_DSCR_REG(i) (REG_SPI_BASE(i) + 0x13C) +/* SPI_DMA_OUTLINK_DSCR : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: The content of current out descriptor pointer.*/ +#define SPI_DMA_OUTLINK_DSCR 0xFFFFFFFF +#define SPI_DMA_OUTLINK_DSCR_M ((SPI_DMA_OUTLINK_DSCR_V)<<(SPI_DMA_OUTLINK_DSCR_S)) +#define SPI_DMA_OUTLINK_DSCR_V 0xFFFFFFFF +#define SPI_DMA_OUTLINK_DSCR_S 0 + +#define SPI_OUTLINK_DSCR_BF0_REG(i) (REG_SPI_BASE(i) + 0x140) +/* SPI_DMA_OUTLINK_DSCR_BF0 : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: The content of next out descriptor pointer.*/ +#define SPI_DMA_OUTLINK_DSCR_BF0 0xFFFFFFFF +#define SPI_DMA_OUTLINK_DSCR_BF0_M ((SPI_DMA_OUTLINK_DSCR_BF0_V)<<(SPI_DMA_OUTLINK_DSCR_BF0_S)) +#define SPI_DMA_OUTLINK_DSCR_BF0_V 0xFFFFFFFF +#define SPI_DMA_OUTLINK_DSCR_BF0_S 0 + +#define SPI_OUTLINK_DSCR_BF1_REG(i) (REG_SPI_BASE(i) + 0x144) +/* SPI_DMA_OUTLINK_DSCR_BF1 : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: The content of current out descriptor data buffer pointer.*/ +#define SPI_DMA_OUTLINK_DSCR_BF1 0xFFFFFFFF +#define SPI_DMA_OUTLINK_DSCR_BF1_M ((SPI_DMA_OUTLINK_DSCR_BF1_V)<<(SPI_DMA_OUTLINK_DSCR_BF1_S)) +#define SPI_DMA_OUTLINK_DSCR_BF1_V 0xFFFFFFFF +#define SPI_DMA_OUTLINK_DSCR_BF1_S 0 + +#define SPI_DMA_RSTATUS_REG(i) (REG_SPI_BASE(i) + 0x148) +/* SPI_DMA_OUT_STATUS : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: spi dma read data from memory status.*/ +#define SPI_DMA_OUT_STATUS 0xFFFFFFFF +#define SPI_DMA_OUT_STATUS_M ((SPI_DMA_OUT_STATUS_V)<<(SPI_DMA_OUT_STATUS_S)) +#define SPI_DMA_OUT_STATUS_V 0xFFFFFFFF +#define SPI_DMA_OUT_STATUS_S 0 + +#define SPI_DMA_TSTATUS_REG(i) (REG_SPI_BASE(i) + 0x14C) +/* SPI_DMA_IN_STATUS : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: spi dma write data to memory status.*/ +#define SPI_DMA_IN_STATUS 0xFFFFFFFF +#define SPI_DMA_IN_STATUS_M ((SPI_DMA_IN_STATUS_V)<<(SPI_DMA_IN_STATUS_S)) +#define SPI_DMA_IN_STATUS_V 0xFFFFFFFF +#define SPI_DMA_IN_STATUS_S 0 + +#define SPI_DATE_REG(i) (REG_SPI_BASE(i) + 0x3FC) +/* SPI_DATE : RO ;bitpos:[27:0] ;default: 32'h1604270 ; */ +/*description: SPI register version.*/ +#define SPI_DATE 0x0FFFFFFF +#define SPI_DATE_M ((SPI_DATE_V)<<(SPI_DATE_S)) +#define SPI_DATE_V 0xFFFFFFF +#define SPI_DATE_S 0 + + + + +#endif /*__SPI_REG_H__ */ + + diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/spi_struct.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/spi_struct.h new file mode 100644 index 0000000000000..63acaeefd6377 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/spi_struct.h @@ -0,0 +1,688 @@ +// 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. +#ifndef _SOC_SPI_STRUCT_H_ +#define _SOC_SPI_STRUCT_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef volatile struct spi_dev_s { + union { + struct { + uint32_t reserved0: 16; /*reserved*/ + uint32_t flash_per: 1; /*program erase resume bit program erase suspend operation will be triggered when the bit is set. The bit will be cleared once the operation done.1: enable 0: disable.*/ + uint32_t flash_pes: 1; /*program erase suspend bit program erase suspend operation will be triggered when the bit is set. The bit will be cleared once the operation done.1: enable 0: disable.*/ + uint32_t usr: 1; /*User define command enable. An operation will be triggered when the bit is set. The bit will be cleared once the operation done.1: enable 0: disable.*/ + uint32_t flash_hpm: 1; /*Drive Flash into high performance mode. The bit will be cleared once the operation done.1: enable 0: disable.*/ + uint32_t flash_res: 1; /*This bit combined with reg_resandres bit releases Flash from the power-down state or high performance mode and obtains the devices ID. The bit will be cleared once the operation done.1: enable 0: disable.*/ + uint32_t flash_dp: 1; /*Drive Flash into power down. An operation will be triggered when the bit is set. The bit will be cleared once the operation done.1: enable 0: disable.*/ + uint32_t flash_ce: 1; /*Chip erase enable. Chip erase operation will be triggered when the bit is set. The bit will be cleared once the operation done.1: enable 0: disable.*/ + uint32_t flash_be: 1; /*Block erase enable(32KB) . Block erase operation will be triggered when the bit is set. The bit will be cleared once the operation done.1: enable 0: disable.*/ + uint32_t flash_se: 1; /*Sector erase enable(4KB). Sector erase operation will be triggered when the bit is set. The bit will be cleared once the operation done.1: enable 0: disable.*/ + uint32_t flash_pp: 1; /*Page program enable(1 byte ~256 bytes data to be programmed). Page program operation will be triggered when the bit is set. The bit will be cleared once the operation done .1: enable 0: disable.*/ + uint32_t flash_wrsr: 1; /*Write status register enable. Write status operation will be triggered when the bit is set. The bit will be cleared once the operation done.1: enable 0: disable.*/ + uint32_t flash_rdsr: 1; /*Read status register-1. Read status operation will be triggered when the bit is set. The bit will be cleared once the operation done.1: enable 0: disable.*/ + uint32_t flash_rdid: 1; /*Read JEDEC ID . Read ID command will be sent when the bit is set. The bit will be cleared once the operation done. 1: enable 0: disable.*/ + uint32_t flash_wrdi: 1; /*Write flash disable. Write disable command will be sent when the bit is set. The bit will be cleared once the operation done. 1: enable 0: disable.*/ + uint32_t flash_wren: 1; /*Write flash enable. Write enable command will be sent when the bit is set. The bit will be cleared once the operation done. 1: enable 0: disable.*/ + uint32_t flash_read: 1; /*Read flash enable. Read flash operation will be triggered when the bit is set. The bit will be cleared once the operation done. 1: enable 0: disable.*/ + }; + uint32_t val; + } cmd; + uint32_t addr; /*addr to slave / from master. SPI transfer from the MSB to the LSB. If length > 32 bits, then address continues from MSB of slv_wr_status.*/ + union { + struct { + uint32_t reserved0: 10; /*reserved*/ + uint32_t fcs_crc_en: 1; /*For SPI1 initialize crc32 module before writing encrypted data to flash. Active low.*/ + uint32_t tx_crc_en: 1; /*For SPI1 enable crc32 when writing encrypted data to flash. 1: enable 0:disable*/ + uint32_t wait_flash_idle_en: 1; /*wait flash idle when program flash or erase flash. 1: enable 0: disable.*/ + uint32_t fastrd_mode: 1; /*This bit enable the bits: spi_fread_qio spi_fread_dio spi_fread_qout and spi_fread_dout. 1: enable 0: disable.*/ + uint32_t fread_dual: 1; /*In the read operations read-data phase apply 2 signals. 1: enable 0: disable.*/ + uint32_t resandres: 1; /*The Device ID is read out to SPI_RD_STATUS register, this bit combine with spi_flash_res bit. 1: enable 0: disable.*/ + uint32_t reserved16: 4; /*reserved*/ + uint32_t fread_quad: 1; /*In the read operations read-data phase apply 4 signals. 1: enable 0: disable.*/ + uint32_t wp: 1; /*Write protect signal output when SPI is idle. 1: output high 0: output low.*/ + uint32_t wrsr_2b: 1; /*two bytes data will be written to status register when it is set. 1: enable 0: disable.*/ + uint32_t fread_dio: 1; /*In the read operations address phase and read-data phase apply 2 signals. 1: enable 0: disable.*/ + uint32_t fread_qio: 1; /*In the read operations address phase and read-data phase apply 4 signals. 1: enable 0: disable.*/ + uint32_t rd_bit_order: 1; /*In read-data (MISO) phase 1: LSB first 0: MSB first*/ + uint32_t wr_bit_order: 1; /*In command address write-data (MOSI) phases 1: LSB firs 0: MSB first*/ + uint32_t reserved27: 5; /*reserved*/ + }; + uint32_t val; + } ctrl; + union { + struct { + uint32_t reserved0: 16; /*reserved*/ + uint32_t cs_hold_delay_res:12; /*Delay cycles of resume Flash when resume Flash is enable by spi clock.*/ + uint32_t cs_hold_delay: 4; /*SPI cs signal is delayed by spi clock cycles*/ + }; + uint32_t val; + } ctrl1; + union { + struct { + uint32_t status: 16; /*In the slave mode, it is the status for master to read out.*/ + uint32_t wb_mode: 8; /*Mode bits in the flash fast read mode, it is combined with spi_fastrd_mode bit.*/ + uint32_t status_ext: 8; /*In the slave mode,it is the status for master to read out.*/ + }; + uint32_t val; + } rd_status; + union { + struct { + uint32_t setup_time: 4; /*(cycles-1) of ,prepare, phase by spi clock, this bits combined with spi_cs_setup bit.*/ + uint32_t hold_time: 4; /*delay cycles of cs pin by spi clock, this bits combined with spi_cs_hold bit.*/ + uint32_t ck_out_low_mode: 4; /*modify spi clock duty ratio when the value is lager than 8, the bits are combined with spi_clkcnt_N bits and spi_clkcnt_L bits.*/ + uint32_t ck_out_high_mode: 4; /*modify spi clock duty ratio when the value is lager than 8, the bits are combined with spi_clkcnt_N bits and spi_clkcnt_H bits.*/ + uint32_t miso_delay_mode: 2; /*MISO signals are delayed by spi_clk. 0: zero 1: if spi_ck_out_edge or spi_ck_i_edge is set 1 delayed by half cycle else delayed by one cycle 2: if spi_ck_out_edge or spi_ck_i_edge is set 1 delayed by one cycle else delayed by half cycle 3: delayed one cycle*/ + uint32_t miso_delay_num: 3; /*MISO signals are delayed by system clock cycles*/ + uint32_t mosi_delay_mode: 2; /*MOSI signals are delayed by spi_clk. 0: zero 1: if spi_ck_out_edge or spi_ck_i_edge is set 1 delayed by half cycle else delayed by one cycle 2: if spi_ck_out_edge or spi_ck_i_edge is set 1 delayed by one cycle else delayed by half cycle 3: delayed one cycle*/ + uint32_t mosi_delay_num: 3; /*MOSI signals are delayed by system clock cycles*/ + uint32_t cs_delay_mode: 2; /*spi_cs signal is delayed by spi_clk . 0: zero 1: if spi_ck_out_edge or spi_ck_i_edge is set 1 delayed by half cycle else delayed by one cycle 2: if spi_ck_out_edge or spi_ck_i_edge is set 1 delayed by one cycle else delayed by half cycle 3: delayed one cycle*/ + uint32_t cs_delay_num: 4; /*spi_cs signal is delayed by system clock cycles*/ + }; + uint32_t val; + } ctrl2; + union { + struct { + uint32_t clkcnt_l: 6; /*In the master mode it must be equal to spi_clkcnt_N. In the slave mode it must be 0.*/ + uint32_t clkcnt_h: 6; /*In the master mode it must be floor((spi_clkcnt_N+1)/2-1). In the slave mode it must be 0.*/ + uint32_t clkcnt_n: 6; /*In the master mode it is the divider of spi_clk. So spi_clk frequency is system/(spi_clkdiv_pre+1)/(spi_clkcnt_N+1)*/ + uint32_t clkdiv_pre: 13; /*In the master mode it is pre-divider of spi_clk.*/ + uint32_t clk_equ_sysclk: 1; /*In the master mode 1: spi_clk is eqaul to system 0: spi_clk is divided from system clock.*/ + }; + uint32_t val; + } clock; + union { + struct { + uint32_t doutdin: 1; /*Set the bit to enable full duplex communication. 1: enable 0: disable.*/ + uint32_t reserved1: 3; /*reserved*/ + uint32_t cs_hold: 1; /*spi cs keep low when spi is in ,done, phase. 1: enable 0: disable.*/ + uint32_t cs_setup: 1; /*spi cs is enable when spi is in ,prepare, phase. 1: enable 0: disable.*/ + uint32_t ck_i_edge: 1; /*In the slave mode the bit is same as spi_ck_out_edge in master mode. It is combined with spi_miso_delay_mode bits.*/ + uint32_t ck_out_edge: 1; /*the bit combined with spi_mosi_delay_mode bits to set mosi signal delay mode.*/ + uint32_t reserved8: 2; /*reserved*/ + uint32_t rd_byte_order: 1; /*In read-data (MISO) phase 1: big-endian 0: little_endian*/ + uint32_t wr_byte_order: 1; /*In command address write-data (MOSI) phases 1: big-endian 0: litte_endian*/ + uint32_t fwrite_dual: 1; /*In the write operations read-data phase apply 2 signals*/ + uint32_t fwrite_quad: 1; /*In the write operations read-data phase apply 4 signals*/ + uint32_t fwrite_dio: 1; /*In the write operations address phase and read-data phase apply 2 signals.*/ + uint32_t fwrite_qio: 1; /*In the write operations address phase and read-data phase apply 4 signals.*/ + uint32_t sio: 1; /*Set the bit to enable 3-line half duplex communication mosi and miso signals share the same pin. 1: enable 0: disable.*/ + uint32_t usr_hold_pol: 1; /*It is combined with hold bits to set the polarity of spi hold line 1: spi will be held when spi hold line is high 0: spi will be held when spi hold line is low*/ + uint32_t usr_dout_hold: 1; /*spi is hold at data out state the bit combined with spi_usr_hold_pol bit.*/ + uint32_t usr_din_hold: 1; /*spi is hold at data in state the bit combined with spi_usr_hold_pol bit.*/ + uint32_t usr_dummy_hold: 1; /*spi is hold at dummy state the bit combined with spi_usr_hold_pol bit.*/ + uint32_t usr_addr_hold: 1; /*spi is hold at address state the bit combined with spi_usr_hold_pol bit.*/ + uint32_t usr_cmd_hold: 1; /*spi is hold at command state the bit combined with spi_usr_hold_pol bit.*/ + uint32_t usr_prep_hold: 1; /*spi is hold at prepare state the bit combined with spi_usr_hold_pol bit.*/ + uint32_t usr_miso_highpart: 1; /*read-data phase only access to high-part of the buffer spi_w8~spi_w15. 1: enable 0: disable.*/ + uint32_t usr_mosi_highpart: 1; /*write-data phase only access to high-part of the buffer spi_w8~spi_w15. 1: enable 0: disable.*/ + uint32_t usr_dummy_idle: 1; /*spi clock is disable in dummy phase when the bit is enable.*/ + uint32_t usr_mosi: 1; /*This bit enable the write-data phase of an operation.*/ + uint32_t usr_miso: 1; /*This bit enable the read-data phase of an operation.*/ + uint32_t usr_dummy: 1; /*This bit enable the dummy phase of an operation.*/ + uint32_t usr_addr: 1; /*This bit enable the address phase of an operation.*/ + uint32_t usr_command: 1; /*This bit enable the command phase of an operation.*/ + }; + uint32_t val; + } user; + union { + struct { + uint32_t usr_dummy_cyclelen: 8; /*The length in spi_clk cycles of dummy phase. The register value shall be (cycle_num-1).*/ + uint32_t reserved8: 18; /*reserved*/ + uint32_t usr_addr_bitlen: 6; /*The length in bits of address phase. The register value shall be (bit_num-1).*/ + }; + uint32_t val; + } user1; + union { + struct { + uint32_t usr_command_value: 16; /*The value of command. Output sequence: bit 7-0 and then 15-8.*/ + uint32_t reserved16: 12; /*reserved*/ + uint32_t usr_command_bitlen: 4; /*The length in bits of command phase. The register value shall be (bit_num-1)*/ + }; + uint32_t val; + } user2; + union { + struct { + uint32_t usr_mosi_dbitlen:24; /*The length in bits of write-data. The register value shall be (bit_num-1).*/ + uint32_t reserved24: 8; /*reserved*/ + }; + uint32_t val; + } mosi_dlen; + union { + struct { + uint32_t usr_miso_dbitlen:24; /*The length in bits of read-data. The register value shall be (bit_num-1).*/ + uint32_t reserved24: 8; /*reserved*/ + }; + uint32_t val; + } miso_dlen; + uint32_t slv_wr_status; /*In the slave mode this register are the status register for the master to write into. In the master mode this register are the higher 32bits in the 64 bits address condition.*/ + union { + struct { + uint32_t cs0_dis: 1; /*SPI CS0 pin enable, 1: disable CS0, 0: spi_cs0 signal is from/to CS0 pin*/ + uint32_t cs1_dis: 1; /*SPI CS1 pin enable, 1: disable CS1, 0: spi_cs1 signal is from/to CS1 pin*/ + uint32_t cs2_dis: 1; /*SPI CS2 pin enable, 1: disable CS2, 0: spi_cs2 signal is from/to CS2 pin*/ + uint32_t reserved3: 2; /*reserved*/ + uint32_t ck_dis: 1; /*1: spi clk out disable 0: spi clk out enable*/ + uint32_t master_cs_pol: 3; /*In the master mode the bits are the polarity of spi cs line the value is equivalent to spi_cs ^ spi_master_cs_pol.*/ + uint32_t reserved9: 2; /*reserved*/ + uint32_t master_ck_sel: 3; /*In the master mode spi cs line is enable as spi clk it is combined with spi_cs0_dis spi_cs1_dis spi_cs2_dis.*/ + uint32_t reserved14: 15; /*reserved*/ + uint32_t ck_idle_edge: 1; /*1: spi clk line is high when idle 0: spi clk line is low when idle*/ + uint32_t cs_keep_active: 1; /*spi cs line keep low when the bit is set.*/ + uint32_t reserved31: 1; /*reserved*/ + }; + uint32_t val; + } pin; + union { + struct { + uint32_t rd_buf_done: 1; /*The interrupt raw bit for the completion of read-buffer operation in the slave mode.*/ + uint32_t wr_buf_done: 1; /*The interrupt raw bit for the completion of write-buffer operation in the slave mode.*/ + uint32_t rd_sta_done: 1; /*The interrupt raw bit for the completion of read-status operation in the slave mode.*/ + uint32_t wr_sta_done: 1; /*The interrupt raw bit for the completion of write-status operation in the slave mode.*/ + uint32_t trans_done: 1; /*The interrupt raw bit for the completion of any operation in both the master mode and the slave mode.*/ + uint32_t rd_buf_inten: 1; /*The interrupt enable bit for the completion of read-buffer operation in the slave mode.*/ + uint32_t wr_buf_inten: 1; /*The interrupt enable bit for the completion of write-buffer operation in the slave mode.*/ + uint32_t rd_sta_inten: 1; /*The interrupt enable bit for the completion of read-status operation in the slave mode.*/ + uint32_t wr_sta_inten: 1; /*The interrupt enable bit for the completion of write-status operation in the slave mode.*/ + uint32_t trans_inten: 1; /*The interrupt enable bit for the completion of any operation in both the master mode and the slave mode.*/ + uint32_t cs_i_mode: 2; /*In the slave mode this bits used to synchronize the input spi cs signal and eliminate spi cs jitter.*/ + uint32_t reserved12: 5; /*reserved*/ + uint32_t last_command: 3; /*In the slave mode it is the value of command.*/ + uint32_t last_state: 3; /*In the slave mode it is the state of spi state machine.*/ + uint32_t trans_cnt: 4; /*The operations counter in both the master mode and the slave mode. 4: read-status*/ + uint32_t cmd_define: 1; /*1: slave mode commands are defined in SPI_SLAVE3. 0: slave mode commands are fixed as: 1: write-status 2: write-buffer and 3: read-buffer.*/ + uint32_t wr_rd_sta_en: 1; /*write and read status enable in the slave mode*/ + uint32_t wr_rd_buf_en: 1; /*write and read buffer enable in the slave mode*/ + uint32_t slave_mode: 1; /*1: slave mode 0: master mode.*/ + uint32_t sync_reset: 1; /*Software reset enable, reset the spi clock line cs line and data lines.*/ + }; + uint32_t val; + } slave; + union { + struct { + uint32_t rdbuf_dummy_en: 1; /*In the slave mode it is the enable bit of dummy phase for read-buffer operations.*/ + uint32_t wrbuf_dummy_en: 1; /*In the slave mode it is the enable bit of dummy phase for write-buffer operations.*/ + uint32_t rdsta_dummy_en: 1; /*In the slave mode it is the enable bit of dummy phase for read-status operations.*/ + uint32_t wrsta_dummy_en: 1; /*In the slave mode it is the enable bit of dummy phase for write-status operations.*/ + uint32_t wr_addr_bitlen: 6; /*In the slave mode it is the address length in bits for write-buffer operation. The register value shall be (bit_num-1).*/ + uint32_t rd_addr_bitlen: 6; /*In the slave mode it is the address length in bits for read-buffer operation. The register value shall be (bit_num-1).*/ + uint32_t reserved16: 9; /*reserved*/ + uint32_t status_readback: 1; /*In the slave mode 1:read register of SPI_SLV_WR_STATUS 0: read register of SPI_RD_STATUS.*/ + uint32_t status_fast_en: 1; /*In the slave mode enable fast read status.*/ + uint32_t status_bitlen: 5; /*In the slave mode it is the length of status bit.*/ + }; + uint32_t val; + } slave1; + union { + struct { + uint32_t rdsta_dummy_cyclelen: 8; /*In the slave mode it is the length in spi_clk cycles of dummy phase for read-status operations. The register value shall be (cycle_num-1).*/ + uint32_t wrsta_dummy_cyclelen: 8; /*In the slave mode it is the length in spi_clk cycles of dummy phase for write-status operations. The register value shall be (cycle_num-1).*/ + uint32_t rdbuf_dummy_cyclelen: 8; /*In the slave mode it is the length in spi_clk cycles of dummy phase for read-buffer operations. The register value shall be (cycle_num-1).*/ + uint32_t wrbuf_dummy_cyclelen: 8; /*In the slave mode it is the length in spi_clk cycles of dummy phase for write-buffer operations. The register value shall be (cycle_num-1).*/ + }; + uint32_t val; + } slave2; + union { + struct { + uint32_t rdbuf_cmd_value: 8; /*In the slave mode it is the value of read-buffer command.*/ + uint32_t wrbuf_cmd_value: 8; /*In the slave mode it is the value of write-buffer command.*/ + uint32_t rdsta_cmd_value: 8; /*In the slave mode it is the value of read-status command.*/ + uint32_t wrsta_cmd_value: 8; /*In the slave mode it is the value of write-status command.*/ + }; + uint32_t val; + } slave3; + union { + struct { + uint32_t bit_len: 24; /*In the slave mode it is the length in bits for write-buffer operations. The register value shall be (bit_num-1).*/ + uint32_t reserved24: 8; /*reserved*/ + }; + uint32_t val; + } slv_wrbuf_dlen; + union { + struct { + uint32_t bit_len: 24; /*In the slave mode it is the length in bits for read-buffer operations. The register value shall be (bit_num-1).*/ + uint32_t reserved24: 8; /*reserved*/ + }; + uint32_t val; + } slv_rdbuf_dlen; + union { + struct { + uint32_t req_en: 1; /*For SPI0 Cache access enable 1: enable 0:disable.*/ + uint32_t usr_cmd_4byte: 1; /*For SPI0 cache read flash with 4 bytes command 1: enable 0:disable.*/ + uint32_t flash_usr_cmd: 1; /*For SPI0 cache read flash for user define command 1: enable 0:disable.*/ + uint32_t flash_pes_en: 1; /*For SPI0 spi1 send suspend command before cache read flash 1: enable 0:disable.*/ + uint32_t reserved4: 28; /*reserved*/ + }; + uint32_t val; + } cache_fctrl; + union { + struct { + uint32_t reserved0: 1; /*reserved*/ + uint32_t usr_sram_dio: 1; /*For SPI0 In the spi sram mode spi dual I/O mode enable 1: enable 0:disable*/ + uint32_t usr_sram_qio: 1; /*For SPI0 In the spi sram mode spi quad I/O mode enable 1: enable 0:disable*/ + uint32_t usr_wr_sram_dummy: 1; /*For SPI0 In the spi sram mode it is the enable bit of dummy phase for write operations.*/ + uint32_t usr_rd_sram_dummy: 1; /*For SPI0 In the spi sram mode it is the enable bit of dummy phase for read operations.*/ + uint32_t cache_sram_usr_rcmd: 1; /*For SPI0 In the spi sram mode cache read sram for user define command.*/ + uint32_t sram_bytes_len: 8; /*For SPI0 In the sram mode it is the byte length of spi read sram data.*/ + uint32_t sram_dummy_cyclelen: 8; /*For SPI0 In the sram mode it is the length in bits of address phase. The register value shall be (bit_num-1).*/ + uint32_t sram_addr_bitlen: 6; /*For SPI0 In the sram mode it is the length in bits of address phase. The register value shall be (bit_num-1).*/ + uint32_t cache_sram_usr_wcmd: 1; /*For SPI0 In the spi sram mode cache write sram for user define command*/ + uint32_t reserved29: 3; /*reserved*/ + }; + uint32_t val; + } cache_sctrl; + union { + struct { + uint32_t dio: 1; /*For SPI0 SRAM DIO mode enable . SRAM DIO enable command will be send when the bit is set. The bit will be cleared once the operation done.*/ + uint32_t qio: 1; /*For SPI0 SRAM QIO mode enable . SRAM QIO enable command will be send when the bit is set. The bit will be cleared once the operation done.*/ + uint32_t reserved2: 2; /*For SPI0 SRAM write enable . SRAM write operation will be triggered when the bit is set. The bit will be cleared once the operation done.*/ + uint32_t rst_io: 1; /*For SPI0 SRAM IO mode reset enable. SRAM IO mode reset operation will be triggered when the bit is set. The bit will be cleared once the operation done*/ + uint32_t reserved5:27; /*reserved*/ + }; + uint32_t val; + } sram_cmd; + union { + struct { + uint32_t usr_rd_cmd_value: 16; /*For SPI0 When cache mode is enable it is the read command value of command phase for SRAM.*/ + uint32_t reserved16: 12; /*reserved*/ + uint32_t usr_rd_cmd_bitlen: 4; /*For SPI0 When cache mode is enable it is the length in bits of command phase for SRAM. The register value shall be (bit_num-1).*/ + }; + uint32_t val; + } sram_drd_cmd; + union { + struct { + uint32_t usr_wr_cmd_value: 16; /*For SPI0 When cache mode is enable it is the write command value of command phase for SRAM.*/ + uint32_t reserved16: 12; /*reserved*/ + uint32_t usr_wr_cmd_bitlen: 4; /*For SPI0 When cache mode is enable it is the in bits of command phase for SRAM. The register value shall be (bit_num-1).*/ + }; + uint32_t val; + } sram_dwr_cmd; + union { + struct { + uint32_t slv_rdata_bit:24; /*In the slave mode it is the bit length of read data. The value is the length - 1.*/ + uint32_t reserved24: 8; /*reserved*/ + }; + uint32_t val; + } slv_rd_bit; + 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 data_buf[16]; /*data buffer*/ + uint32_t tx_crc; /*For SPI1 the value of crc32 for 256 bits data.*/ + 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; + union { + struct { + uint32_t t_pp_time: 12; /*page program delay time by system clock.*/ + uint32_t reserved12: 4; /*reserved*/ + uint32_t t_pp_shift: 4; /*page program delay time shift .*/ + uint32_t reserved20:11; /*reserved*/ + uint32_t t_pp_ena: 1; /*page program delay enable.*/ + }; + uint32_t val; + } ext0; + union { + struct { + uint32_t t_erase_time: 12; /*erase flash delay time by system clock.*/ + uint32_t reserved12: 4; /*reserved*/ + uint32_t t_erase_shift: 4; /*erase flash delay time shift.*/ + uint32_t reserved20: 11; /*reserved*/ + uint32_t t_erase_ena: 1; /*erase flash delay enable.*/ + }; + uint32_t val; + } ext1; + union { + struct { + uint32_t st: 3; /*The status of spi state machine .*/ + uint32_t reserved3: 29; /*reserved*/ + }; + uint32_t val; + } ext2; + union { + struct { + uint32_t int_hold_ena: 2; /*This register is for two SPI masters to share the same cs clock and data signals. The bits of one SPI are set if the other SPI is busy the SPI will be hold. 1(3): hold at ,idle, phase 2: hold at ,prepare, phase.*/ + uint32_t reserved2: 30; /*reserved*/ + }; + uint32_t val; + } ext3; + union { + struct { + uint32_t reserved0: 2; /*reserved*/ + uint32_t in_rst: 1; /*The bit is used to reset in dma fsm and in data fifo pointer.*/ + uint32_t out_rst: 1; /*The bit is used to reset out dma fsm and out data fifo pointer.*/ + uint32_t ahbm_fifo_rst: 1; /*reset spi dma ahb master fifo pointer.*/ + uint32_t ahbm_rst: 1; /*reset spi dma ahb master.*/ + uint32_t in_loop_test: 1; /*Set bit to test in link.*/ + uint32_t out_loop_test: 1; /*Set bit to test out link.*/ + uint32_t out_auto_wrback: 1; /*when the link is empty jump to next automatically.*/ + uint32_t out_eof_mode: 1; /*out eof flag generation mode . 1: when dma pop all data from fifo 0:when ahb push all data to fifo.*/ + uint32_t outdscr_burst_en: 1; /*read descriptor use burst mode when read data for memory.*/ + uint32_t indscr_burst_en: 1; /*read descriptor use burst mode when write data to memory.*/ + uint32_t out_data_burst_en: 1; /*spi dma read data from memory in burst mode.*/ + uint32_t reserved13: 1; /*reserved*/ + uint32_t dma_rx_stop: 1; /*spi dma read data stop when in continue tx/rx mode.*/ + uint32_t dma_tx_stop: 1; /*spi dma write data stop when in continue tx/rx mode.*/ + uint32_t dma_continue: 1; /*spi dma continue tx/rx data.*/ + uint32_t reserved17: 15; /*reserved*/ + }; + uint32_t val; + } dma_conf; + union { + struct { + uint32_t addr: 20; /*The address of the first outlink descriptor.*/ + uint32_t reserved20: 8; /*reserved*/ + uint32_t stop: 1; /*Set the bit to stop to use outlink descriptor.*/ + uint32_t start: 1; /*Set the bit to start to use outlink descriptor.*/ + uint32_t restart: 1; /*Set the bit to mount on new outlink descriptors.*/ + uint32_t reserved31: 1; /*reserved*/ + }; + uint32_t val; + } dma_out_link; + union { + struct { + uint32_t addr: 20; /*The address of the first inlink descriptor.*/ + uint32_t auto_ret: 1; /*when the bit is set inlink descriptor returns to the next descriptor while a packet is wrong*/ + uint32_t reserved21: 7; /*reserved*/ + uint32_t stop: 1; /*Set the bit to stop to use inlink descriptor.*/ + uint32_t start: 1; /*Set the bit to start to use inlink descriptor.*/ + uint32_t restart: 1; /*Set the bit to mount on new inlink descriptors.*/ + uint32_t reserved31: 1; /*reserved*/ + }; + uint32_t val; + } dma_in_link; + union { + struct { + uint32_t rx_en: 1; /*spi dma read data status bit.*/ + uint32_t tx_en: 1; /*spi dma write data status bit.*/ + uint32_t reserved2: 30; /*spi dma read data from memory count.*/ + }; + uint32_t val; + } dma_status; + union { + struct { + uint32_t inlink_dscr_empty: 1; /*The enable bit for lack of enough inlink descriptors.*/ + uint32_t outlink_dscr_error: 1; /*The enable bit for outlink descriptor error.*/ + uint32_t inlink_dscr_error: 1; /*The enable bit for inlink descriptor error.*/ + uint32_t in_done: 1; /*The enable bit for completing usage of a inlink descriptor.*/ + uint32_t in_err_eof: 1; /*The enable bit for receiving error.*/ + uint32_t in_suc_eof: 1; /*The enable bit for completing receiving all the packets from host.*/ + uint32_t out_done: 1; /*The enable bit for completing usage of a outlink descriptor .*/ + uint32_t out_eof: 1; /*The enable bit for sending a packet to host done.*/ + uint32_t out_total_eof: 1; /*The enable bit for sending all the packets to host done.*/ + uint32_t reserved9: 23; /*reserved*/ + }; + uint32_t val; + } dma_int_ena; + union { + struct { + uint32_t inlink_dscr_empty: 1; /*The raw bit for lack of enough inlink descriptors.*/ + uint32_t outlink_dscr_error: 1; /*The raw bit for outlink descriptor error.*/ + uint32_t inlink_dscr_error: 1; /*The raw bit for inlink descriptor error.*/ + uint32_t in_done: 1; /*The raw bit for completing usage of a inlink descriptor.*/ + uint32_t in_err_eof: 1; /*The raw bit for receiving error.*/ + uint32_t in_suc_eof: 1; /*The raw bit for completing receiving all the packets from host.*/ + uint32_t out_done: 1; /*The raw bit for completing usage of a outlink descriptor.*/ + uint32_t out_eof: 1; /*The raw bit for sending a packet to host done.*/ + uint32_t out_total_eof: 1; /*The raw bit for sending all the packets to host done.*/ + uint32_t reserved9: 23; /*reserved*/ + }; + uint32_t val; + } dma_int_raw; + union { + struct { + uint32_t inlink_dscr_empty: 1; /*The status bit for lack of enough inlink descriptors.*/ + uint32_t outlink_dscr_error: 1; /*The status bit for outlink descriptor error.*/ + uint32_t inlink_dscr_error: 1; /*The status bit for inlink descriptor error.*/ + uint32_t in_done: 1; /*The status bit for completing usage of a inlink descriptor.*/ + uint32_t in_err_eof: 1; /*The status bit for receiving error.*/ + uint32_t in_suc_eof: 1; /*The status bit for completing receiving all the packets from host.*/ + uint32_t out_done: 1; /*The status bit for completing usage of a outlink descriptor.*/ + uint32_t out_eof: 1; /*The status bit for sending a packet to host done.*/ + uint32_t out_total_eof: 1; /*The status bit for sending all the packets to host done.*/ + uint32_t reserved9: 23; /*reserved*/ + }; + uint32_t val; + } dma_int_st; + union { + struct { + uint32_t inlink_dscr_empty: 1; /*The clear bit for lack of enough inlink descriptors.*/ + uint32_t outlink_dscr_error: 1; /*The clear bit for outlink descriptor error.*/ + uint32_t inlink_dscr_error: 1; /*The clear bit for inlink descriptor error.*/ + uint32_t in_done: 1; /*The clear bit for completing usage of a inlink descriptor.*/ + uint32_t in_err_eof: 1; /*The clear bit for receiving error.*/ + uint32_t in_suc_eof: 1; /*The clear bit for completing receiving all the packets from host.*/ + uint32_t out_done: 1; /*The clear bit for completing usage of a outlink descriptor.*/ + uint32_t out_eof: 1; /*The clear bit for sending a packet to host done.*/ + uint32_t out_total_eof: 1; /*The clear bit for sending all the packets to host done.*/ + uint32_t reserved9: 23; /*reserved*/ + }; + uint32_t val; + } dma_int_clr; + uint32_t dma_in_err_eof_des_addr; /*The inlink descriptor address when spi dma produce receiving error.*/ + uint32_t dma_in_suc_eof_des_addr; /*The last inlink descriptor address when spi dma produce from_suc_eof.*/ + uint32_t dma_inlink_dscr; /*The content of current in descriptor pointer.*/ + uint32_t dma_inlink_dscr_bf0; /*The content of next in descriptor pointer.*/ + uint32_t dma_inlink_dscr_bf1; /*The content of current in descriptor data buffer pointer.*/ + uint32_t dma_out_eof_bfr_des_addr; /*The address of buffer relative to the outlink descriptor that produce eof.*/ + uint32_t dma_out_eof_des_addr; /*The last outlink descriptor address when spi dma produce to_eof.*/ + uint32_t dma_outlink_dscr; /*The content of current out descriptor pointer.*/ + uint32_t dma_outlink_dscr_bf0; /*The content of next out descriptor pointer.*/ + uint32_t dma_outlink_dscr_bf1; /*The content of current out descriptor data buffer pointer.*/ + uint32_t dma_rx_status; /*spi dma read data from memory status.*/ + uint32_t dma_tx_status; /*spi dma write data to memory status.*/ + 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 reserved_180; + uint32_t reserved_184; + uint32_t reserved_188; + uint32_t reserved_18c; + uint32_t reserved_190; + uint32_t reserved_194; + uint32_t reserved_198; + uint32_t reserved_19c; + uint32_t reserved_1a0; + uint32_t reserved_1a4; + uint32_t reserved_1a8; + uint32_t reserved_1ac; + uint32_t reserved_1b0; + uint32_t reserved_1b4; + uint32_t reserved_1b8; + uint32_t reserved_1bc; + uint32_t reserved_1c0; + uint32_t reserved_1c4; + uint32_t reserved_1c8; + uint32_t reserved_1cc; + uint32_t reserved_1d0; + uint32_t reserved_1d4; + uint32_t reserved_1d8; + uint32_t reserved_1dc; + uint32_t reserved_1e0; + uint32_t reserved_1e4; + uint32_t reserved_1e8; + uint32_t reserved_1ec; + uint32_t reserved_1f0; + uint32_t reserved_1f4; + uint32_t reserved_1f8; + uint32_t reserved_1fc; + uint32_t reserved_200; + uint32_t reserved_204; + uint32_t reserved_208; + uint32_t reserved_20c; + uint32_t reserved_210; + uint32_t reserved_214; + uint32_t reserved_218; + uint32_t reserved_21c; + uint32_t reserved_220; + uint32_t reserved_224; + uint32_t reserved_228; + uint32_t reserved_22c; + uint32_t reserved_230; + uint32_t reserved_234; + uint32_t reserved_238; + uint32_t reserved_23c; + uint32_t reserved_240; + uint32_t reserved_244; + uint32_t reserved_248; + uint32_t reserved_24c; + uint32_t reserved_250; + uint32_t reserved_254; + uint32_t reserved_258; + uint32_t reserved_25c; + uint32_t reserved_260; + uint32_t reserved_264; + uint32_t reserved_268; + uint32_t reserved_26c; + uint32_t reserved_270; + uint32_t reserved_274; + uint32_t reserved_278; + uint32_t reserved_27c; + uint32_t reserved_280; + uint32_t reserved_284; + uint32_t reserved_288; + uint32_t reserved_28c; + uint32_t reserved_290; + uint32_t reserved_294; + uint32_t reserved_298; + uint32_t reserved_29c; + uint32_t reserved_2a0; + uint32_t reserved_2a4; + uint32_t reserved_2a8; + uint32_t reserved_2ac; + uint32_t reserved_2b0; + uint32_t reserved_2b4; + uint32_t reserved_2b8; + uint32_t reserved_2bc; + uint32_t reserved_2c0; + uint32_t reserved_2c4; + uint32_t reserved_2c8; + uint32_t reserved_2cc; + uint32_t reserved_2d0; + uint32_t reserved_2d4; + uint32_t reserved_2d8; + uint32_t reserved_2dc; + uint32_t reserved_2e0; + uint32_t reserved_2e4; + uint32_t reserved_2e8; + uint32_t reserved_2ec; + uint32_t reserved_2f0; + uint32_t reserved_2f4; + uint32_t reserved_2f8; + uint32_t reserved_2fc; + uint32_t reserved_300; + uint32_t reserved_304; + uint32_t reserved_308; + uint32_t reserved_30c; + uint32_t reserved_310; + uint32_t reserved_314; + uint32_t reserved_318; + uint32_t reserved_31c; + uint32_t reserved_320; + uint32_t reserved_324; + uint32_t reserved_328; + uint32_t reserved_32c; + uint32_t reserved_330; + uint32_t reserved_334; + uint32_t reserved_338; + uint32_t reserved_33c; + uint32_t reserved_340; + uint32_t reserved_344; + uint32_t reserved_348; + uint32_t reserved_34c; + uint32_t reserved_350; + uint32_t reserved_354; + uint32_t reserved_358; + uint32_t reserved_35c; + uint32_t reserved_360; + uint32_t reserved_364; + uint32_t reserved_368; + uint32_t reserved_36c; + uint32_t reserved_370; + uint32_t reserved_374; + uint32_t reserved_378; + uint32_t reserved_37c; + uint32_t reserved_380; + uint32_t reserved_384; + uint32_t reserved_388; + uint32_t reserved_38c; + uint32_t reserved_390; + uint32_t reserved_394; + uint32_t reserved_398; + uint32_t reserved_39c; + uint32_t reserved_3a0; + uint32_t reserved_3a4; + uint32_t reserved_3a8; + uint32_t reserved_3ac; + uint32_t reserved_3b0; + uint32_t reserved_3b4; + uint32_t reserved_3b8; + uint32_t reserved_3bc; + uint32_t reserved_3c0; + uint32_t reserved_3c4; + uint32_t reserved_3c8; + uint32_t reserved_3cc; + uint32_t reserved_3d0; + uint32_t reserved_3d4; + uint32_t reserved_3d8; + uint32_t reserved_3dc; + uint32_t reserved_3e0; + uint32_t reserved_3e4; + uint32_t reserved_3e8; + uint32_t reserved_3ec; + uint32_t reserved_3f0; + uint32_t reserved_3f4; + uint32_t reserved_3f8; + union { + struct { + uint32_t date: 28; /*SPI register version.*/ + uint32_t reserved28: 4; /*reserved*/ + }; + uint32_t val; + } date; +} spi_dev_t; +extern spi_dev_t SPI0; /* SPI0 IS FOR INTERNAL USE*/ +extern spi_dev_t SPI1; +extern spi_dev_t SPI2; +extern spi_dev_t SPI3; + +#ifdef __cplusplus +} +#endif + +#endif /* _SOC_SPI_STRUCT_H_ */ diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/syscon_reg.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/syscon_reg.h new file mode 100644 index 0000000000000..5012b27e57363 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/syscon_reg.h @@ -0,0 +1,294 @@ +// 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. +#ifndef _SOC_SYSCON_REG_H_ +#define _SOC_SYSCON_REG_H_ + +#include "soc.h" +#define SYSCON_SYSCLK_CONF_REG (DR_REG_SYSCON_BASE + 0x0) +/* SYSCON_QUICK_CLK_CHNG : R/W ;bitpos:[13] ;default: 1'b1 ; */ +/*description: */ +#define SYSCON_QUICK_CLK_CHNG (BIT(13)) +#define SYSCON_QUICK_CLK_CHNG_M (BIT(13)) +#define SYSCON_QUICK_CLK_CHNG_V 0x1 +#define SYSCON_QUICK_CLK_CHNG_S 13 +/* SYSCON_RST_TICK_CNT : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define SYSCON_RST_TICK_CNT (BIT(12)) +#define SYSCON_RST_TICK_CNT_M (BIT(12)) +#define SYSCON_RST_TICK_CNT_V 0x1 +#define SYSCON_RST_TICK_CNT_S 12 +/* SYSCON_CLK_EN : R/W ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define SYSCON_CLK_EN (BIT(11)) +#define SYSCON_CLK_EN_M (BIT(11)) +#define SYSCON_CLK_EN_V 0x1 +#define SYSCON_CLK_EN_S 11 +/* SYSCON_CLK_320M_EN : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define SYSCON_CLK_320M_EN (BIT(10)) +#define SYSCON_CLK_320M_EN_M (BIT(10)) +#define SYSCON_CLK_320M_EN_V 0x1 +#define SYSCON_CLK_320M_EN_S 10 +/* SYSCON_PRE_DIV_CNT : R/W ;bitpos:[9:0] ;default: 10'h0 ; */ +/*description: */ +#define SYSCON_PRE_DIV_CNT 0x000003FF +#define SYSCON_PRE_DIV_CNT_M ((SYSCON_PRE_DIV_CNT_V)<<(SYSCON_PRE_DIV_CNT_S)) +#define SYSCON_PRE_DIV_CNT_V 0x3FF +#define SYSCON_PRE_DIV_CNT_S 0 + +#define SYSCON_XTAL_TICK_CONF_REG (DR_REG_SYSCON_BASE + 0x4) +/* SYSCON_XTAL_TICK_NUM : R/W ;bitpos:[7:0] ;default: 8'd39 ; */ +/*description: */ +#define SYSCON_XTAL_TICK_NUM 0x000000FF +#define SYSCON_XTAL_TICK_NUM_M ((SYSCON_XTAL_TICK_NUM_V)<<(SYSCON_XTAL_TICK_NUM_S)) +#define SYSCON_XTAL_TICK_NUM_V 0xFF +#define SYSCON_XTAL_TICK_NUM_S 0 + +#define SYSCON_PLL_TICK_CONF_REG (DR_REG_SYSCON_BASE + 0x8) +/* SYSCON_PLL_TICK_NUM : R/W ;bitpos:[7:0] ;default: 8'd79 ; */ +/*description: */ +#define SYSCON_PLL_TICK_NUM 0x000000FF +#define SYSCON_PLL_TICK_NUM_M ((SYSCON_PLL_TICK_NUM_V)<<(SYSCON_PLL_TICK_NUM_S)) +#define SYSCON_PLL_TICK_NUM_V 0xFF +#define SYSCON_PLL_TICK_NUM_S 0 + +#define SYSCON_CK8M_TICK_CONF_REG (DR_REG_SYSCON_BASE + 0xC) +/* SYSCON_CK8M_TICK_NUM : R/W ;bitpos:[7:0] ;default: 8'd11 ; */ +/*description: */ +#define SYSCON_CK8M_TICK_NUM 0x000000FF +#define SYSCON_CK8M_TICK_NUM_M ((SYSCON_CK8M_TICK_NUM_V)<<(SYSCON_CK8M_TICK_NUM_S)) +#define SYSCON_CK8M_TICK_NUM_V 0xFF +#define SYSCON_CK8M_TICK_NUM_S 0 + +#define SYSCON_SARADC_CTRL_REG (DR_REG_SYSCON_BASE + 0x10) +/* SYSCON_SARADC_DATA_TO_I2S : R/W ;bitpos:[26] ;default: 1'b0 ; */ +/*description: 1: I2S input data is from SAR ADC (for DMA) 0: I2S input data + is from GPIO matrix*/ +#define SYSCON_SARADC_DATA_TO_I2S (BIT(26)) +#define SYSCON_SARADC_DATA_TO_I2S_M (BIT(26)) +#define SYSCON_SARADC_DATA_TO_I2S_V 0x1 +#define SYSCON_SARADC_DATA_TO_I2S_S 26 +/* SYSCON_SARADC_DATA_SAR_SEL : R/W ;bitpos:[25] ;default: 1'b0 ; */ +/*description: 1: sar_sel will be coded by the MSB of the 16-bit output data + in this case the resolution should not be larger than 11 bits.*/ +#define SYSCON_SARADC_DATA_SAR_SEL (BIT(25)) +#define SYSCON_SARADC_DATA_SAR_SEL_M (BIT(25)) +#define SYSCON_SARADC_DATA_SAR_SEL_V 0x1 +#define SYSCON_SARADC_DATA_SAR_SEL_S 25 +/* SYSCON_SARADC_SAR2_PATT_P_CLEAR : R/W ;bitpos:[24] ;default: 1'd0 ; */ +/*description: clear the pointer of pattern table for DIG ADC2 CTRL*/ +#define SYSCON_SARADC_SAR2_PATT_P_CLEAR (BIT(24)) +#define SYSCON_SARADC_SAR2_PATT_P_CLEAR_M (BIT(24)) +#define SYSCON_SARADC_SAR2_PATT_P_CLEAR_V 0x1 +#define SYSCON_SARADC_SAR2_PATT_P_CLEAR_S 24 +/* SYSCON_SARADC_SAR1_PATT_P_CLEAR : R/W ;bitpos:[23] ;default: 1'd0 ; */ +/*description: clear the pointer of pattern table for DIG ADC1 CTRL*/ +#define SYSCON_SARADC_SAR1_PATT_P_CLEAR (BIT(23)) +#define SYSCON_SARADC_SAR1_PATT_P_CLEAR_M (BIT(23)) +#define SYSCON_SARADC_SAR1_PATT_P_CLEAR_V 0x1 +#define SYSCON_SARADC_SAR1_PATT_P_CLEAR_S 23 +/* SYSCON_SARADC_SAR2_PATT_LEN : R/W ;bitpos:[22:19] ;default: 4'd15 ; */ +/*description: 0 ~ 15 means length 1 ~ 16*/ +#define SYSCON_SARADC_SAR2_PATT_LEN 0x0000000F +#define SYSCON_SARADC_SAR2_PATT_LEN_M ((SYSCON_SARADC_SAR2_PATT_LEN_V)<<(SYSCON_SARADC_SAR2_PATT_LEN_S)) +#define SYSCON_SARADC_SAR2_PATT_LEN_V 0xF +#define SYSCON_SARADC_SAR2_PATT_LEN_S 19 +/* SYSCON_SARADC_SAR1_PATT_LEN : R/W ;bitpos:[18:15] ;default: 4'd15 ; */ +/*description: 0 ~ 15 means length 1 ~ 16*/ +#define SYSCON_SARADC_SAR1_PATT_LEN 0x0000000F +#define SYSCON_SARADC_SAR1_PATT_LEN_M ((SYSCON_SARADC_SAR1_PATT_LEN_V)<<(SYSCON_SARADC_SAR1_PATT_LEN_S)) +#define SYSCON_SARADC_SAR1_PATT_LEN_V 0xF +#define SYSCON_SARADC_SAR1_PATT_LEN_S 15 +/* SYSCON_SARADC_SAR_CLK_DIV : R/W ;bitpos:[14:7] ;default: 8'd4 ; */ +/*description: SAR clock divider*/ +#define SYSCON_SARADC_SAR_CLK_DIV 0x000000FF +#define SYSCON_SARADC_SAR_CLK_DIV_M ((SYSCON_SARADC_SAR_CLK_DIV_V)<<(SYSCON_SARADC_SAR_CLK_DIV_S)) +#define SYSCON_SARADC_SAR_CLK_DIV_V 0xFF +#define SYSCON_SARADC_SAR_CLK_DIV_S 7 +/* SYSCON_SARADC_SAR_CLK_GATED : R/W ;bitpos:[6] ;default: 1'b1 ; */ +/*description: */ +#define SYSCON_SARADC_SAR_CLK_GATED (BIT(6)) +#define SYSCON_SARADC_SAR_CLK_GATED_M (BIT(6)) +#define SYSCON_SARADC_SAR_CLK_GATED_V 0x1 +#define SYSCON_SARADC_SAR_CLK_GATED_S 6 +/* SYSCON_SARADC_SAR_SEL : R/W ;bitpos:[5] ;default: 1'd0 ; */ +/*description: 0: SAR1 1: SAR2 only work for single SAR mode*/ +#define SYSCON_SARADC_SAR_SEL (BIT(5)) +#define SYSCON_SARADC_SAR_SEL_M (BIT(5)) +#define SYSCON_SARADC_SAR_SEL_V 0x1 +#define SYSCON_SARADC_SAR_SEL_S 5 +/* SYSCON_SARADC_WORK_MODE : R/W ;bitpos:[4:3] ;default: 2'd0 ; */ +/*description: 0: single mode 1: double mode 2: alternate mode*/ +#define SYSCON_SARADC_WORK_MODE 0x00000003 +#define SYSCON_SARADC_WORK_MODE_M ((SYSCON_SARADC_WORK_MODE_V)<<(SYSCON_SARADC_WORK_MODE_S)) +#define SYSCON_SARADC_WORK_MODE_V 0x3 +#define SYSCON_SARADC_WORK_MODE_S 3 +/* SYSCON_SARADC_SAR2_MUX : R/W ;bitpos:[2] ;default: 1'd0 ; */ +/*description: 1: SAR ADC2 is controlled by DIG ADC2 CTRL 0: SAR ADC2 is controlled + by PWDET CTRL*/ +#define SYSCON_SARADC_SAR2_MUX (BIT(2)) +#define SYSCON_SARADC_SAR2_MUX_M (BIT(2)) +#define SYSCON_SARADC_SAR2_MUX_V 0x1 +#define SYSCON_SARADC_SAR2_MUX_S 2 +/* SYSCON_SARADC_START : R/W ;bitpos:[1] ;default: 1'd0 ; */ +/*description: */ +#define SYSCON_SARADC_START (BIT(1)) +#define SYSCON_SARADC_START_M (BIT(1)) +#define SYSCON_SARADC_START_V 0x1 +#define SYSCON_SARADC_START_S 1 +/* SYSCON_SARADC_START_FORCE : R/W ;bitpos:[0] ;default: 1'd0 ; */ +/*description: */ +#define SYSCON_SARADC_START_FORCE (BIT(0)) +#define SYSCON_SARADC_START_FORCE_M (BIT(0)) +#define SYSCON_SARADC_START_FORCE_V 0x1 +#define SYSCON_SARADC_START_FORCE_S 0 + +#define SYSCON_SARADC_CTRL2_REG (DR_REG_SYSCON_BASE + 0x14) +/* SYSCON_SARADC_SAR2_INV : R/W ;bitpos:[10] ;default: 1'd0 ; */ +/*description: 1: data to DIG ADC2 CTRL is inverted otherwise not*/ +#define SYSCON_SARADC_SAR2_INV (BIT(10)) +#define SYSCON_SARADC_SAR2_INV_M (BIT(10)) +#define SYSCON_SARADC_SAR2_INV_V 0x1 +#define SYSCON_SARADC_SAR2_INV_S 10 +/* SYSCON_SARADC_SAR1_INV : R/W ;bitpos:[9] ;default: 1'd0 ; */ +/*description: 1: data to DIG ADC1 CTRL is inverted otherwise not*/ +#define SYSCON_SARADC_SAR1_INV (BIT(9)) +#define SYSCON_SARADC_SAR1_INV_M (BIT(9)) +#define SYSCON_SARADC_SAR1_INV_V 0x1 +#define SYSCON_SARADC_SAR1_INV_S 9 +/* SYSCON_SARADC_MAX_MEAS_NUM : R/W ;bitpos:[8:1] ;default: 8'd255 ; */ +/*description: max conversion number*/ +#define SYSCON_SARADC_MAX_MEAS_NUM 0x000000FF +#define SYSCON_SARADC_MAX_MEAS_NUM_M ((SYSCON_SARADC_MAX_MEAS_NUM_V)<<(SYSCON_SARADC_MAX_MEAS_NUM_S)) +#define SYSCON_SARADC_MAX_MEAS_NUM_V 0xFF +#define SYSCON_SARADC_MAX_MEAS_NUM_S 1 +/* SYSCON_SARADC_MEAS_NUM_LIMIT : R/W ;bitpos:[0] ;default: 1'd0 ; */ +/*description: */ +#define SYSCON_SARADC_MEAS_NUM_LIMIT (BIT(0)) +#define SYSCON_SARADC_MEAS_NUM_LIMIT_M (BIT(0)) +#define SYSCON_SARADC_MEAS_NUM_LIMIT_V 0x1 +#define SYSCON_SARADC_MEAS_NUM_LIMIT_S 0 + +#define SYSCON_SARADC_FSM_REG (DR_REG_SYSCON_BASE + 0x18) +/* SYSCON_SARADC_SAMPLE_CYCLE : R/W ;bitpos:[31:24] ;default: 8'd2 ; */ +/*description: sample cycles*/ +#define SYSCON_SARADC_SAMPLE_CYCLE 0x000000FF +#define SYSCON_SARADC_SAMPLE_CYCLE_M ((SYSCON_SARADC_SAMPLE_CYCLE_V)<<(SYSCON_SARADC_SAMPLE_CYCLE_S)) +#define SYSCON_SARADC_SAMPLE_CYCLE_V 0xFF +#define SYSCON_SARADC_SAMPLE_CYCLE_S 24 +/* SYSCON_SARADC_START_WAIT : R/W ;bitpos:[23:16] ;default: 8'd8 ; */ +/*description: */ +#define SYSCON_SARADC_START_WAIT 0x000000FF +#define SYSCON_SARADC_START_WAIT_M ((SYSCON_SARADC_START_WAIT_V)<<(SYSCON_SARADC_START_WAIT_S)) +#define SYSCON_SARADC_START_WAIT_V 0xFF +#define SYSCON_SARADC_START_WAIT_S 16 +/* SYSCON_SARADC_STANDBY_WAIT : R/W ;bitpos:[15:8] ;default: 8'd255 ; */ +/*description: */ +#define SYSCON_SARADC_STANDBY_WAIT 0x000000FF +#define SYSCON_SARADC_STANDBY_WAIT_M ((SYSCON_SARADC_STANDBY_WAIT_V)<<(SYSCON_SARADC_STANDBY_WAIT_S)) +#define SYSCON_SARADC_STANDBY_WAIT_V 0xFF +#define SYSCON_SARADC_STANDBY_WAIT_S 8 +/* SYSCON_SARADC_RSTB_WAIT : R/W ;bitpos:[7:0] ;default: 8'd8 ; */ +/*description: */ +#define SYSCON_SARADC_RSTB_WAIT 0x000000FF +#define SYSCON_SARADC_RSTB_WAIT_M ((SYSCON_SARADC_RSTB_WAIT_V)<<(SYSCON_SARADC_RSTB_WAIT_S)) +#define SYSCON_SARADC_RSTB_WAIT_V 0xFF +#define SYSCON_SARADC_RSTB_WAIT_S 0 + +#define SYSCON_SARADC_SAR1_PATT_TAB1_REG (DR_REG_SYSCON_BASE + 0x1C) +/* SYSCON_SARADC_SAR1_PATT_TAB1 : R/W ;bitpos:[31:0] ;default: 32'hf0f0f0f ; */ +/*description: item 0 ~ 3 for pattern table 1 (each item one byte)*/ +#define SYSCON_SARADC_SAR1_PATT_TAB1 0xFFFFFFFF +#define SYSCON_SARADC_SAR1_PATT_TAB1_M ((SYSCON_SARADC_SAR1_PATT_TAB1_V)<<(SYSCON_SARADC_SAR1_PATT_TAB1_S)) +#define SYSCON_SARADC_SAR1_PATT_TAB1_V 0xFFFFFFFF +#define SYSCON_SARADC_SAR1_PATT_TAB1_S 0 + +#define SYSCON_SARADC_SAR1_PATT_TAB2_REG (DR_REG_SYSCON_BASE + 0x20) +/* SYSCON_SARADC_SAR1_PATT_TAB2 : R/W ;bitpos:[31:0] ;default: 32'hf0f0f0f ; */ +/*description: Item 4 ~ 7 for pattern table 1 (each item one byte)*/ +#define SYSCON_SARADC_SAR1_PATT_TAB2 0xFFFFFFFF +#define SYSCON_SARADC_SAR1_PATT_TAB2_M ((SYSCON_SARADC_SAR1_PATT_TAB2_V)<<(SYSCON_SARADC_SAR1_PATT_TAB2_S)) +#define SYSCON_SARADC_SAR1_PATT_TAB2_V 0xFFFFFFFF +#define SYSCON_SARADC_SAR1_PATT_TAB2_S 0 + +#define SYSCON_SARADC_SAR1_PATT_TAB3_REG (DR_REG_SYSCON_BASE + 0x24) +/* SYSCON_SARADC_SAR1_PATT_TAB3 : R/W ;bitpos:[31:0] ;default: 32'hf0f0f0f ; */ +/*description: Item 8 ~ 11 for pattern table 1 (each item one byte)*/ +#define SYSCON_SARADC_SAR1_PATT_TAB3 0xFFFFFFFF +#define SYSCON_SARADC_SAR1_PATT_TAB3_M ((SYSCON_SARADC_SAR1_PATT_TAB3_V)<<(SYSCON_SARADC_SAR1_PATT_TAB3_S)) +#define SYSCON_SARADC_SAR1_PATT_TAB3_V 0xFFFFFFFF +#define SYSCON_SARADC_SAR1_PATT_TAB3_S 0 + +#define SYSCON_SARADC_SAR1_PATT_TAB4_REG (DR_REG_SYSCON_BASE + 0x28) +/* SYSCON_SARADC_SAR1_PATT_TAB4 : R/W ;bitpos:[31:0] ;default: 32'hf0f0f0f ; */ +/*description: Item 12 ~ 15 for pattern table 1 (each item one byte)*/ +#define SYSCON_SARADC_SAR1_PATT_TAB4 0xFFFFFFFF +#define SYSCON_SARADC_SAR1_PATT_TAB4_M ((SYSCON_SARADC_SAR1_PATT_TAB4_V)<<(SYSCON_SARADC_SAR1_PATT_TAB4_S)) +#define SYSCON_SARADC_SAR1_PATT_TAB4_V 0xFFFFFFFF +#define SYSCON_SARADC_SAR1_PATT_TAB4_S 0 + +#define SYSCON_SARADC_SAR2_PATT_TAB1_REG (DR_REG_SYSCON_BASE + 0x2C) +/* SYSCON_SARADC_SAR2_PATT_TAB1 : R/W ;bitpos:[31:0] ;default: 32'hf0f0f0f ; */ +/*description: item 0 ~ 3 for pattern table 2 (each item one byte)*/ +#define SYSCON_SARADC_SAR2_PATT_TAB1 0xFFFFFFFF +#define SYSCON_SARADC_SAR2_PATT_TAB1_M ((SYSCON_SARADC_SAR2_PATT_TAB1_V)<<(SYSCON_SARADC_SAR2_PATT_TAB1_S)) +#define SYSCON_SARADC_SAR2_PATT_TAB1_V 0xFFFFFFFF +#define SYSCON_SARADC_SAR2_PATT_TAB1_S 0 + +#define SYSCON_SARADC_SAR2_PATT_TAB2_REG (DR_REG_SYSCON_BASE + 0x30) +/* SYSCON_SARADC_SAR2_PATT_TAB2 : R/W ;bitpos:[31:0] ;default: 32'hf0f0f0f ; */ +/*description: Item 4 ~ 7 for pattern table 2 (each item one byte)*/ +#define SYSCON_SARADC_SAR2_PATT_TAB2 0xFFFFFFFF +#define SYSCON_SARADC_SAR2_PATT_TAB2_M ((SYSCON_SARADC_SAR2_PATT_TAB2_V)<<(SYSCON_SARADC_SAR2_PATT_TAB2_S)) +#define SYSCON_SARADC_SAR2_PATT_TAB2_V 0xFFFFFFFF +#define SYSCON_SARADC_SAR2_PATT_TAB2_S 0 + +#define SYSCON_SARADC_SAR2_PATT_TAB3_REG (DR_REG_SYSCON_BASE + 0x34) +/* SYSCON_SARADC_SAR2_PATT_TAB3 : R/W ;bitpos:[31:0] ;default: 32'hf0f0f0f ; */ +/*description: Item 8 ~ 11 for pattern table 2 (each item one byte)*/ +#define SYSCON_SARADC_SAR2_PATT_TAB3 0xFFFFFFFF +#define SYSCON_SARADC_SAR2_PATT_TAB3_M ((SYSCON_SARADC_SAR2_PATT_TAB3_V)<<(SYSCON_SARADC_SAR2_PATT_TAB3_S)) +#define SYSCON_SARADC_SAR2_PATT_TAB3_V 0xFFFFFFFF +#define SYSCON_SARADC_SAR2_PATT_TAB3_S 0 + +#define SYSCON_SARADC_SAR2_PATT_TAB4_REG (DR_REG_SYSCON_BASE + 0x38) +/* SYSCON_SARADC_SAR2_PATT_TAB4 : R/W ;bitpos:[31:0] ;default: 32'hf0f0f0f ; */ +/*description: Item 12 ~ 15 for pattern table 2 (each item one byte)*/ +#define SYSCON_SARADC_SAR2_PATT_TAB4 0xFFFFFFFF +#define SYSCON_SARADC_SAR2_PATT_TAB4_M ((SYSCON_SARADC_SAR2_PATT_TAB4_V)<<(SYSCON_SARADC_SAR2_PATT_TAB4_S)) +#define SYSCON_SARADC_SAR2_PATT_TAB4_V 0xFFFFFFFF +#define SYSCON_SARADC_SAR2_PATT_TAB4_S 0 + +#define SYSCON_APLL_TICK_CONF_REG (DR_REG_SYSCON_BASE + 0x3C) +/* SYSCON_APLL_TICK_NUM : R/W ;bitpos:[7:0] ;default: 8'd99 ; */ +/*description: */ +#define SYSCON_APLL_TICK_NUM 0x000000FF +#define SYSCON_APLL_TICK_NUM_M ((SYSCON_APLL_TICK_NUM_V)<<(SYSCON_APLL_TICK_NUM_S)) +#define SYSCON_APLL_TICK_NUM_V 0xFF +#define SYSCON_APLL_TICK_NUM_S 0 + +#define SYSCON_DATE_REG (DR_REG_SYSCON_BASE + 0x7C) +/* SYSCON_DATE : R/W ;bitpos:[31:0] ;default: 32'h16042000 ; */ +/*description: */ +#define SYSCON_DATE 0xFFFFFFFF +#define SYSCON_DATE_M ((SYSCON_DATE_V)<<(SYSCON_DATE_S)) +#define SYSCON_DATE_V 0xFFFFFFFF +#define SYSCON_DATE_S 0 + + + + +#endif /*_SOC_SYSCON_REG_H_ */ + + diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/syscon_struct.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/syscon_struct.h new file mode 100644 index 0000000000000..0266079964429 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/syscon_struct.h @@ -0,0 +1,125 @@ +// 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. +#ifndef _SOC_SYSCON_STRUCT_H_ +#define _SOC_SYSCON_STRUCT_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef volatile struct syscon_dev_s { + union { + struct { + uint32_t pre_div: 10; + uint32_t clk_320m_en: 1; + uint32_t clk_en: 1; + uint32_t rst_tick: 1; + uint32_t quick_clk_chng: 1; + uint32_t reserved14: 18; + }; + uint32_t val; + }clk_conf; + union { + struct { + uint32_t xtal_tick: 8; + uint32_t reserved8: 24; + }; + uint32_t val; + }xtal_tick_conf; + union { + struct { + uint32_t pll_tick: 8; + uint32_t reserved8: 24; + }; + uint32_t val; + }pll_tick_conf; + union { + struct { + uint32_t ck8m_tick: 8; + uint32_t reserved8: 24; + }; + uint32_t val; + }ck8m_tick_conf; + union { + struct { + uint32_t start_force: 1; + uint32_t start: 1; + uint32_t sar2_mux: 1; /*1: SAR ADC2 is controlled by DIG ADC2 CTRL 0: SAR ADC2 is controlled by PWDET CTRL*/ + uint32_t work_mode: 2; /*0: single mode 1: double mode 2: alternate mode*/ + uint32_t sar_sel: 1; /*0: SAR1 1: SAR2 only work for single SAR mode*/ + uint32_t sar_clk_gated: 1; + uint32_t sar_clk_div: 8; /*SAR clock divider*/ + uint32_t sar1_patt_len: 4; /*0 ~ 15 means length 1 ~ 16*/ + uint32_t sar2_patt_len: 4; /*0 ~ 15 means length 1 ~ 16*/ + uint32_t sar1_patt_p_clear: 1; /*clear the pointer of pattern table for DIG ADC1 CTRL*/ + uint32_t sar2_patt_p_clear: 1; /*clear the pointer of pattern table for DIG ADC2 CTRL*/ + uint32_t data_sar_sel: 1; /*1: sar_sel will be coded by the MSB of the 16-bit output data in this case the resolution should not be larger than 11 bits.*/ + uint32_t data_to_i2s: 1; /*1: I2S input data is from SAR ADC (for DMA) 0: I2S input data is from GPIO matrix*/ + uint32_t reserved27: 5; + }; + uint32_t val; + }saradc_ctrl; + union { + struct { + uint32_t meas_num_limit: 1; + uint32_t max_meas_num: 8; /*max conversion number*/ + uint32_t sar1_inv: 1; /*1: data to DIG ADC1 CTRL is inverted otherwise not*/ + uint32_t sar2_inv: 1; /*1: data to DIG ADC2 CTRL is inverted otherwise not*/ + uint32_t reserved11: 21; + }; + uint32_t val; + }saradc_ctrl2; + union { + struct { + uint32_t rstb_wait: 8; + uint32_t standby_wait: 8; + uint32_t start_wait: 8; + uint32_t sample_cycle: 8; /*sample cycles*/ + }; + uint32_t val; + }saradc_fsm; + uint32_t saradc_sar1_patt_tab[4]; /*item 0 ~ 3 for ADC1 pattern table*/ + uint32_t saradc_sar2_patt_tab[4]; /*item 0 ~ 3 for ADC2 pattern table*/ + union { + struct { + uint32_t apll_tick: 8; + uint32_t reserved8: 24; + }; + uint32_t val; + }apll_tick_conf; + 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; + 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 date; /**/ +} syscon_dev_t; + +#ifdef __cplusplus +} +#endif +extern syscon_dev_t SYSCON; +#endif /* _SOC_SYSCON_STRUCT_H_ */ diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/timer_group_caps.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/timer_group_caps.h new file mode 100644 index 0000000000000..e15269aaee2af --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/timer_group_caps.h @@ -0,0 +1,15 @@ +// 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. + +#pragma once diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/timer_group_reg.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/timer_group_reg.h new file mode 100644 index 0000000000000..2db2a7e3f1b51 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/timer_group_reg.h @@ -0,0 +1,668 @@ +// 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. +#ifndef __TIMG_REG_H__ +#define __TIMG_REG_H__ +#include "soc.h" + +/* The value that needs to be written to TIMG_WDT_WKEY to write-enable the wdt registers */ +#define TIMG_WDT_WKEY_VALUE 0x50D83AA1 + +/* 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 + + +#define REG_TIMG_BASE(i) (DR_REG_TIMERGROUP0_BASE + i*0x1000) +#define TIMG_T0CONFIG_REG(i) (REG_TIMG_BASE(i) + 0x0000) +/* TIMG_T0_EN : R/W ;bitpos:[31] ;default: 1'h0 ; */ +/*description: When set timer 0 time-base counter is enabled*/ +#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: When set timer 0 time-base counter increment. When cleared timer + 0 time-base counter decrement.*/ +#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: When set timer 0 auto-reload at alarming is enabled*/ +#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: Timer 0 clock (T0_clk) prescale value.*/ +#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: When set edge type interrupt will be generated during alarm*/ +#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: When set level type interrupt will be generated during alarm*/ +#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: When set alarm is enabled*/ +#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 + +#define TIMG_T0LO_REG(i) (REG_TIMG_BASE(i) + 0x0004) +/* TIMG_T0_LO : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: Register to store timer 0 time-base counter current value lower 32 bits.*/ +#define TIMG_T0_LO 0xFFFFFFFF +#define TIMG_T0_LO_M ((TIMG_T0_LO_V)<<(TIMG_T0_LO_S)) +#define TIMG_T0_LO_V 0xFFFFFFFF +#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: Register to store timer 0 time-base counter current value higher 32 bits.*/ +#define TIMG_T0_HI 0xFFFFFFFF +#define TIMG_T0_HI_M ((TIMG_T0_HI_V)<<(TIMG_T0_HI_S)) +#define TIMG_T0_HI_V 0xFFFFFFFF +#define TIMG_T0_HI_S 0 + +#define TIMG_T0UPDATE_REG(i) (REG_TIMG_BASE(i) + 0x000c) +/* TIMG_T0_UPDATE : WO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: Write any value will trigger a timer 0 time-base counter value + update (timer 0 current value will be stored in registers above)*/ +#define TIMG_T0_UPDATE 0xFFFFFFFF +#define TIMG_T0_UPDATE_M ((TIMG_T0_UPDATE_V)<<(TIMG_T0_UPDATE_S)) +#define TIMG_T0_UPDATE_V 0xFFFFFFFF +#define TIMG_T0_UPDATE_S 0 + +#define TIMG_T0ALARMLO_REG(i) (REG_TIMG_BASE(i) + 0x0010) +/* TIMG_T0_ALARM_LO : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: Timer 0 time-base counter value lower 32 bits that will trigger the alarm*/ +#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 +#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: Timer 0 time-base counter value higher 32 bits that will trigger the alarm*/ +#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 +#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: Lower 32 bits of the value that will load into timer 0 time-base counter*/ +#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 +#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: higher 32 bits of the value that will load into timer 0 time-base counter*/ +#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 +#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: Write any value will trigger timer 0 time-base counter reload*/ +#define TIMG_T0_LOAD 0xFFFFFFFF +#define TIMG_T0_LOAD_M ((TIMG_T0_LOAD_V)<<(TIMG_T0_LOAD_S)) +#define TIMG_T0_LOAD_V 0xFFFFFFFF +#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: When set timer 1 time-base counter is enabled*/ +#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: When set timer 1 time-base counter increment. When cleared timer + 1 time-base counter decrement.*/ +#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: When set timer 1 auto-reload at alarming is enabled*/ +#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: Timer 1 clock (T1_clk) prescale value.*/ +#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: When set edge type interrupt will be generated during alarm*/ +#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: When set level type interrupt will be generated during alarm*/ +#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: When set alarm is enabled*/ +#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 + +#define TIMG_T1LO_REG(i) (REG_TIMG_BASE(i) + 0x0028) +/* TIMG_T1_LO : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: Register to store timer 1 time-base counter current value lower 32 bits.*/ +#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 + +#define TIMG_T1HI_REG(i) (REG_TIMG_BASE(i) + 0x002c) +/* TIMG_T1_HI : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: Register to store timer 1 time-base counter current value higher 32 bits.*/ +#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 + +#define TIMG_T1UPDATE_REG(i) (REG_TIMG_BASE(i) + 0x0030) +/* TIMG_T1_UPDATE : WO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: Write any value will trigger a timer 1 time-base counter value + update (timer 1 current value will be stored in registers above)*/ +#define TIMG_T1_UPDATE 0xFFFFFFFF +#define TIMG_T1_UPDATE_M ((TIMG_T1_UPDATE_V)<<(TIMG_T1_UPDATE_S)) +#define TIMG_T1_UPDATE_V 0xFFFFFFFF +#define TIMG_T1_UPDATE_S 0 + +#define TIMG_T1ALARMLO_REG(i) (REG_TIMG_BASE(i) + 0x0034) +/* TIMG_T1_ALARM_LO : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: Timer 1 time-base counter value lower 32 bits that will trigger the alarm*/ +#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 + +#define TIMG_T1ALARMHI_REG(i) (REG_TIMG_BASE(i) + 0x0038) +/* TIMG_T1_ALARM_HI : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: Timer 1 time-base counter value higher 32 bits that will trigger the alarm*/ +#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 + +#define TIMG_T1LOADLO_REG(i) (REG_TIMG_BASE(i) + 0x003c) +/* TIMG_T1_LOAD_LO : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: Lower 32 bits of the value that will load into timer 1 time-base counter*/ +#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 + +#define TIMG_T1LOADHI_REG(i) (REG_TIMG_BASE(i) + 0x0040) +/* TIMG_T1_LOAD_HI : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: higher 32 bits of the value that will load into timer 1 time-base counter*/ +#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 + +#define TIMG_T1LOAD_REG(i) (REG_TIMG_BASE(i) + 0x0044) +/* TIMG_T1_LOAD : WO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: Write any value will trigger timer 1 time-base counter reload*/ +#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 + +#define TIMG_WDTCONFIG0_REG(i) (REG_TIMG_BASE(i) + 0x0048) +/* TIMG_WDT_EN : R/W ;bitpos:[31] ;default: 1'h0 ; */ +/*description: When set SWDT is enabled*/ +#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: Stage 0 configuration. 0: off 1: interrupt 2: reset CPU 3: reset system*/ +#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: Stage 1 configuration. 0: off 1: interrupt 2: reset CPU 3: reset system*/ +#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: Stage 2 configuration. 0: off 1: interrupt 2: reset CPU 3: reset system*/ +#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: Stage 3 configuration. 0: off 1: interrupt 2: reset CPU 3: reset system*/ +#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: When set edge type interrupt generation is enabled*/ +#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: When set level type interrupt generation is enabled*/ +#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: length of CPU reset selection. 0: 100ns 1: 200ns 2: 300ns + 3: 400ns 4: 500ns 5: 800ns 6: 1.6us 7: 3.2us*/ +#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: length of system reset selection. 0: 100ns 1: 200ns 2: 300ns + 3: 400ns 4: 500ns 5: 800ns 6: 1.6us 7: 3.2us*/ +#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: When set flash boot protection is enabled*/ +#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 + +#define TIMG_WDTCONFIG1_REG(i) (REG_TIMG_BASE(i) + 0x004c) +/* TIMG_WDT_CLK_PRESCALE : R/W ;bitpos:[31:16] ;default: 16'h1 ; */ +/*description: SWDT clock prescale value. Period = 12.5ns * value stored in this register*/ +#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 + +#define TIMG_WDTCONFIG2_REG(i) (REG_TIMG_BASE(i) + 0x0050) +/* TIMG_WDT_STG0_HOLD : R/W ;bitpos:[31:0] ;default: 32'd26000000 ; */ +/*description: Stage 0 timeout value in SWDT clock cycles*/ +#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 +#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: Stage 1 timeout value in SWDT clock cycles*/ +#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 +#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: Stage 2 timeout value in SWDT clock cycles*/ +#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 +#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: Stage 3 timeout value in SWDT clock cycles*/ +#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 +#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: Write any value will feed SWDT*/ +#define TIMG_WDT_FEED 0xFFFFFFFF +#define TIMG_WDT_FEED_M ((TIMG_WDT_FEED_V)<<(TIMG_WDT_FEED_S)) +#define TIMG_WDT_FEED_V 0xFFFFFFFF +#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: If change its value from default then write protection is on.*/ +#define TIMG_WDT_WKEY 0xFFFFFFFF +#define TIMG_WDT_WKEY_M ((TIMG_WDT_WKEY_V)<<(TIMG_WDT_WKEY_S)) +#define TIMG_WDT_WKEY_V 0xFFFFFFFF +#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 +#define TIMG_RTC_CALI_START_CYCLING_S 12 + +#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 + +#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 + +#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 +#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 +#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 +#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 +#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 +#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 +#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 +#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 +#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 +#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: Interrupt when an interrupt stage timeout*/ +#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: interrupt when timer1 alarm*/ +#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: interrupt when timer0 alarm*/ +#define TIMG_T0_INT_ENA (BIT(0)) +#define TIMG_T0_INT_ENA_M (BIT(0)) +#define TIMG_T0_INT_ENA_V 0x1 +#define TIMG_T0_INT_ENA_S 0 + +#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: Interrupt when an interrupt stage timeout*/ +#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: interrupt when timer1 alarm*/ +#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: interrupt when timer0 alarm*/ +#define TIMG_T0_INT_RAW (BIT(0)) +#define TIMG_T0_INT_RAW_M (BIT(0)) +#define TIMG_T0_INT_RAW_V 0x1 +#define TIMG_T0_INT_RAW_S 0 + +#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: Interrupt when an interrupt stage timeout*/ +#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: interrupt when timer1 alarm*/ +#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: interrupt when timer0 alarm*/ +#define TIMG_T0_INT_ST (BIT(0)) +#define TIMG_T0_INT_ST_M (BIT(0)) +#define TIMG_T0_INT_ST_V 0x1 +#define TIMG_T0_INT_ST_S 0 + +#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: Interrupt when an interrupt stage timeout*/ +#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: interrupt when timer1 alarm*/ +#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: interrupt when timer0 alarm*/ +#define TIMG_T0_INT_CLR (BIT(0)) +#define TIMG_T0_INT_CLR_M (BIT(0)) +#define TIMG_T0_INT_CLR_V 0x1 +#define TIMG_T0_INT_CLR_S 0 + +#define TIMG_NTIMERS_DATE_REG(i) (REG_TIMG_BASE(i) + 0x00f8) +/* TIMG_NTIMERS_DATE : R/W ;bitpos:[27:0] ;default: 28'h1604290 ; */ +/*description: Version of this regfile*/ +#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 + +#define TIMGCLK_REG(i) (REG_TIMG_BASE(i) + 0x00fc) +/* TIMG_CLK_EN : R/W ;bitpos:[31] ;default: 1'h0 ; */ +/*description: Force clock enable for this regfile*/ +#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 + + + + +#endif /*__TIMG_REG_H__ */ + + diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/timer_group_struct.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/timer_group_struct.h new file mode 100644 index 0000000000000..4ea1abe75d4bb --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/timer_group_struct.h @@ -0,0 +1,207 @@ +// 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. +#ifndef _SOC_TIMG_STRUCT_H_ +#define _SOC_TIMG_STRUCT_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef volatile struct timg_dev_s { + struct{ + union { + struct { + uint32_t reserved0: 10; + uint32_t alarm_en: 1; /*When set alarm is enabled*/ + uint32_t level_int_en: 1; /*When set level type interrupt will be generated during alarm*/ + uint32_t edge_int_en: 1; /*When set edge type interrupt will be generated during alarm*/ + uint32_t divider: 16; /*Timer clock (T0/1_clk) pre-scale value.*/ + uint32_t autoreload: 1; /*When set timer 0/1 auto-reload at alarming is enabled*/ + uint32_t increase: 1; /*When set timer 0/1 time-base counter increment. When cleared timer 0 time-base counter decrement.*/ + uint32_t enable: 1; /*When set timer 0/1 time-base counter is enabled*/ + }; + uint32_t val; + } config; + uint32_t cnt_low; /*Register to store timer 0/1 time-base counter current value lower 32 bits.*/ + uint32_t cnt_high; /*Register to store timer 0 time-base counter current value higher 32 bits.*/ + uint32_t update; /*Write any value will trigger a timer 0 time-base counter value update (timer 0 current value will be stored in registers above)*/ + uint32_t alarm_low; /*Timer 0 time-base counter value lower 32 bits that will trigger the alarm*/ + uint32_t alarm_high; /*Timer 0 time-base counter value higher 32 bits that will trigger the alarm*/ + uint32_t load_low; /*Lower 32 bits of the value that will load into timer 0 time-base counter*/ + uint32_t load_high; /*higher 32 bits of the value that will load into timer 0 time-base counter*/ + uint32_t reload; /*Write any value will trigger timer 0 time-base counter reload*/ + } hw_timer[2]; + union { + struct { + uint32_t reserved0: 14; + uint32_t flashboot_mod_en: 1; /*When set flash boot protection is enabled*/ + uint32_t sys_reset_length: 3; /*length of system reset selection. 0: 100ns 1: 200ns 2: 300ns 3: 400ns 4: 500ns 5: 800ns 6: 1.6us 7: 3.2us*/ + uint32_t cpu_reset_length: 3; /*length of CPU reset selection. 0: 100ns 1: 200ns 2: 300ns 3: 400ns 4: 500ns 5: 800ns 6: 1.6us 7: 3.2us*/ + uint32_t level_int_en: 1; /*When set level type interrupt generation is enabled*/ + uint32_t edge_int_en: 1; /*When set edge type interrupt generation is enabled*/ + uint32_t stg3: 2; /*Stage 3 configuration. 0: off 1: interrupt 2: reset CPU 3: reset system*/ + uint32_t stg2: 2; /*Stage 2 configuration. 0: off 1: interrupt 2: reset CPU 3: reset system*/ + uint32_t stg1: 2; /*Stage 1 configuration. 0: off 1: interrupt 2: reset CPU 3: reset system*/ + uint32_t stg0: 2; /*Stage 0 configuration. 0: off 1: interrupt 2: reset CPU 3: reset system*/ + uint32_t en: 1; /*When set SWDT is enabled*/ + }; + uint32_t val; + } wdt_config0; + union { + struct { + uint32_t reserved0: 16; + uint32_t clk_prescale:16; /*SWDT clock prescale value. Period = 12.5ns * value stored in this register*/ + }; + uint32_t val; + } wdt_config1; + uint32_t wdt_config2; /*Stage 0 timeout value in SWDT clock cycles*/ + uint32_t wdt_config3; /*Stage 1 timeout value in SWDT clock cycles*/ + uint32_t wdt_config4; /*Stage 2 timeout value in SWDT clock cycles*/ + uint32_t wdt_config5; /*Stage 3 timeout value in SWDT clock cycles*/ + uint32_t wdt_feed; /*Write any value will feed SWDT*/ + uint32_t wdt_wprotect; /*If change its value from default then write protection is on.*/ + 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 reserved0: 7; + uint32_t value:25; + }; + uint32_t val; + } rtc_cali_cfg1; + union { + struct { + uint32_t reserved0: 7; + 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; /*interrupt when timer0 alarm*/ + uint32_t t1: 1; /*interrupt when timer1 alarm*/ + uint32_t wdt: 1; /*Interrupt when an interrupt stage timeout*/ + uint32_t lact: 1; + uint32_t reserved4: 28; + }; + uint32_t val; + } int_ena; + union { + struct { + uint32_t t0: 1; /*interrupt when timer0 alarm*/ + uint32_t t1: 1; /*interrupt when timer1 alarm*/ + uint32_t wdt: 1; /*Interrupt when an interrupt stage timeout*/ + uint32_t lact: 1; + uint32_t reserved4:28; + }; + uint32_t val; + } int_raw; + union { + struct { + uint32_t t0: 1; /*interrupt when timer0 alarm*/ + uint32_t t1: 1; /*interrupt when timer1 alarm*/ + uint32_t wdt: 1; /*Interrupt when an interrupt stage timeout*/ + uint32_t lact: 1; + uint32_t reserved4: 28; + }; + uint32_t val; + } int_st_timers; + union { + struct { + uint32_t t0: 1; /*interrupt when timer0 alarm*/ + uint32_t t1: 1; /*interrupt when timer1 alarm*/ + uint32_t wdt: 1; /*Interrupt when an interrupt stage timeout*/ + uint32_t lact: 1; + uint32_t reserved4: 28; + }; + uint32_t val; + } int_clr_timers; + 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; /*Version of this regfile*/ + uint32_t reserved28: 4; + }; + uint32_t val; + } timg_date; + union { + struct { + uint32_t reserved0: 31; + uint32_t en: 1; /*Force clock enable for this regfile*/ + }; + uint32_t val; + } clk; +} timg_dev_t; +extern timg_dev_t TIMERG0; +extern timg_dev_t TIMERG1; + +#ifdef __cplusplus +} +#endif + +#endif /* _SOC_TIMG_STRUCT_H_ */ diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/touch_sensor_caps.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/touch_sensor_caps.h new file mode 100644 index 0000000000000..bdf868d573ee7 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/touch_sensor_caps.h @@ -0,0 +1,29 @@ +// 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 + +#ifdef __cplusplus +extern "C" { +#endif + +#define SOC_TOUCH_SENSOR_NUM (10) +#define SOC_TOUCH_SENSOR_BIT_MASK_MAX (0x3ff) + +#define SOC_TOUCH_PAD_MEASURE_WAIT (0xFF) /*! 1 ? 0xe000 : 0 ) ) +#define REG_UART_AHB_BASE(i) (0x60000000 + (i) * 0x10000 + ( (i) > 1 ? 0xe000 : 0 ) ) +#define UART_FIFO_AHB_REG(i) (REG_UART_AHB_BASE(i) + 0x0) +#define UART_FIFO_REG(i) (REG_UART_BASE(i) + 0x0) + +/* UART_RXFIFO_RD_BYTE : RO ;bitpos:[7:0] ;default: 8'b0 ; */ +/*description: This register stores one byte data read by rx fifo.*/ +#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 +#define UART_RXFIFO_RD_BYTE_S 0 + +#define UART_INT_RAW_REG(i) (REG_UART_BASE(i) + 0x4) +/* UART_AT_CMD_CHAR_DET_INT_RAW : RO ;bitpos:[18] ;default: 1'b0 ; */ +/*description: This interrupt raw bit turns to high level when receiver detects + the configured at_cmd chars.*/ +#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 : RO ;bitpos:[17] ;default: 1'b0 ; */ +/*description: This interrupt raw bit turns to high level when rs485 detects + the clash between transmitter and receiver.*/ +#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 : RO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: This interrupt raw bit turns to high level when rs485 detects + the data frame error.*/ +#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 : RO ;bitpos:[15] ;default: 1'b0 ; */ +/*description: This interrupt raw bit turns to high level when rs485 detects the parity error.*/ +#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 : RO ;bitpos:[14] ;default: 1'b0 ; */ +/*description: This interrupt raw bit turns to high level when transmitter has + send all the data 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 : RO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: This interrupt raw bit turns to high level when transmitter has + kept the shortest duration after the last data has been send.*/ +#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 : RO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: This interrupt raw bit turns to high level when transmitter completes + sendding 0 after all the datas in transmitter's fifo are send.*/ +#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 : RO ;bitpos:[11] ;default: 1'b0 ; */ +/*description: This interrupt raw bit turns to high level when receiver detects the 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 : RO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: This interrupt raw bit turns to high level when receiver receives + xon char with 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 : RO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: This interrupt raw bit turns to high level when receiver receives + xoff char with 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 : RO ;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 : RO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: This interrupt raw bit turns to high level when receiver detects + the 0 after the stop 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 : RO ;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 : RO ;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 : RO ;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 : RO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: This interrupt raw bit turns to high level when receiver detects + data's frame error .*/ +#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 : RO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: This interrupt raw bit turns to high level when receiver detects + the parity error of 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 : RO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: This interrupt raw bit turns to high level when the amount of + data in transmitter's fifo is less than ((tx_mem_cnttxfifo_cnt) .*/ +#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 : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: This interrupt raw bit turns to high level when receiver receives + more data than (rx_flow_thrhd_h3 rx_flow_thrhd).*/ +#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_S 0 + +#define UART_INT_ST_REG(i) (REG_UART_BASE(i) + 0x8) +/* 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 set 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 to 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_fm_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 (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_ena + 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 to 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 to 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 fm_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 set 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 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_S 0 + +#define UART_INT_ENA_REG(i) (REG_UART_BASE(i) + 0xC) +/* 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 rxfifo_full_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.*/ +#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_S 0 + +#define UART_INT_CLR_REG(i) (REG_UART_BASE(i) + 0x10) +/* UART_AT_CMD_CHAR_DET_INT_CLR : WO ;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 : WO ;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 : WO ;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 : WO ;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 : WO ;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 : WO ;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 : WO ;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 : WO ;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 : WO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: Set this bit to clear the sw_xon_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 : WO ;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 : WO ;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 : WO ;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 : WO ;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 : WO ;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 : WO ;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 : WO ;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 : WO ;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 : WO ;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 : WO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: 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_S 0 + +#define UART_CLKDIV_REG(i) (REG_UART_BASE(i) + 0x14) +/* UART_CLKDIV_FRAG : R/W ;bitpos:[23:20] ;default: 4'h0 ; */ +/*description: The register value is the decimal part of the frequency divider's 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:[19:0] ;default: 20'h2B6 ; */ +/*description: The register value is the integer part of the frequency divider's factor.*/ +#define UART_CLKDIV 0x000FFFFF +#define UART_CLKDIV_M ((UART_CLKDIV_V)<<(UART_CLKDIV_S)) +#define UART_CLKDIV_V 0xFFFFF +#define UART_CLKDIV_S 0 + +#define UART_AUTOBAUD_REG(i) (REG_UART_BASE(i) + 0x18) +/* UART_GLITCH_FILT : R/W ;bitpos:[15:8] ;default: 8'h10 ; */ +/*description: when input pulse width is lower then this value igore this pulse.this + register is used in autobaud detect process.*/ +#define UART_GLITCH_FILT 0x000000FF +#define UART_GLITCH_FILT_M ((UART_GLITCH_FILT_V)<<(UART_GLITCH_FILT_S)) +#define UART_GLITCH_FILT_V 0xFF +#define UART_GLITCH_FILT_S 8 +/* UART_AUTOBAUD_EN : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: This is the enable bit for detecting baudrate.*/ +#define UART_AUTOBAUD_EN (BIT(0)) +#define UART_AUTOBAUD_EN_M (BIT(0)) +#define UART_AUTOBAUD_EN_V 0x1 +#define UART_AUTOBAUD_EN_S 0 + +#define UART_STATUS_REG(i) (REG_UART_BASE(i) + 0x1C) +/* UART_TXD : RO ;bitpos:[31] ;default: 8'h0 ; */ +/*description: This register represent the level value of the internal uart rxd 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'b0 ; */ +/*description: This register represent the level value of the internal uart cts 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'b0 ; */ +/*description: The register represent the level value of the internal uart dsr signal.*/ +#define UART_DTRN (BIT(29)) +#define UART_DTRN_M (BIT(29)) +#define UART_DTRN_V 0x1 +#define UART_DTRN_S 29 +/* UART_ST_UTX_OUT : RO ;bitpos:[27:24] ;default: 4'b0 ; */ +/*description: This register stores the value of transmitter's finite state + machine. 0:TX_IDLE 1:TX_STRT 2:TX_DAT0 3:TX_DAT1 4:TX_DAT2 5:TX_DAT3 6:TX_DAT4 7:TX_DAT5 8:TX_DAT6 9:TX_DAT7 10:TX_PRTY 11:TX_STP1 12:TX_STP2 13:TX_DL0 14:TX_DL1*/ +#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 24 +/* UART_TXFIFO_CNT : RO ;bitpos:[23:16] ;default: 8'b0 ; */ +/*description: (tx_mem_cnt txfifo_cnt) stores the byte num of valid datas in + transmitter's fifo.tx_mem_cnt stores the 3 most significant bits txfifo_cnt stores the 8 least significant bits.*/ +#define UART_TXFIFO_CNT 0x000000FF +#define UART_TXFIFO_CNT_M ((UART_TXFIFO_CNT_V)<<(UART_TXFIFO_CNT_S)) +#define UART_TXFIFO_CNT_V 0xFF +#define UART_TXFIFO_CNT_S 16 +/* UART_RXD : RO ;bitpos:[15] ;default: 1'b0 ; */ +/*description: This register stores 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'b0 ; */ +/*description: This register stores 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: This register stores 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_ST_URX_OUT : RO ;bitpos:[11:8] ;default: 4'b0 ; */ +/*description: This register stores the value of receiver's finite state machine. + 0:RX_IDLE 1:RX_STRT 2:RX_DAT0 3:RX_DAT1 4:RX_DAT2 5:RX_DAT3 6:RX_DAT4 7:RX_DAT5 8:RX_DAT6 9:RX_DAT7 10:RX_PRTY 11:RX_STP1 12:RX_STP2 13:RX_DL1*/ +#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 +#define UART_ST_URX_OUT_S 8 +/* UART_RXFIFO_CNT : RO ;bitpos:[7:0] ;default: 8'b0 ; */ +/*description: (rx_mem_cnt rxfifo_cnt) stores the byte num of valid datas in + receiver's fifo. rx_mem_cnt register stores the 3 most significant bits rxfifo_cnt stores the 8 least significant bits.*/ +#define UART_RXFIFO_CNT 0x000000FF +#define UART_RXFIFO_CNT_M ((UART_RXFIFO_CNT_V)<<(UART_RXFIFO_CNT_S)) +#define UART_RXFIFO_CNT_V 0xFF +#define UART_RXFIFO_CNT_S 0 + +#define UART_CONF0_REG(i) (REG_UART_BASE(i) + 0x20) +/* UART_TICK_REF_ALWAYS_ON : R/W ;bitpos:[27] ;default: 1'b1 ; */ +/*description: This register is used to select the clock.1.apb clock 0:ref_tick*/ +#define UART_TICK_REF_ALWAYS_ON (BIT(27)) +#define UART_TICK_REF_ALWAYS_ON_M (BIT(27)) +#define UART_TICK_REF_ALWAYS_ON_V 0x1 +#define UART_TICK_REF_ALWAYS_ON_S 27 +/* UART_ERR_WR_MASK : R/W ;bitpos:[26] ;default: 1'b0 ; */ +/*description: 1.receiver stops storing data int fifo when data is wrong. + 0.receiver stores 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.force clock on for registers.support clock only when write 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 uart transmitter's 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 uart receiver's 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 transmitter's flow control function.*/ +#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 inverse the level value of irda receiver's level.*/ +#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 inverse the level value of irda transmitter's level.*/ +#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.the irda transmitter's 11th bit is the same to the 10th bit. + 0.set irda transmitter'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 0 when the process + of sending data 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 software 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 software 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. 1:1bit 2:1.5bits 3:2bits*/ +#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 registe is used to set the length of data: 0:5bits 1:6bits 2:7bits 3:8bits*/ +#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. 0:even 1:odd*/ +#define UART_PARITY (BIT(0)) +#define UART_PARITY_M (BIT(0)) +#define UART_PARITY_V 0x1 +#define UART_PARITY_S 0 + +#define UART_CONF1_REG(i) (REG_UART_BASE(i) + 0x24) +/* UART_RX_TOUT_EN : R/W ;bitpos:[31] ;default: 1'b0 ; */ +/*description: This is the enble bit for uart receiver's timeout function.*/ +#define UART_RX_TOUT_EN (BIT(31)) +#define UART_RX_TOUT_EN_M (BIT(31)) +#define UART_RX_TOUT_EN_V 0x1 +#define UART_RX_TOUT_EN_S 31 +/* UART_RX_TOUT_THRHD : R/W ;bitpos:[30:24] ;default: 7'b0 ; */ +/*description: This register is used to configure the timeout value for uart + receiver receiving a byte.*/ +#define UART_RX_TOUT_THRHD 0x0000007F +#define UART_RX_TOUT_THRHD_M ((UART_RX_TOUT_THRHD_V)<<(UART_RX_TOUT_THRHD_S)) +#define UART_RX_TOUT_THRHD_V 0x7F +#define UART_RX_TOUT_THRHD_S 24 +/* UART_RX_FLOW_EN : R/W ;bitpos:[23] ;default: 1'b0 ; */ +/*description: This is the flow enable bit for uart receiver. 1:choose software + flow control with configuring sw_rts signal*/ +#define UART_RX_FLOW_EN (BIT(23)) +#define UART_RX_FLOW_EN_M (BIT(23)) +#define UART_RX_FLOW_EN_V 0x1 +#define UART_RX_FLOW_EN_S 23 +/* UART_RX_FLOW_THRHD : R/W ;bitpos:[22:16] ;default: 7'h0 ; */ +/*description: when receiver receives more data than its threshold value. + receiver produce signal to tell the transmitter stop transferring data. the threshold value is (rx_flow_thrhd_h3 rx_flow_thrhd).*/ +#define UART_RX_FLOW_THRHD 0x0000007F +#define UART_RX_FLOW_THRHD_M ((UART_RX_FLOW_THRHD_V)<<(UART_RX_FLOW_THRHD_S)) +#define UART_RX_FLOW_THRHD_V 0x7F +#define UART_RX_FLOW_THRHD_S 16 +/* UART_TXFIFO_EMPTY_THRHD : R/W ;bitpos:[14:8] ;default: 7'h60 ; */ +/*description: when the data amount in transmitter fifo is less than its threshold + value. it will produce txfifo_empty_int_raw interrupt. the threshold value is (tx_mem_empty_thrhd txfifo_empty_thrhd)*/ +#define UART_TXFIFO_EMPTY_THRHD 0x0000007F +#define UART_TXFIFO_EMPTY_THRHD_M ((UART_TXFIFO_EMPTY_THRHD_V)<<(UART_TXFIFO_EMPTY_THRHD_S)) +#define UART_TXFIFO_EMPTY_THRHD_V 0x7F +#define UART_TXFIFO_EMPTY_THRHD_S 8 +/* UART_RXFIFO_FULL_THRHD : R/W ;bitpos:[6:0] ;default: 7'h60 ; */ +/*description: When receiver receives more data than its threshold value.receiver + will produce rxfifo_full_int_raw interrupt.the threshold value is (rx_flow_thrhd_h3 rxfifo_full_thrhd).*/ +#define UART_RXFIFO_FULL_THRHD 0x0000007F +#define UART_RXFIFO_FULL_THRHD_M ((UART_RXFIFO_FULL_THRHD_V)<<(UART_RXFIFO_FULL_THRHD_S)) +#define UART_RXFIFO_FULL_THRHD_V 0x7F +#define UART_RXFIFO_FULL_THRHD_S 0 + +#define UART_LOWPULSE_REG(i) (REG_UART_BASE(i) + 0x28) +/* UART_LOWPULSE_MIN_CNT : RO ;bitpos:[19:0] ;default: 20'hFFFFF ; */ +/*description: This register stores the value of the minimum duration time for + the low level pulse. it is used in baudrate-detect process.*/ +#define UART_LOWPULSE_MIN_CNT 0x000FFFFF +#define UART_LOWPULSE_MIN_CNT_M ((UART_LOWPULSE_MIN_CNT_V)<<(UART_LOWPULSE_MIN_CNT_S)) +#define UART_LOWPULSE_MIN_CNT_V 0xFFFFF +#define UART_LOWPULSE_MIN_CNT_S 0 + +#define UART_HIGHPULSE_REG(i) (REG_UART_BASE(i) + 0x2C) +/* UART_HIGHPULSE_MIN_CNT : RO ;bitpos:[19:0] ;default: 20'hFFFFF ; */ +/*description: This register stores the value of the maxinum duration time + for the high level pulse. it is used in baudrate-detect process.*/ +#define UART_HIGHPULSE_MIN_CNT 0x000FFFFF +#define UART_HIGHPULSE_MIN_CNT_M ((UART_HIGHPULSE_MIN_CNT_V)<<(UART_HIGHPULSE_MIN_CNT_S)) +#define UART_HIGHPULSE_MIN_CNT_V 0xFFFFF +#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 baudrate-detect 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 +#define UART_RXD_EDGE_CNT_S 0 + +#define UART_FLOW_CONF_REG(i) (REG_UART_BASE(i) + 0x34) +/* UART_SEND_XOFF : R/W ;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 ;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 set ctsn to enable the transmitter to go on 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 clear ctsn to stop the transmitter from 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 .*/ +#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_S 0 + +#define UART_SLEEP_CONF_REG(i) (REG_UART_BASE(i) + 0x38) +/* UART_ACTIVE_THRESHOLD : R/W ;bitpos:[9:0] ;default: 10'hf0 ; */ +/*description: When the input rxd edge changes more than this register value. + the uart is active from light sleeping mode.*/ +#define UART_ACTIVE_THRESHOLD 0x000003FF +#define UART_ACTIVE_THRESHOLD_M ((UART_ACTIVE_THRESHOLD_V)<<(UART_ACTIVE_THRESHOLD_S)) +#define UART_ACTIVE_THRESHOLD_V 0x3FF +#define UART_ACTIVE_THRESHOLD_S 0 + +#define UART_SWFC_CONF_REG(i) (REG_UART_BASE(i) + 0x3C) +/* UART_XOFF_CHAR : R/W ;bitpos:[31:24] ;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 24 +/* UART_XON_CHAR : R/W ;bitpos:[23:16] ;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 16 +/* UART_XOFF_THRESHOLD : R/W ;bitpos:[15:8] ;default: 8'he0 ; */ +/*description: When the data amount in receiver's fifo is less than this register + value. it will send a xon char with uart_sw_flow_con_en set to 1.*/ +#define UART_XOFF_THRESHOLD 0x000000FF +#define UART_XOFF_THRESHOLD_M ((UART_XOFF_THRESHOLD_V)<<(UART_XOFF_THRESHOLD_S)) +#define UART_XOFF_THRESHOLD_V 0xFF +#define UART_XOFF_THRESHOLD_S 8 +/* UART_XON_THRESHOLD : R/W ;bitpos:[7:0] ;default: 8'h0 ; */ +/*description: when the data amount in receiver's fifo is more than this register + value. it will send a xoff char with uart_sw_flow_con_en set to 1.*/ +#define UART_XON_THRESHOLD 0x000000FF +#define UART_XON_THRESHOLD_M ((UART_XON_THRESHOLD_V)<<(UART_XON_THRESHOLD_S)) +#define UART_XON_THRESHOLD_V 0xFF +#define UART_XON_THRESHOLD_S 0 + +#define UART_IDLE_CONF_REG(i) (REG_UART_BASE(i) + 0x40) +/* UART_TX_BRK_NUM : R/W ;bitpos:[27:20] ;default: 8'ha ; */ +/*description: This register is used to configure the num of 0 send 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 +#define UART_TX_BRK_NUM_S 20 +/* 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: when receiver takes more time than this register value to receive + a byte data. it will produce frame end signal for uhci to stop receiving data.*/ +#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 +#define UART_RX_IDLE_THRHD_S 0 + +#define UART_RS485_CONF_REG(i) (REG_UART_BASE(i) + 0x44) +/* 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: enable rs485's transmitter to send data when rs485's receiver + is busy. 0:rs485's transmitter should not send data when its receiver 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 loopback transmitter's output data signal + to receiver's input data signal.*/ +#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 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_S 0 + +#define UART_AT_CMD_PRECNT_REG(i) (REG_UART_BASE(i) + 0x48) +/* UART_PRE_IDLE_NUM : R/W ;bitpos:[23:0] ;default: 24'h186a00 ; */ +/*description: This register is used to configure the idle duration time before + the first at_cmd is received by receiver. when the the duration is less than this register value it will not take the next data received as at_cmd char.*/ +#define UART_PRE_IDLE_NUM 0x00FFFFFF +#define UART_PRE_IDLE_NUM_M ((UART_PRE_IDLE_NUM_V)<<(UART_PRE_IDLE_NUM_S)) +#define UART_PRE_IDLE_NUM_V 0xFFFFFF +#define UART_PRE_IDLE_NUM_S 0 + +#define UART_AT_CMD_POSTCNT_REG(i) (REG_UART_BASE(i) + 0x4c) +/* UART_POST_IDLE_NUM : R/W ;bitpos:[23:0] ;default: 24'h186a00 ; */ +/*description: This register is used to configure the duration time between + the last at_cmd and the next data. when the duration is less than this register value it will not take the previous data as at_cmd char.*/ +#define UART_POST_IDLE_NUM 0x00FFFFFF +#define UART_POST_IDLE_NUM_M ((UART_POST_IDLE_NUM_V)<<(UART_POST_IDLE_NUM_S)) +#define UART_POST_IDLE_NUM_V 0xFFFFFF +#define UART_POST_IDLE_NUM_S 0 + +#define UART_AT_CMD_GAPTOUT_REG(i) (REG_UART_BASE(i) + 0x50) +/* UART_RX_GAP_TOUT : R/W ;bitpos:[23:0] ;default: 24'h1e00 ; */ +/*description: This register is used to configure the duration time between + the at_cmd chars. when the duration time is less than this register value it will not take the datas as continous at_cmd chars.*/ +#define UART_RX_GAP_TOUT 0x00FFFFFF +#define UART_RX_GAP_TOUT_M ((UART_RX_GAP_TOUT_V)<<(UART_RX_GAP_TOUT_S)) +#define UART_RX_GAP_TOUT_V 0xFFFFFF +#define UART_RX_GAP_TOUT_S 0 + +#define UART_AT_CMD_CHAR_REG(i) (REG_UART_BASE(i) + 0x54) +/* UART_CHAR_NUM : R/W ;bitpos:[15:8] ;default: 8'h3 ; */ +/*description: This register is used to configure the num of continous at_cmd + chars received by 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 +#define UART_AT_CMD_CHAR_S 0 + +#define UART_MEM_CONF_REG(i) (REG_UART_BASE(i) + 0x58) +/* UART_TX_MEM_EMPTY_THRHD : R/W ;bitpos:[30:28] ;default: 3'h0 ; */ +/*description: refer to txfifo_empty_thrhd 's describtion.*/ +#define UART_TX_MEM_EMPTY_THRHD 0x00000007 +#define UART_TX_MEM_EMPTY_THRHD_M ((UART_TX_MEM_EMPTY_THRHD_V)<<(UART_TX_MEM_EMPTY_THRHD_S)) +#define UART_TX_MEM_EMPTY_THRHD_V 0x7 +#define UART_TX_MEM_EMPTY_THRHD_S 28 +/* UART_RX_MEM_FULL_THRHD : R/W ;bitpos:[27:25] ;default: 3'h0 ; */ +/*description: refer to the rxfifo_full_thrhd's describtion.*/ +#define UART_RX_MEM_FULL_THRHD 0x00000007 +#define UART_RX_MEM_FULL_THRHD_M ((UART_RX_MEM_FULL_THRHD_V)<<(UART_RX_MEM_FULL_THRHD_S)) +#define UART_RX_MEM_FULL_THRHD_V 0x7 +#define UART_RX_MEM_FULL_THRHD_S 25 +/* UART_XOFF_THRESHOLD_H2 : R/W ;bitpos:[24:23] ;default: 2'h0 ; */ +/*description: refer to the uart_xoff_threshold's describtion.*/ +#define UART_XOFF_THRESHOLD_H2 0x00000003 +#define UART_XOFF_THRESHOLD_H2_M ((UART_XOFF_THRESHOLD_H2_V)<<(UART_XOFF_THRESHOLD_H2_S)) +#define UART_XOFF_THRESHOLD_H2_V 0x3 +#define UART_XOFF_THRESHOLD_H2_S 23 +/* UART_XON_THRESHOLD_H2 : R/W ;bitpos:[22:21] ;default: 2'h0 ; */ +/*description: refer to the uart_xon_threshold's describtion.*/ +#define UART_XON_THRESHOLD_H2 0x00000003 +#define UART_XON_THRESHOLD_H2_M ((UART_XON_THRESHOLD_H2_V)<<(UART_XON_THRESHOLD_H2_S)) +#define UART_XON_THRESHOLD_H2_V 0x3 +#define UART_XON_THRESHOLD_H2_S 21 +/* UART_RX_TOUT_THRHD_H3 : R/W ;bitpos:[20:18] ;default: 3'h0 ; */ +/*description: refer to the rx_tout_thrhd's describtion.*/ +#define UART_RX_TOUT_THRHD_H3 0x00000007 +#define UART_RX_TOUT_THRHD_H3_M ((UART_RX_TOUT_THRHD_H3_V)<<(UART_RX_TOUT_THRHD_H3_S)) +#define UART_RX_TOUT_THRHD_H3_V 0x7 +#define UART_RX_TOUT_THRHD_H3_S 18 +/* UART_RX_FLOW_THRHD_H3 : R/W ;bitpos:[17:15] ;default: 3'h0 ; */ +/*description: refer to the rx_flow_thrhd's describtion.*/ +#define UART_RX_FLOW_THRHD_H3 0x00000007 +#define UART_RX_FLOW_THRHD_H3_M ((UART_RX_FLOW_THRHD_H3_V)<<(UART_RX_FLOW_THRHD_H3_S)) +#define UART_RX_FLOW_THRHD_H3_V 0x7 +#define UART_RX_FLOW_THRHD_H3_S 15 +/* UART_TX_SIZE : R/W ;bitpos:[10:7] ;default: 4'h1 ; */ +/*description: This register is used to configure the amount of mem allocated + to transmitter's fifo.the default byte num is 128.*/ +#define UART_TX_SIZE 0x0000000F +#define UART_TX_SIZE_M ((UART_TX_SIZE_V)<<(UART_TX_SIZE_S)) +#define UART_TX_SIZE_V 0xF +#define UART_TX_SIZE_S 7 +/* UART_RX_SIZE : R/W ;bitpos:[6:3] ;default: 4'h1 ; */ +/*description: This register is used to configure the amount of mem allocated + to receiver's fifo. the default byte num is 128.*/ +#define UART_RX_SIZE 0x0000000F +#define UART_RX_SIZE_M ((UART_RX_SIZE_V)<<(UART_RX_SIZE_S)) +#define UART_RX_SIZE_V 0xF +#define UART_RX_SIZE_S 3 +/* UART_MEM_PD : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: Set this bit to power down mem.when reg_mem_pd registers in + the 3 uarts are all set to 1 mem will enter low power mode.*/ +#define UART_MEM_PD (BIT(0)) +#define UART_MEM_PD_M (BIT(0)) +#define UART_MEM_PD_V 0x1 +#define UART_MEM_PD_S 0 + +#define UART_MEM_TX_STATUS_REG(i) (REG_UART_BASE(i) + 0x5c) +/* UART_MEM_TX_STATUS : RO ;bitpos:[23:0] ;default: 24'h0 ; */ +/*description: */ +#define UART_MEM_TX_STATUS 0x00FFFFFF +#define UART_MEM_TX_STATUS_M ((UART_MEM_TX_STATUS_V)<<(UART_MEM_TX_STATUS_S)) +#define UART_MEM_TX_STATUS_V 0xFFFFFF +#define UART_MEM_TX_STATUS_S 0 + +#define UART_MEM_RX_STATUS_REG(i) (REG_UART_BASE(i) + 0x60) +/* UART_MEM_RX_STATUS : RO ;bitpos:[23:0] ;default: 24'h0 ; */ +/*description: This register stores the current uart rx mem read address + and rx mem write address */ +#define UART_MEM_RX_STATUS 0x00FFFFFF +#define UART_MEM_RX_STATUS_M ((UART_MEM_RX_STATUS_V)<<(UART_MEM_RX_STATUS_S)) +#define UART_MEM_RX_STATUS_V 0xFFFFFF +#define UART_MEM_RX_STATUS_S 0 +/* UART_MEM_RX_RD_ADDR : RO ;bitpos:[12:2] ;default: 11'h0 ; */ +/*description: This register stores the rx mem read address */ +#define UART_MEM_RX_RD_ADDR 0x000007FF +#define UART_MEM_RX_RD_ADDR_M ((UART_MEM_RX_RD_ADDR_V)<<(UART_MEM_RX_RD_ADDR_S)) +#define UART_MEM_RX_RD_ADDR_V (0x7FF) +#define UART_MEM_RX_RD_ADDR_S (2) +/* UART_MEM_RX_WR_ADDR : RO ;bitpos:[23:13] ;default: 11'h0 ; */ +/*description: This register stores the rx mem write address */ +#define UART_MEM_RX_WR_ADDR 0x000007FF +#define UART_MEM_RX_WR_ADDR_M ((UART_MEM_RX_WR_ADDR_V)<<(UART_MEM_RX_WR_ADDR_S)) +#define UART_MEM_RX_WR_ADDR_V (0x7FF) +#define UART_MEM_RX_WR_ADDR_S (13) + +#define UART_MEM_CNT_STATUS_REG(i) (REG_UART_BASE(i) + 0x64) +/* UART_TX_MEM_CNT : RO ;bitpos:[5:3] ;default: 3'b0 ; */ +/*description: refer to the txfifo_cnt's describtion.*/ +#define UART_TX_MEM_CNT 0x00000007 +#define UART_TX_MEM_CNT_M ((UART_TX_MEM_CNT_V)<<(UART_TX_MEM_CNT_S)) +#define UART_TX_MEM_CNT_V 0x7 +#define UART_TX_MEM_CNT_S 3 +/* UART_RX_MEM_CNT : RO ;bitpos:[2:0] ;default: 3'b0 ; */ +/*description: refer to the rxfifo_cnt's describtion.*/ +#define UART_RX_MEM_CNT 0x00000007 +#define UART_RX_MEM_CNT_M ((UART_RX_MEM_CNT_V)<<(UART_RX_MEM_CNT_S)) +#define UART_RX_MEM_CNT_V 0x7 +#define UART_RX_MEM_CNT_S 0 + +#define UART_POSPULSE_REG(i) (REG_UART_BASE(i) + 0x68) +/* UART_POSEDGE_MIN_CNT : RO ;bitpos:[19:0] ;default: 20'hFFFFF ; */ +/*description: This register stores the count of rxd posedge edge. it is used + in boudrate-detect process.*/ +#define UART_POSEDGE_MIN_CNT 0x000FFFFF +#define UART_POSEDGE_MIN_CNT_M ((UART_POSEDGE_MIN_CNT_V)<<(UART_POSEDGE_MIN_CNT_S)) +#define UART_POSEDGE_MIN_CNT_V 0xFFFFF +#define UART_POSEDGE_MIN_CNT_S 0 + +#define UART_NEGPULSE_REG(i) (REG_UART_BASE(i) + 0x6c) +/* UART_NEGEDGE_MIN_CNT : RO ;bitpos:[19:0] ;default: 20'hFFFFF ; */ +/*description: This register stores the count of rxd negedge edge. it is used + in boudrate-detect process.*/ +#define UART_NEGEDGE_MIN_CNT 0x000FFFFF +#define UART_NEGEDGE_MIN_CNT_M ((UART_NEGEDGE_MIN_CNT_V)<<(UART_NEGEDGE_MIN_CNT_S)) +#define UART_NEGEDGE_MIN_CNT_V 0xFFFFF +#define UART_NEGEDGE_MIN_CNT_S 0 + +#define UART_DATE_REG(i) (REG_UART_BASE(i) + 0x78) +/* UART_DATE : R/W ;bitpos:[31:0] ;default: 32'h15122500 ; */ +/*description: */ +#define UART_DATE 0xFFFFFFFF +#define UART_DATE_M ((UART_DATE_V)<<(UART_DATE_S)) +#define UART_DATE_V 0xFFFFFFFF +#define UART_DATE_S 0 + +#define UART_ID_REG(i) (REG_UART_BASE(i) + 0x7C) +/* UART_ID : R/W ;bitpos:[31:0] ;default: 32'h0500 ; */ +/*description: */ +#define UART_ID 0xFFFFFFFF +#define UART_ID_M ((UART_ID_V)<<(UART_ID_S)) +#define UART_ID_V 0xFFFFFFFF +#define UART_ID_S 0 + + + + +#endif /*__UART_REG_H__ */ + + diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/uart_struct.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/uart_struct.h new file mode 100644 index 0000000000000..7dc9b5144caf1 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/uart_struct.h @@ -0,0 +1,383 @@ +// 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. +#ifndef _SOC_UART_STRUCT_H_ +#define _SOC_UART_STRUCT_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef volatile struct uart_dev_s { + union { + struct { + uint8_t rw_byte; /*This register stores one byte data read by rx fifo.*/ + uint8_t reserved[3]; + }; + uint32_t val; + } fifo; + union { + struct { + uint32_t rxfifo_full: 1; /*This interrupt raw bit turns to high level when receiver receives more data than (rx_flow_thrhd_h3 rx_flow_thrhd).*/ + uint32_t txfifo_empty: 1; /*This interrupt raw bit turns to high level when the amount of data in transmitter's fifo is less than ((tx_mem_cnttxfifo_cnt) .*/ + uint32_t parity_err: 1; /*This interrupt raw bit turns to high level when receiver detects the parity error of data.*/ + uint32_t frm_err: 1; /*This interrupt raw bit turns to high level when receiver detects data's 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 the 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 receives xoff char with 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 xon char with 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 the start bit.*/ + uint32_t tx_brk_done: 1; /*This interrupt raw bit turns to high level when transmitter completes sending 0 after all the data in transmitter's fifo are send.*/ + uint32_t tx_brk_idle_done: 1; /*This interrupt raw bit turns to high level when transmitter has kept the shortest duration after the last data has been send.*/ + uint32_t tx_done: 1; /*This interrupt raw bit turns to high level when transmitter has send all the data in fifo.*/ + uint32_t rs485_parity_err: 1; /*This interrupt raw bit turns to high level when rs485 detects the parity error.*/ + uint32_t rs485_frm_err: 1; /*This interrupt raw bit turns to high level when rs485 detects the data frame error.*/ + uint32_t rs485_clash: 1; /*This interrupt raw bit turns to high level when rs485 detects the clash between transmitter and receiver.*/ + uint32_t at_cmd_char_det: 1; /*This interrupt raw bit turns to high level when receiver detects the configured at_cmd chars.*/ + uint32_t reserved19: 13; + }; + 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 fm_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 status 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_fm_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 reserved19: 13; + }; + 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 rxfifo_full_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 reserved19: 13; + }; + 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_xon_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 reserved19: 13; + }; + uint32_t val; + } int_clr; + union { + struct { + uint32_t div_int: 20; /*The register value is the integer part of the frequency divider's factor.*/ + uint32_t div_frag: 4; /*The register value is the decimal part of the frequency divider's factor.*/ + uint32_t reserved24: 8; + }; + uint32_t val; + } clk_div; + union { + struct { + uint32_t en: 1; /*This is the enable bit for detecting baudrate.*/ + uint32_t reserved1: 7; + uint32_t glitch_filt: 8; /*when input pulse width is lower then this value ignore this pulse.this register is used in auto-baud detect process.*/ + uint32_t reserved16: 16; + }; + uint32_t val; + } auto_baud; + union { + struct { + uint32_t rxfifo_cnt: 8; /*(rx_mem_cnt rxfifo_cnt) stores the byte number of valid data in receiver's fifo. rx_mem_cnt register stores the 3 most significant bits rxfifo_cnt stores the 8 least significant bits.*/ + uint32_t st_urx_out: 4; /*This register stores the value of receiver's finite state machine. 0:RX_IDLE 1:RX_STRT 2:RX_DAT0 3:RX_DAT1 4:RX_DAT2 5:RX_DAT3 6:RX_DAT4 7:RX_DAT5 8:RX_DAT6 9:RX_DAT7 10:RX_PRTY 11:RX_STP1 12:RX_STP2 13:RX_DL1*/ + uint32_t reserved12: 1; + uint32_t dsrn: 1; /*This register stores the level value of the internal uart dsr signal.*/ + uint32_t ctsn: 1; /*This register stores the level value of the internal uart cts signal.*/ + uint32_t rxd: 1; /*This register stores the level value of the internal uart rxd signal.*/ + uint32_t txfifo_cnt: 8; /*(tx_mem_cnt txfifo_cnt) stores the byte number of valid data in transmitter's fifo.tx_mem_cnt stores the 3 most significant bits txfifo_cnt stores the 8 least significant bits.*/ + uint32_t st_utx_out: 4; /*This register stores the value of transmitter's finite state machine. 0:TX_IDLE 1:TX_STRT 2:TX_DAT0 3:TX_DAT1 4:TX_DAT2 5:TX_DAT3 6:TX_DAT4 7:TX_DAT5 8:TX_DAT6 9:TX_DAT7 10:TX_PRTY 11:TX_STP1 12:TX_STP2 13:TX_DL0 14:TX_DL1*/ + uint32_t reserved28: 1; + uint32_t dtrn: 1; /*The register represent the level value of the internal uart dsr signal.*/ + uint32_t rtsn: 1; /*This register represent the level value of the internal uart cts signal.*/ + uint32_t txd: 1; /*This register represent the level value of the internal uart rxd signal.*/ + }; + uint32_t val; + } status; + union { + struct { + uint32_t parity: 1; /*This register is used to configure the parity check mode. 0:even 1:odd*/ + 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: 0:5bits 1:6bits 2:7bits 3:8bits*/ + uint32_t stop_bit_num: 2; /*This register is used to set the length of stop bit. 1:1bit 2:1.5bits 3:2bits*/ + 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 enable transmitter to send 0 when the process of sending data is done.*/ + uint32_t irda_dplx: 1; /*Set this bit to enable irda loop-back mode.*/ + uint32_t irda_tx_en: 1; /*This is the start enable bit for irda transmitter.*/ + uint32_t irda_wctl: 1; /*1:the irda transmitter's 11th bit is the same to the 10th bit. 0:set irda transmitter's 11th bit to 0.*/ + uint32_t irda_tx_inv: 1; /*Set this bit to inverse the level value of irda transmitter's level.*/ + uint32_t irda_rx_inv: 1; /*Set this bit to inverse the level value of irda receiver's level.*/ + uint32_t loopback: 1; /*Set this bit to enable uart loop-back test mode.*/ + uint32_t tx_flow_en: 1; /*Set this bit to enable transmitter's flow control function.*/ + uint32_t irda_en: 1; /*Set this bit to enable irda protocol.*/ + uint32_t rxfifo_rst: 1; /*Set this bit to reset uart receiver's fifo.*/ + uint32_t txfifo_rst: 1; /*Set this bit to reset uart transmitter's 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:force clock on for registers:support clock only when write registers*/ + uint32_t err_wr_mask: 1; /*1:receiver stops storing data int fifo when data is wrong. 0:receiver stores the data even if the received data is wrong.*/ + uint32_t tick_ref_always_on: 1; /*This register is used to select the clock.1:apb clock:ref_tick*/ + uint32_t reserved28: 4; + }; + uint32_t val; + } conf0; + union { + struct { + uint32_t rxfifo_full_thrhd: 7; /*When receiver receives more data than its threshold value,receiver will produce rxfifo_full_int_raw interrupt.the threshold value is (rx_flow_thrhd_h3 rxfifo_full_thrhd).*/ + uint32_t reserved7: 1; + uint32_t txfifo_empty_thrhd: 7; /*when the data amount in transmitter fifo is less than its threshold value, it will produce txfifo_empty_int_raw interrupt. the threshold value is (tx_mem_empty_thrhd txfifo_empty_thrhd)*/ + uint32_t reserved15: 1; + uint32_t rx_flow_thrhd: 7; /*when receiver receives more data than its threshold value, receiver produce signal to tell the transmitter stop transferring data. the threshold value is (rx_flow_thrhd_h3 rx_flow_thrhd).*/ + uint32_t rx_flow_en: 1; /*This is the flow enable bit for uart receiver. 1:choose software flow control with configuring sw_rts signal*/ + uint32_t rx_tout_thrhd: 7; /*This register is used to configure the timeout value for uart receiver receiving a byte.*/ + uint32_t rx_tout_en: 1; /*This is the enable bit for uart receiver's timeout function.*/ + }; + uint32_t val; + } conf1; + union { + struct { + uint32_t min_cnt: 20; /*This register stores the value of the minimum duration time for the low level pulse, it is used in baudrate-detect process.*/ + uint32_t reserved20: 12; + }; + uint32_t val; + } lowpulse; + union { + struct { + uint32_t min_cnt: 20; /*This register stores the value of the maximum duration time for the high level pulse, it is used in baudrate-detect process.*/ + uint32_t reserved20: 12; + }; + uint32_t val; + } highpulse; + union { + struct { + uint32_t edge_cnt: 10; /*This register stores the count of rxd edge change, it is used in baudrate-detect process.*/ + uint32_t reserved10: 22; + }; + 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 clear ctsn to stop the transmitter from sending data.*/ + uint32_t force_xoff: 1; /*Set this bit to set ctsn to enable the transmitter to go on 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; + }; + uint32_t val; + } flow_conf; + union { + struct { + uint32_t active_threshold:10; /*When the input rxd edge changes more than this register value, the uart is active from light sleeping mode.*/ + uint32_t reserved10: 22; + }; + uint32_t val; + } sleep_conf; + union { + struct { + uint32_t xon_threshold: 8; /*when the data amount in receiver's fifo is more than this register value, it will send a xoff char with uart_sw_flow_con_en set to 1.*/ + uint32_t xoff_threshold: 8; /*When the data amount in receiver's fifo is less than this register value, it will send a xon char with uart_sw_flow_con_en set to 1.*/ + uint32_t xon_char: 8; /*This register stores the xon flow control char.*/ + uint32_t xoff_char: 8; /*This register stores the xoff flow control char.*/ + }; + uint32_t val; + } swfc_conf; + union { + struct { + uint32_t rx_idle_thrhd:10; /*when receiver takes more time than this register value to receive a byte data, it will produce frame end signal for uhci to stop receiving data.*/ + uint32_t tx_idle_num: 10; /*This register is used to configure the duration time between transfers.*/ + uint32_t tx_brk_num: 8; /*This register is used to configure the number of 0 send after the process of sending data is done. it is active when txd_brk is set to 1.*/ + uint32_t reserved28: 4; + }; + uint32_t val; + } idle_conf; + union { + struct { + uint32_t en: 1; /*Set this bit to choose 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 loop-back transmitter's output data signal to receiver's input data signal.*/ + uint32_t rx_busy_tx_en: 1; /*1: enable rs485's transmitter to send data when rs485's receiver is busy. 0:rs485's transmitter should not send data when its receiver 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; + }; + uint32_t val; + } rs485_conf; + union { + struct { + uint32_t pre_idle_num:24; /*This register is used to configure the idle duration time before the first at_cmd is received by receiver, when the the duration is less than this register value it will not take the next data received as at_cmd char.*/ + uint32_t reserved24: 8; + }; + uint32_t val; + } at_cmd_precnt; + union { + struct { + uint32_t post_idle_num:24; /*This register is used to configure the duration time between the last at_cmd and the next data, when the duration is less than this register value it will not take the previous data as at_cmd char.*/ + uint32_t reserved24: 8; + }; + uint32_t val; + } at_cmd_postcnt; + union { + struct { + uint32_t rx_gap_tout:24; /*This register is used to configure the duration time between the at_cmd chars, when the duration time is less than this register value it will not take the data as continous at_cmd chars.*/ + uint32_t reserved24: 8; + }; + 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 number of continuous at_cmd chars received by receiver.*/ + uint32_t reserved16: 16; + }; + uint32_t val; + } at_cmd_char; + union { + struct { + uint32_t mem_pd: 1; /*Set this bit to power down memory,when reg_mem_pd registers in the 3 uarts are all set to 1 memory will enter low power mode.*/ + uint32_t reserved1: 1; + uint32_t reserved2: 1; + uint32_t rx_size: 4; /*This register is used to configure the amount of mem allocated to receiver's fifo. the default byte num is 128.*/ + uint32_t tx_size: 4; /*This register is used to configure the amount of mem allocated to transmitter's fifo.the default byte num is 128.*/ + uint32_t reserved11: 4; + uint32_t rx_flow_thrhd_h3: 3; /*refer to the rx_flow_thrhd's description.*/ + uint32_t rx_tout_thrhd_h3: 3; /*refer to the rx_tout_thrhd's description.*/ + uint32_t xon_threshold_h2: 2; /*refer to the uart_xon_threshold's description.*/ + uint32_t xoff_threshold_h2: 2; /*refer to the uart_xoff_threshold's description.*/ + uint32_t rx_mem_full_thrhd: 3; /*refer to the rxfifo_full_thrhd's description.*/ + uint32_t tx_mem_empty_thrhd: 3; /*refer to txfifo_empty_thrhd 's description.*/ + uint32_t reserved31: 1; + }; + uint32_t val; + } mem_conf; + union { + struct { + uint32_t status:24; + uint32_t reserved24: 8; + }; + uint32_t val; + } mem_tx_status; + union { + struct { + uint32_t status: 24; + uint32_t reserved24: 8; + }; + struct { + uint32_t reserved0: 2; + uint32_t rd_addr: 11; /*This register stores the rx mem read address.*/ + uint32_t wr_addr: 11; /*This register stores the rx mem write address.*/ + uint32_t reserved: 8; + }; + uint32_t val; + } mem_rx_status; + union { + struct { + uint32_t rx_cnt: 3; /*refer to the rxfifo_cnt's description.*/ + uint32_t tx_cnt: 3; /*refer to the txfifo_cnt's description.*/ + uint32_t reserved6: 26; + }; + uint32_t val; + } mem_cnt_status; + union { + struct { + uint32_t min_cnt: 20; /*This register stores the count of rxd pos-edge edge, it is used in baudrate-detect process.*/ + uint32_t reserved20: 12; + }; + uint32_t val; + } pospulse; + union { + struct { + uint32_t min_cnt: 20; /*This register stores the count of rxd neg-edge edge, it is used in baudrate-detect process.*/ + uint32_t reserved20: 12; + }; + uint32_t val; + } negpulse; + uint32_t reserved_70; + uint32_t reserved_74; + uint32_t date; /**/ + uint32_t id; /**/ +} uart_dev_t; +extern uart_dev_t UART0; +extern uart_dev_t UART1; +extern uart_dev_t UART2; + +#ifdef __cplusplus +} +#endif + +#endif /* _SOC_UART_STRUCT_H_ */ diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/uhci_reg.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/uhci_reg.h new file mode 100644 index 0000000000000..973c6b58929fd --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/uhci_reg.h @@ -0,0 +1,1260 @@ +// 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. +#ifndef _SOC_UHCI_REG_H_ +#define _SOC_UHCI_REG_H_ + + +#include "soc.h" +#define REG_UHCI_BASE(i) (DR_REG_UHCI0_BASE - (i) * 0x8000) +#define UHCI_CONF0_REG(i) (REG_UHCI_BASE(i) + 0x0) +/* UHCI_UART_RX_BRK_EOF_EN : R/W ;bitpos:[23] ;default: 1'b0 ; */ +/*description: Set this bit to enable to use brk char as the end of a data frame.*/ +#define UHCI_UART_RX_BRK_EOF_EN (BIT(23)) +#define UHCI_UART_RX_BRK_EOF_EN_M (BIT(23)) +#define UHCI_UART_RX_BRK_EOF_EN_V 0x1 +#define UHCI_UART_RX_BRK_EOF_EN_S 23 +/* UHCI_CLK_EN : R/W ;bitpos:[22] ;default: 1'b0 ; */ +/*description: Set this bit to enable clock-gating for read or write registers.*/ +#define UHCI_CLK_EN (BIT(22)) +#define UHCI_CLK_EN_M (BIT(22)) +#define UHCI_CLK_EN_V 0x1 +#define UHCI_CLK_EN_S 22 +/* UHCI_ENCODE_CRC_EN : R/W ;bitpos:[21] ;default: 1'b1 ; */ +/*description: Set this bit to enable crc calculation for data frame when bit6 + in the head packet is 1.*/ +#define UHCI_ENCODE_CRC_EN (BIT(21)) +#define UHCI_ENCODE_CRC_EN_M (BIT(21)) +#define UHCI_ENCODE_CRC_EN_V 0x1 +#define UHCI_ENCODE_CRC_EN_S 21 +/* UHCI_LEN_EOF_EN : R/W ;bitpos:[20] ;default: 1'b1 ; */ +/*description: Set this bit to enable to use packet_len in packet head when + the received data is equal to packet_len this means the end of a data frame.*/ +#define UHCI_LEN_EOF_EN (BIT(20)) +#define UHCI_LEN_EOF_EN_M (BIT(20)) +#define UHCI_LEN_EOF_EN_V 0x1 +#define UHCI_LEN_EOF_EN_S 20 +/* UHCI_UART_IDLE_EOF_EN : R/W ;bitpos:[19] ;default: 1'b0 ; */ +/*description: Set this bit to enable to use idle time when the idle time after + data frame is satisfied this means the end of a data frame.*/ +#define UHCI_UART_IDLE_EOF_EN (BIT(19)) +#define UHCI_UART_IDLE_EOF_EN_M (BIT(19)) +#define UHCI_UART_IDLE_EOF_EN_V 0x1 +#define UHCI_UART_IDLE_EOF_EN_S 19 +/* UHCI_CRC_REC_EN : R/W ;bitpos:[18] ;default: 1'b1 ; */ +/*description: Set this bit to enable receiver''s ability of crc calculation + when crc_en bit in head packet is 1 then there will be crc bytes after data_frame*/ +#define UHCI_CRC_REC_EN (BIT(18)) +#define UHCI_CRC_REC_EN_M (BIT(18)) +#define UHCI_CRC_REC_EN_V 0x1 +#define UHCI_CRC_REC_EN_S 18 +/* UHCI_HEAD_EN : R/W ;bitpos:[17] ;default: 1'b1 ; */ +/*description: Set this bit to enable to use head packet before the data frame.*/ +#define UHCI_HEAD_EN (BIT(17)) +#define UHCI_HEAD_EN_M (BIT(17)) +#define UHCI_HEAD_EN_V 0x1 +#define UHCI_HEAD_EN_S 17 +/* UHCI_SEPER_EN : R/W ;bitpos:[16] ;default: 1'b1 ; */ +/*description: Set this bit to use special char to separate the data frame.*/ +#define UHCI_SEPER_EN (BIT(16)) +#define UHCI_SEPER_EN_M (BIT(16)) +#define UHCI_SEPER_EN_V 0x1 +#define UHCI_SEPER_EN_S 16 +/* UHCI_MEM_TRANS_EN : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_MEM_TRANS_EN (BIT(15)) +#define UHCI_MEM_TRANS_EN_M (BIT(15)) +#define UHCI_MEM_TRANS_EN_V 0x1 +#define UHCI_MEM_TRANS_EN_S 15 +/* UHCI_OUT_DATA_BURST_EN : R/W ;bitpos:[14] ;default: 1'b0 ; */ +/*description: Set this bit to enable DMA burst MODE*/ +#define UHCI_OUT_DATA_BURST_EN (BIT(14)) +#define UHCI_OUT_DATA_BURST_EN_M (BIT(14)) +#define UHCI_OUT_DATA_BURST_EN_V 0x1 +#define UHCI_OUT_DATA_BURST_EN_S 14 +/* UHCI_INDSCR_BURST_EN : R/W ;bitpos:[13] ;default: 1'b0 ; */ +/*description: Set this bit to enable DMA out links to use burst mode.*/ +#define UHCI_INDSCR_BURST_EN (BIT(13)) +#define UHCI_INDSCR_BURST_EN_M (BIT(13)) +#define UHCI_INDSCR_BURST_EN_V 0x1 +#define UHCI_INDSCR_BURST_EN_S 13 +/* UHCI_OUTDSCR_BURST_EN : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: Set this bit to enable DMA in links to use burst mode.*/ +#define UHCI_OUTDSCR_BURST_EN (BIT(12)) +#define UHCI_OUTDSCR_BURST_EN_M (BIT(12)) +#define UHCI_OUTDSCR_BURST_EN_V 0x1 +#define UHCI_OUTDSCR_BURST_EN_S 12 +/* UHCI_UART2_CE : R/W ;bitpos:[11] ;default: 1'b0 ; */ +/*description: Set this bit to use UART2 to transmit or receive data.*/ +#define UHCI_UART2_CE (BIT(11)) +#define UHCI_UART2_CE_M (BIT(11)) +#define UHCI_UART2_CE_V 0x1 +#define UHCI_UART2_CE_S 11 +/* UHCI_UART1_CE : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: Set this bit to use UART1 to transmit or receive data.*/ +#define UHCI_UART1_CE (BIT(10)) +#define UHCI_UART1_CE_M (BIT(10)) +#define UHCI_UART1_CE_V 0x1 +#define UHCI_UART1_CE_S 10 +/* UHCI_UART0_CE : R/W ;bitpos:[9] ;default: 1'b0 ; */ +/*description: Set this bit to use UART to transmit or receive data.*/ +#define UHCI_UART0_CE (BIT(9)) +#define UHCI_UART0_CE_M (BIT(9)) +#define UHCI_UART0_CE_V 0x1 +#define UHCI_UART0_CE_S 9 +/* UHCI_OUT_EOF_MODE : R/W ;bitpos:[8] ;default: 1'b1 ; */ +/*description: Set this bit to produce eof after DMA pops all data clear this + bit to produce eof after DMA pushes all data*/ +#define UHCI_OUT_EOF_MODE (BIT(8)) +#define UHCI_OUT_EOF_MODE_M (BIT(8)) +#define UHCI_OUT_EOF_MODE_V 0x1 +#define UHCI_OUT_EOF_MODE_S 8 +/* UHCI_OUT_NO_RESTART_CLR : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: don't use*/ +#define UHCI_OUT_NO_RESTART_CLR (BIT(7)) +#define UHCI_OUT_NO_RESTART_CLR_M (BIT(7)) +#define UHCI_OUT_NO_RESTART_CLR_V 0x1 +#define UHCI_OUT_NO_RESTART_CLR_S 7 +/* UHCI_OUT_AUTO_WRBACK : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: when in link's length is 0 go on to use the next in link automatically.*/ +#define UHCI_OUT_AUTO_WRBACK (BIT(6)) +#define UHCI_OUT_AUTO_WRBACK_M (BIT(6)) +#define UHCI_OUT_AUTO_WRBACK_V 0x1 +#define UHCI_OUT_AUTO_WRBACK_S 6 +/* UHCI_OUT_LOOP_TEST : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: Set this bit to enable loop test for out links.*/ +#define UHCI_OUT_LOOP_TEST (BIT(5)) +#define UHCI_OUT_LOOP_TEST_M (BIT(5)) +#define UHCI_OUT_LOOP_TEST_V 0x1 +#define UHCI_OUT_LOOP_TEST_S 5 +/* UHCI_IN_LOOP_TEST : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: Set this bit to enable loop test for in links.*/ +#define UHCI_IN_LOOP_TEST (BIT(4)) +#define UHCI_IN_LOOP_TEST_M (BIT(4)) +#define UHCI_IN_LOOP_TEST_V 0x1 +#define UHCI_IN_LOOP_TEST_S 4 +/* UHCI_AHBM_RST : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: Set this bit to reset dma ahb interface.*/ +#define UHCI_AHBM_RST (BIT(3)) +#define UHCI_AHBM_RST_M (BIT(3)) +#define UHCI_AHBM_RST_V 0x1 +#define UHCI_AHBM_RST_S 3 +/* UHCI_AHBM_FIFO_RST : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: Set this bit to reset dma ahb fifo.*/ +#define UHCI_AHBM_FIFO_RST (BIT(2)) +#define UHCI_AHBM_FIFO_RST_M (BIT(2)) +#define UHCI_AHBM_FIFO_RST_V 0x1 +#define UHCI_AHBM_FIFO_RST_S 2 +/* UHCI_OUT_RST : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: Set this bit to reset out link operations.*/ +#define UHCI_OUT_RST (BIT(1)) +#define UHCI_OUT_RST_M (BIT(1)) +#define UHCI_OUT_RST_V 0x1 +#define UHCI_OUT_RST_S 1 +/* UHCI_IN_RST : R/W ;bitpos:[0] ;default: 1'h0 ; */ +/*description: Set this bit to reset in link operations.*/ +#define UHCI_IN_RST (BIT(0)) +#define UHCI_IN_RST_M (BIT(0)) +#define UHCI_IN_RST_V 0x1 +#define UHCI_IN_RST_S 0 + +#define UHCI_INT_RAW_REG(i) (REG_UHCI_BASE(i) + 0x4) +/* UHCI_DMA_INFIFO_FULL_WM_INT_RAW : RO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_DMA_INFIFO_FULL_WM_INT_RAW (BIT(16)) +#define UHCI_DMA_INFIFO_FULL_WM_INT_RAW_M (BIT(16)) +#define UHCI_DMA_INFIFO_FULL_WM_INT_RAW_V 0x1 +#define UHCI_DMA_INFIFO_FULL_WM_INT_RAW_S 16 +/* UHCI_SEND_A_Q_INT_RAW : RO ;bitpos:[15] ;default: 1'b0 ; */ +/*description: When use always_send registers to send a series of short packets + it will produce this interrupt when dma has send the short packet.*/ +#define UHCI_SEND_A_Q_INT_RAW (BIT(15)) +#define UHCI_SEND_A_Q_INT_RAW_M (BIT(15)) +#define UHCI_SEND_A_Q_INT_RAW_V 0x1 +#define UHCI_SEND_A_Q_INT_RAW_S 15 +/* UHCI_SEND_S_Q_INT_RAW : RO ;bitpos:[14] ;default: 1'b0 ; */ +/*description: When use single send registers to send a short packets it will + produce this interrupt when dma has send the short packet.*/ +#define UHCI_SEND_S_Q_INT_RAW (BIT(14)) +#define UHCI_SEND_S_Q_INT_RAW_M (BIT(14)) +#define UHCI_SEND_S_Q_INT_RAW_V 0x1 +#define UHCI_SEND_S_Q_INT_RAW_S 14 +/* UHCI_OUT_TOTAL_EOF_INT_RAW : RO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: When all data have been send it will produce uhci_out_total_eof_int interrupt.*/ +#define UHCI_OUT_TOTAL_EOF_INT_RAW (BIT(13)) +#define UHCI_OUT_TOTAL_EOF_INT_RAW_M (BIT(13)) +#define UHCI_OUT_TOTAL_EOF_INT_RAW_V 0x1 +#define UHCI_OUT_TOTAL_EOF_INT_RAW_S 13 +/* UHCI_OUTLINK_EOF_ERR_INT_RAW : RO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: when there are some errors about eof in outlink descriptor it + will produce uhci_outlink_eof_err_int interrupt.*/ +#define UHCI_OUTLINK_EOF_ERR_INT_RAW (BIT(12)) +#define UHCI_OUTLINK_EOF_ERR_INT_RAW_M (BIT(12)) +#define UHCI_OUTLINK_EOF_ERR_INT_RAW_V 0x1 +#define UHCI_OUTLINK_EOF_ERR_INT_RAW_S 12 +/* UHCI_IN_DSCR_EMPTY_INT_RAW : RO ;bitpos:[11] ;default: 1'b0 ; */ +/*description: when there are not enough in links for DMA it will produce uhci_in_dscr_err_int + interrupt.*/ +#define UHCI_IN_DSCR_EMPTY_INT_RAW (BIT(11)) +#define UHCI_IN_DSCR_EMPTY_INT_RAW_M (BIT(11)) +#define UHCI_IN_DSCR_EMPTY_INT_RAW_V 0x1 +#define UHCI_IN_DSCR_EMPTY_INT_RAW_S 11 +/* UHCI_OUT_DSCR_ERR_INT_RAW : RO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: when there are some errors about the in link descriptor it will + produce uhci_out_dscr_err_int interrupt.*/ +#define UHCI_OUT_DSCR_ERR_INT_RAW (BIT(10)) +#define UHCI_OUT_DSCR_ERR_INT_RAW_M (BIT(10)) +#define UHCI_OUT_DSCR_ERR_INT_RAW_V 0x1 +#define UHCI_OUT_DSCR_ERR_INT_RAW_S 10 +/* UHCI_IN_DSCR_ERR_INT_RAW : RO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: when there are some errors about the out link descriptor it + will produce uhci_in_dscr_err_int interrupt.*/ +#define UHCI_IN_DSCR_ERR_INT_RAW (BIT(9)) +#define UHCI_IN_DSCR_ERR_INT_RAW_M (BIT(9)) +#define UHCI_IN_DSCR_ERR_INT_RAW_V 0x1 +#define UHCI_IN_DSCR_ERR_INT_RAW_S 9 +/* UHCI_OUT_EOF_INT_RAW : RO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: when the current descriptor's eof bit is 1 it will produce uhci_out_eof_int + interrupt.*/ +#define UHCI_OUT_EOF_INT_RAW (BIT(8)) +#define UHCI_OUT_EOF_INT_RAW_M (BIT(8)) +#define UHCI_OUT_EOF_INT_RAW_V 0x1 +#define UHCI_OUT_EOF_INT_RAW_S 8 +/* UHCI_OUT_DONE_INT_RAW : RO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: when a out link descriptor is completed it will produce uhci_out_done_int + interrupt.*/ +#define UHCI_OUT_DONE_INT_RAW (BIT(7)) +#define UHCI_OUT_DONE_INT_RAW_M (BIT(7)) +#define UHCI_OUT_DONE_INT_RAW_V 0x1 +#define UHCI_OUT_DONE_INT_RAW_S 7 +/* UHCI_IN_ERR_EOF_INT_RAW : RO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: when there are some errors about eof in in link descriptor it + will produce uhci_in_err_eof_int interrupt.*/ +#define UHCI_IN_ERR_EOF_INT_RAW (BIT(6)) +#define UHCI_IN_ERR_EOF_INT_RAW_M (BIT(6)) +#define UHCI_IN_ERR_EOF_INT_RAW_V 0x1 +#define UHCI_IN_ERR_EOF_INT_RAW_S 6 +/* UHCI_IN_SUC_EOF_INT_RAW : RO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: when a data packet has been received it will produce uhci_in_suc_eof_int + interrupt.*/ +#define UHCI_IN_SUC_EOF_INT_RAW (BIT(5)) +#define UHCI_IN_SUC_EOF_INT_RAW_M (BIT(5)) +#define UHCI_IN_SUC_EOF_INT_RAW_V 0x1 +#define UHCI_IN_SUC_EOF_INT_RAW_S 5 +/* UHCI_IN_DONE_INT_RAW : RO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: when a in link descriptor has been completed it will produce + uhci_in_done_int interrupt.*/ +#define UHCI_IN_DONE_INT_RAW (BIT(4)) +#define UHCI_IN_DONE_INT_RAW_M (BIT(4)) +#define UHCI_IN_DONE_INT_RAW_V 0x1 +#define UHCI_IN_DONE_INT_RAW_S 4 +/* UHCI_TX_HUNG_INT_RAW : RO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: when DMA takes a lot of time to read a data from RAM it will + produce uhci_tx_hung_int interrupt.*/ +#define UHCI_TX_HUNG_INT_RAW (BIT(3)) +#define UHCI_TX_HUNG_INT_RAW_M (BIT(3)) +#define UHCI_TX_HUNG_INT_RAW_V 0x1 +#define UHCI_TX_HUNG_INT_RAW_S 3 +/* UHCI_RX_HUNG_INT_RAW : RO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: when DMA takes a lot of time to receive a data it will produce + uhci_rx_hung_int interrupt.*/ +#define UHCI_RX_HUNG_INT_RAW (BIT(2)) +#define UHCI_RX_HUNG_INT_RAW_M (BIT(2)) +#define UHCI_RX_HUNG_INT_RAW_V 0x1 +#define UHCI_RX_HUNG_INT_RAW_S 2 +/* UHCI_TX_START_INT_RAW : RO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: when DMA detects a separator char it will produce uhci_tx_start_int interrupt.*/ +#define UHCI_TX_START_INT_RAW (BIT(1)) +#define UHCI_TX_START_INT_RAW_M (BIT(1)) +#define UHCI_TX_START_INT_RAW_V 0x1 +#define UHCI_TX_START_INT_RAW_S 1 +/* UHCI_RX_START_INT_RAW : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: when a separator char has been send it will produce uhci_rx_start_int + interrupt.*/ +#define UHCI_RX_START_INT_RAW (BIT(0)) +#define UHCI_RX_START_INT_RAW_M (BIT(0)) +#define UHCI_RX_START_INT_RAW_V 0x1 +#define UHCI_RX_START_INT_RAW_S 0 + +#define UHCI_INT_ST_REG(i) (REG_UHCI_BASE(i) + 0x8) +/* UHCI_DMA_INFIFO_FULL_WM_INT_ST : RO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_DMA_INFIFO_FULL_WM_INT_ST (BIT(16)) +#define UHCI_DMA_INFIFO_FULL_WM_INT_ST_M (BIT(16)) +#define UHCI_DMA_INFIFO_FULL_WM_INT_ST_V 0x1 +#define UHCI_DMA_INFIFO_FULL_WM_INT_ST_S 16 +/* UHCI_SEND_A_Q_INT_ST : RO ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_SEND_A_Q_INT_ST (BIT(15)) +#define UHCI_SEND_A_Q_INT_ST_M (BIT(15)) +#define UHCI_SEND_A_Q_INT_ST_V 0x1 +#define UHCI_SEND_A_Q_INT_ST_S 15 +/* UHCI_SEND_S_Q_INT_ST : RO ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_SEND_S_Q_INT_ST (BIT(14)) +#define UHCI_SEND_S_Q_INT_ST_M (BIT(14)) +#define UHCI_SEND_S_Q_INT_ST_V 0x1 +#define UHCI_SEND_S_Q_INT_ST_S 14 +/* UHCI_OUT_TOTAL_EOF_INT_ST : RO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_OUT_TOTAL_EOF_INT_ST (BIT(13)) +#define UHCI_OUT_TOTAL_EOF_INT_ST_M (BIT(13)) +#define UHCI_OUT_TOTAL_EOF_INT_ST_V 0x1 +#define UHCI_OUT_TOTAL_EOF_INT_ST_S 13 +/* UHCI_OUTLINK_EOF_ERR_INT_ST : RO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_OUTLINK_EOF_ERR_INT_ST (BIT(12)) +#define UHCI_OUTLINK_EOF_ERR_INT_ST_M (BIT(12)) +#define UHCI_OUTLINK_EOF_ERR_INT_ST_V 0x1 +#define UHCI_OUTLINK_EOF_ERR_INT_ST_S 12 +/* UHCI_IN_DSCR_EMPTY_INT_ST : RO ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_IN_DSCR_EMPTY_INT_ST (BIT(11)) +#define UHCI_IN_DSCR_EMPTY_INT_ST_M (BIT(11)) +#define UHCI_IN_DSCR_EMPTY_INT_ST_V 0x1 +#define UHCI_IN_DSCR_EMPTY_INT_ST_S 11 +/* UHCI_OUT_DSCR_ERR_INT_ST : RO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_OUT_DSCR_ERR_INT_ST (BIT(10)) +#define UHCI_OUT_DSCR_ERR_INT_ST_M (BIT(10)) +#define UHCI_OUT_DSCR_ERR_INT_ST_V 0x1 +#define UHCI_OUT_DSCR_ERR_INT_ST_S 10 +/* UHCI_IN_DSCR_ERR_INT_ST : RO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_IN_DSCR_ERR_INT_ST (BIT(9)) +#define UHCI_IN_DSCR_ERR_INT_ST_M (BIT(9)) +#define UHCI_IN_DSCR_ERR_INT_ST_V 0x1 +#define UHCI_IN_DSCR_ERR_INT_ST_S 9 +/* UHCI_OUT_EOF_INT_ST : RO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_OUT_EOF_INT_ST (BIT(8)) +#define UHCI_OUT_EOF_INT_ST_M (BIT(8)) +#define UHCI_OUT_EOF_INT_ST_V 0x1 +#define UHCI_OUT_EOF_INT_ST_S 8 +/* UHCI_OUT_DONE_INT_ST : RO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_OUT_DONE_INT_ST (BIT(7)) +#define UHCI_OUT_DONE_INT_ST_M (BIT(7)) +#define UHCI_OUT_DONE_INT_ST_V 0x1 +#define UHCI_OUT_DONE_INT_ST_S 7 +/* UHCI_IN_ERR_EOF_INT_ST : RO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_IN_ERR_EOF_INT_ST (BIT(6)) +#define UHCI_IN_ERR_EOF_INT_ST_M (BIT(6)) +#define UHCI_IN_ERR_EOF_INT_ST_V 0x1 +#define UHCI_IN_ERR_EOF_INT_ST_S 6 +/* UHCI_IN_SUC_EOF_INT_ST : RO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_IN_SUC_EOF_INT_ST (BIT(5)) +#define UHCI_IN_SUC_EOF_INT_ST_M (BIT(5)) +#define UHCI_IN_SUC_EOF_INT_ST_V 0x1 +#define UHCI_IN_SUC_EOF_INT_ST_S 5 +/* UHCI_IN_DONE_INT_ST : RO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_IN_DONE_INT_ST (BIT(4)) +#define UHCI_IN_DONE_INT_ST_M (BIT(4)) +#define UHCI_IN_DONE_INT_ST_V 0x1 +#define UHCI_IN_DONE_INT_ST_S 4 +/* UHCI_TX_HUNG_INT_ST : RO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_TX_HUNG_INT_ST (BIT(3)) +#define UHCI_TX_HUNG_INT_ST_M (BIT(3)) +#define UHCI_TX_HUNG_INT_ST_V 0x1 +#define UHCI_TX_HUNG_INT_ST_S 3 +/* UHCI_RX_HUNG_INT_ST : RO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_RX_HUNG_INT_ST (BIT(2)) +#define UHCI_RX_HUNG_INT_ST_M (BIT(2)) +#define UHCI_RX_HUNG_INT_ST_V 0x1 +#define UHCI_RX_HUNG_INT_ST_S 2 +/* UHCI_TX_START_INT_ST : RO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_TX_START_INT_ST (BIT(1)) +#define UHCI_TX_START_INT_ST_M (BIT(1)) +#define UHCI_TX_START_INT_ST_V 0x1 +#define UHCI_TX_START_INT_ST_S 1 +/* UHCI_RX_START_INT_ST : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_RX_START_INT_ST (BIT(0)) +#define UHCI_RX_START_INT_ST_M (BIT(0)) +#define UHCI_RX_START_INT_ST_V 0x1 +#define UHCI_RX_START_INT_ST_S 0 + +#define UHCI_INT_ENA_REG(i) (REG_UHCI_BASE(i) + 0xC) +/* UHCI_DMA_INFIFO_FULL_WM_INT_ENA : R/W ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_DMA_INFIFO_FULL_WM_INT_ENA (BIT(16)) +#define UHCI_DMA_INFIFO_FULL_WM_INT_ENA_M (BIT(16)) +#define UHCI_DMA_INFIFO_FULL_WM_INT_ENA_V 0x1 +#define UHCI_DMA_INFIFO_FULL_WM_INT_ENA_S 16 +/* UHCI_SEND_A_Q_INT_ENA : R/W ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_SEND_A_Q_INT_ENA (BIT(15)) +#define UHCI_SEND_A_Q_INT_ENA_M (BIT(15)) +#define UHCI_SEND_A_Q_INT_ENA_V 0x1 +#define UHCI_SEND_A_Q_INT_ENA_S 15 +/* UHCI_SEND_S_Q_INT_ENA : R/W ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_SEND_S_Q_INT_ENA (BIT(14)) +#define UHCI_SEND_S_Q_INT_ENA_M (BIT(14)) +#define UHCI_SEND_S_Q_INT_ENA_V 0x1 +#define UHCI_SEND_S_Q_INT_ENA_S 14 +/* UHCI_OUT_TOTAL_EOF_INT_ENA : R/W ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_OUT_TOTAL_EOF_INT_ENA (BIT(13)) +#define UHCI_OUT_TOTAL_EOF_INT_ENA_M (BIT(13)) +#define UHCI_OUT_TOTAL_EOF_INT_ENA_V 0x1 +#define UHCI_OUT_TOTAL_EOF_INT_ENA_S 13 +/* UHCI_OUTLINK_EOF_ERR_INT_ENA : R/W ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_OUTLINK_EOF_ERR_INT_ENA (BIT(12)) +#define UHCI_OUTLINK_EOF_ERR_INT_ENA_M (BIT(12)) +#define UHCI_OUTLINK_EOF_ERR_INT_ENA_V 0x1 +#define UHCI_OUTLINK_EOF_ERR_INT_ENA_S 12 +/* UHCI_IN_DSCR_EMPTY_INT_ENA : R/W ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_IN_DSCR_EMPTY_INT_ENA (BIT(11)) +#define UHCI_IN_DSCR_EMPTY_INT_ENA_M (BIT(11)) +#define UHCI_IN_DSCR_EMPTY_INT_ENA_V 0x1 +#define UHCI_IN_DSCR_EMPTY_INT_ENA_S 11 +/* UHCI_OUT_DSCR_ERR_INT_ENA : R/W ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_OUT_DSCR_ERR_INT_ENA (BIT(10)) +#define UHCI_OUT_DSCR_ERR_INT_ENA_M (BIT(10)) +#define UHCI_OUT_DSCR_ERR_INT_ENA_V 0x1 +#define UHCI_OUT_DSCR_ERR_INT_ENA_S 10 +/* UHCI_IN_DSCR_ERR_INT_ENA : R/W ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_IN_DSCR_ERR_INT_ENA (BIT(9)) +#define UHCI_IN_DSCR_ERR_INT_ENA_M (BIT(9)) +#define UHCI_IN_DSCR_ERR_INT_ENA_V 0x1 +#define UHCI_IN_DSCR_ERR_INT_ENA_S 9 +/* UHCI_OUT_EOF_INT_ENA : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_OUT_EOF_INT_ENA (BIT(8)) +#define UHCI_OUT_EOF_INT_ENA_M (BIT(8)) +#define UHCI_OUT_EOF_INT_ENA_V 0x1 +#define UHCI_OUT_EOF_INT_ENA_S 8 +/* UHCI_OUT_DONE_INT_ENA : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_OUT_DONE_INT_ENA (BIT(7)) +#define UHCI_OUT_DONE_INT_ENA_M (BIT(7)) +#define UHCI_OUT_DONE_INT_ENA_V 0x1 +#define UHCI_OUT_DONE_INT_ENA_S 7 +/* UHCI_IN_ERR_EOF_INT_ENA : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_IN_ERR_EOF_INT_ENA (BIT(6)) +#define UHCI_IN_ERR_EOF_INT_ENA_M (BIT(6)) +#define UHCI_IN_ERR_EOF_INT_ENA_V 0x1 +#define UHCI_IN_ERR_EOF_INT_ENA_S 6 +/* UHCI_IN_SUC_EOF_INT_ENA : R/W ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_IN_SUC_EOF_INT_ENA (BIT(5)) +#define UHCI_IN_SUC_EOF_INT_ENA_M (BIT(5)) +#define UHCI_IN_SUC_EOF_INT_ENA_V 0x1 +#define UHCI_IN_SUC_EOF_INT_ENA_S 5 +/* UHCI_IN_DONE_INT_ENA : R/W ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_IN_DONE_INT_ENA (BIT(4)) +#define UHCI_IN_DONE_INT_ENA_M (BIT(4)) +#define UHCI_IN_DONE_INT_ENA_V 0x1 +#define UHCI_IN_DONE_INT_ENA_S 4 +/* UHCI_TX_HUNG_INT_ENA : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_TX_HUNG_INT_ENA (BIT(3)) +#define UHCI_TX_HUNG_INT_ENA_M (BIT(3)) +#define UHCI_TX_HUNG_INT_ENA_V 0x1 +#define UHCI_TX_HUNG_INT_ENA_S 3 +/* UHCI_RX_HUNG_INT_ENA : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_RX_HUNG_INT_ENA (BIT(2)) +#define UHCI_RX_HUNG_INT_ENA_M (BIT(2)) +#define UHCI_RX_HUNG_INT_ENA_V 0x1 +#define UHCI_RX_HUNG_INT_ENA_S 2 +/* UHCI_TX_START_INT_ENA : R/W ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_TX_START_INT_ENA (BIT(1)) +#define UHCI_TX_START_INT_ENA_M (BIT(1)) +#define UHCI_TX_START_INT_ENA_V 0x1 +#define UHCI_TX_START_INT_ENA_S 1 +/* UHCI_RX_START_INT_ENA : R/W ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_RX_START_INT_ENA (BIT(0)) +#define UHCI_RX_START_INT_ENA_M (BIT(0)) +#define UHCI_RX_START_INT_ENA_V 0x1 +#define UHCI_RX_START_INT_ENA_S 0 + +#define UHCI_INT_CLR_REG(i) (REG_UHCI_BASE(i) + 0x10) +/* UHCI_DMA_INFIFO_FULL_WM_INT_CLR : WO ;bitpos:[16] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_DMA_INFIFO_FULL_WM_INT_CLR (BIT(16)) +#define UHCI_DMA_INFIFO_FULL_WM_INT_CLR_M (BIT(16)) +#define UHCI_DMA_INFIFO_FULL_WM_INT_CLR_V 0x1 +#define UHCI_DMA_INFIFO_FULL_WM_INT_CLR_S 16 +/* UHCI_SEND_A_Q_INT_CLR : WO ;bitpos:[15] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_SEND_A_Q_INT_CLR (BIT(15)) +#define UHCI_SEND_A_Q_INT_CLR_M (BIT(15)) +#define UHCI_SEND_A_Q_INT_CLR_V 0x1 +#define UHCI_SEND_A_Q_INT_CLR_S 15 +/* UHCI_SEND_S_Q_INT_CLR : WO ;bitpos:[14] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_SEND_S_Q_INT_CLR (BIT(14)) +#define UHCI_SEND_S_Q_INT_CLR_M (BIT(14)) +#define UHCI_SEND_S_Q_INT_CLR_V 0x1 +#define UHCI_SEND_S_Q_INT_CLR_S 14 +/* UHCI_OUT_TOTAL_EOF_INT_CLR : WO ;bitpos:[13] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_OUT_TOTAL_EOF_INT_CLR (BIT(13)) +#define UHCI_OUT_TOTAL_EOF_INT_CLR_M (BIT(13)) +#define UHCI_OUT_TOTAL_EOF_INT_CLR_V 0x1 +#define UHCI_OUT_TOTAL_EOF_INT_CLR_S 13 +/* UHCI_OUTLINK_EOF_ERR_INT_CLR : WO ;bitpos:[12] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_OUTLINK_EOF_ERR_INT_CLR (BIT(12)) +#define UHCI_OUTLINK_EOF_ERR_INT_CLR_M (BIT(12)) +#define UHCI_OUTLINK_EOF_ERR_INT_CLR_V 0x1 +#define UHCI_OUTLINK_EOF_ERR_INT_CLR_S 12 +/* UHCI_IN_DSCR_EMPTY_INT_CLR : WO ;bitpos:[11] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_IN_DSCR_EMPTY_INT_CLR (BIT(11)) +#define UHCI_IN_DSCR_EMPTY_INT_CLR_M (BIT(11)) +#define UHCI_IN_DSCR_EMPTY_INT_CLR_V 0x1 +#define UHCI_IN_DSCR_EMPTY_INT_CLR_S 11 +/* UHCI_OUT_DSCR_ERR_INT_CLR : WO ;bitpos:[10] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_OUT_DSCR_ERR_INT_CLR (BIT(10)) +#define UHCI_OUT_DSCR_ERR_INT_CLR_M (BIT(10)) +#define UHCI_OUT_DSCR_ERR_INT_CLR_V 0x1 +#define UHCI_OUT_DSCR_ERR_INT_CLR_S 10 +/* UHCI_IN_DSCR_ERR_INT_CLR : WO ;bitpos:[9] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_IN_DSCR_ERR_INT_CLR (BIT(9)) +#define UHCI_IN_DSCR_ERR_INT_CLR_M (BIT(9)) +#define UHCI_IN_DSCR_ERR_INT_CLR_V 0x1 +#define UHCI_IN_DSCR_ERR_INT_CLR_S 9 +/* UHCI_OUT_EOF_INT_CLR : WO ;bitpos:[8] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_OUT_EOF_INT_CLR (BIT(8)) +#define UHCI_OUT_EOF_INT_CLR_M (BIT(8)) +#define UHCI_OUT_EOF_INT_CLR_V 0x1 +#define UHCI_OUT_EOF_INT_CLR_S 8 +/* UHCI_OUT_DONE_INT_CLR : WO ;bitpos:[7] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_OUT_DONE_INT_CLR (BIT(7)) +#define UHCI_OUT_DONE_INT_CLR_M (BIT(7)) +#define UHCI_OUT_DONE_INT_CLR_V 0x1 +#define UHCI_OUT_DONE_INT_CLR_S 7 +/* UHCI_IN_ERR_EOF_INT_CLR : WO ;bitpos:[6] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_IN_ERR_EOF_INT_CLR (BIT(6)) +#define UHCI_IN_ERR_EOF_INT_CLR_M (BIT(6)) +#define UHCI_IN_ERR_EOF_INT_CLR_V 0x1 +#define UHCI_IN_ERR_EOF_INT_CLR_S 6 +/* UHCI_IN_SUC_EOF_INT_CLR : WO ;bitpos:[5] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_IN_SUC_EOF_INT_CLR (BIT(5)) +#define UHCI_IN_SUC_EOF_INT_CLR_M (BIT(5)) +#define UHCI_IN_SUC_EOF_INT_CLR_V 0x1 +#define UHCI_IN_SUC_EOF_INT_CLR_S 5 +/* UHCI_IN_DONE_INT_CLR : WO ;bitpos:[4] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_IN_DONE_INT_CLR (BIT(4)) +#define UHCI_IN_DONE_INT_CLR_M (BIT(4)) +#define UHCI_IN_DONE_INT_CLR_V 0x1 +#define UHCI_IN_DONE_INT_CLR_S 4 +/* UHCI_TX_HUNG_INT_CLR : WO ;bitpos:[3] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_TX_HUNG_INT_CLR (BIT(3)) +#define UHCI_TX_HUNG_INT_CLR_M (BIT(3)) +#define UHCI_TX_HUNG_INT_CLR_V 0x1 +#define UHCI_TX_HUNG_INT_CLR_S 3 +/* UHCI_RX_HUNG_INT_CLR : WO ;bitpos:[2] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_RX_HUNG_INT_CLR (BIT(2)) +#define UHCI_RX_HUNG_INT_CLR_M (BIT(2)) +#define UHCI_RX_HUNG_INT_CLR_V 0x1 +#define UHCI_RX_HUNG_INT_CLR_S 2 +/* UHCI_TX_START_INT_CLR : WO ;bitpos:[1] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_TX_START_INT_CLR (BIT(1)) +#define UHCI_TX_START_INT_CLR_M (BIT(1)) +#define UHCI_TX_START_INT_CLR_V 0x1 +#define UHCI_TX_START_INT_CLR_S 1 +/* UHCI_RX_START_INT_CLR : WO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_RX_START_INT_CLR (BIT(0)) +#define UHCI_RX_START_INT_CLR_M (BIT(0)) +#define UHCI_RX_START_INT_CLR_V 0x1 +#define UHCI_RX_START_INT_CLR_S 0 + +#define UHCI_DMA_OUT_STATUS_REG(i) (REG_UHCI_BASE(i) + 0x14) +/* UHCI_OUT_EMPTY : RO ;bitpos:[1] ;default: 1'b1 ; */ +/*description: 1:DMA in link descriptor's fifo is empty.*/ +#define UHCI_OUT_EMPTY (BIT(1)) +#define UHCI_OUT_EMPTY_M (BIT(1)) +#define UHCI_OUT_EMPTY_V 0x1 +#define UHCI_OUT_EMPTY_S 1 +/* UHCI_OUT_FULL : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: 1:DMA out link descriptor's fifo is full.*/ +#define UHCI_OUT_FULL (BIT(0)) +#define UHCI_OUT_FULL_M (BIT(0)) +#define UHCI_OUT_FULL_V 0x1 +#define UHCI_OUT_FULL_S 0 + +#define UHCI_DMA_OUT_PUSH_REG(i) (REG_UHCI_BASE(i) + 0x18) +/* UHCI_OUTFIFO_PUSH : R/W ;bitpos:[16] ;default: 1'h0 ; */ +/*description: Set this bit to push data in out link descriptor's fifo.*/ +#define UHCI_OUTFIFO_PUSH (BIT(16)) +#define UHCI_OUTFIFO_PUSH_M (BIT(16)) +#define UHCI_OUTFIFO_PUSH_V 0x1 +#define UHCI_OUTFIFO_PUSH_S 16 +/* UHCI_OUTFIFO_WDATA : R/W ;bitpos:[8:0] ;default: 9'h0 ; */ +/*description: This is the data need to be pushed into out link descriptor's fifo.*/ +#define UHCI_OUTFIFO_WDATA 0x000001FF +#define UHCI_OUTFIFO_WDATA_M ((UHCI_OUTFIFO_WDATA_V)<<(UHCI_OUTFIFO_WDATA_S)) +#define UHCI_OUTFIFO_WDATA_V 0x1FF +#define UHCI_OUTFIFO_WDATA_S 0 + +#define UHCI_DMA_IN_STATUS_REG(i) (REG_UHCI_BASE(i) + 0x1C) +/* UHCI_RX_ERR_CAUSE : RO ;bitpos:[6:4] ;default: 3'h0 ; */ +/*description: This register stores the errors caused in out link descriptor's data packet.*/ +#define UHCI_RX_ERR_CAUSE 0x00000007 +#define UHCI_RX_ERR_CAUSE_M ((UHCI_RX_ERR_CAUSE_V)<<(UHCI_RX_ERR_CAUSE_S)) +#define UHCI_RX_ERR_CAUSE_V 0x7 +#define UHCI_RX_ERR_CAUSE_S 4 +/* UHCI_IN_EMPTY : RO ;bitpos:[1] ;default: 1'b1 ; */ +/*description: */ +#define UHCI_IN_EMPTY (BIT(1)) +#define UHCI_IN_EMPTY_M (BIT(1)) +#define UHCI_IN_EMPTY_V 0x1 +#define UHCI_IN_EMPTY_S 1 +/* UHCI_IN_FULL : RO ;bitpos:[0] ;default: 1'b0 ; */ +/*description: */ +#define UHCI_IN_FULL (BIT(0)) +#define UHCI_IN_FULL_M (BIT(0)) +#define UHCI_IN_FULL_V 0x1 +#define UHCI_IN_FULL_S 0 + +#define UHCI_DMA_IN_POP_REG(i) (REG_UHCI_BASE(i) + 0x20) +/* UHCI_INFIFO_POP : R/W ;bitpos:[16] ;default: 1'h0 ; */ +/*description: Set this bit to pop data in in link descriptor's fifo.*/ +#define UHCI_INFIFO_POP (BIT(16)) +#define UHCI_INFIFO_POP_M (BIT(16)) +#define UHCI_INFIFO_POP_V 0x1 +#define UHCI_INFIFO_POP_S 16 +/* UHCI_INFIFO_RDATA : RO ;bitpos:[11:0] ;default: 12'h0 ; */ +/*description: This register stores the data pop from in link descriptor's fifo.*/ +#define UHCI_INFIFO_RDATA 0x00000FFF +#define UHCI_INFIFO_RDATA_M ((UHCI_INFIFO_RDATA_V)<<(UHCI_INFIFO_RDATA_S)) +#define UHCI_INFIFO_RDATA_V 0xFFF +#define UHCI_INFIFO_RDATA_S 0 + +#define UHCI_DMA_OUT_LINK_REG(i) (REG_UHCI_BASE(i) + 0x24) +/* UHCI_OUTLINK_PARK : RO ;bitpos:[31] ;default: 1'h0 ; */ +/*description: 1£º the out link descriptor's fsm is in idle state. 0:the out + link descriptor's fsm is working.*/ +#define UHCI_OUTLINK_PARK (BIT(31)) +#define UHCI_OUTLINK_PARK_M (BIT(31)) +#define UHCI_OUTLINK_PARK_V 0x1 +#define UHCI_OUTLINK_PARK_S 31 +/* UHCI_OUTLINK_RESTART : R/W ;bitpos:[30] ;default: 1'b0 ; */ +/*description: Set this bit to mount on new out link descriptors*/ +#define UHCI_OUTLINK_RESTART (BIT(30)) +#define UHCI_OUTLINK_RESTART_M (BIT(30)) +#define UHCI_OUTLINK_RESTART_V 0x1 +#define UHCI_OUTLINK_RESTART_S 30 +/* UHCI_OUTLINK_START : R/W ;bitpos:[29] ;default: 1'b0 ; */ +/*description: Set this bit to start dealing with the out link descriptors.*/ +#define UHCI_OUTLINK_START (BIT(29)) +#define UHCI_OUTLINK_START_M (BIT(29)) +#define UHCI_OUTLINK_START_V 0x1 +#define UHCI_OUTLINK_START_S 29 +/* UHCI_OUTLINK_STOP : R/W ;bitpos:[28] ;default: 1'b0 ; */ +/*description: Set this bit to stop dealing with the out link descriptors.*/ +#define UHCI_OUTLINK_STOP (BIT(28)) +#define UHCI_OUTLINK_STOP_M (BIT(28)) +#define UHCI_OUTLINK_STOP_V 0x1 +#define UHCI_OUTLINK_STOP_S 28 +/* UHCI_OUTLINK_ADDR : R/W ;bitpos:[19:0] ;default: 20'h0 ; */ +/*description: This register stores the least 20 bits of the first out link + descriptor's address.*/ +#define UHCI_OUTLINK_ADDR 0x000FFFFF +#define UHCI_OUTLINK_ADDR_M ((UHCI_OUTLINK_ADDR_V)<<(UHCI_OUTLINK_ADDR_S)) +#define UHCI_OUTLINK_ADDR_V 0xFFFFF +#define UHCI_OUTLINK_ADDR_S 0 + +#define UHCI_DMA_IN_LINK_REG(i) (REG_UHCI_BASE(i) + 0x28) +/* UHCI_INLINK_PARK : RO ;bitpos:[31] ;default: 1'h0 ; */ +/*description: 1:the in link descriptor's fsm is in idle state. 0:the in link + descriptor's fsm is working*/ +#define UHCI_INLINK_PARK (BIT(31)) +#define UHCI_INLINK_PARK_M (BIT(31)) +#define UHCI_INLINK_PARK_V 0x1 +#define UHCI_INLINK_PARK_S 31 +/* UHCI_INLINK_RESTART : R/W ;bitpos:[30] ;default: 1'b0 ; */ +/*description: Set this bit to mount on new in link descriptors*/ +#define UHCI_INLINK_RESTART (BIT(30)) +#define UHCI_INLINK_RESTART_M (BIT(30)) +#define UHCI_INLINK_RESTART_V 0x1 +#define UHCI_INLINK_RESTART_S 30 +/* UHCI_INLINK_START : R/W ;bitpos:[29] ;default: 1'b0 ; */ +/*description: Set this bit to start dealing with the in link descriptors.*/ +#define UHCI_INLINK_START (BIT(29)) +#define UHCI_INLINK_START_M (BIT(29)) +#define UHCI_INLINK_START_V 0x1 +#define UHCI_INLINK_START_S 29 +/* UHCI_INLINK_STOP : R/W ;bitpos:[28] ;default: 1'b0 ; */ +/*description: Set this bit to stop dealing with the in link descriptors.*/ +#define UHCI_INLINK_STOP (BIT(28)) +#define UHCI_INLINK_STOP_M (BIT(28)) +#define UHCI_INLINK_STOP_V 0x1 +#define UHCI_INLINK_STOP_S 28 +/* UHCI_INLINK_AUTO_RET : R/W ;bitpos:[20] ;default: 1'b1 ; */ +/*description: 1:when a packet is wrong in link descriptor returns to the descriptor + which is lately used.*/ +#define UHCI_INLINK_AUTO_RET (BIT(20)) +#define UHCI_INLINK_AUTO_RET_M (BIT(20)) +#define UHCI_INLINK_AUTO_RET_V 0x1 +#define UHCI_INLINK_AUTO_RET_S 20 +/* UHCI_INLINK_ADDR : R/W ;bitpos:[19:0] ;default: 20'h0 ; */ +/*description: This register stores the least 20 bits of the first in link descriptor's + address.*/ +#define UHCI_INLINK_ADDR 0x000FFFFF +#define UHCI_INLINK_ADDR_M ((UHCI_INLINK_ADDR_V)<<(UHCI_INLINK_ADDR_S)) +#define UHCI_INLINK_ADDR_V 0xFFFFF +#define UHCI_INLINK_ADDR_S 0 + +#define UHCI_CONF1_REG(i) (REG_UHCI_BASE(i) + 0x2C) +/* UHCI_DMA_INFIFO_FULL_THRS : R/W ;bitpos:[20:9] ;default: 12'b0 ; */ +/*description: when data amount in link descriptor's fifo is more than this + register value it will produce uhci_dma_infifo_full_wm_int interrupt.*/ +#define UHCI_DMA_INFIFO_FULL_THRS 0x00000FFF +#define UHCI_DMA_INFIFO_FULL_THRS_M ((UHCI_DMA_INFIFO_FULL_THRS_V)<<(UHCI_DMA_INFIFO_FULL_THRS_S)) +#define UHCI_DMA_INFIFO_FULL_THRS_V 0xFFF +#define UHCI_DMA_INFIFO_FULL_THRS_S 9 +/* UHCI_SW_START : R/W ;bitpos:[8] ;default: 1'b0 ; */ +/*description: Set this bit to start inserting the packet header.*/ +#define UHCI_SW_START (BIT(8)) +#define UHCI_SW_START_M (BIT(8)) +#define UHCI_SW_START_V 0x1 +#define UHCI_SW_START_S 8 +/* UHCI_WAIT_SW_START : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: Set this bit to enable software way to add packet header.*/ +#define UHCI_WAIT_SW_START (BIT(7)) +#define UHCI_WAIT_SW_START_M (BIT(7)) +#define UHCI_WAIT_SW_START_V 0x1 +#define UHCI_WAIT_SW_START_S 7 +/* UHCI_CHECK_OWNER : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: Set this bit to check the owner bit in link descriptor.*/ +#define UHCI_CHECK_OWNER (BIT(6)) +#define UHCI_CHECK_OWNER_M (BIT(6)) +#define UHCI_CHECK_OWNER_V 0x1 +#define UHCI_CHECK_OWNER_S 6 +/* UHCI_TX_ACK_NUM_RE : R/W ;bitpos:[5] ;default: 1'b1 ; */ +/*description: Set this bit to enable hardware replace ack num in packet header automatically.*/ +#define UHCI_TX_ACK_NUM_RE (BIT(5)) +#define UHCI_TX_ACK_NUM_RE_M (BIT(5)) +#define UHCI_TX_ACK_NUM_RE_V 0x1 +#define UHCI_TX_ACK_NUM_RE_S 5 +/* UHCI_TX_CHECK_SUM_RE : R/W ;bitpos:[4] ;default: 1'b1 ; */ +/*description: Set this bit to enable hardware replace check_sum in packet header + automatically.*/ +#define UHCI_TX_CHECK_SUM_RE (BIT(4)) +#define UHCI_TX_CHECK_SUM_RE_M (BIT(4)) +#define UHCI_TX_CHECK_SUM_RE_V 0x1 +#define UHCI_TX_CHECK_SUM_RE_S 4 +/* UHCI_SAVE_HEAD : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: Set this bit to save packet header .*/ +#define UHCI_SAVE_HEAD (BIT(3)) +#define UHCI_SAVE_HEAD_M (BIT(3)) +#define UHCI_SAVE_HEAD_V 0x1 +#define UHCI_SAVE_HEAD_S 3 +/* UHCI_CRC_DISABLE : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: Set this bit to disable crc calculation.*/ +#define UHCI_CRC_DISABLE (BIT(2)) +#define UHCI_CRC_DISABLE_M (BIT(2)) +#define UHCI_CRC_DISABLE_V 0x1 +#define UHCI_CRC_DISABLE_S 2 +/* UHCI_CHECK_SEQ_EN : R/W ;bitpos:[1] ;default: 1'b1 ; */ +/*description: Set this bit to enable decoder to check seq num in packet header.*/ +#define UHCI_CHECK_SEQ_EN (BIT(1)) +#define UHCI_CHECK_SEQ_EN_M (BIT(1)) +#define UHCI_CHECK_SEQ_EN_V 0x1 +#define UHCI_CHECK_SEQ_EN_S 1 +/* UHCI_CHECK_SUM_EN : R/W ;bitpos:[0] ;default: 1'b1 ; */ +/*description: Set this bit to enable decoder to check check_sum in packet header.*/ +#define UHCI_CHECK_SUM_EN (BIT(0)) +#define UHCI_CHECK_SUM_EN_M (BIT(0)) +#define UHCI_CHECK_SUM_EN_V 0x1 +#define UHCI_CHECK_SUM_EN_S 0 + +#define UHCI_STATE0_REG(i) (REG_UHCI_BASE(i) + 0x30) +/* UHCI_STATE0 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define UHCI_STATE0 0xFFFFFFFF +#define UHCI_STATE0_M ((UHCI_STATE0_V)<<(UHCI_STATE0_S)) +#define UHCI_STATE0_V 0xFFFFFFFF +#define UHCI_STATE0_S 0 + +#define UHCI_STATE1_REG(i) (REG_UHCI_BASE(i) + 0x34) +/* UHCI_STATE1 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: */ +#define UHCI_STATE1 0xFFFFFFFF +#define UHCI_STATE1_M ((UHCI_STATE1_V)<<(UHCI_STATE1_S)) +#define UHCI_STATE1_V 0xFFFFFFFF +#define UHCI_STATE1_S 0 + +#define UHCI_DMA_OUT_EOF_DES_ADDR_REG(i) (REG_UHCI_BASE(i) + 0x38) +/* UHCI_OUT_EOF_DES_ADDR : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: This register stores the address of out link descriptoir when + eof bit in this descriptor is 1.*/ +#define UHCI_OUT_EOF_DES_ADDR 0xFFFFFFFF +#define UHCI_OUT_EOF_DES_ADDR_M ((UHCI_OUT_EOF_DES_ADDR_V)<<(UHCI_OUT_EOF_DES_ADDR_S)) +#define UHCI_OUT_EOF_DES_ADDR_V 0xFFFFFFFF +#define UHCI_OUT_EOF_DES_ADDR_S 0 + +#define UHCI_DMA_IN_SUC_EOF_DES_ADDR_REG(i) (REG_UHCI_BASE(i) + 0x3C) +/* UHCI_IN_SUC_EOF_DES_ADDR : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: This register stores the address of in link descriptor when eof + bit in this descriptor is 1.*/ +#define UHCI_IN_SUC_EOF_DES_ADDR 0xFFFFFFFF +#define UHCI_IN_SUC_EOF_DES_ADDR_M ((UHCI_IN_SUC_EOF_DES_ADDR_V)<<(UHCI_IN_SUC_EOF_DES_ADDR_S)) +#define UHCI_IN_SUC_EOF_DES_ADDR_V 0xFFFFFFFF +#define UHCI_IN_SUC_EOF_DES_ADDR_S 0 + +#define UHCI_DMA_IN_ERR_EOF_DES_ADDR_REG(i) (REG_UHCI_BASE(i) + 0x40) +/* UHCI_IN_ERR_EOF_DES_ADDR : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: This register stores the address of in link descriptor when there + are some errors in this descriptor.*/ +#define UHCI_IN_ERR_EOF_DES_ADDR 0xFFFFFFFF +#define UHCI_IN_ERR_EOF_DES_ADDR_M ((UHCI_IN_ERR_EOF_DES_ADDR_V)<<(UHCI_IN_ERR_EOF_DES_ADDR_S)) +#define UHCI_IN_ERR_EOF_DES_ADDR_V 0xFFFFFFFF +#define UHCI_IN_ERR_EOF_DES_ADDR_S 0 + +#define UHCI_DMA_OUT_EOF_BFR_DES_ADDR_REG(i) (REG_UHCI_BASE(i) + 0x44) +/* UHCI_OUT_EOF_BFR_DES_ADDR : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: This register stores the address of out link descriptor when + there are some errors in this descriptor.*/ +#define UHCI_OUT_EOF_BFR_DES_ADDR 0xFFFFFFFF +#define UHCI_OUT_EOF_BFR_DES_ADDR_M ((UHCI_OUT_EOF_BFR_DES_ADDR_V)<<(UHCI_OUT_EOF_BFR_DES_ADDR_S)) +#define UHCI_OUT_EOF_BFR_DES_ADDR_V 0xFFFFFFFF +#define UHCI_OUT_EOF_BFR_DES_ADDR_S 0 + +#define UHCI_AHB_TEST_REG(i) (REG_UHCI_BASE(i) + 0x48) +/* UHCI_AHB_TESTADDR : R/W ;bitpos:[5:4] ;default: 2'b0 ; */ +/*description: The two bits represent ahb bus address bit[20:19]*/ +#define UHCI_AHB_TESTADDR 0x00000003 +#define UHCI_AHB_TESTADDR_M ((UHCI_AHB_TESTADDR_V)<<(UHCI_AHB_TESTADDR_S)) +#define UHCI_AHB_TESTADDR_V 0x3 +#define UHCI_AHB_TESTADDR_S 4 +/* UHCI_AHB_TESTMODE : R/W ;bitpos:[2:0] ;default: 3'b0 ; */ +/*description: bit2 is ahb bus test enable ,bit1 is used to choose wrtie(1) + or read(0) mode. bit0 is used to choose test only once(1) or continue(0)*/ +#define UHCI_AHB_TESTMODE 0x00000007 +#define UHCI_AHB_TESTMODE_M ((UHCI_AHB_TESTMODE_V)<<(UHCI_AHB_TESTMODE_S)) +#define UHCI_AHB_TESTMODE_V 0x7 +#define UHCI_AHB_TESTMODE_S 0 + +#define UHCI_DMA_IN_DSCR_REG(i) (REG_UHCI_BASE(i) + 0x4C) +/* UHCI_INLINK_DSCR : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: The content of current in link descriptor's third dword*/ +#define UHCI_INLINK_DSCR 0xFFFFFFFF +#define UHCI_INLINK_DSCR_M ((UHCI_INLINK_DSCR_V)<<(UHCI_INLINK_DSCR_S)) +#define UHCI_INLINK_DSCR_V 0xFFFFFFFF +#define UHCI_INLINK_DSCR_S 0 + +#define UHCI_DMA_IN_DSCR_BF0_REG(i) (REG_UHCI_BASE(i) + 0x50) +/* UHCI_INLINK_DSCR_BF0 : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: The content of current in link descriptor's first dword*/ +#define UHCI_INLINK_DSCR_BF0 0xFFFFFFFF +#define UHCI_INLINK_DSCR_BF0_M ((UHCI_INLINK_DSCR_BF0_V)<<(UHCI_INLINK_DSCR_BF0_S)) +#define UHCI_INLINK_DSCR_BF0_V 0xFFFFFFFF +#define UHCI_INLINK_DSCR_BF0_S 0 + +#define UHCI_DMA_IN_DSCR_BF1_REG(i) (REG_UHCI_BASE(i) + 0x54) +/* UHCI_INLINK_DSCR_BF1 : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: The content of current in link descriptor's second dword*/ +#define UHCI_INLINK_DSCR_BF1 0xFFFFFFFF +#define UHCI_INLINK_DSCR_BF1_M ((UHCI_INLINK_DSCR_BF1_V)<<(UHCI_INLINK_DSCR_BF1_S)) +#define UHCI_INLINK_DSCR_BF1_V 0xFFFFFFFF +#define UHCI_INLINK_DSCR_BF1_S 0 + +#define UHCI_DMA_OUT_DSCR_REG(i) (REG_UHCI_BASE(i) + 0x58) +/* UHCI_OUTLINK_DSCR : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: The content of current out link descriptor's third dword*/ +#define UHCI_OUTLINK_DSCR 0xFFFFFFFF +#define UHCI_OUTLINK_DSCR_M ((UHCI_OUTLINK_DSCR_V)<<(UHCI_OUTLINK_DSCR_S)) +#define UHCI_OUTLINK_DSCR_V 0xFFFFFFFF +#define UHCI_OUTLINK_DSCR_S 0 + +#define UHCI_DMA_OUT_DSCR_BF0_REG(i) (REG_UHCI_BASE(i) + 0x5C) +/* UHCI_OUTLINK_DSCR_BF0 : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: The content of current out link descriptor's first dword*/ +#define UHCI_OUTLINK_DSCR_BF0 0xFFFFFFFF +#define UHCI_OUTLINK_DSCR_BF0_M ((UHCI_OUTLINK_DSCR_BF0_V)<<(UHCI_OUTLINK_DSCR_BF0_S)) +#define UHCI_OUTLINK_DSCR_BF0_V 0xFFFFFFFF +#define UHCI_OUTLINK_DSCR_BF0_S 0 + +#define UHCI_DMA_OUT_DSCR_BF1_REG(i) (REG_UHCI_BASE(i) + 0x60) +/* UHCI_OUTLINK_DSCR_BF1 : RO ;bitpos:[31:0] ;default: 32'b0 ; */ +/*description: The content of current out link descriptor's second dword*/ +#define UHCI_OUTLINK_DSCR_BF1 0xFFFFFFFF +#define UHCI_OUTLINK_DSCR_BF1_M ((UHCI_OUTLINK_DSCR_BF1_V)<<(UHCI_OUTLINK_DSCR_BF1_S)) +#define UHCI_OUTLINK_DSCR_BF1_V 0xFFFFFFFF +#define UHCI_OUTLINK_DSCR_BF1_S 0 + +#define UHCI_ESCAPE_CONF_REG(i) (REG_UHCI_BASE(i) + 0x64) +/* UHCI_RX_13_ESC_EN : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: Set this bit to enable flow control char 0x13 replace when DMA sends data.*/ +#define UHCI_RX_13_ESC_EN (BIT(7)) +#define UHCI_RX_13_ESC_EN_M (BIT(7)) +#define UHCI_RX_13_ESC_EN_V 0x1 +#define UHCI_RX_13_ESC_EN_S 7 +/* UHCI_RX_11_ESC_EN : R/W ;bitpos:[6] ;default: 1'b0 ; */ +/*description: Set this bit to enable flow control char 0x11 replace when DMA sends data.*/ +#define UHCI_RX_11_ESC_EN (BIT(6)) +#define UHCI_RX_11_ESC_EN_M (BIT(6)) +#define UHCI_RX_11_ESC_EN_V 0x1 +#define UHCI_RX_11_ESC_EN_S 6 +/* UHCI_RX_DB_ESC_EN : R/W ;bitpos:[5] ;default: 1'b1 ; */ +/*description: Set this bit to enable 0xdb char replace when DMA sends data.*/ +#define UHCI_RX_DB_ESC_EN (BIT(5)) +#define UHCI_RX_DB_ESC_EN_M (BIT(5)) +#define UHCI_RX_DB_ESC_EN_V 0x1 +#define UHCI_RX_DB_ESC_EN_S 5 +/* UHCI_RX_C0_ESC_EN : R/W ;bitpos:[4] ;default: 1'b1 ; */ +/*description: Set this bit to enable 0xc0 char replace when DMA sends data.*/ +#define UHCI_RX_C0_ESC_EN (BIT(4)) +#define UHCI_RX_C0_ESC_EN_M (BIT(4)) +#define UHCI_RX_C0_ESC_EN_V 0x1 +#define UHCI_RX_C0_ESC_EN_S 4 +/* UHCI_TX_13_ESC_EN : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: Set this bit to enable flow control char 0x13 decode when DMA receives data.*/ +#define UHCI_TX_13_ESC_EN (BIT(3)) +#define UHCI_TX_13_ESC_EN_M (BIT(3)) +#define UHCI_TX_13_ESC_EN_V 0x1 +#define UHCI_TX_13_ESC_EN_S 3 +/* UHCI_TX_11_ESC_EN : R/W ;bitpos:[2] ;default: 1'b0 ; */ +/*description: Set this bit to enable flow control char 0x11 decode when DMA receives data.*/ +#define UHCI_TX_11_ESC_EN (BIT(2)) +#define UHCI_TX_11_ESC_EN_M (BIT(2)) +#define UHCI_TX_11_ESC_EN_V 0x1 +#define UHCI_TX_11_ESC_EN_S 2 +/* UHCI_TX_DB_ESC_EN : R/W ;bitpos:[1] ;default: 1'b1 ; */ +/*description: Set this bit to enable 0xdb char decode when DMA receives data.*/ +#define UHCI_TX_DB_ESC_EN (BIT(1)) +#define UHCI_TX_DB_ESC_EN_M (BIT(1)) +#define UHCI_TX_DB_ESC_EN_V 0x1 +#define UHCI_TX_DB_ESC_EN_S 1 +/* UHCI_TX_C0_ESC_EN : R/W ;bitpos:[0] ;default: 1'b1 ; */ +/*description: Set this bit to enable 0xc0 char decode when DMA receives data.*/ +#define UHCI_TX_C0_ESC_EN (BIT(0)) +#define UHCI_TX_C0_ESC_EN_M (BIT(0)) +#define UHCI_TX_C0_ESC_EN_V 0x1 +#define UHCI_TX_C0_ESC_EN_S 0 + +#define UHCI_HUNG_CONF_REG(i) (REG_UHCI_BASE(i) + 0x68) +/* UHCI_RXFIFO_TIMEOUT_ENA : R/W ;bitpos:[23] ;default: 1'b1 ; */ +/*description: This is the enable bit for DMA send data timeout*/ +#define UHCI_RXFIFO_TIMEOUT_ENA (BIT(23)) +#define UHCI_RXFIFO_TIMEOUT_ENA_M (BIT(23)) +#define UHCI_RXFIFO_TIMEOUT_ENA_V 0x1 +#define UHCI_RXFIFO_TIMEOUT_ENA_S 23 +/* UHCI_RXFIFO_TIMEOUT_SHIFT : R/W ;bitpos:[22:20] ;default: 3'b0 ; */ +/*description: The tick count is cleared when its value >=(17'd8000>>reg_rxfifo_timeout_shift)*/ +#define UHCI_RXFIFO_TIMEOUT_SHIFT 0x00000007 +#define UHCI_RXFIFO_TIMEOUT_SHIFT_M ((UHCI_RXFIFO_TIMEOUT_SHIFT_V)<<(UHCI_RXFIFO_TIMEOUT_SHIFT_S)) +#define UHCI_RXFIFO_TIMEOUT_SHIFT_V 0x7 +#define UHCI_RXFIFO_TIMEOUT_SHIFT_S 20 +/* UHCI_RXFIFO_TIMEOUT : R/W ;bitpos:[19:12] ;default: 8'h10 ; */ +/*description: This register stores the timeout value.when DMA takes more time + than this register value to read a data from RAM it will produce uhci_rx_hung_int interrupt.*/ +#define UHCI_RXFIFO_TIMEOUT 0x000000FF +#define UHCI_RXFIFO_TIMEOUT_M ((UHCI_RXFIFO_TIMEOUT_V)<<(UHCI_RXFIFO_TIMEOUT_S)) +#define UHCI_RXFIFO_TIMEOUT_V 0xFF +#define UHCI_RXFIFO_TIMEOUT_S 12 +/* UHCI_TXFIFO_TIMEOUT_ENA : R/W ;bitpos:[11] ;default: 1'b1 ; */ +/*description: The enable bit for txfifo receive data timeout*/ +#define UHCI_TXFIFO_TIMEOUT_ENA (BIT(11)) +#define UHCI_TXFIFO_TIMEOUT_ENA_M (BIT(11)) +#define UHCI_TXFIFO_TIMEOUT_ENA_V 0x1 +#define UHCI_TXFIFO_TIMEOUT_ENA_S 11 +/* UHCI_TXFIFO_TIMEOUT_SHIFT : R/W ;bitpos:[10:8] ;default: 3'b0 ; */ +/*description: The tick count is cleared when its value >=(17'd8000>>reg_txfifo_timeout_shift)*/ +#define UHCI_TXFIFO_TIMEOUT_SHIFT 0x00000007 +#define UHCI_TXFIFO_TIMEOUT_SHIFT_M ((UHCI_TXFIFO_TIMEOUT_SHIFT_V)<<(UHCI_TXFIFO_TIMEOUT_SHIFT_S)) +#define UHCI_TXFIFO_TIMEOUT_SHIFT_V 0x7 +#define UHCI_TXFIFO_TIMEOUT_SHIFT_S 8 +/* UHCI_TXFIFO_TIMEOUT : R/W ;bitpos:[7:0] ;default: 8'h10 ; */ +/*description: This register stores the timeout value.when DMA takes more time + than this register value to receive a data it will produce uhci_tx_hung_int interrupt.*/ +#define UHCI_TXFIFO_TIMEOUT 0x000000FF +#define UHCI_TXFIFO_TIMEOUT_M ((UHCI_TXFIFO_TIMEOUT_V)<<(UHCI_TXFIFO_TIMEOUT_S)) +#define UHCI_TXFIFO_TIMEOUT_V 0xFF +#define UHCI_TXFIFO_TIMEOUT_S 0 + +#define UHCI_ACK_NUM_REG(i) (REG_UHCI_BASE(i) + 0x6C) + +#define UHCI_RX_HEAD_REG(i) (REG_UHCI_BASE(i) + 0x70) +/* UHCI_RX_HEAD : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: This register stores the packet header received by DMA*/ +#define UHCI_RX_HEAD 0xFFFFFFFF +#define UHCI_RX_HEAD_M ((UHCI_RX_HEAD_V)<<(UHCI_RX_HEAD_S)) +#define UHCI_RX_HEAD_V 0xFFFFFFFF +#define UHCI_RX_HEAD_S 0 + +#define UHCI_QUICK_SENT_REG(i) (REG_UHCI_BASE(i) + 0x74) +/* UHCI_ALWAYS_SEND_EN : R/W ;bitpos:[7] ;default: 1'b0 ; */ +/*description: Set this bit to enable continuously send the same short packet*/ +#define UHCI_ALWAYS_SEND_EN (BIT(7)) +#define UHCI_ALWAYS_SEND_EN_M (BIT(7)) +#define UHCI_ALWAYS_SEND_EN_V 0x1 +#define UHCI_ALWAYS_SEND_EN_S 7 +/* UHCI_ALWAYS_SEND_NUM : R/W ;bitpos:[6:4] ;default: 3'h0 ; */ +/*description: The bits are used to choose which short packet*/ +#define UHCI_ALWAYS_SEND_NUM 0x00000007 +#define UHCI_ALWAYS_SEND_NUM_M ((UHCI_ALWAYS_SEND_NUM_V)<<(UHCI_ALWAYS_SEND_NUM_S)) +#define UHCI_ALWAYS_SEND_NUM_V 0x7 +#define UHCI_ALWAYS_SEND_NUM_S 4 +/* UHCI_SINGLE_SEND_EN : R/W ;bitpos:[3] ;default: 1'b0 ; */ +/*description: Set this bit to enable send a short packet*/ +#define UHCI_SINGLE_SEND_EN (BIT(3)) +#define UHCI_SINGLE_SEND_EN_M (BIT(3)) +#define UHCI_SINGLE_SEND_EN_V 0x1 +#define UHCI_SINGLE_SEND_EN_S 3 +/* UHCI_SINGLE_SEND_NUM : R/W ;bitpos:[2:0] ;default: 3'h0 ; */ +/*description: The bits are used to choose which short packet*/ +#define UHCI_SINGLE_SEND_NUM 0x00000007 +#define UHCI_SINGLE_SEND_NUM_M ((UHCI_SINGLE_SEND_NUM_V)<<(UHCI_SINGLE_SEND_NUM_S)) +#define UHCI_SINGLE_SEND_NUM_V 0x7 +#define UHCI_SINGLE_SEND_NUM_S 0 + +#define UHCI_Q0_WORD0_REG(i) (REG_UHCI_BASE(i) + 0x78) +/* UHCI_SEND_Q0_WORD0 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: This register stores the content of short packet's first dword*/ +#define UHCI_SEND_Q0_WORD0 0xFFFFFFFF +#define UHCI_SEND_Q0_WORD0_M ((UHCI_SEND_Q0_WORD0_V)<<(UHCI_SEND_Q0_WORD0_S)) +#define UHCI_SEND_Q0_WORD0_V 0xFFFFFFFF +#define UHCI_SEND_Q0_WORD0_S 0 + +#define UHCI_Q0_WORD1_REG(i) (REG_UHCI_BASE(i) + 0x7C) +/* UHCI_SEND_Q0_WORD1 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: This register stores the content of short packet's second dword*/ +#define UHCI_SEND_Q0_WORD1 0xFFFFFFFF +#define UHCI_SEND_Q0_WORD1_M ((UHCI_SEND_Q0_WORD1_V)<<(UHCI_SEND_Q0_WORD1_S)) +#define UHCI_SEND_Q0_WORD1_V 0xFFFFFFFF +#define UHCI_SEND_Q0_WORD1_S 0 + +#define UHCI_Q1_WORD0_REG(i) (REG_UHCI_BASE(i) + 0x80) +/* UHCI_SEND_Q1_WORD0 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: This register stores the content of short packet's first dword*/ +#define UHCI_SEND_Q1_WORD0 0xFFFFFFFF +#define UHCI_SEND_Q1_WORD0_M ((UHCI_SEND_Q1_WORD0_V)<<(UHCI_SEND_Q1_WORD0_S)) +#define UHCI_SEND_Q1_WORD0_V 0xFFFFFFFF +#define UHCI_SEND_Q1_WORD0_S 0 + +#define UHCI_Q1_WORD1_REG(i) (REG_UHCI_BASE(i) + 0x84) +/* UHCI_SEND_Q1_WORD1 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: This register stores the content of short packet's second dword*/ +#define UHCI_SEND_Q1_WORD1 0xFFFFFFFF +#define UHCI_SEND_Q1_WORD1_M ((UHCI_SEND_Q1_WORD1_V)<<(UHCI_SEND_Q1_WORD1_S)) +#define UHCI_SEND_Q1_WORD1_V 0xFFFFFFFF +#define UHCI_SEND_Q1_WORD1_S 0 + +#define UHCI_Q2_WORD0_REG(i) (REG_UHCI_BASE(i) + 0x88) +/* UHCI_SEND_Q2_WORD0 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: This register stores the content of short packet's first dword*/ +#define UHCI_SEND_Q2_WORD0 0xFFFFFFFF +#define UHCI_SEND_Q2_WORD0_M ((UHCI_SEND_Q2_WORD0_V)<<(UHCI_SEND_Q2_WORD0_S)) +#define UHCI_SEND_Q2_WORD0_V 0xFFFFFFFF +#define UHCI_SEND_Q2_WORD0_S 0 + +#define UHCI_Q2_WORD1_REG(i) (REG_UHCI_BASE(i) + 0x8C) +/* UHCI_SEND_Q2_WORD1 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: This register stores the content of short packet's second dword*/ +#define UHCI_SEND_Q2_WORD1 0xFFFFFFFF +#define UHCI_SEND_Q2_WORD1_M ((UHCI_SEND_Q2_WORD1_V)<<(UHCI_SEND_Q2_WORD1_S)) +#define UHCI_SEND_Q2_WORD1_V 0xFFFFFFFF +#define UHCI_SEND_Q2_WORD1_S 0 + +#define UHCI_Q3_WORD0_REG(i) (REG_UHCI_BASE(i) + 0x90) +/* UHCI_SEND_Q3_WORD0 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: This register stores the content of short packet's first dword*/ +#define UHCI_SEND_Q3_WORD0 0xFFFFFFFF +#define UHCI_SEND_Q3_WORD0_M ((UHCI_SEND_Q3_WORD0_V)<<(UHCI_SEND_Q3_WORD0_S)) +#define UHCI_SEND_Q3_WORD0_V 0xFFFFFFFF +#define UHCI_SEND_Q3_WORD0_S 0 + +#define UHCI_Q3_WORD1_REG(i) (REG_UHCI_BASE(i) + 0x94) +/* UHCI_SEND_Q3_WORD1 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: This register stores the content of short packet's second dword*/ +#define UHCI_SEND_Q3_WORD1 0xFFFFFFFF +#define UHCI_SEND_Q3_WORD1_M ((UHCI_SEND_Q3_WORD1_V)<<(UHCI_SEND_Q3_WORD1_S)) +#define UHCI_SEND_Q3_WORD1_V 0xFFFFFFFF +#define UHCI_SEND_Q3_WORD1_S 0 + +#define UHCI_Q4_WORD0_REG(i) (REG_UHCI_BASE(i) + 0x98) +/* UHCI_SEND_Q4_WORD0 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: This register stores the content of short packet's first dword*/ +#define UHCI_SEND_Q4_WORD0 0xFFFFFFFF +#define UHCI_SEND_Q4_WORD0_M ((UHCI_SEND_Q4_WORD0_V)<<(UHCI_SEND_Q4_WORD0_S)) +#define UHCI_SEND_Q4_WORD0_V 0xFFFFFFFF +#define UHCI_SEND_Q4_WORD0_S 0 + +#define UHCI_Q4_WORD1_REG(i) (REG_UHCI_BASE(i) + 0x9C) +/* UHCI_SEND_Q4_WORD1 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: This register stores the content of short packet's second dword*/ +#define UHCI_SEND_Q4_WORD1 0xFFFFFFFF +#define UHCI_SEND_Q4_WORD1_M ((UHCI_SEND_Q4_WORD1_V)<<(UHCI_SEND_Q4_WORD1_S)) +#define UHCI_SEND_Q4_WORD1_V 0xFFFFFFFF +#define UHCI_SEND_Q4_WORD1_S 0 + +#define UHCI_Q5_WORD0_REG(i) (REG_UHCI_BASE(i) + 0xA0) +/* UHCI_SEND_Q5_WORD0 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: This register stores the content of short packet's first dword*/ +#define UHCI_SEND_Q5_WORD0 0xFFFFFFFF +#define UHCI_SEND_Q5_WORD0_M ((UHCI_SEND_Q5_WORD0_V)<<(UHCI_SEND_Q5_WORD0_S)) +#define UHCI_SEND_Q5_WORD0_V 0xFFFFFFFF +#define UHCI_SEND_Q5_WORD0_S 0 + +#define UHCI_Q5_WORD1_REG(i) (REG_UHCI_BASE(i) + 0xA4) +/* UHCI_SEND_Q5_WORD1 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: This register stores the content of short packet's second dword*/ +#define UHCI_SEND_Q5_WORD1 0xFFFFFFFF +#define UHCI_SEND_Q5_WORD1_M ((UHCI_SEND_Q5_WORD1_V)<<(UHCI_SEND_Q5_WORD1_S)) +#define UHCI_SEND_Q5_WORD1_V 0xFFFFFFFF +#define UHCI_SEND_Q5_WORD1_S 0 + +#define UHCI_Q6_WORD0_REG(i) (REG_UHCI_BASE(i) + 0xA8) +/* UHCI_SEND_Q6_WORD0 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: This register stores the content of short packet's first dword*/ +#define UHCI_SEND_Q6_WORD0 0xFFFFFFFF +#define UHCI_SEND_Q6_WORD0_M ((UHCI_SEND_Q6_WORD0_V)<<(UHCI_SEND_Q6_WORD0_S)) +#define UHCI_SEND_Q6_WORD0_V 0xFFFFFFFF +#define UHCI_SEND_Q6_WORD0_S 0 + +#define UHCI_Q6_WORD1_REG(i) (REG_UHCI_BASE(i) + 0xAC) +/* UHCI_SEND_Q6_WORD1 : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ +/*description: This register stores the content of short packet's second dword*/ +#define UHCI_SEND_Q6_WORD1 0xFFFFFFFF +#define UHCI_SEND_Q6_WORD1_M ((UHCI_SEND_Q6_WORD1_V)<<(UHCI_SEND_Q6_WORD1_S)) +#define UHCI_SEND_Q6_WORD1_V 0xFFFFFFFF +#define UHCI_SEND_Q6_WORD1_S 0 + +#define UHCI_ESC_CONF0_REG(i) (REG_UHCI_BASE(i) + 0xB0) +/* UHCI_SEPER_ESC_CHAR1 : R/W ;bitpos:[23:16] ;default: 8'hdc ; */ +/*description: This register stores the second char used to replace seperator + char in data . 0xdc 0xdb replace 0xc0 by default.*/ +#define UHCI_SEPER_ESC_CHAR1 0x000000FF +#define UHCI_SEPER_ESC_CHAR1_M ((UHCI_SEPER_ESC_CHAR1_V)<<(UHCI_SEPER_ESC_CHAR1_S)) +#define UHCI_SEPER_ESC_CHAR1_V 0xFF +#define UHCI_SEPER_ESC_CHAR1_S 16 +/* UHCI_SEPER_ESC_CHAR0 : R/W ;bitpos:[15:8] ;default: 8'hdb ; */ +/*description: This register stores thee first char used to replace seperator char in data.*/ +#define UHCI_SEPER_ESC_CHAR0 0x000000FF +#define UHCI_SEPER_ESC_CHAR0_M ((UHCI_SEPER_ESC_CHAR0_V)<<(UHCI_SEPER_ESC_CHAR0_S)) +#define UHCI_SEPER_ESC_CHAR0_V 0xFF +#define UHCI_SEPER_ESC_CHAR0_S 8 +/* UHCI_SEPER_CHAR : R/W ;bitpos:[7:0] ;default: 8'hc0 ; */ +/*description: This register stores the seperator char seperator char is used + to seperate the data frame.*/ +#define UHCI_SEPER_CHAR 0x000000FF +#define UHCI_SEPER_CHAR_M ((UHCI_SEPER_CHAR_V)<<(UHCI_SEPER_CHAR_S)) +#define UHCI_SEPER_CHAR_V 0xFF +#define UHCI_SEPER_CHAR_S 0 + +#define UHCI_ESC_CONF1_REG(i) (REG_UHCI_BASE(i) + 0xB4) +/* UHCI_ESC_SEQ0_CHAR1 : R/W ;bitpos:[23:16] ;default: 8'hdd ; */ +/*description: This register stores the second char used to replace the reg_esc_seq0 in data*/ +#define UHCI_ESC_SEQ0_CHAR1 0x000000FF +#define UHCI_ESC_SEQ0_CHAR1_M ((UHCI_ESC_SEQ0_CHAR1_V)<<(UHCI_ESC_SEQ0_CHAR1_S)) +#define UHCI_ESC_SEQ0_CHAR1_V 0xFF +#define UHCI_ESC_SEQ0_CHAR1_S 16 +/* UHCI_ESC_SEQ0_CHAR0 : R/W ;bitpos:[15:8] ;default: 8'hdb ; */ +/*description: This register stores the first char used to replace reg_esc_seq0 in data.*/ +#define UHCI_ESC_SEQ0_CHAR0 0x000000FF +#define UHCI_ESC_SEQ0_CHAR0_M ((UHCI_ESC_SEQ0_CHAR0_V)<<(UHCI_ESC_SEQ0_CHAR0_S)) +#define UHCI_ESC_SEQ0_CHAR0_V 0xFF +#define UHCI_ESC_SEQ0_CHAR0_S 8 +/* UHCI_ESC_SEQ0 : R/W ;bitpos:[7:0] ;default: 8'hdb ; */ +/*description: This register stores the first substitute char used to replace + the seperator char.*/ +#define UHCI_ESC_SEQ0 0x000000FF +#define UHCI_ESC_SEQ0_M ((UHCI_ESC_SEQ0_V)<<(UHCI_ESC_SEQ0_S)) +#define UHCI_ESC_SEQ0_V 0xFF +#define UHCI_ESC_SEQ0_S 0 + +#define UHCI_ESC_CONF2_REG(i) (REG_UHCI_BASE(i) + 0xB8) +/* UHCI_ESC_SEQ1_CHAR1 : R/W ;bitpos:[23:16] ;default: 8'hde ; */ +/*description: This register stores the second char used to replace the reg_esc_seq1 in data.*/ +#define UHCI_ESC_SEQ1_CHAR1 0x000000FF +#define UHCI_ESC_SEQ1_CHAR1_M ((UHCI_ESC_SEQ1_CHAR1_V)<<(UHCI_ESC_SEQ1_CHAR1_S)) +#define UHCI_ESC_SEQ1_CHAR1_V 0xFF +#define UHCI_ESC_SEQ1_CHAR1_S 16 +/* UHCI_ESC_SEQ1_CHAR0 : R/W ;bitpos:[15:8] ;default: 8'hdb ; */ +/*description: This register stores the first char used to replace the reg_esc_seq1 in data.*/ +#define UHCI_ESC_SEQ1_CHAR0 0x000000FF +#define UHCI_ESC_SEQ1_CHAR0_M ((UHCI_ESC_SEQ1_CHAR0_V)<<(UHCI_ESC_SEQ1_CHAR0_S)) +#define UHCI_ESC_SEQ1_CHAR0_V 0xFF +#define UHCI_ESC_SEQ1_CHAR0_S 8 +/* UHCI_ESC_SEQ1 : R/W ;bitpos:[7:0] ;default: 8'h11 ; */ +/*description: This register stores the flow control char to turn on the flow_control*/ +#define UHCI_ESC_SEQ1 0x000000FF +#define UHCI_ESC_SEQ1_M ((UHCI_ESC_SEQ1_V)<<(UHCI_ESC_SEQ1_S)) +#define UHCI_ESC_SEQ1_V 0xFF +#define UHCI_ESC_SEQ1_S 0 + +#define UHCI_ESC_CONF3_REG(i) (REG_UHCI_BASE(i) + 0xBC) +/* UHCI_ESC_SEQ2_CHAR1 : R/W ;bitpos:[23:16] ;default: 8'hdf ; */ +/*description: This register stores the second char used to replace the reg_esc_seq2 in data.*/ +#define UHCI_ESC_SEQ2_CHAR1 0x000000FF +#define UHCI_ESC_SEQ2_CHAR1_M ((UHCI_ESC_SEQ2_CHAR1_V)<<(UHCI_ESC_SEQ2_CHAR1_S)) +#define UHCI_ESC_SEQ2_CHAR1_V 0xFF +#define UHCI_ESC_SEQ2_CHAR1_S 16 +/* UHCI_ESC_SEQ2_CHAR0 : R/W ;bitpos:[15:8] ;default: 8'hdb ; */ +/*description: This register stores the first char used to replace the reg_esc_seq2 in data.*/ +#define UHCI_ESC_SEQ2_CHAR0 0x000000FF +#define UHCI_ESC_SEQ2_CHAR0_M ((UHCI_ESC_SEQ2_CHAR0_V)<<(UHCI_ESC_SEQ2_CHAR0_S)) +#define UHCI_ESC_SEQ2_CHAR0_V 0xFF +#define UHCI_ESC_SEQ2_CHAR0_S 8 +/* UHCI_ESC_SEQ2 : R/W ;bitpos:[7:0] ;default: 8'h13 ; */ +/*description: This register stores the flow_control char to turn off the flow_control*/ +#define UHCI_ESC_SEQ2 0x000000FF +#define UHCI_ESC_SEQ2_M ((UHCI_ESC_SEQ2_V)<<(UHCI_ESC_SEQ2_S)) +#define UHCI_ESC_SEQ2_V 0xFF +#define UHCI_ESC_SEQ2_S 0 + +#define UHCI_PKT_THRES_REG(i) (REG_UHCI_BASE(i) + 0xC0) +/* UHCI_PKT_THRS : R/W ;bitpos:[12:0] ;default: 13'h80 ; */ +/*description: when the amount of packet payload is greater than this value + the process of receiving data is done.*/ +#define UHCI_PKT_THRS 0x00001FFF +#define UHCI_PKT_THRS_M ((UHCI_PKT_THRS_V)<<(UHCI_PKT_THRS_S)) +#define UHCI_PKT_THRS_V 0x1FFF +#define UHCI_PKT_THRS_S 0 + +#define UHCI_DATE_REG(i) (REG_UHCI_BASE(i) + 0xFC) +/* UHCI_DATE : R/W ;bitpos:[31:0] ;default: 32'h16041001 ; */ +/*description: version information*/ +#define UHCI_DATE 0xFFFFFFFF +#define UHCI_DATE_M ((UHCI_DATE_V)<<(UHCI_DATE_S)) +#define UHCI_DATE_V 0xFFFFFFFF +#define UHCI_DATE_S 0 + + + + +#endif /*_SOC_UHCI_REG_H_ */ + + diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/uhci_struct.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/uhci_struct.h new file mode 100644 index 0000000000000..3f42536c31dd7 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/uhci_struct.h @@ -0,0 +1,349 @@ +// 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. +#ifndef _SOC_UHCI_STRUCT_H_ +#define _SOC_UHCI_STRUCT_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef volatile struct uhci_dev_s { + union { + struct { + uint32_t in_rst: 1; /*Set this bit to reset in link operations.*/ + uint32_t out_rst: 1; /*Set this bit to reset out link operations.*/ + uint32_t ahbm_fifo_rst: 1; /*Set this bit to reset dma ahb fifo.*/ + uint32_t ahbm_rst: 1; /*Set this bit to reset dma ahb interface.*/ + uint32_t in_loop_test: 1; /*Set this bit to enable loop test for in links.*/ + uint32_t out_loop_test: 1; /*Set this bit to enable loop test for out links.*/ + uint32_t out_auto_wrback: 1; /*when in link's length is 0 go on to use the next in link automatically.*/ + uint32_t out_no_restart_clr: 1; /*don't use*/ + uint32_t out_eof_mode: 1; /*Set this bit to produce eof after DMA pops all data clear this bit to produce eof after DMA pushes all data*/ + uint32_t uart0_ce: 1; /*Set this bit to use UART to transmit or receive data.*/ + uint32_t uart1_ce: 1; /*Set this bit to use UART1 to transmit or receive data.*/ + uint32_t uart2_ce: 1; /*Set this bit to use UART2 to transmit or receive data.*/ + uint32_t outdscr_burst_en: 1; /*Set this bit to enable DMA in links to use burst mode.*/ + uint32_t indscr_burst_en: 1; /*Set this bit to enable DMA out links to use burst mode.*/ + uint32_t out_data_burst_en: 1; /*Set this bit to enable DMA burst MODE*/ + uint32_t mem_trans_en: 1; + uint32_t seper_en: 1; /*Set this bit to use special char to separate the data frame.*/ + uint32_t head_en: 1; /*Set this bit to enable to use head packet before the data frame.*/ + uint32_t crc_rec_en: 1; /*Set this bit to enable receiver''s ability of crc calculation when crc_en bit in head packet is 1 then there will be crc bytes after data_frame*/ + uint32_t uart_idle_eof_en: 1; /*Set this bit to enable to use idle time when the idle time after data frame is satisfied this means the end of a data frame.*/ + uint32_t len_eof_en: 1; /*Set this bit to enable to use packet_len in packet head when the received data is equal to packet_len this means the end of a data frame.*/ + uint32_t encode_crc_en: 1; /*Set this bit to enable crc calculation for data frame when bit6 in the head packet is 1.*/ + uint32_t clk_en: 1; /*Set this bit to enable clock-gating for read or write registers.*/ + uint32_t uart_rx_brk_eof_en: 1; /*Set this bit to enable to use brk char as the end of a data frame.*/ + uint32_t reserved24: 8; + }; + uint32_t val; + } conf0; + union { + struct { + uint32_t rx_start: 1; /*when a separator char has been send it will produce uhci_rx_start_int interrupt.*/ + uint32_t tx_start: 1; /*when DMA detects a separator char it will produce uhci_tx_start_int interrupt.*/ + uint32_t rx_hung: 1; /*when DMA takes a lot of time to receive a data it will produce uhci_rx_hung_int interrupt.*/ + uint32_t tx_hung: 1; /*when DMA takes a lot of time to read a data from RAM it will produce uhci_tx_hung_int interrupt.*/ + uint32_t in_done: 1; /*when a in link descriptor has been completed it will produce uhci_in_done_int interrupt.*/ + uint32_t in_suc_eof: 1; /*when a data packet has been received it will produce uhci_in_suc_eof_int interrupt.*/ + uint32_t in_err_eof: 1; /*when there are some errors about eof in in link descriptor it will produce uhci_in_err_eof_int interrupt.*/ + uint32_t out_done: 1; /*when a out link descriptor is completed it will produce uhci_out_done_int interrupt.*/ + uint32_t out_eof: 1; /*when the current descriptor's eof bit is 1 it will produce uhci_out_eof_int interrupt.*/ + uint32_t in_dscr_err: 1; /*when there are some errors about the out link descriptor it will produce uhci_in_dscr_err_int interrupt.*/ + uint32_t out_dscr_err: 1; /*when there are some errors about the in link descriptor it will produce uhci_out_dscr_err_int interrupt.*/ + uint32_t in_dscr_empty: 1; /*when there are not enough in links for DMA it will produce uhci_in_dscr_err_int interrupt.*/ + uint32_t outlink_eof_err: 1; /*when there are some errors about eof in outlink descriptor it will produce uhci_outlink_eof_err_int interrupt.*/ + uint32_t out_total_eof: 1; /*When all data have been send it will produce uhci_out_total_eof_int interrupt.*/ + uint32_t send_s_q: 1; /*When use single send registers to send a short packets it will produce this interrupt when dma has send the short packet.*/ + uint32_t send_a_q: 1; /*When use always_send registers to send a series of short packets it will produce this interrupt when dma has send the short packet.*/ + uint32_t dma_in_fifo_full_wm: 1; + uint32_t reserved17: 15; + }; + uint32_t val; + } int_raw; + union { + struct { + uint32_t rx_start: 1; + uint32_t tx_start: 1; + uint32_t rx_hung: 1; + uint32_t tx_hung: 1; + uint32_t in_done: 1; + uint32_t in_suc_eof: 1; + uint32_t in_err_eof: 1; + uint32_t out_done: 1; + uint32_t out_eof: 1; + uint32_t in_dscr_err: 1; + uint32_t out_dscr_err: 1; + uint32_t in_dscr_empty: 1; + uint32_t outlink_eof_err: 1; + uint32_t out_total_eof: 1; + uint32_t send_s_q: 1; + uint32_t send_a_q: 1; + uint32_t dma_in_fifo_full_wm: 1; + uint32_t reserved17: 15; + }; + uint32_t val; + } int_st; + union { + struct { + uint32_t rx_start: 1; + uint32_t tx_start: 1; + uint32_t rx_hung: 1; + uint32_t tx_hung: 1; + uint32_t in_done: 1; + uint32_t in_suc_eof: 1; + uint32_t in_err_eof: 1; + uint32_t out_done: 1; + uint32_t out_eof: 1; + uint32_t in_dscr_err: 1; + uint32_t out_dscr_err: 1; + uint32_t in_dscr_empty: 1; + uint32_t outlink_eof_err: 1; + uint32_t out_total_eof: 1; + uint32_t send_s_q: 1; + uint32_t send_a_q: 1; + uint32_t dma_in_fifo_full_wm: 1; + uint32_t reserved17: 15; + }; + uint32_t val; + } int_ena; + union { + struct { + uint32_t rx_start: 1; + uint32_t tx_start: 1; + uint32_t rx_hung: 1; + uint32_t tx_hung: 1; + uint32_t in_done: 1; + uint32_t in_suc_eof: 1; + uint32_t in_err_eof: 1; + uint32_t out_done: 1; + uint32_t out_eof: 1; + uint32_t in_dscr_err: 1; + uint32_t out_dscr_err: 1; + uint32_t in_dscr_empty: 1; + uint32_t outlink_eof_err: 1; + uint32_t out_total_eof: 1; + uint32_t send_s_q: 1; + uint32_t send_a_q: 1; + uint32_t dma_in_fifo_full_wm: 1; + uint32_t reserved17: 15; + }; + uint32_t val; + } int_clr; + union { + struct { + uint32_t full: 1; /*1:DMA out link descriptor's fifo is full.*/ + uint32_t empty: 1; /*1:DMA in link descriptor's fifo is empty.*/ + uint32_t reserved2: 30; + }; + uint32_t val; + } dma_out_status; + union { + struct { + uint32_t fifo_wdata: 9; /*This is the data need to be pushed into out link descriptor's fifo.*/ + uint32_t reserved9: 7; + uint32_t fifo_push: 1; /*Set this bit to push data in out link descriptor's fifo.*/ + uint32_t reserved17:15; + }; + uint32_t val; + } dma_out_push; + union { + struct { + uint32_t full: 1; + uint32_t empty: 1; + uint32_t reserved2: 2; + uint32_t rx_err_cause: 3; /*This register stores the errors caused in out link descriptor's data packet.*/ + uint32_t reserved7: 25; + }; + uint32_t val; + } dma_in_status; + union { + struct { + uint32_t fifo_rdata: 12; /*This register stores the data pop from in link descriptor's fifo.*/ + uint32_t reserved12: 4; + uint32_t fifo_pop: 1; /*Set this bit to pop data in in link descriptor's fifo.*/ + uint32_t reserved17: 15; + }; + uint32_t val; + } dma_in_pop; + union { + struct { + uint32_t addr: 20; /*This register stores the least 20 bits of the first out link descriptor's address.*/ + uint32_t reserved20: 8; + uint32_t stop: 1; /*Set this bit to stop dealing with the out link descriptors.*/ + uint32_t start: 1; /*Set this bit to start dealing with the out link descriptors.*/ + uint32_t restart: 1; /*Set this bit to mount on new out link descriptors*/ + uint32_t park: 1; /*1: the out link descriptor's fsm is in idle state. 0:the out link descriptor's fsm is working.*/ + }; + uint32_t val; + } dma_out_link; + union { + struct { + uint32_t addr: 20; /*This register stores the least 20 bits of the first in link descriptor's address.*/ + uint32_t auto_ret: 1; /*1:when a packet is wrong in link descriptor returns to the descriptor which is lately used.*/ + uint32_t reserved21: 7; + uint32_t stop: 1; /*Set this bit to stop dealing with the in link descriptors.*/ + uint32_t start: 1; /*Set this bit to start dealing with the in link descriptors.*/ + uint32_t restart: 1; /*Set this bit to mount on new in link descriptors*/ + uint32_t park: 1; /*1:the in link descriptor's fsm is in idle state. 0:the in link descriptor's fsm is working*/ + }; + uint32_t val; + } dma_in_link; + union { + struct { + uint32_t check_sum_en: 1; /*Set this bit to enable decoder to check check_sum in packet header.*/ + uint32_t check_seq_en: 1; /*Set this bit to enable decoder to check seq num in packet header.*/ + uint32_t crc_disable: 1; /*Set this bit to disable crc calculation.*/ + uint32_t save_head: 1; /*Set this bit to save packet header .*/ + uint32_t tx_check_sum_re: 1; /*Set this bit to enable hardware replace check_sum in packet header automatically.*/ + uint32_t tx_ack_num_re: 1; /*Set this bit to enable hardware replace ack num in packet header automatically.*/ + uint32_t check_owner: 1; /*Set this bit to check the owner bit in link descriptor.*/ + uint32_t wait_sw_start: 1; /*Set this bit to enable software way to add packet header.*/ + uint32_t sw_start: 1; /*Set this bit to start inserting the packet header.*/ + uint32_t dma_in_fifo_full_thrs:12; /*when data amount in link descriptor's fifo is more than this register value it will produce uhci_dma_in_fifo_full_wm_int interrupt.*/ + uint32_t reserved21: 11; + }; + uint32_t val; + } conf1; + uint32_t state0; /**/ + uint32_t state1; /**/ + uint32_t dma_out_eof_des_addr; /*This register stores the address of out link description when eof bit in this descriptor is 1.*/ + uint32_t dma_in_suc_eof_des_addr; /*This register stores the address of in link descriptor when eof bit in this descriptor is 1.*/ + uint32_t dma_in_err_eof_des_addr; /*This register stores the address of in link descriptor when there are some errors in this descriptor.*/ + uint32_t dma_out_eof_bfr_des_addr; /*This register stores the address of out link descriptor when there are some errors in this descriptor.*/ + union { + struct { + uint32_t test_mode: 3; /*bit2 is ahb bus test enable ,bit1 is used to choose write(1) or read(0) mode. bit0 is used to choose test only once(1) or continue(0)*/ + uint32_t reserved3: 1; + uint32_t test_addr: 2; /*The two bits represent ahb bus address bit[20:19]*/ + uint32_t reserved6: 26; + }; + uint32_t val; + } ahb_test; + uint32_t dma_in_dscr; /*The content of current in link descriptor's third dword*/ + uint32_t dma_in_dscr_bf0; /*The content of current in link descriptor's first dword*/ + uint32_t dma_in_dscr_bf1; /*The content of current in link descriptor's second dword*/ + uint32_t dma_out_dscr; /*The content of current out link descriptor's third dword*/ + uint32_t dma_out_dscr_bf0; /*The content of current out link descriptor's first dword*/ + uint32_t dma_out_dscr_bf1; /*The content of current out link descriptor's second dword*/ + union { + struct { + uint32_t tx_c0_esc_en: 1; /*Set this bit to enable 0xc0 char decode when DMA receives data.*/ + uint32_t tx_db_esc_en: 1; /*Set this bit to enable 0xdb char decode when DMA receives data.*/ + uint32_t tx_11_esc_en: 1; /*Set this bit to enable flow control char 0x11 decode when DMA receives data.*/ + uint32_t tx_13_esc_en: 1; /*Set this bit to enable flow control char 0x13 decode when DMA receives data.*/ + uint32_t rx_c0_esc_en: 1; /*Set this bit to enable 0xc0 char replace when DMA sends data.*/ + uint32_t rx_db_esc_en: 1; /*Set this bit to enable 0xdb char replace when DMA sends data.*/ + uint32_t rx_11_esc_en: 1; /*Set this bit to enable flow control char 0x11 replace when DMA sends data.*/ + uint32_t rx_13_esc_en: 1; /*Set this bit to enable flow control char 0x13 replace when DMA sends data.*/ + uint32_t reserved8: 24; + }; + uint32_t val; + } escape_conf; + union { + struct { + uint32_t txfifo_timeout: 8; /*This register stores the timeout value.when DMA takes more time than this register value to receive a data it will produce uhci_tx_hung_int interrupt.*/ + uint32_t txfifo_timeout_shift: 3; /*The tick count is cleared when its value >=(17'd8000>>reg_txfifo_timeout_shift)*/ + uint32_t txfifo_timeout_ena: 1; /*The enable bit for tx fifo receive data timeout*/ + uint32_t rxfifo_timeout: 8; /*This register stores the timeout value.when DMA takes more time than this register value to read a data from RAM it will produce uhci_rx_hung_int interrupt.*/ + uint32_t rxfifo_timeout_shift: 3; /*The tick count is cleared when its value >=(17'd8000>>reg_rxfifo_timeout_shift)*/ + uint32_t rxfifo_timeout_ena: 1; /*This is the enable bit for DMA send data timeout*/ + uint32_t reserved24: 8; + }; + uint32_t val; + } hung_conf; + uint32_t ack_num; /**/ + uint32_t rx_head; /*This register stores the packet header received by DMA*/ + union { + struct { + uint32_t single_send_num: 3; /*The bits are used to choose which short packet*/ + uint32_t single_send_en: 1; /*Set this bit to enable send a short packet*/ + uint32_t always_send_num: 3; /*The bits are used to choose which short packet*/ + uint32_t always_send_en: 1; /*Set this bit to enable continuously send the same short packet*/ + uint32_t reserved8: 24; + }; + uint32_t val; + } quick_sent; + struct{ + uint32_t w_data[2]; /*This register stores the content of short packet's dword*/ + } q_data[7]; + union { + struct { + uint32_t seper_char: 8; /*This register stores the separator char separator char is used to separate the data frame.*/ + uint32_t seper_esc_char0: 8; /*This register stores the first char used to replace separator char in data.*/ + uint32_t seper_esc_char1: 8; /*This register stores the second char used to replace separator char in data . 0xdc 0xdb replace 0xc0 by default.*/ + uint32_t reserved24: 8; + }; + uint32_t val; + } esc_conf0; + union { + struct { + uint32_t seq0: 8; /*This register stores the first substitute char used to replace the separate char.*/ + uint32_t seq0_char0: 8; /*This register stores the first char used to replace reg_esc_seq0 in data.*/ + uint32_t seq0_char1: 8; /*This register stores the second char used to replace the reg_esc_seq0 in data*/ + uint32_t reserved24: 8; + }; + uint32_t val; + } esc_conf1; + union { + struct { + uint32_t seq1: 8; /*This register stores the flow control char to turn on the flow_control*/ + uint32_t seq1_char0: 8; /*This register stores the first char used to replace the reg_esc_seq1 in data.*/ + uint32_t seq1_char1: 8; /*This register stores the second char used to replace the reg_esc_seq1 in data.*/ + uint32_t reserved24: 8; + }; + uint32_t val; + } esc_conf2; + union { + struct { + uint32_t seq2: 8; /*This register stores the flow_control char to turn off the flow_control*/ + uint32_t seq2_char0: 8; /*This register stores the first char used to replace the reg_esc_seq2 in data.*/ + uint32_t seq2_char1: 8; /*This register stores the second char used to replace the reg_esc_seq2 in data.*/ + uint32_t reserved24: 8; + }; + uint32_t val; + } esc_conf3; + union { + struct { + uint32_t thrs: 13; /*when the amount of packet payload is larger than this value the process of receiving data is done.*/ + uint32_t reserved13:19; + }; + uint32_t val; + } pkt_thres; + 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; /*version information*/ +} uhci_dev_t; +extern uhci_dev_t UHCI0; +extern uhci_dev_t UHCI1; + +#ifdef __cplusplus +} +#endif + +#endif /* _SOC_UHCI_STRUCT_H_ */ diff --git a/arch/xtensa/include/esp32/soc/esp32/include/soc/wdev_reg.h b/arch/xtensa/include/esp32/soc/esp32/include/soc/wdev_reg.h new file mode 100644 index 0000000000000..f3217cb0d6fd6 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/esp32/include/soc/wdev_reg.h @@ -0,0 +1,20 @@ +// 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 "soc.h" + +/* Hardware random number generator register */ +#define WDEV_RND_REG 0x60035144 diff --git a/arch/xtensa/include/esp32/soc/include/hal/adc_hal.h b/arch/xtensa/include/esp32/soc/include/hal/adc_hal.h new file mode 100644 index 0000000000000..87317b56238b9 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/adc_hal.h @@ -0,0 +1,207 @@ +#pragma once + +#include "hal/adc_types.h" +#include "hal/adc_ll.h" + +typedef struct { + bool conv_limit_en; + uint32_t conv_limit_num; + uint32_t clk_div; + uint32_t adc1_pattern_len; + uint32_t adc2_pattern_len; + adc_ll_pattern_table_t *adc1_pattern; + adc_ll_pattern_table_t *adc2_pattern; + adc_ll_convert_mode_t conv_mode; + adc_ll_dig_output_format_t format; +} adc_hal_dig_config_t; + +/*--------------------------------------------------------------- + Common setting +---------------------------------------------------------------*/ +/** + * ADC module initialization. + */ +void adc_hal_init(void); + +/** + * Set adc sample cycle for digital controller. + * + * @note Normally, please use default value. + * @param sample_cycle Cycles between DIG ADC controller start ADC sensor and beginning to receive data from sensor. + * Range: 2 ~ 0xFF. + */ +#define adc_hal_dig_set_sample_cycle(sample_cycle) adc_ll_dig_set_sample_cycle(sample_cycle) + +/** + * Set ADC module power management. + * + * @prarm manage Set ADC power status. + */ +#define adc_hal_set_power_manage(manage) adc_ll_set_power_manage(manage) + +/** + * Get ADC module power management. + * + * @return + * - ADC power status. + */ +#define adc_hal_get_power_manage() adc_ll_get_power_manage() + +/** + * ADC module clock division factor setting. ADC clock devided from APB clock. + * + * @prarm div Division factor. + */ +#define adc_hal_set_clk_div(div) adc_ll_set_clk_div(div) + +/** + * ADC module output data invert or not. + * + * @prarm adc_n ADC unit. + */ +#define adc_hal_output_invert(adc_n, inv_en) adc_ll_output_invert(adc_n, inv_en) + +/** + * Set ADC module controller. + * There are five SAR ADC controllers: + * Two digital controller: Continuous conversion mode (DMA). High performance with multiple channel scan modes; + * Two RTC controller: Single conversion modes (Polling). For low power purpose working during deep sleep; + * the other is dedicated for Power detect (PWDET / PKDET), Only support ADC2. + * + * @prarm adc_n ADC unit. + * @prarm ctrl ADC controller. + */ +#define adc_hal_set_controller(adc_n, ctrl) adc_ll_set_controller(adc_n, ctrl) + +/** + * Set the attenuation of a particular channel on ADCn. + * + * @note For any given channel, this function must be called before the first time conversion. + * + * The default ADC full-scale voltage is 1.1V. To read higher voltages (up to the pin maximum voltage, + * usually 3.3V) requires setting >0dB signal attenuation for that ADC channel. + * + * When VDD_A is 3.3V: + * + * - 0dB attenuaton (ADC_ATTEN_DB_0) gives full-scale voltage 1.1V + * - 2.5dB attenuation (ADC_ATTEN_DB_2_5) gives full-scale voltage 1.5V + * - 6dB attenuation (ADC_ATTEN_DB_6) gives full-scale voltage 2.2V + * - 11dB attenuation (ADC_ATTEN_DB_11) gives full-scale voltage 3.9V (see note below) + * + * @note The full-scale voltage is the voltage corresponding to a maximum reading (depending on ADC1 configured + * bit width, this value is: 4095 for 12-bits, 2047 for 11-bits, 1023 for 10-bits, 511 for 9 bits.) + * + * @note At 11dB attenuation the maximum voltage is limited by VDD_A, not the full scale voltage. + * + * Due to ADC characteristics, most accurate results are obtained within the following approximate voltage ranges: + * + * - 0dB attenuaton (ADC_ATTEN_DB_0) between 100 and 950mV + * - 2.5dB attenuation (ADC_ATTEN_DB_2_5) between 100 and 1250mV + * - 6dB attenuation (ADC_ATTEN_DB_6) between 150 to 1750mV + * - 11dB attenuation (ADC_ATTEN_DB_11) between 150 to 2450mV + * + * For maximum accuracy, use the ADC calibration APIs and measure voltages within these recommended ranges. + * + * @prarm adc_n ADC unit. + * @prarm channel ADCn channel number. + * @prarm atten The attenuation option. + */ +#define adc_hal_set_atten(adc_n, channel, atten) adc_ll_set_atten(adc_n, channel, atten) + +/** + * Close ADC AMP module if don't use it for power save. + */ +#define adc_hal_amp_disable() adc_ll_amp_disable() + +/*--------------------------------------------------------------- + PWDET(Power detect) controller setting +---------------------------------------------------------------*/ + +/** + * Set adc cct for PWDET controller. + * + * @note Capacitor tuning of the PA power monitor. cct set to the same value with PHY. + * @prarm cct Range: 0 ~ 7. + */ +#define adc_hal_pwdet_set_cct(cct) adc_ll_pwdet_set_cct(cct) + +/** + * Get adc cct for PWDET controller. + * + * @note Capacitor tuning of the PA power monitor. cct set to the same value with PHY. + * @return cct Range: 0 ~ 7. + */ +#define adc_hal_pwdet_get_cct() adc_ll_pwdet_get_cct() + +/*--------------------------------------------------------------- + RTC controller setting +---------------------------------------------------------------*/ + +/** + * Set adc output data format for RTC controller. + * + * @prarm adc_n ADC unit. + * @prarm bits Output data bits width option. + */ +#define adc_hal_rtc_set_output_format(adc_n, bits) adc_ll_rtc_set_output_format(adc_n, bits) + +/** + * Get the converted value for each ADCn for RTC controller. + * + * @note It may be block to wait conversion finish. + * @prarm adc_n ADC unit. + * @return + * - Converted value. + */ +int adc_hal_convert(adc_ll_num_t adc_n, int channel); + +/*--------------------------------------------------------------- + Digital controller setting +---------------------------------------------------------------*/ +/** + * Setting the digital controller. + * + * @prarm adc_hal_dig_config_t cfg Pointer to digital controller paramter. + */ +void adc_hal_dig_controller_config(const adc_hal_dig_config_t *cfg); + +/** + * Set I2S DMA data source for digital controller. + * + * @param src i2s data source. + */ +#define adc_hal_dig_set_data_source(src) adc_ll_dig_set_data_source(src) + +/*--------------------------------------------------------------- + Hall sensor setting +---------------------------------------------------------------*/ + +/** + * Enable hall sensor. + */ +#define adc_hal_hall_enable() adc_ll_hall_enable() + +/** + * Disable hall sensor. + */ +#define adc_hal_hall_disable() adc_ll_hall_disable() + +/** + * Start hall convert and return the hall value. + * + * @return Hall value. + */ +int adc_hal_hall_convert(void); + +/** + * @brief Output ADC2 reference voltage to gpio + * + * This function utilizes the testing mux exclusive to ADC2 to route the + * reference voltage one of ADC2's channels. + * + * @param[in] io GPIO number + * @return + * - true: v_ref successfully routed to selected gpio + * - false: Unsupported gpio + */ +#define adc_hal_vref_output(io) adc_ll_vref_output(io) \ No newline at end of file diff --git a/arch/xtensa/include/esp32/soc/include/hal/adc_types.h b/arch/xtensa/include/esp32/soc/include/hal/adc_types.h new file mode 100644 index 0000000000000..d651f00b4f995 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/adc_types.h @@ -0,0 +1,37 @@ +#pragma once + +typedef enum { + ADC_CHANNEL_0 = 0, /*!< ADC channel */ + ADC_CHANNEL_1, /*!< ADC channel */ + ADC_CHANNEL_2, /*!< ADC channel */ + ADC_CHANNEL_3, /*!< ADC channel */ + ADC_CHANNEL_4, /*!< ADC channel */ + ADC_CHANNEL_5, /*!< ADC channel */ + ADC_CHANNEL_6, /*!< ADC channel */ + ADC_CHANNEL_7, /*!< ADC channel */ + ADC_CHANNEL_8, /*!< ADC channel */ + ADC_CHANNEL_9, /*!< ADC channel */ + ADC_CHANNEL_MAX, +} adc_channel_t; + +typedef enum { + ADC_ATTEN_DB_0 = 0, /*! +#include +#include "hal/can_types.h" +#include "hal/can_ll.h" + +/* ------------------------- Defines and Typedefs --------------------------- */ + +//Error active interrupt related +#define CAN_HAL_EVENT_BUS_OFF (1 << 0) +#define CAN_HAL_EVENT_BUS_RECOV_CPLT (1 << 1) +#define CAN_HAL_EVENT_BUS_RECOV_PROGRESS (1 << 2) +#define CAN_HAL_EVENT_ABOVE_EWL (1 << 3) +#define CAN_HAL_EVENT_BELOW_EWL (1 << 4) +#define CAN_HAL_EVENT_ERROR_PASSIVE (1 << 5) +#define CAN_HAL_EVENT_ERROR_ACTIVE (1 << 6) +#define CAN_HAL_EVENT_BUS_ERR (1 << 7) +#define CAN_HAL_EVENT_ARB_LOST (1 << 8) +#define CAN_HAL_EVENT_RX_BUFF_FRAME (1 << 9) +#define CAN_HAL_EVENT_TX_BUFF_FREE (1 << 10) + +typedef struct { + can_dev_t *dev; +} can_hal_context_t; + +typedef can_ll_frame_buffer_t can_hal_frame_t; + +/* ---------------------------- Init and Config ----------------------------- */ + +/** + * @brief Initialize CAN peripheral and HAL context + * + * Sets HAL context, puts CAN peripheral into reset mode, then sets some + * registers with default values. + * + * @param hal_ctx Context of the HAL layer + * @return True if successfully initialized, false otherwise. + */ +bool can_hal_init(can_hal_context_t *hal_ctx); + +/** + * @brief Deinitialize the CAN peripheral and HAL context + * + * Clears any unhandled interrupts and unsets HAL context + * + * @param hal_ctx Context of the HAL layer + */ +void can_hal_deinit(can_hal_context_t *hal_ctx); + +/** + * @brief Configure the CAN peripheral + * + * @param hal_ctx Context of the HAL layer + * @param t_config Pointer to timing configuration structure + * @param f_config Pointer to filter configuration structure + * @param intr_mask Mask of interrupts to enable + * @param clkout_divider Clock divider value for CLKOUT. Set to -1 to disable CLKOUT + */ +void can_hal_configure(can_hal_context_t *hal_ctx, const can_timing_config_t *t_config, const can_filter_config_t *f_config, uint32_t intr_mask, uint32_t clkout_divider); + +/* -------------------------------- Actions --------------------------------- */ + +/** + * @brief Start the CAN peripheral + * + * Start the CAN peripheral by configuring its operating mode, then exiting + * reset mode so that the CAN peripheral can participate in bus activities. + * + * @param hal_ctx Context of the HAL layer + * @param mode Operating mode + * @return True if successfully started, false otherwise. + */ +bool can_hal_start(can_hal_context_t *hal_ctx, can_mode_t mode); + +/** + * @brief Stop the CAN peripheral + * + * Stop the CAN peripheral by entering reset mode to stop any bus activity, then + * setting the operating mode to Listen Only so that REC is frozen. + * + * @param hal_ctx Context of the HAL layer + * @return True if successfully stopped, false otherwise. + */ +bool can_hal_stop(can_hal_context_t *hal_ctx); + +/** + * @brief Start bus recovery + * + * @param hal_ctx Context of the HAL layer + * @return True if successfully started bus recovery, false otherwise. + */ +static inline bool can_hal_start_bus_recovery(can_hal_context_t *hal_ctx) +{ + return can_ll_exit_reset_mode(hal_ctx->dev); +} + +/** + * @brief Get the value of the TX Error Counter + * + * @param hal_ctx Context of the HAL layer + * @return TX Error Counter Value + */ +static inline uint32_t can_hal_get_tec(can_hal_context_t *hal_ctx) +{ + return can_ll_get_tec((hal_ctx)->dev); +} + +/** + * @brief Get the value of the RX Error Counter + * + * @param hal_ctx Context of the HAL layer + * @return RX Error Counter Value + */ +static inline uint32_t can_hal_get_rec(can_hal_context_t *hal_ctx) +{ + return can_ll_get_rec((hal_ctx)->dev); +} + +/** + * @brief Get the RX message count register + * + * @param hal_ctx Context of the HAL layer + * @return RX message count + */ +static inline uint32_t can_hal_get_rx_msg_count(can_hal_context_t *hal_ctx) +{ + return can_ll_get_rx_msg_count((hal_ctx)->dev); +} + +/** + * @brief Check if the last transmitted frame was successful + * + * @param hal_ctx Context of the HAL layer + * @return True if successful + */ +static inline bool can_hal_check_last_tx_successful(can_hal_context_t *hal_ctx) +{ + return can_ll_is_last_tx_successful((hal_ctx)->dev); +} + +/* ----------------------------- Event Handling ----------------------------- */ + +/** + * @brief Decode current events that triggered an interrupt + * + * This function should be called on every CAN interrupt. It will read (and + * thereby clear) the interrupt register, then determine what events have + * occurred to trigger the interrupt. + * + * @param hal_ctx Context of the HAL layer + * @param bus_recovering Whether the CAN peripheral was previous undergoing bus recovery + * @return Bit mask of events that have occurred + */ +uint32_t can_hal_decode_interrupt_events(can_hal_context_t *hal_ctx, bool bus_recovering); + +/** + * @brief Handle bus recovery complete + * + * This function should be called on an bus recovery complete event. It simply + * enters reset mode to stop bus activity. + * + * @param hal_ctx Context of the HAL layer + * @return True if successfully handled bus recovery completion, false otherwise. + */ +static inline bool can_hal_handle_bus_recov_cplt(can_hal_context_t *hal_ctx) +{ + return can_ll_enter_reset_mode((hal_ctx)->dev); +} + +/** + * @brief Handle arbitration lost + * + * This function should be called on an arbitration lost event. It simply clears + * the clears the ALC register. + * + * @param hal_ctx Context of the HAL layer + */ +static inline void can_hal_handle_arb_lost(can_hal_context_t *hal_ctx) +{ + can_ll_clear_arb_lost_cap((hal_ctx)->dev); +} + +/** + * @brief Handle bus error + * + * This function should be called on an bus error event. It simply clears + * the clears the ECC register. + * + * @param hal_ctx Context of the HAL layer + */ +static inline void can_hal_handle_bus_error(can_hal_context_t *hal_ctx) +{ + can_ll_clear_err_code_cap((hal_ctx)->dev); +} + +/** + * @brief Handle BUS OFF + * + * This function should be called on a BUS OFF event. It simply changes the + * mode to LOM to freeze REC + * + * @param hal_ctx Context of the HAL layer + */ +static inline void can_hal_handle_bus_off(can_hal_context_t *hal_ctx) +{ + can_ll_set_mode((hal_ctx)->dev, CAN_MODE_LISTEN_ONLY); +} + +/* ------------------------------- TX and RX -------------------------------- */ + +/** + * @brief Format a CAN Frame + * + * This function takes a CAN message structure (containing ID, DLC, data, and + * flags) and formats it to match the layout of the TX frame buffer. + * + * @param message Pointer to CAN message + * @param frame Pointer to empty frame structure + */ +static inline void can_hal_format_frame(const can_message_t *message, can_hal_frame_t *frame) +{ + //Direct call to ll function + can_ll_format_frame_buffer(message->identifier, message->data_length_code, message->data, + message->flags, frame); +} + +/** + * @brief Parse a CAN Frame + * + * This function takes a CAN frame (in the format of the RX frame buffer) and + * parses it to a CAN message (containing ID, DLC, data and flags). + * + * @param frame Pointer to frame structure + * @param message Pointer to empty message structure + */ +static inline void can_hal_parse_frame(can_hal_frame_t *frame, can_message_t *message) +{ + //Direct call to ll function + can_ll_prase_frame_buffer(frame, &message->identifier, &message->data_length_code, + message->data, &message->flags); +} + +/** + * @brief Copy a frame into the TX buffer and transmit + * + * This function copies a formatted TX frame into the TX buffer, and the + * transmit by setting the correct transmit command (e.g. normal, single shot, + * self RX) in the command register. + * + * @param hal_ctx Context of the HAL layer + * @param tx_frame Pointer to structure containing formatted TX frame + */ +void can_hal_set_tx_buffer_and_transmit(can_hal_context_t *hal_ctx, can_hal_frame_t *tx_frame); + +/** + * @brief Copy a frame from the RX buffer and release + * + * This function copies a frame from the RX buffer, then release the buffer (so + * that it loads the next frame in the RX FIFO). + * + * @param hal_ctx Context of the HAL layer + * @param rx_frame Pointer to structure to store RX frame + */ +static inline void can_hal_read_rx_buffer_and_clear(can_hal_context_t *hal_ctx, can_hal_frame_t *rx_frame) +{ + can_ll_get_rx_buffer(hal_ctx->dev, rx_frame); + can_ll_set_cmd_release_rx_buffer(hal_ctx->dev); + /* + * Todo: Support overrun handling by: + * - Check overrun status bit. Return false if overrun + */ +} + + +//Todo: Decode ALC register +//Todo: Decode error code capture + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/include/hal/can_types.h b/arch/xtensa/include/esp32/soc/include/hal/can_types.h new file mode 100644 index 0000000000000..d7947e65c1fdd --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/can_types.h @@ -0,0 +1,137 @@ +// 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. + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +/** + * @brief CAN2.0B Constants + */ +#define CAN_EXTD_ID_MASK 0x1FFFFFFF /**< Bit mask for 29 bit Extended Frame Format ID */ +#define CAN_STD_ID_MASK 0x7FF /**< Bit mask for 11 bit Standard Frame Format ID */ +#define CAN_FRAME_MAX_DLC 8 /**< Max data bytes allowed in CAN2.0 */ +#define CAN_FRAME_EXTD_ID_LEN_BYTES 4 /**< EFF ID requires 4 bytes (29bit) */ +#define CAN_FRAME_STD_ID_LEN_BYTES 2 /**< SFF ID requires 2 bytes (11bit) */ +#define CAN_ERR_PASS_THRESH 128 /**< Error counter threshold for error passive */ + +/** @cond */ //Doxy command to hide preprocessor definitions from docs +/** + * @brief CAN Message flags + * + * The message flags are used to indicate the type of message transmitted/received. + * Some flags also specify the type of transmission. + */ +#define CAN_MSG_FLAG_NONE 0x00 /**< No message flags (Standard Frame Format) */ +#define CAN_MSG_FLAG_EXTD 0x01 /**< Extended Frame Format (29bit ID) */ +#define CAN_MSG_FLAG_RTR 0x02 /**< Message is a Remote Transmit Request */ +#define CAN_MSG_FLAG_SS 0x04 /**< Transmit as a Single Shot Transmission. Unused for received. */ +#define CAN_MSG_FLAG_SELF 0x08 /**< Transmit as a Self Reception Request. Unused for received. */ +#define CAN_MSG_FLAG_DLC_NON_COMP 0x10 /**< Message's Data length code is larger than 8. This will break compliance with CAN2.0B */ + +/** + * @brief Initializer macros for timing configuration structure + * + * The following initializer macros offer commonly found bit rates. + * + * @note These timing values are based on the assumption APB clock is at 80MHz + * @note The 20K, 16K and 12.5K bit rates are only available from ESP32 Revision 2 onwards + */ +#ifdef CAN_BRP_DIV_SUPPORTED +#define CAN_TIMING_CONFIG_12_5KBITS() {.brp = 256, .tseg_1 = 16, .tseg_2 = 8, .sjw = 3, .triple_sampling = false} +#define CAN_TIMING_CONFIG_16KBITS() {.brp = 200, .tseg_1 = 16, .tseg_2 = 8, .sjw = 3, .triple_sampling = false} +#define CAN_TIMING_CONFIG_20KBITS() {.brp = 200, .tseg_1 = 15, .tseg_2 = 4, .sjw = 3, .triple_sampling = false} +#endif +#define CAN_TIMING_CONFIG_25KBITS() {.brp = 128, .tseg_1 = 16, .tseg_2 = 8, .sjw = 3, .triple_sampling = false} +#define CAN_TIMING_CONFIG_50KBITS() {.brp = 80, .tseg_1 = 15, .tseg_2 = 4, .sjw = 3, .triple_sampling = false} +#define CAN_TIMING_CONFIG_100KBITS() {.brp = 40, .tseg_1 = 15, .tseg_2 = 4, .sjw = 3, .triple_sampling = false} +#define CAN_TIMING_CONFIG_125KBITS() {.brp = 32, .tseg_1 = 15, .tseg_2 = 4, .sjw = 3, .triple_sampling = false} +#define CAN_TIMING_CONFIG_250KBITS() {.brp = 16, .tseg_1 = 15, .tseg_2 = 4, .sjw = 3, .triple_sampling = false} +#define CAN_TIMING_CONFIG_500KBITS() {.brp = 8, .tseg_1 = 15, .tseg_2 = 4, .sjw = 3, .triple_sampling = false} +#define CAN_TIMING_CONFIG_800KBITS() {.brp = 4, .tseg_1 = 16, .tseg_2 = 8, .sjw = 3, .triple_sampling = false} +#define CAN_TIMING_CONFIG_1MBITS() {.brp = 4, .tseg_1 = 15, .tseg_2 = 4, .sjw = 3, .triple_sampling = false} + +/** + * @brief Initializer macro for filter configuration to accept all IDs + */ +#define CAN_FILTER_CONFIG_ACCEPT_ALL() {.acceptance_code = 0, .acceptance_mask = 0xFFFFFFFF, .single_filter = true} +/** @endcond */ + +/** + * @brief CAN Controller operating modes + */ +typedef enum { + CAN_MODE_NORMAL, /**< Normal operating mode where CAN controller can send/receive/acknowledge messages */ + CAN_MODE_NO_ACK, /**< Transmission does not require acknowledgment. Use this mode for self testing */ + CAN_MODE_LISTEN_ONLY, /**< The CAN controller will not influence the bus (No transmissions or acknowledgments) but can receive messages */ +} can_mode_t; + +/** + * @brief Structure to store a CAN message + * + * @note + * @note The flags member is deprecated + */ +typedef struct { + union { + struct { + //The order of these bits must match deprecated message flags for compatibility reasons + uint32_t extd: 1; /**< Extended Frame Format (29bit ID) */ + uint32_t rtr: 1; /**< Message is a Remote Transmit Request */ + uint32_t ss: 1; /**< Transmit as a Single Shot Transmission. Unused for received. */ + uint32_t self: 1; /**< Transmit as a Self Reception Request. Unused for received. */ + uint32_t dlc_non_comp: 1; /**< Message's Data length code is larger than 8. This will break compliance with CAN2.0B. */ + uint32_t reserved: 27; /**< Reserved bits */ + }; + //Todo: Deprecate flags + uint32_t flags; /**< Alternate way to set message flags using message flag macros (see documentation) */ + }; + uint32_t identifier; /**< 11 or 29 bit identifier */ + uint8_t data_length_code; /**< Data length code */ + uint8_t data[CAN_FRAME_MAX_DLC]; /**< Data bytes (not relevant in RTR frame) */ +} can_message_t; + +/** + * @brief Structure for bit timing configuration of the CAN driver + * + * @note Macro initializers are available for this structure + */ +typedef struct { + uint32_t brp; /**< Baudrate prescaler (i.e., APB clock divider) can be any even number from 2 to 128. + For ESP32 Rev 2 or later, multiples of 4 from 132 to 256 are also supported */ + uint8_t tseg_1; /**< Timing segment 1 (Number of time quanta, between 1 to 16) */ + uint8_t tseg_2; /**< Timing segment 2 (Number of time quanta, 1 to 8) */ + uint8_t sjw; /**< Synchronization Jump Width (Max time quanta jump for synchronize from 1 to 4) */ + bool triple_sampling; /**< Enables triple sampling when the CAN controller samples a bit */ +} can_timing_config_t; + +/** + * @brief Structure for acceptance filter configuration of the CAN driver (see documentation) + * + * @note Macro initializers are available for this structure + */ +typedef struct { + uint32_t acceptance_code; /**< 32-bit acceptance code */ + uint32_t acceptance_mask; /**< 32-bit acceptance mask */ + bool single_filter; /**< Use Single Filter Mode (see documentation) */ +} can_filter_config_t; + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/include/hal/dac_hal.h b/arch/xtensa/include/esp32/soc/include/hal/dac_hal.h new file mode 100644 index 0000000000000..8522831eee469 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/dac_hal.h @@ -0,0 +1,76 @@ +// 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. + +/******************************************************************************* + * NOTICE + * The hal is not public api, don't use in application code. + * See readme.md in soc/include/hal/readme.md + ******************************************************************************/ + +#pragma once + +#include "hal/dac_ll.h" +#include "hal/hal_defs.h" +#include + +/** + * Power on dac module and start output voltage. + * + * @note Before powering up, make sure the DAC PAD is set to RTC PAD and floating status. + * @param channel DAC channel num. + */ +#define dac_hal_power_on(channel) dac_ll_power_on(channel) + +/** + * Power done dac module and stop output voltage. + * + * @param channel DAC channel num. + */ +#define dac_hal_power_down(channel) dac_ll_power_down(channel) + +/** + * Output voltage with value (8 bit). + * + * @param channel DAC channel num. + * @param value Output value. Value range: 0 ~ 255. + * The corresponding range of voltage is 0v ~ VDD3P3_RTC. + */ +#define dac_hal_update_output_value(channel, value) dac_ll_update_output_value(channel, value) + +/** + * Enable cosine wave generator output. + */ +#define dac_hal_cw_generator_enable() dac_ll_cw_generator_enable() + +/** + * Disable cosine wave generator output. + */ +#define dac_hal_cw_generator_disable() dac_ll_cw_generator_disable() + +/** + * Config the cosine wave generator function in DAC module. + * + * @param cw Configuration. + */ +void dac_hal_cw_generator_config(dac_cw_config_t *cw); + +/** + * Enable DAC output data from DMA. + */ +#define dac_hal_dma_enable() dac_ll_dma_enable() + +/** + * Disable DAC output data from DMA. + */ +#define dac_hal_dma_disable() dac_ll_dma_disable() \ No newline at end of file diff --git a/arch/xtensa/include/esp32/soc/include/hal/dac_types.h b/arch/xtensa/include/esp32/soc/include/hal/dac_types.h new file mode 100644 index 0000000000000..f9bba18d01921 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/dac_types.h @@ -0,0 +1,40 @@ +#pragma once + +#include "soc/dac_caps.h" +#include + +typedef enum { + DAC_CHANNEL_1 = 0, /*!< DAC channel 1 is GPIO25(ESP32) / GPIO17(ESP32S2BETA) */ + DAC_CHANNEL_2 = 1, /*!< DAC channel 2 is GPIO26(ESP32) / GPIO18(ESP32S2BETA) */ + DAC_CHANNEL_MAX, +} dac_channel_t; + +/** + * The multiple of the amplitude of the cosine wave generator. The max amplitude is VDD3P3_RTC. + */ +typedef enum { + DAC_CW_SCALE_1 = 0x0, /*!< 1/1. Default. */ + DAC_CW_SCALE_2 = 0x1, /*!< 1/2. */ + DAC_CW_SCALE_4 = 0x2, /*!< 1/4. */ + DAC_CW_SCALE_8 = 0x3, /*!< 1/8. */ +} dac_cw_scale_t; + +/** + * Set the phase of the cosine wave generator output. + */ +typedef enum { + DAC_CW_PHASE_0 = 0x2, /*!< Phase shift +0° */ + DAC_CW_PHASE_180 = 0x3, /*!< Phase shift +180° */ +} dac_cw_phase_t; + +/** + * Config the cosine wave generator function in DAC module. + */ +typedef struct { + dac_channel_t en_ch; /*!< Enable the cosine wave generator of DAC channel. */ + dac_cw_scale_t scale; /*!< Set the amplitude of the cosine wave generator output. */ + dac_cw_phase_t phase; /*!< Set the phase of the cosine wave generator output. */ + uint32_t freq; /*!< Set frequency of cosine wave generator output. Range: 130(130Hz) ~ 55000(100KHz). */ + int8_t offset; /*!< Set the voltage value of the DC component of the cosine wave generator output. + Note: Unreasonable settings can cause waveform to be oversaturated. Range: -128 ~ 127. */ +} dac_cw_config_t; \ No newline at end of file diff --git a/arch/xtensa/include/esp32/soc/include/hal/esp_flash_err.h b/arch/xtensa/include/esp32/soc/include/hal/esp_flash_err.h new file mode 100644 index 0000000000000..d8b723e3c6cb7 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/esp_flash_err.h @@ -0,0 +1,48 @@ +// 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. + +#pragma once + +#include +#include "../../../esp_common/esp_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Possible errors returned from esp flash internal functions, these error codes + * should be consistent with esp_err_t codes. But in order to make the source + * files less dependent to esp_err_t, they use the error codes defined in this + * replacable header. This header should ensure the consistency to esp_err_t. + */ + +enum { + /* These codes should be consistent with esp_err_t errors. However, error codes with the same values are not + * allowed in ESP-IDF. This is a workaround in order to not introduce a dependency between the "soc" and + * "esp_common" components. The disadvantage is that the output of esp_err_to_name(ESP_ERR_FLASH_SIZE_NOT_MATCH) + * will be ESP_ERR_INVALID_SIZE. */ + ESP_ERR_FLASH_SIZE_NOT_MATCH = ESP_ERR_INVALID_SIZE, ///< The chip doesn't have enough space for the current partition table + ESP_ERR_FLASH_NO_RESPONSE = ESP_ERR_INVALID_RESPONSE, ///< Chip did not respond to the command, or timed out. +}; + +//The ROM code has already taken 1 and 2, to avoid possible conflicts, start from 3. +#define ESP_ERR_FLASH_NOT_INITIALISED (ESP_ERR_FLASH_BASE+3) ///< esp_flash_chip_t structure not correctly initialised by esp_flash_init(). +#define ESP_ERR_FLASH_UNSUPPORTED_HOST (ESP_ERR_FLASH_BASE+4) ///< Requested operation isn't supported via this host SPI bus (chip->spi field). +#define ESP_ERR_FLASH_UNSUPPORTED_CHIP (ESP_ERR_FLASH_BASE+5) ///< Requested operation isn't supported by this model of SPI flash chip. +#define ESP_ERR_FLASH_PROTECTED (ESP_ERR_FLASH_BASE+6) ///< Write operation failed due to chip's write protection being enabled. + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/include/hal/gpio_hal.h b/arch/xtensa/include/esp32/soc/include/hal/gpio_hal.h new file mode 100644 index 0000000000000..971496405a0bb --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/gpio_hal.h @@ -0,0 +1,342 @@ +// 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. + +/******************************************************************************* + * NOTICE + * The hal is not public api, don't use in application code. + * See readme.md in soc/include/hal/readme.md + ******************************************************************************/ + +// The HAL layer for GPIO + +#pragma once + +#include "soc/gpio_periph.h" +#include "hal/gpio_ll.h" +#include "hal/gpio_types.h" + +#ifdef CONFIG_LEGACY_INCLUDE_COMMON_HEADERS +#include "soc/rtc_io_reg.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +// Get GPIO hardware instance with giving gpio num +#define GPIO_HAL_GET_HW(num) GPIO_LL_GET_HW(num) + +/** + * Context that should be maintained by both the driver and the HAL + */ + +typedef struct { + gpio_dev_t *dev; + uint32_t version; +} gpio_hal_context_t; + +/** + * @brief Enable pull-up on GPIO. + * + * @param hal Context of the HAL layer + * @param gpio_num GPIO number + */ +#define gpio_hal_pullup_en(hal, gpio_num) gpio_ll_pullup_en((hal)->dev, gpio_num) + +/** + * @brief Disable pull-up on GPIO. + * + * @param hal Context of the HAL layer + * @param gpio_num GPIO number + */ +#define gpio_hal_pullup_dis(hal, gpio_num) gpio_ll_pullup_dis((hal)->dev, gpio_num) + +/** + * @brief Enable pull-down on GPIO. + * + * @param hal Context of the HAL layer + * @param gpio_num GPIO number + */ +#define gpio_hal_pulldown_en(hal, gpio_num) gpio_ll_pulldown_en((hal)->dev, gpio_num) + +/** + * @brief Disable pull-down on GPIO. + * + * @param hal Context of the HAL layer + * @param gpio_num GPIO number + */ +#define gpio_hal_pulldown_dis(hal, gpio_num) gpio_ll_pulldown_dis((hal)->dev, gpio_num) + +/** + * @brief GPIO set interrupt trigger type + * + * @param hal Context of the HAL layer + * @param gpio_num GPIO number. If you want to set the trigger type of e.g. of GPIO16, gpio_num should be GPIO_NUM_16 (16); + * @param intr_type Interrupt type, select from gpio_int_type_t + */ +#define gpio_hal_set_intr_type(hal, gpio_num, intr_type) gpio_ll_set_intr_type((hal)->dev, gpio_num, intr_type) + +/** + * @brief Get GPIO interrupt status + * + * @param hal Context of the HAL layer + * @param core_id interrupt core id + * @param status interrupt status + */ +#define gpio_hal_get_intr_status(hal, core_id, status) gpio_ll_get_intr_status((hal)->dev, core_id, status) + +/** + * @brief Get GPIO interrupt status high + * + * @param hal Context of the HAL layer + * @param core_id interrupt core id + * @param status interrupt status high + */ +#define gpio_hal_get_intr_status_high(hal, core_id, status) gpio_ll_get_intr_status_high((hal)->dev, core_id, status) + +/** + * @brief Clear GPIO interrupt status + * + * @param hal Context of the HAL layer + * @param mask interrupt status clear mask + */ +#define gpio_hal_clear_intr_status(hal, mask) gpio_ll_clear_intr_status((hal)->dev, mask) + +/** + * @brief Clear GPIO interrupt status high + * + * @param hal Context of the HAL layer + * @param mask interrupt status high clear mask + */ +#define gpio_hal_clear_intr_status_high(hal, mask) gpio_ll_clear_intr_status_high((hal)->dev, mask) + +/** + * @brief Enable GPIO module interrupt signal + * + * @param hal Context of the HAL layer + * @param gpio_num GPIO number. If you want to enable the interrupt of e.g. GPIO16, gpio_num should be GPIO_NUM_16 (16); + * @param core_id Interrupt enabled CPU to corresponding ID + */ +void gpio_hal_intr_enable_on_core(gpio_hal_context_t *hal, gpio_num_t gpio_num, uint32_t core_id); + +/** + * @brief Disable GPIO module interrupt signal + * + * @param hal Context of the HAL layer + * @param gpio_num GPIO number. If you want to disable the interrupt of e.g. GPIO16, gpio_num should be GPIO_NUM_16 (16); + */ +void gpio_hal_intr_disable(gpio_hal_context_t *hal, gpio_num_t gpio_num); + +/** + * @brief Disable input mode on GPIO. + * + * @param hal Context of the HAL layer + * @param gpio_num GPIO number + */ +#define gpio_hal_input_disable(hal, gpio_num) gpio_ll_input_disable((hal)->dev, gpio_num) + +/** + * @brief Enable input mode on GPIO. + * + * @param hal Context of the HAL layer + * @param gpio_num GPIO number + */ +#define gpio_hal_input_enable(hal, gpio_num) gpio_ll_input_enable((hal)->dev, gpio_num) + +/** + * @brief Disable output mode on GPIO. + * + * @param hal Context of the HAL layer + * @param gpio_num GPIO number + */ +#define gpio_hal_output_disable(hal, gpio_num) gpio_ll_output_disable((hal)->dev, gpio_num) + +/** + * @brief Enable output mode on GPIO. + * + * @param hal Context of the HAL layer + * @param gpio_num GPIO number + */ +#define gpio_hal_output_enable(hal, gpio_num) gpio_ll_output_enable((hal)->dev, gpio_num) + +/** + * @brief Disable open-drain mode on GPIO. + * + * @param hal Context of the HAL layer + * @param gpio_num GPIO number + */ +#define gpio_hal_od_disable(hal, gpio_num) gpio_ll_od_disable((hal)->dev, gpio_num) + +/** + * @brief Enable open-drain mode on GPIO. + * + * @param hal Context of the HAL layer + * @param gpio_num GPIO number + */ +#define gpio_hal_od_enable(hal, gpio_num) gpio_ll_od_enable((hal)->dev, gpio_num) + +/** + * @brief GPIO set output level + * + * @param hal Context of the HAL layer + * @param gpio_num GPIO number. If you want to set the output level of e.g. GPIO16, gpio_num should be GPIO_NUM_16 (16); + * @param level Output level. 0: low ; 1: high + */ +#define gpio_hal_set_level(hal, gpio_num, level) gpio_ll_set_level((hal)->dev, gpio_num, level) + +/** + * @brief GPIO get input level + * + * @warning If the pad is not configured for input (or input and output) the returned value is always 0. + * + * @param hal Context of the HAL layer + * @param gpio_num GPIO number. If you want to get the logic level of e.g. pin GPIO16, gpio_num should be GPIO_NUM_16 (16); + * + * @return + * - 0 the GPIO input level is 0 + * - 1 the GPIO input level is 1 + */ +#define gpio_hal_get_level(hal, gpio_num) gpio_ll_get_level((hal)->dev, gpio_num) + +/** + * @brief Enable GPIO wake-up function. + * + * @param hal Context of the HAL layer + * @param gpio_num GPIO number. + * @param intr_type GPIO wake-up type. Only GPIO_INTR_LOW_LEVEL or GPIO_INTR_HIGH_LEVEL can be used. + */ +#define gpio_hal_wakeup_enable(hal, gpio_num, intr_type) gpio_ll_wakeup_enable((hal)->dev, gpio_num, intr_type) + +/** + * @brief Disable GPIO wake-up function. + * + * @param hal Context of the HAL layer + * @param gpio_num GPIO number + */ +#define gpio_hal_wakeup_disable(hal, gpio_num) gpio_ll_wakeup_disable((hal)->dev, gpio_num) + +/** + * @brief Set GPIO pad drive capability + * + * @param hal Context of the HAL layer + * @param gpio_num GPIO number, only support output GPIOs + * @param strength Drive capability of the pad + */ +#define gpio_hal_set_drive_capability(hal, gpio_num, strength) gpio_ll_set_drive_capability((hal)->dev, gpio_num, strength) + +/** + * @brief Get GPIO pad drive capability + * + * @param hal Context of the HAL layer + * @param gpio_num GPIO number, only support output GPIOs + * @param strength Pointer to accept drive capability of the pad + */ +#define gpio_hal_get_drive_capability(hal, gpio_num, strength) gpio_ll_get_drive_capability((hal)->dev, gpio_num, strength) + +/** + * @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. + * + * The state of digital gpio cannot be held during Deep-sleep, and it will resume the hold function + * when the chip wakes up from Deep-sleep. If the digital gpio also needs to be held during Deep-sleep, + * `gpio_deep_sleep_hold_en` should also be called. + * + * Power down or call gpio_hold_dis will disable this function. + * + * @param hal Context of the HAL layer + * @param gpio_num GPIO number, only support output GPIOs + */ +#define gpio_hal_hold_en(hal, gpio_num) gpio_ll_hold_en((hal)->dev, gpio_num) + +/** + * @brief Disable gpio pad hold function. + * + * When the chip is woken up from Deep-sleep, the gpio will be set to the default mode, so, the gpio will output + * the default level if this function is called. If you don't want the level changes, the gpio should be configured to + * a known state before this function is called. + * e.g. + * If you hold gpio18 high during Deep-sleep, after the chip is woken up and `gpio_hold_dis` is called, + * gpio18 will output low level(because gpio18 is input mode by default). If you don't want this behavior, + * you should configure gpio18 as output mode and set it to hight level before calling `gpio_hold_dis`. + * + * @param hal Context of the HAL layer + * @param gpio_num GPIO number, only support output GPIOs + */ +#define gpio_hal_hold_dis(hal, gpio_num) gpio_ll_hold_dis((hal)->dev, gpio_num) + +/** + * @brief Enable all digital gpio pad hold function during Deep-sleep. + * + * When the chip is in Deep-sleep mode, all digital gpio will hold the state before sleep, and when the chip is woken up, + * the status of digital gpio will not be held. Note that the pad hold feature only works when the chip is in Deep-sleep mode, + * when not in sleep mode, the digital gpio state can be changed even you have called this function. + * + * Power down or call gpio_hold_dis will disable this function, otherwise, the digital gpio hold feature works as long as the chip enter Deep-sleep. + * + * @param hal Context of the HAL layer + */ +#define gpio_hal_deep_sleep_hold_en(hal) gpio_ll_deep_sleep_hold_en((hal)->dev) + +/** + * @brief Disable all digital gpio pad hold function during Deep-sleep. + * + * @param hal Context of the HAL layer + */ +#define gpio_hal_deep_sleep_hold_dis(hal) gpio_ll_deep_sleep_hold_dis((hal)->dev) + +/** + * @brief Set pad input to a peripheral signal through the IOMUX. + * + * @param hal Context of the HAL layer + * @param gpio_num GPIO number of the pad. + * @param signal_idx Peripheral signal id to input. One of the ``*_IN_IDX`` signals in ``soc/gpio_sig_map.h``. + */ +#define gpio_hal_iomux_in(hal, gpio_num, signal_idx) gpio_ll_iomux_in((hal)->dev, gpio_num, signal_idx) + +/** + * @brief Set peripheral output to an GPIO pad through the IOMUX. + * + * @param hal Context of the HAL layer + * @param gpio_num gpio_num GPIO number of the pad. + * @param func The function number of the peripheral pin to output pin. + * One of the ``FUNC_X_*`` of specified pin (X) in ``soc/io_mux_reg.h``. + * @param oen_inv True if the output enable needs to be inverted, otherwise False. + */ +#define gpio_hal_iomux_out(hal, gpio_num, func, oen_inv) gpio_ll_iomux_out((hal)->dev, gpio_num, func, oen_inv) + +#if GPIO_SUPPORTS_FORCE_HOLD +/** + * @brief Force hold digital and rtc gpio pad. + * @note GPIO force hold, whether the chip in sleep mode or wakeup mode. + * + * @param hal Context of the HAL layer + * */ +#define gpio_hal_force_hold_all(hal) gpio_ll_force_hold_all((hal)->dev) + +/** + * @brief Force unhold digital and rtc gpio pad. + * @note GPIO force unhold, whether the chip in sleep mode or wakeup mode. + * + * @param hal Context of the HAL layer + * */ +#define gpio_hal_force_unhold_all(hal) gpio_ll_force_unhold_all((hal)->dev) +#endif + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/arch/xtensa/include/esp32/soc/include/hal/gpio_types.h b/arch/xtensa/include/esp32/soc/include/hal/gpio_types.h new file mode 100644 index 0000000000000..129aa8615c7f0 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/gpio_types.h @@ -0,0 +1,251 @@ +// 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. + +#pragma once + +#include "../soc/gpio_periph.h" +#include "../../esp32/include/soc/gpio_caps.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + GPIO_PORT_0 = 0, + GPIO_PORT_MAX, +} gpio_port_t; + +#define GPIO_SEL_0 (BIT(0)) /*!< Pin 0 selected */ +#define GPIO_SEL_1 (BIT(1)) /*!< Pin 1 selected */ +#define GPIO_SEL_2 (BIT(2)) /*!< Pin 2 selected */ +#define GPIO_SEL_3 (BIT(3)) /*!< Pin 3 selected */ +#define GPIO_SEL_4 (BIT(4)) /*!< Pin 4 selected */ +#define GPIO_SEL_5 (BIT(5)) /*!< Pin 5 selected */ +#define GPIO_SEL_6 (BIT(6)) /*!< Pin 6 selected */ +#define GPIO_SEL_7 (BIT(7)) /*!< Pin 7 selected */ +#define GPIO_SEL_8 (BIT(8)) /*!< Pin 8 selected */ +#define GPIO_SEL_9 (BIT(9)) /*!< Pin 9 selected */ +#define GPIO_SEL_10 (BIT(10)) /*!< Pin 10 selected */ +#define GPIO_SEL_11 (BIT(11)) /*!< Pin 11 selected */ +#define GPIO_SEL_12 (BIT(12)) /*!< Pin 12 selected */ +#define GPIO_SEL_13 (BIT(13)) /*!< Pin 13 selected */ +#define GPIO_SEL_14 (BIT(14)) /*!< Pin 14 selected */ +#define GPIO_SEL_15 (BIT(15)) /*!< Pin 15 selected */ +#define GPIO_SEL_16 (BIT(16)) /*!< Pin 16 selected */ +#define GPIO_SEL_17 (BIT(17)) /*!< Pin 17 selected */ +#define GPIO_SEL_18 (BIT(18)) /*!< Pin 18 selected */ +#define GPIO_SEL_19 (BIT(19)) /*!< Pin 19 selected */ +#define GPIO_SEL_20 (BIT(20)) /*!< Pin 20 selected */ +#define GPIO_SEL_21 (BIT(21)) /*!< Pin 21 selected */ +#if CONFIG_IDF_TARGET_ESP32 +#define GPIO_SEL_22 (BIT(22)) /*!< Pin 22 selected */ +#define GPIO_SEL_23 (BIT(23)) /*!< Pin 23 selected */ + +#define GPIO_SEL_25 (BIT(25)) /*!< Pin 25 selected */ +#endif +#define GPIO_SEL_26 (BIT(26)) /*!< Pin 26 selected */ +#define GPIO_SEL_27 (BIT(27)) /*!< Pin 27 selected */ +#define GPIO_SEL_28 (BIT(28)) /*!< Pin 28 selected */ +#define GPIO_SEL_29 (BIT(29)) /*!< Pin 29 selected */ +#define GPIO_SEL_30 (BIT(30)) /*!< Pin 30 selected */ +#define GPIO_SEL_31 (BIT(31)) /*!< Pin 31 selected */ +#define GPIO_SEL_32 ((uint64_t)(((uint64_t)1)<<32)) /*!< Pin 32 selected */ +#define GPIO_SEL_33 ((uint64_t)(((uint64_t)1)<<33)) /*!< Pin 33 selected */ +#define GPIO_SEL_34 ((uint64_t)(((uint64_t)1)<<34)) /*!< Pin 34 selected */ +#define GPIO_SEL_35 ((uint64_t)(((uint64_t)1)<<35)) /*!< Pin 35 selected */ +#define GPIO_SEL_36 ((uint64_t)(((uint64_t)1)<<36)) /*!< Pin 36 selected */ +#define GPIO_SEL_37 ((uint64_t)(((uint64_t)1)<<37)) /*!< Pin 37 selected */ +#define GPIO_SEL_38 ((uint64_t)(((uint64_t)1)<<38)) /*!< Pin 38 selected */ +#define GPIO_SEL_39 ((uint64_t)(((uint64_t)1)<<39)) /*!< Pin 39 selected */ +#if GPIO_PIN_COUNT > 40 +#define GPIO_SEL_40 ((uint64_t)(((uint64_t)1)<<40)) /*!< Pin 40 selected */ +#define GPIO_SEL_41 ((uint64_t)(((uint64_t)1)<<41)) /*!< Pin 41 selected */ +#define GPIO_SEL_42 ((uint64_t)(((uint64_t)1)<<42)) /*!< Pin 42 selected */ +#define GPIO_SEL_43 ((uint64_t)(((uint64_t)1)<<43)) /*!< Pin 43 selected */ +#define GPIO_SEL_44 ((uint64_t)(((uint64_t)1)<<44)) /*!< Pin 44 selected */ +#define GPIO_SEL_45 ((uint64_t)(((uint64_t)1)<<45)) /*!< Pin 45 selected */ +#define GPIO_SEL_46 ((uint64_t)(((uint64_t)1)<<46)) /*!< Pin 46 selected */ +#endif + +#define GPIO_PIN_REG_0 IO_MUX_GPIO0_REG +#define GPIO_PIN_REG_1 IO_MUX_GPIO1_REG +#define GPIO_PIN_REG_2 IO_MUX_GPIO2_REG +#define GPIO_PIN_REG_3 IO_MUX_GPIO3_REG +#define GPIO_PIN_REG_4 IO_MUX_GPIO4_REG +#define GPIO_PIN_REG_5 IO_MUX_GPIO5_REG +#define GPIO_PIN_REG_6 IO_MUX_GPIO6_REG +#define GPIO_PIN_REG_7 IO_MUX_GPIO7_REG +#define GPIO_PIN_REG_8 IO_MUX_GPIO8_REG +#define GPIO_PIN_REG_9 IO_MUX_GPIO9_REG +#define GPIO_PIN_REG_10 IO_MUX_GPIO10_REG +#define GPIO_PIN_REG_11 IO_MUX_GPIO11_REG +#define GPIO_PIN_REG_12 IO_MUX_GPIO12_REG +#define GPIO_PIN_REG_13 IO_MUX_GPIO13_REG +#define GPIO_PIN_REG_14 IO_MUX_GPIO14_REG +#define GPIO_PIN_REG_15 IO_MUX_GPIO15_REG +#define GPIO_PIN_REG_16 IO_MUX_GPIO16_REG +#define GPIO_PIN_REG_17 IO_MUX_GPIO17_REG +#define GPIO_PIN_REG_18 IO_MUX_GPIO18_REG +#define GPIO_PIN_REG_19 IO_MUX_GPIO19_REG +#define GPIO_PIN_REG_20 IO_MUX_GPIO20_REG +#define GPIO_PIN_REG_21 IO_MUX_GPIO21_REG +#define GPIO_PIN_REG_22 IO_MUX_GPIO22_REG +#define GPIO_PIN_REG_23 IO_MUX_GPIO23_REG +#define GPIO_PIN_REG_24 IO_MUX_GPIO24_REG +#define GPIO_PIN_REG_25 IO_MUX_GPIO25_REG +#define GPIO_PIN_REG_26 IO_MUX_GPIO26_REG +#define GPIO_PIN_REG_27 IO_MUX_GPIO27_REG +#if CONFIG_IDF_TARGET_ESP32S2BETA +#define GPIO_PIN_REG_28 IO_MUX_GPIO28_REG +#define GPIO_PIN_REG_29 IO_MUX_GPIO29_REG +#define GPIO_PIN_REG_30 IO_MUX_GPIO30_REG +#define GPIO_PIN_REG_31 IO_MUX_GPIO31_REG +#endif +#define GPIO_PIN_REG_32 IO_MUX_GPIO32_REG +#define GPIO_PIN_REG_33 IO_MUX_GPIO33_REG +#define GPIO_PIN_REG_34 IO_MUX_GPIO34_REG +#define GPIO_PIN_REG_35 IO_MUX_GPIO35_REG +#define GPIO_PIN_REG_36 IO_MUX_GPIO36_REG +#define GPIO_PIN_REG_37 IO_MUX_GPIO37_REG +#define GPIO_PIN_REG_38 IO_MUX_GPIO38_REG +#define GPIO_PIN_REG_39 IO_MUX_GPIO39_REG +#if GPIO_PIN_COUNT > 40 +#define GPIO_PIN_REG_40 IO_MUX_GPIO40_REG +#define GPIO_PIN_REG_41 IO_MUX_GPIO41_REG +#define GPIO_PIN_REG_42 IO_MUX_GPIO42_REG +#define GPIO_PIN_REG_43 IO_MUX_GPIO43_REG +#define GPIO_PIN_REG_44 IO_MUX_GPIO44_REG +#define GPIO_PIN_REG_45 IO_MUX_GPIO45_REG +#define GPIO_PIN_REG_46 IO_MUX_GPIO46_REG +#endif + +typedef enum { + GPIO_NUM_NC = -1, /*!< Use to signal not connected to S/W */ + GPIO_NUM_0 = 0, /*!< GPIO0, input and output */ + GPIO_NUM_1 = 1, /*!< GPIO1, input and output */ + GPIO_NUM_2 = 2, /*!< GPIO2, input and output */ + GPIO_NUM_3 = 3, /*!< GPIO3, input and output */ + GPIO_NUM_4 = 4, /*!< GPIO4, input and output */ + GPIO_NUM_5 = 5, /*!< GPIO5, input and output */ + GPIO_NUM_6 = 6, /*!< GPIO6, input and output */ + GPIO_NUM_7 = 7, /*!< GPIO7, input and output */ + GPIO_NUM_8 = 8, /*!< GPIO8, input and output */ + GPIO_NUM_9 = 9, /*!< GPIO9, input and output */ + GPIO_NUM_10 = 10, /*!< GPIO10, input and output */ + GPIO_NUM_11 = 11, /*!< GPIO11, input and output */ + GPIO_NUM_12 = 12, /*!< GPIO12, input and output */ + GPIO_NUM_13 = 13, /*!< GPIO13, input and output */ + GPIO_NUM_14 = 14, /*!< GPIO14, input and output */ + GPIO_NUM_15 = 15, /*!< GPIO15, input and output */ + GPIO_NUM_16 = 16, /*!< GPIO16, input and output */ + GPIO_NUM_17 = 17, /*!< GPIO17, input and output */ + GPIO_NUM_18 = 18, /*!< GPIO18, input and output */ + GPIO_NUM_19 = 19, /*!< GPIO19, input and output */ + GPIO_NUM_20 = 20, /*!< GPIO20, input and output */ + GPIO_NUM_21 = 21, /*!< GPIO21, input and output */ +#if CONFIG_IDF_TARGET_ESP32 + GPIO_NUM_22 = 22, /*!< GPIO22, input and output */ + GPIO_NUM_23 = 23, /*!< GPIO23, input and output */ + + GPIO_NUM_25 = 25, /*!< GPIO25, input and output */ +#endif + /* Note: The missing IO is because it is used inside the chip. */ + GPIO_NUM_26 = 26, /*!< GPIO26, input and output */ + GPIO_NUM_27 = 27, /*!< GPIO27, input and output */ + GPIO_NUM_28 = 28, /*!< GPIO28, input and output */ + GPIO_NUM_29 = 29, /*!< GPIO29, input and output */ + GPIO_NUM_30 = 30, /*!< GPIO30, input and output */ + GPIO_NUM_31 = 31, /*!< GPIO31, input and output */ + GPIO_NUM_32 = 32, /*!< GPIO32, input and output */ + GPIO_NUM_33 = 33, /*!< GPIO33, input and output */ + GPIO_NUM_34 = 34, /*!< GPIO34, input mode only(ESP32) / input and output(ESP32-S2) */ + GPIO_NUM_35 = 35, /*!< GPIO35, input mode only(ESP32) / input and output(ESP32-S2) */ + GPIO_NUM_36 = 36, /*!< GPIO36, input mode only(ESP32) / input and output(ESP32-S2) */ + GPIO_NUM_37 = 37, /*!< GPIO37, input mode only(ESP32) / input and output(ESP32-S2) */ + GPIO_NUM_38 = 38, /*!< GPIO38, input mode only(ESP32) / input and output(ESP32-S2) */ + GPIO_NUM_39 = 39, /*!< GPIO39, input mode only(ESP32) / input and output(ESP32-S2) */ +#if GPIO_PIN_COUNT > 40 + GPIO_NUM_40 = 40, /*!< GPIO40, input and output */ + GPIO_NUM_41 = 41, /*!< GPIO41, input and output */ + GPIO_NUM_42 = 42, /*!< GPIO42, input and output */ + GPIO_NUM_43 = 43, /*!< GPIO43, input and output */ + GPIO_NUM_44 = 44, /*!< GPIO44, input and output */ + GPIO_NUM_45 = 45, /*!< GPIO45, input and output */ + GPIO_NUM_46 = 46, /*!< GPIO46, input mode only */ +#endif + GPIO_NUM_MAX, +/** @endcond */ +} gpio_num_t; + +typedef enum { + GPIO_INTR_DISABLE = 0, /*!< Disable GPIO interrupt */ + GPIO_INTR_POSEDGE = 1, /*!< GPIO interrupt type : rising edge */ + GPIO_INTR_NEGEDGE = 2, /*!< GPIO interrupt type : falling edge */ + GPIO_INTR_ANYEDGE = 3, /*!< GPIO interrupt type : both rising and falling edge */ + GPIO_INTR_LOW_LEVEL = 4, /*!< GPIO interrupt type : input low level trigger */ + GPIO_INTR_HIGH_LEVEL = 5, /*!< GPIO interrupt type : input high level trigger */ + GPIO_INTR_MAX, +} gpio_int_type_t; + +typedef enum { + GPIO_MODE_DISABLE = GPIO_MODE_DEF_DISABLE, /*!< GPIO mode : disable input and output */ + GPIO_MODE_INPUT = GPIO_MODE_DEF_INPUT, /*!< GPIO mode : input only */ + GPIO_MODE_OUTPUT = GPIO_MODE_DEF_OUTPUT, /*!< GPIO mode : output only mode */ + GPIO_MODE_OUTPUT_OD = ((GPIO_MODE_DEF_OUTPUT) | (GPIO_MODE_DEF_OD)), /*!< GPIO mode : output only with open-drain mode */ + GPIO_MODE_INPUT_OUTPUT_OD = ((GPIO_MODE_DEF_INPUT) | (GPIO_MODE_DEF_OUTPUT) | (GPIO_MODE_DEF_OD)), /*!< GPIO mode : output and input with open-drain mode*/ + GPIO_MODE_INPUT_OUTPUT = ((GPIO_MODE_DEF_INPUT) | (GPIO_MODE_DEF_OUTPUT)), /*!< GPIO mode : output and input mode */ +} gpio_mode_t; + +typedef enum { + GPIO_PULLUP_DISABLE = 0x0, /*!< Disable GPIO pull-up resistor */ + GPIO_PULLUP_ENABLE = 0x1, /*!< Enable GPIO pull-up resistor */ +} gpio_pullup_t; + +typedef enum { + GPIO_PULLDOWN_DISABLE = 0x0, /*!< Disable GPIO pull-down resistor */ + GPIO_PULLDOWN_ENABLE = 0x1, /*!< Enable GPIO pull-down resistor */ +} gpio_pulldown_t; + +/** + * @brief Configuration parameters of GPIO pad for gpio_config function + */ +typedef struct { + uint64_t pin_bit_mask; /*!< GPIO pin: set with bit mask, each bit maps to a GPIO */ + gpio_mode_t mode; /*!< GPIO mode: set input/output mode */ + gpio_pullup_t pull_up_en; /*!< GPIO pull-up */ + gpio_pulldown_t pull_down_en; /*!< GPIO pull-down */ + gpio_int_type_t intr_type; /*!< GPIO interrupt type */ +} gpio_config_t; + +typedef enum { + GPIO_PULLUP_ONLY, /*!< Pad pull up */ + GPIO_PULLDOWN_ONLY, /*!< Pad pull down */ + GPIO_PULLUP_PULLDOWN, /*!< Pad pull up + pull down*/ + GPIO_FLOATING, /*!< Pad floating */ +} gpio_pull_mode_t; + +typedef enum { + GPIO_DRIVE_CAP_0 = 0, /*!< Pad drive capability: weak */ + GPIO_DRIVE_CAP_1 = 1, /*!< Pad drive capability: stronger */ + GPIO_DRIVE_CAP_2 = 2, /*!< Pad drive capability: medium */ + GPIO_DRIVE_CAP_DEFAULT = 2, /*!< Pad drive capability: medium */ + GPIO_DRIVE_CAP_3 = 3, /*!< Pad drive capability: strongest */ + GPIO_DRIVE_CAP_MAX, +} gpio_drive_cap_t; + +typedef void (*gpio_isr_t)(void *); + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/include/hal/hal_defs.h b/arch/xtensa/include/esp32/soc/include/hal/hal_defs.h new file mode 100644 index 0000000000000..f209ac09c9002 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/hal_defs.h @@ -0,0 +1,30 @@ +// Copyright 2010-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. + +#pragma once + +#include "esp_log.h" + +// platform related stuff + +#define HAL_SWAP32(word) __builtin_bswap32(word) +#define HAL_SWAP64(word) __builtin_bswap64(word) + +#define HAL_LOGE(...) ESP_LOGE(__VA_ARGS__) +#define HAL_LOGW(...) ESP_LOGW(__VA_ARGS__) +#define HAL_LOGI(...) ESP_LOGI(__VA_ARGS__) +#define HAL_LOGD(...) ESP_LOGD(__VA_ARGS__) +#define HAL_LOGV(...) ESP_LOGV(__VA_ARGS__) + +#define STATIC_HAL_REG_CHECK(TAG, ENUM, VAL) _Static_assert((ENUM) == (VAL), #TAG" "#ENUM" definition no longer matches register value") diff --git a/arch/xtensa/include/esp32/soc/include/hal/i2c_hal.h b/arch/xtensa/include/esp32/soc/include/hal/i2c_hal.h new file mode 100644 index 0000000000000..5b148e02ae3ef --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/i2c_hal.h @@ -0,0 +1,524 @@ +// 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. + +/******************************************************************************* + * NOTICE + * The hal is not public api, don't use in application code. + * See readme.md in soc/include/hal/readme.md + ******************************************************************************/ + +// The HAL layer for I2C + +#pragma once +#include "hal/i2c_ll.h" +#include "hal/i2c_types.h" + +/** + * @brief I2C hal Context definition + */ +typedef struct { + i2c_dev_t *dev; + uint32_t version; +} i2c_hal_context_t; + +/** + * @brief Write the I2C rxfifo with the given length + * + * @param hal Context of the HAL layer + * @param wr_data Pointer to data buffer + * @param wr_size Amount of data needs write + * + * @return None + */ +#define i2c_hal_write_txfifo(hal,wr_data,wr_size) i2c_ll_write_txfifo((hal)->dev,wr_data,wr_size) + +/** + * @brief Read the I2C rxfifo with the given length + * + * @param hal Context of the HAL layer + * @param buf Pointer to data buffer + * @param rd_size Amount of data needs read + * + * @return None + */ +#define i2c_hal_read_rxfifo(hal,buf,rd_size) i2c_ll_read_rxfifo((hal)->dev,buf,rd_size) + +/** + * @brief Write I2C cmd register + * + * @param hal Context of the HAL layer + * @param cmd I2C hardware command + * @param cmd_idx The index of the command register, should be less than 16 + * + * @return None + */ +#define i2c_hal_write_cmd_reg(hal,cmd, cmd_idx) i2c_ll_write_cmd_reg((hal)->dev,cmd,cmd_idx) + +/** + * @brief Configure the I2C to triger a trasaction + * + * @param hal Context of the HAL layer + * + * @return None + */ +#define i2c_hal_trans_start(hal) i2c_ll_trans_start((hal)->dev) + +/** + * @brief Enable I2C master RX interrupt + * + * @param hal Context of the HAL layer + * + * @return None + */ +#define i2c_hal_enable_master_rx_it(hal) i2c_ll_master_enable_rx_it((hal)->dev) + +/** + * @brief Enable I2C master TX interrupt + * + * @param hal Context of the HAL layer + * + * @return None + */ +#define i2c_hal_enable_master_tx_it(hal) i2c_ll_master_enable_tx_it((hal)->dev) + +/** + * @brief Clear I2C slave TX interrupt + * + * @param hal Context of the HAL layer + * + * @return None + */ +#define i2c_hal_slave_clr_tx_it(hal) i2c_ll_slave_clr_tx_it((hal)->dev) + +/** + * @brief Clear I2C slave RX interrupt + * + * @param hal Context of the HAL layer + * + * @return None + */ +#define i2c_hal_slave_clr_rx_it(hal) i2c_ll_slave_clr_rx_it((hal)->dev) + +/** + * @brief Init the I2C master. + * + * @param hal Context of the HAL layer + * @param i2c_num I2C port number + * + * @return None + */ +void i2c_hal_master_init(i2c_hal_context_t *hal, i2c_port_t i2c_num); + +/** + * @brief Init the I2C slave. + * + * @param hal Context of the HAL layer + * @param i2c_num I2C port number + * + * @return None + */ +void i2c_hal_slave_init(i2c_hal_context_t *hal, i2c_port_t i2c_num); + +/** + * @brief Reset the I2C hw txfifo + * + * @param hal Context of the HAL layer + * + * @return None + */ +void i2c_hal_txfifo_rst(i2c_hal_context_t *hal); + +/** + * @brief Reset the I2C hw rxfifo + * + * @param hal Context of the HAL layer + * + * @return None + */ +void i2c_hal_rxfifo_rst(i2c_hal_context_t *hal); + +/** + * @brief Configure the I2C data MSB bit shifted first or LSB bit shifted first. + * + * @param hal Context of the HAL layer + * @param tx_mode Data format of TX + * @param rx_mode Data format of RX + * + * @return None + */ +void i2c_hal_set_data_mode(i2c_hal_context_t *hal, i2c_trans_mode_t tx_mode, i2c_trans_mode_t rx_mode); + +/** + * @brief Configure the I2C hardware filter function. + * + * @param hal Context of the HAL layer + * @param filter_num If the glitch period on the line is less than this value(in APB cycle), it will be filtered out + * If `filter_num == 0`, the filter will be disabled + * + * @return None + */ +void i2c_hal_set_filter(i2c_hal_context_t *hal, uint8_t filter_num); + +/** + * @brief Get the I2C hardware filter configuration + * + * @param hal Context of the HAL layer + * @param filter_num Pointer to accept the hardware filter configuration + * + * @return None + */ +void i2c_hal_get_filter(i2c_hal_context_t *hal, uint8_t *filter_num); + +/** + * @brief Configure the I2C SCL timing + * + * @param hal Context of the HAL layer + * @param hight_period SCL high period + * @param low_period SCL low period + * + * @return None + */ +void i2c_hal_set_scl_timing(i2c_hal_context_t *hal, int hight_period, int low_period); + +/** + * @brief Configure the I2C master SCL frequency + * + * @param hal Context of the HAL layer + * @param src_clk The I2C Source clock frequency + * @param scl_freq The SCL frequency to be set + * + * @return None + */ +void i2c_hal_set_scl_freq(i2c_hal_context_t *hal, uint32_t src_clk, uint32_t scl_freq); + +/** + * @brief Clear the I2C interrupt status with the given mask + * + * @param hal Context of the HAL layer + * @param mask The interrupt bitmap needs to be clearned + * + * @return None + */ +void i2c_hal_clr_intsts_mask(i2c_hal_context_t *hal, uint32_t mask); + +/** + * @brief Enable the I2C interrupt with the given mask + * + * @param hal Context of the HAL layer + * @param mask The interrupt bitmap needs to be enabled + * + * @return None + */ +void i2c_hal_enable_intr_mask(i2c_hal_context_t *hal, uint32_t mask); + +/** + * @brief Disable the I2C interrupt with the given mask + * + * @param hal Context of the HAL layer + * @param mask The interrupt bitmap needs to be disabled + * + * @return None + */ +void i2c_hal_disable_intr_mask(i2c_hal_context_t *hal, uint32_t mask); + +/** + * @brief Configure the I2C memory access mode, FIFO mode or none FIFO mode + * + * @param hal Context of the HAL layer + * @param fifo_mode_en Set true to enable FIFO access mode, else set it false + * + * @return None + */ +void i2c_hal_set_fifo_mode(i2c_hal_context_t *hal, bool fifo_mode_en); + +/** + * @brief Configure the I2C timeout value + * + * @param hal Context of the HAL layer + * @param tout_val the timeout value to be set + * + * @return None + */ +void i2c_hal_set_tout(i2c_hal_context_t *hal, int tout_val); + +/** + * @brief Get the I2C time out configuration + * + * @param tout_val Pointer to accept the timeout configuration + * + * @return None + */ +void i2c_hal_get_tout(i2c_hal_context_t *hal, int *tout_val); + +/** + * @brief Configure the I2C slave address + * + * @param hal Context of the HAL layer + * @param slave_addr Slave address + * @param addr_10bit_en Set true to enable 10-bit slave address mode, Set false to enable 7-bit address mode + * + * @return None + */ +void i2c_hal_set_slave_addr(i2c_hal_context_t *hal, uint16_t slave_addr, bool addr_10bit_en); + +/** + * @brief Configure the I2C stop timing + * + * @param hal Context of the HAL layer + * @param stop_setup The stop condition setup period (in APB cycle) + * @param stop_hold The stop condition hold period (in APB cycle) + * + * @return None + */ +void i2c_hal_set_stop_timing(i2c_hal_context_t *hal, int stop_setup, int stop_hold); + +/** + * @brief Configure the I2C start timing + * + * @param hal Context of the HAL layer + * @param start_setup The start condition setup period (in APB cycle) + * @param start_hold The start condition hold period (in APB cycle) + * + * @return None + */ +void i2c_hal_set_start_timing(i2c_hal_context_t *hal, int start_setup, int start_hold); + +/** + * @brief Configure the I2C sda sample timing + * + * @param hal Context of the HAL layer + * @param sda_sample The SDA sample time (in APB cycle) + * @param sda_hold The SDA hold time (in APB cycle) + * + * @return None + */ +void i2c_hal_set_sda_timing(i2c_hal_context_t *hal, int sda_sample, int sda_hold); + +/** + * @brief Configure the I2C txfifo empty threshold value + * + * @param hal Context of the HAL layer. + * @param empty_thr TxFIFO empty threshold value + * + * @return None + */ +void i2c_hal_set_txfifo_empty_thr(i2c_hal_context_t *hal, uint8_t empty_thr); + +/** + * @brief Configure the I2C rxfifo full threshold value + * + * @param hal Context of the HAL layer + * @param full_thr RxFIFO full threshold value + * + * @return None + */ +void i2c_hal_set_rxfifo_full_thr(i2c_hal_context_t *hal, uint8_t full_thr); + +/** + * @brief Get the I2C interrupt status + * + * @param hal Context of the HAL layer + * @param mask Pointer to accept the interrupt status + * + * @return None + */ +void i2c_hal_get_intsts_mask(i2c_hal_context_t *hal, uint32_t *mask); + +/** + * @brief Check if the I2C bus is busy + * + * @param hal Context of the HAL layer + * + * @return True if the bus is busy, otherwise, fale will be returned + */ +bool i2c_hal_is_bus_busy(i2c_hal_context_t *hal); + +/** + * @brief Get the I2C sda sample timing configuration + * + * @param hal Context of the HAL layer + * @param sample_time Pointer to accept the SDA sample time + * @param hold_time Pointer to accept the SDA hold time + * + * @return None + */ +void i2c_hal_get_sda_timing(i2c_hal_context_t *hal, int *sample_time, int *hold_time); + +/** + * @brief Get the I2C stop timing configuration + * + * @param hal Context of the HAL layer + * @param setup_time Pointer to accept the stop condition setup period + * @param hold_time Pointer to accept the stop condition hold period + * + * @return None + */ +void i2c_hal_get_stop_timing(i2c_hal_context_t *hal, int *setup_time, int *hold_time); + +/** + * @brief Get the I2C scl timing configuration + * + * @param hal Context of the HAL layer + * @param high_period Pointer to accept the scl high period + * @param low_period Pointer to accept the scl low period + * + * @return None + */ +void i2c_hal_get_scl_timing(i2c_hal_context_t *hal, int *high_period, int *low_period); + +/** + * @brief Get the I2C start timing configuration + * + * @param hal Context of the HAL layer + * @param setup_time Pointer to accept the start condition setup period + * @param hold_time Pointer to accept the start condition hold period + * + * @return None + */ +void i2c_hal_get_start_timing(i2c_hal_context_t *hal, int *setup_time, int *hold_time); + +/** + * @brief Check if the I2C is master mode + * + * @param hal Context of the HAL layer + * + * @return True if in master mode, otherwise, false will be returned + */ +bool i2c_hal_is_master_mode(i2c_hal_context_t *hal); + +/** + * @brief Get the rxFIFO readable length + * + * @param hal Context of the HAL layer + * @param len Pointer to accept the rxFIFO readable length + * + * @return None + */ +void i2c_hal_get_rxfifo_cnt(i2c_hal_context_t *hal, uint32_t *len); + +/** + * @brief Set I2C bus timing with the given frequency + * + * @param hal Context of the HAL layer + * @param scl_freq The scl frequency to be set + * @param src_clk Source clock of I2C + * + * @return None + */ +void i2c_hal_set_bus_timing(i2c_hal_context_t *hal, uint32_t scl_freq, i2c_sclk_t src_clk); + +/** + * @brief Get I2C txFIFO writeable length + * + * @param hal Context of the HAL layer + * @param len Pointer to accept the txFIFO writeable length + * + * @return None + */ +void i2c_hal_get_txfifo_cnt(i2c_hal_context_t *hal, uint32_t *len); + +/** + * @brief Check if the I2C is master mode + * + * @param hal Context of the HAL layer + * @param tx_mode Pointer to accept the TX data mode + * @param rx_mode Pointer to accept the RX data mode + * + * @return None + */ +void i2c_hal_get_data_mode(i2c_hal_context_t *hal, i2c_trans_mode_t *tx_mode, i2c_trans_mode_t *rx_mode); + +/** + * @brief I2C hardware FSM reset + * + * @param hal Context of the HAL layer + * + * @return None + */ +void i2c_hal_master_fsm_rst(i2c_hal_context_t *hal); + +/** + * @brief @brief Clear I2C bus + * + * @param hal Context of the HAL layer + * + * @return None + */ +void i2c_hal_master_clr_bus(i2c_hal_context_t *hal); + +/** + * @brief Enable I2C slave TX interrupt + * + * @param hal Context of the HAL layer + * + * @return None + */ +void i2c_hal_enable_slave_tx_it(i2c_hal_context_t *hal); + +/** + * @brief Disable I2C slave TX interrupt + * + * @param hal Context of the HAL layer + * + * @return None + */ +void i2c_hal_disable_slave_tx_it(i2c_hal_context_t *hal); + +/** + * @brief Enable I2C slave RX interrupt + * + * @param hal Context of the HAL layer + * + * @return None + */ +void i2c_hal_enable_slave_rx_it(i2c_hal_context_t *hal); + +/** + * @brief Disable I2C slave RX interrupt + * + * @param hal Context of the HAL layer + * + * @return None + */ +void i2c_hal_disable_slave_rx_it(i2c_hal_context_t *hal); + +/** + * @brief I2C master handle tx interrupt event + * + * @param hal Context of the HAL layer + * @param event Pointer to accept the interrupt event + * + * @return None + */ +void i2c_hal_master_handle_tx_event(i2c_hal_context_t *hal, i2c_intr_event_t *event); + +/** + * @brief I2C master handle rx interrupt event + * + * @param hal Context of the HAL layer + * @param event Pointer to accept the interrupt event + * + * @return None + */ +void i2c_hal_master_handle_rx_event(i2c_hal_context_t *hal, i2c_intr_event_t *event); + +/** + * @brief I2C slave handle interrupt event + * + * @param hal Context of the HAL layer + * @param event Pointer to accept the interrupt event + * + * @return None + */ +void i2c_hal_slave_handle_event(i2c_hal_context_t *hal, i2c_intr_event_t *event); \ No newline at end of file diff --git a/arch/xtensa/include/esp32/soc/include/hal/i2c_types.h b/arch/xtensa/include/esp32/soc/include/hal/i2c_types.h new file mode 100644 index 0000000000000..426515c0dc119 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/i2c_types.h @@ -0,0 +1,96 @@ +// 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. + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include "soc/i2c_caps.h" + +/** + * @brief I2C port number, can be I2C_NUM_0 ~ (I2C_NUM_MAX-1). + */ +typedef int i2c_port_t; + +typedef enum{ + I2C_MODE_SLAVE = 0, /*!< I2C slave mode */ + I2C_MODE_MASTER, /*!< I2C master mode */ + I2C_MODE_MAX, +} i2c_mode_t; + +typedef enum { + I2C_MASTER_WRITE = 0, /*!< I2C write data */ + I2C_MASTER_READ, /*!< I2C read data */ +} i2c_rw_t; + +typedef enum{ + I2C_CMD_RESTART = 0, /*!dev, status) + +/** + * @brief Clear I2S interrupt status + * + * @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) + +/** + * @brief Get I2S out eof des address + * + * @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) + +/** + * @brief Get I2S in eof des address + * + * @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) + +/** + * @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 Set I2S tx mode + * + * @param hal Context of the HAL layer + * @param ch i2s channel + * @param bits bits per sample + */ +void i2s_hal_set_tx_mode(i2s_hal_context_t *hal, i2s_channel_t ch, i2s_bits_per_sample_t bits); + +/** + * @brief Set I2S rx 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); + +/** + * @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 Get I2S tx pdm + * + * @param hal Context of the HAL layer + * @param fp tx pdm fp + * @param fs tx pdm fs + */ +void i2s_hal_get_tx_pdm(i2s_hal_context_t *hal, int *fp, int *fs); + +/** + * @brief Get I2S rx sinc dsr 16 en + * + * @param hal Context of the HAL layer + * @param en 0: disable, 1: enable + */ +#define i2s_hal_get_rx_sinc_dsr_16_en(hal, en) i2s_ll_get_rx_sinc_dsr_16_en((hal)->dev, en) + +/** + * @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 + * + * @param hal Context of the HAL layer + */ +void i2s_hal_reset(i2s_hal_context_t *hal); + +/** + * @brief Start I2S tx + * + * @param hal Context of the HAL layer + */ +void i2s_hal_start_tx(i2s_hal_context_t *hal); + +/** + * @brief Start I2S rx + * + * @param hal Context of the HAL layer + */ +void i2s_hal_start_rx(i2s_hal_context_t *hal); + +/** + * @brief Stop I2S tx + * + * @param hal Context of the HAL layer + */ +void i2s_hal_stop_tx(i2s_hal_context_t *hal); + +/** + * @brief Stop I2S rx + * + * @param hal Context of the HAL layer + */ +void i2s_hal_stop_rx(i2s_hal_context_t *hal); + +/** + * @brief Set I2S pdm rx down sample + * + * @param hal Context of the HAL layer + * @param dsr 0:disable, 1: enable + */ +#define i2s_hal_set_pdm_rx_down_sample(hal, dsr) i2s_ll_set_rx_sinc_dsr_16_en((hal)->dev, dsr) + +/** + * @brief Config I2S param + * + * @param hal Context of the HAL layer + * @param i2s_config I2S configurations - see i2s_config_t struct + */ +void i2s_hal_config_param(i2s_hal_context_t *hal, const i2s_config_t *i2s_config); + +/** + * @brief Enable I2S sig loopback + * + * @param hal Context of the HAL layer + */ +#define i2s_hal_enable_sig_loopback(hal) i2s_ll_set_sig_loopback((hal)->dev, 1) + +/** + * @brief Enable I2S master mode + * + * @param hal Context of the HAL layer + */ +void i2s_hal_enable_master_mode(i2s_hal_context_t *hal); + +/** + * @brief Enable I2S slave mode + * + * @param hal Context of the HAL layer + */ +void i2s_hal_enable_slave_mode(i2s_hal_context_t *hal); + +/** + * @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 + * + * @param hal Context of the HAL layer + * @param i2s_num The uart port number, the max port number is (I2S_NUM_MAX -1) + */ +void i2s_hal_init(i2s_hal_context_t *hal, int i2s_num); + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/include/hal/i2s_types.h b/arch/xtensa/include/esp32/soc/include/hal/i2s_types.h new file mode 100644 index 0000000000000..471d105feed05 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/i2s_types.h @@ -0,0 +1,195 @@ +// 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. + +#pragma once + +#include +#include +#include +#include "soc/i2s_caps.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief I2S port number, the max port number is (I2S_NUM_MAX -1). + */ +typedef int i2s_port_t; + +#define I2S_PIN_NO_CHANGE (-1) /*!< Use in i2s_pin_config_t for pins which should not be changed */ + +/** + * @brief I2S bit width per sample. + * + */ +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_t; + +/** + * @brief I2S channel. + * + */ +typedef enum { + I2S_CHANNEL_MONO = 1, /*!< I2S 1 channel (mono)*/ + I2S_CHANNEL_STEREO = 2 /*!< I2S 2 channel (stereo)*/ +} i2s_channel_t; + +/** + * @brief I2S communication standard format + * + */ +typedef enum { + I2S_COMM_FORMAT_I2S = 0x01, /*!< I2S communication format I2S*/ + I2S_COMM_FORMAT_I2S_MSB = 0x02, /*!< I2S format MSB*/ + I2S_COMM_FORMAT_I2S_LSB = 0x04, /*!< I2S format LSB*/ + I2S_COMM_FORMAT_PCM = 0x08, /*!< I2S communication format PCM*/ + I2S_COMM_FORMAT_PCM_SHORT = 0x10, /*!< PCM Short*/ + I2S_COMM_FORMAT_PCM_LONG = 0x20, /*!< PCM Long*/ +} i2s_comm_format_t; + + +/** + * @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_t; + +/** + * @brief PDM sample rate ratio, measured in Hz. + * + */ +typedef enum { + PDM_SAMPLE_RATE_RATIO_64, + PDM_SAMPLE_RATE_RATIO_128, +} pdm_sample_rate_ratio_t; + +/** + * @brief PDM PCM convter enable/disable. + * + */ +typedef enum { + PDM_PCM_CONV_ENABLE, + PDM_PCM_CONV_DISABLE, +} pdm_pcm_conv_t; + +/** + * @brief I2S Mode, defaut is I2S_MODE_MASTER | I2S_MODE_TX + * + * @note PDM and built-in DAC functions are only supported on I2S0 for current ESP32 chip. + * + */ +typedef enum { + I2S_MODE_MASTER = 1, + I2S_MODE_SLAVE = 2, + I2S_MODE_TX = 4, + I2S_MODE_RX = 8, + I2S_MODE_DAC_BUILT_IN = 16, /*!< 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 = 32, /*!< Input I2S data from built-in ADC, each data can be 12-bit width at most*/ +#if SOC_I2S_SUPPORT_PDM + I2S_MODE_PDM = 64, +#endif +} i2s_mode_t; + +/** + * @brief I2S configuration parameters for i2s_param_config function + * + */ +typedef struct { + i2s_mode_t mode; /*!< I2S work mode*/ + int sample_rate; /*!< I2S sample rate*/ + i2s_bits_per_sample_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 */ + 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_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; + +/** + * @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. + */ +typedef enum { + I2S_DAC_CHANNEL_DISABLE = 0, /*!< Disable I2S built-in DAC signals*/ + I2S_DAC_CHANNEL_RIGHT_EN = 1, /*!< Enable I2S built-in DAC right channel, maps to DAC channel 1 on GPIO25*/ + I2S_DAC_CHANNEL_LEFT_EN = 2, /*!< Enable I2S built-in DAC left channel, maps to DAC channel 2 on GPIO26*/ + I2S_DAC_CHANNEL_BOTH_EN = 0x3, /*!< Enable both of the I2S built-in DAC channels.*/ + I2S_DAC_CHANNEL_MAX = 0x4, /*!< I2S built-in DAC mode max index*/ +} i2s_dac_mode_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 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_SUPPORT_PDM +/** + * @brief I2S PDM RX downsample mode + */ +typedef enum { + I2S_PDM_DSR_8S = 0, /*!< downsampling number is 8 for PDM RX mode*/ + I2S_PDM_DSR_16S, /*!< downsampling number is 16 for PDM RX mode*/ + I2S_PDM_DSR_MAX, +} i2s_pdm_dsr_t; +#endif + +typedef enum { + I2S_CLK_D2CLK = 0, + I2S_CLK_APLL, +} i2s_clock_src_t; + + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/arch/xtensa/include/esp32/soc/include/hal/ledc_hal.h b/arch/xtensa/include/esp32/soc/include/hal/ledc_hal.h new file mode 100644 index 0000000000000..967e82674fc6b --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/ledc_hal.h @@ -0,0 +1,388 @@ +// 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. + +/******************************************************************************* + * NOTICE + * The hal is not public api, don't use in application code. + * See readme.md in soc/include/hal/readme.md + ******************************************************************************/ + +// The HAL layer for LEDC. +// There is no parameter check in the hal layer, so the caller must ensure the correctness of the parameters. + +#pragma once + +#include "hal/ledc_ll.h" +#include "hal/ledc_types.h" + +/** + * Context that should be maintained by both the driver and the HAL + */ +typedef struct { + ledc_dev_t *dev; + ledc_mode_t speed_mode; +} ledc_hal_context_t; + +/** + * @brief Set LEDC low speed timer clock + * + * @param hal Context of the HAL layer + * @param slow_clk_sel LEDC low speed timer clock source + * + * @return None + */ +#define ledc_hal_set_slow_clk_sel(hal, slow_clk_sel) ledc_ll_set_slow_clk_sel((hal)->dev, slow_clk_sel) + +/** + * @brief Get LEDC low speed timer clock + * + * @param hal Context of the HAL layer + * @param slow_clk_sel LEDC low speed timer clock source + * + * @return None + */ +#define ledc_hal_get_slow_clk_sel(hal, slow_clk_sel) ledc_ll_get_slow_clk_sel((hal)->dev, slow_clk_sel) + +/** + * @brief Update LEDC low speed timer + * + * @param hal Context of the HAL layer + * @param timer_sel LEDC timer index (0-3), select from ledc_timer_t + * + * @return None + */ +#define ledc_hal_ls_timer_update(hal, timer_sel) ledc_ll_ls_timer_update((hal)->dev, (hal)->speed_mode, timer_sel) + +/** + * @brief Reset LEDC timer + * + * @param hal Context of the HAL layer + * @param timer_sel LEDC timer index (0-3), select from ledc_timer_t + * + * @return None + */ +#define ledc_hal_timer_rst(hal, timer_sel) ledc_ll_timer_rst((hal)->dev, (hal)->speed_mode, timer_sel) + +/** + * @brief Pause LEDC timer + * + * @param hal Context of the HAL layer + * @param timer_sel LEDC timer index (0-3), select from ledc_timer_t + * + * @return None + */ +#define ledc_hal_timer_pause(hal, timer_sel) ledc_ll_timer_pause((hal)->dev, (hal)->speed_mode, timer_sel) + +/** + * @brief Resume LEDC timer + * + * @param hal Context of the HAL layer + * @param timer_sel LEDC timer index (0-3), select from ledc_timer_t + * + * @return None + */ +#define ledc_hal_timer_resume(hal, timer_sel) ledc_ll_timer_resume((hal)->dev, (hal)->speed_mode, timer_sel) + +/** + * @brief Set LEDC timer clock divider + * + * @param hal Context of the HAL layer + * @param timer_sel LEDC timer index (0-3), select from ledc_timer_t + * @param clock_divider Timer clock divide value, the timer clock is divided from the selected clock source + * + * @return None + */ +#define ledc_hal_set_clock_divider(hal, timer_sel, clock_divider) ledc_ll_set_clock_divider((hal)->dev, (hal)->speed_mode, timer_sel, clock_divider) + +/** + * @brief Get LEDC timer clock divider + * + * @param hal Context of the HAL layer + * @param timer_sel LEDC timer index (0-3), select from ledc_timer_t + * @param clock_divider Timer clock divide value, the timer clock is divided from the selected clock source + * + * @return None + */ +#define ledc_hal_get_clock_divider(hal, timer_sel, clock_divider) ledc_ll_get_clock_divider((hal)->dev, (hal)->speed_mode, timer_sel, clock_divider) + +/** + * @brief Set LEDC timer clock source + * + * @param hal Context of the HAL layer + * @param timer_sel LEDC timer index (0-3), select from ledc_timer_t + * @param clk_src Timer clock source + * + * @return None + */ +#define ledc_hal_set_clock_source(hal, timer_sel, clk_src) ledc_ll_set_clock_source((hal)->dev, (hal)->speed_mode, timer_sel, clk_src) + +/** + * @brief Get LEDC timer clock source + * + * @param hal Context of the HAL layer + * @param timer_sel LEDC timer index (0-3), select from ledc_timer_t + * @param clk_src Pointer to accept the timer clock source + * + * @return None + */ +#define ledc_hal_get_clock_source(hal, timer_sel, clk_src) ledc_ll_get_clock_source((hal)->dev, (hal)->speed_mode, timer_sel, clk_src) + +/** + * @brief Set LEDC duty resolution + * + * @param hal Context of the HAL layer + * @param timer_sel LEDC timer index (0-3), select from ledc_timer_t + * @param duty_resolution Resolution of duty setting in number of bits. The range of duty values is [0, (2**duty_resolution)] + * + * @return None + */ +#define ledc_hal_set_duty_resolution(hal, timer_sel, duty_resolution) ledc_ll_set_duty_resolution((hal)->dev, (hal)->speed_mode, timer_sel, duty_resolution) + +/** + * @brief Get LEDC duty resolution + * + * @param hal Context of the HAL layer + * @param timer_sel LEDC timer index (0-3), select from ledc_timer_t + * @param duty_resolution Pointer to accept the resolution of duty setting in number of bits. + * + * @return None + */ +#define ledc_hal_get_duty_resolution(hal, timer_sel, duty_resolution) ledc_ll_get_duty_resolution((hal)->dev, (hal)->speed_mode, timer_sel, duty_resolution) + +/** + * @brief Get LEDC max duty + * + * @param hal Context of the HAL layer + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param max_duty Pointer to accept the max duty + * + * @return None + */ +#define ledc_hal_get_max_duty(hal, channel_num, max_duty) ledc_ll_get_max_duty((hal)->dev, (hal)->speed_mode, channel_num, max_duty) + +/** + * @brief Get LEDC hpoint value + * + * @param hal Context of the HAL layer + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param hpoint_val Pointer to accept the LEDC hpoint value(max: 0xfffff) + * + * @return None + */ +#define ledc_hal_get_hpoint(hal, channel_num, hpoint_val) ledc_ll_get_hpoint((hal)->dev, (hal)->speed_mode, channel_num, hpoint_val) + +/** + * @brief Set LEDC the integer part of duty value + * + * @param hal Context of the HAL layer + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param duty_val LEDC duty value, the range of duty setting is [0, (2**duty_resolution)] + * + * @return None + */ +#define ledc_hal_set_duty_int_part(hal, channel_num, duty_val) ledc_ll_set_duty_int_part((hal)->dev, (hal)->speed_mode, channel_num, duty_val) + +/** + * @brief Set the output enable + * + * @param hal Context of the HAL layer + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param sig_out_en The output enable status + * + * @return None + */ +#define ledc_hal_set_sig_out_en(hal, channel_num, sig_out_en) ledc_ll_set_sig_out_en((hal)->dev, (hal)->speed_mode, channel_num, sig_out_en) + +/** + * @brief Set the duty start + * + * @param hal Context of the HAL layer + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param duty_start The duty start + * + * @return None + */ +#define ledc_hal_set_duty_start(hal, channel_num, duty_start) ledc_ll_set_duty_start((hal)->dev, (hal)->speed_mode, channel_num, duty_start) + +/** + * @brief Set output idle level + * + * @param hal Context of the HAL layer + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param idle_level The output idle level + * + * @return None + */ +#define ledc_hal_set_idle_level(hal, channel_num, idle_level) ledc_ll_set_idle_level((hal)->dev, (hal)->speed_mode, channel_num, idle_level) + +/** + * @brief Set fade end interrupt enable + * + * @param hal Context of the HAL layer + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param fade_end_intr_en The fade end interrupt enable status + * + * @return None + */ +#define ledc_hal_set_fade_end_intr(hal, channel_num, fade_end_intr_en) ledc_ll_set_fade_end_intr((hal)->dev, (hal)->speed_mode, channel_num, fade_end_intr_en) + +/** + * @brief Set timer index of the specified channel + * + * @param hal Context of the HAL layer + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param timer_sel LEDC timer index (0-3), select from ledc_timer_t + * + * @return None + */ +#define ledc_hal_bind_channel_timer(hal, channel_num, timer_sel) ledc_ll_bind_channel_timer((hal)->dev, (hal)->speed_mode, channel_num, timer_sel) + +/** + * @brief Get timer index of the specified channel + * + * @param hal Context of the HAL layer + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param timer_sel Pointer to accept the LEDC timer index + * + * @return None + */ +#define ledc_hal_get_channel_timer(hal, channel_num, timer_sel) ledc_ll_get_channel_timer((hal)->dev, (hal)->speed_mode, channel_num, timer_sel) + +/** + * @brief Init the LEDC hal. This function should be called first before other hal layer function is called + * + * @param hal Context of the HAL layer + * @param speed_mode speed_mode Select the LEDC speed_mode, high-speed mode and low-speed mod + * + * @return None + */ +void ledc_hal_init(ledc_hal_context_t *hal, ledc_mode_t speed_mode); + +/** + * @brief Update channel configure when select low speed mode + * + * @param hal Context of the HAL layer + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * + * @return None + */ +void ledc_hal_ls_channel_update(ledc_hal_context_t *hal, ledc_channel_t channel_num); + +/** + * @brief Set LEDC hpoint value + * + * @param hal Context of the HAL layer + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param hpoint_val LEDC hpoint value(max: 0xfffff) + * + * @return None + */ +void ledc_hal_set_hpoint(ledc_hal_context_t *hal, ledc_channel_t channel_num, uint32_t hpoint_val); + +/** + * @brief Get LEDC duty value + * + * @param hal Context of the HAL layer + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param duty_val Pointer to accept the LEDC duty value + * + * @return None + */ +void ledc_hal_get_duty(ledc_hal_context_t *hal, ledc_channel_t channel_num, uint32_t *duty_val); + +/** + * @brief Set LEDC duty change direction + * + * @param hal Context of the HAL layer + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param duty_direction LEDC duty change direction, increase or decrease + * + * @return None + */ +void ledc_hal_set_duty_direction(ledc_hal_context_t *hal, ledc_channel_t channel_num, ledc_duty_direction_t duty_direction); + +/** + * @brief Set the number of increased or decreased times + * + * @param hal Context of the HAL layer + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param duty_num The number of increased or decreased times + * + * @return None + */ +void ledc_hal_set_duty_num(ledc_hal_context_t *hal, ledc_channel_t channel_num, uint32_t duty_num); + +/** + * @brief Set the duty cycles of increase or decrease + * + * @param hal Context of the HAL layer + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param duty_cycle The duty cycles + * + * @return None + */ +void ledc_hal_set_duty_cycle(ledc_hal_context_t *hal, ledc_channel_t channel_num, uint32_t duty_cycle); + +/** + * @brief Set the step scale of increase or decrease + * + * @param hal Context of the HAL layer + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param duty_scale The step scale + * + * @return None + */ +void ledc_hal_set_duty_scale(ledc_hal_context_t *hal, ledc_channel_t channel_num, uint32_t duty_scale); + +/** + * @brief Get interrupt status of the specified channel + * + * @param hal Context of the HAL layer + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * @param intr_status Pointer to accept the interrupt status + * + * @return None + */ +void ledc_hal_get_fade_end_intr_status(ledc_hal_context_t *hal, uint32_t *intr_status); + +/** + * @brief Clear interrupt status of the specified channel + * + * @param hal Context of the HAL layer + * @param channel_num LEDC channel index (0-7), select from ledc_channel_t + * + * @return None + */ +void ledc_hal_clear_fade_end_intr_status(ledc_hal_context_t *hal, ledc_channel_t channel_num); + +/** + * @brief Get clock config of LEDC timer + * + * @param hal Context of the HAL layer + * @param timer_sel LEDC timer index (0-3), select from ledc_timer_t + * @param clk_cfg Pointer to accept clock config + * + * @return None + */ +void ledc_hal_get_clk_cfg(ledc_hal_context_t *hal, ledc_timer_t timer_sel, ledc_clk_cfg_t *clk_cfg); + +/** + * @brief Config low speed timer clock source with clock config + *s + * @param hal Context of the HAL layer + * @param clk_cfg clock config + * + * @return None + */ +void ledc_hal_set_slow_clk(ledc_hal_context_t *hal, ledc_clk_cfg_t clk_cfg); diff --git a/arch/xtensa/include/esp32/soc/include/hal/ledc_types.h b/arch/xtensa/include/esp32/soc/include/hal/ledc_types.h new file mode 100644 index 0000000000000..9091a1034e9b2 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/ledc_types.h @@ -0,0 +1,153 @@ +// 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 + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include "soc/ledc_caps.h" + +typedef enum { +#ifdef SOC_LEDC_SUPPORT_HS_MODE + LEDC_HIGH_SPEED_MODE = 0, /*!< LEDC high speed speed_mode */ +#endif + LEDC_LOW_SPEED_MODE, /*!< LEDC low speed speed_mode */ + LEDC_SPEED_MODE_MAX, /*!< LEDC speed limit */ +} ledc_mode_t; + +typedef enum { + LEDC_INTR_DISABLE = 0, /*!< Disable LEDC interrupt */ + LEDC_INTR_FADE_END, /*!< Enable LEDC interrupt */ + LEDC_INTR_MAX, +} ledc_intr_type_t; + +typedef enum { + LEDC_DUTY_DIR_DECREASE = 0, /*!< LEDC duty decrease direction */ + LEDC_DUTY_DIR_INCREASE = 1, /*!< LEDC duty increase direction */ + LEDC_DUTY_DIR_MAX, +} ledc_duty_direction_t; + +typedef enum { + LEDC_SLOW_CLK_RTC8M = 0, /*!< LEDC low speed timer clock source is 8MHz RTC clock*/ + LEDC_SLOW_CLK_APB, /*!< LEDC low speed timer clock source is 80MHz APB clock*/ +#ifdef SOC_LEDC_SUPPORT_XTAL_CLOCK + LEDC_SLOW_CLK_XTAL, /*!< LEDC low speed timer clock source XTAL clock*/ +#endif +} ledc_slow_clk_sel_t; + +typedef enum { + LEDC_AUTO_CLK = 0, /*!< The driver will automatically select the source clock(REF_TICK or APB) based on the giving resolution and duty parameter when init the timer*/ + LEDC_USE_REF_TICK, /*!< LEDC timer select REF_TICK clock as source clock*/ + LEDC_USE_APB_CLK, /*!< LEDC timer select APB clock as source clock*/ + LEDC_USE_RTC8M_CLK, /*!< LEDC timer select RTC8M_CLK as source clock. Only for low speed channels and this parameter must be the same for all low speed channels*/ +#ifdef SOC_LEDC_SUPPORT_XTAL_CLOCK + LEDC_USE_XTAL_CLK, /*!< LEDC timer select XTAL clock as source clock*/ +#endif +} ledc_clk_cfg_t; + +/* Note: Setting numeric values to match ledc_clk_cfg_t values are a hack to avoid collision with + LEDC_AUTO_CLK in the driver, as these enums have very similar names and user may pass + one of these by mistake. */ +typedef enum { + LEDC_REF_TICK = LEDC_USE_REF_TICK, /*!< LEDC timer clock divided from reference tick (1Mhz) */ + LEDC_APB_CLK = LEDC_USE_APB_CLK, /*!< LEDC timer clock divided from APB clock (80Mhz) */ +} ledc_clk_src_t; + + +typedef enum { + LEDC_TIMER_0 = 0, /*!< LEDC timer 0 */ + LEDC_TIMER_1, /*!< LEDC timer 1 */ + LEDC_TIMER_2, /*!< LEDC timer 2 */ + LEDC_TIMER_3, /*!< LEDC timer 3 */ + LEDC_TIMER_MAX, +} ledc_timer_t; + +typedef enum { + LEDC_CHANNEL_0 = 0, /*!< LEDC channel 0 */ + LEDC_CHANNEL_1, /*!< LEDC channel 1 */ + LEDC_CHANNEL_2, /*!< LEDC channel 2 */ + LEDC_CHANNEL_3, /*!< LEDC channel 3 */ + LEDC_CHANNEL_4, /*!< LEDC channel 4 */ + LEDC_CHANNEL_5, /*!< LEDC channel 5 */ + LEDC_CHANNEL_6, /*!< LEDC channel 6 */ + LEDC_CHANNEL_7, /*!< LEDC channel 7 */ + LEDC_CHANNEL_MAX, +} ledc_channel_t; + +typedef enum { + LEDC_TIMER_1_BIT = 1, /*!< LEDC PWM duty resolution of 1 bits */ + LEDC_TIMER_2_BIT, /*!< LEDC PWM duty resolution of 2 bits */ + LEDC_TIMER_3_BIT, /*!< LEDC PWM duty resolution of 3 bits */ + LEDC_TIMER_4_BIT, /*!< LEDC PWM duty resolution of 4 bits */ + LEDC_TIMER_5_BIT, /*!< LEDC PWM duty resolution of 5 bits */ + LEDC_TIMER_6_BIT, /*!< LEDC PWM duty resolution of 6 bits */ + LEDC_TIMER_7_BIT, /*!< LEDC PWM duty resolution of 7 bits */ + LEDC_TIMER_8_BIT, /*!< LEDC PWM duty resolution of 8 bits */ + LEDC_TIMER_9_BIT, /*!< LEDC PWM duty resolution of 9 bits */ + LEDC_TIMER_10_BIT, /*!< LEDC PWM duty resolution of 10 bits */ + LEDC_TIMER_11_BIT, /*!< LEDC PWM duty resolution of 11 bits */ + LEDC_TIMER_12_BIT, /*!< LEDC PWM duty resolution of 12 bits */ + LEDC_TIMER_13_BIT, /*!< LEDC PWM duty resolution of 13 bits */ + LEDC_TIMER_14_BIT, /*!< LEDC PWM duty resolution of 14 bits */ + LEDC_TIMER_15_BIT, /*!< LEDC PWM duty resolution of 15 bits */ + LEDC_TIMER_16_BIT, /*!< LEDC PWM duty resolution of 16 bits */ + LEDC_TIMER_17_BIT, /*!< LEDC PWM duty resolution of 17 bits */ + LEDC_TIMER_18_BIT, /*!< LEDC PWM duty resolution of 18 bits */ + LEDC_TIMER_19_BIT, /*!< LEDC PWM duty resolution of 19 bits */ + LEDC_TIMER_20_BIT, /*!< LEDC PWM duty resolution of 20 bits */ + LEDC_TIMER_BIT_MAX, +} ledc_timer_bit_t; + +typedef enum { + LEDC_FADE_NO_WAIT = 0, /*!< LEDC fade function will return immediately */ + LEDC_FADE_WAIT_DONE, /*!< LEDC fade function will block until fading to the target duty */ + LEDC_FADE_MAX, +} ledc_fade_mode_t; + +/** + * @brief Configuration parameters of LEDC channel for ledc_channel_config function + */ +typedef struct { + int gpio_num; /*!< the LEDC output gpio_num, if you want to use gpio16, gpio_num = 16 */ + ledc_mode_t speed_mode; /*!< LEDC speed speed_mode, high-speed mode or low-speed mode */ + ledc_channel_t channel; /*!< LEDC channel (0 - 7) */ + ledc_intr_type_t intr_type; /*!< configure interrupt, Fade interrupt enable or Fade interrupt disable */ + ledc_timer_t timer_sel; /*!< Select the timer source of channel (0 - 3) */ + uint32_t duty; /*!< LEDC channel duty, the range of duty setting is [0, (2**duty_resolution)] */ + int hpoint; /*!< LEDC channel hpoint value, the max value is 0xfffff */ +} ledc_channel_config_t; + +/** + * @brief Configuration parameters of LEDC Timer timer for ledc_timer_config function + */ +typedef struct { + ledc_mode_t speed_mode; /*!< LEDC speed speed_mode, high-speed mode or low-speed mode */ + union { + ledc_timer_bit_t duty_resolution; /*!< LEDC channel duty resolution */ + ledc_timer_bit_t bit_num __attribute__((deprecated)); /*!< Deprecated in ESP-IDF 3.0. This is an alias to 'duty_resolution' for backward compatibility with ESP-IDF 2.1 */ + }; + ledc_timer_t timer_num; /*!< The timer source of channel (0 - 3) */ + uint32_t freq_hz; /*!< LEDC timer frequency (Hz) */ + ledc_clk_cfg_t clk_cfg; /*!< Configure LEDC source clock. + For low speed channels and high speed channels, you can specify the source clock using LEDC_USE_REF_TICK, LEDC_USE_APB_CLK or LEDC_AUTO_CLK. + For low speed channels, you can also specify the source clock using LEDC_USE_RTC8M_CLK, in this case, all low speed channel's source clock must be RTC8M_CLK*/ +} ledc_timer_config_t; + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/include/hal/mcpwm_hal.h b/arch/xtensa/include/esp32/soc/include/hal/mcpwm_hal.h new file mode 100644 index 0000000000000..3b3f051d8812b --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/mcpwm_hal.h @@ -0,0 +1,328 @@ +// 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. + +/******************************************************************************* + * NOTICE + * The hal is not public api, don't use in application code. + * See readme.md in soc/include/hal/readme.md + ******************************************************************************/ + +// The HAL layer for MCPWM (common part) + +/* + * MCPWM HAL usages: + * + * Initialization: + * 1. Fill the parameters in `mcpwm_hal_context_t`. + * 2. Call `mcpwm_hal_init` to initialize the context. + * 3. Call `mcpwm_hal_hw_init` to initialize the hardware. + * + * Basic PWM: + * 1. Update parameters for the timers, comparators and generators. + * 2. Call `mcpwm_hal_timer_update_basic` to update the timer used. + * 3. Call `mcpwm_hal_operator_update_basic` to update all the parameters of a operator. + * + * Alternatively, if only the comparator is updated (duty rate), call + * `mcpwm_hal_operator_update_comparator` to update the comparator parameters; if only the + * generator is updated (output style), call `mcpwm_hal_operator_update_generator` to update the + * generator parameters. + * + * 4. At any time, call `mcpwm_hal_timer_start` to start the timer (so that PWM output will toggle + * according to settings), or call `mcpwm_hal_timer_stop` to stop the timer (so that the PWM output + * will be kept as called). + * + * Timer settings: + * - Sync: Call `mcpwm_hal_timer_enable_sync` to enable the sync for the timer, and call + * `mcpwm_hal_timer_disable_sync` to disable it. + * + * Operator settings: + * - Carrier: Call `mcpwm_hal_operator_enable_carrier` to enable carrier for an operator, and call + * `mcpwm_hal_operator_disable_carrier` to disable it. + * + * - Deadzone: Call `mcpwm_hal_operator_update_deadzone` to update settings of deadzone for an operator. + * + * Fault handling settings: + * 1. Call `mcpwm_hal_fault_init` to initialize an fault signal to be detected. + * 2. Call `mcpwm_hal_operator_update_fault` to update the behavior of an operator when fault is + * detected. + * 3. If the operator selects oneshot mode to handle the fault event, call + * `mcpwm_hal_fault_oneshot_clear` to clear that fault event after the fault is handled properly. + * 4. Call `mcpwm_hal_fault_disable` to deinitialize the fault signal when it's no longer used. + * + * Capture: + * 1. Call `mcpwm_hal_capture_enable` to enable the capture for one capture signal. + * 2. Call `mcpwm_hal_capture_get_result` to get the last captured result. + * 3. Call `mcpwm_hal_capture_disable` to disable the capture for a signal. + */ + + +#pragma once + +#include +#include "hal/mcpwm_ll.h" + +#define MCPWM_BASE_CLK (2 * APB_CLK_FREQ) //2*APB_CLK_FREQ 160Mhz + +/// Configuration of HAL that used only once. +typedef struct { + int host_id; ///< Which MCPWM peripheral to use, 0-1. +} mcpwm_hal_init_config_t; + +/// Configuration of each generator (output of operator) +typedef struct { + mcpwm_duty_type_t duty_type; ///< How the generator output + int comparator; ///< for mode `MCPWM_DUTY_MODE_*`, which comparator it refers to. +} mcpwm_hal_generator_config_t; + +/// Configuration of each operator +typedef struct { + mcpwm_hal_generator_config_t gen[SOC_MCPWM_GENERATOR_NUM]; ///< Configuration of the generators + float duty[SOC_MCPWM_COMPARATOR_NUM]; ///< Duty rate for each comparator, 10 means 10%. + int timer; ///< The timer this operator is using +} mcpwm_hal_operator_config_t; + +/// Configuration of each timer +typedef struct { + uint32_t timer_prescale; ///< The prescale from the MCPWM main clock to the timer clock, TIMER_FREQ=(MCPWM_FREQ/(timer_prescale+1)) + uint32_t freq; ///< Frequency desired, will be updated to actual value after the `mcpwm_hal_timer_update_freq` is called. + mcpwm_counter_type_t count_mode; ///< Counting mode +} mcpwm_hal_timer_config_t; + +typedef struct { + mcpwm_dev_t *dev; ///< Beginning address of the MCPWM peripheral registers. Call `mcpwm_hal_init` to initialize it. + uint32_t prescale; ///< Prescale from the 160M clock to MCPWM main clock. + mcpwm_hal_timer_config_t timer[SOC_MCPWM_TIMER_NUM]; ///< Configuration of the timers + mcpwm_hal_operator_config_t op[SOC_MCPWM_OP_NUM]; ///< Configuration of the operators +} mcpwm_hal_context_t; + +/// Configuration of the carrier +typedef struct { + bool inverted; ///< Whether to invert the output + uint8_t duty; ///< Duty of the carrier, 0-7. Duty rate = duty/8. + uint8_t oneshot_pulse_width; ///< oneshot pulse width, in carrier periods. 0 to disable. 0-15. + uint32_t period; ///< Prescale from the MCPWM main clock to the carrier clock. CARRIER_FREQ=(MCPWM_FREQ/(period+1)/8.) +} mcpwm_hal_carrier_conf_t; + +/// Configuration of the deadzone +typedef struct { + mcpwm_deadtime_type_t mode; ///< Deadzone mode, `MCPWM_DEADTIME_BYPASS` to disable. + uint32_t fed; ///< Delay on falling edge. By MCPWM main clock. + uint32_t red; ///< Delay on rising edge. By MCPWM main clock. +} mcpwm_hal_deadzone_conf_t; + +/// Configuration of the fault handling for each operator +typedef struct { + uint32_t cbc_enabled_mask; ///< Whether the cycle-by-cycle fault handling is enabled on each fault signal. BIT(n) stands for signal n. + uint32_t ost_enabled_mask; ///< Whether the oneshot fault handling is enabled on each on each fault signal. BIT(n) stands for signal n. + mcpwm_output_action_t action_on_fault[SOC_MCPWM_GENERATOR_NUM]; ///< Action to perform on each generator when any one of the fault signal triggers. +} mcpwm_hal_fault_conf_t; + +/// Configuration of the synchronization of each clock +typedef struct { + mcpwm_sync_signal_t sync_sig; ///< Sync signal to use + uint32_t reload_permillage; ///< Reload permillage when the sync is triggered. 100 means the timer will be reload to (period * 100)/1000=10% period value. +} mcpwm_hal_sync_config_t; + +/// Configuration of the capture feature on each capture signal +typedef struct { + mcpwm_capture_on_edge_t cap_edge; ///< Whether the edges is captured, bitwise. + uint32_t prescale; ///< Prescale of the input signal. +} mcpwm_hal_capture_config_t; + +/** + * @brief Initialize the internal state of the HAL. Call after settings are set and before other functions are called. + * + * @note Since There are several individual parts (timers + operators, captures), this funciton is + * allowed to called several times. + * + * @param hal Context of the HAL layer. + * @param init_config Configuration for the HAL to be used only once. + */ +void mcpwm_hal_init(mcpwm_hal_context_t *hal, const mcpwm_hal_init_config_t *init_config); + +/** + * @brief Initialize the hardware, call after `mcpwm_hal_init` and before other functions. + * + * @param hal Context of the HAL layer. + */ +void mcpwm_hal_hw_init(mcpwm_hal_context_t *hal); + +/** + * @brief Start a timer + * + * @param hal Context of the HAL layer. + * @param timer Timer to start, 0-2. + */ +void mcpwm_hal_timer_start(mcpwm_hal_context_t *hal, int timer); + +/** + * @brief Stop a timer. + * + * @param hal Context of the HAL layer. + * @param timer Timer to stop, 0-2. + */ +void mcpwm_hal_timer_stop(mcpwm_hal_context_t *hal, int timer); + +/** + * @brief Update the basic parameters of a timer. + * + * @note This will influence the duty rate and count mode of each operator relies on this timer. + * Call `mcpwm_hal_operator_update_basic` for each of the operator that relies on this timer after + * to update the duty rate and generator output. + * + * @param hal Context of the HAL layer. + * @param timer Timer to update, 0-2. + */ +void mcpwm_hal_timer_update_basic(mcpwm_hal_context_t *hal, int timer); + +/** + * @brief Start the synchronization for a timer. + * + * @param hal Context of the HAL layer. + * @param timer Timer to enable, 0-2. + * @param sync_conf Configuration of the sync operation. + */ +void mcpwm_hal_timer_enable_sync(mcpwm_hal_context_t *hal, int timer, const mcpwm_hal_sync_config_t *sync_conf); + +/** + * @brief Stop the synchronization for a timer. + * + * @param hal Context of the HAL layer. + * @param timer Timer to disable sync, 0-2. + */ +void mcpwm_hal_timer_disable_sync(mcpwm_hal_context_t *hal, int timer); + +/** + * @brief Update the basic settings (duty, output mode) for an operator. + * + * Will call `mcpwm_hal_operator_update_comparator` and `mcpwm_hal_operator_update_generator` + * recursively to update each of their duty and output mode. + * + * @param hal Context of the HAL layer. + * @param op Operator to update, 0-2. + */ +void mcpwm_hal_operator_update_basic(mcpwm_hal_context_t *hal, int op); + +/** + * @brief Update a comparator (duty) for an operator. + * + * @param hal Context of the HAL layer. + * @param op Operator to update, 0-2. + * @param cmp Comparator to update, 0-1. + */ +void mcpwm_hal_operator_update_comparator(mcpwm_hal_context_t *hal, int op, int cmp); + +/** + * @brief Update a generator (output mode) for an operator. + * + * @param hal Context of the HAL layer. + * @param op Operator to update, 0-2. + * @param cmp Comparator to update, 0-1. + */ +void mcpwm_hal_operator_update_generator(mcpwm_hal_context_t *hal, int op, int gen_num); + +/** + * @brief Enable the carrier for an operator. + * + * @param hal Context of the HAL layer. + * @param op Operator to enable carrier, 0-2. + * @param carrier_conf Configuration of the carrier. + */ +void mcpwm_hal_operator_enable_carrier(mcpwm_hal_context_t *hal, int op, const mcpwm_hal_carrier_conf_t *carrier_conf); + +/** + * @brief Disable the carrier for an operator. + * + * @param hal Context of the HAL layer. + * @param op Operator to disable carrier, 0-2. + */ +void mcpwm_hal_operator_disable_carrier(mcpwm_hal_context_t *hal, int op); + +/** + * @brief Update the deadzone for an operator. + * + * @param hal Context of the HAL layer. + * @param op Operator to update the deadzone, 0-2. + * @param deadzone Configuration of the deadzone. Set member `mode` to `MCPWM_DEADTIME_BYPASS` will bypass the deadzone. + */ +void mcpwm_hal_operator_update_deadzone(mcpwm_hal_context_t *hal, int op, const mcpwm_hal_deadzone_conf_t *deadzone); + +/** + * @brief Enable one of the fault signal. + * + * @param hal Context of the HAL layer. + * @param fault_sig The signal to enable, 0-2. + * @param level The active level for the fault signal, true for high and false for low. + */ +void mcpwm_hal_fault_init(mcpwm_hal_context_t *hal, int fault_sig, bool level); + +/** + * @brief Configure how the operator behave to the fault signals. + * + * Call after the fault signal is enabled by `mcpwm_hal_fault_init`. + * + * @param hal Context of the HAL layer. + * @param op Operator to configure, 0-2. + * @param fault_conf Configuration of the behavior of the operator when fault. Clear member `cbc_enabled_mask` and `ost_enabled_mask` will disable the fault detection of this operator. + */ +void mcpwm_hal_operator_update_fault(mcpwm_hal_context_t *hal, int op, const mcpwm_hal_fault_conf_t *fault_conf); + +/** + * @brief Clear the oneshot fault status for an operator. + * + * @param hal Context of the HAL layer. + * @param op The operator to clear oneshot fault status, 0-2. + */ +void mcpwm_hal_fault_oneshot_clear(mcpwm_hal_context_t *hal, int op); + +/** + * @brief Disable one of the fault signal. + * + * @param hal Context of the HAL layer. + * @param fault_sig The fault signal to disable, 0-2. + */ +void mcpwm_hal_fault_disable(mcpwm_hal_context_t *hal, int fault_sig); + +/** + * @brief Enable one of the capture signal. + * + * @param hal Context of the HAL layer. + * @param cap_sig Capture signal to enable, 0-2. + * @param conf Configuration on how to capture the signal. + */ +void mcpwm_hal_capture_enable(mcpwm_hal_context_t *hal, int cap_sig, const mcpwm_hal_capture_config_t *conf); + +/** + * @brief Get the capture result. + * + * @note The output value will always be updated with the register value, no matter event triggered or not. + * + * @param hal Context of the HAL layer. + * @param cap_sig Signal to get capture result, 0-2. + * @param out_count Output of the captured counter. + * @param out_edge Output of the captured edge. + * @return + * - ESP_OK: if a signal is captured + * - ESP_ERR_NOT_FOUND: if no capture event happened. + */ +esp_err_t mcpwm_hal_capture_get_result(mcpwm_hal_context_t *hal, int cap_sig, uint32_t *out_count, + mcpwm_capture_on_edge_t *out_edge); + +/** + * @brief Disable one of the capture signal. + * + * @param hal Context of the HAL layer. + * @param cap_sig The signal to capture, 0-2. + */ +void mcpwm_hal_capture_disable(mcpwm_hal_context_t *hal, int cap_sig); diff --git a/arch/xtensa/include/esp32/soc/include/hal/mcpwm_types.h b/arch/xtensa/include/esp32/soc/include/hal/mcpwm_types.h new file mode 100644 index 0000000000000..ca9052de492e2 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/mcpwm_types.h @@ -0,0 +1,86 @@ +// 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. + +#pragma once + +/// Interrupts for MCPWM +typedef enum { + MCPWM_LL_INTR_CAP0 = BIT(27), ///< Capture 0 happened + MCPWM_LL_INTR_CAP1 = BIT(28), ///< Capture 1 happened + MCPWM_LL_INTR_CAP2 = BIT(29), ///< Capture 2 happened +} mcpwm_intr_t; + +/** + * @brief Select type of MCPWM counter + */ +typedef enum { + MCPWM_UP_COUNTER = 1, /*! +#include "soc/pcnt_periph.h" +#include "hal/pcnt_types.h" +#include "hal/pcnt_ll.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Context that should be maintained by both the driver and the HAL + */ + +typedef struct { + pcnt_dev_t *dev; +} pcnt_hal_context_t; + +/** + * @brief Set PCNT counter mode + * + * @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 + */ +#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 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); + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/arch/xtensa/include/esp32/soc/include/hal/pcnt_types.h b/arch/xtensa/include/esp32/soc/include/hal/pcnt_types.h new file mode 100644 index 0000000000000..3d065d6ffbc02 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/pcnt_types.h @@ -0,0 +1,92 @@ +// 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. + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief PCNT port number, the max port number is (PCNT_PORT_MAX - 1). + */ +typedef int pcnt_port_t; + +/** + * @brief Selection of all available PCNT units + */ +typedef int pcnt_unit_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 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; + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/arch/xtensa/include/esp32/soc/include/hal/readme.md b/arch/xtensa/include/esp32/soc/include/hal/readme.md new file mode 100644 index 0000000000000..17ee6b2c6c951 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/readme.md @@ -0,0 +1,25 @@ +# HAL Layer Readme + +The HAL layer is designed to be used by the drivers. We don't guarantee the stability and back-compatibility among +versions. The HAL layer may update very frequently with the driver. Please don't use them in the applications or treat +them as stable APIs. + +The HAL layer consists of two layers: HAL (upper) and Lowlevel(bottom). The HAL layer defines the steps and data +required by the peripheral. The lowlevel is a translation layer converting general conceptions to register configurations. + +## Lowlevel + +This layer should be all static inline. The first argument of LL functions is usually a pointer to the beginning address +of the peripheral register. Each chip should have its own LL layer. The functions in this layer should be atomic and +independent from each other so that the upper layer can change/perform one of the options/operation without touching the +others. + +## HAL + +This layer should depend on the operating system as little as possible. It's a wrapping of LL functions, so that the upper +layer can combine basic steps into different working ways (polling, non-polling, interrupt, etc.). Without using +queues/locks/delay/loop/etc., this layer can be easily port to other os or simulation systems. + +To get better performance and better porting ability, ``context``s are used to hold sustainable data and pass the parameters. + +To develop your own driver, it is suggested to copy the HAL layer to your own code and keep them until manual update. diff --git a/arch/xtensa/include/esp32/soc/include/hal/rmt_hal.h b/arch/xtensa/include/esp32/soc/include/hal/rmt_hal.h new file mode 100644 index 0000000000000..07102b5c71829 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/rmt_hal.h @@ -0,0 +1,142 @@ +// 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 + +#ifdef __cplusplus +extern "C" { +#endif + +#include "soc/rmt_struct.h" +#include "soc/rmt_caps.h" + +/** + * @brief HAL context type of RMT driver + * + */ +typedef struct { + rmt_dev_t *regs; /*!< RMT Register base address */ + rmt_mem_t *mem; /*!< RMT Memory base address */ +} rmt_hal_context_t; + +#define RMT_MEM_OWNER_SW (0) /*!< RMT Memory ownership belongs to software side */ +#define RMT_MEM_OWNER_HW (1) /*!< RMT Memory ownership belongs to hardware side */ + +/** + * @brief Initialize the RMT HAL driver + * + * @param hal: RMT HAL context + */ +void rmt_hal_init(rmt_hal_context_t *hal); + +/** + * @brief Reset RMT HAL driver + * + * @param hal: RMT HAL context + */ +void rmt_hal_reset(rmt_hal_context_t *hal); + +/** + * @brief Reset RMT Channel specific HAL driver + * + * @param hal: RMT HAL context + * @param channel: RMT channel number + */ +void rmt_hal_channel_reset(rmt_hal_context_t *hal, uint32_t channel); + +/** + * @brief Set counter clock for RMT channel + * + * @param hal: RMT HAL context + * @param channel: RMT channel number + * @param base_clk_hz: base clock for RMT internal channel (counter clock will divide from it) + * @param counter_clk_hz: target counter clock + */ +void rmt_hal_set_counter_clock(rmt_hal_context_t *hal, uint32_t channel, uint32_t base_clk_hz, uint32_t counter_clk_hz); + +/** + * @brief Get counter clock for RMT channel + * + * @param hal: RMT HAL context + * @param channel: RMT channel number + * @param base_clk_hz: base clock for RMT internal channel (counter clock will divide from it) + * @return counter clock in Hz + */ +uint32_t rmt_hal_get_counter_clock(rmt_hal_context_t *hal, uint32_t channel, uint32_t base_clk_hz); + +/** + * @brief Set carrier clock for RMT channel + * + * @param hal: RMT HAL context + * @param channel: RMT channel number + * @param base_clk_hz: base clock for RMT carrier generation (carrier clock will divide from it) + * @param carrier_clk_hz: target carrier clock + * @param carrier_clk_duty: duty ratio of carrier clock + */ +void rmt_hal_set_carrier_clock(rmt_hal_context_t *hal, uint32_t channel, uint32_t base_clk_hz, uint32_t carrier_clk_hz, float carrier_clk_duty); + +/** + * @brief Get carrier clock for RMT channel + * + * @param hal: RMT HAL context + * @param channel: RMT channel number + * @param base_clk_hz: base clock for RMT carrier generation + * @param carrier_clk_hz: target carrier clock + * @param carrier_clk_duty: duty ratio of carrier clock + */ +void rmt_hal_get_carrier_clock(rmt_hal_context_t *hal, uint32_t channel, uint32_t base_clk_hz, uint32_t *carrier_clk_hz, float *carrier_clk_duty); + +/** + * @brief Set filter threshold for RMT Receive channel + * + * @param hal: RMT HAL context + * @param channel: RMT channel number + * @param base_clk_hz: base clock for RMT receive filter + * @param thres_us: threshold of RMT receive filter, in us + */ +void rmt_hal_set_rx_filter_thres(rmt_hal_context_t *hal, uint32_t channel, uint32_t base_clk_hz, uint32_t thres_us); + +/** + * @brief Set idle threshold for RMT Receive channel + * + * @param hal: RMT HAL context + * @param channel: RMT channel number + * @param base_clk_hz: base clock for RMT receive channel + * @param thres_us: IDLE threshold for RMT receive channel + */ +void rmt_hal_set_rx_idle_thres(rmt_hal_context_t *hal, uint32_t channel, uint32_t base_clk_hz, uint32_t thres_us); + +/** + * @brief Receive a frame from RMT channel + * + * @param hal: RMT HAL context + * @param channel: RMT channel number + * @param buf: buffer to store received RMT frame + * @return number of items that get received + */ +uint32_t rmt_hal_receive(rmt_hal_context_t *hal, uint32_t channel, rmt_item32_t *buf); + +/** + * @brief Transmit a from by RMT + * + * @param hal: RMT HAL context + * @param channel: RMT channel number + * @param src: RMT items to transmit + * @param length: length of RMT items to transmit + * @param offset: offset of RMT internal memory to store the items + */ +void rmt_hal_transmit(rmt_hal_context_t *hal, uint32_t channel, const rmt_item32_t *src, uint32_t length, uint32_t offset); + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/include/hal/rmt_types.h b/arch/xtensa/include/esp32/soc/include/hal/rmt_types.h new file mode 100644 index 0000000000000..4e463cdfd1b6c --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/rmt_types.h @@ -0,0 +1,108 @@ +// 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. + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief RMT Channel Type + * + */ +typedef rmt_channel_id_t rmt_channel_t; + +/** + * @brief RMT Internal Memory Owner + * + */ +typedef enum { + RMT_MEM_OWNER_TX, /*!< RMT RX mode, RMT transmitter owns the memory block*/ + RMT_MEM_OWNER_RX, /*!< RMT RX mode, RMT receiver owns the memory block*/ + RMT_MEM_OWNER_MAX, +} rmt_mem_owner_t; + +/** + * @brief Clock Source of RMT Channel + * + */ +typedef enum { + RMT_BASECLK_REF, /*!< RMT source clock system reference tick, 1MHz by default (not supported in this version) */ + RMT_BASECLK_APB, /*!< RMT source clock is APB CLK, 80Mhz by default */ + RMT_BASECLK_MAX, +} rmt_source_clk_t; + +/** + * @brief RMT Data Mode + * + * @note We highly recommended to use MEM mode not FIFO mode since there will be some gotcha in FIFO mode. + * + */ +typedef enum { + RMT_DATA_MODE_FIFO, /* + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Select the rtcio function. + * + * @note The RTC function must be selected before the pad analog function is enabled. + * @param rtcio_num The index of rtcio. 0 ~ SOC_RTC_IO_PIN_COUNT. + * @param func Select pin function. + */ +#define rtcio_hal_function_select(rtcio_num, func) rtcio_ll_function_select(rtcio_num, func) + +/** + * Enable rtcio output. + * + * @param rtcio_num The index of rtcio. 0 ~ SOC_RTC_IO_PIN_COUNT. + */ +#define rtcio_hal_output_enable(rtcio_num) rtcio_ll_output_enable(rtcio_num) + +/** + * Disable rtcio output. + * + * @param rtcio_num The index of rtcio. 0 ~ SOC_RTC_IO_PIN_COUNT. + */ +#define rtcio_hal_output_disable(rtcio_num) rtcio_ll_output_disable(rtcio_num) + +/** + * Set RTCIO output level. + * + * @param rtcio_num The index of rtcio. 0 ~ SOC_RTC_IO_PIN_COUNT. + * @param level 0: output low; ~0: output high. + */ +#define rtcio_hal_set_level(rtcio_num, level) rtcio_ll_set_level(rtcio_num, level) + +/** + * Enable rtcio input. + * + * @param rtcio_num The index of rtcio. 0 ~ SOC_RTC_IO_PIN_COUNT. + */ +#define rtcio_hal_input_enable(rtcio_num) rtcio_ll_input_enable(rtcio_num) + +/** + * Disable rtcio input. + * + * @param rtcio_num The index of rtcio. 0 ~ SOC_RTC_IO_PIN_COUNT. + */ +#define rtcio_hal_input_disable(rtcio_num) rtcio_ll_input_disable(rtcio_num) + +/** + * Get RTCIO input level. + * + * @param rtcio_num The index of rtcio. 0 ~ SOC_RTC_IO_PIN_COUNT. + * @return 0: input low; ~0: input high. + */ +#define rtcio_hal_get_level(rtcio_num) rtcio_ll_get_level(rtcio_num) + +/** + * @brief Set RTC GPIO pad drive capability. + * + * @param rtcio_num The index of rtcio. 0 ~ SOC_RTC_IO_PIN_COUNT. + * @param strength Drive capability of the pad. Range: 0 ~ 3. + */ +#define rtcio_hal_set_drive_capability(rtcio_num, strength) rtcio_ll_set_drive_capability(rtcio_num, strength) + +/** + * @brief Get RTC GPIO pad drive capability. + * + * @param rtcio_num The index of rtcio. 0 ~ SOC_RTC_IO_PIN_COUNT. + * @return Drive capability of the pad. Range: 0 ~ 3. + */ +#define rtcio_hal_get_drive_capability(rtcio_num) rtcio_ll_get_drive_capability(rtcio_num) + +/** + * Set RTCIO output level. + * + * @param rtcio_num The index of rtcio. 0 ~ SOC_RTC_IO_PIN_COUNT. + * @param level 0: output low; ~0: output high. + */ +#define rtcio_hal_set_level(rtcio_num, level) rtcio_ll_set_level(rtcio_num, level) + +/** + * Get RTCIO input level. + * + * @param rtcio_num The index of rtcio. 0 ~ SOC_RTC_IO_PIN_COUNT. + * @return 0: input low; ~0: input high. + */ +#define rtcio_hal_get_level(rtcio_num) rtcio_ll_get_level(rtcio_num) + +/** + * Set RTC IO direction. + * + * Configure RTC IO direction, such as output only, input only, + * output and input. + * + * @param rtcio_num The index of rtcio. 0 ~ SOC_RTC_IO_PIN_COUNT. + * @param mode IO direction. + */ +void rtcio_hal_set_direction(int rtcio_num, rtc_gpio_mode_t mode); + +/** + * Set RTC IO direction in deep sleep or disable sleep status. + * + * NOTE: ESP32 support INPUT_ONLY mode. + * ESP32S2 support INPUT_ONLY, OUTPUT_ONLY, INPUT_OUTPUT mode. + * + * @param rtcio_num The index of rtcio. 0 ~ SOC_RTC_IO_PIN_COUNT. + * @param mode IO direction. + */ +void rtcio_hal_set_direction_in_sleep(int rtcio_num, rtc_gpio_mode_t mode); + +/** + * RTC GPIO pullup enable. + * + * @param rtcio_num The index of rtcio. 0 ~ SOC_RTC_IO_PIN_COUNT. + */ +#define rtcio_hal_pullup_enable(rtcio_num) rtcio_ll_pullup_enable(rtcio_num) + +/** + * RTC GPIO pullup disable. + * + * @param rtcio_num The index of rtcio. 0 ~ SOC_RTC_IO_PIN_COUNT. + */ +#define rtcio_hal_pullup_disable(rtcio_num) rtcio_ll_pullup_disable(rtcio_num) + +/** + * RTC GPIO pulldown enable. + * + * @param rtcio_num The index of rtcio. 0 ~ SOC_RTC_IO_PIN_COUNT. + */ +#define rtcio_hal_pulldown_enable(rtcio_num) rtcio_ll_pulldown_enable(rtcio_num) + +/** + * RTC GPIO pulldown disable. + * + * @param rtcio_num The index of rtcio. 0 ~ SOC_RTC_IO_PIN_COUNT. + */ +#define rtcio_hal_pulldown_disable(rtcio_num) rtcio_ll_pulldown_disable(rtcio_num) + +/** + * Enable force hold function for RTC IO pad. + * + * Enabling HOLD function will cause the pad to lock current status, such as, + * input/output enable, input/output value, function, drive strength values. + * This function is useful when going into light or deep sleep mode to prevent + * the pin configuration from changing. + * + * @param rtcio_num The index of rtcio. 0 ~ SOC_RTC_IO_PIN_COUNT. + */ +#define rtcio_hal_hold_enable(rtcio_num) rtcio_ll_force_hold_enable(rtcio_num) + +/** + * Disable hold function on an RTC IO pad + * + * @note If disable the pad hold, the status of pad maybe changed in sleep mode. + * @param rtcio_num The index of rtcio. 0 ~ SOC_RTC_IO_PIN_COUNT. + */ +#define rtcio_hal_hold_disable(rtcio_num) rtcio_ll_force_hold_disable(rtcio_num) + +/** + * Enable force hold function for RTC IO pads. + * + * Enabling HOLD function will cause the pad to lock current status, such as, + * input/output enable, input/output value, function, drive strength values. + * This function is useful when going into light or deep sleep mode to prevent + * the pin configuration from changing. + * + * @param rtcio_num The index of rtcio. 0 ~ SOC_RTC_IO_PIN_COUNT. + */ +#define rtcio_hal_hold_all() rtcio_ll_force_hold_all() + +/** + * Disable hold function on an RTC IO pads. + * + * @note If disable the pad hold, the status of pad maybe changed in sleep mode. + * @param rtcio_num The index of rtcio. 0 ~ SOC_RTC_IO_PIN_COUNT. + */ +#define rtcio_hal_unhold_all() rtcio_ll_force_unhold_all() + +/** + * Enable wakeup function and set wakeup type from light sleep status for rtcio. + * + * @param rtcio_num The index of rtcio. 0 ~ SOC_RTC_IO_PIN_COUNT. + * @param type Wakeup on high level or low level. + */ +#define rtcio_hal_wakeup_enable(rtcio_num, type) rtcio_ll_wakeup_enable(rtcio_num, type) + +/** + * Disable wakeup function from light sleep status for rtcio. + * + * @param rtcio_num The index of rtcio. 0 ~ SOC_RTC_IO_PIN_COUNT. + */ +#define rtcio_hal_wakeup_disable(rtcio_num) rtcio_ll_wakeup_disable(rtcio_num) + +/** + * Helper function to disconnect internal circuits from an RTC IO + * This function disables input, output, pullup, pulldown, and enables + * hold feature for an RTC IO. + * Use this function if an RTC IO needs to be disconnected from internal + * circuits in deep sleep, to minimize leakage current. + * + * In particular, for ESP32-WROVER module, call + * rtc_gpio_isolate(GPIO_NUM_12) before entering deep sleep, to reduce + * deep sleep current. + * + * @param rtcio_num The index of rtcio. 0 ~ SOC_RTC_IO_PIN_COUNT. + */ +void rtcio_hal_isolate(int rtc_num); + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/arch/xtensa/include/esp32/soc/include/hal/rtc_io_types.h b/arch/xtensa/include/esp32/soc/include/hal/rtc_io_types.h new file mode 100644 index 0000000000000..82b358d86f154 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/rtc_io_types.h @@ -0,0 +1,25 @@ +// 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 + +/** RTCIO output/input mode type. */ +typedef enum { + RTC_GPIO_MODE_INPUT_ONLY , /*!< Pad input */ + RTC_GPIO_MODE_OUTPUT_ONLY, /*!< Pad output */ + RTC_GPIO_MODE_INPUT_OUTPUT, /*!< Pad input + output */ + RTC_GPIO_MODE_DISABLED, /*!< Pad (output + input) disable */ + RTC_GPIO_MODE_OUTPUT_OD, /*!< Pad open-drain output */ + RTC_GPIO_MODE_INPUT_OUTPUT_OD, /*!< Pad input + open-drain output */ +} rtc_gpio_mode_t; \ No newline at end of file diff --git a/arch/xtensa/include/esp32/soc/include/hal/sdio_slave_hal.h b/arch/xtensa/include/esp32/soc/include/hal/sdio_slave_hal.h new file mode 100644 index 0000000000000..e95bf045dfb99 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/sdio_slave_hal.h @@ -0,0 +1,529 @@ +// 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. + +/******************************************************************************* + * NOTICE + * The hal is not public api, don't use in application code. + * See readme.md in soc/include/hal/readme.md + ******************************************************************************/ + +// The HAL layer for SDIO slave (common part) + +// SDIO slave HAL usages: + +/* +Architecture: + +The whole SDIO slave peripheral consists of three parts: the registers (including the interrupt +control and shared registers), a send FIFO, and a receive FIFO. The document +``esp_slave_protocol.rst`` describes the functionality of the peripheral in detail. An SDIO host +will only ever access one of the three parts at any one time, thus the hardware functionality of +the SDIO slave peripheral are completely independent. Likewise, this HAL is organized in such a +fashion as to correspond to the three independent parts. + +The shared registers are quite simple: the slave can directly access them from the internal data +bus, while the host can access them by CMD52/53 with the correct address. As for the interrupts: +when an SDIO host interrupts the SDIO slave peripheral (by writing a command), the corresponding +bit in the interrupt register will be set; when the SDIO slave peripheral needs to interrupt the +host, it write some register to cause the host interrupt bit being set, and the slave hardware +will output the interrupt signal on the DAT1 line. + +For the FIFOs, the peripheral provides counters as registers so that the host can always know whether the slave +is ready to send/receive data. The HAL resets the counters during initialization, and the host should somehow +inform the slave to reset the counters again if it should reboot (or lose the counter value for some reasons). +Then the host can read/write the FIFOs by CMD53 commands according to the counters. + +In order to avoid copying data to/from the FIFOs or memory buffers each time, the HAL layer +contains a descriptor queue (implemented as linked-list) that allows descriptors of memory +buffers to be queued for transmission/reception. Once a buffer is queued, the HAL takes ownership +of the buffer until some "finish" functions successfully return, indicating the +transmission/reception of that buffer is complete. The ISR is invoked multiple times to iterate +through the queued descriptors, and also to signal to the upper layer if a buffer has been +freed. + +The HAL is used as below: + +- Receiving part: + + 1. Call `sdio_slave_hal_recv_start` to start the receiving DMA. + + If there are already buffers loaded, the receiving will start from those buffers first. + + 2. Call `sdio_slave_hal_recv_init_desc` with a `sdio_slave_hal_recv_desc_t` and the buffer address to + associate the descriptor with the buffer. + + The HAL initialize this descriptors with the determined length and maybe some extra data. + + 3. Call `sdio_slave_hal_load_buf` with the initialized descriptor of the buffer to load a + receiving buffer to the HAL. + + When the DMA is started, the descriptors is loaded onto the DMA linked-list, and the + counter of receiving buffers is increased so that the host will know this by the + receiving interrupt. The hardware will automatically go through the linked list and write + data into the buffers loaded on the list. + + 4. (Optional, mandatory only when interrupt enabled) Call `sdio_slave_hal_recv_done` to check + and clear the receiving interrupt bits. + + 5. Call `sdio_slave_hal_recv_has_next_item` to check whether there are finished buffers. + + 6. Call `sdio_slave_hal_recv_unload_desc` for the same times as + `sdio_slave_hal_recv_has_next_item` successfully returns. + + 7. (Optional) Call `sdio_slave_hal_recv_reset_counter` to reset the counter to current loaded + but not used buffers if you want to reset the counter only. This is available only when + the DMA is stopped. + + 8. (Optional) Call `sdio_slave_hal_recv_flush_one_buffer` (recursively) if you want to + discard data of one (or more) buffers and load them again. This is available only when + the DMA is stopped. + + 9. (Optional when deinitialization) Call `sdio_slave_hal_recv_unload_desc` recursively to get + all the buffers loaded to the HAL, no matter they are used or not. Don't do this when the + DMA is not stopped. + +- Sending part: + + The sending driver is slightly different, since we are not using the re-start feature. + (TODO: re-write this part if the stitch mode is released) + + 1. Call `sdio_slave_hal_send_start` to start the sending DMA. + + If there is already any data queued, it will ne ready to be sent to host now. + + 2. Call `sdio_slave_hal_send_queue` to queue the data to send. + + If the interrupt is enabled, the ISR will be invoked. + + 3. (Required if interrupt enabled) Call `` to clear the interrupt bits used by the SW + invoking logic. + + 4. Call `sdio_slave_hal_send_new_packet_if_exist` to check and send new packet (if there is + data queued). + + 5. Call `sdio_slave_hal_send_eof_happened` to check whether the previous packet is done. + + It will also clear the interrupt status bit for this event. + + 6. Call `sdio_slave_hal_send_get_next_finished_arg` recursively to get the arguments for the + finished buffers. + + 7. (Optional when deinitialization) Call `sdio_slave_hal_send_flush_next_buffer` recursively + to get all buffers queued, regardless sent or not. Don't do this when the DMA is not stopped. + + 8. (Optional) Call `sdio_slave_hal_send_reset_counter` to reset the counter to current loaded + but not sent buffers if you want to reset the counter only. Don't do this when the DMA is not + stopped. + + Note a counter should be used when performing step 2 and 6, to make sure that the queue size + is enough. + +- Host part: + + 1. Call `sdio_slave_hal_hostint_set_ena` and `sdio_slave_hal_hostint_get_ena` to + enable/disable the interrupt sent to master. Note that the host can also modify the same + registers at the same time. Try to avoid using them outside the initialization process. + + 2. Call `sdio_slave_hal_hostint_send` and `sdio_slave_hal_hostint_clear` to trigger general + purpose interrupts or cancel all kinds of interrupts send to the host. These interrupts are + set/cleared in a concurrent-safe way, so the slave can call these functions safely. + + 3. Call `sdio_slave_hal_slvint_fetch_clear` to fetch the general purpose interrupts sent by + the host to the slave. These interrupts will also be cleared after the calls. + + 4. Call `sdio_slave_hal_host_get_reg` and `sdio_slave_hal_host_set_reg` to read/write the + general purpose shared between the host and slave. Note that these registers are also not + concurrent-safe. Try not to write to the same register from two directions at the same time. +*/ + +#pragma once +#include +#include "soc/lldesc.h" +#include "hal/sdio_slave_types.h" +#include "hal/sdio_slave_ll.h" + +/// Space used for each sending descriptor. Should initialize the sendbuf accoring to this size. +#define SDIO_SLAVE_SEND_DESC_SIZE sizeof(sdio_slave_hal_send_desc_t) + + +/// Status of the sending part +typedef enum { + STATE_IDLE = 1, + STATE_WAIT_FOR_START = 2, + STATE_SENDING = 3, + STATE_GETTING_RESULT = 4, + STATE_GETTING_UNSENT_DESC = 5, +} send_state_t; + +typedef struct { + uint8_t* data; ///< Address of the buffer + size_t size; ///< Size of the buffer, but can only queue (size/SDIO_SLAVE_SEND_DESC_SIZE)-1 descriptors + uint8_t* write_ptr; + uint8_t* read_ptr; + uint8_t* free_ptr; +} sdio_ringbuf_t; + +// Append two extra words to be used by the HAL. +// Should Initialize the member `data` of `send_desc_queue` of the HAL context +// with size of this desc * N. + +/// DMA descriptor with extra fields +typedef struct sdio_slave_hal_send_desc_s { + lldesc_t dma_desc; ///< Used by Hardware, has pointer linking to next desc + uint32_t pkt_len; ///< Accumulated length till this descriptor + void* arg; ///< Holding arguments indicating this buffer */ +} sdio_slave_hal_send_desc_t; + +/// Descriptor used by the receiving part, call `sdio_slave_hal_recv_init_desc` +/// to initialize it before use. +typedef lldesc_t sdio_slave_hal_recv_desc_t; +#define sdio_slave_hal_recv_desc_s lldesc_s +typedef STAILQ_HEAD(recv_stailq_head_s, sdio_slave_hal_recv_desc_s) sdio_slave_hal_recv_stailq_t; + + +/** HAL context structure. Call `sdio_slave_hal_init` to initialize it and + * configure required members before actually use the HAL. + */ +typedef struct { + /// Hardware registers for this SDIO slave peripheral, configured by + /// `sdio_slave_hal_init` + struct { + slc_dev_t* slc; + host_dev_t* host; + hinf_dev_t* hinf; + }; + sdio_slave_sending_mode_t sending_mode; /**< Sending mode, should be manually configured before using the HAL. + * see `sdio_slave_sending_mode_t`. + */ + sdio_slave_timing_t timing; /**< Timing mode (launch edge and latch edge settings). Should be manually + * configured before using the HAL. `SDIO_SLAVE_TIMING_PSEND_PSAMPLE` is + * recommended by default. + */ + int send_queue_size; /**< Max buffers that can be queued before sending. Should be manually + * configured before using the HAL. + */ + size_t recv_buffer_size; /**< The size of each buffer. The host and slave should share a + * pre-negotiated value. Should be manually configured before using + * the HAL. + */ + sdio_ringbuf_t send_desc_queue; /**< The ring buffer used to hold queued descriptors. Should be manually + * initialized before using the HAL. + */ + //Internal status, no need to touch. + send_state_t send_state; // Current state of sending part. + uint32_t tail_pkt_len; // The accumulated send length of the tail packet. + sdio_slave_hal_send_desc_t* in_flight_head; // The head of linked list in-flight. + sdio_slave_hal_send_desc_t* in_flight_end; // The end of linked list in-flight. + sdio_slave_hal_send_desc_t* in_flight_next; // The header of linked list to be sent next time. + sdio_slave_hal_send_desc_t* returned_desc; // The last returned descriptor + + sdio_slave_hal_recv_stailq_t recv_link_list; // Linked list of buffers ready to hold data and the buffers already hold data. + volatile sdio_slave_hal_recv_desc_t* recv_cur_ret; // Next desc to return, NULL if all loaded descriptors are returned. +} sdio_slave_context_t ; + +/** + * Initialize the HAL, should provide buffers to the context and configure the + * members before this funciton is called. + * + * @param hal Context of the HAL layer. + */ +void sdio_slave_hal_init(sdio_slave_context_t *hal); + +/** + * Initialize the SDIO slave peripheral hardware. + * + * @param hal Context of the HAL layer. + */ +void sdio_slave_hal_hw_init(sdio_slave_context_t *hal); + +/** + * Set the IO ready for host to read. + * + * @param hal Context of the HAL layer. + * @param ready true to tell the host the slave is ready, otherwise false. + */ +void sdio_slave_hal_set_ioready(sdio_slave_context_t *hal, bool ready); + +/*--------------------------------------------------------------------------- + * Send + *--------------------------------------------------------------------------*/ + +/** + * The hardware sending DMA starts. If there is existing data, send them. + * + * @param hal Context of the HAL layer. + */ +esp_err_t sdio_slave_hal_send_start(sdio_slave_context_t *hal); + +/** + * Stops hardware sending DMA. + * + * @note The data in the queue, as well as the counter are not touched. + * @param hal Context of the HAL layer. + */ +void sdio_slave_hal_send_stop(sdio_slave_context_t *hal); + +/** + * Put some data into the sending queue. + * + * @note The caller should keeps the buffer, until the `arg` is returned by + * `sdio_slave_hal_send_get_next_finished_arg`. + * @note The caller should count to ensure there is enough space in the queue. + * The initial queue size is sizeof(sendbuf.data)/sizeof(sdio_slave_hal_send_desc_t)-1, + * Will decrease by one when this function successfully returns. + * Released only by `sdio_slave_hal_send_get_next_finished_arg` or + * `sdio_slave_hal_send_flush_next_buffer`. + * + * @note The HAL is not thread-safe. The caller should use a spinlock to ensure + * the `sdio_slave_hal_send_queue` and ... are not called at the same time. + * + * @param hal Context of the HAL layer. + * @param addr Address of data in the memory to send. + * @param len Length of data to send. + * @param arg Argument indicating this sending. + * @return Always ESP_OK. + */ +esp_err_t sdio_slave_hal_send_queue(sdio_slave_context_t *hal, uint8_t *addr, size_t len, void *arg); + +/** + * The ISR should call this, to handle the SW invoking event. + * @param hal Context of the HAL layer. + */ +void sdio_slave_hal_send_handle_isr_invoke(sdio_slave_context_t *hal); + +/** + * Check whether there is no in-flight transactions, and send new packet if there + * is new packets queued. + * + * @param hal Context of the HAL layer. + * @return + * - ESP_OK: The DMA starts to send a new packet. + * - ESP_ERR_NOT_FOUND: No packet waiting to be sent. + * - ESP_ERR_INVALID_STATE: There is packet in-flight. + */ +esp_err_t sdio_slave_hal_send_new_packet_if_exist(sdio_slave_context_t *hal); + +/** + * Check whether the sending EOF has happened and clear the interrupt. + * + * Call `sdio_slave_hal_send_get_next_finished_arg` recursively to retrieve arguments of finished + * buffers. + * + * @param hal Context of the HAL layer. + * @return true if happened, otherwise false. + */ +bool sdio_slave_hal_send_eof_happened(sdio_slave_context_t *hal); + +/** + * Get the arguments of finished packets. Call recursively until all finished + * arguments are all retrieved. + * + * @param hal Context of the HAL layer. + * @param out_arg Output argument of the finished buffer. + * @param out_returned_cnt Released queue size to be queued again. + * @return + * - ESP_OK: if one argument retrieved. + * - ESP_ERR_NOT_FOUND: All the arguments of the finished buffers are retrieved. + */ +esp_err_t sdio_slave_hal_send_get_next_finished_arg(sdio_slave_context_t *hal, void **out_arg, uint32_t* out_returned_cnt); + +/** + * Flush one buffer in the queue, no matter sent, canceled or not sent yet. + * + * Call recursively to clear the whole queue before deinitialization. + * + * @note Only call when the DMA is stopped! + * @param hal Context of the HAL layer. + * @param out_arg Argument indiciating the buffer to send + * @param out_return_cnt Space in the queue released after this descriptor is flushed. + * @return + * - ESP_ERR_INVALID_STATE: This function call be called only when the DMA is stopped. + * - ESP_ERR_NOT_FOUND: if no buffer in the queue + * - ESP_OK: if a buffer is successfully flushed and returned. + */ +esp_err_t sdio_slave_hal_send_flush_next_buffer(sdio_slave_context_t *hal, void **out_arg, uint32_t *out_return_cnt); + +/** + * Walk through all the unsent buffers and reset the counter to the accumulated length of them. The data will be kept. + * + * @note Only call when the DMA is stopped! + * @param hal Context of the HAL layer. + * @return + * - ESP_ERR_INVALID_STATE: this function call be called only when the DMA is stopped + * - ESP_OK: if success + */ +esp_err_t sdio_slave_hal_send_reset_counter(sdio_slave_context_t *hal); + + +/*--------------------------------------------------------------------------- + * Receive + *--------------------------------------------------------------------------*/ +/** + * Start the receiving DMA. + * + * @note If there are already some buffers loaded, will receive from them first. + * @param hal Context of the HAL layer. + */ +void sdio_slave_hal_recv_start(sdio_slave_context_t *hal); + +/** + * Stop the receiving DMA. + * + * @note Data and the counter will not be touched. You can still call + * `sdio_slave_hal_recv_has_next_item` to get the received buffer. + * And unused buffers loaded to the HAL will still be in the `loaded` + * state in the HAL, until returned by `sdio_slave_hal_recv_unload_desc`. + * @param hal Context of the HAL layer. + */ +void sdio_slave_hal_recv_stop(sdio_slave_context_t* hal); + +/** + * Associate the buffer to the descriptor given. The descriptor may also be initialized with some + * other data. + * + * @param hal Context of the HAL layer. + * @param desc Descriptor to associate with the buffer + * @param start Start address of the buffer + */ +void sdio_slave_hal_recv_init_desc(sdio_slave_context_t *hal, sdio_slave_hal_recv_desc_t *desc, uint8_t *start); + +/** + * Load the buffer to the HAL to be used to receive data. + * + * @note Loaded buffers will be returned to the upper layer only when: + * 1. Returned by `sdio_slave_hal_recv_has_next_item` when receiving to that buffer successfully + * done. + * 2. Returned by `sdio_slave_hal_recv_unload_desc` unconditionally. + * @param hal Context of the HAL layer. + * @param desc Descriptor to load to the HAL to receive. + */ +void sdio_slave_hal_load_buf(sdio_slave_context_t *hal, sdio_slave_hal_recv_desc_t *desc); + +/** + * Check and clear the interrupt indicating a buffer has finished receiving. + * + * @param hal Context of the HAL layer. + * @return true if interrupt triggered, otherwise false. + */ +bool sdio_slave_hal_recv_done(sdio_slave_context_t* hal); + +/** + * Call this function recursively to check whether there is any buffer that has + * finished receiving. + * + * Will walk through the linked list to find a newer finished buffer. For each successful return, + * it means there is one finished buffer. You can one by `sdio_slave_hal_recv_unload_desc`. You can + * also call `sdio_slave_hal_recv_has_next_item` several times continuously before you call the + * `sdio_slave_hal_recv_unload_desc` for the same times. + * + * @param hal Context of the HAL layer. + * @return true if there is + */ +bool sdio_slave_hal_recv_has_next_item(sdio_slave_context_t* hal); + +/** + * Unconditionally remove and return the first descriptor loaded to the HAL. + * + * Unless during de-initialization, `sdio_slave_hal_recv_has_next_item` should have succeed for the + * same times as this function is called, to ensure the returned descriptor has finished its + * receiving job. + * + * @param hal Context of the HAL layer. + * @return The removed descriptor, NULL means the linked-list is empty. + */ +sdio_slave_hal_recv_desc_t *sdio_slave_hal_recv_unload_desc(sdio_slave_context_t *hal); + +/** + * Walk through all the unused buffers and reset the counter to the number of + * them. + * + * @note Only call when the DMA is stopped! + * @param hal Context of the HAL layer. + */ +void sdio_slave_hal_recv_reset_counter(sdio_slave_context_t *hal); + +/** + * Walk through all the used buffers, clear the finished flag and appended them + * back to the end of the unused list, waiting to receive then. + * + * @note You will lose all the received data in the buffer. + * @note Only call when the DMA is stopped! + * @param hal Context of the HAL layer. + */ +void sdio_slave_hal_recv_flush_one_buffer(sdio_slave_context_t *hal); + + +/*--------------------------------------------------------------------------- + * Host + *--------------------------------------------------------------------------*/ + +/** + * Enable some of the interrupts for the host. + * + * @note May have concurrency issue wit the host or other tasks, suggest only use it during + * initialization. + * @param hal Context of the HAL layer. + * @param mask Bitwise mask for the interrupts to enable. + */ +void sdio_slave_hal_hostint_set_ena(sdio_slave_context_t *hal, const sdio_slave_hostint_t *mask); + +/** + * Get the enabled interrupts. + * + * @param hal Context of the HAL layer. + * @param out_int_mask Output of the enabled interrupts + */ +void sdio_slave_hal_hostint_get_ena(sdio_slave_context_t *hal, sdio_slave_hostint_t *out_int_mask); + +/** + * Send general purpose interrupt (slave send to host). + * @param hal Context of the HAL layer. + * @param mask Interrupts to send, only `SDIO_SLAVE_HOSTINT_BIT*` are allowed. + */ +void sdio_slave_hal_hostint_send(sdio_slave_context_t *hal, const sdio_slave_hostint_t *mask); + +/** + * Cleared the specified interrupts for the host. + * + * @param hal Context of the HAL layer. + * @param mask Interrupts to clear. + */ +void sdio_slave_hal_hostint_clear(sdio_slave_context_t *hal, const sdio_slave_hostint_t *mask); + + +/** + * Fetch the interrupt (host send to slave) status bits and clear all of them. + * @param hal Context of the HAL layer. + * @param out_int_mask Output interrupt status + */ +void sdio_slave_hal_slvint_fetch_clear(sdio_slave_context_t *hal, sdio_slave_ll_slvint_t *out_int_mask); + +/** + * Get the value of a shared general purpose register. + * + * @param hal Context of the HAL layer. + * @param pos Position of the register, 4 bytes share a word. 0-63 except 24-27. + * @return The register value. + */ +uint8_t sdio_slave_hal_host_get_reg(sdio_slave_context_t *hal, int pos); + +/** + * Set the value of shared general purpose register. + * + * @param hal Context of the HAL layer. + * @param pos Position of the register, 4 bytes share a word. 0-63 except 24-27. + * @param reg Value to set. + */ +void sdio_slave_hal_host_set_reg(sdio_slave_context_t *hal, int pos, uint8_t reg); + diff --git a/arch/xtensa/include/esp32/soc/include/hal/sdio_slave_ll.h b/arch/xtensa/include/esp32/soc/include/hal/sdio_slave_ll.h new file mode 100644 index 0000000000000..129f288cadbe7 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/sdio_slave_ll.h @@ -0,0 +1,482 @@ +// 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. + +/******************************************************************************* + * NOTICE + * The hal is not public api, don't use in application code. + * See readme.md in soc/include/hal/readme.md + ******************************************************************************/ + +// The LL layer for ESP32 SDIO slave register operations +// It's strange but `tx_*` regs for host->slave transfers while `rx_*` regs for slave->host transfers +// To reduce ambiguity, we call (host->slave, tx) transfers receiving and (slave->host, rx) transfers receiving + +#pragma once + +#include "hal/sdio_slave_hal.h" +#include "soc/slc_struct.h" +#include "soc/slc_reg.h" +#include "soc/host_struct.h" +#include "soc/host_reg.h" +#include "soc/hinf_struct.h" +#include "soc/lldesc.h" + +/// Get address of the only SLC registers for ESP32 +#define sdio_slave_ll_get_slc(ID) (&SLC) +/// Get address of the only HOST registers for ESP32 +#define sdio_slave_ll_get_host(ID) (&HOST) +/// Get address of the only HINF registers for ESP32 +#define sdio_slave_ll_get_hinf(ID) (&HINF) + + +/// Mask of general purpose interrupts sending from the host. +typedef enum { + SDIO_SLAVE_LL_SLVINT_0 = BIT(0), ///< General purpose interrupt bit 0. + SDIO_SLAVE_LL_SLVINT_1 = BIT(1), + SDIO_SLAVE_LL_SLVINT_2 = BIT(2), + SDIO_SLAVE_LL_SLVINT_3 = BIT(3), + SDIO_SLAVE_LL_SLVINT_4 = BIT(4), + SDIO_SLAVE_LL_SLVINT_5 = BIT(5), + SDIO_SLAVE_LL_SLVINT_6 = BIT(6), + SDIO_SLAVE_LL_SLVINT_7 = BIT(7), +} sdio_slave_ll_slvint_t; + +/** + * Initialize the hardware. + * + * @param slc Address of the SLC registers + */ +static inline void sdio_slave_ll_init(slc_dev_t *slc) +{ + slc->slc0_int_ena.val = 0; + + slc->conf0.slc0_rx_auto_wrback = 1; + slc->conf0.slc0_token_auto_clr = 0; + slc->conf0.slc0_rx_loop_test = 0; + slc->conf0.slc0_tx_loop_test = 0; + + slc->conf1.slc0_rx_stitch_en = 0; + slc->conf1.slc0_tx_stitch_en = 0; + slc->conf1.slc0_len_auto_clr = 0; + + slc->rx_dscr_conf.slc0_token_no_replace = 1; +} + +/** + * Set the timing for the communication + * + * @param host Address of the host registers + * @param timing Timing configuration to set + */ +static inline void sdio_slave_ll_set_timing(host_dev_t *host, sdio_slave_timing_t timing) +{ + switch(timing) { + case SDIO_SLAVE_TIMING_PSEND_PSAMPLE: + host->conf.frc_sdio20 = 0x1f; + host->conf.frc_sdio11 = 0; + host->conf.frc_pos_samp = 0x1f; + host->conf.frc_neg_samp = 0; + break; + case SDIO_SLAVE_TIMING_PSEND_NSAMPLE: + host->conf.frc_sdio20 = 0x1f; + host->conf.frc_sdio11 = 0; + host->conf.frc_pos_samp = 0; + host->conf.frc_neg_samp = 0x1f; + break; + case SDIO_SLAVE_TIMING_NSEND_PSAMPLE: + host->conf.frc_sdio20 = 0; + host->conf.frc_sdio11 = 0x1f; + host->conf.frc_pos_samp = 0x1f; + host->conf.frc_neg_samp = 0; + break; + case SDIO_SLAVE_TIMING_NSEND_NSAMPLE: + host->conf.frc_sdio20 = 0; + host->conf.frc_sdio11 = 0x1f; + host->conf.frc_pos_samp = 0; + host->conf.frc_neg_samp = 0x1f; + break; + } +} + +/** + * Set the HS supported bit to be read by the host. + * + * @param hinf Address of the hinf registers + * @param hs true if supported, otherwise false. + */ +static inline void sdio_slave_ll_enable_hs(hinf_dev_t *hinf, bool hs) +{ + if (hs) { + hinf->cfg_data1.sdio_ver = 0x232; + hinf->cfg_data1.highspeed_enable = 1; + } +} + +/** + * Set the IO Ready bit to be read by the host. + * + * @param hinf Address of the hinf registers + * @param ready true if ready, otherwise false. + */ +static inline void sdio_slave_ll_set_ioready(hinf_dev_t *hinf, bool ready) +{ + hinf->cfg_data1.sdio_ioready1 = (ready ? 1 : 0); //set IO ready to 1 to stop host from using +} + +/*--------------------------------------------------------------------------- + * Send + *--------------------------------------------------------------------------*/ +/** + * Reset the sending DMA. + * + * @param slc Address of the SLC registers + */ +static inline void sdio_slave_ll_send_reset(slc_dev_t *slc) +{ + //reset to flush previous packets + slc->conf0.slc0_rx_rst = 1; + slc->conf0.slc0_rx_rst = 0; +} + +/** + * Start the sending DMA with the given descriptor. + * + * @param slc Address of the SLC registers + * @param desc Descriptor to send + */ +static inline void sdio_slave_ll_send_start(slc_dev_t *slc, const lldesc_t *desc) +{ + slc->slc0_rx_link.addr = (uint32_t)desc; + slc->slc0_rx_link.start = 1; +} + +/** + * Write the PKT_LEN register to be written by the host to a certain value. + * + * @param slc Address of the SLC registers + * @param len Length to write + */ +static inline void sdio_slave_ll_send_write_len(slc_dev_t *slc, uint32_t len) +{ + slc->slc0_len_conf.val = FIELD_TO_VALUE2(SLC_SLC0_LEN_WDATA, len) | FIELD_TO_VALUE2(SLC_SLC0_LEN_WR, 1); +} + +/** + * Read the value of PKT_LEN register. The register may keep the same until read + * by the host. + * + * @param host Address of the host registers + * @return The value of PKT_LEN register. + */ +static inline uint32_t sdio_slave_ll_send_read_len(host_dev_t *host) +{ + return host->pkt_len.reg_slc0_len; +} + +/** + * Enable the rx_done interrupt. (sending) + * + * @param slc Address of the SLC registers + * @param ena true if enable, otherwise false. + */ +static inline void sdio_slave_ll_send_part_done_intr_ena(slc_dev_t *slc, bool ena) +{ + slc->slc0_int_ena.rx_done = (ena ? 1 : 0); +} + +/** + * Clear the rx_done interrupt. (sending) + * + * @param slc Address of the SLC registers + */ +static inline void sdio_slave_ll_send_part_done_clear(slc_dev_t *slc) +{ + slc->slc0_int_clr.rx_done = 1; +} + +/** + * Check whether the hardware is ready for the SW to use rx_done to invoke + * the ISR. + * + * @param slc Address of the SLC registers + * @return true if ready, otherwise false. + */ +static inline bool sdio_slave_ll_send_invoker_ready(slc_dev_t *slc) +{ + return slc->slc0_int_raw.rx_done; +} + +/** + * Stop the sending DMA. + * + * @param slc Address of the SLC registers + */ +static inline void sdio_slave_ll_send_stop(slc_dev_t *slc) +{ + slc->slc0_rx_link.stop = 1; +} + +/** + * Enable the sending interrupt (rx_eof). + * + * @param slc Address of the SLC registers + * @param ena true to enable, false to disable + */ +static inline void sdio_slave_ll_send_intr_ena(slc_dev_t *slc, bool ena) +{ + slc->slc0_int_ena.rx_eof = (ena? 1: 0); +} + +/** + * Clear the sending interrupt (rx_eof). + * + * @param slc Address of the SLC registers + */ +static inline void sdio_slave_ll_send_intr_clr(slc_dev_t *slc) +{ + slc->slc0_int_clr.rx_eof = 1; +} + +/** + * Check whether the sending is done. + * + * @param slc Address of the SLC registers + * @return true if done, otherwise false + */ +static inline bool sdio_slave_ll_send_done(slc_dev_t *slc) +{ + return slc->slc0_int_st.rx_eof != 0; +} + +/** + * Clear the host interrupt indicating the slave having packet to be read. + * + * @param host Address of the host registers + */ +static inline void sdio_slave_ll_send_hostint_clr(host_dev_t *host) +{ + host->slc0_int_clr.rx_new_packet = 1; +} + +/*--------------------------------------------------------------------------- + * Receive + *--------------------------------------------------------------------------*/ +/** + * Enable the receiving interrupt. + * + * @param slc Address of the SLC registers + * @param ena + */ +static inline void sdio_slave_ll_recv_intr_ena(slc_dev_t *slc, bool ena) +{ + slc->slc0_int_ena.tx_done = (ena ? 1 : 0); +} + +/** + * Start receiving DMA with the given descriptor. + * + * @param slc Address of the SLC registers + * @param desc Descriptor of the receiving buffer. + */ +static inline void sdio_slave_ll_recv_start(slc_dev_t *slc, lldesc_t *desc) +{ + slc->slc0_tx_link.addr = (uint32_t)desc; + slc->slc0_tx_link.start = 1; +} + +/** + * Increase the receiving buffer counter by 1. + * + * @param slc Address of the SLC registers + */ +static inline void sdio_slave_ll_recv_size_inc(slc_dev_t *slc) +{ + // fields wdata and inc_more should be written by the same instruction. + slc->slc0_token1.val = FIELD_TO_VALUE2(SLC_SLC0_TOKEN1_WDATA, 1) | FIELD_TO_VALUE2(SLC_SLC0_TOKEN1_INC_MORE, 1); +} + +/** + * Reset the receiving buffer. + * + * @param slc Address of the SLC registers + */ +static inline void sdio_slave_ll_recv_size_reset(slc_dev_t *slc) +{ + slc->slc0_token1.val = FIELD_TO_VALUE2(SLC_SLC0_TOKEN1_WDATA, 0) | FIELD_TO_VALUE2(SLC_SLC0_TOKEN1_WR, 1); +} + +/** + * Check whether there is a receiving finished event. + * + * @param slc Address of the SLC registers + * @return + */ +static inline bool sdio_slave_ll_recv_done(slc_dev_t *slc) +{ + return slc->slc0_int_raw.tx_done != 0; +} + +/** + * Clear the receiving finished interrupt. + * + * @param slc Address of the SLC registers + */ +static inline void sdio_slave_ll_recv_done_clear(slc_dev_t *slc) +{ + slc->slc0_int_clr.tx_done = 1; +} + +/** + * Restart the DMA. Call after you modified the next pointer of the tail descriptor to the appended + * descriptor. + * + * @param slc Address of the SLC registers + */ +static inline void sdio_slave_ll_recv_restart(slc_dev_t *slc) +{ + slc->slc0_tx_link.restart = 1; +} + +/** + * Reset the receiving DMA. + * + * @param slc Address of the SLC registers + */ +static inline void sdio_slave_ll_recv_reset(slc_dev_t *slc) +{ + slc->conf0.slc0_tx_rst = 1; + slc->conf0.slc0_tx_rst = 0; +} + +/** + * Stop the receiving DMA. + * + * @param slc Address of the SLC registers + */ +static inline void sdio_slave_ll_recv_stop(slc_dev_t *slc) +{ + slc->slc0_tx_link.stop = 1; +} + +/*--------------------------------------------------------------------------- + * Host + *--------------------------------------------------------------------------*/ +/** + * Get the address of the shared general purpose register. Internal. + * + * @param host Address of the host registers + * @param pos Position of the register, 0-63 except 24-27. + * @return address of the register. + */ +static inline intptr_t sdio_slave_ll_host_get_w_reg(host_dev_t* host, int pos) +{ + return (intptr_t )&(host->conf_w0) + pos + (pos>23?4:0) + (pos>31?12:0); +} + +/** + * Get the value of the shared general purpose register. + * + * @param host Address of the host registers + * @param pos Position of the register, 0-63, except 24-27. + * @return value of the register. + */ +static inline uint8_t sdio_slave_ll_host_get_reg(host_dev_t *host, int pos) +{ + return *(uint8_t*)sdio_slave_ll_host_get_w_reg(host, pos); +} + +/** + * Set the value of the shared general purpose register. + * + * @param host Address of the host registers + * @param pos Position of the register, 0-63, except 24-27. + * @param reg Value to set. + */ +static inline void sdio_slave_ll_host_set_reg(host_dev_t* host, int pos, uint8_t reg) +{ + uint32_t* addr = (uint32_t*)(sdio_slave_ll_host_get_w_reg(host, pos) & (~3)); + uint32_t shift = (pos % 4) * 8; + *addr &= ~(0xff << shift); + *addr |= ((uint32_t)reg << shift); +} + +/** + * Get the interrupt enable bits for the host. + * + * @param host Address of the host registers + * @return Enabled interrupts + */ +static inline sdio_slave_hostint_t sdio_slave_ll_host_get_intena(host_dev_t* host) +{ + return host->slc0_func1_int_ena.val; +} + +/** + * Set the interrupt enable bits for the host. + * + * @param host Address of the host registers + * @param mask Mask of interrupts to enable + */ +static inline void sdio_slave_ll_host_set_intena(host_dev_t *host, const sdio_slave_hostint_t *mask) +{ + host->slc0_func1_int_ena.val = (*mask); +} + +/** + * Clear the interrupt bits for the host. + * @param host Address of the host registers + * @param mask Mask of interrupts to clear. + */ +static inline void sdio_slave_ll_host_intr_clear(host_dev_t* host, const sdio_slave_hostint_t *mask) +{ + host->slc0_int_clr.val = (*mask); +} + +/** + * Send general purpose interrupts to the host. + * @param slc Address of the SLC registers + * @param mask Mask of interrupts to seend to host + */ +static inline void sdio_slave_ll_host_send_int(slc_dev_t *slc, const sdio_slave_hostint_t *mask) +{ + //use registers in SLC to trigger, rather than write HOST registers directly + //other interrupts than tohost interrupts are not supported yet + slc->intvec_tohost.slc0_intvec = (*mask); +} + +/** + * Enable some of the slave interrups (send from host) + * + * @param slc Address of the SLC registers + * @param mask Mask of interrupts to enable, all those set to 0 will be disabled. + */ +static inline void sdio_slave_ll_slvint_set_ena(slc_dev_t *slc, const sdio_slave_ll_slvint_t *mask) +{ + //other interrupts are not enabled + slc->slc0_int_ena.val = (slc->slc0_int_ena.val & (~0xff)) | ((*mask) & 0xff); +} + +/** + * Fetch the slave interrupts (send from host) and clear them. + * + * @param slc Address of the SLC registers + * @param out_slv_int Output of the slave interrupts fetched and cleared. + */ +static inline void sdio_slave_ll_slvint_fetch_clear(slc_dev_t *slc, sdio_slave_ll_slvint_t *out_slv_int) +{ + sdio_slave_ll_slvint_t slv_int = slc->slc0_int_st.val & 0xff; + *out_slv_int = slv_int; + slc->slc0_int_clr.val = slv_int; +} + diff --git a/arch/xtensa/include/esp32/soc/include/hal/sdio_slave_types.h b/arch/xtensa/include/esp32/soc/include/hal/sdio_slave_types.h new file mode 100644 index 0000000000000..fd3e4050e4a75 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/sdio_slave_types.h @@ -0,0 +1,47 @@ +// 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. + +#pragma once + +#include "soc/soc.h" + +/// Mask of interrupts sending to the host. +typedef enum { + SDIO_SLAVE_HOSTINT_BIT0 = BIT(0), ///< General purpose interrupt bit 0. + SDIO_SLAVE_HOSTINT_BIT1 = BIT(1), + SDIO_SLAVE_HOSTINT_BIT2 = BIT(2), + SDIO_SLAVE_HOSTINT_BIT3 = BIT(3), + SDIO_SLAVE_HOSTINT_BIT4 = BIT(4), + SDIO_SLAVE_HOSTINT_BIT5 = BIT(5), + SDIO_SLAVE_HOSTINT_BIT6 = BIT(6), + SDIO_SLAVE_HOSTINT_BIT7 = BIT(7), + SDIO_SLAVE_HOSTINT_SEND_NEW_PACKET = BIT(23), ///< New packet available +} sdio_slave_hostint_t; + + +/// Timing of SDIO slave +typedef enum { + SDIO_SLAVE_TIMING_PSEND_PSAMPLE = 0,/**< Send at posedge, and sample at posedge. Default value for HS mode. + * Normally there's no problem using this to work in DS mode. + */ + SDIO_SLAVE_TIMING_NSEND_PSAMPLE ,///< Send at negedge, and sample at posedge. Default value for DS mode and below. + SDIO_SLAVE_TIMING_PSEND_NSAMPLE, ///< Send at posedge, and sample at negedge + SDIO_SLAVE_TIMING_NSEND_NSAMPLE, ///< Send at negedge, and sample at negedge +} sdio_slave_timing_t; + +/// Configuration of SDIO slave mode +typedef enum { + SDIO_SLAVE_SEND_STREAM = 0, ///< Stream mode, all packets to send will be combined as one if possible + SDIO_SLAVE_SEND_PACKET = 1, ///< Packet mode, one packets will be sent one after another (only increase packet_len if last packet sent). +} sdio_slave_sending_mode_t; \ No newline at end of file diff --git a/arch/xtensa/include/esp32/soc/include/hal/sigmadelta_hal.h b/arch/xtensa/include/esp32/soc/include/hal/sigmadelta_hal.h new file mode 100644 index 0000000000000..55363fdccf701 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/sigmadelta_hal.h @@ -0,0 +1,71 @@ +// 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. + +/******************************************************************************* + * NOTICE + * The hal is not public api, don't use in application code. + * See readme.md in soc/include/hal/readme.md + ******************************************************************************/ + +// The HAL layer for SIGMADELTA. +// There is no parameter check in the hal layer, so the caller must ensure the correctness of the parameters. + +#pragma once + +#include "soc/sigmadelta_periph.h" +#include "hal/sigmadelta_types.h" +#include "hal/sigmadelta_ll.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Context that should be maintained by both the driver and the HAL + */ + +typedef struct { + gpio_sd_dev_t *dev; +} sigmadelta_hal_context_t; + +/** + * @brief Set Sigma-delta channel duty. + * + * @param hal Context of the HAL layer + * @param channel Sigma-delta channel number + * @param duty Sigma-delta duty of one channel, the value ranges from -128 to 127, recommended range is -90 ~ 90. + * The waveform is more like a random one in this range. + */ +#define sigmadelta_hal_set_duty(hal, channel, duty) sigmadelta_ll_set_duty((hal)->dev, channel, duty) + +/** + * @brief Set Sigma-delta channel's clock pre-scale value. + * + * @param hal Context of the HAL layer + * @param channel Sigma-delta channel number + * @param prescale The divider of source clock, ranges from 0 to 255 + */ +#define sigmadelta_hal_set_prescale(hal, channel, prescale) sigmadelta_ll_set_prescale((hal)->dev, channel, prescale) + +/** + * @brief Init the SIGMADELTA hal and set the SIGMADELTA 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 sigmadelta_num The uart port number, the max port number is (SIGMADELTA_NUM_MAX -1) + */ +void sigmadelta_hal_init(sigmadelta_hal_context_t *hal, int sigmadelta_num); + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/arch/xtensa/include/esp32/soc/include/hal/sigmadelta_types.h b/arch/xtensa/include/esp32/soc/include/hal/sigmadelta_types.h new file mode 100644 index 0000000000000..e6ab0b4737aca --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/sigmadelta_types.h @@ -0,0 +1,45 @@ +// 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. + +#pragma once + +#include "soc/sigmadelta_caps.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief SIGMADELTA port number, the max port number is (SIGMADELTA_NUM_MAX -1). + */ +typedef int sigmadelta_port_t; + +/** + * @brief Sigma-delta channel list + */ +typedef int sigmadelta_channel_t; + +/** + * @brief Sigma-delta configure struct + */ +typedef struct { + sigmadelta_channel_t channel; /*!< Sigma-delta channel number */ + int8_t sigmadelta_duty; /*!< Sigma-delta duty, duty ranges from -128 to 127. */ + uint8_t sigmadelta_prescale; /*!< Sigma-delta prescale, prescale ranges from 0 to 255. */ + uint8_t sigmadelta_gpio; /*!< Sigma-delta output io number, refer to gpio.h for more details. */ +} sigmadelta_config_t; + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/arch/xtensa/include/esp32/soc/include/hal/spi_flash_hal.h b/arch/xtensa/include/esp32/soc/include/hal/spi_flash_hal.h new file mode 100644 index 0000000000000..6992daf6e1bfa --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/spi_flash_hal.h @@ -0,0 +1,218 @@ +// Copyright 2010-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. + +/******************************************************************************* + * NOTICE + * The HAL is not public api, don't use in application code. + * See readme.md in soc/include/hal/readme.md + ******************************************************************************/ + +// The HAL layer for SPI Flash (common part) + +#pragma once + +#include "hal/spi_flash_ll.h" +#include "hal/spi_types.h" +#include "hal/spi_flash_types.h" +#include "soc/soc_memory_layout.h" + +/* Hardware host-specific constants */ +#define SPI_FLASH_HAL_MAX_WRITE_BYTES 64 +#define SPI_FLASH_HAL_MAX_READ_BYTES 64 + +/** + * Generic driver context structure for all chips using the SPI peripheral. + * Include this into the HEAD of the driver data for other driver + * implementations that also use the SPI peripheral. + */ +typedef struct { + spi_dev_t *spi; ///< Pointer to SPI peripheral registers (SP1, SPI2 or SPI3). Set before initialisation. + int cs_num; ///< Which cs pin is used, 0-2. + int extra_dummy; + spi_flash_ll_clock_reg_t clock_conf; +} spi_flash_memspi_data_t; + +/// Configuration structure for the SPI driver. +typedef struct { + spi_host_device_t host_id; ///< SPI peripheral ID. + int cs_num; ///< Which cs pin is used, 0-2. + bool iomux; ///< Whether the IOMUX is used, used for timing compensation. + int input_delay_ns; ///< Input delay on the MISO pin after the launch clock, used for timing compensation. + esp_flash_speed_t speed;///< SPI flash clock speed to work at. +} spi_flash_memspi_config_t; + +/** + * Configure SPI flash hal settings. + * + * @param data Buffer to hold configured data, the buffer should be in DRAM to be available when cache disabled + * @param cfg Configurations to set + * + * @return + * - ESP_OK: success + * - ESP_ERR_INVALID_ARG: the data buffer is not in the DRAM. + */ +esp_err_t spi_flash_hal_init(spi_flash_memspi_data_t *data_out, const spi_flash_memspi_config_t *cfg); + +/** + * Configure the device-related register before transactions. + * + * @param driver The driver context. + * + * @return always return ESP_OK. + */ +esp_err_t spi_flash_hal_device_config(spi_flash_host_driver_t *driver); + +/** + * Send an user-defined spi transaction to the device. + * + * @note This is usually used when the memspi interface doesn't support some + * particular commands. Since this function supports timing compensation, it is + * also used to receive some data when the frequency is high. + * + * @param driver The driver context. + * @param trans The transaction to send, also holds the received data. + * + * @return always return ESP_OK. + */ +esp_err_t spi_flash_hal_common_command(spi_flash_host_driver_t *driver, spi_flash_trans_t *trans); + +/** + * Erase whole flash chip by using the erase chip (C7h) command. + * + * @param driver The driver context. + */ +void spi_flash_hal_erase_chip(spi_flash_host_driver_t *driver); + +/** + * Erase a specific sector by its start address through the sector erase (20h) + * command. + * + * @param driver The driver context. + * @param start_address Start address of the sector to erase. + */ +void spi_flash_hal_erase_sector(spi_flash_host_driver_t *driver, uint32_t start_address); + +/** + * Erase a specific 64KB block by its start address through the 64KB block + * erase (D8h) command. + * + * @param driver The driver context. + * @param start_address Start address of the block to erase. + */ +void spi_flash_hal_erase_block(spi_flash_host_driver_t *driver, uint32_t start_address); + +/** + * Program a page of the flash using the page program (02h) command. + * + * @param driver The driver context. + * @param address Address of the page to program + * @param buffer Data to program + * @param length Size of the buffer in bytes, no larger than ``SPI_FLASH_HAL_MAX_WRITE_BYTES`` (64) bytes. + */ +void spi_flash_hal_program_page(spi_flash_host_driver_t *driver, const void *buffer, uint32_t address, uint32_t length); + +/** + * Read from the flash. Call ``spi_flash_hal_configure_host_read_mode`` to + * configure the read command before calling this function. + * + * @param driver The driver context. + * @param buffer Buffer to store the read data + * @param address Address to read + * @param length Length to read, no larger than ``SPI_FLASH_HAL_MAX_READ_BYTES`` (64) bytes. + * + * @return always return ESP_OK. + */ +esp_err_t spi_flash_hal_read(spi_flash_host_driver_t *driver, void *buffer, uint32_t address, uint32_t read_len); + +/** + * @brief Send the write enable (06h) or write disable (04h) command to the flash chip. + * + * @param driver The driver context. + * @param wp true to enable the write protection, otherwise false. + * + * @return always return ESP_OK. + */ +esp_err_t spi_flash_hal_set_write_protect(spi_flash_host_driver_t *chip_drv, bool wp); + +/** + * Check whether the SPI host is idle and can perform other operations. + * + * @param driver The driver context. + * + * @return ture if idle, otherwise false. + */ +bool spi_flash_hal_host_idle(spi_flash_host_driver_t *driver); + +/** + * @brief Configure the SPI host hardware registers for the specified io mode. + * + * Note that calling this configures SPI host registers, so if running any + * other commands as part of set_io_mode() then these must be run before + * calling this function. + * + * The command value, address length and dummy cycles are configured according + * to the format of read commands: + * + * - command: 8 bits, value set. + * - address: 24 bits + * - dummy: cycles to compensate the input delay + * - out & in data: 0 bits. + * + * The following commands still need to: + * + * - Read data: set address value and data (length and contents), no need + * to touch command and dummy phases. + * - Common read: set command value, address value (or length to 0 if not used) + * - Common write: set command value, address value (or length to 0 if not + * used), disable dummy phase, and set output data. + * + * @param driver The driver context + * @param io_mode The HW read mode to use + * @param addr_bitlen Length of the address phase, in bits + * @param dummy_cyclelen_base Base cycles of the dummy phase, some extra dummy cycles may be appended to compensate the timing. + * @param command Actual reading command to send to flash chip on the bus. + * + * @return always return ESP_OK. + */ +esp_err_t spi_flash_hal_configure_host_io_mode(spi_flash_host_driver_t *driver, uint32_t command, uint32_t addr_bitlen, + int dummy_cyclelen_base, esp_flash_io_mode_t io_mode); + +/** + * Poll until the last operation is done. + * + * @param driver The driver context. + */ +void spi_flash_hal_poll_cmd_done(spi_flash_host_driver_t *driver); + +/** + * Check whether the given buffer can be used as the write buffer directly. If 'chip' is connected to the main SPI bus, we can only write directly from + * regions that are accessible ith cache disabled. * + * + * @param driver The driver context + * @param p The buffer holding data to send. + * + * @return True if the buffer can be used to send data, otherwise false. + */ +bool spi_flash_hal_supports_direct_write(spi_flash_host_driver_t *driver, const void *p); + +/** + * Check whether the given buffer can be used as the read buffer directly. If 'chip' is connected to the main SPI bus, we can only read directly from + * regions that are accessible ith cache disabled. * + * + * @param driver The driver context + * @param p The buffer to hold the received data. + * + * @return True if the buffer can be used to receive data, otherwise false. + */ +bool spi_flash_hal_supports_direct_read(spi_flash_host_driver_t *driver, const void *p); diff --git a/arch/xtensa/include/esp32/soc/include/hal/spi_flash_types.h b/arch/xtensa/include/esp32/soc/include/hal/spi_flash_types.h new file mode 100644 index 0000000000000..9448efecfad51 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/spi_flash_types.h @@ -0,0 +1,153 @@ +// Copyright 2010-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 "../../../esp_common/esp_types.h" +#include "esp_flash_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** Definition of a common transaction. Also holds the return value. */ +typedef struct { + uint8_t command; ///< Command to send, always 8bits + uint8_t mosi_len; ///< Output data length, in bytes + uint8_t miso_len; ///< Input data length, in bytes + uint8_t address_bitlen; ///< Length of address in bits, set to 0 if command does not need an address + uint32_t address; ///< Address to perform operation on + const uint8_t *mosi_data; ///< Output data to salve + uint8_t *miso_data; ///< [out] Input data from slave, little endian +} spi_flash_trans_t; + +/** + * @brief SPI flash clock speed values, always refer to them by the enum rather + * than the actual value (more speed may be appended into the list). + * + * A strategy to select the maximum allowed speed is to enumerate from the + * ``ESP_FLSH_SPEED_MAX-1`` or highest frequency supported by your flash, and + * decrease the speed until the probing success. + */ +typedef enum { + ESP_FLASH_5MHZ = 0, ///< The flash runs under 5MHz + ESP_FLASH_10MHZ, ///< The flash runs under 10MHz + ESP_FLASH_20MHZ, ///< The flash runs under 20MHz + ESP_FLASH_26MHZ, ///< The flash runs under 26MHz + ESP_FLASH_40MHZ, ///< The flash runs under 40MHz + ESP_FLASH_80MHZ, ///< The flash runs under 80MHz + ESP_FLASH_SPEED_MAX, ///< The maximum frequency supported by the host is ``ESP_FLASH_SPEED_MAX-1``. +} esp_flash_speed_t; + +///Lowest speed supported by the driver, currently 5 MHz +#define ESP_FLASH_SPEED_MIN ESP_FLASH_5MHZ + +/** @brief Mode used for reading from SPI flash */ +typedef enum { + SPI_FLASH_SLOWRD = 0, ///< Data read using single I/O, some limits on speed + SPI_FLASH_FASTRD, ///< Data read using single I/O, no limit on speed + SPI_FLASH_DOUT, ///< Data read using dual I/O + SPI_FLASH_DIO, ///< Both address & data transferred using dual I/O + SPI_FLASH_QOUT, ///< Data read using quad I/O + SPI_FLASH_QIO, ///< Both address & data transferred using quad I/O + + SPI_FLASH_READ_MODE_MAX, ///< The fastest io mode supported by the host is ``ESP_FLASH_READ_MODE_MAX-1``. +} esp_flash_io_mode_t; + +///Slowest io mode supported by ESP32, currently SlowRd +#define SPI_FLASH_READ_MODE_MIN SPI_FLASH_SLOWRD + +struct spi_flash_host_driver_t; +typedef struct spi_flash_host_driver_t spi_flash_host_driver_t; + +/** Host driver configuration and context structure. */ +struct spi_flash_host_driver_t { + /** + * Configuration and static data used by the specific host driver. The type + * is determined by the host driver. + */ + void *driver_data; + /** + * Configure the device-related register before transactions. This saves + * some time to re-configure those registers when we send continuously + */ + esp_err_t (*dev_config)(spi_flash_host_driver_t *driver); + /** + * Send an user-defined spi transaction to the device. + */ + esp_err_t (*common_command)(spi_flash_host_driver_t *driver, spi_flash_trans_t *t); + /** + * Read flash ID. + */ + esp_err_t (*read_id)(spi_flash_host_driver_t *driver, uint32_t *id); + /** + * Erase whole flash chip. + */ + void (*erase_chip)(spi_flash_host_driver_t *driver); + /** + * Erase a specific sector by its start address. + */ + void (*erase_sector)(spi_flash_host_driver_t *driver, uint32_t start_address); + /** + * Erase a specific block by its start address. + */ + void (*erase_block)(spi_flash_host_driver_t *driver, uint32_t start_address); + /** + * Read the status of the flash chip. + */ + esp_err_t (*read_status)(spi_flash_host_driver_t *driver, uint8_t *out_sr); + /** + * Disable write protection. + */ + esp_err_t (*set_write_protect)(spi_flash_host_driver_t *driver, bool wp); + /** + * Program a page of the flash. Check ``max_write_bytes`` for the maximum allowed writing length. + */ + void (*program_page)(spi_flash_host_driver_t *driver, const void *buffer, uint32_t address, uint32_t length); + /** Check whether need to allocate new buffer to write */ + bool (*supports_direct_write)(spi_flash_host_driver_t *driver, const void *p); + /** Check whether need to allocate new buffer to read */ + bool (*supports_direct_read)(spi_flash_host_driver_t *driver, const void *p); + /** maximum length of program_page */ + int max_write_bytes; + /** + * Read data from the flash. Check ``max_read_bytes`` for the maximum allowed reading length. + */ + esp_err_t (*read)(spi_flash_host_driver_t *driver, void *buffer, uint32_t address, uint32_t read_len); + /** maximum length of read */ + int max_read_bytes; + /** + * Check whether the host is idle to perform new operations. + */ + bool (*host_idle)(spi_flash_host_driver_t *driver); + /** + * Configure the host to work at different read mode. Responsible to compensate the timing and set IO mode. + */ + esp_err_t (*configure_host_io_mode)(spi_flash_host_driver_t *driver, uint32_t command, + uint32_t addr_bitlen, int dummy_bitlen_base, + esp_flash_io_mode_t io_mode); + /** + * Internal use, poll the HW until the last operation is done. + */ + void (*poll_cmd_done)(spi_flash_host_driver_t *driver); + /** + * For some host (SPI1), they are shared with a cache. When the data is + * modified, the cache needs to be flushed. Left NULL if not supported. + */ + esp_err_t (*flush_cache)(spi_flash_host_driver_t* driver, uint32_t addr, uint32_t size); +}; + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/include/hal/spi_hal.h b/arch/xtensa/include/esp32/soc/include/hal/spi_hal.h new file mode 100644 index 0000000000000..2012433a26e46 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/spi_hal.h @@ -0,0 +1,222 @@ +// 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. + +/******************************************************************************* + * NOTICE + * The hal is not public api, don't use in application code. + * See readme.md in soc/include/hal/readme.md + ******************************************************************************/ + +// The HAL layer for SPI master (common part) + +// SPI HAL usages: +// 1. initialize the bus +// 2. initialize the DMA descriptors if DMA used +// 3. setup the clock speed (since this takes long time) +// 4. call setup_device to update parameters for the specific device +// 5. call setup_trans to update parameters for the specific transaction +// 6. prepare data to send, and prepare the receiving buffer +// 7. trigger user defined SPI transaction to start +// 8. wait until the user transaction is done +// 9. fetch the received data +// Parameter to be updated only during ``setup_device`` will be highlighted in the +// field comments. + +#pragma once +#include "hal/spi_ll.h" +#include +#include "soc/lldesc.h" + +/** + * Timing configuration structure that should be calculated by + * ``spi_hal_setup_clock`` at initialization and hold. Filled into the + * ``timing_conf`` member of the context of HAL before setup a device. + */ +typedef struct { + spi_ll_clock_val_t clock_reg; ///< Register value used by the LL layer + int timing_dummy; ///< Extra dummy needed to compensate the timing + int timing_miso_delay; ///< Extra miso delay clocks to compensate the timing +} spi_hal_timing_conf_t; + +/** + * Context that should be maintained by both the driver and the HAL. + */ +typedef struct { + /* configured by driver at initialization, don't touch */ + spi_dev_t *hw; ///< Beginning address of the peripheral registers. + /* should be configured by driver at initialization */ + lldesc_t *dmadesc_tx; /**< Array of DMA descriptor used by the TX DMA. + * The amount should be larger than dmadesc_n. The driver should ensure that + * the data to be sent is shorter than the descriptors can hold. + */ + lldesc_t *dmadesc_rx; /**< Array of DMA descriptor used by the RX DMA. + * The amount should be larger than dmadesc_n. The driver should ensure that + * the data to be sent is shorter than the descriptors can hold. + */ + int dmadesc_n; ///< The amount of descriptors of both ``dmadesc_tx`` and ``dmadesc_rx`` that the HAL can use. + /* + * Device specific, all these parameters will be updated to the peripheral + * only when ``spi_hal_setup_device``. They may not get updated when + * ``spi_hal_setup_trans``. + */ + int mode; ///< SPI mode, device specific + int cs_setup; ///< Setup time of CS active edge before the first SPI clock, device specific + int cs_hold; ///< Hold time of CS inactive edge after the last SPI clock, device specific + int cs_pin_id; ///< CS pin to use, 0-2, otherwise all the CS pins are not used. Device specific + spi_hal_timing_conf_t *timing_conf; /**< Pointer to an structure holding + * the pre-calculated timing configuration for the device at initialization, + * device specific + */ + struct { + uint32_t sio : 1; ///< Whether to use SIO mode, device specific + uint32_t half_duplex : 1; ///< Whether half duplex mode is used, device specific + uint32_t tx_lsbfirst : 1; ///< Whether LSB is sent first for TX data, device specific + uint32_t rx_lsbfirst : 1; ///< Whether LSB is received first for RX data, device specific + uint32_t dma_enabled : 1; ///< Whether the DMA is enabled, do not update after initialization + uint32_t no_compensate : 1; ///< No need to add dummy to compensate the timing, device specific +#ifdef SOC_SPI_SUPPORT_AS_CS + uint32_t as_cs : 1; ///< Whether to toggle the CS while the clock toggles, device specific +#endif + uint32_t positive_cs : 1; ///< Whether the postive CS feature is abled, device specific + };//boolean configurations + + /* + * Transaction specific (data), all these parameters will be updated to the + * peripheral every transaction. + */ + uint16_t cmd; ///< Command value to be sent + int cmd_bits; ///< Length (in bits) of the command phase + int addr_bits; ///< Length (in bits) of the address phase + int dummy_bits; ///< Base length (in bits) of the dummy phase. Note when the compensation is enabled, some extra dummy bits may be appended. + int tx_bitlen; ///< TX length, in bits + int rx_bitlen; ///< RX length, in bits + 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_hal_context_t; + +/** + * Init the peripheral and the context. + * + * @param hal Context of the HAL layer. + * @param host_id Index of the SPI peripheral. 0 for SPI1, 1 for HSPI (SPI2) and 2 for VSPI (SPI3). + */ +void spi_hal_init(spi_hal_context_t *hal, int host_id); + +/** + * Deinit the peripheral (and the context if needed). + * + * @param hal Context of the HAL layer. + */ +void spi_hal_deinit(spi_hal_context_t *hal); + +/** + * Setup device-related configurations according to the settings in the context. + * + * @param hal Context of the HAL layer. + */ +void spi_hal_setup_device(const spi_hal_context_t *hal); + +/** + * Setup transaction related configurations according to the settings in the context. + * + * @param hal Context of the HAL layer. + */ +void spi_hal_setup_trans(const spi_hal_context_t *hal); + +/** + * Prepare the data for the current transaction. + * + * @param hal Context of the HAL layer. + */ +void spi_hal_prepare_data(const spi_hal_context_t *hal); + +/** + * Trigger start a user-defined transaction. + * + * @param hal Context of the HAL layer. + */ +void spi_hal_user_start(const spi_hal_context_t *hal); + +/** + * Check whether the transaction is done (trans_done is set). + * + * @param hal Context of the HAL layer. + */ +bool spi_hal_usr_is_done(const spi_hal_context_t *hal); + +/** + * Post transaction operations, mainly fetch data from the buffer. + * + * @param hal Context of the HAL layer. + */ +void spi_hal_fetch_result(const spi_hal_context_t *hal); + +/*---------------------------------------------------------- + * Utils + * ---------------------------------------------------------*/ +/** + * Get the configuration of clock and timing. The configuration will be used when ``spi_hal_setup_device``. + * + * It is highly suggested to do this at initialization, since it takes long time. + * + * @param hal Context of the HAL layer. + * @param speed_hz Desired frequency. + * @param duty_cycle Desired duty cycle of SPI clock + * @param use_gpio true if the GPIO matrix is used, otherwise false + * @param input_delay_ns Maximum delay between SPI launch clock and the data to + * be valid. This is used to compensate/calculate the maximum frequency + * allowed. Left 0 if not known. + * @param out_freq Output of the actual frequency, left NULL if not required. + * @param timing_conf Output of the timing configuration. + * + * @return ESP_OK if desired is available, otherwise fail. + */ +esp_err_t spi_hal_get_clock_conf(const spi_hal_context_t *hal, int speed_hz, int duty_cycle, bool use_gpio, int input_delay_ns, int *out_freq, spi_hal_timing_conf_t *timing_conf); + +/** + * Get the frequency actual used. + * + * @param hal Context of the HAL layer. + * @param fapb APB clock frequency. + * @param hz Desired frequencyc. + * @param duty_cycle Desired duty cycle. + */ +int spi_hal_master_cal_clock(int fapb, int hz, int duty_cycle); + +/** + * Get the timing configuration for given parameters. + * + * @param eff_clk Actual SPI clock frequency + * @param gpio_is_used true if the GPIO matrix is used, otherwise false. + * @param input_delay_ns Maximum delay between SPI launch clock and the data to + * be valid. This is used to compensate/calculate the maximum frequency + * allowed. Left 0 if not known. + * @param dummy_n Dummy cycles required to correctly read the data. + * @param miso_delay_n suggested delay on the MISO line, in APB clocks. + */ +void spi_hal_cal_timing(int eff_clk, bool gpio_is_used, int input_delay_ns, int *dummy_n, int *miso_delay_n); + +/** + * Get the maximum frequency allowed to read if no compensation is used. + * + * @param gpio_is_used true if the GPIO matrix is used, otherwise false. + * @param input_delay_ns Maximum delay between SPI launch clock and the data to + * be valid. This is used to compensate/calculate the maximum frequency + * allowed. Left 0 if not known. + */ +int spi_hal_get_freq_limit(bool gpio_is_used, int input_delay_ns); + diff --git a/arch/xtensa/include/esp32/soc/include/hal/spi_slave_hal.h b/arch/xtensa/include/esp32/soc/include/hal/spi_slave_hal.h new file mode 100644 index 0000000000000..80e1113716f12 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/spi_slave_hal.h @@ -0,0 +1,152 @@ +// 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. + +/******************************************************************************* + * NOTICE + * The hal is not public api, don't use in application code. + * See readme.md in soc/include/hal/readme.md + ******************************************************************************/ + +// The HAL layer for SPI slave (common part) + +// SPI slave HAL usages: +// 1. initialize the bus +// 2. initialize the DMA descriptors if DMA used +// 3. call setup_device to update parameters for the device +// 4. prepare data to send, and prepare the receiving buffer +// 5. trigger user defined SPI transaction to start +// 6. wait until the user transaction is done +// 7. store the received data and get the length +// 8. check and reset the DMA (if needed) before the next transaction + +#pragma once + +#include "soc/lldesc.h" +#include "soc/spi_struct.h" +#include +#include "soc/spi_caps.h" + +/** + * Context that should be maintained by both the driver and the HAL. + */ +typedef struct { + /* configured by driver at initialization, don't touch */ + spi_dev_t *hw; ///< Beginning address of the peripheral registers. + /* should be configured by driver at initialization */ + lldesc_t *dmadesc_rx; /**< Array of DMA descriptor used by the TX DMA. + * The amount should be larger than dmadesc_n. The driver should ensure that + * the data to be sent is shorter than the descriptors can hold. + */ + lldesc_t *dmadesc_tx; /**< Array of DMA descriptor used by the RX DMA. + * The amount should be larger than dmadesc_n. The driver should ensure that + * the data to be sent is shorter than the descriptors can hold. + */ + int dmadesc_n; ///< The amount of descriptors of both ``dmadesc_tx`` and ``dmadesc_rx`` that the HAL can use. + + /* + * configurations to be filled after ``spi_slave_hal_init``. Updated to + * peripheral registers when ``spi_slave_hal_setup_device`` is called. + */ + struct { + uint32_t rx_lsbfirst : 1; + uint32_t tx_lsbfirst : 1; + uint32_t use_dma : 1; + }; + int mode; + + /* + * Transaction specific (data), all these parameters will be updated to the + * peripheral every transaction. + */ + uint32_t bitlen; ///< Expected maximum length of the transaction, in bits. + const void *tx_buffer; ///< Data to be sent + void *rx_buffer; ///< Buffer to hold the received data. + + /* Other transaction result after one transaction */ + uint32_t rcv_bitlen; ///< Length of the last transaction, in bits. +} spi_slave_hal_context_t; + +/** + * Init the peripheral and the context. + * + * @param hal Context of the HAL layer. + * @param host_id Index of the SPI peripheral. 0 for SPI1, 1 for HSPI (SPI2) and 2 for VSPI (SPI3). + */ +void spi_slave_hal_init(spi_slave_hal_context_t *hal, int host_id); + +/** + * Deinit the peripheral (and the context if needed). + * + * @param hal Context of the HAL layer. + */ +void spi_slave_hal_deinit(spi_slave_hal_context_t *hal); + +/** + * Setup device-related configurations according to the settings in the context. + * + * @param hal Context of the HAL layer. + */ +void spi_slave_hal_setup_device(const spi_slave_hal_context_t *hal); + +/** + * Prepare the data for the current transaction. + * + * @param hal Context of the HAL layer. + */ +void spi_slave_hal_prepare_data(const spi_slave_hal_context_t *hal); + +/** + * Trigger start a user-defined transaction. + * + * @param hal Context of the HAL layer. + */ +void spi_slave_hal_user_start(const spi_slave_hal_context_t *hal); + +/** + * Check whether the transaction is done (trans_done is set). + * + * @param hal Context of the HAL layer. + */ +bool spi_slave_hal_usr_is_done(spi_slave_hal_context_t* hal); + +/** + * Post transaction operations, fetch data from the buffer and recored the length. + * + * @param hal Context of the HAL layer. + */ +void spi_slave_hal_store_result(spi_slave_hal_context_t *hal); + +/** + * Get the length of last transaction, in bits. Should be called after ``spi_slave_hal_store_result``. + * + * Note that if last transaction is longer than configured before, the return + * value will be truncated to the configured length. + * + * @param hal Context of the HAL layer. + * + * @return Length of the last transaction, in bits. + */ +uint32_t spi_slave_hal_get_rcv_bitlen(spi_slave_hal_context_t *hal); + +/** + * Check whether we need to reset the DMA according to the status of last transactions. + * + * In ESP32, sometimes we may need to reset the DMA for the slave before the + * next transaction. Call this to check it. + * + * @param hal Context of the HAL layer. + * + * @return true if reset is needed, else false. + */ +bool spi_slave_hal_dma_need_reset(const spi_slave_hal_context_t *hal); diff --git a/arch/xtensa/include/esp32/soc/include/hal/spi_types.h b/arch/xtensa/include/esp32/soc/include/hal/spi_types.h new file mode 100644 index 0000000000000..9a2afcd523a17 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/spi_types.h @@ -0,0 +1,42 @@ +// 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. + +#pragma once + +#include "soc/spi_caps.h" +#include + +/** + * @brief Enum with the three SPI peripherals that are software-accessible in it + */ +typedef enum { + SPI1_HOST=0, ///< SPI1 + SPI2_HOST=1, ///< SPI2 + SPI3_HOST=2, ///< SPI3 +#if SOC_SPI_PERIPH_NUM > 3 + SPI4_HOST=3, ///< SPI4 +#endif +} spi_host_device_t; + +//alias for different chips +#ifdef CONFIG_IDF_TARGET_ESP32 +#define SPI_HOST SPI1_HOST +#define HSPI_HOST SPI2_HOST +#define VSPI_HOST SPI3_HOST +#elif CONFIG_IDF_TARGET_ESP32S2BETA +#define SPI_HOST SPI1_HOST +#define FSPI_HOST SPI2_HOST +#define HSPI_HOST SPI3_HOST +#define VSPI_HOST SPI4_HOST +#endif diff --git a/arch/xtensa/include/esp32/soc/include/hal/timer_hal.h b/arch/xtensa/include/esp32/soc/include/hal/timer_hal.h new file mode 100644 index 0000000000000..bc4dcc2516834 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/timer_hal.h @@ -0,0 +1,322 @@ +// 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. + +/******************************************************************************* + * NOTICE + * The hal is not public api, don't use in application code. + * See readme.md in soc/include/hal/readme.md + ******************************************************************************/ + +// The HAL layer for Timer Group. +// There is no parameter check in the hal layer, so the caller must ensure the correctness of the parameters. + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "hal/timer_ll.h" +#include "hal/timer_types.h" +#include "soc/timer_group_caps.h" + +/** + * Context that should be maintained by both the driver and the HAL + */ +typedef struct { + timg_dev_t *dev; + timer_idx_t idx; +} timer_hal_context_t; + +/** + * @brief Init the timer hal. This function should be called first before other hal layer function is called + * + * @param hal Context of the HAL layer + * @param group_num The timer group number + * @param timer_num The timer number + * + * @return None + */ +void timer_hal_init(timer_hal_context_t *hal, timer_group_t group_num, timer_idx_t timer_num); + +/** + * @brief Set timer clock prescale value + * + * @param hal Context of the HAL layer + * @param divider Prescale value + * + * @return None + */ +#define timer_hal_set_divider(hal, divider) timer_ll_set_divider((hal)->dev, (hal)->idx, divider) + +/** + * @brief Get timer clock prescale value + * + * @param hal Context of the HAL layer + * @param divider Pointer to accept the prescale value + * + * @return None + */ +#define timer_hal_get_divider(hal, divider) timer_ll_get_divider((hal)->dev, (hal)->idx, divider) + +/** + * @brief Load counter value into time-base counter + * + * @param hal Context of the HAL layer + * @param load_val Counter value + * + * @return None + */ +#define timer_hal_set_counter_value(hal, load_val) timer_ll_set_counter_value((hal)->dev, (hal)->idx, load_val) + +/** + * @brief Get counter value from time-base counter + * + * @param hal Context of the HAL layer + * @param timer_val Pointer to accept the counter value + * + * @return None + */ +#define timer_hal_get_counter_value(hal, timer_val) timer_ll_get_counter_value((hal)->dev, (hal)->idx, timer_val) + +/** + * @brief Set counter mode, include increment mode and decrement mode. + * + * @param hal Context of the HAL layer + * @param increase_en True to increment mode, fasle to decrement mode + * + * @return None + */ +#define timer_hal_set_counter_increase(hal, increase_en) timer_ll_set_counter_increase((hal)->dev, (hal)->idx, increase_en) + +/** + * @brief Get counter mode, include increment mode and decrement mode. + * + * @param hal Context of the HAL layer + * @param counter_dir Pointer to accept the counter mode + * + * @return + * - true Increment mode + * - false Decrement mode + */ +#define timer_hal_get_counter_increase(hal) timer_ll_get_counter_increase((hal)->dev, (hal)->idx) + +/** + * @brief Set counter status, enable or disable counter. + * + * @param hal Context of the HAL layer + * @param counter_en True to enable counter, false to disable counter + * + * @return None + */ +#define timer_hal_set_counter_enable(hal, counter_en) timer_ll_set_counter_enable((hal)->dev, (hal)->idx, counter_en) + +/** + * @brief Get counter status. + * + * @param hal Context of the HAL layer + * + * @return + * - true Enable counter + * - false Disable conuter + */ +#define timer_hal_get_counter_enable(hal) timer_ll_get_counter_enable((hal)->dev, (hal)->idx) + +/** + * @brief Set auto reload mode. + * + * @param hal Context of the HAL layer + * @param auto_reload_en True to enable auto reload mode, flase to disable auto reload mode + * + * @return None + */ +#define timer_hal_set_auto_reload(hal, auto_reload_en) timer_ll_set_auto_reload((hal)->dev, (hal)->idx, auto_reload_en) + +/** + * @brief Get auto reload mode. + * + * @param hal Context of the HAL layer + * + * @return + * - true Enable auto reload mode + * - false Disable auto reload mode + */ +#define timer_hal_get_auto_reload(hal) timer_ll_get_auto_reload((hal)->dev, (hal)->idx) + +/** + * @brief Set the counter value to trigger the alarm. + * + * @param hal Context of the HAL layer + * @param alarm_value Counter value to trigger the alarm + * + * @return None + */ +#define timer_hal_set_alarm_value(hal, alarm_value) timer_ll_set_alarm_value((hal)->dev, (hal)->idx, alarm_value) + +/** + * @brief Get the counter value to trigger the alarm. + * + * @param hal Context of the HAL layer + * @param alarm_value Pointer to accept the counter value to trigger the alarm + * + * @return None + */ +#define timer_hal_get_alarm_value(hal, alarm_value) timer_ll_get_alarm_value((hal)->dev, (hal)->idx, alarm_value) + +/** + * @brief Set the alarm status, enable or disable the alarm. + * + * @param hal Context of the HAL layer + * @param alarm_en True to enable alarm, false to disable alarm + * + * @return None + */ +#define timer_hal_set_alarm_enable(hal, alarm_en) timer_ll_set_alarm_enable((hal)->dev, (hal)->idx, alarm_en) + +/** + * @brief Get the alarm status. + * + * @param hal Context of the HAL layer + * + * @return + * - true Enable alarm + * - false Disable alarm + */ +#define timer_hal_get_alarm_enable(hal) timer_ll_get_alarm_enable((hal)->dev, (hal)->idx) + +/** + * @brief Set the level interrupt status, enable or disable the level interrupt. + * + * @param hal Context of the HAL layer + * @param level_int_en True to enable level interrupt, false to disable level interrupt + * + * @return None + */ +#define timer_hal_set_level_int_enable(hal, level_int_en) timer_ll_set_level_int_enable((hal)->dev, (hal)->idx, level_int_en) + +/** + * @brief Get the level interrupt status. + * + * @param hal Context of the HAL layer + * + * @return + * - true Enable level interrupt + * - false Disable level interrupt + */ +#define timer_hal_get_level_int_enable(hal) timer_ll_get_level_int_enable((hal)->dev, (hal)->idx) + +/** + * @brief Set the edge interrupt status, enable or disable the edge interrupt. + * + * @param hal Context of the HAL layer + * @param edge_int_en True to enable edge interrupt, false to disable edge interrupt + * + * @return None + */ +#define timer_hal_set_edge_int_enable(hal, edge_int_en) timer_ll_set_edge_int_enable((hal)->dev, (hal)->idx, edge_int_en) + +/** + * @brief Get the edge interrupt status. + * + * @param hal Context of the HAL layer + * + * @return + * - true Enable edge interrupt + * - false Disable edge interrupt + */ +#define timer_hal_get_edge_int_enable(hal) timer_ll_get_edge_int_enable((hal)->dev, (hal)->idx) + +/** + * @brief Enable timer interrupt. + * + * @param hal Context of the HAL layer + * + * @return None + */ +#define timer_hal_intr_enable(hal) timer_ll_intr_enable((hal)->dev, (hal)->idx) + +/** + * @brief Disable timer interrupt. + * + * @param hal Context of the HAL layer + * + * @return None + */ +#define timer_hal_intr_disable(hal) timer_ll_intr_disable((hal)->dev, (hal)->idx) + +/** + * @brief Clear interrupt status. + * + * @param hal Context of the HAL layer + * + * @return None + */ +#define timer_hal_clear_intr_status(hal) timer_ll_clear_intr_status((hal)->dev, (hal)->idx) + +/** + * @brief Get interrupt status. + * + * @param hal Context of the HAL layer + * @param intr_status Interrupt status + * + * @return None + */ +#define timer_hal_get_intr_status(hal, intr_status) timer_ll_get_intr_status((hal)->dev, intr_status) + +/** + * @brief Get interrupt raw status. + * + * @param group_num Timer group number, 0 for TIMERG0 or 1 for TIMERG1 + * @param intr_raw_status Interrupt raw status + * + * @return None + */ +#define timer_hal_get_intr_raw_status(group_num, intr_raw_status) timer_ll_get_intr_raw_status(group_num, intr_raw_status) + +/** + * @brief Get interrupt status register address. + * + * @param hal Context of the HAL layer + * @param intr_status_reg Interrupt status register address + * + * @return None + */ +#define timer_hal_get_intr_status_reg(hal, intr_status_reg) timer_ll_get_intr_status_reg((hal)->dev, intr_status_reg) + +#ifdef TIMER_GROUP_SUPPORTS_XTAL_CLOCK +/** + * @brief Set clock source. + * + * @param hal Context of the HAL layer + * @param use_xtal_en True to use XTAL clock, flase to use APB clock + * + * @return None + */ +#define timer_hal_set_use_xtal(hal, use_xtal_en) timer_ll_set_use_xtal((hal)->dev, (hal)->idx, use_xtal_en) + +/** + * @brief Get clock source. + * + * @param hal Context of the HAL layer + * + * @return + * - true Use XTAL clock + * - false Use APB clock + */ +#define timer_hal_get_use_xtal(hal) timer_ll_get_use_xtal((hal)->dev, (hal)->idx) +#endif + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/include/hal/timer_types.h b/arch/xtensa/include/esp32/soc/include/hal/timer_types.h new file mode 100644 index 0000000000000..09e0fcc249776 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/timer_types.h @@ -0,0 +1,138 @@ +// 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. + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include "soc/timer_group_caps.h" + +/** + * @brief Selects a Timer-Group out of 2 available groups + */ +typedef enum { + TIMER_GROUP_0 = 0, /*! BIT(1) + * @return + * - ESP_OK on success + */ +#define touch_hal_set_channel_mask(enable_mask) touch_ll_set_channel_mask(enable_mask) + +/** + * Get touch sensor channel mask. + * + * @param enable_mask bitmask of touch sensor scan group. + * e.g. TOUCH_PAD_NUM1 -> BIT(1) + */ +#define touch_hal_get_channel_mask(enable_mask) touch_ll_get_channel_mask(enable_mask) + +/** + * Disable touch sensor channel by bitmask. + * + * @param enable_mask bitmask of touch sensor scan group. + * e.g. TOUCH_PAD_NUM1 -> BIT(1) + */ +#define touch_hal_clear_channel_mask(disable_mask) touch_ll_clear_channel_mask(disable_mask) + +/** + * Get the touch sensor status, usually used in ISR to decide which pads are 'touched'. + * + * @param status_mask The touch sensor status. e.g. Touch1 trigger status is `status_mask & (BIT1)`. + */ +#define touch_hal_read_trigger_status_mask(status_mask) touch_ll_read_trigger_status_mask(status_mask) + +/** + * Clear all touch sensor status. + */ +#define touch_hal_clear_trigger_status_mask() touch_ll_clear_trigger_status_mask() + +/** + * Get touch sensor raw data (touch sensor counter value) from register. No block. + * + * @param touch_num touch pad index. + * @return touch_value pointer to accept touch sensor value. + */ +#define touch_hal_read_raw_data(touch_num) touch_ll_read_raw_data(touch_num) + +/** + * Get touch sensor measure status. No block. + * + * @return + * - If touch sensors measure done. + */ +#define touch_hal_meas_is_done() touch_ll_meas_is_done() + +/** + * Initialize touch module. + * + * @note If default parameter don't match the usage scenario, it can be changed after this function. + */ +void touch_hal_init(void); + +/** + * Un-install touch pad driver. + * + * @note After this function is called, other touch functions are prohibited from being called. + */ +void touch_hal_deinit(void); + +/** + * Configure touch sensor for each channel. + */ +void touch_hal_config(touch_pad_t touch_num); \ No newline at end of file diff --git a/arch/xtensa/include/esp32/soc/include/hal/touch_sensor_types.h b/arch/xtensa/include/esp32/soc/include/hal/touch_sensor_types.h new file mode 100644 index 0000000000000..ab0f703ee2fd7 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/touch_sensor_types.h @@ -0,0 +1,264 @@ +// 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. + +#pragma once + +#include "soc/touch_sensor_caps.h" +#include + +typedef enum { + TOUCH_PAD_NUM0 = 0, /*!< Touch pad channel 0 is GPIO4(ESP32) */ + TOUCH_PAD_NUM1, /*!< Touch pad channel 1 is GPIO0(ESP32) / GPIO1(ESP32-S2) */ + TOUCH_PAD_NUM2, /*!< Touch pad channel 2 is GPIO2(ESP32) / GPIO2(ESP32-S2) */ + TOUCH_PAD_NUM3, /*!< Touch pad channel 3 is GPIO15(ESP32) / GPIO3(ESP32-S2) */ + TOUCH_PAD_NUM4, /*!< Touch pad channel 4 is GPIO13(ESP32) / GPIO4(ESP32-S2) */ + TOUCH_PAD_NUM5, /*!< Touch pad channel 5 is GPIO12(ESP32) / GPIO5(ESP32-S2) */ + TOUCH_PAD_NUM6, /*!< Touch pad channel 6 is GPIO14(ESP32) / GPIO6(ESP32-S2) */ + TOUCH_PAD_NUM7, /*!< Touch pad channel 7 is GPIO27(ESP32) / GPIO7(ESP32-S2) */ + TOUCH_PAD_NUM8, /*!< Touch pad channel 8 is GPIO33(ESP32) / GPIO8(ESP32-S2) */ + TOUCH_PAD_NUM9, /*!< Touch pad channel 9 is GPIO32(ESP32) / GPIO9(ESP32-S2) */ +#if SOC_TOUCH_SENSOR_NUM > 10 + TOUCH_PAD_NUM10, /*!< Touch channel 10 is GPIO10(ESP32-S2) */ + TOUCH_PAD_NUM11, /*!< Touch channel 11 is GPIO11(ESP32-S2) */ + TOUCH_PAD_NUM12, /*!< Touch channel 12 is GPIO12(ESP32-S2) */ + TOUCH_PAD_NUM13, /*!< Touch channel 13 is GPIO13(ESP32-S2) */ + TOUCH_PAD_NUM14, /*!< Touch channel 14 is GPIO14(ESP32-S2) */ +#endif + TOUCH_PAD_MAX, +} touch_pad_t; + +typedef enum { + TOUCH_HVOLT_KEEP = -1, /*! (touch threshold + hysteresis), the touch channel be touched. + If (raw data - baseline) < (touch threshold - hysteresis), the touch channel be released. + Range: 0 ~ 3. The coefficient is 0: 1/8; 1: 3/32; 2: 1/16; 3: 1/32 */ + uint32_t noise_thr; /*! (noise), the baseline stop updating. + If (raw data - baseline) < (noise), the baseline start updating. + Range: 0 ~ 3. The coefficient is 0: 1/2; 1: 3/8; 2: 1/4; 3: 1/8; */ + uint32_t noise_neg_thr; /*! (negative noise), the baseline restart reset process(refer to `baseline_reset`). + If (baseline - raw data) < (negative noise), the baseline stop reset process(refer to `baseline_reset`). + Range: 0 ~ 3. The coefficient is 0: 1/2; 1: 3/8; 2: 1/4; 3: 1/8; */ + uint32_t neg_noise_limit; /*!dev, mask) + +/** + * @brief Disable the UART interrupt + * + * @param hal Context of the HAL layer + * @param mask The interrupt mask to be disabled. Using the ORred mask of `UART_INTR_RXFIFO_FULL ... UART_INTR_CMD_CHAR_DET` + * + * @return None + */ +#define uart_hal_disable_intr_mask(hal, mask) uart_ll_disable_intr_mask((hal)->dev, mask) + +/** + * @brief Enable the UART interrupt + * + * @param hal Context of the HAL layer + * @param mask The UART interrupt mask to be enabled. Using the ORred mask of `UART_INTR_RXFIFO_FULL ... UART_INTR_CMD_CHAR_DET` + * + * @return None + */ +#define uart_hal_ena_intr_mask(hal, mask) uart_ll_ena_intr_mask((hal)->dev, mask) + +/** + * @brief Get the UART interrupt status + * + * @param hal Context of the HAL layer + * + * @return UART interrupt status + */ +#define uart_hal_get_intsts_mask(hal) uart_ll_get_intsts_mask((hal)->dev) + +/** + * @brief Get status of enabled interrupt + * + * @param hal Context of the HAL layer + * + * @return UART Interrupt enabled value + */ +#define uart_hal_get_intr_ena_status(hal) uart_ll_get_intr_ena_status((hal)->dev) + +/** + * @brief Get the UART pattern char configuration + * + * @param hal Context of the HAL layer + * @param cmd_char Pointer to accept UART AT cmd char + * @param char_num Pointer to accept the `UART_CHAR_NUM` configuration + * + * @return None + */ +#define uart_hal_get_at_cmd_char(hal, cmd_char, char_num) uart_ll_get_at_cmd_char((hal)->dev, cmd_char, char_num) + +/** + * @brief Set the UART rst signal active level + * + * @param hal Context of the HAL layer + * @param active_level The rts active level. The active level is low if set to 0. The active level is high if set to 1 + * + * @return None + */ +#define uart_hal_set_rts(hal, active_level) uart_ll_set_rts_active_level((hal)->dev, active_level) + +/** + * @brief Get the txfifo writeable length(in byte) + * + * @param hal Context of the HAL layer + * + * @return UART txfifo writeable length + */ +#define uart_hal_get_txfifo_len(hal) uart_ll_get_txfifo_len((hal)->dev) + +/** + * @brief Check if the UART sending state machine is in the IDLE state. + * + * @param hal Context of the HAL layer + * + * @return True if the state machine is in the IDLE state, otherwise false will be returned. + */ +#define uart_hal_is_tx_idle(hal) uart_ll_is_tx_idle((hal)->dev) + +/** + * @brief Read data from the UART rxfifo + * + * @param hal Context of the HAL layer + * @param buf Pointer to the buffer used to store the read data. The buffer size should be large than 128 byts + * @param rd_len The length has been read out from the rxfifo + * + * @return None + */ +void uart_hal_read_rxfifo(uart_hal_context_t *hal, uint8_t *buf, int *rd_len); + +/** + * @brief Write data into the UART txfifo + * + * @param hal Context of the HAL layer + * @param buf Pointer of the data buffer need to be written to txfifo + * @param data_size The data size(in byte) need to be written + * @param write_size The size has been written + * + * @return None + */ +void uart_hal_write_txfifo(uart_hal_context_t *hal, const uint8_t *buf, uint32_t data_size, uint32_t *write_size); + +/** + * @brief Reset the UART txfifo + * + * @param hal Context of the HAL layer + * + * @return None + */ +void uart_hal_txfifo_rst(uart_hal_context_t *hal); + +/** + * @brief Reset the UART rxfifo + * + * @param hal Context of the HAL layer + * + * @return None + */ +void uart_hal_rxfifo_rst(uart_hal_context_t *hal); + +/** + * @brief Init the UART hal and set the UART to the default configuration. + * + * @param hal Context of the HAL layer + * @param uart_num The uart port number, the max port number is (UART_NUM_MAX -1) + * + * @return None + */ +void uart_hal_init(uart_hal_context_t *hal, uart_port_t uart_num); + +/** + * @brief Configure the UART baud-rate and select the source clock + * + * @param hal Context of the HAL layer + * @param source_clk The UART source clock. Support `UART_SCLK_REF_TICK` and `UART_SCLK_APB` + * @param baud_rate The baud-rate to be set + * + * @return None + */ +void uart_hal_set_baudrate(uart_hal_context_t *hal, uart_sclk_t source_clk, uint32_t baud_rate); + +/** + * @brief Configure the UART stop bit + * + * @param hal Context of the HAL layer + * @param stop_bit The stop bit to be set + * + * @return None + */ +void uart_hal_set_stop_bits(uart_hal_context_t *hal, uart_stop_bits_t stop_bit); + +/** + * @brief Configure the UART data bit + * + * @param hal Context of the HAL layer + * @param data_bit The data bit to be set + * + * @return None + */ +void uart_hal_set_data_bit_num(uart_hal_context_t *hal, uart_word_length_t data_bit); + +/** + * @brief Configure the UART parity mode + * + * @param hal Context of the HAL layer + * @param parity_mode The UART parity mode to be set + * + * @return None + */ +void uart_hal_set_parity(uart_hal_context_t *hal, uart_parity_t parity_mode); + +/** + * @brief Configure the UART hardware flow control + * + * @param hal Context of the HAL layer + * @param flow_ctrl The flow control mode to be set + * @param rx_thresh The rts flow control signal will be active if the data length in rxfifo is large than this value + * + * @return None + */ +void uart_hal_set_hw_flow_ctrl(uart_hal_context_t *hal, uart_hw_flowcontrol_t flow_ctrl, uint8_t rx_thresh); + +/** + * @brief Configure the UART AT cmd char detect function. When the receiver receives a continuous AT cmd char, it will produce a interrupt + * + * @param hal Context of the HAL layer + * @param at_cmd The AT cmd char detect configuration + * + * @return None. + */ +void uart_hal_set_at_cmd_char(uart_hal_context_t *hal, uart_at_cmd_t *at_cmd); + +/** + * @brief Set the timeout value of the UART receiver + * + * @param hal Context of the HAL layer + * @param tout The timeout value for receiver to receive a data + * + * @return None + */ +void uart_hal_set_rx_timeout(uart_hal_context_t *hal, const uint8_t tout); + +/** + * @brief Set the UART dtr signal active level + * + * @param hal Context of the HAL layer + * @param active_level The dtr active level. The active level is low if set to 0. The active level is high if set to 1 + * + * @return None + */ +void uart_hal_set_dtr(uart_hal_context_t *hal, int active_level); + +/** + * @brief Set the UART software flow control + * + * @param hal Context of the HAL layer + * @param flow_ctrl The software flow control configuration + * @param sw_flow_ctrl_en Set true to enable the software flow control, otherwise set it false + * + * @return None + */ +void uart_hal_set_sw_flow_ctrl(uart_hal_context_t *hal, uart_sw_flowctrl_t *flow_ctrl, bool sw_flow_ctrl_en); + +/** + * @brief Set the UART tx idle number + * + * @param hal Context of the HAL layer + * @param idle_num The cycle number betwin the two transmission + * + * @return None + */ +void uart_hal_set_tx_idle_num(uart_hal_context_t *hal, uint16_t idle_num); + +/** + * @brief Set the UART rxfifo full threshold + * + * @param hal Context of the HAL layer + * @param full_thrhd The rxfifo full threshold. If the `UART_RXFIFO_FULL` interrupt is enabled and + * the data length in rxfifo is more than this value, it will generate `UART_RXFIFO_FULL` interrupt + * + * @return None + */ +void uart_hal_set_rxfifo_full_thr(uart_hal_context_t *hal, uint32_t full_thrhd); + +/** + * @brief Set the UART txfifo empty threshold + * + * @param hal Context of the HAL layer + * @param empty_thrhd The txfifo empty threshold to be set. If the `UART_TXFIFO_EMPTY` interrupt is enabled and + * the data length in txfifo is less than this value, it will generate `UART_TXFIFO_EMPTY` interrupt + * + * @return None + */ +void uart_hal_set_txfifo_empty_thr(uart_hal_context_t *hal, uint32_t empty_thrhd); + +/** + * @brief Configure the UART to send a number of break(NULL) chars + * + * @param hal Context of the HAL layer + * @param break_num The number of the break char need to be send + * + * @return None + */ +void uart_hal_tx_break(uart_hal_context_t *hal, uint32_t break_num); + +/** + * @brief Configure the UART wake up function. + * Note that RXD cannot be input through GPIO Matrix but only through IO_MUX when use this function + * + * @param hal Context of the HAL layer + * @param wakeup_thrd The wake up threshold to be set. The system will be woken up from light-sleep when the input RXD edge changes more times than `wakeup_thrd+2` + * + * @return None + */ +void uart_hal_set_wakeup_thrd(uart_hal_context_t *hal, uint32_t wakeup_thrd); + +/** + * @brief Configure the UART mode + * + * @param hal Context of the HAL layer + * @param mode The UART mode to be set + * + * @return None + */ +void uart_hal_set_mode(uart_hal_context_t *hal, uart_mode_t mode); + +/** + * @brief Configure the UART hardware to inverse the signals + * + * @param hal Context of the HAL layer + * @param inv_mask The sigal mask needs to be inversed. Use the ORred mask of type `uart_signal_inv_t` + * + * @return None + */ +void uart_hal_inverse_signal(uart_hal_context_t *hal, uint32_t inv_mask); + +/** + * @brief Get the UART wakeup threshold configuration + * + * @param hal Context of the HAL layer + * @param wakeup_thrd Pointer to accept the value of UART wakeup threshold configuration + * + * @return None + */ +void uart_hal_get_wakeup_thrd(uart_hal_context_t *hal, uint32_t *wakeup_thrd); + +/** + * @brief Get the UART data bit configuration + * + * @param hal Context of the HAL layer + * @param data_bit Pointer to accept the value of UART data bit configuration + * + * @return None + */ +void uart_hal_get_data_bit_num(uart_hal_context_t *hal, uart_word_length_t *data_bit); + +/** + * @brief Get the UART stop bit configuration + * + * @param hal Context of the HAL layer + * @param stop_bit Pointer to accept the value of UART stop bit configuration + * + * @return None + */ +void uart_hal_get_stop_bits(uart_hal_context_t *hal, uart_stop_bits_t *stop_bit); + +/** + * @brief Get the UART parity mode configuration + * + * @param hal Context of the HAL layer + * @param parity_mode Pointer to accept the UART parity mode configuration + * + * @return None + */ +void uart_hal_get_parity(uart_hal_context_t *hal, uart_parity_t *parity_mode); + +/** + * @brief Get the UART baud-rate configuration + * + * @param hal Context of the HAL layer + * @param baud_rate Pointer to accept the current baud-rate + * + * @return None + */ +void uart_hal_get_baudrate(uart_hal_context_t *hal, uint32_t *baud_rate); + +/** + * @brief Get the hw flow control configuration + * + * @param hal Context of the HAL layer + * @param flow_ctrl Pointer to accept the UART flow control configuration + * + * @return None + */ +void uart_hal_get_hw_flow_ctrl(uart_hal_context_t *hal, uart_hw_flowcontrol_t *flow_ctrl); + +/** + * @brief Check if the UART rts flow control is enabled + * + * @param hal Context of the HAL layer + * + * @return True if rts flow control is enabled, otherwise false will be returned + */ +bool uart_hal_is_hw_rts_en(uart_hal_context_t *hal); + +/** + * @brief Get the UART source clock configuration + * + * @param hal Context of the HAL layer + * @param sclk The poiter to accept the UART source clock configuration + * + * @return None + */ +void uart_hal_get_sclk(uart_hal_context_t *hal, uart_sclk_t *sclk); + +/** + * @brief Configure TX signal loop back to RX module, just for the testing purposes + * + * @param hal Context of the HAL layer + * @param loop_back_en Set ture to enable the loop back function, else set it false. + * + * @return None + */ +void uart_hal_set_loop_back(uart_hal_context_t *hal, bool loop_back_en); + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/arch/xtensa/include/esp32/soc/include/hal/uart_types.h b/arch/xtensa/include/esp32/soc/include/hal/uart_types.h new file mode 100644 index 0000000000000..852c6c62e43b3 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/hal/uart_types.h @@ -0,0 +1,145 @@ +// 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. + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include "soc/uart_caps.h" + + +/** + * @brief UART port number, can be UART_NUM_0 ~ (UART_NUM_MAX -1). + */ +typedef int uart_port_t; + +/** + * @brief UART mode selection + */ +typedef enum { + UART_MODE_UART = 0x00, /*!< mode: regular UART mode*/ + UART_MODE_RS485_HALF_DUPLEX = 0x01, /*!< mode: half duplex RS485 UART mode control by RTS pin */ + UART_MODE_IRDA = 0x02, /*!< mode: IRDA UART mode*/ + UART_MODE_RS485_COLLISION_DETECT = 0x03, /*!< mode: RS485 collision detection UART mode (used for test purposes)*/ + UART_MODE_RS485_APP_CTRL = 0x04, /*!< mode: application control RS485 UART mode (used for test purposes)*/ +} uart_mode_t; + +/** + * @brief UART word length constants + */ +typedef enum { + UART_DATA_5_BITS = 0x0, /*!< word length: 5bits*/ + UART_DATA_6_BITS = 0x1, /*!< word length: 6bits*/ + UART_DATA_7_BITS = 0x2, /*!< word length: 7bits*/ + UART_DATA_8_BITS = 0x3, /*!< word length: 8bits*/ + UART_DATA_BITS_MAX = 0x4, +} uart_word_length_t; + +/** + * @brief UART stop bits number + */ +typedef enum { + UART_STOP_BITS_1 = 0x1, /*!< stop bit: 1bit*/ + UART_STOP_BITS_1_5 = 0x2, /*!< stop bit: 1.5bits*/ + UART_STOP_BITS_2 = 0x3, /*!< stop bit: 2bits*/ + UART_STOP_BITS_MAX = 0x4, +} uart_stop_bits_t; + +/** + * @brief UART parity constants + */ +typedef enum { + UART_PARITY_DISABLE = 0x0, /*!< Disable UART parity*/ + UART_PARITY_EVEN = 0x2, /*!< Enable UART even parity*/ + UART_PARITY_ODD = 0x3 /*!< Enable UART odd parity*/ +} uart_parity_t; + +/** + * @brief UART hardware flow control modes + */ +typedef enum { + UART_HW_FLOWCTRL_DISABLE = 0x0, /*!< disable hardware flow control*/ + UART_HW_FLOWCTRL_RTS = 0x1, /*!< enable RX hardware flow control (rts)*/ + UART_HW_FLOWCTRL_CTS = 0x2, /*!< enable TX hardware flow control (cts)*/ + UART_HW_FLOWCTRL_CTS_RTS = 0x3, /*!< enable hardware flow control*/ + UART_HW_FLOWCTRL_MAX = 0x4, +} uart_hw_flowcontrol_t; + +/** + * @brief UART signal bit map + */ +typedef enum { + UART_SIGNAL_IRDA_TX_INV = (0x1 << 0), /*!< inverse the UART irda_tx signal*/ + UART_SIGNAL_IRDA_RX_INV = (0x1 << 1), /*!< inverse the UART irda_rx signal*/ + UART_SIGNAL_RXD_INV = (0x1 << 2), /*!< inverse the UART rxd signal*/ + UART_SIGNAL_CTS_INV = (0x1 << 3), /*!< inverse the UART cts signal*/ + UART_SIGNAL_DSR_INV = (0x1 << 4), /*!< inverse the UART dsr signal*/ + UART_SIGNAL_TXD_INV = (0x1 << 5), /*!< inverse the UART txd signal*/ + UART_SIGNAL_RTS_INV = (0x1 << 6), /*!< inverse the UART rts signal*/ + UART_SIGNAL_DTR_INV = (0x1 << 7), /*!< inverse the UART dtr signal*/ +} uart_signal_inv_t; + +/** + * @brief UART source clock + */ +typedef enum { + UART_SCLK_APB = 0x0, /*!< UART source clock from APB*/ + UART_SCLK_REF_TICK = 0x01, /*!< UART source clock from REF_TICK*/ +} uart_sclk_t; + +/** + * @brief UART AT cmd char configuration parameters + * Note that this function may different on different chip. Please refer to the TRM at confirguration. + */ +typedef struct { + uint8_t cmd_char; /*!< UART AT cmd char*/ + uint8_t char_num; /*!< AT cmd char repeat number*/ + uint32_t gap_tout; /*!< gap time(in baud-rate) between AT cmd char*/ + uint32_t pre_idle; /*!< the idle time(in baud-rate) between the non AT char and first AT char*/ + uint32_t post_idle; /*!< the idle time(in baud-rate) between the last AT char and the none AT char*/ +} uart_at_cmd_t; + +/** + * @brief UART software flow control configuration parameters + */ +typedef struct { + uint8_t xon_char; /*!< Xon flow control char*/ + uint8_t xoff_char; /*!< Xoff flow control char*/ + uint8_t xon_thrd; /*!< If the software flow control is enabled and the data amount in rxfifo is less than xon_thrd, an xon_char will be sent*/ + uint8_t xoff_thrd; /*!< If the software flow control is enabled and the data amount in rxfifo is more than xoff_thrd, an xoff_char will be sent*/ +} uart_sw_flowctrl_t; + +/** + * @brief UART configuration parameters for uart_param_config function + */ +typedef struct { + int baud_rate; /*!< UART baud rate*/ + uart_word_length_t data_bits; /*!< UART byte size*/ + uart_parity_t parity; /*!< UART parity mode*/ + uart_stop_bits_t stop_bits; /*!< UART stop bits*/ + uart_hw_flowcontrol_t flow_ctrl; /*!< UART HW flow control mode (cts/rts)*/ + uint8_t rx_flow_ctrl_thresh; /*!< UART HW RTS threshold*/ + union { + uart_sclk_t source_clk; /*!< UART source clock selection */ + bool use_ref_tick __attribute__((deprecated)); + }; +} uart_config_t; + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/include/soc/adc_periph.h b/arch/xtensa/include/esp32/soc/include/soc/adc_periph.h new file mode 100644 index 0000000000000..b234cf2d73e8f --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/soc/adc_periph.h @@ -0,0 +1,33 @@ +// 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 "soc/soc.h" +#include "soc/syscon_struct.h" +#include "soc/sens_reg.h" +#include "soc/sens_struct.h" +#include "soc/rtc_io_struct.h" +#include "soc/rtc_cntl_struct.h" +#include "soc/adc_channel.h" +#include "soc/adc_caps.h" + +/** + * Store IO number corresponding to the ADC channel number. + * + * @value + * - >=0 : GPIO number index. + * - -1 : Not support. + */ +extern const int adc_channel_io_map[SOC_ADC_PERIPH_NUM][SOC_ADC_MAX_CHANNEL_NUM]; \ No newline at end of file diff --git a/arch/xtensa/include/esp32/soc/include/soc/can_periph.h b/arch/xtensa/include/esp32/soc/include/soc/can_periph.h new file mode 100644 index 0000000000000..63caa9549c001 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/soc/can_periph.h @@ -0,0 +1,22 @@ +// 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 + +#if CONFIG_IDF_TARGET_ESP32 +#include "soc/can_struct.h" +#include "soc/can_caps.h" +#endif diff --git a/arch/xtensa/include/esp32/soc/include/soc/dac_periph.h b/arch/xtensa/include/esp32/soc/include/soc/dac_periph.h new file mode 100644 index 0000000000000..fe06f4704884c --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/soc/dac_periph.h @@ -0,0 +1,38 @@ +// 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 "soc/sens_reg.h" +#include "soc/sens_struct.h" +#include "soc/rtc_io_reg.h" +#include "soc/rtc_io_struct.h" +#include "soc/rtc.h" +#include "soc/dac_channel.h" +#include "soc/dac_caps.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +typedef struct { + const uint8_t dac_channel_io_num[SOC_DAC_PERIPH_NUM]; +} dac_signal_conn_t; + +extern const dac_signal_conn_t dac_periph_signal; + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/include/soc/efuse_periph.h b/arch/xtensa/include/esp32/soc/include/soc/efuse_periph.h new file mode 100644 index 0000000000000..76a118e3b68e2 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/soc/efuse_periph.h @@ -0,0 +1,16 @@ +// 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 "soc/efuse_reg.h" diff --git a/arch/xtensa/include/esp32/soc/include/soc/emac_periph.h b/arch/xtensa/include/esp32/soc/include/soc/emac_periph.h new file mode 100644 index 0000000000000..4121018b680aa --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/soc/emac_periph.h @@ -0,0 +1,17 @@ +// 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 "soc/emac_reg_v2.h" +#include "soc/emac_ex_reg.h" diff --git a/arch/xtensa/include/esp32/soc/include/soc/gpio_periph.h b/arch/xtensa/include/esp32/soc/include/soc/gpio_periph.h new file mode 100644 index 0000000000000..09c3687607683 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/soc/gpio_periph.h @@ -0,0 +1,34 @@ +// 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. + +#pragma once +#include "stdint.h" +#include "../../esp32/include/soc/io_mux_reg.h" +#include "../../esp32/include/soc/gpio_struct.h" +#include "../../esp32/include/soc/gpio_reg.h" +#include "../../esp32/include/soc/gpio_caps.h" +#include "../../esp32/include/soc/gpio_sig_map.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +extern const uint32_t GPIO_PIN_MUX_REG[GPIO_PIN_COUNT]; + +extern const uint32_t GPIO_HOLD_MASK[GPIO_PIN_COUNT]; + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/include/soc/hwcrypto_periph.h b/arch/xtensa/include/esp32/soc/include/soc/hwcrypto_periph.h new file mode 100644 index 0000000000000..6cabdd38ab25f --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/soc/hwcrypto_periph.h @@ -0,0 +1,17 @@ +// 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 "soc/dport_reg.h" +#include "soc/hwcrypto_reg.h" diff --git a/arch/xtensa/include/esp32/soc/include/soc/i2c_periph.h b/arch/xtensa/include/esp32/soc/include/soc/i2c_periph.h new file mode 100644 index 0000000000000..ea9c2eec6d022 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/soc/i2c_periph.h @@ -0,0 +1,30 @@ +// 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 "soc/i2c_reg.h" +#include "soc/i2c_struct.h" +#include "soc/i2c_caps.h" +#include "soc/periph_defs.h" + +typedef struct { + const uint8_t sda_out_sig; + const uint8_t sda_in_sig; + const uint8_t scl_out_sig; + const uint8_t scl_in_sig; + const uint8_t irq; + const periph_module_t module; +} i2c_signal_conn_t; + +extern const i2c_signal_conn_t i2c_periph_signal[SOC_I2C_NUM]; diff --git a/arch/xtensa/include/esp32/soc/include/soc/i2s_periph.h b/arch/xtensa/include/esp32/soc/include/soc/i2s_periph.h new file mode 100644 index 0000000000000..df72723a2fd62 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/soc/i2s_periph.h @@ -0,0 +1,48 @@ +// 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 "soc/soc.h" +#include "soc/periph_defs.h" +#include "soc/i2s_struct.h" +#include "soc/i2s_reg.h" +#include "soc/i2s_caps.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* + 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 irq; + const periph_module_t module; +} i2s_signal_conn_t; + +extern const i2s_signal_conn_t i2s_periph_signal[SOC_I2S_NUM]; + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/include/soc/interrupts.h b/arch/xtensa/include/esp32/soc/include/soc/interrupts.h new file mode 100644 index 0000000000000..50295d6262a99 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/soc/interrupts.h @@ -0,0 +1,28 @@ +// 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. + +#pragma once +#include "stdint.h" +#include "soc/soc.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +extern const char * const esp_isr_names[ETS_MAX_INTR_SOURCE]; + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/include/soc/ledc_periph.h b/arch/xtensa/include/esp32/soc/include/soc/ledc_periph.h new file mode 100644 index 0000000000000..e93771e1964e1 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/soc/ledc_periph.h @@ -0,0 +1,31 @@ +// 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 "soc/ledc_reg.h" +#include "soc/ledc_struct.h" +#include "soc/ledc_caps.h" + +/* + Stores a bunch of per-ledc-peripheral data. +*/ +typedef struct { + const uint8_t sig_out0_idx; +} ledc_signal_conn_t; + +#ifdef SOC_LEDC_SUPPORT_HS_MODE +extern const ledc_signal_conn_t ledc_periph_signal[2]; +#else +extern const ledc_signal_conn_t ledc_periph_signal[1]; +#endif diff --git a/arch/xtensa/include/esp32/soc/include/soc/lldesc.h b/arch/xtensa/include/esp32/soc/include/soc/lldesc.h new file mode 100644 index 0000000000000..c5f187415ab65 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/soc/lldesc.h @@ -0,0 +1,53 @@ +// Copyright 2010-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 +#include + +#if CONFIG_IDF_TARGET_ESP32 +#include "esp32/rom/lldesc.h" +#elif CONFIG_IDF_TARGET_ESP32S2BETA +#include "esp32s2beta/rom/lldesc.h" +#endif + +//the size field has 12 bits, but 0 not for 4096. +//to avoid possible problem when the size is not word-aligned, we only use 4096-4 per desc. +/** Maximum size of data in the buffer that a DMA descriptor can hold. */ +#define LLDESC_MAX_NUM_PER_DESC (4096-4) + +/** + * Generate a linked list pointing to a (huge) buffer in an descriptor array. + * + * The caller should ensure there is enough size to hold the array, by calling + * ``lldesc_get_required_num``. + * + * @param out_desc_array Output of a descriptor array, the head should be fed to the DMA. + * @param buffer Buffer for the descriptors to point to. + * @param size Size (or length for TX) of the buffer + * @param isrx The RX DMA may require the buffer to be word-aligned, set to true for a RX link, otherwise false. + */ +void lldesc_setup_link(lldesc_t *out_desc_array, const void *buffer, int size, bool isrx); + +/** + * Get the number of descriptors required for a given buffer size. + * + * @param data_size Size to check descriptor num. + * + * @return Numbers required. + */ +static inline int lldesc_get_required_num(int data_size) +{ + return (data_size + LLDESC_MAX_NUM_PER_DESC - 1) / LLDESC_MAX_NUM_PER_DESC; +} diff --git a/arch/xtensa/include/esp32/soc/include/soc/mcpwm_periph.h b/arch/xtensa/include/esp32/soc/include/soc/mcpwm_periph.h new file mode 100644 index 0000000000000..d7223da45debc --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/soc/mcpwm_periph.h @@ -0,0 +1,17 @@ +// 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 "soc/mcpwm_reg.h" +#include "soc/mcpwm_struct.h" diff --git a/arch/xtensa/include/esp32/soc/include/soc/pcnt_periph.h b/arch/xtensa/include/esp32/soc/include/soc/pcnt_periph.h new file mode 100644 index 0000000000000..1bbd94b2a932e --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/soc/pcnt_periph.h @@ -0,0 +1,18 @@ +// 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 "soc/pcnt_reg.h" +#include "soc/pcnt_struct.h" +#include "soc/pcnt_caps.h" diff --git a/arch/xtensa/include/esp32/soc/include/soc/rmt_periph.h b/arch/xtensa/include/esp32/soc/include/soc/rmt_periph.h new file mode 100644 index 0000000000000..a46a6f526b274 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/soc/rmt_periph.h @@ -0,0 +1,17 @@ +// 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 "soc/rmt_reg.h" +#include "soc/rmt_struct.h" diff --git a/arch/xtensa/include/esp32/soc/include/soc/rtc_io_periph.h b/arch/xtensa/include/esp32/soc/include/soc/rtc_io_periph.h new file mode 100644 index 0000000000000..cc8aba0131954 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/soc/rtc_io_periph.h @@ -0,0 +1,109 @@ +// 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 +//include soc related (generated) definitions +#include +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** + * @brief Pin function information for a single RTCIO pad's. + * + * This is an internal function of the driver, and is not usually useful + * for external use. + */ +typedef struct { + uint32_t reg; /*!< Register of RTC pad, or 0 if not an RTC GPIO */ + uint32_t mux; /*!< Bit mask for selecting digital pad or RTC pad */ + uint32_t func; /*!< Shift of pad function (FUN_SEL) field */ + uint32_t ie; /*!< Mask of input enable */ + uint32_t pullup; /*!< Mask of pullup enable */ + uint32_t pulldown; /*!< Mask of pulldown enable */ + uint32_t slpsel; /*!< If slpsel bit is set, slpie will be used as pad input enabled signal in sleep mode */ + uint32_t slpie; /*!< Mask of input enable in sleep mode */ + uint32_t slpoe; /*!< Mask of output enable in sleep mode */ + uint32_t hold; /*!< Mask of hold enable */ + uint32_t hold_force;/*!< Mask of hold_force bit for RTC IO in RTC_CNTL_HOLD_REG */ + uint32_t drv_v; /*!< Mask of drive capability */ + uint32_t drv_s; /*!< Offset of drive capability */ + int rtc_num; /*!< GPIO number (corresponds to RTC pad) */ +} rtc_io_desc_t; + +/** + * @brief Provides access to a constant table of RTC I/O pin + * function information. + * The index of table is the index of rtcio. + * + * This is an internal function of the driver, and is not usually useful + * for external use. + */ +extern const rtc_io_desc_t rtc_io_desc[SOC_RTC_IO_PIN_COUNT]; + +/** + * @brief Provides a constant table to get rtc io number with gpio number + * + * This is an internal function of the driver, and is not usually useful + * for external use. + */ +extern const int rtc_io_num_map[GPIO_PIN_COUNT]; + +#ifdef CONFIG_RTCIO_SUPPORT_RTC_GPIO_DESC +/** + * @brief Pin function information for a single GPIO pad's RTC functions. + * + * This is an internal function of the driver, and is not usually useful + * for external use. + */ +typedef struct { + uint32_t reg; /*!< Register of RTC pad, or 0 if not an RTC GPIO */ + uint32_t mux; /*!< Bit mask for selecting digital pad or RTC pad */ + uint32_t func; /*!< Shift of pad function (FUN_SEL) field */ + uint32_t ie; /*!< Mask of input enable */ + uint32_t pullup; /*!< Mask of pullup enable */ + uint32_t pulldown; /*!< Mask of pulldown enable */ + uint32_t slpsel; /*!< If slpsel bit is set, slpie will be used as pad input enabled signal in sleep mode */ + uint32_t slpie; /*!< Mask of input enable in sleep mode */ + uint32_t hold; /*!< Mask of hold enable */ + uint32_t hold_force;/*!< Mask of hold_force bit for RTC IO in RTC_CNTL_HOLD_FORCE_REG */ + uint32_t drv_v; /*!< Mask of drive capability */ + uint32_t drv_s; /*!< Offset of drive capability */ + int rtc_num; /*!< RTC IO number, or -1 if not an RTC GPIO */ +} rtc_gpio_desc_t; + +/** + * @brief Provides access to a constant table of RTC I/O pin + * function information. + * + * This is an internal function of the driver, and is not usually useful + * for external use. + */ +extern const rtc_gpio_desc_t rtc_gpio_desc[GPIO_PIN_COUNT]; + +#endif // CONFIG_IDF_TARGET_ESP32 + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/arch/xtensa/include/esp32/soc/include/soc/rtc_periph.h b/arch/xtensa/include/esp32/soc/include/soc/rtc_periph.h new file mode 100644 index 0000000000000..d7523f2f945da --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/soc/rtc_periph.h @@ -0,0 +1,27 @@ +// 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. + +#pragma once +#include +#include "rtc_io_periph.h" +#include "../../esp32/include/soc/gpio_caps.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/include/soc/rtc_wdt.h b/arch/xtensa/include/esp32/soc/include/soc/rtc_wdt.h new file mode 100644 index 0000000000000..0ed2c9a7b1bfd --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/soc/rtc_wdt.h @@ -0,0 +1,198 @@ +// 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. + +/* Recommendation of using API RTC_WDT. +1) Setting and enabling rtc_wdt: +@code + rtc_wdt_protect_off(); + rtc_wdt_disable(); + rtc_wdt_set_length_of_reset_signal(RTC_WDT_SYS_RESET_SIG, RTC_WDT_LENGTH_3_2us); + rtc_wdt_set_stage(RTC_WDT_STAGE0, RTC_WDT_STAGE_ACTION_RESET_SYSTEM); //RTC_WDT_STAGE_ACTION_RESET_SYSTEM or RTC_WDT_STAGE_ACTION_RESET_RTC + rtc_wdt_set_time(RTC_WDT_STAGE0, 7000); // timeout rtd_wdt 7000ms. + rtc_wdt_enable(); + rtc_wdt_protect_on(); + @endcode + +* If you use this option RTC_WDT_STAGE_ACTION_RESET_SYSTEM then after reset you can see these messages. +They can help to understand where the CPUs were when the WDT was triggered. + W (30) boot: PRO CPU has been reset by WDT. + W (30) boot: WDT reset info: PRO CPU PC=0x400xxxxx + ... function where it happened + + W (31) boot: WDT reset info: APP CPU PC=0x400xxxxx + ... function where it happened + +* If you use this option RTC_WDT_STAGE_ACTION_RESET_RTC then you will see message (rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)) +without description where were CPUs when it happened. + +2) Reset counter of rtc_wdt: +@code + rtc_wdt_feed(); +@endcode + +3) Disable rtc_wdt: +@code + rtc_wdt_disable(); +@endcode + */ + +#pragma once +#include +#include +#include "soc/rtc_periph.h" +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/// List of stage of rtc watchdog. WDT has 4 stage. +typedef enum { + RTC_WDT_STAGE0 = 0, /*!< Stage 0 */ + RTC_WDT_STAGE1 = 1, /*!< Stage 1 */ + RTC_WDT_STAGE2 = 2, /*!< Stage 2 */ + RTC_WDT_STAGE3 = 3 /*!< Stage 3 */ +} rtc_wdt_stage_t; + +/// List of action. When the time of stage expires this action will be triggered. +typedef enum { + RTC_WDT_STAGE_ACTION_OFF = RTC_WDT_STG_SEL_OFF, /*!< Disabled. This stage will have no effects on the system. */ + RTC_WDT_STAGE_ACTION_INTERRUPT = RTC_WDT_STG_SEL_INT, /*!< Trigger an interrupt. When the stage expires an interrupt is triggered. */ + RTC_WDT_STAGE_ACTION_RESET_CPU = RTC_WDT_STG_SEL_RESET_CPU, /*!< Reset a CPU core. */ + RTC_WDT_STAGE_ACTION_RESET_SYSTEM = RTC_WDT_STG_SEL_RESET_SYSTEM, /*!< Reset the main system includes the CPU and all peripherals. The RTC is an exception to this, and it will not be reset. */ + RTC_WDT_STAGE_ACTION_RESET_RTC = RTC_WDT_STG_SEL_RESET_RTC /*!< Reset the main system and the RTC. */ +} rtc_wdt_stage_action_t; + +/// Type of reset signal +typedef enum { + RTC_WDT_SYS_RESET_SIG = 0, /*!< System reset signal length selection */ + RTC_WDT_CPU_RESET_SIG = 1 /*!< CPU reset signal length selection */ +} rtc_wdt_reset_sig_t; + +/// Length of reset signal +typedef enum { + RTC_WDT_LENGTH_100ns = 0, /*!< 100 ns */ + RTC_WDT_LENGTH_200ns = 1, /*!< 200 ns */ + RTC_WDT_LENGTH_300ns = 2, /*!< 300 ns */ + RTC_WDT_LENGTH_400ns = 3, /*!< 400 ns */ + RTC_WDT_LENGTH_500ns = 4, /*!< 500 ns */ + RTC_WDT_LENGTH_800ns = 5, /*!< 800 ns */ + RTC_WDT_LENGTH_1_6us = 6, /*!< 1.6 us */ + RTC_WDT_LENGTH_3_2us = 7 /*!< 3.2 us */ +} rtc_wdt_length_sig_t; + +/** + * @brief Get status of protect of rtc_wdt. + * + * @return + * - True if the protect of RTC_WDT is set + */ +bool rtc_wdt_get_protect_status(void); + +/** + * @brief Set protect of rtc_wdt. + */ +void rtc_wdt_protect_on(void); + +/** + * @brief Reset protect of rtc_wdt. + */ +void rtc_wdt_protect_off(void); + +/** + * @brief Enable rtc_wdt. + */ +void rtc_wdt_enable(void); + +/** + * @brief Enable the flash boot protection procedure for WDT. + * + * Do not recommend to use it in the app. + * This function was added to be compatibility with the old bootloaders. + * This mode is disabled in bootloader or using rtc_wdt_disable() function. + */ +void rtc_wdt_flashboot_mode_enable(void); + +/** + * @brief Disable rtc_wdt. + */ +void rtc_wdt_disable(void); + +/** + * @brief Reset counter rtc_wdt. + * + * It returns to stage 0 and its expiry counter restarts from 0. + */ +void rtc_wdt_feed(void); + +/** + * @brief Set time for required stage. + * + * @param[in] stage Stage of rtc_wdt. + * @param[in] timeout_ms Timeout for this stage. + * + * @return + * - ESP_OK In case of success + * - ESP_ERR_INVALID_ARG If stage has invalid value + */ +esp_err_t rtc_wdt_set_time(rtc_wdt_stage_t stage, unsigned int timeout_ms); + +/** + * @brief Get the timeout set for the required stage. + * + * @param[in] stage Stage of rtc_wdt. + * @param[out] timeout_ms Timeout set for this stage. (not elapsed time). + * + * @return + * - ESP_OK In case of success + * - ESP_ERR_INVALID_ARG If stage has invalid value + */ +esp_err_t rtc_wdt_get_timeout(rtc_wdt_stage_t stage, unsigned int* timeout_ms); + +/** + * @brief Set an action for required stage. + * + * @param[in] stage Stage of rtc_wdt. + * @param[in] stage_sel Action for this stage. When the time of stage expires this action will be triggered. + * + * @return + * - ESP_OK In case of success + * - ESP_ERR_INVALID_ARG If stage or stage_sel have invalid value + */ +esp_err_t rtc_wdt_set_stage(rtc_wdt_stage_t stage, rtc_wdt_stage_action_t stage_sel); + +/** + * @brief Set a length of reset signal. + * + * @param[in] reset_src Type of reset signal. + * @param[in] reset_signal_length A length of reset signal. + * + * @return + * - ESP_OK In case of success + * - ESP_ERR_INVALID_ARG If reset_src or reset_signal_length have invalid value + */ +esp_err_t rtc_wdt_set_length_of_reset_signal(rtc_wdt_reset_sig_t reset_src, rtc_wdt_length_sig_t reset_signal_length); + +/** + * @brief Return true if rtc_wdt is enabled. + * + * @return + * - True rtc_wdt is enabled + */ +bool rtc_wdt_is_on(void); + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/include/soc/sdio_slave_periph.h b/arch/xtensa/include/esp32/soc/include/soc/sdio_slave_periph.h new file mode 100644 index 0000000000000..189f90757203c --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/soc/sdio_slave_periph.h @@ -0,0 +1,45 @@ +// 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. + +#pragma once +#include +//include soc related (generated) definitions +#include "soc/sdio_slave_pins.h" +#include "soc/slc_reg.h" +#include "soc/slc_struct.h" +#include "soc/host_reg.h" +#include "soc/host_struct.h" +#include "soc/hinf_reg.h" +#include "soc/hinf_struct.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** pin and signal information of each slot */ +typedef struct { + uint32_t clk_gpio; + uint32_t cmd_gpio; + uint32_t d0_gpio; + uint32_t d1_gpio; + uint32_t d2_gpio; + uint32_t d3_gpio; + int func; +} sdio_slave_slot_info_t; + +extern const sdio_slave_slot_info_t sdio_slave_slot_info[]; + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/include/soc/sdmmc_periph.h b/arch/xtensa/include/esp32/soc/include/soc/sdmmc_periph.h new file mode 100644 index 0000000000000..75499b0b408d9 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/soc/sdmmc_periph.h @@ -0,0 +1,49 @@ +// 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. + +#pragma once +#include +//include soc related (generated) definitions +#include "soc/sdmmc_pins.h" +#include "soc/sdmmc_reg.h" +#include "soc/sdmmc_struct.h" +#include "soc/gpio_sig_map.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + uint8_t clk_gpio; + uint8_t cmd_gpio; + uint8_t d0_gpio; + uint8_t d1_gpio; + uint8_t d2_gpio; + uint8_t d3_gpio; + uint8_t d4_gpio; + uint8_t d5_gpio; + uint8_t d6_gpio; + uint8_t d7_gpio; + uint8_t card_detect; + uint8_t write_protect; + uint8_t card_int; + uint8_t width; +} sdmmc_slot_info_t; + +/** pin and signal information of each slot */ +extern const sdmmc_slot_info_t sdmmc_slot_info[]; + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/include/soc/sens_periph.h b/arch/xtensa/include/esp32/soc/include/soc/sens_periph.h new file mode 100644 index 0000000000000..38b765753738b --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/soc/sens_periph.h @@ -0,0 +1,17 @@ +// 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 "soc/sens_reg.h" +#include "soc/sens_struct.h" diff --git a/arch/xtensa/include/esp32/soc/include/soc/sigmadelta_periph.h b/arch/xtensa/include/esp32/soc/include/soc/sigmadelta_periph.h new file mode 100644 index 0000000000000..63ec3a41d9de5 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/soc/sigmadelta_periph.h @@ -0,0 +1,17 @@ +// 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 "soc/gpio_sd_struct.h" +#include "soc/gpio_sd_reg.h" diff --git a/arch/xtensa/include/esp32/soc/include/soc/soc_memory_layout.h b/arch/xtensa/include/esp32/soc/include/soc/soc_memory_layout.h new file mode 100644 index 0000000000000..0c12561cc6ec9 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/soc/soc_memory_layout.h @@ -0,0 +1,259 @@ +// 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 "../../esp32/include/soc/soc.h" +#include +#include "../../../xtensa/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); + +inline static bool IRAM_ATTR esp_ptr_dma_capable(const void *p) +{ + return (intptr_t)p >= SOC_DMA_LOW && (intptr_t)p < SOC_DMA_HIGH; +} + +inline static bool IRAM_ATTR esp_ptr_word_aligned(const void *p) +{ + return ((intptr_t)p) % 4 == 0; +} + +inline static bool IRAM_ATTR esp_ptr_executable(const void *p) +{ + intptr_t ip = (intptr_t) p; + return (ip >= SOC_IROM_LOW && ip < SOC_IROM_HIGH) + || (ip >= SOC_IRAM_LOW && ip < SOC_IRAM_HIGH) + || (ip >= SOC_IROM_MASK_LOW && ip < SOC_IROM_MASK_HIGH) +#if defined(SOC_CACHE_APP_LOW) && defined(CONFIG_FREERTOS_UNICORE) + || (ip >= SOC_CACHE_APP_LOW && ip < SOC_CACHE_APP_HIGH) +#endif + || (ip >= SOC_RTC_IRAM_LOW && ip < SOC_RTC_IRAM_HIGH); +} + +inline static bool IRAM_ATTR esp_ptr_byte_accessible(const void *p) +{ + intptr_t ip = (intptr_t) p; + bool r; + r = (ip >= SOC_BYTE_ACCESSIBLE_LOW && ip < SOC_BYTE_ACCESSIBLE_HIGH); +#if CONFIG_SPIRAM +#if CONFIG_SPIRAM_SIZE != -1 // Fixed size, can be more accurate + r |= (ip >= SOC_EXTRAM_DATA_LOW && ip < (SOC_EXTRAM_DATA_LOW + CONFIG_SPIRAM_SIZE)); +#else + r |= (ip >= SOC_EXTRAM_DATA_LOW && ip < (SOC_EXTRAM_DATA_HIGH)); +#endif +#endif + return r; +} + +inline static bool IRAM_ATTR esp_ptr_internal(const void *p) { + bool r; + r = ((intptr_t)p >= SOC_MEM_INTERNAL_LOW && (intptr_t)p < SOC_MEM_INTERNAL_HIGH); + r |= ((intptr_t)p >= SOC_RTC_DATA_LOW && (intptr_t)p < SOC_RTC_DATA_HIGH); + return r; +} + + +inline static bool IRAM_ATTR esp_ptr_external_ram(const void *p) { + return ((intptr_t)p >= SOC_EXTRAM_DATA_LOW && (intptr_t)p < SOC_EXTRAM_DATA_HIGH); +} + +inline static bool IRAM_ATTR esp_ptr_in_iram(const void *p) { +#if !CONFIG_FREERTOS_UNICORE || CONFIG_IDF_TARGET_ESP32S2BETA + return ((intptr_t)p >= SOC_IRAM_LOW && (intptr_t)p < SOC_IRAM_HIGH); +#else + return ((intptr_t)p >= SOC_CACHE_APP_LOW && (intptr_t)p < SOC_IRAM_HIGH); +#endif +} + +inline static bool IRAM_ATTR esp_ptr_in_drom(const void *p) { + return ((intptr_t)p >= SOC_DROM_LOW && (intptr_t)p < SOC_DROM_HIGH); +} + +inline static bool IRAM_ATTR esp_ptr_in_dram(const void *p) { + return ((intptr_t)p >= SOC_DRAM_LOW && (intptr_t)p < SOC_DRAM_HIGH); +} + +inline static bool IRAM_ATTR esp_ptr_in_diram_dram(const void *p) { + return ((intptr_t)p >= SOC_DIRAM_DRAM_LOW && (intptr_t)p < SOC_DIRAM_DRAM_HIGH); +} + +inline static bool IRAM_ATTR esp_ptr_in_diram_iram(const void *p) { + return ((intptr_t)p >= SOC_DIRAM_IRAM_LOW && (intptr_t)p < SOC_DIRAM_IRAM_HIGH); +} + +inline static bool IRAM_ATTR esp_ptr_in_rtc_iram_fast(const void *p) { + return ((intptr_t)p >= SOC_RTC_IRAM_LOW && (intptr_t)p < SOC_RTC_IRAM_HIGH); +} + +inline static bool IRAM_ATTR esp_ptr_in_rtc_dram_fast(const void *p) { + return ((intptr_t)p >= SOC_RTC_DRAM_LOW && (intptr_t)p < SOC_RTC_DRAM_HIGH); +} + +inline static bool IRAM_ATTR esp_ptr_in_rtc_slow(const void *p) { + return ((intptr_t)p >= SOC_RTC_DATA_LOW && (intptr_t)p < SOC_RTC_DATA_HIGH); +} + +/* Convert a D/IRAM DRAM pointer to equivalent word address in IRAM + + - Address must be word aligned + - Address must pass esp_ptr_in_diram_dram() test, or result will be invalid pointer +*/ +inline static void * IRAM_ATTR esp_ptr_diram_dram_to_iram(const void *p) { +#if SOC_DIRAM_INVERTED + return (void *) ( SOC_DIRAM_IRAM_LOW + (SOC_DIRAM_DRAM_HIGH - (intptr_t)p) - 4); +#else + return (void *) ( SOC_DIRAM_IRAM_LOW + ((intptr_t)p - SOC_DIRAM_DRAM_LOW) ); +#endif +} + +/* Convert a D/IRAM IRAM pointer to equivalent word address in DRAM + + - Address must be word aligned + - Address must pass esp_ptr_in_diram_iram() test, or result will be invalid pointer +*/ +inline static void * IRAM_ATTR esp_ptr_diram_iram_to_dram(const void *p) { +#if SOC_DIRAM_INVERTED + return (void *) ( SOC_DIRAM_DRAM_LOW + (SOC_DIRAM_IRAM_HIGH - (intptr_t)p) - 4); +#else + return (void *) ( SOC_DIRAM_DRAM_LOW + ((intptr_t)p - SOC_DIRAM_IRAM_LOW) ); +#endif +} + +inline static bool IRAM_ATTR esp_stack_ptr_is_sane(uint32_t sp) +{ + //Check if stack ptr is in between SOC_DRAM_LOW and SOC_DRAM_HIGH, and 16 byte aligned. + return !(sp < SOC_DRAM_LOW + 0x10 || sp > SOC_DRAM_HIGH - 0x10 || ((sp & 0xF) != 0)); +} + diff --git a/arch/xtensa/include/esp32/soc/include/soc/spi_periph.h b/arch/xtensa/include/esp32/soc/include/soc/spi_periph.h new file mode 100644 index 0000000000000..1aea5a8c919b8 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/soc/spi_periph.h @@ -0,0 +1,82 @@ +// 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. + +#pragma once +#include +#include "soc/soc.h" +#include "soc/periph_defs.h" + +//include soc related (generated) definitions +#include "soc/spi_caps.h" +#include "soc/spi_reg.h" +#include "soc/spi_struct.h" +#include "soc/gpio_sig_map.h" +#include +#if CONFIG_IDF_TARGET_ESP32S2BETA +#include "soc/spi_mem_struct.h" +#include "soc/spi_mem_reg.h" +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +#ifdef CONFIG_IDF_TARGET_ESP32S2BETA +#define SPI_FREAD_DIO 0 +#define SPI_FREAD_QIO 0 +#define SPI_FWRITE_DIO 0 +#define SPI_FWRITE_QIO 0 +#endif + + + +/* + Stores a bunch of per-spi-peripheral data. +*/ +typedef struct { + const uint8_t spiclk_out; //GPIO mux output signals + const uint8_t spiclk_in; + const uint8_t spid_out; + const uint8_t spiq_out; + const uint8_t spiwp_out; + const uint8_t spihd_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 spics_out[3]; // /CS GPIO output mux signals + const uint8_t spics_in; + const uint8_t spidqs_out; + const uint8_t spidqs_in; + const uint8_t spicd_out; + const uint8_t spicd_in; + const uint8_t spiclk_iomux_pin; //IO pins of IO_MUX muxed signals + const uint8_t spid_iomux_pin; + const uint8_t spiq_iomux_pin; + const uint8_t spiwp_iomux_pin; + const uint8_t spihd_iomux_pin; + const uint8_t spics0_iomux_pin; + const uint8_t irq; //irq source for interrupt mux + const uint8_t irq_dma; //dma irq source for interrupt mux + const periph_module_t module; //peripheral module, for enabling clock etc + const int func; //function number for IOMUX + spi_dev_t *hw; //Pointer to the hardware registers +} spi_signal_conn_t; + +extern const spi_signal_conn_t spi_periph_signal[SOC_SPI_PERIPH_NUM]; + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/soc/include/soc/syscon_periph.h b/arch/xtensa/include/esp32/soc/include/soc/syscon_periph.h new file mode 100644 index 0000000000000..0179e867c7694 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/soc/syscon_periph.h @@ -0,0 +1,17 @@ +// 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 "soc/syscon_reg.h" +#include "soc/syscon_struct.h" diff --git a/arch/xtensa/include/esp32/soc/include/soc/timer_periph.h b/arch/xtensa/include/esp32/soc/include/soc/timer_periph.h new file mode 100644 index 0000000000000..6b07378d3c5b2 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/soc/timer_periph.h @@ -0,0 +1,17 @@ +// 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 "soc/timer_group_reg.h" +#include "soc/timer_group_struct.h" diff --git a/arch/xtensa/include/esp32/soc/include/soc/touch_sensor_periph.h b/arch/xtensa/include/esp32/soc/include/soc/touch_sensor_periph.h new file mode 100644 index 0000000000000..edd5195b0f3a4 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/soc/touch_sensor_periph.h @@ -0,0 +1,25 @@ +// 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 "soc/touch_sensor_channel.h" +#include "soc/touch_sensor_caps.h" +#include "soc/rtc_cntl_reg.h" +#include "soc/rtc_cntl_struct.h" +#include "soc/sens_reg.h" +#include "soc/sens_struct.h" +#include "soc/rtc_io_struct.h" + +extern const int touch_sensor_channel_io_map[SOC_TOUCH_SENSOR_NUM]; \ No newline at end of file diff --git a/arch/xtensa/include/esp32/soc/include/soc/uart_periph.h b/arch/xtensa/include/esp32/soc/include/soc/uart_periph.h new file mode 100644 index 0000000000000..7dbf8aedded90 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/soc/uart_periph.h @@ -0,0 +1,31 @@ +// 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 "soc/uart_reg.h" +#include "soc/uart_struct.h" +#include "soc/uart_caps.h" +#include "soc/periph_defs.h" +#include "soc/gpio_sig_map.h" + +typedef struct { + const uint8_t tx_sig; + const uint8_t rx_sig; + const uint8_t rts_sig; + const uint8_t cts_sig; + const uint8_t irq; + const periph_module_t module; +} uart_signal_conn_t; + +extern const uart_signal_conn_t uart_periph_signal[SOC_UART_NUM]; diff --git a/arch/xtensa/include/esp32/soc/include/soc/uhci_periph.h b/arch/xtensa/include/esp32/soc/include/soc/uhci_periph.h new file mode 100644 index 0000000000000..cbfae2ac9adc5 --- /dev/null +++ b/arch/xtensa/include/esp32/soc/include/soc/uhci_periph.h @@ -0,0 +1,18 @@ +// 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 "soc/uhci_reg.h" +#include "soc/uhci_struct.h" +#include "soc/periph_defs.h" \ No newline at end of file diff --git a/arch/xtensa/include/esp32/spi_flash/include/esp_flash.h b/arch/xtensa/include/esp32/spi_flash/include/esp_flash.h new file mode 100644 index 0000000000000..fd06e51370d38 --- /dev/null +++ b/arch/xtensa/include/esp32/spi_flash/include/esp_flash.h @@ -0,0 +1,306 @@ +// 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. + +#pragma once +#include "../../esp_common/esp_err.h" +#include +#include +#include "../../soc/include/hal/spi_flash_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct spi_flash_chip_t; +typedef struct spi_flash_chip_t spi_flash_chip_t; + +typedef struct esp_flash_t esp_flash_t; + +/** @brief Structure for describing a region of flash */ +typedef struct { + uint32_t offset; ///< Start address of this region + uint32_t size; ///< Size of the region +} esp_flash_region_t; + +/** OS-level integration hooks for accessing flash chips inside a running OS */ +typedef struct { + /** + * Called before commencing any flash operation. Does not need to be + * recursive (ie is called at most once for each call to 'end'). + */ + esp_err_t (*start)(void *arg); + + /** Called after completing any flash operation. */ + esp_err_t (*end)(void *arg); + + /** Called before any erase/write operations to check whether the region is limited by the OS */ + esp_err_t (*region_protected)(void* arg, size_t start_addr, size_t size); + + /** Delay for at least 'ms' milliseconds. Called in between 'start' and 'end'. */ + esp_err_t (*delay_ms)(void *arg, unsigned ms); +} esp_flash_os_functions_t; + +/** @brief Structure to describe a SPI flash chip connected to the system. + + Structure must be initialized before use (passed to esp_flash_init()). +*/ +struct esp_flash_t { + spi_flash_host_driver_t *host; ///< Pointer to hardware-specific "host_driver" structure. Must be initialized before used. + const spi_flash_chip_t *chip_drv; ///< Pointer to chip-model-specific "adapter" structure. If NULL, will be detected during initialisation. + + const esp_flash_os_functions_t *os_func; ///< Pointer to os-specific hook structure. Call ``esp_flash_init_os_functions()`` to setup this field, after the host is properly initialized. + void *os_func_data; ///< Pointer to argument for os-specific hooks. Left NULL and will be initialized with ``os_func``. + + esp_flash_io_mode_t read_mode; ///< Configured SPI flash read mode. Set before ``esp_flash_init`` is called. + uint32_t size; ///< Size of SPI flash in bytes. If 0, size will be detected during initialisation. + uint32_t chip_id; ///< Detected chip id. +}; + + +/** @brief Initialise SPI flash chip interface. + * + * This function must be called before any other API functions are called for this chip. + * + * @note Only the ``host`` and ``read_mode`` fields of the chip structure must + * be initialised before this function is called. Other fields may be + * auto-detected if left set to zero or NULL. + * + * @note If the chip->drv pointer is NULL, chip chip_drv will be auto-detected + * based on its manufacturer & product IDs. See + * ``esp_flash_registered_flash_drivers`` pointer for details of this process. + * + * @param chip Pointer to SPI flash chip to use. If NULL, esp_flash_default_chip is substituted. + * @return ESP_OK on success, or a flash error code if initialisation fails. + */ +esp_err_t esp_flash_init(esp_flash_t *chip); + +/** + * Check if appropriate chip driver is set. + * + * @param chip Pointer to SPI flash chip to use. If NULL, esp_flash_default_chip is substituted. + * + * @return true if set, otherwise false. + */ +bool esp_flash_chip_driver_initialized(const esp_flash_t *chip); + +/** @brief Read flash ID via the common "RDID" SPI flash command. + * + * @param chip Pointer to identify flash chip. Must have been successfully initialised via esp_flash_init() + * @param[out] out_id Pointer to receive ID value. + * + * ID is a 24-bit value. Lower 16 bits of 'id' are the chip ID, upper 8 bits are the manufacturer ID. + * + * @return ESP_OK on success, or a flash error code if operation failed. + */ +esp_err_t esp_flash_read_id(esp_flash_t *chip, uint32_t *out_id); + +/** @brief Detect flash size based on flash ID. + * + * @param chip Pointer to identify flash chip. Must have been successfully initialised via esp_flash_init() + * @param[out] out_size Detected size in bytes. + * + * @note Most flash chips use a common format for flash ID, where the lower 4 bits specify the size as a power of 2. If + * the manufacturer doesn't follow this convention, the size may be incorrectly detected. + * + * @return ESP_OK on success, or a flash error code if operation failed. + */ +esp_err_t esp_flash_get_size(esp_flash_t *chip, uint32_t *out_size); + +/** @brief Erase flash chip contents + * + * @param chip Pointer to identify flash chip. Must have been successfully initialised via esp_flash_init() + * + * + * @return ESP_OK on success, or a flash error code if operation failed. + */ +esp_err_t esp_flash_erase_chip(esp_flash_t *chip); + +/** @brief Erase a region of the flash chip + * + * @param chip Pointer to identify flash chip. Must have been successfully initialised via esp_flash_init() + * @param start Address to start erasing flash. Must be sector aligned. + * @param len Length of region to erase. Must also be sector aligned. + * + * Sector size is specifyed in chip->drv->sector_size field (typically 4096 bytes.) ESP_ERR_INVALID_ARG will be + * returned if the start & length are not a multiple of this size. + * + * Erase is performed using block (multi-sector) erases where possible (block size is specified in + * chip->drv->block_erase_size field, typically 65536 bytes). Remaining sectors are erased using individual sector erase + * commands. + * + * @return ESP_OK on success, or a flash error code if operation failed. + */ +esp_err_t esp_flash_erase_region(esp_flash_t *chip, uint32_t start, uint32_t len); + +/** @brief Read if the entire chip is write protected + * + * @param chip Pointer to identify flash chip. Must have been successfully initialised via esp_flash_init() + * @param[out] write_protected Pointer to boolean, set to the value of the write protect flag. + * + * @note A correct result for this flag depends on the SPI flash chip model and chip_drv in use (via the 'chip->drv' + * field). + * + * @return ESP_OK on success, or a flash error code if operation failed. + */ +esp_err_t esp_flash_get_chip_write_protect(esp_flash_t *chip, bool *write_protected); + +/** @brief Set write protection for the SPI flash chip + * + * @param chip Pointer to identify flash chip. Must have been successfully initialised via esp_flash_init() + * @param write_protect Boolean value for the write protect flag + * + * @note Correct behaviour of this function depends on the SPI flash chip model and chip_drv in use (via the 'chip->drv' + * field). + * + * Some SPI flash chips may require a power cycle before write protect status can be cleared. Otherwise, + * write protection can be removed via a follow-up call to this function. + * + * @return ESP_OK on success, or a flash error code if operation failed. + */ +esp_err_t esp_flash_set_chip_write_protect(esp_flash_t *chip, bool write_protect); + + +/** @brief Read the list of individually protectable regions of this SPI flash chip. + * + * @param chip Pointer to identify flash chip. Must have been successfully initialised via esp_flash_init() + * @param[out] out_regions Pointer to receive a pointer to the array of protectable regions of the chip. + * @param[out] out_num_regions Pointer to an integer receiving the count of protectable regions in the array returned in 'regions'. + * + * @note Correct behaviour of this function depends on the SPI flash chip model and chip_drv in use (via the 'chip->drv' + * field). + * + * @return ESP_OK on success, or a flash error code if operation failed. + */ +esp_err_t esp_flash_get_protectable_regions(const esp_flash_t *chip, const esp_flash_region_t **out_regions, uint32_t *out_num_regions); + + +/** @brief Detect if a region of the SPI flash chip is protected + * + * @param chip Pointer to identify flash chip. Must have been successfully initialised via esp_flash_init() + * @param region Pointer to a struct describing a protected region. This must match one of the regions returned from esp_flash_get_protectable_regions(...). + * @param[out] out_protected Pointer to a flag which is set based on the protected status for this region. + * + * @note It is possible for this result to be false and write operations to still fail, if protection is enabled for the entire chip. + * + * @note Correct behaviour of this function depends on the SPI flash chip model and chip_drv in use (via the 'chip->drv' + * field). + * + * @return ESP_OK on success, or a flash error code if operation failed. + */ +esp_err_t esp_flash_get_protected_region(esp_flash_t *chip, const esp_flash_region_t *region, bool *out_protected); + +/** @brief Update the protected status for a region of the SPI flash chip + * + * @param chip Pointer to identify flash chip. Must have been successfully initialised via esp_flash_init() + * @param region Pointer to a struct describing a protected region. This must match one of the regions returned from esp_flash_get_protectable_regions(...). + * @param protect Write protection flag to set. + * + * @note It is possible for the region protection flag to be cleared and write operations to still fail, if protection is enabled for the entire chip. + * + * @note Correct behaviour of this function depends on the SPI flash chip model and chip_drv in use (via the 'chip->drv' + * field). + * + * @return ESP_OK on success, or a flash error code if operation failed. + */ +esp_err_t esp_flash_set_protected_region(esp_flash_t *chip, const esp_flash_region_t *region, bool protect); + +/** @brief Read data from the SPI flash chip + * + * @param chip Pointer to identify flash chip. Must have been successfully initialised via esp_flash_init() + * @param buffer Pointer to a buffer where the data will be read. To get better performance, this should be in the DRAM and word aligned. + * @param address Address on flash to read from. Must be less than chip->size field. + * @param length Length (in bytes) of data to read. + * + * There are no alignment constraints on buffer, address or length. + * + * @note If on-chip flash encryption is used, this function returns raw (ie encrypted) data. Use the flash cache + * to transparently decrypt data. + * + * @return + * - ESP_OK: success + * - ESP_ERR_NO_MEM: Buffer is in external PSRAM which cannot be concurrently accessed, and a temporary internal buffer could not be allocated. + * - or a flash error code if operation failed. + */ +esp_err_t esp_flash_read(esp_flash_t *chip, void *buffer, uint32_t address, uint32_t length); + +/** @brief Write data to the SPI flash chip + * + * @param chip Pointer to identify flash chip. Must have been successfully initialised via esp_flash_init() + * @param address Address on flash to write to. Must be previously erased (SPI NOR flash can only write bits 1->0). + * @param buffer Pointer to a buffer with the data to write. To get better performance, this should be in the DRAM and word aligned. + * @param length Length (in bytes) of data to write. + * + * There are no alignment constraints on buffer, address or length. + * + * @return ESP_OK on success, or a flash error code if operation failed. + */ +esp_err_t esp_flash_write(esp_flash_t *chip, const void *buffer, uint32_t address, uint32_t length); + +/** @brief Encrypted and write data to the SPI flash chip using on-chip hardware flash encryption + * + * @param chip Pointer to identify flash chip. Must be NULL (the main flash chip). For other chips, encrypted write is not supported. + * @param address Address on flash to write to. 16 byte aligned. Must be previously erased (SPI NOR flash can only write bits 1->0). + * @param buffer Pointer to a buffer with the data to write. + * @param length Length (in bytes) of data to write. 16 byte aligned. + * + * @note Both address & length must be 16 byte aligned, as this is the encryption block size + * + * @return + * - ESP_OK: on success + * - ESP_ERR_NOT_SUPPORTED: encrypted write not supported for this chip. + * - ESP_ERR_INVALID_ARG: Either the address, buffer or length is invalid. + * - or other flash error code from spi_flash_write_encrypted(). + */ +esp_err_t esp_flash_write_encrypted(esp_flash_t *chip, uint32_t address, const void *buffer, uint32_t length); + +/** @brief Read and decrypt data from the SPI flash chip using on-chip hardware flash encryption + * + * @param chip Pointer to identify flash chip. Must be NULL (the main flash chip). For other chips, encrypted read is not supported. + * @param address Address on flash to read from. + * @param out_buffer Pointer to a buffer for the data to read to. + * @param length Length (in bytes) of data to read. + * + * @return + * - ESP_OK: on success + * - ESP_ERR_NOT_SUPPORTED: encrypted read not supported for this chip. + * - or other flash error code from spi_flash_read_encrypted(). + */ +esp_err_t esp_flash_read_encrypted(esp_flash_t *chip, uint32_t address, void *out_buffer, uint32_t length); + +/** @brief Pointer to the "default" SPI flash chip, ie the main chip attached to the MCU. + + This chip is used if the 'chip' argument pass to esp_flash_xxx API functions is ever NULL. +*/ +extern esp_flash_t *esp_flash_default_chip; + + +/******************************************************************************* + * Utility Functions + ******************************************************************************/ + +/** + * @brief Returns true if chip is configured for Quad I/O or Quad Fast Read. + * + * @param chip Pointer to SPI flash chip to use. If NULL, esp_flash_default_chip is substituted. + * + * @return true if flash works in quad mode, otherwise false + */ +static inline bool esp_flash_is_quad_mode(const esp_flash_t *chip) +{ + return (chip->read_mode == SPI_FLASH_QIO) || (chip->read_mode == SPI_FLASH_QOUT); +} + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/spi_flash/include/esp_flash_internal.h b/arch/xtensa/include/esp32/spi_flash/include/esp_flash_internal.h new file mode 100644 index 0000000000000..0496f5649c40c --- /dev/null +++ b/arch/xtensa/include/esp32/spi_flash/include/esp_flash_internal.h @@ -0,0 +1,100 @@ +// 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. + +#pragma once +#include "esp_err.h" +#include +#include +#include "sdkconfig.h" + +#include "esp_flash.h" + +/** Internal API, don't use in the applications */ + +#ifdef __cplusplus +extern "C" { +#endif + + +/** @brief Initialise the default SPI flash chip + * + * Called by OS startup code. You do not need to call this in your own applications. + */ +#ifdef CONFIG_SPI_FLASH_USE_LEGACY_IMPL +#define esp_flash_init_default_chip(...) ({ESP_OK;}) +#else +esp_err_t esp_flash_init_default_chip(void); +#endif + +/** + * Enable OS-level SPI flash protections in IDF + * + * Called by OS startup code. You do not need to call this in your own applications. + * + * @return ESP_OK if success, otherwise failed. See return value of ``esp_flash_init_os_functions``. + */ +#ifdef CONFIG_SPI_FLASH_USE_LEGACY_IMPL +#define esp_flash_app_init(...) ({ESP_OK;}) +#else +esp_err_t esp_flash_app_init(void); +#endif + +/** + * Disable OS-level SPI flash protections in IDF + * + * Called by the IDF internal code (e.g. coredump). You do not need to call this in your own applications. + * + * @return always ESP_OK. + */ +#ifdef CONFIG_SPI_FLASH_USE_LEGACY_IMPL +#define esp_flash_app_disable_protect(...) ({ESP_OK;}) +#else +esp_err_t esp_flash_app_disable_protect(bool disable); +#endif + +/** + * Initialize OS-level functions for a specific chip. + * + * @param chip The chip to init os functions. + * @param host_id Which SPI host to use, 1 for SPI1, 2 for SPI2 (HSPI), 3 for SPI3 (VSPI) + * + * @return + * - ESP_OK if success + * - ESP_ERR_INVALID_ARG if host_id is invalid + */ +esp_err_t esp_flash_init_os_functions(esp_flash_t *chip, int host_id); + +/** + * Initialize OS-level functions for the main flash chip. + * + * @param chip The chip to init os functions. Only pointer to the default chip is supported now. + * + * @return always ESP_OK + */ +esp_err_t esp_flash_app_init_os_functions(esp_flash_t* chip); + +/** + * Disable OS-level functions for the main flash chip during special phases (e.g. coredump) + * + * @param chip The chip to init os functions. Only "esp_flash_default_chip" is supported now. + * + * @return always ESP_OK + */ +esp_err_t esp_flash_app_disable_os_functions(esp_flash_t* chip); + + + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/spi_flash/include/esp_flash_spi_init.h b/arch/xtensa/include/esp32/spi_flash/include/esp_flash_spi_init.h new file mode 100644 index 0000000000000..0e0e72d832f64 --- /dev/null +++ b/arch/xtensa/include/esp32/spi_flash/include/esp_flash_spi_init.h @@ -0,0 +1,62 @@ +// 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. + +#pragma once + +#include "hal/spi_types.h" +#include "esp_flash.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/// Configurations for the SPI Flash to init +typedef struct { + spi_host_device_t host_id; ///< Bus to use + int cs_id; ///< CS pin (signal) to use + int cs_io_num; ///< GPIO pin to output the CS signal + esp_flash_io_mode_t io_mode; ///< IO mode to read from the Flash + esp_flash_speed_t speed; ///< Speed of the Flash clock + int input_delay_ns; ///< Input delay of the data pins, in ns. Set to 0 if unknown. +} esp_flash_spi_device_config_t; + +/** + * Add a SPI Flash device onto the SPI bus. + * + * The bus should be already initialized by ``spi_bus_initialization``. + * + * @param out_chip Pointer to hold the initialized chip. + * @param config Configuration of the chips to initialize. + * + * @return + * - ESP_ERR_INVALID_ARG: out_chip is NULL, or some field in the config is invalid. + * - ESP_ERR_NO_MEM: failed to allocate memory for the chip structures. + * - ESP_OK: success. + */ +esp_err_t spi_bus_add_flash_device(esp_flash_t **out_chip, const esp_flash_spi_device_config_t *config); + +/** + * Remove a SPI Flash device from the SPI bus. + * + * @param chip The flash device to remove. + * + * @return + * - ESP_ERR_INVALID_ARG: The chip is invalid. + * - ESP_OK: success. + */ +esp_err_t spi_bus_remove_flash_device(esp_flash_t *chip); + +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/spi_flash/include/esp_partition.h b/arch/xtensa/include/esp32/spi_flash/include/esp_partition.h new file mode 100644 index 0000000000000..49a34166dd76b --- /dev/null +++ b/arch/xtensa/include/esp32/spi_flash/include/esp_partition.h @@ -0,0 +1,368 @@ +// 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. + +#ifndef __ESP_PARTITION_H__ +#define __ESP_PARTITION_H__ + +#include +#include +#include +#include "../../esp_common/esp_err.h" +#include "esp_flash.h" +#include "esp_spi_flash.h" + + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file esp_partition.h + * @brief Partition APIs + */ + + +/** + * @brief Partition type + * @note Keep this enum in sync with PartitionDefinition class gen_esp32part.py + */ +typedef enum { + ESP_PARTITION_TYPE_APP = 0x00, //!< Application partition type + ESP_PARTITION_TYPE_DATA = 0x01, //!< Data partition type +} esp_partition_type_t; + +/** + * @brief Partition subtype + * @note Keep this enum in sync with PartitionDefinition class gen_esp32part.py + */ +typedef enum { + ESP_PARTITION_SUBTYPE_APP_FACTORY = 0x00, //!< Factory application partition + ESP_PARTITION_SUBTYPE_APP_OTA_MIN = 0x10, //!< Base for OTA partition subtypes + ESP_PARTITION_SUBTYPE_APP_OTA_0 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 0, //!< OTA partition 0 + ESP_PARTITION_SUBTYPE_APP_OTA_1 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 1, //!< OTA partition 1 + ESP_PARTITION_SUBTYPE_APP_OTA_2 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 2, //!< OTA partition 2 + ESP_PARTITION_SUBTYPE_APP_OTA_3 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 3, //!< OTA partition 3 + ESP_PARTITION_SUBTYPE_APP_OTA_4 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 4, //!< OTA partition 4 + ESP_PARTITION_SUBTYPE_APP_OTA_5 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 5, //!< OTA partition 5 + ESP_PARTITION_SUBTYPE_APP_OTA_6 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 6, //!< OTA partition 6 + ESP_PARTITION_SUBTYPE_APP_OTA_7 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 7, //!< OTA partition 7 + ESP_PARTITION_SUBTYPE_APP_OTA_8 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 8, //!< OTA partition 8 + ESP_PARTITION_SUBTYPE_APP_OTA_9 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 9, //!< OTA partition 9 + ESP_PARTITION_SUBTYPE_APP_OTA_10 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 10,//!< OTA partition 10 + ESP_PARTITION_SUBTYPE_APP_OTA_11 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 11,//!< OTA partition 11 + ESP_PARTITION_SUBTYPE_APP_OTA_12 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 12,//!< OTA partition 12 + ESP_PARTITION_SUBTYPE_APP_OTA_13 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 13,//!< OTA partition 13 + ESP_PARTITION_SUBTYPE_APP_OTA_14 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 14,//!< OTA partition 14 + ESP_PARTITION_SUBTYPE_APP_OTA_15 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 15,//!< OTA partition 15 + ESP_PARTITION_SUBTYPE_APP_OTA_MAX = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 16,//!< Max subtype of OTA partition + ESP_PARTITION_SUBTYPE_APP_TEST = 0x20, //!< Test application partition + + ESP_PARTITION_SUBTYPE_DATA_OTA = 0x00, //!< OTA selection partition + ESP_PARTITION_SUBTYPE_DATA_PHY = 0x01, //!< PHY init data partition + ESP_PARTITION_SUBTYPE_DATA_NVS = 0x02, //!< NVS partition + 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_ESPHTTPD = 0x80, //!< ESPHTTPD partition + ESP_PARTITION_SUBTYPE_DATA_FAT = 0x81, //!< FAT partition + ESP_PARTITION_SUBTYPE_DATA_SPIFFS = 0x82, //!< SPIFFS partition + + ESP_PARTITION_SUBTYPE_ANY = 0xff, //!< Used to search for partitions with any subtype +} esp_partition_subtype_t; + +/** + * @brief Convenience macro to get esp_partition_subtype_t value for the i-th OTA partition + */ +#define ESP_PARTITION_SUBTYPE_OTA(i) ((esp_partition_subtype_t)(ESP_PARTITION_SUBTYPE_APP_OTA_MIN + ((i) & 0xf))) + +/** + * @brief Opaque partition iterator type + */ +typedef struct esp_partition_iterator_opaque_* esp_partition_iterator_t; + +/** + * @brief partition information structure + * + * This is not the format in flash, that format is esp_partition_info_t. + * + * However, this is the format used by this API. + */ +typedef struct { + esp_flash_t* flash_chip; /*!< SPI flash chip on which the partition resides */ + esp_partition_type_t type; /*!< partition type (app/data) */ + esp_partition_subtype_t subtype; /*!< partition subtype */ + uint32_t address; /*!< starting address of the partition in flash */ + uint32_t size; /*!< size of the partition, in bytes */ + char label[17]; /*!< partition label, zero-terminated ASCII string */ + bool encrypted; /*!< flag is set to true if partition is encrypted */ +} esp_partition_t; + +/** + * @brief Find partition based on one or more parameters + * + * @param type Partition type, one of esp_partition_type_t values + * @param subtype Partition subtype, one of esp_partition_subtype_t values. + * To find all partitions of given type, use + * ESP_PARTITION_SUBTYPE_ANY. + * @param label (optional) Partition label. Set this value if looking + * for partition with a specific name. Pass NULL otherwise. + * + * @return iterator which can be used to enumerate all the partitions found, + * or NULL if no partitions were found. + * Iterator obtained through this function has to be released + * using esp_partition_iterator_release when not used any more. + */ +esp_partition_iterator_t esp_partition_find(esp_partition_type_t type, esp_partition_subtype_t subtype, const char* label); + +/** + * @brief Find first partition based on one or more parameters + * + * @param type Partition type, one of esp_partition_type_t values + * @param subtype Partition subtype, one of esp_partition_subtype_t values. + * To find all partitions of given type, use + * ESP_PARTITION_SUBTYPE_ANY. + * @param label (optional) Partition label. Set this value if looking + * for partition with a specific name. Pass NULL otherwise. + * + * @return pointer to esp_partition_t structure, or NULL if no partition is found. + * This pointer is valid for the lifetime of the application. + */ +const esp_partition_t* esp_partition_find_first(esp_partition_type_t type, esp_partition_subtype_t subtype, const char* label); + +/** + * @brief Get esp_partition_t structure for given partition + * + * @param iterator Iterator obtained using esp_partition_find. Must be non-NULL. + * + * @return pointer to esp_partition_t structure. This pointer is valid for the lifetime + * of the application. + */ +const esp_partition_t* esp_partition_get(esp_partition_iterator_t iterator); + +/** + * @brief Move partition iterator to the next partition found + * + * Any copies of the iterator will be invalid after this call. + * + * @param iterator Iterator obtained using esp_partition_find. Must be non-NULL. + * + * @return NULL if no partition was found, valid esp_partition_iterator_t otherwise. + */ +esp_partition_iterator_t esp_partition_next(esp_partition_iterator_t iterator); + +/** + * @brief Release partition iterator + * + * @param iterator Iterator obtained using esp_partition_find. Must be non-NULL. + * + */ +void esp_partition_iterator_release(esp_partition_iterator_t iterator); + +/** + * @brief Verify partition data + * + * Given a pointer to partition data, verify this partition exists in the partition table (all fields match.) + * + * This function is also useful to take partition data which may be in a RAM buffer and convert it to a pointer to the + * permanent partition data stored in flash. + * + * Pointers returned from this function can be compared directly to the address of any pointer returned from + * esp_partition_get(), as a test for equality. + * + * @param partition Pointer to partition data to verify. Must be non-NULL. All fields of this structure must match the + * partition table entry in flash for this function to return a successful match. + * + * @return + * - If partition not found, returns NULL. + * - If found, returns a pointer to the esp_partition_t structure in flash. This pointer is always valid for the lifetime of the application. + */ +const esp_partition_t *esp_partition_verify(const esp_partition_t *partition); + +/** + * @brief Read data from the partition + * + * @param partition Pointer to partition structure obtained using + * esp_partition_find_first or esp_partition_get. + * Must be non-NULL. + * @param dst Pointer to the buffer where data should be stored. + * Pointer must be non-NULL and buffer must be at least 'size' bytes long. + * @param src_offset Address of the data to be read, relative to the + * beginning of the partition. + * @param size Size of data to be read, in bytes. + * + * @return ESP_OK, if data was read successfully; + * ESP_ERR_INVALID_ARG, if src_offset exceeds partition size; + * ESP_ERR_INVALID_SIZE, if read would go out of bounds of the partition; + * or one of error codes from lower-level flash driver. + */ +esp_err_t esp_partition_read(const esp_partition_t* partition, + size_t src_offset, void* dst, size_t size); + +/** + * @brief Write data to the partition + * + * Before writing data to flash, corresponding region of flash needs to be erased. + * This can be done using esp_partition_erase_range function. + * + * Partitions marked with an encryption flag will automatically be + * written via the spi_flash_write_encrypted() function. If writing to + * an encrypted partition, all write offsets and lengths must be + * multiples of 16 bytes. See the spi_flash_write_encrypted() function + * for more details. Unencrypted partitions do not have this + * restriction. + * + * @param partition Pointer to partition structure obtained using + * esp_partition_find_first or esp_partition_get. + * Must be non-NULL. + * @param dst_offset Address where the data should be written, relative to the + * beginning of the partition. + * @param src Pointer to the source buffer. Pointer must be non-NULL and + * buffer must be at least 'size' bytes long. + * @param size Size of data to be written, in bytes. + * + * @note Prior to writing to flash memory, make sure it has been erased with + * esp_partition_erase_range call. + * + * @return ESP_OK, if data was written successfully; + * ESP_ERR_INVALID_ARG, if dst_offset exceeds partition size; + * ESP_ERR_INVALID_SIZE, if write would go out of bounds of the partition; + * or one of error codes from lower-level flash driver. + */ +esp_err_t esp_partition_write(const esp_partition_t* partition, + size_t dst_offset, const void* src, size_t size); + +/** + * @brief Erase part of the partition + * + * @param partition Pointer to partition structure obtained using + * esp_partition_find_first or esp_partition_get. + * Must be non-NULL. + * @param offset Offset from the beginning of partition where erase operation + * should start. Must be aligned to 4 kilobytes. + * @param size Size of the range which should be erased, in bytes. + * Must be divisible by 4 kilobytes. + * + * @return ESP_OK, if the range was erased successfully; + * ESP_ERR_INVALID_ARG, if iterator or dst are NULL; + * ESP_ERR_INVALID_SIZE, if erase would go out of bounds of the partition; + * or one of error codes from lower-level flash driver. + */ +esp_err_t esp_partition_erase_range(const esp_partition_t* partition, + size_t offset, size_t size); + +/** + * @brief Configure MMU to map partition into data memory + * + * Unlike spi_flash_mmap function, which requires a 64kB aligned base address, + * this function doesn't impose such a requirement. + * If offset results in a flash address which is not aligned to 64kB boundary, + * address will be rounded to the lower 64kB boundary, so that mapped region + * includes requested range. + * Pointer returned via out_ptr argument will be adjusted to point to the + * requested offset (not necessarily to the beginning of mmap-ed region). + * + * To release mapped memory, pass handle returned via out_handle argument to + * spi_flash_munmap function. + * + * @param partition Pointer to partition structure obtained using + * esp_partition_find_first or esp_partition_get. + * Must be non-NULL. + * @param offset Offset from the beginning of partition where mapping should start. + * @param size Size of the area to be mapped. + * @param memory Memory space where the region should be mapped + * @param out_ptr Output, pointer to the mapped memory region + * @param out_handle Output, handle which should be used for spi_flash_munmap call + * + * @return ESP_OK, if successful + */ +esp_err_t esp_partition_mmap(const esp_partition_t* partition, size_t offset, size_t size, + spi_flash_mmap_memory_t memory, + const void** out_ptr, spi_flash_mmap_handle_t* out_handle); + +/** + * @brief Get SHA-256 digest for required partition. + * + * For apps with SHA-256 appended to the app image, the result is the appended SHA-256 value for the app image content. + * The hash is verified before returning, if app content is invalid then the function returns ESP_ERR_IMAGE_INVALID. + * For apps without SHA-256 appended to the image, the result is the SHA-256 of all bytes in the app image. + * For other partition types, the result is the SHA-256 of the entire partition. + * + * @param[in] partition Pointer to info for partition containing app or data. (fields: address, size and type, are required to be filled). + * @param[out] sha_256 Returned SHA-256 digest for a given partition. + * + * @return + * - ESP_OK: In case of successful operation. + * - ESP_ERR_INVALID_ARG: The size was 0 or the sha_256 was NULL. + * - ESP_ERR_NO_MEM: Cannot allocate memory for sha256 operation. + * - ESP_ERR_IMAGE_INVALID: App partition doesn't contain a valid app image. + * - ESP_FAIL: An allocation error occurred. + */ +esp_err_t esp_partition_get_sha256(const esp_partition_t *partition, uint8_t *sha_256); + +/** + * @brief Check for the identity of two partitions by SHA-256 digest. + * + * @param[in] partition_1 Pointer to info for partition 1 containing app or data. (fields: address, size and type, are required to be filled). + * @param[in] partition_2 Pointer to info for partition 2 containing app or data. (fields: address, size and type, are required to be filled). + * + * @return + * - True: In case of the two firmware is equal. + * - False: Otherwise + */ +bool esp_partition_check_identity(const esp_partition_t *partition_1, const esp_partition_t *partition_2); + +/** + * @brief Register a partition on an external flash chip + * + * This API allows designating certain areas of external flash chips (identified by the esp_flash_t structure) + * as partitions. This allows using them with components which access SPI flash through the esp_partition API. + * + * @param flash_chip Pointer to the structure identifying the flash chip + * @param offset Address in bytes, where the partition starts + * @param size Size of the partition in bytes + * @param label Partition name + * @param type One of the partition types (ESP_PARTITION_TYPE_*). Note that applications can not be booted from external flash + * chips, so using ESP_PARTITION_TYPE_APP is not supported. + * @param subtype One of the partition subtypes (ESP_PARTITION_SUBTYPE_*) + * @param[out] out_partition Output, if non-NULL, receives the pointer to the resulting esp_partition_t structure + * @return + * - ESP_OK on success + * - ESP_ERR_NOT_SUPPORTED if CONFIG_CONFIG_SPI_FLASH_USE_LEGACY_IMPL is enabled + * - ESP_ERR_NO_MEM if memory allocation has failed + * - ESP_ERR_INVALID_ARG if the new partition overlaps another partition on the same flash chip + * - ESP_ERR_INVALID_SIZE if the partition doesn't fit into the flash chip size + */ +esp_err_t esp_partition_register_external(esp_flash_t* flash_chip, size_t offset, size_t size, + const char* label, esp_partition_type_t type, esp_partition_subtype_t subtype, + const esp_partition_t** out_partition); + +/** + * @brief Deregister the partition previously registered using esp_partition_register_external + * @param partition pointer to the partition structure obtained from esp_partition_register_external, + * @return + * - ESP_OK on success + * - ESP_ERR_NOT_FOUND if the partition pointer is not found + * - ESP_ERR_INVALID_ARG if the partition comes from the partition table + * - ESP_ERR_INVALID_ARG if the partition was not registered using + * esp_partition_register_external function. + */ +esp_err_t esp_partition_deregister_external(const esp_partition_t* partition); + +#ifdef __cplusplus +} +#endif + + +#endif /* __ESP_PARTITION_H__ */ diff --git a/arch/xtensa/include/esp32/spi_flash/include/esp_spi_flash.h b/arch/xtensa/include/esp32/spi_flash/include/esp_spi_flash.h new file mode 100644 index 0000000000000..a1a233a6eebc8 --- /dev/null +++ b/arch/xtensa/include/esp32/spi_flash/include/esp_spi_flash.h @@ -0,0 +1,460 @@ +// 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. + +#ifndef ESP_SPI_FLASH_H +#define ESP_SPI_FLASH_H + +#include +#include +#include +#include "../../esp_common/esp_err.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define ESP_ERR_FLASH_OP_FAIL (ESP_ERR_FLASH_BASE + 1) +#define ESP_ERR_FLASH_OP_TIMEOUT (ESP_ERR_FLASH_BASE + 2) + +#define SPI_FLASH_SEC_SIZE 4096 /**< SPI Flash sector size */ + +#define SPI_FLASH_MMU_PAGE_SIZE 0x10000 /**< Flash cache MMU mapping page size */ + +typedef enum { + FLASH_WRAP_MODE_8B = 0, + FLASH_WRAP_MODE_16B = 2, + FLASH_WRAP_MODE_32B = 4, + FLASH_WRAP_MODE_64B = 6, + FLASH_WRAP_MODE_DISABLE = 1 +} spi_flash_wrap_mode_t; + +/** + * @brief set wrap mode of flash + * + * @param mode: wrap mode support disable, 16 32, 64 byte + * + * @return esp_err_t : ESP_OK for successful. + * + */ +esp_err_t spi_flash_wrap_set(spi_flash_wrap_mode_t mode); + +/** + * @brief Initialize SPI flash access driver + * + * This function must be called exactly once, before any other + * spi_flash_* functions are called. + * Currently this function is called from startup code. There is + * no need to call it from application code. + * + */ +void spi_flash_init(void); + +/** + * @brief Get flash chip size, as set in binary image header + * + * @note This value does not necessarily match real flash size. + * + * @return size of flash chip, in bytes + */ +size_t spi_flash_get_chip_size(void); + +/** + * @brief Erase the Flash sector. + * + * @param sector: Sector number, the count starts at sector 0, 4KB per sector. + * + * @return esp_err_t + */ +esp_err_t spi_flash_erase_sector(size_t sector); + +/** + * @brief Erase a range of flash sectors + * + * @param start_address Address where erase operation has to start. + * Must be 4kB-aligned + * @param size Size of erased range, in bytes. Must be divisible by 4kB. + * + * @return esp_err_t + */ +esp_err_t spi_flash_erase_range(size_t start_address, size_t size); + + +/** + * @brief Write data to Flash. + * + * @note For fastest write performance, write a 4 byte aligned size at a + * 4 byte aligned offset in flash from a source buffer in DRAM. Varying any of + * these parameters will still work, but will be slower due to buffering. + * + * @note Writing more than 8KB at a time will be split into multiple + * write operations to avoid disrupting other tasks in the system. + * + * @param dest_addr Destination address in Flash. + * @param src Pointer to the source buffer. + * @param size Length of data, in bytes. + * + * @return esp_err_t + */ +esp_err_t spi_flash_write(size_t dest_addr, const void *src, size_t size); + + +/** + * @brief Write data encrypted to Flash. + * + * @note Flash encryption must be enabled for this function to work. + * + * @note Flash encryption must be enabled when calling this function. + * If flash encryption is disabled, the function returns + * ESP_ERR_INVALID_STATE. Use esp_flash_encryption_enabled() + * function to determine if flash encryption is enabled. + * + * @note Both dest_addr and size must be multiples of 16 bytes. For + * absolute best performance, both dest_addr and size arguments should + * be multiples of 32 bytes. + * + * @param dest_addr Destination address in Flash. Must be a multiple of 16 bytes. + * @param src Pointer to the source buffer. + * @param size Length of data, in bytes. Must be a multiple of 16 bytes. + * + * @return esp_err_t + */ +esp_err_t spi_flash_write_encrypted(size_t dest_addr, const void *src, size_t size); + +/** + * @brief Read data from Flash. + * + * @note For fastest read performance, all parameters should be + * 4 byte aligned. If source address and read size are not 4 byte + * aligned, read may be split into multiple flash operations. If + * destination buffer is not 4 byte aligned, a temporary buffer will + * be allocated on the stack. + * + * @note Reading more than 16KB of data at a time will be split + * into multiple reads to avoid disruption to other tasks in the + * system. Consider using spi_flash_mmap() to read large amounts + * of data. + * + * @param src_addr source address of the data in Flash. + * @param dest pointer to the destination buffer + * @param size length of data + * + * + * @return esp_err_t + */ +esp_err_t spi_flash_read(size_t src_addr, void *dest, size_t size); + + +/** + * @brief Read data from Encrypted Flash. + * + * If flash encryption is enabled, this function will transparently decrypt data as it is read. + * If flash encryption is not enabled, this function behaves the same as spi_flash_read(). + * + * See esp_flash_encryption_enabled() for a function to check if flash encryption is enabled. + * + * @param src source address of the data in Flash. + * @param dest pointer to the destination buffer + * @param size length of data + * + * @return esp_err_t + */ +esp_err_t spi_flash_read_encrypted(size_t src, void *dest, size_t size); + +/** + * @brief Enumeration which specifies memory space requested in an mmap call + */ +typedef enum { + SPI_FLASH_MMAP_DATA, /**< map to data memory (Vaddr0), allows byte-aligned access, 4 MB total */ + SPI_FLASH_MMAP_INST, /**< map to instruction memory (Vaddr1-3), allows only 4-byte-aligned access, 11 MB total */ +} spi_flash_mmap_memory_t; + +/** + * @brief Opaque handle for memory region obtained from spi_flash_mmap. + */ +typedef uint32_t spi_flash_mmap_handle_t; + +/** + * @brief Map region of flash memory into data or instruction address space + * + * This function allocates sufficient number of 64kB MMU pages and configures + * them to map the requested region of flash memory into the address space. + * It may reuse MMU pages which already provide the required mapping. + * + * As with any allocator, if mmap/munmap are heavily used then the address space + * may become fragmented. To troubleshoot issues with page allocation, use + * spi_flash_mmap_dump() function. + * + * @param src_addr Physical address in flash where requested region starts. + * This address *must* be aligned to 64kB boundary + * (SPI_FLASH_MMU_PAGE_SIZE) + * @param size Size of region to be mapped. This size will be rounded + * up to a 64kB boundary + * @param memory Address space where the region should be mapped (data or instruction) + * @param[out] out_ptr Output, pointer to the mapped memory region + * @param[out] out_handle Output, handle which should be used for spi_flash_munmap call + * + * @return ESP_OK on success, ESP_ERR_NO_MEM if pages can not be allocated + */ +esp_err_t spi_flash_mmap(size_t src_addr, size_t size, spi_flash_mmap_memory_t memory, + const void** out_ptr, spi_flash_mmap_handle_t* out_handle); + +/** + * @brief Map sequences of pages of flash memory into data or instruction address space + * + * This function allocates sufficient number of 64kB MMU pages and configures + * them to map the indicated pages of flash memory contiguously into address space. + * In this respect, it works in a similar way as spi_flash_mmap() but it allows mapping + * a (maybe non-contiguous) set of pages into a contiguous region of memory. + * + * @param pages An array of numbers indicating the 64kB pages in flash to be mapped + * contiguously into memory. These indicate the indexes of the 64kB pages, + * not the byte-size addresses as used in other functions. + * Array must be located in internal memory. + * @param page_count Number of entries in the pages array + * @param memory Address space where the region should be mapped (instruction or data) + * @param[out] out_ptr Output, pointer to the mapped memory region + * @param[out] out_handle Output, handle which should be used for spi_flash_munmap call + * + * @return + * - ESP_OK on success + * - ESP_ERR_NO_MEM if pages can not be allocated + * - ESP_ERR_INVALID_ARG if pagecount is zero or pages array is not in + * internal memory + */ +esp_err_t spi_flash_mmap_pages(const int *pages, size_t page_count, spi_flash_mmap_memory_t memory, + const void** out_ptr, spi_flash_mmap_handle_t* out_handle); + + +/** + * @brief Release region previously obtained using spi_flash_mmap + * + * @note Calling this function will not necessarily unmap memory region. + * Region will only be unmapped when there are no other handles which + * reference this region. In case of partially overlapping regions + * it is possible that memory will be unmapped partially. + * + * @param handle Handle obtained from spi_flash_mmap + */ +void spi_flash_munmap(spi_flash_mmap_handle_t handle); + +/** + * @brief Display information about mapped regions + * + * This function lists handles obtained using spi_flash_mmap, along with range + * of pages allocated to each handle. It also lists all non-zero entries of + * MMU table and corresponding reference counts. + */ +void spi_flash_mmap_dump(void); + +/** + * @brief get free pages number which can be mmap + * + * This function will return number of free pages available in mmu table. This could be useful + * before calling actual spi_flash_mmap (maps flash range to DCache or ICache memory) to check + * if there is sufficient space available for mapping. + * + * @param memory memory type of MMU table free page + * + * @return number of free pages which can be mmaped + */ +uint32_t spi_flash_mmap_get_free_pages(spi_flash_mmap_memory_t memory); + + +#define SPI_FLASH_CACHE2PHYS_FAIL UINT32_MAX /*drv->set_read_mode(chip) in order to configure the chip's read mode correctly. + */ + esp_err_t (*read)(esp_flash_t *chip, void *buffer, uint32_t address, uint32_t length); + + /* Write any amount of data to the chip. + */ + esp_err_t (*write)(esp_flash_t *chip, const void *buffer, uint32_t address, uint32_t length); + + + /* Use the page program command to write data to the chip. + * + * This function is expected to be called by chip->drv->write (if the + * chip->drv->write implementation doesn't call it then it can be left as NULL.) + * + * - The length argument supplied to this function is at most 'page_size' bytes. + * + * - The region between 'address' and 'address + length' will not cross a page_size aligned boundary (the write + * implementation is expected to split such a write into two before calling page_program.) + */ + esp_err_t (*program_page)(esp_flash_t *chip, const void *buffer, uint32_t address, uint32_t length); + + /* Page size as written by the page_program function. Usually 256 bytes. */ + uint32_t page_size; + + /* Perform an encrypted write to the chip, using internal flash encryption hardware. */ + esp_err_t (*write_encrypted)(esp_flash_t *chip, const void *buffer, uint32_t address, uint32_t length); + + + /* Wait for the SPI flash chip to be idle (any write operation to be complete.) This function is both called from the higher-level API functions, and from other functions in this structure. + + timeout_ms should be a timeout (in milliseconds) before the function returns ESP_ERR_TIMEOUT. This is useful to avoid hanging + if the chip is otherwise unresponsive (ie returns all 0xFF or similar.) + */ + esp_err_t (*wait_idle)(esp_flash_t *chip, unsigned timeout_ms); + + /* Configure both the SPI host and the chip for the read mode specified in chip->read_mode. + * + * This function is called by the higher-level API before the 'read' function is called. + * + * Can return ESP_ERR_FLASH_UNSUPPORTED_HOST or ESP_ERR_FLASH_UNSUPPORTED_CHIP if the specified mode is unsupported. + */ + esp_err_t (*set_io_mode)(esp_flash_t *chip); + + /* + * Get whether the Quad Enable (QE) is set. (*out_io_mode)=SPI_FLASH_QOUT if + * enabled, otherwise disabled + */ + esp_err_t (*get_io_mode)(esp_flash_t *chip, esp_flash_io_mode_t* out_io_mode); +}; + +/* Pointer to an array of pointers to all known drivers for flash chips. This array is used + by esp_flash_init() to detect the flash chip driver, if none is supplied by the caller. + + Array is terminated with a NULL pointer. + + This pointer can be overwritten with a pointer to a new array, to update the list of known flash chips. + */ +extern const spi_flash_chip_t **esp_flash_registered_chips; diff --git a/arch/xtensa/include/esp32/spi_flash/include/spi_flash_chip_gd.h b/arch/xtensa/include/esp32/spi_flash/include/spi_flash_chip_gd.h new file mode 100644 index 0000000000000..0d52435a38007 --- /dev/null +++ b/arch/xtensa/include/esp32/spi_flash/include/spi_flash_chip_gd.h @@ -0,0 +1,32 @@ +// 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. + +#pragma once + +#include +#include "esp_flash.h" +#include "spi_flash_chip_driver.h" + + +/** + * GD (GigaDevice) SPI flash chip_drv, uses all the above functions for its operations. In + * default autodetection, this is used as a catchall if a more specific chip_drv + * is not found. + * + * Note that this is for GD chips with product ID 40H (GD25Q) and 60H (GD25LQ). The chip diver uses + * different commands to write the SR2 register according to the chip ID. For GD25Q40 - GD25Q16 + * chips, and GD25LQ chips, WRSR (01H) command is used; while WRSR2 (31H) is used for GD25Q32 - + * GD25Q127 chips. + */ +extern const spi_flash_chip_t esp_flash_chip_gd; diff --git a/arch/xtensa/include/esp32/spi_flash/include/spi_flash_chip_generic.h b/arch/xtensa/include/esp32/spi_flash/include/spi_flash_chip_generic.h new file mode 100644 index 0000000000000..36dd3cb89eaa8 --- /dev/null +++ b/arch/xtensa/include/esp32/spi_flash/include/spi_flash_chip_generic.h @@ -0,0 +1,370 @@ +// 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. + +#pragma once + +#include +#include "esp_flash.h" +#include "spi_flash_chip_driver.h" + + +/* + * The 'chip_generic' SPI flash operations are a lowest common subset of SPI + * flash commands, that work across most chips. + * + * These can be used as-is via the esp_flash_common_chip_driver chip_drv, or + * they can be used as "base chip_drv" functions when creating a new + * spi_flash_host_driver_t chip_drv structure. + * + * All of the functions in this header are internal functions, not part of a + * public API. See esp_flash.h for the public API. + */ + +/** + * @brief Generic probe function + * + * @param chip Pointer to SPI flash chip to use. If NULL, esp_flash_default_chip is substituted. + * @param flash_id expected manufacture id. + * + * @return ESP_OK if the id read from chip->drv_read_id matches (always). + */ +esp_err_t spi_flash_chip_generic_probe(esp_flash_t *chip, uint32_t flash_id); + +/** + * @brief Generic reset function + * + * @param chip Pointer to SPI flash chip to use. If NULL, esp_flash_default_chip is substituted. + * + * @return ESP_OK if sending success, or error code passed from ``common_command`` or ``wait_idle`` functions of host driver. + */ +esp_err_t spi_flash_chip_generic_reset(esp_flash_t *chip); + +/** + * @brief Generic size detection function + * + * Tries to detect the size of chip by using the lower 4 bits of the chip->drv->read_id result = N, and assuming size is 2 ^ N. + * + * @param chip Pointer to SPI flash chip to use. If NULL, esp_flash_default_chip is substituted. + * @param size Output of the detected size + * + * @return + * - ESP_OK if success + * - ESP_ERR_FLASH_UNSUPPORTED_CHIP if the manufacturer id is not correct, which may means an error in the reading + * - or other error passed from the ``read_id`` function of host driver + */ +esp_err_t spi_flash_chip_generic_detect_size(esp_flash_t *chip, uint32_t *size); + +/** + * @brief Erase chip by using the generic erase chip command. + * + * @param chip Pointer to SPI flash chip to use. If NULL, esp_flash_default_chip is substituted. + * + * @return + * - ESP_OK if success + * - or other error passed from the ``set_write_protect``, ``wait_idle`` or ``erase_chip`` function of host driver + */ +esp_err_t spi_flash_chip_generic_erase_chip(esp_flash_t *chip); + +/** + * @brief Erase sector by using the generic sector erase command. + * + * @param chip Pointer to SPI flash chip to use. If NULL, esp_flash_default_chip is substituted. + * @param start_address Start address of the sector to erase + * + * @return + * - ESP_OK if success + * - or other error passed from the ``set_write_protect``, ``wait_idle`` or ``erase_sector`` function of host driver + */ +esp_err_t spi_flash_chip_generic_erase_sector(esp_flash_t *chip, uint32_t start_address); + +/** + * @brief Erase block by the generic 64KB block erase command + * + * @param chip Pointer to SPI flash chip to use. If NULL, esp_flash_default_chip is substituted. + * @param start_address Start address of the block to erase + * + * @return + * - ESP_OK if success + * - or other error passed from the ``set_write_protect``, ``wait_idle`` or ``erase_block`` function of host driver + */ +esp_err_t spi_flash_chip_generic_erase_block(esp_flash_t *chip, uint32_t start_address); + +/** + * @brief Read from flash by using a read command that matches the programmed + * read mode. + * + * @param chip Pointer to SPI flash chip to use. If NULL, esp_flash_default_chip is substituted. + * @param buffer Buffer to hold the data read from flash + * @param address Start address of the data on the flash + * @param length Length to read + * + * @return always ESP_OK currently + */ +esp_err_t spi_flash_chip_generic_read(esp_flash_t *chip, void *buffer, uint32_t address, uint32_t length); + +/** + * @brief Perform a page program using the page program command. + * + * @note Length of each call should not excced the limitation in + * ``chip->host->max_write_bytes``. This function is called in + * ``spi_flash_chip_generic_write`` recursively until the whole page is + * programmed. Strongly suggest to call ``spi_flash_chip_generic_write`` + * instead. + * + * @param chip Pointer to SPI flash chip to use. If NULL, esp_flash_default_chip is substituted. + * @param buffer Buffer holding the data to program + * @param address Start address to write to flash + * @param length Length to write, no longer than ``chip->host->max_write_bytes``. + * + * @return + * - ESP_OK if success + * - or other error passed from the ``wait_idle`` or ``program_page`` function of host driver + */ +esp_err_t +spi_flash_chip_generic_page_program(esp_flash_t *chip, const void *buffer, uint32_t address, uint32_t length); + +/** + * @brief Perform a generic write. Split the write buffer into page program + * operations, and call chip->chip_drv->page-program() for each. + * + * @param chip Pointer to SPI flash chip to use. If NULL, esp_flash_default_chip is substituted. + * @param buffer Buffer holding the data to program + * @param address Start address to write to flash + * @param length Length to write + * + * @return + * - ESP_OK if success + * - or other error passed from the ``wait_idle`` or ``program_page`` function of host driver + */ +esp_err_t spi_flash_chip_generic_write(esp_flash_t *chip, const void *buffer, uint32_t address, uint32_t length); + +/** + * @brief Perform a write using on-chip flash encryption. Not implemented yet. + * + * @param chip Pointer to SPI flash chip to use. If NULL, esp_flash_default_chip is substituted. + * @param buffer Buffer holding the data to program + * @param address Start address to write to flash + * @param length Length to write + * + * @return always ESP_ERR_FLASH_UNSUPPORTED_HOST. + */ +esp_err_t +spi_flash_chip_generic_write_encrypted(esp_flash_t *chip, const void *buffer, uint32_t address, uint32_t length); + +/** + * @brief Send the write enable or write disable command and verify the expected bit (1) in + * the status register is set. + * + * @param chip Pointer to SPI flash chip to use. If NULL, esp_flash_default_chip is substituted. + * @param write_protect true to enable write protection, false to send write enable. + * + * @return + * - ESP_OK if success + * - or other error passed from the ``wait_idle``, ``read_status`` or + * ``set_write_protect`` function of host driver + */ +esp_err_t spi_flash_chip_generic_set_write_protect(esp_flash_t *chip, bool write_protect); + +/** + * @brief Check whether WEL (write enable latch) bit is set in the Status Register read from RDSR. + * + * @param chip Pointer to SPI flash chip to use. If NULL, esp_flash_default_chip is substituted. + * @param out_write_protect Output of whether the write protect is set. + * + * @return + * - ESP_OK if success + * - or other error passed from the ``read_status`` function of host driver + */ +esp_err_t spi_flash_chip_generic_get_write_protect(esp_flash_t *chip, bool *out_write_protect); + +/** + * @brief Read flash status via the RDSR command and wait for bit 0 (write in + * progress bit) to be cleared. + * + * @param chip Pointer to SPI flash chip to use. If NULL, esp_flash_default_chip is substituted. + * @param timeout_ms Time to wait before timeout, in ms. + * + * @return + * - ESP_OK if success + * - ESP_ERR_TIMEOUT if not idle before timeout + * - or other error passed from the ``wait_idle`` or ``read_status`` function of host driver + */ +esp_err_t spi_flash_chip_generic_wait_idle(esp_flash_t *chip, uint32_t timeout_ms); + +/** + * @brief Set the specified SPI read mode according to the data in the chip + * context. Set quad enable status register bit if needed. + * + * @param chip Pointer to SPI flash chip to use. If NULL, esp_flash_default_chip is substituted. + * + * @return + * - ESP_OK if success +* - ESP_ERR_TIMEOUT if not idle before timeout + * - or other error passed from the ``set_write_protect`` or ``common_command`` function of host driver + */ +esp_err_t spi_flash_chip_generic_set_io_mode(esp_flash_t *chip); + +/** + * Get whether the Quad Enable (QE) is set. + * + * @param chip Pointer to SPI flash chip to use. If NULL, esp_flash_default_chip is substituted. + * @param out_quad_mode Pointer to store the output mode. + * - SPI_FLASH_QOUT: QE is enabled + * - otherwise: QE is disabled + * + * @return + * - ESP_OK if success + * - or other error passed from the ``common_command`` function of host driver + */ +esp_err_t spi_flash_chip_generic_get_io_mode(esp_flash_t *chip, esp_flash_io_mode_t* out_quad_mode); + +/** + * Generic SPI flash chip_drv, uses all the above functions for its operations. + * In default autodetection, this is used as a catchall if a more specific + * chip_drv is not found. + */ +extern const spi_flash_chip_t esp_flash_chip_generic; + +/******************************************************************************* + * Utilities +*******************************************************************************/ + +/** + * @brief Wait for the SPI host hardware state machine to be idle. + * + * This isn't a flash chip_drv operation, but it's called by + * spi_flash_chip_generic_wait_idle() and may be useful when implementing + * alternative drivers. + * + * timeout_ms will be decremented if the function needs to wait until the host hardware is idle. + * + * @param chip Pointer to SPI flash chip to use. If NULL, esp_flash_default_chip is substituted. + * + * @return + * - ESP_OK if success + * - ESP_ERR_TIMEOUT if not idle before timeout + * - or other error passed from the ``set_write_protect`` or ``common_command`` function of host driver + */ +esp_err_t spi_flash_generic_wait_host_idle(esp_flash_t *chip, uint32_t *timeout_ms); + +/// Function pointer type for reading status register with QE bit. +typedef esp_err_t (*esp_flash_rdsr_func_t)(esp_flash_t* chip, uint32_t* out_sr); + +/** + * Use RDSR2 (35H) to read bit 15-8 of the SR, and RDSR (05H) to read bit 7-0. + * + * @param chip Pointer to SPI flash chip to use. + * @param out_sr Pointer to buffer to hold the status register, 16 bits. + * + * @return ESP_OK if success, otherwise error code passed from the + * `common_command` function of the host driver. + */ +esp_err_t spi_flash_common_read_status_16b_rdsr_rdsr2(esp_flash_t* chip, uint32_t* out_sr); + +/** + * Use RDSR2 (35H) to read bit 15-8 of the SR. + * + * @param chip Pointer to SPI flash chip to use. + * @param out_sr Pointer to buffer to hold the status register, 8 bits. + * + * @return ESP_OK if success, otherwise error code passed from the + * `common_command` function of the host driver. + */ +esp_err_t spi_flash_common_read_status_8b_rdsr2(esp_flash_t* chip, uint32_t* out_sr); + +/** + * Use RDSR (05H) to read bit 7-0 of the SR. + * + * @param chip Pointer to SPI flash chip to use. + * @param out_sr Pointer to buffer to hold the status register, 8 bits. + * + * @return ESP_OK if success, otherwise error code passed from the + * `common_command` function of the host driver. + */ +esp_err_t spi_flash_common_read_status_8b_rdsr(esp_flash_t* chip, uint32_t* out_sr); + +/// Function pointer type for writing status register with QE bit. +typedef esp_err_t (*esp_flash_wrsr_func_t)(esp_flash_t* chip, uint32_t sr); + +/** + * Use WRSR (01H) to write bit 7-0 of the SR. + * + * @param chip Pointer to SPI flash chip to use. + * @param sr Value of the status register to write, 8 bits. + * + * @return ESP_OK if success, otherwise error code passed from the + * `common_command` function of the host driver. + */ +esp_err_t spi_flash_common_write_status_8b_wrsr(esp_flash_t* chip, uint32_t sr); + +/** + * Use WRSR (01H) to write bit 15-0 of the SR. + * + * @param chip Pointer to SPI flash chip to use. + * @param sr Value of the status register to write, 16 bits. + * + * @return ESP_OK if success, otherwise error code passed from the + * `common_command` function of the host driver. + */ +esp_err_t spi_flash_common_write_status_16b_wrsr(esp_flash_t* chip, uint32_t sr); + +/** + * Use WRSR2 (31H) to write bit 15-8 of the SR. + * + * @param chip Pointer to SPI flash chip to use. + * @param sr Value of the status register to write, 8 bits. + * + * @return ESP_OK if success, otherwise error code passed from the + * `common_command` function of the host driver. + */ +esp_err_t spi_flash_common_write_status_8b_wrsr2(esp_flash_t* chip, uint32_t sr); + +/** + * @brief Utility function for set_read_mode chip_drv function. If required, + * set and check the QE bit in the flash chip to enable the QIO/QOUT mode. + * + * Most chip QE enable follows a common pattern, though commands to read/write + * the status register may be different, as well as the position of QE bit. + * + * Registers to actually do Quad transtions and command to be sent in reading + * should also be configured via + * spi_flash_chip_generic_config_host_io_mode(). + * + * Note that the bit length and qe position of wrsr_func, rdsr_func and + * qe_sr_bit should be consistent. + * + * @param chip Pointer to SPI flash chip to use. + * @param wrsr_func Function pointer for writing the status register + * @param rdsr_func Function pointer for reading the status register + * @param qe_sr_bit status with the qe bit only. + * + * @return always ESP_OK (currently). + */ +esp_err_t spi_flash_common_set_io_mode(esp_flash_t *chip, esp_flash_wrsr_func_t wrsr_func, esp_flash_rdsr_func_t rdsr_func, uint32_t qe_sr_bit); + +/** + * @brief Configure the host registers to use the specified read mode set in + * the ``chip->read_mode``. + * + * Usually called in chip_drv read() functions before actual reading + * transactions. Also prepare the command to be sent in read functions. + * + * @param chip Pointer to SPI flash chip to use. If NULL, esp_flash_default_chip is substituted. + * + * @return + * - ESP_OK if success + * - ESP_ERR_FLASH_NOT_INITIALISED if chip not initialized properly + * - or other error passed from the ``configure_host_mode`` function of host driver + */ +esp_err_t spi_flash_chip_generic_config_host_io_mode(esp_flash_t *chip); diff --git a/arch/xtensa/include/esp32/spi_flash/include/spi_flash_chip_issi.h b/arch/xtensa/include/esp32/spi_flash/include/spi_flash_chip_issi.h new file mode 100644 index 0000000000000..2b1d411552e5c --- /dev/null +++ b/arch/xtensa/include/esp32/spi_flash/include/spi_flash_chip_issi.h @@ -0,0 +1,27 @@ +// 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. + +#pragma once + +#include +#include "esp_flash.h" +#include "spi_flash_chip_driver.h" + + +/** + * ISSI SPI flash chip_drv, uses all the above functions for its operations. In + * default autodetection, this is used as a catchall if a more specific chip_drv + * is not found. + */ +extern const spi_flash_chip_t esp_flash_chip_issi; diff --git a/arch/xtensa/include/esp32/spi_flash/private_include/spi_flash_defs.h b/arch/xtensa/include/esp32/spi_flash/private_include/spi_flash_defs.h new file mode 100644 index 0000000000000..cd2e77fbb5beb --- /dev/null +++ b/arch/xtensa/include/esp32/spi_flash/private_include/spi_flash_defs.h @@ -0,0 +1,43 @@ +// 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. + +#pragma once + +/* SPI commands (actual on-wire commands not SPI controller bitmasks) + Suitable for use with spi_flash_hal_common_command static function. +*/ +#define CMD_RDID 0x9F +#define CMD_WRSR 0x01 +#define SR_WIP (1<<0) /* Status register write-in-progress bit */ +#define SR_WREN (1<<1) /* Status register write enable bit */ +#define CMD_WRSR2 0x31 /* Not all SPI flash uses this command */ +#define CMD_WREN 0x06 +#define CMD_WRDI 0x04 +#define CMD_RDSR 0x05 +#define CMD_RDSR2 0x35 /* Not all SPI flash uses this command */ + +#define CMD_FASTRD_QIO 0xEB +#define CMD_FASTRD_QUAD 0x6B +#define CMD_FASTRD_DIO 0xBB +#define CMD_FASTRD_DUAL 0x3B +#define CMD_FASTRD 0x0B +#define CMD_READ 0x03 /* Speed limited */ + +#define CMD_CHIP_ERASE 0xC7 +#define CMD_SECTOR_ERASE 0x20 +#define CMD_LARGE_BLOCK_ERASE 0xD8 /* 64KB block erase command */ +#define CMD_PROGRAM_PAGE 0x02 + +#define CMD_RST_EN 0x66 +#define CMD_RST_DEV 0x99 diff --git a/arch/xtensa/include/esp32/wpa_supplicant/include/esp_supplicant/esp_wpa.h b/arch/xtensa/include/esp32/wpa_supplicant/include/esp_supplicant/esp_wpa.h new file mode 100644 index 0000000000000..202c907d60c3f --- /dev/null +++ b/arch/xtensa/include/esp32/wpa_supplicant/include/esp_supplicant/esp_wpa.h @@ -0,0 +1,79 @@ +// 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. + +#ifndef __ESP_WPA_H__ +#define __ESP_WPA_H__ + +#include +#include +#include "esp_err.h" +#include "esp_wifi_crypto_types.h" +#include "esp_wifi_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup WiFi_APIs WiFi Related APIs + * @brief WiFi APIs + */ + +/** @addtogroup WiFi_APIs + * @{ + */ + +/** \defgroup WPA_APIs WPS APIs + * @brief ESP32 Supplicant APIs + * + */ + +/** @addtogroup WPA_APIs + * @{ + */ +/* Crypto callback functions */ +const wpa_crypto_funcs_t g_wifi_default_wpa_crypto_funcs; +/* Mesh crypto callback functions */ +const mesh_crypto_funcs_t g_wifi_default_mesh_crypto_funcs; + +/** + * @brief Supplicant initialization + * + * @return + * - ESP_OK : succeed + * - ESP_ERR_NO_MEM : out of memory + */ +esp_err_t esp_supplicant_init(void); + +/** + * @brief Supplicant deinitialization + * + * @return + * - ESP_OK : succeed + * - others: failed + */ +esp_err_t esp_supplicant_deinit(void); + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __ESP_WPA_H__ */ diff --git a/arch/xtensa/include/esp32/wpa_supplicant/include/esp_supplicant/esp_wpa2.h b/arch/xtensa/include/esp32/wpa_supplicant/include/esp_supplicant/esp_wpa2.h new file mode 100644 index 0000000000000..5315606598fc0 --- /dev/null +++ b/arch/xtensa/include/esp32/wpa_supplicant/include/esp_supplicant/esp_wpa2.h @@ -0,0 +1,197 @@ +// Hardware crypto support 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. + +#ifndef _ESP_WPA2_H +#define _ESP_WPA2_H + +#include + +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Enable wpa2 enterprise authentication. + * + * @attention 1. wpa2 enterprise authentication can only be used when ESP32 station is enabled. + * @attention 2. wpa2 enterprise authentication can only support TLS, PEAP-MSCHAPv2 and TTLS-MSCHAPv2 method. + * + * @return + * - ESP_OK: succeed. + * - ESP_ERR_NO_MEM: fail(internal memory malloc fail) + */ +esp_err_t esp_wifi_sta_wpa2_ent_enable(void); + +/** + * @brief Disable wpa2 enterprise authentication. + * + * @attention 1. wpa2 enterprise authentication can only be used when ESP32 station is enabled. + * @attention 2. wpa2 enterprise authentication can only support TLS, PEAP-MSCHAPv2 and TTLS-MSCHAPv2 method. + * + * @return + * - ESP_OK: succeed. + */ +esp_err_t esp_wifi_sta_wpa2_ent_disable(void); + +/** + * @brief Set identity for PEAP/TTLS method. + * + * @attention The API only passes the parameter identity to the global pointer variable in wpa2 enterprise module. + * + * @param identity: point to address where stores the identity; + * @param len: length of identity, limited to 1~127 + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_INVALID_ARG: fail(len <= 0 or len >= 128) + * - ESP_ERR_NO_MEM: fail(internal memory malloc fail) + */ +esp_err_t esp_wifi_sta_wpa2_ent_set_identity(const unsigned char *identity, int len); + +/** + * @brief Clear identity for PEAP/TTLS method. + */ +void esp_wifi_sta_wpa2_ent_clear_identity(void); + +/** + * @brief Set username for PEAP/TTLS method. + * + * @attention The API only passes the parameter username to the global pointer variable in wpa2 enterprise module. + * + * @param username: point to address where stores the username; + * @param len: length of username, limited to 1~127 + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_INVALID_ARG: fail(len <= 0 or len >= 128) + * - ESP_ERR_NO_MEM: fail(internal memory malloc fail) + */ +esp_err_t esp_wifi_sta_wpa2_ent_set_username(const unsigned char *username, int len); + +/** + * @brief Clear username for PEAP/TTLS method. + */ +void esp_wifi_sta_wpa2_ent_clear_username(void); + +/** + * @brief Set password for PEAP/TTLS method.. + * + * @attention The API only passes the parameter password to the global pointer variable in wpa2 enterprise module. + * + * @param password: point to address where stores the password; + * @param len: length of password(len > 0) + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_INVALID_ARG: fail(len <= 0) + * - ESP_ERR_NO_MEM: fail(internal memory malloc fail) + */ +esp_err_t esp_wifi_sta_wpa2_ent_set_password(const unsigned char *password, int len); + +/** + * @brief Clear password for PEAP/TTLS method.. + */ +void esp_wifi_sta_wpa2_ent_clear_password(void); + +/** + * @brief Set new password for MSCHAPv2 method.. + * + * @attention 1. The API only passes the parameter password to the global pointer variable in wpa2 enterprise module. + * @attention 2. The new password is used to substitute the old password when eap-mschapv2 failure request message with error code ERROR_PASSWD_EXPIRED is received. + * + * @param new_password: point to address where stores the password; + * @param len: length of password + * + * @return + * - ESP_OK: succeed + * - ESP_ERR_INVALID_ARG: fail(len <= 0) + * - ESP_ERR_NO_MEM: fail(internal memory malloc fail) + */ + +esp_err_t esp_wifi_sta_wpa2_ent_set_new_password(const unsigned char *new_password, int len); + +/** + * @brief Clear new password for MSCHAPv2 method.. + */ +void esp_wifi_sta_wpa2_ent_clear_new_password(void); + +/** + * @brief Set CA certificate for PEAP/TTLS method. + * + * @attention 1. The API only passes the parameter ca_cert to the global pointer variable in wpa2 enterprise module. + * @attention 2. The ca_cert should be zero terminated. + * + * @param ca_cert: point to address where stores the CA certificate; + * @param ca_cert_len: length of ca_cert + * + * @return + * - ESP_OK: succeed + */ +esp_err_t esp_wifi_sta_wpa2_ent_set_ca_cert(const unsigned char *ca_cert, int ca_cert_len); + +/** + * @brief Clear CA certificate for PEAP/TTLS method. + */ +void esp_wifi_sta_wpa2_ent_clear_ca_cert(void); + +/** + * @brief Set client certificate and key. + * + * @attention 1. The API only passes the parameter client_cert, private_key and private_key_passwd to the global pointer variable in wpa2 enterprise module. + * @attention 2. The client_cert, private_key and private_key_passwd should be zero terminated. + * + * @param client_cert: point to address where stores the client certificate; + * @param client_cert_len: length of client certificate; + * @param private_key: point to address where stores the private key; + * @param private_key_len: length of private key, limited to 1~2048; + * @param private_key_password: point to address where stores the private key password; + * @param private_key_password_len: length of private key password; + * + * @return + * - ESP_OK: succeed + */ +esp_err_t esp_wifi_sta_wpa2_ent_set_cert_key(const unsigned char *client_cert, int client_cert_len, const unsigned char *private_key, int private_key_len, const unsigned char *private_key_passwd, int private_key_passwd_len); + +/** + * @brief Clear client certificate and key. + */ +void esp_wifi_sta_wpa2_ent_clear_cert_key(void); + +/** + * @brief Set wpa2 enterprise certs time check(disable or not). + * + * @param true: disable wpa2 enterprise certs time check + * @param false: enable wpa2 enterprise certs time check + * + * @return + * - ESP_OK: succeed + */ +esp_err_t esp_wifi_sta_wpa2_ent_set_disable_time_check(bool disable); + +/** + * @brief Get wpa2 enterprise certs time check(disable or not). + * + * @param disable: store disable value + * + * @return + * - ESP_OK: succeed + */ +esp_err_t esp_wifi_sta_wpa2_ent_get_disable_time_check(bool *disable); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/arch/xtensa/include/esp32/wpa_supplicant/include/esp_supplicant/esp_wps.h b/arch/xtensa/include/esp32/wpa_supplicant/include/esp_supplicant/esp_wps.h new file mode 100644 index 0000000000000..c06ae2e3689fc --- /dev/null +++ b/arch/xtensa/include/esp32/wpa_supplicant/include/esp_supplicant/esp_wps.h @@ -0,0 +1,147 @@ +// 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. + +#ifndef __ESP_WPS_H__ +#define __ESP_WPS_H__ + +#include +#include +#include "esp_err.h" +#include "esp_wifi_crypto_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup WiFi_APIs WiFi Related APIs + * @brief WiFi APIs + */ + +/** @addtogroup WiFi_APIs + * @{ + */ + +/** \defgroup WPS_APIs WPS APIs + * @brief ESP32 WPS APIs + * + * WPS can only be used when ESP32 station is enabled. + * + */ + +/** @addtogroup WPS_APIs + * @{ + */ + +#define ESP_ERR_WIFI_REGISTRAR (ESP_ERR_WIFI_BASE + 51) /*!< WPS registrar is not supported */ +#define ESP_ERR_WIFI_WPS_TYPE (ESP_ERR_WIFI_BASE + 52) /*!< WPS type error */ +#define ESP_ERR_WIFI_WPS_SM (ESP_ERR_WIFI_BASE + 53) /*!< WPS state machine is not initialized */ + +typedef enum wps_type { + WPS_TYPE_DISABLE = 0, + WPS_TYPE_PBC, + WPS_TYPE_PIN, + WPS_TYPE_MAX, +} wps_type_t; + +#define WPS_MAX_MANUFACTURER_LEN 65 +#define WPS_MAX_MODEL_NUMBER_LEN 33 +#define WPS_MAX_MODEL_NAME_LEN 33 +#define WPS_MAX_DEVICE_NAME_LEN 33 + +typedef struct { + char manufacturer[WPS_MAX_MANUFACTURER_LEN]; /*!< Manufacturer, null-terminated string. The default manufcturer is used if the string is empty */ + char model_number[WPS_MAX_MODEL_NUMBER_LEN]; /*!< Model number, null-terminated string. The default model number is used if the string is empty */ + char model_name[WPS_MAX_MODEL_NAME_LEN]; /*!< Model name, null-terminated string. The default model name is used if the string is empty */ + char device_name[WPS_MAX_DEVICE_NAME_LEN]; /*!< Device name, null-terminated string. The default device name is used if the string is empty */ +} wps_factory_information_t; + +typedef struct { + wps_type_t wps_type; + wps_factory_information_t factory_info; +} esp_wps_config_t; + +/* C & C++ compilers have different rules about C99-style named initializers */ +#ifdef __cplusplus +#define WPS_AGG(X) { X } +#else +#define WPS_AGG(X) X +#endif + +#define WPS_CONFIG_INIT_DEFAULT(type) { \ + .wps_type = type, \ + .factory_info = { \ + WPS_AGG( .manufacturer = "ESPRESSIF" ), \ + WPS_AGG( .model_number = "ESP32" ), \ + WPS_AGG( .model_name = "ESPRESSIF IOT" ), \ + WPS_AGG( .device_name = "ESP STATION" ), \ + } \ +} + +/** + * @brief Enable Wi-Fi WPS function. + * + * @attention WPS can only be used when ESP32 station is enabled. + * + * @param wps_type_t wps_type : WPS type, so far only WPS_TYPE_PBC and WPS_TYPE_PIN is supported + * + * @return + * - ESP_OK : succeed + * - ESP_ERR_WIFI_WPS_TYPE : wps type is invalid + * - ESP_ERR_WIFI_WPS_MODE : wifi is not in station mode or sniffer mode is on + * - ESP_FAIL : wps initialization fails + */ +esp_err_t esp_wifi_wps_enable(const esp_wps_config_t *config); + +/** + * @brief Disable Wi-Fi WPS function and release resource it taken. + * + * @param null + * + * @return + * - ESP_OK : succeed + * - ESP_ERR_WIFI_WPS_MODE : wifi is not in station mode or sniffer mode is on + */ +esp_err_t esp_wifi_wps_disable(void); + +/** + * @brief WPS starts to work. + * + * @attention WPS can only be used when ESP32 station is enabled. + * + * @param timeout_ms : maximum blocking time before API return. + * - 0 : non-blocking + * - 1~120000 : blocking time (not supported in IDF v1.0) + * + * @return + * - ESP_OK : succeed + * - ESP_ERR_WIFI_WPS_TYPE : wps type is invalid + * - ESP_ERR_WIFI_WPS_MODE : wifi is not in station mode or sniffer mode is on + * - ESP_ERR_WIFI_WPS_SM : wps state machine is not initialized + * - ESP_FAIL : wps initialization fails + */ +esp_err_t esp_wifi_wps_start(int timeout_ms); + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __ESP_WPS_H__ */ diff --git a/arch/xtensa/include/esp32/wpa_supplicant/include/utils/wpa_debug.h b/arch/xtensa/include/esp32/wpa_supplicant/include/utils/wpa_debug.h new file mode 100644 index 0000000000000..b204ec7d87abc --- /dev/null +++ b/arch/xtensa/include/esp32/wpa_supplicant/include/utils/wpa_debug.h @@ -0,0 +1,208 @@ +/* + * wpa_supplicant/hostapd / Debug prints + * Copyright (c) 2002-2007, 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. + */ + +#ifndef WPA_DEBUG_H +#define WPA_DEBUG_H + +#include "wpabuf.h" +#include "esp_log.h" + +#ifdef ESPRESSIF_USE + +#define TAG "wpa" + +#define MSG_ERROR ESP_LOG_ERROR +#define MSG_WARNING ESP_LOG_WARN +#define MSG_INFO ESP_LOG_INFO +#define MSG_DEBUG ESP_LOG_DEBUG +#define MSG_MSGDUMP ESP_LOG_VERBOSE + +#else +enum { MSG_MSGDUMP, MSG_DEBUG, MSG_INFO, MSG_WARNING, MSG_ERROR }; +#endif + +/** EAP authentication completed successfully */ +#define WPA_EVENT_EAP_SUCCESS "CTRL-EVENT-EAP-SUCCESS " + +int wpa_debug_open_file(const char *path); +void wpa_debug_close_file(void); + +/** + * wpa_debug_printf_timestamp - Print timestamp for debug output + * + * This function prints a timestamp in seconds_from_1970.microsoconds + * format if debug output has been configured to include timestamps in debug + * messages. + */ +void wpa_debug_print_timestamp(void); + +/** + * wpa_printf - conditional printf + * @level: priority level (MSG_*) of the message + * @fmt: printf format string, followed by optional arguments + * + * This function is used to print conditional debugging and error messages. The + * output may be directed to stdout, stderr, and/or syslog based on + * configuration. + * + * Note: New line '\n' is added to the end of the text when printing to stdout. + */ +#define DEBUG_PRINT +#define MSG_PRINT + +/** + * wpa_hexdump - conditional hex dump + * @level: priority level (MSG_*) of the message + * @title: title of for the message + * @buf: data buffer to be dumped + * @len: length of the buf + * + * This function is used to print conditional debugging and error messages. The + * output may be directed to stdout, stderr, and/or syslog based on + * configuration. The contents of buf is printed out has hex dump. + */ +#ifdef DEBUG_PRINT +#define wpa_printf(level,fmt, args...) ESP_LOG_LEVEL_LOCAL(level, TAG, fmt, ##args) + +void wpa_dump_mem(char* desc, uint8_t *addr, uint16_t len); +static inline void wpa_hexdump_ascii(int level, const char *title, const u8 *buf, size_t len) +{ + +} + +static inline void wpa_hexdump_ascii_key(int level, const char *title, const u8 *buf, size_t len) +{ +} + + +void wpa_hexdump(int level, const char *title, const u8 *buf, size_t len); + +static inline void wpa_hexdump_buf(int level, const char *title, + const struct wpabuf *buf) +{ + wpa_hexdump(level, title, wpabuf_head(buf), wpabuf_len(buf)); +} + +/** + * wpa_hexdump_key - conditional hex dump, hide keys + * @level: priority level (MSG_*) of the message + * @title: title of for the message + * @buf: data buffer to be dumped + * @len: length of the buf + * + * This function is used to print conditional debugging and error messages. The + * output may be directed to stdout, stderr, and/or syslog based on + * configuration. The contents of buf is printed out has hex dump. This works + * like wpa_hexdump(), but by default, does not include secret keys (passwords, + * etc.) in debug output. + */ +void wpa_hexdump_key(int level, const char *title, const u8 *buf, size_t len); + + +static inline void wpa_hexdump_buf_key(int level, const char *title, + const struct wpabuf *buf) +{ + wpa_hexdump_key(level, title, wpabuf_head(buf), wpabuf_len(buf)); +} + +/** + * wpa_hexdump_ascii - conditional hex dump + * @level: priority level (MSG_*) of the message + * @title: title of for the message + * @buf: data buffer to be dumped + * @len: length of the buf + * + * This function is used to print conditional debugging and error messages. The + * output may be directed to stdout, stderr, and/or syslog based on + * configuration. The contents of buf is printed out has hex dump with both + * the hex numbers and ASCII characters (for printable range) are shown. 16 + * bytes per line will be shown. + */ +void wpa_hexdump_ascii(int level, const char *title, const u8 *buf, + size_t len); + +/** + * wpa_hexdump_ascii_key - conditional hex dump, hide keys + * @level: priority level (MSG_*) of the message + * @title: title of for the message + * @buf: data buffer to be dumped + * @len: length of the buf + * + * This function is used to print conditional debugging and error messages. The + * output may be directed to stdout, stderr, and/or syslog based on + * configuration. The contents of buf is printed out has hex dump with both + * the hex numbers and ASCII characters (for printable range) are shown. 16 + * bytes per line will be shown. This works like wpa_hexdump_ascii(), but by + * default, does not include secret keys (passwords, etc.) in debug output. + */ +void wpa_hexdump_ascii_key(int level, const char *title, const u8 *buf, + size_t len); +#else +#define wpa_printf(level,fmt, args...) +#define wpa_hexdump(...) +#define wpa_hexdump_buf(...) +#define wpa_hexdump_key(...) +#define wpa_hexdump_buf_key(...) +#define wpa_hexdump_ascii(...) +#define wpa_hexdump_ascii_key(...) +#endif + +#define wpa_auth_logger +#define wpa_auth_vlogger + +/** + * wpa_msg - Conditional printf for default target and ctrl_iface monitors + * @ctx: Pointer to context data; this is the ctx variable registered + * with struct wpa_driver_ops::init() + * @level: priority level (MSG_*) of the message + * @fmt: printf format string, followed by optional arguments + * + * This function is used to print conditional debugging and error messages. The + * output may be directed to stdout, stderr, and/or syslog based on + * configuration. This function is like wpa_printf(), but it also sends the + * same message to all attached ctrl_iface monitors. + * + * Note: New line '\n' is added to the end of the text when printing to stdout. + */ +void wpa_msg(void *ctx, int level, const char *fmt, ...) PRINTF_FORMAT(3, 4); + +/** + * wpa_msg_ctrl - Conditional printf for ctrl_iface monitors + * @ctx: Pointer to context data; this is the ctx variable registered + * with struct wpa_driver_ops::init() + * @level: priority level (MSG_*) of the message + * @fmt: printf format string, followed by optional arguments + * + * This function is used to print conditional debugging and error messages. + * This function is like wpa_msg(), but it sends the output only to the + * attached ctrl_iface monitors. In other words, it can be used for frequent + * events that do not need to be sent to syslog. + */ +void wpa_msg_ctrl(void *ctx, int level, const char *fmt, ...) +PRINTF_FORMAT(3, 4); + +typedef void (*wpa_msg_cb_func)(void *ctx, int level, const char *txt, + size_t len); + +typedef void (*eloop_timeout_handler)(void *eloop_data, void *user_ctx); + +int eloop_cancel_timeout(eloop_timeout_handler handler, + void *eloop_data, void *user_data); + +int eloop_register_timeout(unsigned int secs, unsigned int usecs, + eloop_timeout_handler handler, + void *eloop_data, void *user_data); + + +#endif /* WPA_DEBUG_H */ diff --git a/arch/xtensa/include/esp32/wpa_supplicant/include/utils/wpabuf.h b/arch/xtensa/include/esp32/wpa_supplicant/include/utils/wpabuf.h new file mode 100644 index 0000000000000..cccfcc80ef1a9 --- /dev/null +++ b/arch/xtensa/include/esp32/wpa_supplicant/include/utils/wpabuf.h @@ -0,0 +1,168 @@ +/* + * Dynamic data buffer + * Copyright (c) 2007-2009, 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. + */ + +#ifndef WPABUF_H +#define WPABUF_H + +/* + * Internal data structure for wpabuf. Please do not touch this directly from + * elsewhere. This is only defined in header file to allow inline functions + * from this file to access data. + */ +struct wpabuf { + size_t size; /* total size of the allocated buffer */ + size_t used; /* length of data in the buffer */ + u8 *ext_data; /* pointer to external data; NULL if data follows + * struct wpabuf */ + /* optionally followed by the allocated buffer */ +}; + + +int wpabuf_resize(struct wpabuf **buf, size_t add_len); +struct wpabuf * wpabuf_alloc(size_t len); +struct wpabuf * wpabuf_alloc_ext_data(u8 *data, size_t len); +struct wpabuf * wpabuf_alloc_copy(const void *data, size_t len); +struct wpabuf * wpabuf_dup(const struct wpabuf *src); +void wpabuf_free(struct wpabuf *buf); +void * wpabuf_put(struct wpabuf *buf, size_t len); +struct wpabuf * wpabuf_concat(struct wpabuf *a, struct wpabuf *b); +struct wpabuf * wpabuf_zeropad(struct wpabuf *buf, size_t len); +void wpabuf_printf(struct wpabuf *buf, char *fmt, ...) PRINTF_FORMAT(2, 3); + + +/** + * wpabuf_size - Get the currently allocated size of a wpabuf buffer + * @buf: wpabuf buffer + * Returns: Currently allocated size of the buffer + */ +static inline size_t wpabuf_size(const struct wpabuf *buf) +{ + return buf->size; +} + +/** + * wpabuf_len - Get the current length of a wpabuf buffer data + * @buf: wpabuf buffer + * Returns: Currently used length of the buffer + */ +static inline size_t wpabuf_len(const struct wpabuf *buf) +{ + return buf->used; +} + +/** + * wpabuf_tailroom - Get size of available tail room in the end of the buffer + * @buf: wpabuf buffer + * Returns: Tail room (in bytes) of available space in the end of the buffer + */ +static inline size_t wpabuf_tailroom(const struct wpabuf *buf) +{ + return buf->size - buf->used; +} + +/** + * wpabuf_head - Get pointer to the head of the buffer data + * @buf: wpabuf buffer + * Returns: Pointer to the head of the buffer data + */ +static inline const void * wpabuf_head(const struct wpabuf *buf) +{ + if (buf->ext_data) + return buf->ext_data; + return buf + 1; +} + +static inline const u8 * wpabuf_head_u8(const struct wpabuf *buf) +{ + return wpabuf_head(buf); +} + +/** + * wpabuf_mhead - Get modifiable pointer to the head of the buffer data + * @buf: wpabuf buffer + * Returns: Pointer to the head of the buffer data + */ +static inline void * wpabuf_mhead(struct wpabuf *buf) +{ + if (buf->ext_data) + return buf->ext_data; + return buf + 1; +} + +static inline u8 * wpabuf_mhead_u8(struct wpabuf *buf) +{ + return wpabuf_mhead(buf); +} + +static inline void wpabuf_put_u8(struct wpabuf *buf, u8 data) +{ + u8 *pos = wpabuf_put(buf, 1); + *pos = data; +} + +static inline void wpabuf_put_le16(struct wpabuf *buf, u16 data) +{ + u8 *pos = wpabuf_put(buf, 2); + WPA_PUT_LE16(pos, data); +} + +static inline void wpabuf_put_le32(struct wpabuf *buf, u32 data) +{ + u8 *pos = wpabuf_put(buf, 4); + WPA_PUT_LE32(pos, data); +} + +static inline void wpabuf_put_be16(struct wpabuf *buf, u16 data) +{ + u8 *pos = wpabuf_put(buf, 2); + WPA_PUT_BE16(pos, data); +} + +static inline void wpabuf_put_be24(struct wpabuf *buf, u32 data) +{ + u8 *pos = wpabuf_put(buf, 3); + WPA_PUT_BE24(pos, data); +} + +static inline void wpabuf_put_be32(struct wpabuf *buf, u32 data) +{ + u8 *pos = wpabuf_put(buf, 4); + WPA_PUT_BE32(pos, data); +} + +static inline void wpabuf_put_data(struct wpabuf *buf, const void *data, + size_t len) +{ + if (data) + os_memcpy(wpabuf_put(buf, len), data, len); +} + +static inline void wpabuf_put_buf(struct wpabuf *dst, + const struct wpabuf *src) +{ + wpabuf_put_data(dst, wpabuf_head(src), wpabuf_len(src)); +} + +static inline void wpabuf_set(struct wpabuf *buf, const void *data, size_t len) +{ + buf->ext_data = (u8 *) data; + buf->size = buf->used = len; +} + +static inline void wpabuf_put_str(struct wpabuf *dst, const char *str) +{ + wpabuf_put_data(dst, str, os_strlen(str)); +} + +#endif /* WPABUF_H */ diff --git a/arch/xtensa/include/esp32/wpa_supplicant/port/include/byteswap.h b/arch/xtensa/include/esp32/wpa_supplicant/port/include/byteswap.h new file mode 100644 index 0000000000000..d65503ba39194 --- /dev/null +++ b/arch/xtensa/include/esp32/wpa_supplicant/port/include/byteswap.h @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2010 Espressif System + */ + +#ifndef BYTESWAP_H +#define BYTESWAP_H + +#include + +/* Swap bytes in 16 bit value. */ +#ifndef __bswap_16 +#ifdef __GNUC__ +# define __bswap_16(x) \ + (__extension__ \ + ({ unsigned short int __bsx = (x); \ + ((((__bsx) >> 8) & 0xff) | (((__bsx) & 0xff) << 8)); })) +#else +static INLINE unsigned short int +__bswap_16 (unsigned short int __bsx) +{ + return ((((__bsx) >> 8) & 0xff) | (((__bsx) & 0xff) << 8)); +} +#endif +#endif // __bswap_16 + +/* Swap bytes in 32 bit value. */ +#ifndef __bswap_32 +#ifdef __GNUC__ +# define __bswap_32(x) \ + (__extension__ \ + ({ unsigned int __bsx = (x); \ + ((((__bsx) & 0xff000000) >> 24) | (((__bsx) & 0x00ff0000) >> 8) | \ + (((__bsx) & 0x0000ff00) << 8) | (((__bsx) & 0x000000ff) << 24)); })) +#else +static INLINE unsigned int +__bswap_32 (unsigned int __bsx) +{ + return ((((__bsx) & 0xff000000) >> 24) | (((__bsx) & 0x00ff0000) >> 8) | + (((__bsx) & 0x0000ff00) << 8) | (((__bsx) & 0x000000ff) << 24)); +} +#endif +#endif // __bswap_32 + +#ifndef __bswap_64 +#if defined __GNUC__ && __GNUC__ >= 2 +/* Swap bytes in 64 bit value. */ +# define __bswap_constant_64(x) \ + ((((x) & 0xff00000000000000ull) >> 56) \ + | (((x) & 0x00ff000000000000ull) >> 40) \ + | (((x) & 0x0000ff0000000000ull) >> 24) \ + | (((x) & 0x000000ff00000000ull) >> 8) \ + | (((x) & 0x00000000ff000000ull) << 8) \ + | (((x) & 0x0000000000ff0000ull) << 24) \ + | (((x) & 0x000000000000ff00ull) << 40) \ + | (((x) & 0x00000000000000ffull) << 56)) + +# define __bswap_64(x) \ + (__extension__ \ + ({ union { __extension__ unsigned long long int __ll; \ + unsigned int __l[2]; } __w, __r; \ + if (__builtin_constant_p (x)) \ + __r.__ll = __bswap_constant_64 (x); \ + else \ + { \ + __w.__ll = (x); \ + __r.__l[0] = __bswap_32 (__w.__l[1]); \ + __r.__l[1] = __bswap_32 (__w.__l[0]); \ + } \ + __r.__ll; })) +#endif +#endif // __bswap_64 + +#endif /* BYTESWAP_H */ diff --git a/arch/xtensa/include/esp32/wpa_supplicant/port/include/endian.h b/arch/xtensa/include/esp32/wpa_supplicant/port/include/endian.h new file mode 100644 index 0000000000000..392b40168b690 --- /dev/null +++ b/arch/xtensa/include/esp32/wpa_supplicant/port/include/endian.h @@ -0,0 +1,226 @@ +/*- + * Copyright (c) 2002 Thomas Moestl + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + * + * $FreeBSD$ + */ + +#ifndef _ENDIAN_H_ +#define _ENDIAN_H_ + +#include +#include +#include "byteswap.h" + +#ifndef BIG_ENDIAN +#define BIG_ENDIAN 4321 +#endif +#ifndef LITTLE_ENDIAN +#define LITTLE_ENDIAN 1234 +#endif + +#ifndef BYTE_ORDER +#ifdef __IEEE_LITTLE_ENDIAN +#define BYTE_ORDER LITTLE_ENDIAN +#else +#define BYTE_ORDER BIG_ENDIAN +#endif +#endif + +#define _UINT8_T_DECLARED +#ifndef _UINT8_T_DECLARED +typedef __uint8_t uint8_t; +#define _UINT8_T_DECLARED +#endif + +#define _UINT16_T_DECLARED +#ifndef _UINT16_T_DECLARED +typedef __uint16_t uint16_t; +#define _UINT16_T_DECLARED +#endif + +#define _UINT32_T_DECLARED +#ifndef _UINT32_T_DECLARED +typedef __uint32_t uint32_t; +#define _UINT32_T_DECLARED +#endif + +#define _UINT64_T_DECLARED +#ifndef _UINT64_T_DECLARED +typedef __uint64_t uint64_t; +#define _UINT64_T_DECLARED +#endif + +/* + * General byte order swapping functions. + */ +#define bswap16(x) __bswap16(x) +#define bswap32(x) __bswap32(x) +#define bswap64(x) __bswap64(x) + +/* + * Host to big endian, host to little endian, big endian to host, and little + * endian to host byte order functions as detailed in byteorder(9). + */ +#if BYTE_ORDER == _LITTLE_ENDIAN +#define htobe16(x) bswap16((x)) +#define htobe32(x) bswap32((x)) +#define htobe64(x) bswap64((x)) +#define htole16(x) ((uint16_t)(x)) +#define htole32(x) ((uint32_t)(x)) +#define htole64(x) ((uint64_t)(x)) + +#define be16toh(x) bswap16((x)) +#define be32toh(x) bswap32((x)) +#define be64toh(x) bswap64((x)) +#define le16toh(x) ((uint16_t)(x)) +#define le32toh(x) ((uint32_t)(x)) +#define le64toh(x) ((uint64_t)(x)) + +#else /* _BYTE_ORDER != _LITTLE_ENDIAN */ +#define htobe16(x) ((uint16_t)(x)) +#define htobe32(x) ((uint32_t)(x)) +#define htobe64(x) ((uint64_t)(x)) +#define htole16(x) bswap16((x)) +#define htole32(x) bswap32((x)) +#define htole64(x) bswap64((x)) + +#define be16toh(x) ((uint16_t)(x)) +#define be32toh(x) ((uint32_t)(x)) +#define be64toh(x) ((uint64_t)(x)) +#define le16toh(x) bswap16((x)) +#define le32toh(x) bswap32((x)) +#define le64toh(x) bswap64((x)) +#endif /* _BYTE_ORDER == _LITTLE_ENDIAN */ + +/* Alignment-agnostic encode/decode bytestream to/from little/big endian. */ +#define INLINE __inline__ + +static INLINE uint16_t +be16dec(const void *pp) +{ + uint8_t const *p = (uint8_t const *)pp; + + return ((p[0] << 8) | p[1]); +} + +static INLINE uint32_t +be32dec(const void *pp) +{ + uint8_t const *p = (uint8_t const *)pp; + + return (((unsigned)p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]); +} + +static INLINE uint64_t +be64dec(const void *pp) +{ + uint8_t const *p = (uint8_t const *)pp; + + return (((uint64_t)be32dec(p) << 32) | be32dec(p + 4)); +} + +static INLINE uint16_t +le16dec(const void *pp) +{ + uint8_t const *p = (uint8_t const *)pp; + + return ((p[1] << 8) | p[0]); +} + +static INLINE uint32_t +le32dec(const void *pp) +{ + uint8_t const *p = (uint8_t const *)pp; + + return (((unsigned)p[3] << 24) | (p[2] << 16) | (p[1] << 8) | p[0]); +} + +static INLINE uint64_t +le64dec(const void *pp) +{ + uint8_t const *p = (uint8_t const *)pp; + + return (((uint64_t)le32dec(p + 4) << 32) | le32dec(p)); +} + +static INLINE void +be16enc(void *pp, uint16_t u) +{ + uint8_t *p = (uint8_t *)pp; + + p[0] = (u >> 8) & 0xff; + p[1] = u & 0xff; +} + +static INLINE void +be32enc(void *pp, uint32_t u) +{ + uint8_t *p = (uint8_t *)pp; + + p[0] = (u >> 24) & 0xff; + p[1] = (u >> 16) & 0xff; + p[2] = (u >> 8) & 0xff; + p[3] = u & 0xff; +} + +static INLINE void +be64enc(void *pp, uint64_t u) +{ + uint8_t *p = (uint8_t *)pp; + + be32enc(p, (uint32_t)(u >> 32)); + be32enc(p + 4, (uint32_t)(u & 0xffffffffU)); +} + +static INLINE void +le16enc(void *pp, uint16_t u) +{ + uint8_t *p = (uint8_t *)pp; + + p[0] = u & 0xff; + p[1] = (u >> 8) & 0xff; +} + +static INLINE void +le32enc(void *pp, uint32_t u) +{ + uint8_t *p = (uint8_t *)pp; + + p[0] = u & 0xff; + p[1] = (u >> 8) & 0xff; + p[2] = (u >> 16) & 0xff; + p[3] = (u >> 24) & 0xff; +} + +static INLINE void +le64enc(void *pp, uint64_t u) +{ + uint8_t *p = (uint8_t *)pp; + + le32enc(p, (uint32_t)(u & 0xffffffffU)); + le32enc(p + 4, (uint32_t)(u >> 32)); +} + +#endif /* _ENDIAN_H_ */ diff --git a/arch/xtensa/include/esp32/wpa_supplicant/port/include/os.h b/arch/xtensa/include/esp32/wpa_supplicant/port/include/os.h new file mode 100644 index 0000000000000..89bcbdb445406 --- /dev/null +++ b/arch/xtensa/include/esp32/wpa_supplicant/port/include/os.h @@ -0,0 +1,299 @@ +/* + * OS specific functions + * Copyright (c) 2005-2009, 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. + */ + +#ifndef OS_H +#define OS_H +#include "../../../esp_common/esp_types.h" +#include +#include +#include +#include "../../../esp_common/esp_err.h" +// #include "esp32/rom/ets_sys.h" + +typedef time_t os_time_t; + +/** + * os_sleep - Sleep (sec, usec) + * @sec: Number of seconds to sleep + * @usec: Number of microseconds to sleep + */ +void os_sleep(os_time_t sec, os_time_t usec); + +struct os_time { + os_time_t sec; + suseconds_t usec; +}; + +/** + * os_get_time - Get current time (sec, usec) + * @t: Pointer to buffer for the time + * Returns: 0 on success, -1 on failure + */ +int os_get_time(struct os_time *t); + + +/* Helper macros for handling struct os_time */ + +#define os_time_before(a, b) \ + ((a)->sec < (b)->sec || \ + ((a)->sec == (b)->sec && (a)->usec < (b)->usec)) + +#define os_time_sub(a, b, res) do { \ + (res)->sec = (a)->sec - (b)->sec; \ + (res)->usec = (a)->usec - (b)->usec; \ + if ((res)->usec < 0) { \ + (res)->sec--; \ + (res)->usec += 1000000; \ + } \ +} while (0) + +/** + * os_mktime - Convert broken-down time into seconds since 1970-01-01 + * @year: Four digit year + * @month: Month (1 .. 12) + * @day: Day of month (1 .. 31) + * @hour: Hour (0 .. 23) + * @min: Minute (0 .. 59) + * @sec: Second (0 .. 60) + * @t: Buffer for returning calendar time representation (seconds since + * 1970-01-01 00:00:00) + * Returns: 0 on success, -1 on failure + * + * Note: The result is in seconds from Epoch, i.e., in UTC, not in local time + * which is used by POSIX mktime(). + */ +int os_mktime(int year, int month, int day, int hour, int min, int sec, + os_time_t *t); + + +/** + * os_daemonize - Run in the background (detach from the controlling terminal) + * @pid_file: File name to write the process ID to or %NULL to skip this + * Returns: 0 on success, -1 on failure + */ +int os_daemonize(const char *pid_file); + +/** + * os_daemonize_terminate - Stop running in the background (remove pid file) + * @pid_file: File name to write the process ID to or %NULL to skip this + */ +void os_daemonize_terminate(const char *pid_file); + +/** + * os_get_random - Get cryptographically strong pseudo random data + * @buf: Buffer for pseudo random data + * @len: Length of the buffer + * Returns: 0 on success, -1 on failure + */ +int os_get_random(unsigned char *buf, size_t len); + +/** + * os_random - Get pseudo random value (not necessarily very strong) + * Returns: Pseudo random value + */ +unsigned long os_random(void); + +/** + * os_rel2abs_path - Get an absolute path for a file + * @rel_path: Relative path to a file + * Returns: Absolute path for the file or %NULL on failure + * + * This function tries to convert a relative path of a file to an absolute path + * in order for the file to be found even if current working directory has + * changed. The returned value is allocated and caller is responsible for + * freeing it. It is acceptable to just return the same path in an allocated + * buffer, e.g., return strdup(rel_path). This function is only used to find + * configuration files when os_daemonize() may have changed the current working + * directory and relative path would be pointing to a different location. + */ +char * os_rel2abs_path(const char *rel_path); + +/** + * os_program_init - Program initialization (called at start) + * Returns: 0 on success, -1 on failure + * + * This function is called when a programs starts. If there are any OS specific + * processing that is needed, it can be placed here. It is also acceptable to + * just return 0 if not special processing is needed. + */ +int os_program_init(void); + +/** + * os_program_deinit - Program deinitialization (called just before exit) + * + * This function is called just before a program exists. If there are any OS + * specific processing, e.g., freeing resourced allocated in os_program_init(), + * it should be done here. It is also acceptable for this function to do + * nothing. + */ +void os_program_deinit(void); + +/** + * os_setenv - Set environment variable + * @name: Name of the variable + * @value: Value to set to the variable + * @overwrite: Whether existing variable should be overwritten + * Returns: 0 on success, -1 on error + * + * This function is only used for wpa_cli action scripts. OS wrapper does not + * need to implement this if such functionality is not needed. + */ +int os_setenv(const char *name, const char *value, int overwrite); + +/** + * os_unsetenv - Delete environent variable + * @name: Name of the variable + * Returns: 0 on success, -1 on error + * + * This function is only used for wpa_cli action scripts. OS wrapper does not + * need to implement this if such functionality is not needed. + */ +int os_unsetenv(const char *name); + +/** + * os_readfile - Read a file to an allocated memory buffer + * @name: Name of the file to read + * @len: For returning the length of the allocated buffer + * Returns: Pointer to the allocated buffer or %NULL on failure + * + * This function allocates memory and reads the given file to this buffer. Both + * binary and text files can be read with this function. The caller is + * responsible for freeing the returned buffer with os_free(). + */ +char * os_readfile(const char *name, size_t *len); + +/* + * The following functions are wrapper for standard ANSI C or POSIX functions. + * By default, they are just defined to use the standard function name and no + * os_*.c implementation is needed for them. This avoids extra function calls + * by allowing the C pre-processor take care of the function name mapping. + * + * If the target system uses a C library that does not provide these functions, + * build_config.h can be used to define the wrappers to use a different + * function name. This can be done on function-by-function basis since the + * defines here are only used if build_config.h does not define the os_* name. + * If needed, os_*.c file can be used to implement the functions that are not + * included in the C library on the target system. Alternatively, + * OS_NO_C_LIB_DEFINES can be defined to skip all defines here in which case + * these functions need to be implemented in os_*.c file for the target system. + */ + +#ifndef os_malloc +#define os_malloc(s) malloc((s)) +#endif +#ifndef os_realloc +#define os_realloc(p, s) realloc((p), (s)) +#endif +#ifndef os_zalloc +#define os_zalloc(s) calloc(1, (s)) +#endif +#ifndef os_free +#define os_free(p) free((p)) +#endif + +#ifndef os_bzero +#define os_bzero(s, n) bzero(s, n) +#endif + + +#ifndef os_strdup +#ifdef _MSC_VER +#define os_strdup(s) _strdup(s) +#else +#define os_strdup(s) strdup(s) +#endif +#endif +char * ets_strdup(const char *s); + +#ifndef os_memcpy +#define os_memcpy(d, s, n) memcpy((d), (s), (n)) +#endif +#ifndef os_memmove +#define os_memmove(d, s, n) memmove((d), (s), (n)) +#endif +#ifndef os_memset +#define os_memset(s, c, n) memset(s, c, n) +#endif +#ifndef os_memcmp +#define os_memcmp(s1, s2, n) memcmp((s1), (s2), (n)) +#endif +#ifndef os_memcmp_const +#define os_memcmp_const(s1, s2, n) memcmp((s1), (s2), (n)) +#endif + + +#ifndef os_strlen +#define os_strlen(s) strlen(s) +#endif +#ifndef os_strcasecmp +#ifdef _MSC_VER +#define os_strcasecmp(s1, s2) _stricmp((s1), (s2)) +#else +#define os_strcasecmp(s1, s2) strcasecmp((s1), (s2)) +#endif +#endif +#ifndef os_strncasecmp +#ifdef _MSC_VER +#define os_strncasecmp(s1, s2, n) _strnicmp((s1), (s2), (n)) +#else +#define os_strncasecmp(s1, s2, n) strncasecmp((s1), (s2), (n)) +#endif +#endif +#ifndef os_strchr +#define os_strchr(s, c) strchr((s), (c)) +#endif +#ifndef os_strcmp +#define os_strcmp(s1, s2) strcmp((s1), (s2)) +#endif +#ifndef os_strncmp +#define os_strncmp(s1, s2, n) strncmp((s1), (s2), (n)) +#endif +#ifndef os_strncpy +#define os_strncpy(d, s, n) strncpy((d), (s), (n)) +#endif +#ifndef os_strrchr +#define os_strrchr(s, c) strrchr((s), (c)) +#endif +#ifndef os_strstr +#define os_strstr(h, n) strstr((h), (n)) +#endif + +#ifndef os_snprintf +#ifdef _MSC_VER +#define os_snprintf _snprintf +#else +#define os_snprintf snprintf +#endif +#endif + +static inline int os_snprintf_error(size_t size, int res) +{ + return res < 0 || (unsigned int) res >= size; +} + +/** + * os_strlcpy - Copy a string with size bound and NUL-termination + * @dest: Destination + * @src: Source + * @siz: Size of the target buffer + * Returns: Total length of the target string (length of src) (not including + * NUL-termination) + * + * This function matches in behavior with the strlcpy(3) function in OpenBSD. + */ +size_t os_strlcpy(char *dest, const char *src, size_t siz); + + + +#endif /* OS_H */ diff --git a/arch/xtensa/include/esp32/wpa_supplicant/port/include/supplicant_opt.h b/arch/xtensa/include/esp32/wpa_supplicant/port/include/supplicant_opt.h new file mode 100644 index 0000000000000..0a07c9e258093 --- /dev/null +++ b/arch/xtensa/include/esp32/wpa_supplicant/port/include/supplicant_opt.h @@ -0,0 +1,24 @@ +// 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. + +#ifndef _SUPPLICANT_OPT_H +#define _SUPPLICANT_OPT_H + +#include + +#if CONFIG_WPA_MBEDTLS_CRYPTO +#define USE_MBEDTLS_CRYPTO 1 +#endif + +#endif /* _SUPPLICANT_OPT_H */ diff --git a/arch/xtensa/include/esp32/xtensa/esp32/include/xtensa/config/core-isa.h b/arch/xtensa/include/esp32/xtensa/esp32/include/xtensa/config/core-isa.h new file mode 100644 index 0000000000000..1845647264ff9 --- /dev/null +++ b/arch/xtensa/include/esp32/xtensa/esp32/include/xtensa/config/core-isa.h @@ -0,0 +1,655 @@ +/* + * xtensa/config/core-isa.h -- HAL definitions that are dependent on Xtensa + * processor CORE configuration + * + * See , which includes this file, for more details. + */ + +/* Xtensa processor core configuration information. + + Customer ID=11657; Build=0x5fe96; Copyright (c) 1999-2016 Tensilica Inc. + + 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 the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 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. */ + +#ifndef _XTENSA_CORE_CONFIGURATION_H +#define _XTENSA_CORE_CONFIGURATION_H + + +/**************************************************************************** + Parameters Useful for Any Code, USER or PRIVILEGED + ****************************************************************************/ + +/* + * Note: Macros of the form XCHAL_HAVE_*** have a value of 1 if the option is + * configured, and a value of 0 otherwise. These macros are always defined. + */ + + +/*---------------------------------------------------------------------- + ISA + ----------------------------------------------------------------------*/ + +#define XCHAL_HAVE_BE 0 /* big-endian byte ordering */ +#define XCHAL_HAVE_WINDOWED 1 /* windowed registers option */ +#define XCHAL_NUM_AREGS 64 /* num of physical addr regs */ +#define XCHAL_NUM_AREGS_LOG2 6 /* log2(XCHAL_NUM_AREGS) */ +#define XCHAL_MAX_INSTRUCTION_SIZE 3 /* max instr bytes (3..8) */ +#define XCHAL_HAVE_DEBUG 1 /* debug option */ +#define XCHAL_HAVE_DENSITY 1 /* 16-bit instructions */ +#define XCHAL_HAVE_LOOPS 1 /* zero-overhead loops */ +#define XCHAL_LOOP_BUFFER_SIZE 256 /* zero-ov. loop instr buffer size */ +#define XCHAL_HAVE_NSA 1 /* NSA/NSAU instructions */ +#define XCHAL_HAVE_MINMAX 1 /* MIN/MAX instructions */ +#define XCHAL_HAVE_SEXT 1 /* SEXT instruction */ +#define XCHAL_HAVE_DEPBITS 0 /* DEPBITS instruction */ +#define XCHAL_HAVE_CLAMPS 1 /* CLAMPS instruction */ +#define XCHAL_HAVE_MUL16 1 /* MUL16S/MUL16U instructions */ +#define XCHAL_HAVE_MUL32 1 /* MULL instruction */ +#define XCHAL_HAVE_MUL32_HIGH 1 /* MULUH/MULSH instructions */ +#define XCHAL_HAVE_DIV32 1 /* QUOS/QUOU/REMS/REMU instructions */ +#define XCHAL_HAVE_L32R 1 /* L32R instruction */ +#define XCHAL_HAVE_ABSOLUTE_LITERALS 0 /* non-PC-rel (extended) L32R */ +#define XCHAL_HAVE_CONST16 0 /* CONST16 instruction */ +#define XCHAL_HAVE_ADDX 1 /* ADDX#/SUBX# instructions */ +#define XCHAL_HAVE_WIDE_BRANCHES 0 /* B*.W18 or B*.W15 instr's */ +#define XCHAL_HAVE_PREDICTED_BRANCHES 0 /* B[EQ/EQZ/NE/NEZ]T instr's */ +#define XCHAL_HAVE_CALL4AND12 1 /* (obsolete option) */ +#define XCHAL_HAVE_ABS 1 /* ABS instruction */ +/*#define XCHAL_HAVE_POPC 0*/ /* POPC instruction */ +/*#define XCHAL_HAVE_CRC 0*/ /* CRC instruction */ +#define XCHAL_HAVE_RELEASE_SYNC 1 /* L32AI/S32RI instructions */ +#define XCHAL_HAVE_S32C1I 1 /* S32C1I instruction */ +#define XCHAL_HAVE_SPECULATION 0 /* speculation */ +#define XCHAL_HAVE_FULL_RESET 1 /* all regs/state reset */ +#define XCHAL_NUM_CONTEXTS 1 /* */ +#define XCHAL_NUM_MISC_REGS 4 /* num of scratch regs (0..4) */ +#define XCHAL_HAVE_TAP_MASTER 0 /* JTAG TAP control instr's */ +#define XCHAL_HAVE_PRID 1 /* processor ID register */ +#define XCHAL_HAVE_EXTERN_REGS 1 /* WER/RER instructions */ +#define XCHAL_HAVE_MX 0 /* MX core (Tensilica internal) */ +#define XCHAL_HAVE_MP_INTERRUPTS 0 /* interrupt distributor port */ +#define XCHAL_HAVE_MP_RUNSTALL 0 /* core RunStall control port */ +#define XCHAL_HAVE_PSO 0 /* Power Shut-Off */ +#define XCHAL_HAVE_PSO_CDM 0 /* core/debug/mem pwr domains */ +#define XCHAL_HAVE_PSO_FULL_RETENTION 0 /* all regs preserved on PSO */ +#define XCHAL_HAVE_THREADPTR 1 /* THREADPTR register */ +#define XCHAL_HAVE_BOOLEANS 1 /* boolean registers */ +#define XCHAL_HAVE_CP 1 /* CPENABLE reg (coprocessor) */ +#define XCHAL_CP_MAXCFG 8 /* max allowed cp id plus one */ +#define XCHAL_HAVE_MAC16 1 /* MAC16 package */ + +#define XCHAL_HAVE_FUSION 0 /* Fusion*/ +#define XCHAL_HAVE_FUSION_FP 0 /* Fusion FP option */ +#define XCHAL_HAVE_FUSION_LOW_POWER 0 /* Fusion Low Power option */ +#define XCHAL_HAVE_FUSION_AES 0 /* Fusion BLE/Wifi AES-128 CCM option */ +#define XCHAL_HAVE_FUSION_CONVENC 0 /* Fusion Conv Encode option */ +#define XCHAL_HAVE_FUSION_LFSR_CRC 0 /* Fusion LFSR-CRC option */ +#define XCHAL_HAVE_FUSION_BITOPS 0 /* Fusion Bit Operations Support option */ +#define XCHAL_HAVE_FUSION_AVS 0 /* Fusion AVS option */ +#define XCHAL_HAVE_FUSION_16BIT_BASEBAND 0 /* Fusion 16-bit Baseband option */ +#define XCHAL_HAVE_FUSION_VITERBI 0 /* Fusion Viterbi option */ +#define XCHAL_HAVE_FUSION_SOFTDEMAP 0 /* Fusion Soft Bit Demap option */ +#define XCHAL_HAVE_HIFIPRO 0 /* HiFiPro Audio Engine pkg */ +#define XCHAL_HAVE_HIFI4 0 /* HiFi4 Audio Engine pkg */ +#define XCHAL_HAVE_HIFI4_VFPU 0 /* HiFi4 Audio Engine VFPU option */ +#define XCHAL_HAVE_HIFI3 0 /* HiFi3 Audio Engine pkg */ +#define XCHAL_HAVE_HIFI3_VFPU 0 /* HiFi3 Audio Engine VFPU option */ +#define XCHAL_HAVE_HIFI2 0 /* HiFi2 Audio Engine pkg */ +#define XCHAL_HAVE_HIFI2EP 0 /* HiFi2EP */ +#define XCHAL_HAVE_HIFI_MINI 0 + + +#define XCHAL_HAVE_VECTORFPU2005 0 /* vector or user floating-point pkg */ +#define XCHAL_HAVE_USER_DPFPU 0 /* user DP floating-point pkg */ +#define XCHAL_HAVE_USER_SPFPU 0 /* user DP floating-point pkg */ +#define XCHAL_HAVE_FP 1 /* single prec floating point */ +#define XCHAL_HAVE_FP_DIV 1 /* FP with DIV instructions */ +#define XCHAL_HAVE_FP_RECIP 1 /* FP with RECIP instructions */ +#define XCHAL_HAVE_FP_SQRT 1 /* FP with SQRT instructions */ +#define XCHAL_HAVE_FP_RSQRT 1 /* FP with RSQRT instructions */ +#define XCHAL_HAVE_DFP 0 /* double precision FP pkg */ +#define XCHAL_HAVE_DFP_DIV 0 /* DFP with DIV instructions */ +#define XCHAL_HAVE_DFP_RECIP 0 /* DFP with RECIP instructions*/ +#define XCHAL_HAVE_DFP_SQRT 0 /* DFP with SQRT instructions */ +#define XCHAL_HAVE_DFP_RSQRT 0 /* DFP with RSQRT instructions*/ +#define XCHAL_HAVE_DFP_ACCEL 1 /* double precision FP acceleration pkg */ +#define XCHAL_HAVE_DFP_accel XCHAL_HAVE_DFP_ACCEL /* for backward compatibility */ + +#define XCHAL_HAVE_DFPU_SINGLE_ONLY 1 /* DFPU Coprocessor, single precision only */ +#define XCHAL_HAVE_DFPU_SINGLE_DOUBLE 0 /* DFPU Coprocessor, single and double precision */ +#define XCHAL_HAVE_VECTRA1 0 /* Vectra I pkg */ +#define XCHAL_HAVE_VECTRALX 0 /* Vectra LX pkg */ +#define XCHAL_HAVE_PDX4 0 /* PDX4 */ +#define XCHAL_HAVE_CONNXD2 0 /* ConnX D2 pkg */ +#define XCHAL_HAVE_CONNXD2_DUALLSFLIX 0 /* ConnX D2 & Dual LoadStore Flix */ +#define XCHAL_HAVE_BBE16 0 /* ConnX BBE16 pkg */ +#define XCHAL_HAVE_BBE16_RSQRT 0 /* BBE16 & vector recip sqrt */ +#define XCHAL_HAVE_BBE16_VECDIV 0 /* BBE16 & vector divide */ +#define XCHAL_HAVE_BBE16_DESPREAD 0 /* BBE16 & despread */ +#define XCHAL_HAVE_BBENEP 0 /* ConnX BBENEP pkgs */ +#define XCHAL_HAVE_BSP3 0 /* ConnX BSP3 pkg */ +#define XCHAL_HAVE_BSP3_TRANSPOSE 0 /* BSP3 & transpose32x32 */ +#define XCHAL_HAVE_SSP16 0 /* ConnX SSP16 pkg */ +#define XCHAL_HAVE_SSP16_VITERBI 0 /* SSP16 & viterbi */ +#define XCHAL_HAVE_TURBO16 0 /* ConnX Turbo16 pkg */ +#define XCHAL_HAVE_BBP16 0 /* ConnX BBP16 pkg */ +#define XCHAL_HAVE_FLIX3 0 /* basic 3-way FLIX option */ +#define XCHAL_HAVE_GRIVPEP 0 /* GRIVPEP is General Release of IVPEP */ +#define XCHAL_HAVE_GRIVPEP_HISTOGRAM 0 /* Histogram option on GRIVPEP */ + + +/*---------------------------------------------------------------------- + MISC + ----------------------------------------------------------------------*/ + +#define XCHAL_NUM_LOADSTORE_UNITS 1 /* load/store units */ +#define XCHAL_NUM_WRITEBUFFER_ENTRIES 4 /* size of write buffer */ +#define XCHAL_INST_FETCH_WIDTH 4 /* instr-fetch width in bytes */ +#define XCHAL_DATA_WIDTH 4 /* data width in bytes */ +#define XCHAL_DATA_PIPE_DELAY 2 /* d-side pipeline delay + (1 = 5-stage, 2 = 7-stage) */ +#define XCHAL_CLOCK_GATING_GLOBAL 1 /* global clock gating */ +#define XCHAL_CLOCK_GATING_FUNCUNIT 1 /* funct. unit clock gating */ +/* In T1050, applies to selected core load and store instructions (see ISA): */ +#define XCHAL_UNALIGNED_LOAD_EXCEPTION 0 /* unaligned loads cause exc. */ +#define XCHAL_UNALIGNED_STORE_EXCEPTION 0 /* unaligned stores cause exc.*/ +#define XCHAL_UNALIGNED_LOAD_HW 1 /* unaligned loads work in hw */ +#define XCHAL_UNALIGNED_STORE_HW 1 /* unaligned stores work in hw*/ + +#define XCHAL_SW_VERSION 1100003 /* sw version of this header */ + +#define XCHAL_CORE_ID "esp32_v3_49_prod" /* alphanum core name + (CoreID) set in the Xtensa + Processor Generator */ + +#define XCHAL_BUILD_UNIQUE_ID 0x0005FE96 /* 22-bit sw build ID */ + +/* + * These definitions describe the hardware targeted by this software. + */ +#define XCHAL_HW_CONFIGID0 0xC2BCFFFE /* ConfigID hi 32 bits*/ +#define XCHAL_HW_CONFIGID1 0x1CC5FE96 /* ConfigID lo 32 bits*/ +#define XCHAL_HW_VERSION_NAME "LX6.0.3" /* full version name */ +#define XCHAL_HW_VERSION_MAJOR 2600 /* major ver# of targeted hw */ +#define XCHAL_HW_VERSION_MINOR 3 /* minor ver# of targeted hw */ +#define XCHAL_HW_VERSION 260003 /* major*100+minor */ +#define XCHAL_HW_REL_LX6 1 +#define XCHAL_HW_REL_LX6_0 1 +#define XCHAL_HW_REL_LX6_0_3 1 +#define XCHAL_HW_CONFIGID_RELIABLE 1 +/* If software targets a *range* of hardware versions, these are the bounds: */ +#define XCHAL_HW_MIN_VERSION_MAJOR 2600 /* major v of earliest tgt hw */ +#define XCHAL_HW_MIN_VERSION_MINOR 3 /* minor v of earliest tgt hw */ +#define XCHAL_HW_MIN_VERSION 260003 /* earliest targeted hw */ +#define XCHAL_HW_MAX_VERSION_MAJOR 2600 /* major v of latest tgt hw */ +#define XCHAL_HW_MAX_VERSION_MINOR 3 /* minor v of latest tgt hw */ +#define XCHAL_HW_MAX_VERSION 260003 /* latest targeted hw */ + + +/*---------------------------------------------------------------------- + CACHE + ----------------------------------------------------------------------*/ + +#define XCHAL_ICACHE_LINESIZE 4 /* I-cache line size in bytes */ +#define XCHAL_DCACHE_LINESIZE 4 /* D-cache line size in bytes */ +#define XCHAL_ICACHE_LINEWIDTH 2 /* log2(I line size in bytes) */ +#define XCHAL_DCACHE_LINEWIDTH 2 /* log2(D line size in bytes) */ + +#define XCHAL_ICACHE_SIZE 0 /* I-cache size in bytes or 0 */ +#define XCHAL_DCACHE_SIZE 0 /* D-cache size in bytes or 0 */ + +#define XCHAL_DCACHE_IS_WRITEBACK 0 /* writeback feature */ +#define XCHAL_DCACHE_IS_COHERENT 0 /* MP coherence feature */ + +#define XCHAL_HAVE_PREFETCH 0 /* PREFCTL register */ +#define XCHAL_HAVE_PREFETCH_L1 0 /* prefetch to L1 dcache */ +#define XCHAL_PREFETCH_CASTOUT_LINES 0 /* dcache pref. castout bufsz */ +#define XCHAL_PREFETCH_ENTRIES 0 /* cache prefetch entries */ +#define XCHAL_PREFETCH_BLOCK_ENTRIES 0 /* prefetch block streams */ +#define XCHAL_HAVE_CACHE_BLOCKOPS 0 /* block prefetch for caches */ +#define XCHAL_HAVE_ICACHE_TEST 0 /* Icache test instructions */ +#define XCHAL_HAVE_DCACHE_TEST 0 /* Dcache test instructions */ +#define XCHAL_HAVE_ICACHE_DYN_WAYS 0 /* Icache dynamic way support */ +#define XCHAL_HAVE_DCACHE_DYN_WAYS 0 /* Dcache dynamic way support */ + + + + +/**************************************************************************** + Parameters Useful for PRIVILEGED (Supervisory or Non-Virtualized) Code + ****************************************************************************/ + + +#ifndef XTENSA_HAL_NON_PRIVILEGED_ONLY + +/*---------------------------------------------------------------------- + CACHE + ----------------------------------------------------------------------*/ + +#define XCHAL_HAVE_PIF 1 /* any outbound PIF present */ +#define XCHAL_HAVE_AXI 0 /* AXI bus */ + +#define XCHAL_HAVE_PIF_WR_RESP 0 /* pif write response */ +#define XCHAL_HAVE_PIF_REQ_ATTR 0 /* pif attribute */ + +/* If present, cache size in bytes == (ways * 2^(linewidth + setwidth)). */ + +/* Number of cache sets in log2(lines per way): */ +#define XCHAL_ICACHE_SETWIDTH 0 +#define XCHAL_DCACHE_SETWIDTH 0 + +/* Cache set associativity (number of ways): */ +#define XCHAL_ICACHE_WAYS 1 +#define XCHAL_DCACHE_WAYS 1 + +/* Cache features: */ +#define XCHAL_ICACHE_LINE_LOCKABLE 0 +#define XCHAL_DCACHE_LINE_LOCKABLE 0 +#define XCHAL_ICACHE_ECC_PARITY 0 +#define XCHAL_DCACHE_ECC_PARITY 0 + +/* Cache access size in bytes (affects operation of SICW instruction): */ +#define XCHAL_ICACHE_ACCESS_SIZE 1 +#define XCHAL_DCACHE_ACCESS_SIZE 1 + +#define XCHAL_DCACHE_BANKS 0 /* number of banks */ + +/* Number of encoded cache attr bits (see for decoded bits): */ +#define XCHAL_CA_BITS 4 + + +/*---------------------------------------------------------------------- + INTERNAL I/D RAM/ROMs and XLMI + ----------------------------------------------------------------------*/ + +#define XCHAL_NUM_INSTROM 1 /* number of core instr. ROMs */ +#define XCHAL_NUM_INSTRAM 2 /* number of core instr. RAMs */ +#define XCHAL_NUM_DATAROM 1 /* number of core data ROMs */ +#define XCHAL_NUM_DATARAM 2 /* number of core data RAMs */ +#define XCHAL_NUM_URAM 0 /* number of core unified RAMs*/ +#define XCHAL_NUM_XLMI 1 /* number of core XLMI ports */ + +/* Instruction ROM 0: */ +#define XCHAL_INSTROM0_VADDR 0x40800000 /* virtual address */ +#define XCHAL_INSTROM0_PADDR 0x40800000 /* physical address */ +#define XCHAL_INSTROM0_SIZE 4194304 /* size in bytes */ +#define XCHAL_INSTROM0_ECC_PARITY 0 /* ECC/parity type, 0=none */ + +/* Instruction RAM 0: */ +#define XCHAL_INSTRAM0_VADDR 0x40000000 /* virtual address */ +#define XCHAL_INSTRAM0_PADDR 0x40000000 /* physical address */ +#define XCHAL_INSTRAM0_SIZE 4194304 /* size in bytes */ +#define XCHAL_INSTRAM0_ECC_PARITY 0 /* ECC/parity type, 0=none */ + +/* Instruction RAM 1: */ +#define XCHAL_INSTRAM1_VADDR 0x40400000 /* virtual address */ +#define XCHAL_INSTRAM1_PADDR 0x40400000 /* physical address */ +#define XCHAL_INSTRAM1_SIZE 4194304 /* size in bytes */ +#define XCHAL_INSTRAM1_ECC_PARITY 0 /* ECC/parity type, 0=none */ + +/* Data ROM 0: */ +#define XCHAL_DATAROM0_VADDR 0x3F400000 /* virtual address */ +#define XCHAL_DATAROM0_PADDR 0x3F400000 /* physical address */ +#define XCHAL_DATAROM0_SIZE 4194304 /* size in bytes */ +#define XCHAL_DATAROM0_ECC_PARITY 0 /* ECC/parity type, 0=none */ +#define XCHAL_DATAROM0_BANKS 1 /* number of banks */ + +/* Data RAM 0: */ +#define XCHAL_DATARAM0_VADDR 0x3FF80000 /* virtual address */ +#define XCHAL_DATARAM0_PADDR 0x3FF80000 /* physical address */ +#define XCHAL_DATARAM0_SIZE 524288 /* size in bytes */ +#define XCHAL_DATARAM0_ECC_PARITY 0 /* ECC/parity type, 0=none */ +#define XCHAL_DATARAM0_BANKS 1 /* number of banks */ + +/* Data RAM 1: */ +#define XCHAL_DATARAM1_VADDR 0x3F800000 /* virtual address */ +#define XCHAL_DATARAM1_PADDR 0x3F800000 /* physical address */ +#define XCHAL_DATARAM1_SIZE 4194304 /* size in bytes */ +#define XCHAL_DATARAM1_ECC_PARITY 0 /* ECC/parity type, 0=none */ +#define XCHAL_DATARAM1_BANKS 1 /* number of banks */ + +/* XLMI Port 0: */ +#define XCHAL_XLMI0_VADDR 0x3FF00000 /* virtual address */ +#define XCHAL_XLMI0_PADDR 0x3FF00000 /* physical address */ +#define XCHAL_XLMI0_SIZE 524288 /* size in bytes */ +#define XCHAL_XLMI0_ECC_PARITY 0 /* ECC/parity type, 0=none */ + +#define XCHAL_HAVE_IMEM_LOADSTORE 1 /* can load/store to IROM/IRAM*/ + + +/*---------------------------------------------------------------------- + INTERRUPTS and TIMERS + ----------------------------------------------------------------------*/ + +#define XCHAL_HAVE_INTERRUPTS 1 /* interrupt option */ +#define XCHAL_HAVE_HIGHPRI_INTERRUPTS 1 /* med/high-pri. interrupts */ +#define XCHAL_HAVE_NMI 1 /* non-maskable interrupt */ +#define XCHAL_HAVE_CCOUNT 1 /* CCOUNT reg. (timer option) */ +#define XCHAL_NUM_TIMERS 3 /* number of CCOMPAREn regs */ +#define XCHAL_NUM_INTERRUPTS 32 /* number of interrupts */ +#define XCHAL_NUM_INTERRUPTS_LOG2 5 /* ceil(log2(NUM_INTERRUPTS)) */ +#define XCHAL_NUM_EXTINTERRUPTS 26 /* num of external interrupts */ +#define XCHAL_NUM_INTLEVELS 6 /* number of interrupt levels + (not including level zero) */ +#define XCHAL_EXCM_LEVEL 3 /* level masked by PS.EXCM */ + /* (always 1 in XEA1; levels 2 .. EXCM_LEVEL are "medium priority") */ + +/* Masks of interrupts at each interrupt level: */ +#define XCHAL_INTLEVEL1_MASK 0x000637FF +#define XCHAL_INTLEVEL2_MASK 0x00380000 +#define XCHAL_INTLEVEL3_MASK 0x28C08800 +#define XCHAL_INTLEVEL4_MASK 0x53000000 +#define XCHAL_INTLEVEL5_MASK 0x84010000 +#define XCHAL_INTLEVEL6_MASK 0x00000000 +#define XCHAL_INTLEVEL7_MASK 0x00004000 + +/* Masks of interrupts at each range 1..n of interrupt levels: */ +#define XCHAL_INTLEVEL1_ANDBELOW_MASK 0x000637FF +#define XCHAL_INTLEVEL2_ANDBELOW_MASK 0x003E37FF +#define XCHAL_INTLEVEL3_ANDBELOW_MASK 0x28FEBFFF +#define XCHAL_INTLEVEL4_ANDBELOW_MASK 0x7BFEBFFF +#define XCHAL_INTLEVEL5_ANDBELOW_MASK 0xFFFFBFFF +#define XCHAL_INTLEVEL6_ANDBELOW_MASK 0xFFFFBFFF +#define XCHAL_INTLEVEL7_ANDBELOW_MASK 0xFFFFFFFF + +/* Level of each interrupt: */ +#define XCHAL_INT0_LEVEL 1 +#define XCHAL_INT1_LEVEL 1 +#define XCHAL_INT2_LEVEL 1 +#define XCHAL_INT3_LEVEL 1 +#define XCHAL_INT4_LEVEL 1 +#define XCHAL_INT5_LEVEL 1 +#define XCHAL_INT6_LEVEL 1 +#define XCHAL_INT7_LEVEL 1 +#define XCHAL_INT8_LEVEL 1 +#define XCHAL_INT9_LEVEL 1 +#define XCHAL_INT10_LEVEL 1 +#define XCHAL_INT11_LEVEL 3 +#define XCHAL_INT12_LEVEL 1 +#define XCHAL_INT13_LEVEL 1 +#define XCHAL_INT14_LEVEL 7 +#define XCHAL_INT15_LEVEL 3 +#define XCHAL_INT16_LEVEL 5 +#define XCHAL_INT17_LEVEL 1 +#define XCHAL_INT18_LEVEL 1 +#define XCHAL_INT19_LEVEL 2 +#define XCHAL_INT20_LEVEL 2 +#define XCHAL_INT21_LEVEL 2 +#define XCHAL_INT22_LEVEL 3 +#define XCHAL_INT23_LEVEL 3 +#define XCHAL_INT24_LEVEL 4 +#define XCHAL_INT25_LEVEL 4 +#define XCHAL_INT26_LEVEL 5 +#define XCHAL_INT27_LEVEL 3 +#define XCHAL_INT28_LEVEL 4 +#define XCHAL_INT29_LEVEL 3 +#define XCHAL_INT30_LEVEL 4 +#define XCHAL_INT31_LEVEL 5 +#define XCHAL_DEBUGLEVEL 6 /* debug interrupt level */ +#define XCHAL_HAVE_DEBUG_EXTERN_INT 1 /* OCD external db interrupt */ +#define XCHAL_NMILEVEL 7 /* NMI "level" (for use with + EXCSAVE/EPS/EPC_n, RFI n) */ + +/* Type of each interrupt: */ +#define XCHAL_INT0_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT1_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT2_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT3_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT4_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT5_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT6_TYPE XTHAL_INTTYPE_TIMER +#define XCHAL_INT7_TYPE XTHAL_INTTYPE_SOFTWARE +#define XCHAL_INT8_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT9_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT10_TYPE XTHAL_INTTYPE_EXTERN_EDGE +#define XCHAL_INT11_TYPE XTHAL_INTTYPE_PROFILING +#define XCHAL_INT12_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT13_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT14_TYPE XTHAL_INTTYPE_NMI +#define XCHAL_INT15_TYPE XTHAL_INTTYPE_TIMER +#define XCHAL_INT16_TYPE XTHAL_INTTYPE_TIMER +#define XCHAL_INT17_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT18_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT19_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT20_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT21_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT22_TYPE XTHAL_INTTYPE_EXTERN_EDGE +#define XCHAL_INT23_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT24_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT25_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT26_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT27_TYPE XTHAL_INTTYPE_EXTERN_LEVEL +#define XCHAL_INT28_TYPE XTHAL_INTTYPE_EXTERN_EDGE +#define XCHAL_INT29_TYPE XTHAL_INTTYPE_SOFTWARE +#define XCHAL_INT30_TYPE XTHAL_INTTYPE_EXTERN_EDGE +#define XCHAL_INT31_TYPE XTHAL_INTTYPE_EXTERN_LEVEL + +/* Masks of interrupts for each type of interrupt: */ +#define XCHAL_INTTYPE_MASK_UNCONFIGURED 0x00000000 +#define XCHAL_INTTYPE_MASK_SOFTWARE 0x20000080 +#define XCHAL_INTTYPE_MASK_EXTERN_EDGE 0x50400400 +#define XCHAL_INTTYPE_MASK_EXTERN_LEVEL 0x8FBE333F +#define XCHAL_INTTYPE_MASK_TIMER 0x00018040 +#define XCHAL_INTTYPE_MASK_NMI 0x00004000 +#define XCHAL_INTTYPE_MASK_WRITE_ERROR 0x00000000 +#define XCHAL_INTTYPE_MASK_PROFILING 0x00000800 + +/* Interrupt numbers assigned to specific interrupt sources: */ +#define XCHAL_TIMER0_INTERRUPT 6 /* CCOMPARE0 */ +#define XCHAL_TIMER1_INTERRUPT 15 /* CCOMPARE1 */ +#define XCHAL_TIMER2_INTERRUPT 16 /* CCOMPARE2 */ +#define XCHAL_TIMER3_INTERRUPT XTHAL_TIMER_UNCONFIGURED +#define XCHAL_NMI_INTERRUPT 14 /* non-maskable interrupt */ +#define XCHAL_PROFILING_INTERRUPT 11 /* profiling interrupt */ + +/* Interrupt numbers for levels at which only one interrupt is configured: */ +#define XCHAL_INTLEVEL7_NUM 14 +/* (There are many interrupts each at level(s) 1, 2, 3, 4, 5.) */ + + +/* + * External interrupt mapping. + * These macros describe how Xtensa processor interrupt numbers + * (as numbered internally, eg. in INTERRUPT and INTENABLE registers) + * map to external BInterrupt pins, for those interrupts + * configured as external (level-triggered, edge-triggered, or NMI). + * See the Xtensa processor databook for more details. + */ + +/* Core interrupt numbers mapped to each EXTERNAL BInterrupt pin number: */ +#define XCHAL_EXTINT0_NUM 0 /* (intlevel 1) */ +#define XCHAL_EXTINT1_NUM 1 /* (intlevel 1) */ +#define XCHAL_EXTINT2_NUM 2 /* (intlevel 1) */ +#define XCHAL_EXTINT3_NUM 3 /* (intlevel 1) */ +#define XCHAL_EXTINT4_NUM 4 /* (intlevel 1) */ +#define XCHAL_EXTINT5_NUM 5 /* (intlevel 1) */ +#define XCHAL_EXTINT6_NUM 8 /* (intlevel 1) */ +#define XCHAL_EXTINT7_NUM 9 /* (intlevel 1) */ +#define XCHAL_EXTINT8_NUM 10 /* (intlevel 1) */ +#define XCHAL_EXTINT9_NUM 12 /* (intlevel 1) */ +#define XCHAL_EXTINT10_NUM 13 /* (intlevel 1) */ +#define XCHAL_EXTINT11_NUM 14 /* (intlevel 7) */ +#define XCHAL_EXTINT12_NUM 17 /* (intlevel 1) */ +#define XCHAL_EXTINT13_NUM 18 /* (intlevel 1) */ +#define XCHAL_EXTINT14_NUM 19 /* (intlevel 2) */ +#define XCHAL_EXTINT15_NUM 20 /* (intlevel 2) */ +#define XCHAL_EXTINT16_NUM 21 /* (intlevel 2) */ +#define XCHAL_EXTINT17_NUM 22 /* (intlevel 3) */ +#define XCHAL_EXTINT18_NUM 23 /* (intlevel 3) */ +#define XCHAL_EXTINT19_NUM 24 /* (intlevel 4) */ +#define XCHAL_EXTINT20_NUM 25 /* (intlevel 4) */ +#define XCHAL_EXTINT21_NUM 26 /* (intlevel 5) */ +#define XCHAL_EXTINT22_NUM 27 /* (intlevel 3) */ +#define XCHAL_EXTINT23_NUM 28 /* (intlevel 4) */ +#define XCHAL_EXTINT24_NUM 30 /* (intlevel 4) */ +#define XCHAL_EXTINT25_NUM 31 /* (intlevel 5) */ +/* EXTERNAL BInterrupt pin numbers mapped to each core interrupt number: */ +#define XCHAL_INT0_EXTNUM 0 /* (intlevel 1) */ +#define XCHAL_INT1_EXTNUM 1 /* (intlevel 1) */ +#define XCHAL_INT2_EXTNUM 2 /* (intlevel 1) */ +#define XCHAL_INT3_EXTNUM 3 /* (intlevel 1) */ +#define XCHAL_INT4_EXTNUM 4 /* (intlevel 1) */ +#define XCHAL_INT5_EXTNUM 5 /* (intlevel 1) */ +#define XCHAL_INT8_EXTNUM 6 /* (intlevel 1) */ +#define XCHAL_INT9_EXTNUM 7 /* (intlevel 1) */ +#define XCHAL_INT10_EXTNUM 8 /* (intlevel 1) */ +#define XCHAL_INT12_EXTNUM 9 /* (intlevel 1) */ +#define XCHAL_INT13_EXTNUM 10 /* (intlevel 1) */ +#define XCHAL_INT14_EXTNUM 11 /* (intlevel 7) */ +#define XCHAL_INT17_EXTNUM 12 /* (intlevel 1) */ +#define XCHAL_INT18_EXTNUM 13 /* (intlevel 1) */ +#define XCHAL_INT19_EXTNUM 14 /* (intlevel 2) */ +#define XCHAL_INT20_EXTNUM 15 /* (intlevel 2) */ +#define XCHAL_INT21_EXTNUM 16 /* (intlevel 2) */ +#define XCHAL_INT22_EXTNUM 17 /* (intlevel 3) */ +#define XCHAL_INT23_EXTNUM 18 /* (intlevel 3) */ +#define XCHAL_INT24_EXTNUM 19 /* (intlevel 4) */ +#define XCHAL_INT25_EXTNUM 20 /* (intlevel 4) */ +#define XCHAL_INT26_EXTNUM 21 /* (intlevel 5) */ +#define XCHAL_INT27_EXTNUM 22 /* (intlevel 3) */ +#define XCHAL_INT28_EXTNUM 23 /* (intlevel 4) */ +#define XCHAL_INT30_EXTNUM 24 /* (intlevel 4) */ +#define XCHAL_INT31_EXTNUM 25 /* (intlevel 5) */ + + +/*---------------------------------------------------------------------- + EXCEPTIONS and VECTORS + ----------------------------------------------------------------------*/ + +#define XCHAL_XEA_VERSION 2 /* Xtensa Exception Architecture + number: 1 == XEA1 (old) + 2 == XEA2 (new) + 0 == XEAX (extern) or TX */ +#define XCHAL_HAVE_XEA1 0 /* Exception Architecture 1 */ +#define XCHAL_HAVE_XEA2 1 /* Exception Architecture 2 */ +#define XCHAL_HAVE_XEAX 0 /* External Exception Arch. */ +#define XCHAL_HAVE_EXCEPTIONS 1 /* exception option */ +#define XCHAL_HAVE_HALT 0 /* halt architecture option */ +#define XCHAL_HAVE_BOOTLOADER 0 /* boot loader (for TX) */ +#define XCHAL_HAVE_MEM_ECC_PARITY 0 /* local memory ECC/parity */ +#define XCHAL_HAVE_VECTOR_SELECT 1 /* relocatable vectors */ +#define XCHAL_HAVE_VECBASE 1 /* relocatable vectors */ +#define XCHAL_VECBASE_RESET_VADDR 0x40000000 /* VECBASE reset value */ +#define XCHAL_VECBASE_RESET_PADDR 0x40000000 +#define XCHAL_RESET_VECBASE_OVERLAP 0 + +#define XCHAL_RESET_VECTOR0_VADDR 0x50000000 +#define XCHAL_RESET_VECTOR0_PADDR 0x50000000 +#define XCHAL_RESET_VECTOR1_VADDR 0x40000400 +#define XCHAL_RESET_VECTOR1_PADDR 0x40000400 +#define XCHAL_RESET_VECTOR_VADDR 0x40000400 +#define XCHAL_RESET_VECTOR_PADDR 0x40000400 +#define XCHAL_USER_VECOFS 0x00000340 +#define XCHAL_USER_VECTOR_VADDR 0x40000340 +#define XCHAL_USER_VECTOR_PADDR 0x40000340 +#define XCHAL_KERNEL_VECOFS 0x00000300 +#define XCHAL_KERNEL_VECTOR_VADDR 0x40000300 +#define XCHAL_KERNEL_VECTOR_PADDR 0x40000300 +#define XCHAL_DOUBLEEXC_VECOFS 0x000003C0 +#define XCHAL_DOUBLEEXC_VECTOR_VADDR 0x400003C0 +#define XCHAL_DOUBLEEXC_VECTOR_PADDR 0x400003C0 +#define XCHAL_WINDOW_OF4_VECOFS 0x00000000 +#define XCHAL_WINDOW_UF4_VECOFS 0x00000040 +#define XCHAL_WINDOW_OF8_VECOFS 0x00000080 +#define XCHAL_WINDOW_UF8_VECOFS 0x000000C0 +#define XCHAL_WINDOW_OF12_VECOFS 0x00000100 +#define XCHAL_WINDOW_UF12_VECOFS 0x00000140 +#define XCHAL_WINDOW_VECTORS_VADDR 0x40000000 +#define XCHAL_WINDOW_VECTORS_PADDR 0x40000000 +#define XCHAL_INTLEVEL2_VECOFS 0x00000180 +#define XCHAL_INTLEVEL2_VECTOR_VADDR 0x40000180 +#define XCHAL_INTLEVEL2_VECTOR_PADDR 0x40000180 +#define XCHAL_INTLEVEL3_VECOFS 0x000001C0 +#define XCHAL_INTLEVEL3_VECTOR_VADDR 0x400001C0 +#define XCHAL_INTLEVEL3_VECTOR_PADDR 0x400001C0 +#define XCHAL_INTLEVEL4_VECOFS 0x00000200 +#define XCHAL_INTLEVEL4_VECTOR_VADDR 0x40000200 +#define XCHAL_INTLEVEL4_VECTOR_PADDR 0x40000200 +#define XCHAL_INTLEVEL5_VECOFS 0x00000240 +#define XCHAL_INTLEVEL5_VECTOR_VADDR 0x40000240 +#define XCHAL_INTLEVEL5_VECTOR_PADDR 0x40000240 +#define XCHAL_INTLEVEL6_VECOFS 0x00000280 +#define XCHAL_INTLEVEL6_VECTOR_VADDR 0x40000280 +#define XCHAL_INTLEVEL6_VECTOR_PADDR 0x40000280 +#define XCHAL_DEBUG_VECOFS XCHAL_INTLEVEL6_VECOFS +#define XCHAL_DEBUG_VECTOR_VADDR XCHAL_INTLEVEL6_VECTOR_VADDR +#define XCHAL_DEBUG_VECTOR_PADDR XCHAL_INTLEVEL6_VECTOR_PADDR +#define XCHAL_NMI_VECOFS 0x000002C0 +#define XCHAL_NMI_VECTOR_VADDR 0x400002C0 +#define XCHAL_NMI_VECTOR_PADDR 0x400002C0 +#define XCHAL_INTLEVEL7_VECOFS XCHAL_NMI_VECOFS +#define XCHAL_INTLEVEL7_VECTOR_VADDR XCHAL_NMI_VECTOR_VADDR +#define XCHAL_INTLEVEL7_VECTOR_PADDR XCHAL_NMI_VECTOR_PADDR + + +/*---------------------------------------------------------------------- + DEBUG MODULE + ----------------------------------------------------------------------*/ + +/* Misc */ +#define XCHAL_HAVE_DEBUG_ERI 1 /* ERI to debug module */ +#define XCHAL_HAVE_DEBUG_APB 1 /* APB to debug module */ +#define XCHAL_HAVE_DEBUG_JTAG 1 /* JTAG to debug module */ + +/* On-Chip Debug (OCD) */ +#define XCHAL_HAVE_OCD 1 /* OnChipDebug option */ +#define XCHAL_NUM_IBREAK 2 /* number of IBREAKn regs */ +#define XCHAL_NUM_DBREAK 2 /* number of DBREAKn regs */ +#define XCHAL_HAVE_OCD_DIR_ARRAY 0 /* faster OCD option (to LX4) */ +#define XCHAL_HAVE_OCD_LS32DDR 1 /* L32DDR/S32DDR (faster OCD) */ + +/* TRAX (in core) */ +#define XCHAL_HAVE_TRAX 1 /* TRAX in debug module */ +#define XCHAL_TRAX_MEM_SIZE 16384 /* TRAX memory size in bytes */ +#define XCHAL_TRAX_MEM_SHAREABLE 1 /* start/end regs; ready sig. */ +#define XCHAL_TRAX_ATB_WIDTH 32 /* ATB width (bits), 0=no ATB */ +#define XCHAL_TRAX_TIME_WIDTH 0 /* timestamp bitwidth, 0=none */ + +/* Perf counters */ +#define XCHAL_NUM_PERF_COUNTERS 2 /* performance counters */ + + +/*---------------------------------------------------------------------- + MMU + ----------------------------------------------------------------------*/ + +/* See core-matmap.h header file for more details. */ + +#define XCHAL_HAVE_TLBS 1 /* inverse of HAVE_CACHEATTR */ +#define XCHAL_HAVE_SPANNING_WAY 1 /* one way maps I+D 4GB vaddr */ +#define XCHAL_SPANNING_WAY 0 /* TLB spanning way number */ +#define XCHAL_HAVE_IDENTITY_MAP 1 /* vaddr == paddr always */ +#define XCHAL_HAVE_CACHEATTR 0 /* CACHEATTR register present */ +#define XCHAL_HAVE_MIMIC_CACHEATTR 1 /* region protection */ +#define XCHAL_HAVE_XLT_CACHEATTR 0 /* region prot. w/translation */ +#define XCHAL_HAVE_PTP_MMU 0 /* full MMU (with page table + [autorefill] and protection) + usable for an MMU-based OS */ +/* If none of the above last 4 are set, it's a custom TLB configuration. */ + +#define XCHAL_MMU_ASID_BITS 0 /* number of bits in ASIDs */ +#define XCHAL_MMU_RINGS 1 /* number of rings (1..4) */ +#define XCHAL_MMU_RING_BITS 0 /* num of bits in RING field */ + +#endif /* !XTENSA_HAL_NON_PRIVILEGED_ONLY */ + + +#endif /* _XTENSA_CORE_CONFIGURATION_H */ + diff --git a/arch/xtensa/include/esp32/xtensa/esp32/include/xtensa/config/core-matmap.h b/arch/xtensa/include/esp32/xtensa/esp32/include/xtensa/config/core-matmap.h new file mode 100644 index 0000000000000..b101f1e6aa893 --- /dev/null +++ b/arch/xtensa/include/esp32/xtensa/esp32/include/xtensa/config/core-matmap.h @@ -0,0 +1,318 @@ +/* + * xtensa/config/core-matmap.h -- Memory access and translation mapping + * parameters (CHAL) of the Xtensa processor core configuration. + * + * If you are using Xtensa Tools, see (which includes + * this file) for more details. + * + * In the Xtensa processor products released to date, all parameters + * defined in this file are derivable (at least in theory) from + * information contained in the core-isa.h header file. + * In particular, the following core configuration parameters are relevant: + * XCHAL_HAVE_CACHEATTR + * XCHAL_HAVE_MIMIC_CACHEATTR + * XCHAL_HAVE_XLT_CACHEATTR + * XCHAL_HAVE_PTP_MMU + * XCHAL_ITLB_ARF_ENTRIES_LOG2 + * XCHAL_DTLB_ARF_ENTRIES_LOG2 + * XCHAL_DCACHE_IS_WRITEBACK + * XCHAL_ICACHE_SIZE (presence of I-cache) + * XCHAL_DCACHE_SIZE (presence of D-cache) + * XCHAL_HW_VERSION_MAJOR + * XCHAL_HW_VERSION_MINOR + */ + +/* Customer ID=11657; Build=0x5fe96; Copyright (c) 1999-2016 Tensilica Inc. + + 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 the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 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. */ + + +#ifndef XTENSA_CONFIG_CORE_MATMAP_H +#define XTENSA_CONFIG_CORE_MATMAP_H + + +/*---------------------------------------------------------------------- + CACHE (MEMORY ACCESS) ATTRIBUTES + ----------------------------------------------------------------------*/ + + +/* Cache Attribute encodings -- lists of access modes for each cache attribute: */ +#define XCHAL_FCA_LIST XTHAL_FAM_EXCEPTION XCHAL_SEP \ + XTHAL_FAM_BYPASS XCHAL_SEP \ + XTHAL_FAM_BYPASS XCHAL_SEP \ + XTHAL_FAM_BYPASS XCHAL_SEP \ + XTHAL_FAM_BYPASS XCHAL_SEP \ + XTHAL_FAM_BYPASS XCHAL_SEP \ + XTHAL_FAM_BYPASS XCHAL_SEP \ + XTHAL_FAM_EXCEPTION XCHAL_SEP \ + XTHAL_FAM_EXCEPTION XCHAL_SEP \ + XTHAL_FAM_EXCEPTION XCHAL_SEP \ + XTHAL_FAM_EXCEPTION XCHAL_SEP \ + XTHAL_FAM_EXCEPTION XCHAL_SEP \ + XTHAL_FAM_EXCEPTION XCHAL_SEP \ + XTHAL_FAM_EXCEPTION XCHAL_SEP \ + XTHAL_FAM_EXCEPTION XCHAL_SEP \ + XTHAL_FAM_EXCEPTION +#define XCHAL_LCA_LIST XTHAL_LAM_BYPASSG XCHAL_SEP \ + XTHAL_LAM_BYPASSG XCHAL_SEP \ + XTHAL_LAM_BYPASSG XCHAL_SEP \ + XTHAL_LAM_EXCEPTION XCHAL_SEP \ + XTHAL_LAM_BYPASSG XCHAL_SEP \ + XTHAL_LAM_BYPASSG XCHAL_SEP \ + XTHAL_LAM_BYPASSG XCHAL_SEP \ + XTHAL_LAM_EXCEPTION XCHAL_SEP \ + XTHAL_LAM_EXCEPTION XCHAL_SEP \ + XTHAL_LAM_EXCEPTION XCHAL_SEP \ + XTHAL_LAM_EXCEPTION XCHAL_SEP \ + XTHAL_LAM_EXCEPTION XCHAL_SEP \ + XTHAL_LAM_EXCEPTION XCHAL_SEP \ + XTHAL_LAM_EXCEPTION XCHAL_SEP \ + XTHAL_LAM_BYPASSG XCHAL_SEP \ + XTHAL_LAM_EXCEPTION +#define XCHAL_SCA_LIST XTHAL_SAM_BYPASS XCHAL_SEP \ + XTHAL_SAM_BYPASS XCHAL_SEP \ + XTHAL_SAM_BYPASS XCHAL_SEP \ + XTHAL_SAM_EXCEPTION XCHAL_SEP \ + XTHAL_SAM_BYPASS XCHAL_SEP \ + XTHAL_SAM_BYPASS XCHAL_SEP \ + XTHAL_SAM_BYPASS XCHAL_SEP \ + XTHAL_SAM_EXCEPTION XCHAL_SEP \ + XTHAL_SAM_EXCEPTION XCHAL_SEP \ + XTHAL_SAM_EXCEPTION XCHAL_SEP \ + XTHAL_SAM_EXCEPTION XCHAL_SEP \ + XTHAL_SAM_EXCEPTION XCHAL_SEP \ + XTHAL_SAM_EXCEPTION XCHAL_SEP \ + XTHAL_SAM_EXCEPTION XCHAL_SEP \ + XTHAL_SAM_BYPASS XCHAL_SEP \ + XTHAL_SAM_EXCEPTION + + +/* + * Specific encoded cache attribute values of general interest. + * If a specific cache mode is not available, the closest available + * one is returned instead (eg. writethru instead of writeback, + * bypass instead of writethru). + */ +#define XCHAL_CA_BYPASS 2 /* cache disabled (bypassed) mode */ +#define XCHAL_CA_BYPASSBUF 6 /* cache disabled (bypassed) bufferable mode */ +#define XCHAL_CA_WRITETHRU 2 /* cache enabled (write-through) mode */ +#define XCHAL_CA_WRITEBACK 2 /* cache enabled (write-back) mode */ +#define XCHAL_HAVE_CA_WRITEBACK_NOALLOC 0 /* write-back no-allocate availability */ +#define XCHAL_CA_WRITEBACK_NOALLOC 2 /* cache enabled (write-back no-allocate) mode */ +#define XCHAL_CA_BYPASS_RW 0 /* cache disabled (bypassed) mode (no exec) */ +#define XCHAL_CA_WRITETHRU_RW 0 /* cache enabled (write-through) mode (no exec) */ +#define XCHAL_CA_WRITEBACK_RW 0 /* cache enabled (write-back) mode (no exec) */ +#define XCHAL_CA_WRITEBACK_NOALLOC_RW 0 /* cache enabled (write-back no-allocate) mode (no exec) */ +#define XCHAL_CA_ILLEGAL 15 /* no access allowed (all cause exceptions) mode */ +#define XCHAL_CA_ISOLATE 0 /* cache isolate (accesses go to cache not memory) mode */ + + +/*---------------------------------------------------------------------- + MMU + ----------------------------------------------------------------------*/ + +/* + * General notes on MMU parameters. + * + * Terminology: + * ASID = address-space ID (acts as an "extension" of virtual addresses) + * VPN = virtual page number + * PPN = physical page number + * CA = encoded cache attribute (access modes) + * TLB = translation look-aside buffer (term is stretched somewhat here) + * I = instruction (fetch accesses) + * D = data (load and store accesses) + * way = each TLB (ITLB and DTLB) consists of a number of "ways" + * that simultaneously match the virtual address of an access; + * a TLB successfully translates a virtual address if exactly + * one way matches the vaddr; if none match, it is a miss; + * if multiple match, one gets a "multihit" exception; + * each way can be independently configured in terms of number of + * entries, page sizes, which fields are writable or constant, etc. + * set = group of contiguous ways with exactly identical parameters + * ARF = auto-refill; hardware services a 1st-level miss by loading a PTE + * from the page table and storing it in one of the auto-refill ways; + * if this PTE load also misses, a miss exception is posted for s/w. + * min-wired = a "min-wired" way can be used to map a single (minimum-sized) + * page arbitrarily under program control; it has a single entry, + * is non-auto-refill (some other way(s) must be auto-refill), + * all its fields (VPN, PPN, ASID, CA) are all writable, and it + * supports the XCHAL_MMU_MIN_PTE_PAGE_SIZE page size (a current + * restriction is that this be the only page size it supports). + * + * TLB way entries are virtually indexed. + * TLB ways that support multiple page sizes: + * - must have all writable VPN and PPN fields; + * - can only use one page size at any given time (eg. setup at startup), + * selected by the respective ITLBCFG or DTLBCFG special register, + * whose bits n*4+3 .. n*4 index the list of page sizes for way n + * (XCHAL_xTLB_SETm_PAGESZ_LOG2_LIST for set m corresponding to way n); + * this list may be sparse for auto-refill ways because auto-refill + * ways have independent lists of supported page sizes sharing a + * common encoding with PTE entries; the encoding is the index into + * this list; unsupported sizes for a given way are zero in the list; + * selecting unsupported sizes results in undefined hardware behaviour; + * - is only possible for ways 0 thru 7 (due to ITLBCFG/DTLBCFG definition). + */ + +#define XCHAL_MMU_ASID_INVALID 0 /* ASID value indicating invalid address space */ +#define XCHAL_MMU_ASID_KERNEL 0 /* ASID value indicating kernel (ring 0) address space */ +#define XCHAL_MMU_SR_BITS 0 /* number of size-restriction bits supported */ +#define XCHAL_MMU_CA_BITS 4 /* number of bits needed to hold cache attribute encoding */ +#define XCHAL_MMU_MAX_PTE_PAGE_SIZE 29 /* max page size in a PTE structure (log2) */ +#define XCHAL_MMU_MIN_PTE_PAGE_SIZE 29 /* min page size in a PTE structure (log2) */ + + +/*** Instruction TLB: ***/ + +#define XCHAL_ITLB_WAY_BITS 0 /* number of bits holding the ways */ +#define XCHAL_ITLB_WAYS 1 /* number of ways (n-way set-associative TLB) */ +#define XCHAL_ITLB_ARF_WAYS 0 /* number of auto-refill ways */ +#define XCHAL_ITLB_SETS 1 /* number of sets (groups of ways with identical settings) */ + +/* Way set to which each way belongs: */ +#define XCHAL_ITLB_WAY0_SET 0 + +/* Ways sets that are used by hardware auto-refill (ARF): */ +#define XCHAL_ITLB_ARF_SETS 0 /* number of auto-refill sets */ + +/* Way sets that are "min-wired" (see terminology comment above): */ +#define XCHAL_ITLB_MINWIRED_SETS 0 /* number of "min-wired" sets */ + + +/* ITLB way set 0 (group of ways 0 thru 0): */ +#define XCHAL_ITLB_SET0_WAY 0 /* index of first way in this way set */ +#define XCHAL_ITLB_SET0_WAYS 1 /* number of (contiguous) ways in this way set */ +#define XCHAL_ITLB_SET0_ENTRIES_LOG2 3 /* log2(number of entries in this way) */ +#define XCHAL_ITLB_SET0_ENTRIES 8 /* number of entries in this way (always a power of 2) */ +#define XCHAL_ITLB_SET0_ARF 0 /* 1=autorefill by h/w, 0=non-autorefill (wired/constant/static) */ +#define XCHAL_ITLB_SET0_PAGESIZES 1 /* number of supported page sizes in this way */ +#define XCHAL_ITLB_SET0_PAGESZ_BITS 0 /* number of bits to encode the page size */ +#define XCHAL_ITLB_SET0_PAGESZ_LOG2_MIN 29 /* log2(minimum supported page size) */ +#define XCHAL_ITLB_SET0_PAGESZ_LOG2_MAX 29 /* log2(maximum supported page size) */ +#define XCHAL_ITLB_SET0_PAGESZ_LOG2_LIST 29 /* list of log2(page size)s, separated by XCHAL_SEP; + 2^PAGESZ_BITS entries in list, unsupported entries are zero */ +#define XCHAL_ITLB_SET0_ASID_CONSTMASK 0 /* constant ASID bits; 0 if all writable */ +#define XCHAL_ITLB_SET0_VPN_CONSTMASK 0x00000000 /* constant VPN bits, not including entry index bits; 0 if all writable */ +#define XCHAL_ITLB_SET0_PPN_CONSTMASK 0xE0000000 /* constant PPN bits, including entry index bits; 0 if all writable */ +#define XCHAL_ITLB_SET0_CA_CONSTMASK 0 /* constant CA bits; 0 if all writable */ +#define XCHAL_ITLB_SET0_ASID_RESET 0 /* 1 if ASID reset values defined (and all writable); 0 otherwise */ +#define XCHAL_ITLB_SET0_VPN_RESET 0 /* 1 if VPN reset values defined (and all writable); 0 otherwise */ +#define XCHAL_ITLB_SET0_PPN_RESET 0 /* 1 if PPN reset values defined (and all writable); 0 otherwise */ +#define XCHAL_ITLB_SET0_CA_RESET 1 /* 1 if CA reset values defined (and all writable); 0 otherwise */ +/* Constant VPN values for each entry of ITLB way set 0 (because VPN_CONSTMASK is non-zero): */ +#define XCHAL_ITLB_SET0_E0_VPN_CONST 0x00000000 +#define XCHAL_ITLB_SET0_E1_VPN_CONST 0x20000000 +#define XCHAL_ITLB_SET0_E2_VPN_CONST 0x40000000 +#define XCHAL_ITLB_SET0_E3_VPN_CONST 0x60000000 +#define XCHAL_ITLB_SET0_E4_VPN_CONST 0x80000000 +#define XCHAL_ITLB_SET0_E5_VPN_CONST 0xA0000000 +#define XCHAL_ITLB_SET0_E6_VPN_CONST 0xC0000000 +#define XCHAL_ITLB_SET0_E7_VPN_CONST 0xE0000000 +/* Constant PPN values for each entry of ITLB way set 0 (because PPN_CONSTMASK is non-zero): */ +#define XCHAL_ITLB_SET0_E0_PPN_CONST 0x00000000 +#define XCHAL_ITLB_SET0_E1_PPN_CONST 0x20000000 +#define XCHAL_ITLB_SET0_E2_PPN_CONST 0x40000000 +#define XCHAL_ITLB_SET0_E3_PPN_CONST 0x60000000 +#define XCHAL_ITLB_SET0_E4_PPN_CONST 0x80000000 +#define XCHAL_ITLB_SET0_E5_PPN_CONST 0xA0000000 +#define XCHAL_ITLB_SET0_E6_PPN_CONST 0xC0000000 +#define XCHAL_ITLB_SET0_E7_PPN_CONST 0xE0000000 +/* Reset CA values for each entry of ITLB way set 0 (because SET0_CA_RESET is non-zero): */ +#define XCHAL_ITLB_SET0_E0_CA_RESET 0x02 +#define XCHAL_ITLB_SET0_E1_CA_RESET 0x02 +#define XCHAL_ITLB_SET0_E2_CA_RESET 0x02 +#define XCHAL_ITLB_SET0_E3_CA_RESET 0x02 +#define XCHAL_ITLB_SET0_E4_CA_RESET 0x02 +#define XCHAL_ITLB_SET0_E5_CA_RESET 0x02 +#define XCHAL_ITLB_SET0_E6_CA_RESET 0x02 +#define XCHAL_ITLB_SET0_E7_CA_RESET 0x02 + + +/*** Data TLB: ***/ + +#define XCHAL_DTLB_WAY_BITS 0 /* number of bits holding the ways */ +#define XCHAL_DTLB_WAYS 1 /* number of ways (n-way set-associative TLB) */ +#define XCHAL_DTLB_ARF_WAYS 0 /* number of auto-refill ways */ +#define XCHAL_DTLB_SETS 1 /* number of sets (groups of ways with identical settings) */ + +/* Way set to which each way belongs: */ +#define XCHAL_DTLB_WAY0_SET 0 + +/* Ways sets that are used by hardware auto-refill (ARF): */ +#define XCHAL_DTLB_ARF_SETS 0 /* number of auto-refill sets */ + +/* Way sets that are "min-wired" (see terminology comment above): */ +#define XCHAL_DTLB_MINWIRED_SETS 0 /* number of "min-wired" sets */ + + +/* DTLB way set 0 (group of ways 0 thru 0): */ +#define XCHAL_DTLB_SET0_WAY 0 /* index of first way in this way set */ +#define XCHAL_DTLB_SET0_WAYS 1 /* number of (contiguous) ways in this way set */ +#define XCHAL_DTLB_SET0_ENTRIES_LOG2 3 /* log2(number of entries in this way) */ +#define XCHAL_DTLB_SET0_ENTRIES 8 /* number of entries in this way (always a power of 2) */ +#define XCHAL_DTLB_SET0_ARF 0 /* 1=autorefill by h/w, 0=non-autorefill (wired/constant/static) */ +#define XCHAL_DTLB_SET0_PAGESIZES 1 /* number of supported page sizes in this way */ +#define XCHAL_DTLB_SET0_PAGESZ_BITS 0 /* number of bits to encode the page size */ +#define XCHAL_DTLB_SET0_PAGESZ_LOG2_MIN 29 /* log2(minimum supported page size) */ +#define XCHAL_DTLB_SET0_PAGESZ_LOG2_MAX 29 /* log2(maximum supported page size) */ +#define XCHAL_DTLB_SET0_PAGESZ_LOG2_LIST 29 /* list of log2(page size)s, separated by XCHAL_SEP; + 2^PAGESZ_BITS entries in list, unsupported entries are zero */ +#define XCHAL_DTLB_SET0_ASID_CONSTMASK 0 /* constant ASID bits; 0 if all writable */ +#define XCHAL_DTLB_SET0_VPN_CONSTMASK 0x00000000 /* constant VPN bits, not including entry index bits; 0 if all writable */ +#define XCHAL_DTLB_SET0_PPN_CONSTMASK 0xE0000000 /* constant PPN bits, including entry index bits; 0 if all writable */ +#define XCHAL_DTLB_SET0_CA_CONSTMASK 0 /* constant CA bits; 0 if all writable */ +#define XCHAL_DTLB_SET0_ASID_RESET 0 /* 1 if ASID reset values defined (and all writable); 0 otherwise */ +#define XCHAL_DTLB_SET0_VPN_RESET 0 /* 1 if VPN reset values defined (and all writable); 0 otherwise */ +#define XCHAL_DTLB_SET0_PPN_RESET 0 /* 1 if PPN reset values defined (and all writable); 0 otherwise */ +#define XCHAL_DTLB_SET0_CA_RESET 1 /* 1 if CA reset values defined (and all writable); 0 otherwise */ +/* Constant VPN values for each entry of DTLB way set 0 (because VPN_CONSTMASK is non-zero): */ +#define XCHAL_DTLB_SET0_E0_VPN_CONST 0x00000000 +#define XCHAL_DTLB_SET0_E1_VPN_CONST 0x20000000 +#define XCHAL_DTLB_SET0_E2_VPN_CONST 0x40000000 +#define XCHAL_DTLB_SET0_E3_VPN_CONST 0x60000000 +#define XCHAL_DTLB_SET0_E4_VPN_CONST 0x80000000 +#define XCHAL_DTLB_SET0_E5_VPN_CONST 0xA0000000 +#define XCHAL_DTLB_SET0_E6_VPN_CONST 0xC0000000 +#define XCHAL_DTLB_SET0_E7_VPN_CONST 0xE0000000 +/* Constant PPN values for each entry of DTLB way set 0 (because PPN_CONSTMASK is non-zero): */ +#define XCHAL_DTLB_SET0_E0_PPN_CONST 0x00000000 +#define XCHAL_DTLB_SET0_E1_PPN_CONST 0x20000000 +#define XCHAL_DTLB_SET0_E2_PPN_CONST 0x40000000 +#define XCHAL_DTLB_SET0_E3_PPN_CONST 0x60000000 +#define XCHAL_DTLB_SET0_E4_PPN_CONST 0x80000000 +#define XCHAL_DTLB_SET0_E5_PPN_CONST 0xA0000000 +#define XCHAL_DTLB_SET0_E6_PPN_CONST 0xC0000000 +#define XCHAL_DTLB_SET0_E7_PPN_CONST 0xE0000000 +/* Reset CA values for each entry of DTLB way set 0 (because SET0_CA_RESET is non-zero): */ +#define XCHAL_DTLB_SET0_E0_CA_RESET 0x02 +#define XCHAL_DTLB_SET0_E1_CA_RESET 0x02 +#define XCHAL_DTLB_SET0_E2_CA_RESET 0x02 +#define XCHAL_DTLB_SET0_E3_CA_RESET 0x02 +#define XCHAL_DTLB_SET0_E4_CA_RESET 0x02 +#define XCHAL_DTLB_SET0_E5_CA_RESET 0x02 +#define XCHAL_DTLB_SET0_E6_CA_RESET 0x02 +#define XCHAL_DTLB_SET0_E7_CA_RESET 0x02 + + + + +#endif /*XTENSA_CONFIG_CORE_MATMAP_H*/ + diff --git a/arch/xtensa/include/esp32/xtensa/esp32/include/xtensa/config/core.h b/arch/xtensa/include/esp32/xtensa/esp32/include/xtensa/config/core.h new file mode 100644 index 0000000000000..7b1f05c1e8bb3 --- /dev/null +++ b/arch/xtensa/include/esp32/xtensa/esp32/include/xtensa/config/core.h @@ -0,0 +1,1416 @@ +/* + * xtensa/config/core.h -- HAL definitions dependent on CORE configuration + * + * This header file is sometimes referred to as the "compile-time HAL" or CHAL. + * It pulls definitions tailored for a specific Xtensa processor configuration. + * + * Sources for binaries meant to be configuration-independent generally avoid + * including this file (they may use the configuration-specific HAL library). + * It is normal for the HAL library source itself to include this file. + */ + +/* + * Copyright (c) 2005-2014 Cadence Design Systems, Inc. + * + * 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 the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 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. + */ + + +#ifndef XTENSA_CONFIG_CORE_H +#define XTENSA_CONFIG_CORE_H + +/* CONFIGURATION INDEPENDENT DEFINITIONS: */ +#ifdef __XTENSA__ +#include "../../../../include/xtensa/hal.h" +#include "../../../../include/xtensa/xtensa-versions.h" +#else +#include "xtensa/hal.h" +#include "xtensa/xtensa-versions.h" +#endif + +/* CONFIGURATION SPECIFIC DEFINITIONS: */ +#ifdef __XTENSA__ +#include "core-isa.h" +#include "core-matmap.h" +#include "tie.h" +#else +#include "core-isa.h" +#include "core-matmap.h" +#include "tie.h" +#endif + +#if defined (_ASMLANGUAGE) || defined (__ASSEMBLER__) +#ifdef __XTENSA__ +#include +#else +#include "tie-asm.h" +#endif +#endif /*_ASMLANGUAGE or __ASSEMBLER__*/ + + +/*---------------------------------------------------------------------- + GENERAL + ----------------------------------------------------------------------*/ + +/* + * Separators for macros that expand into arrays. + * These can be predefined by files that #include this one, + * when different separators are required. + */ +/* Element separator for macros that expand into 1-dimensional arrays: */ +#ifndef XCHAL_SEP +#define XCHAL_SEP , +#endif +/* Array separator for macros that expand into 2-dimensional arrays: */ +#ifndef XCHAL_SEP2 +#define XCHAL_SEP2 },{ +#endif + + + +/*---------------------------------------------------------------------- + ISA + ----------------------------------------------------------------------*/ + +#if XCHAL_HAVE_BE +# define XCHAL_HAVE_LE 0 +# define XCHAL_MEMORY_ORDER XTHAL_BIGENDIAN +#else +# define XCHAL_HAVE_LE 1 +# define XCHAL_MEMORY_ORDER XTHAL_LITTLEENDIAN +#endif + + + +/*---------------------------------------------------------------------- + INTERRUPTS + ----------------------------------------------------------------------*/ + +/* Indexing macros: */ +#define _XCHAL_INTLEVEL_MASK(n) XCHAL_INTLEVEL ## n ## _MASK +#define XCHAL_INTLEVEL_MASK(n) _XCHAL_INTLEVEL_MASK(n) /* n = 0 .. 15 */ +#define _XCHAL_INTLEVEL_ANDBELOWMASK(n) XCHAL_INTLEVEL ## n ## _ANDBELOW_MASK +#define XCHAL_INTLEVEL_ANDBELOW_MASK(n) _XCHAL_INTLEVEL_ANDBELOWMASK(n) /* n = 0 .. 15 */ +#define _XCHAL_INTLEVEL_NUM(n) XCHAL_INTLEVEL ## n ## _NUM +#define XCHAL_INTLEVEL_NUM(n) _XCHAL_INTLEVEL_NUM(n) /* n = 0 .. 15 */ +#define _XCHAL_INT_LEVEL(n) XCHAL_INT ## n ## _LEVEL +#define XCHAL_INT_LEVEL(n) _XCHAL_INT_LEVEL(n) /* n = 0 .. 31 */ +#define _XCHAL_INT_TYPE(n) XCHAL_INT ## n ## _TYPE +#define XCHAL_INT_TYPE(n) _XCHAL_INT_TYPE(n) /* n = 0 .. 31 */ +#define _XCHAL_TIMER_INTERRUPT(n) XCHAL_TIMER ## n ## _INTERRUPT +#define XCHAL_TIMER_INTERRUPT(n) _XCHAL_TIMER_INTERRUPT(n) /* n = 0 .. 3 */ + + +#define XCHAL_HAVE_HIGHLEVEL_INTERRUPTS XCHAL_HAVE_HIGHPRI_INTERRUPTS +#define XCHAL_NUM_LOWPRI_LEVELS 1 /* number of low-priority interrupt levels (always 1) */ +#define XCHAL_FIRST_HIGHPRI_LEVEL (XCHAL_NUM_LOWPRI_LEVELS+1) /* level of first high-priority interrupt (always 2) */ +/* Note: 1 <= LOWPRI_LEVELS <= EXCM_LEVEL < DEBUGLEVEL <= NUM_INTLEVELS < NMILEVEL <= 15 */ + +/* These values are constant for existing Xtensa processor implementations: */ +#define XCHAL_INTLEVEL0_MASK 0x00000000 +#define XCHAL_INTLEVEL8_MASK 0x00000000 +#define XCHAL_INTLEVEL9_MASK 0x00000000 +#define XCHAL_INTLEVEL10_MASK 0x00000000 +#define XCHAL_INTLEVEL11_MASK 0x00000000 +#define XCHAL_INTLEVEL12_MASK 0x00000000 +#define XCHAL_INTLEVEL13_MASK 0x00000000 +#define XCHAL_INTLEVEL14_MASK 0x00000000 +#define XCHAL_INTLEVEL15_MASK 0x00000000 + +/* Array of masks of interrupts at each interrupt level: */ +#define XCHAL_INTLEVEL_MASKS XCHAL_INTLEVEL0_MASK \ + XCHAL_SEP XCHAL_INTLEVEL1_MASK \ + XCHAL_SEP XCHAL_INTLEVEL2_MASK \ + XCHAL_SEP XCHAL_INTLEVEL3_MASK \ + XCHAL_SEP XCHAL_INTLEVEL4_MASK \ + XCHAL_SEP XCHAL_INTLEVEL5_MASK \ + XCHAL_SEP XCHAL_INTLEVEL6_MASK \ + XCHAL_SEP XCHAL_INTLEVEL7_MASK \ + XCHAL_SEP XCHAL_INTLEVEL8_MASK \ + XCHAL_SEP XCHAL_INTLEVEL9_MASK \ + XCHAL_SEP XCHAL_INTLEVEL10_MASK \ + XCHAL_SEP XCHAL_INTLEVEL11_MASK \ + XCHAL_SEP XCHAL_INTLEVEL12_MASK \ + XCHAL_SEP XCHAL_INTLEVEL13_MASK \ + XCHAL_SEP XCHAL_INTLEVEL14_MASK \ + XCHAL_SEP XCHAL_INTLEVEL15_MASK + +/* These values are constant for existing Xtensa processor implementations: */ +#define XCHAL_INTLEVEL0_ANDBELOW_MASK 0x00000000 +#define XCHAL_INTLEVEL8_ANDBELOW_MASK XCHAL_INTLEVEL7_ANDBELOW_MASK +#define XCHAL_INTLEVEL9_ANDBELOW_MASK XCHAL_INTLEVEL7_ANDBELOW_MASK +#define XCHAL_INTLEVEL10_ANDBELOW_MASK XCHAL_INTLEVEL7_ANDBELOW_MASK +#define XCHAL_INTLEVEL11_ANDBELOW_MASK XCHAL_INTLEVEL7_ANDBELOW_MASK +#define XCHAL_INTLEVEL12_ANDBELOW_MASK XCHAL_INTLEVEL7_ANDBELOW_MASK +#define XCHAL_INTLEVEL13_ANDBELOW_MASK XCHAL_INTLEVEL7_ANDBELOW_MASK +#define XCHAL_INTLEVEL14_ANDBELOW_MASK XCHAL_INTLEVEL7_ANDBELOW_MASK +#define XCHAL_INTLEVEL15_ANDBELOW_MASK XCHAL_INTLEVEL7_ANDBELOW_MASK + +/* Mask of all low-priority interrupts: */ +#define XCHAL_LOWPRI_MASK XCHAL_INTLEVEL1_ANDBELOW_MASK + +/* Mask of all interrupts masked by PS.EXCM (or CEXCM): */ +#define XCHAL_EXCM_MASK XCHAL_INTLEVEL_ANDBELOW_MASK(XCHAL_EXCM_LEVEL) + +/* Array of masks of interrupts at each range 1..n of interrupt levels: */ +#define XCHAL_INTLEVEL_ANDBELOW_MASKS XCHAL_INTLEVEL0_ANDBELOW_MASK \ + XCHAL_SEP XCHAL_INTLEVEL1_ANDBELOW_MASK \ + XCHAL_SEP XCHAL_INTLEVEL2_ANDBELOW_MASK \ + XCHAL_SEP XCHAL_INTLEVEL3_ANDBELOW_MASK \ + XCHAL_SEP XCHAL_INTLEVEL4_ANDBELOW_MASK \ + XCHAL_SEP XCHAL_INTLEVEL5_ANDBELOW_MASK \ + XCHAL_SEP XCHAL_INTLEVEL6_ANDBELOW_MASK \ + XCHAL_SEP XCHAL_INTLEVEL7_ANDBELOW_MASK \ + XCHAL_SEP XCHAL_INTLEVEL8_ANDBELOW_MASK \ + XCHAL_SEP XCHAL_INTLEVEL9_ANDBELOW_MASK \ + XCHAL_SEP XCHAL_INTLEVEL10_ANDBELOW_MASK \ + XCHAL_SEP XCHAL_INTLEVEL11_ANDBELOW_MASK \ + XCHAL_SEP XCHAL_INTLEVEL12_ANDBELOW_MASK \ + XCHAL_SEP XCHAL_INTLEVEL13_ANDBELOW_MASK \ + XCHAL_SEP XCHAL_INTLEVEL14_ANDBELOW_MASK \ + XCHAL_SEP XCHAL_INTLEVEL15_ANDBELOW_MASK + +#if 0 /*XCHAL_HAVE_NMI*/ +/* NMI "interrupt level" (for use with EXCSAVE_n, EPS_n, EPC_n, RFI n): */ +# define XCHAL_NMILEVEL (XCHAL_NUM_INTLEVELS+1) +#endif + +/* Array of levels of each possible interrupt: */ +#define XCHAL_INT_LEVELS XCHAL_INT0_LEVEL \ + XCHAL_SEP XCHAL_INT1_LEVEL \ + XCHAL_SEP XCHAL_INT2_LEVEL \ + XCHAL_SEP XCHAL_INT3_LEVEL \ + XCHAL_SEP XCHAL_INT4_LEVEL \ + XCHAL_SEP XCHAL_INT5_LEVEL \ + XCHAL_SEP XCHAL_INT6_LEVEL \ + XCHAL_SEP XCHAL_INT7_LEVEL \ + XCHAL_SEP XCHAL_INT8_LEVEL \ + XCHAL_SEP XCHAL_INT9_LEVEL \ + XCHAL_SEP XCHAL_INT10_LEVEL \ + XCHAL_SEP XCHAL_INT11_LEVEL \ + XCHAL_SEP XCHAL_INT12_LEVEL \ + XCHAL_SEP XCHAL_INT13_LEVEL \ + XCHAL_SEP XCHAL_INT14_LEVEL \ + XCHAL_SEP XCHAL_INT15_LEVEL \ + XCHAL_SEP XCHAL_INT16_LEVEL \ + XCHAL_SEP XCHAL_INT17_LEVEL \ + XCHAL_SEP XCHAL_INT18_LEVEL \ + XCHAL_SEP XCHAL_INT19_LEVEL \ + XCHAL_SEP XCHAL_INT20_LEVEL \ + XCHAL_SEP XCHAL_INT21_LEVEL \ + XCHAL_SEP XCHAL_INT22_LEVEL \ + XCHAL_SEP XCHAL_INT23_LEVEL \ + XCHAL_SEP XCHAL_INT24_LEVEL \ + XCHAL_SEP XCHAL_INT25_LEVEL \ + XCHAL_SEP XCHAL_INT26_LEVEL \ + XCHAL_SEP XCHAL_INT27_LEVEL \ + XCHAL_SEP XCHAL_INT28_LEVEL \ + XCHAL_SEP XCHAL_INT29_LEVEL \ + XCHAL_SEP XCHAL_INT30_LEVEL \ + XCHAL_SEP XCHAL_INT31_LEVEL + +/* Array of types of each possible interrupt: */ +#define XCHAL_INT_TYPES XCHAL_INT0_TYPE \ + XCHAL_SEP XCHAL_INT1_TYPE \ + XCHAL_SEP XCHAL_INT2_TYPE \ + XCHAL_SEP XCHAL_INT3_TYPE \ + XCHAL_SEP XCHAL_INT4_TYPE \ + XCHAL_SEP XCHAL_INT5_TYPE \ + XCHAL_SEP XCHAL_INT6_TYPE \ + XCHAL_SEP XCHAL_INT7_TYPE \ + XCHAL_SEP XCHAL_INT8_TYPE \ + XCHAL_SEP XCHAL_INT9_TYPE \ + XCHAL_SEP XCHAL_INT10_TYPE \ + XCHAL_SEP XCHAL_INT11_TYPE \ + XCHAL_SEP XCHAL_INT12_TYPE \ + XCHAL_SEP XCHAL_INT13_TYPE \ + XCHAL_SEP XCHAL_INT14_TYPE \ + XCHAL_SEP XCHAL_INT15_TYPE \ + XCHAL_SEP XCHAL_INT16_TYPE \ + XCHAL_SEP XCHAL_INT17_TYPE \ + XCHAL_SEP XCHAL_INT18_TYPE \ + XCHAL_SEP XCHAL_INT19_TYPE \ + XCHAL_SEP XCHAL_INT20_TYPE \ + XCHAL_SEP XCHAL_INT21_TYPE \ + XCHAL_SEP XCHAL_INT22_TYPE \ + XCHAL_SEP XCHAL_INT23_TYPE \ + XCHAL_SEP XCHAL_INT24_TYPE \ + XCHAL_SEP XCHAL_INT25_TYPE \ + XCHAL_SEP XCHAL_INT26_TYPE \ + XCHAL_SEP XCHAL_INT27_TYPE \ + XCHAL_SEP XCHAL_INT28_TYPE \ + XCHAL_SEP XCHAL_INT29_TYPE \ + XCHAL_SEP XCHAL_INT30_TYPE \ + XCHAL_SEP XCHAL_INT31_TYPE + +/* Array of masks of interrupts for each type of interrupt: */ +#define XCHAL_INTTYPE_MASKS XCHAL_INTTYPE_MASK_UNCONFIGURED \ + XCHAL_SEP XCHAL_INTTYPE_MASK_SOFTWARE \ + XCHAL_SEP XCHAL_INTTYPE_MASK_EXTERN_EDGE \ + XCHAL_SEP XCHAL_INTTYPE_MASK_EXTERN_LEVEL \ + XCHAL_SEP XCHAL_INTTYPE_MASK_TIMER \ + XCHAL_SEP XCHAL_INTTYPE_MASK_NMI \ + XCHAL_SEP XCHAL_INTTYPE_MASK_WRITE_ERROR + +/* Interrupts that can be cleared using the INTCLEAR special register: */ +#define XCHAL_INTCLEARABLE_MASK (XCHAL_INTTYPE_MASK_SOFTWARE+XCHAL_INTTYPE_MASK_EXTERN_EDGE+XCHAL_INTTYPE_MASK_WRITE_ERROR) +/* Interrupts that can be triggered using the INTSET special register: */ +#define XCHAL_INTSETTABLE_MASK XCHAL_INTTYPE_MASK_SOFTWARE + +/* Array of interrupts assigned to each timer (CCOMPARE0 to CCOMPARE3): */ +#define XCHAL_TIMER_INTERRUPTS XCHAL_TIMER0_INTERRUPT \ + XCHAL_SEP XCHAL_TIMER1_INTERRUPT \ + XCHAL_SEP XCHAL_TIMER2_INTERRUPT \ + XCHAL_SEP XCHAL_TIMER3_INTERRUPT + + + +/* For backward compatibility and for the array macros, define macros for + * each unconfigured interrupt number (unfortunately, the value of + * XTHAL_INTTYPE_UNCONFIGURED is not zero): */ +#if XCHAL_NUM_INTERRUPTS == 0 +# define XCHAL_INT0_LEVEL 0 +# define XCHAL_INT0_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 1 +# define XCHAL_INT1_LEVEL 0 +# define XCHAL_INT1_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 2 +# define XCHAL_INT2_LEVEL 0 +# define XCHAL_INT2_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 3 +# define XCHAL_INT3_LEVEL 0 +# define XCHAL_INT3_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 4 +# define XCHAL_INT4_LEVEL 0 +# define XCHAL_INT4_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 5 +# define XCHAL_INT5_LEVEL 0 +# define XCHAL_INT5_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 6 +# define XCHAL_INT6_LEVEL 0 +# define XCHAL_INT6_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 7 +# define XCHAL_INT7_LEVEL 0 +# define XCHAL_INT7_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 8 +# define XCHAL_INT8_LEVEL 0 +# define XCHAL_INT8_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 9 +# define XCHAL_INT9_LEVEL 0 +# define XCHAL_INT9_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 10 +# define XCHAL_INT10_LEVEL 0 +# define XCHAL_INT10_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 11 +# define XCHAL_INT11_LEVEL 0 +# define XCHAL_INT11_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 12 +# define XCHAL_INT12_LEVEL 0 +# define XCHAL_INT12_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 13 +# define XCHAL_INT13_LEVEL 0 +# define XCHAL_INT13_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 14 +# define XCHAL_INT14_LEVEL 0 +# define XCHAL_INT14_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 15 +# define XCHAL_INT15_LEVEL 0 +# define XCHAL_INT15_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 16 +# define XCHAL_INT16_LEVEL 0 +# define XCHAL_INT16_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 17 +# define XCHAL_INT17_LEVEL 0 +# define XCHAL_INT17_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 18 +# define XCHAL_INT18_LEVEL 0 +# define XCHAL_INT18_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 19 +# define XCHAL_INT19_LEVEL 0 +# define XCHAL_INT19_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 20 +# define XCHAL_INT20_LEVEL 0 +# define XCHAL_INT20_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 21 +# define XCHAL_INT21_LEVEL 0 +# define XCHAL_INT21_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 22 +# define XCHAL_INT22_LEVEL 0 +# define XCHAL_INT22_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 23 +# define XCHAL_INT23_LEVEL 0 +# define XCHAL_INT23_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 24 +# define XCHAL_INT24_LEVEL 0 +# define XCHAL_INT24_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 25 +# define XCHAL_INT25_LEVEL 0 +# define XCHAL_INT25_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 26 +# define XCHAL_INT26_LEVEL 0 +# define XCHAL_INT26_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 27 +# define XCHAL_INT27_LEVEL 0 +# define XCHAL_INT27_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 28 +# define XCHAL_INT28_LEVEL 0 +# define XCHAL_INT28_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 29 +# define XCHAL_INT29_LEVEL 0 +# define XCHAL_INT29_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 30 +# define XCHAL_INT30_LEVEL 0 +# define XCHAL_INT30_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif +#if XCHAL_NUM_INTERRUPTS <= 31 +# define XCHAL_INT31_LEVEL 0 +# define XCHAL_INT31_TYPE XTHAL_INTTYPE_UNCONFIGURED +#endif + + +/* + * Masks and levels corresponding to each *external* interrupt. + */ + +#define XCHAL_EXTINT0_MASK (1 << XCHAL_EXTINT0_NUM) +#define XCHAL_EXTINT0_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT0_NUM) +#define XCHAL_EXTINT1_MASK (1 << XCHAL_EXTINT1_NUM) +#define XCHAL_EXTINT1_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT1_NUM) +#define XCHAL_EXTINT2_MASK (1 << XCHAL_EXTINT2_NUM) +#define XCHAL_EXTINT2_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT2_NUM) +#define XCHAL_EXTINT3_MASK (1 << XCHAL_EXTINT3_NUM) +#define XCHAL_EXTINT3_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT3_NUM) +#define XCHAL_EXTINT4_MASK (1 << XCHAL_EXTINT4_NUM) +#define XCHAL_EXTINT4_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT4_NUM) +#define XCHAL_EXTINT5_MASK (1 << XCHAL_EXTINT5_NUM) +#define XCHAL_EXTINT5_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT5_NUM) +#define XCHAL_EXTINT6_MASK (1 << XCHAL_EXTINT6_NUM) +#define XCHAL_EXTINT6_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT6_NUM) +#define XCHAL_EXTINT7_MASK (1 << XCHAL_EXTINT7_NUM) +#define XCHAL_EXTINT7_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT7_NUM) +#define XCHAL_EXTINT8_MASK (1 << XCHAL_EXTINT8_NUM) +#define XCHAL_EXTINT8_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT8_NUM) +#define XCHAL_EXTINT9_MASK (1 << XCHAL_EXTINT9_NUM) +#define XCHAL_EXTINT9_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT9_NUM) +#define XCHAL_EXTINT10_MASK (1 << XCHAL_EXTINT10_NUM) +#define XCHAL_EXTINT10_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT10_NUM) +#define XCHAL_EXTINT11_MASK (1 << XCHAL_EXTINT11_NUM) +#define XCHAL_EXTINT11_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT11_NUM) +#define XCHAL_EXTINT12_MASK (1 << XCHAL_EXTINT12_NUM) +#define XCHAL_EXTINT12_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT12_NUM) +#define XCHAL_EXTINT13_MASK (1 << XCHAL_EXTINT13_NUM) +#define XCHAL_EXTINT13_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT13_NUM) +#define XCHAL_EXTINT14_MASK (1 << XCHAL_EXTINT14_NUM) +#define XCHAL_EXTINT14_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT14_NUM) +#define XCHAL_EXTINT15_MASK (1 << XCHAL_EXTINT15_NUM) +#define XCHAL_EXTINT15_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT15_NUM) +#define XCHAL_EXTINT16_MASK (1 << XCHAL_EXTINT16_NUM) +#define XCHAL_EXTINT16_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT16_NUM) +#define XCHAL_EXTINT17_MASK (1 << XCHAL_EXTINT17_NUM) +#define XCHAL_EXTINT17_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT17_NUM) +#define XCHAL_EXTINT18_MASK (1 << XCHAL_EXTINT18_NUM) +#define XCHAL_EXTINT18_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT18_NUM) +#define XCHAL_EXTINT19_MASK (1 << XCHAL_EXTINT19_NUM) +#define XCHAL_EXTINT19_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT19_NUM) +#define XCHAL_EXTINT20_MASK (1 << XCHAL_EXTINT20_NUM) +#define XCHAL_EXTINT20_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT20_NUM) +#define XCHAL_EXTINT21_MASK (1 << XCHAL_EXTINT21_NUM) +#define XCHAL_EXTINT21_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT21_NUM) +#define XCHAL_EXTINT22_MASK (1 << XCHAL_EXTINT22_NUM) +#define XCHAL_EXTINT22_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT22_NUM) +#define XCHAL_EXTINT23_MASK (1 << XCHAL_EXTINT23_NUM) +#define XCHAL_EXTINT23_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT23_NUM) +#define XCHAL_EXTINT24_MASK (1 << XCHAL_EXTINT24_NUM) +#define XCHAL_EXTINT24_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT24_NUM) +#define XCHAL_EXTINT25_MASK (1 << XCHAL_EXTINT25_NUM) +#define XCHAL_EXTINT25_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT25_NUM) +#define XCHAL_EXTINT26_MASK (1 << XCHAL_EXTINT26_NUM) +#define XCHAL_EXTINT26_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT26_NUM) +#define XCHAL_EXTINT27_MASK (1 << XCHAL_EXTINT27_NUM) +#define XCHAL_EXTINT27_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT27_NUM) +#define XCHAL_EXTINT28_MASK (1 << XCHAL_EXTINT28_NUM) +#define XCHAL_EXTINT28_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT28_NUM) +#define XCHAL_EXTINT29_MASK (1 << XCHAL_EXTINT29_NUM) +#define XCHAL_EXTINT29_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT29_NUM) +#define XCHAL_EXTINT30_MASK (1 << XCHAL_EXTINT30_NUM) +#define XCHAL_EXTINT30_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT30_NUM) +#define XCHAL_EXTINT31_MASK (1 << XCHAL_EXTINT31_NUM) +#define XCHAL_EXTINT31_LEVEL XCHAL_INT_LEVEL(XCHAL_EXTINT31_NUM) + + +/*---------------------------------------------------------------------- + EXCEPTIONS and VECTORS + ----------------------------------------------------------------------*/ + +/* For backward compatibility ONLY -- DO NOT USE (will be removed in future release): */ +#define XCHAL_HAVE_OLD_EXC_ARCH XCHAL_HAVE_XEA1 /* (DEPRECATED) 1 if old exception architecture (XEA1), 0 otherwise (eg. XEA2) */ +#define XCHAL_HAVE_EXCM XCHAL_HAVE_XEA2 /* (DEPRECATED) 1 if PS.EXCM bit exists (currently equals XCHAL_HAVE_TLBS) */ +#ifdef XCHAL_USER_VECTOR_VADDR +#define XCHAL_PROGRAMEXC_VECTOR_VADDR XCHAL_USER_VECTOR_VADDR +#define XCHAL_USEREXC_VECTOR_VADDR XCHAL_USER_VECTOR_VADDR +#endif +#ifdef XCHAL_USER_VECTOR_PADDR +# define XCHAL_PROGRAMEXC_VECTOR_PADDR XCHAL_USER_VECTOR_PADDR +# define XCHAL_USEREXC_VECTOR_PADDR XCHAL_USER_VECTOR_PADDR +#endif +#ifdef XCHAL_KERNEL_VECTOR_VADDR +# define XCHAL_STACKEDEXC_VECTOR_VADDR XCHAL_KERNEL_VECTOR_VADDR +# define XCHAL_KERNELEXC_VECTOR_VADDR XCHAL_KERNEL_VECTOR_VADDR +#endif +#ifdef XCHAL_KERNEL_VECTOR_PADDR +# define XCHAL_STACKEDEXC_VECTOR_PADDR XCHAL_KERNEL_VECTOR_PADDR +# define XCHAL_KERNELEXC_VECTOR_PADDR XCHAL_KERNEL_VECTOR_PADDR +#endif + +#if 0 +#if XCHAL_HAVE_DEBUG +# define XCHAL_DEBUG_VECTOR_VADDR XCHAL_INTLEVEL_VECTOR_VADDR(XCHAL_DEBUGLEVEL) +/* This one should only get defined if the corresponding intlevel paddr macro exists: */ +# define XCHAL_DEBUG_VECTOR_PADDR XCHAL_INTLEVEL_VECTOR_PADDR(XCHAL_DEBUGLEVEL) +#endif +#endif + +/* Indexing macros: */ +#define _XCHAL_INTLEVEL_VECTOR_VADDR(n) XCHAL_INTLEVEL ## n ## _VECTOR_VADDR +#define XCHAL_INTLEVEL_VECTOR_VADDR(n) _XCHAL_INTLEVEL_VECTOR_VADDR(n) /* n = 0 .. 15 */ + +/* + * General Exception Causes + * (values of EXCCAUSE special register set by general exceptions, + * which vector to the user, kernel, or double-exception vectors). + * + * DEPRECATED. Please use the equivalent EXCCAUSE_xxx macros + * defined in . (Note that these have slightly + * different names, they don't just have the XCHAL_ prefix removed.) + */ +#define XCHAL_EXCCAUSE_ILLEGAL_INSTRUCTION 0 /* Illegal Instruction */ +#define XCHAL_EXCCAUSE_SYSTEM_CALL 1 /* System Call */ +#define XCHAL_EXCCAUSE_INSTRUCTION_FETCH_ERROR 2 /* Instruction Fetch Error */ +#define XCHAL_EXCCAUSE_LOAD_STORE_ERROR 3 /* Load Store Error */ +#define XCHAL_EXCCAUSE_LEVEL1_INTERRUPT 4 /* Level 1 Interrupt */ +#define XCHAL_EXCCAUSE_ALLOCA 5 /* Stack Extension Assist */ +#define XCHAL_EXCCAUSE_INTEGER_DIVIDE_BY_ZERO 6 /* Integer Divide by Zero */ +#define XCHAL_EXCCAUSE_SPECULATION 7 /* Speculation */ +#define XCHAL_EXCCAUSE_PRIVILEGED 8 /* Privileged Instruction */ +#define XCHAL_EXCCAUSE_UNALIGNED 9 /* Unaligned Load Store */ +/*10..15 reserved*/ +#define XCHAL_EXCCAUSE_ITLB_MISS 16 /* ITlb Miss Exception */ +#define XCHAL_EXCCAUSE_ITLB_MULTIHIT 17 /* ITlb Mutltihit Exception */ +#define XCHAL_EXCCAUSE_ITLB_PRIVILEGE 18 /* ITlb Privilege Exception */ +#define XCHAL_EXCCAUSE_ITLB_SIZE_RESTRICTION 19 /* ITlb Size Restriction Exception */ +#define XCHAL_EXCCAUSE_FETCH_CACHE_ATTRIBUTE 20 /* Fetch Cache Attribute Exception */ +/*21..23 reserved*/ +#define XCHAL_EXCCAUSE_DTLB_MISS 24 /* DTlb Miss Exception */ +#define XCHAL_EXCCAUSE_DTLB_MULTIHIT 25 /* DTlb Multihit Exception */ +#define XCHAL_EXCCAUSE_DTLB_PRIVILEGE 26 /* DTlb Privilege Exception */ +#define XCHAL_EXCCAUSE_DTLB_SIZE_RESTRICTION 27 /* DTlb Size Restriction Exception */ +#define XCHAL_EXCCAUSE_LOAD_CACHE_ATTRIBUTE 28 /* Load Cache Attribute Exception */ +#define XCHAL_EXCCAUSE_STORE_CACHE_ATTRIBUTE 29 /* Store Cache Attribute Exception */ +/*30..31 reserved*/ +#define XCHAL_EXCCAUSE_COPROCESSOR0_DISABLED 32 /* Coprocessor 0 disabled */ +#define XCHAL_EXCCAUSE_COPROCESSOR1_DISABLED 33 /* Coprocessor 1 disabled */ +#define XCHAL_EXCCAUSE_COPROCESSOR2_DISABLED 34 /* Coprocessor 2 disabled */ +#define XCHAL_EXCCAUSE_COPROCESSOR3_DISABLED 35 /* Coprocessor 3 disabled */ +#define XCHAL_EXCCAUSE_COPROCESSOR4_DISABLED 36 /* Coprocessor 4 disabled */ +#define XCHAL_EXCCAUSE_COPROCESSOR5_DISABLED 37 /* Coprocessor 5 disabled */ +#define XCHAL_EXCCAUSE_COPROCESSOR6_DISABLED 38 /* Coprocessor 6 disabled */ +#define XCHAL_EXCCAUSE_COPROCESSOR7_DISABLED 39 /* Coprocessor 7 disabled */ +/*40..63 reserved*/ + + +/* + * Miscellaneous special register fields. + * + * For each special register, and each field within each register: + * XCHAL__VALIDMASK is the set of bits defined in the register. + * XCHAL___BITS is the number of bits in the field. + * XCHAL___NUM is 2^bits, the number of possible values + * of the field. + * XCHAL___SHIFT is the position of the field within + * the register, starting from the least significant bit. + * + * DEPRECATED. Please use the equivalent macros defined in + * . (Note that these have different names.) + */ + +/* DBREAKC (special register number 160): */ +#define XCHAL_DBREAKC_VALIDMASK 0xC000003F +#define XCHAL_DBREAKC_MASK_BITS 6 +#define XCHAL_DBREAKC_MASK_NUM 64 +#define XCHAL_DBREAKC_MASK_SHIFT 0 +#define XCHAL_DBREAKC_MASK_MASK 0x0000003F +#define XCHAL_DBREAKC_LOADBREAK_BITS 1 +#define XCHAL_DBREAKC_LOADBREAK_NUM 2 +#define XCHAL_DBREAKC_LOADBREAK_SHIFT 30 +#define XCHAL_DBREAKC_LOADBREAK_MASK 0x40000000 +#define XCHAL_DBREAKC_STOREBREAK_BITS 1 +#define XCHAL_DBREAKC_STOREBREAK_NUM 2 +#define XCHAL_DBREAKC_STOREBREAK_SHIFT 31 +#define XCHAL_DBREAKC_STOREBREAK_MASK 0x80000000 +/* PS (special register number 230): */ +#define XCHAL_PS_VALIDMASK 0x00070F3F +#define XCHAL_PS_INTLEVEL_BITS 4 +#define XCHAL_PS_INTLEVEL_NUM 16 +#define XCHAL_PS_INTLEVEL_SHIFT 0 +#define XCHAL_PS_INTLEVEL_MASK 0x0000000F +#define XCHAL_PS_EXCM_BITS 1 +#define XCHAL_PS_EXCM_NUM 2 +#define XCHAL_PS_EXCM_SHIFT 4 +#define XCHAL_PS_EXCM_MASK 0x00000010 +#define XCHAL_PS_UM_BITS 1 +#define XCHAL_PS_UM_NUM 2 +#define XCHAL_PS_UM_SHIFT 5 +#define XCHAL_PS_UM_MASK 0x00000020 +#define XCHAL_PS_RING_BITS 2 +#define XCHAL_PS_RING_NUM 4 +#define XCHAL_PS_RING_SHIFT 6 +#define XCHAL_PS_RING_MASK 0x000000C0 +#define XCHAL_PS_OWB_BITS 4 +#define XCHAL_PS_OWB_NUM 16 +#define XCHAL_PS_OWB_SHIFT 8 +#define XCHAL_PS_OWB_MASK 0x00000F00 +#define XCHAL_PS_CALLINC_BITS 2 +#define XCHAL_PS_CALLINC_NUM 4 +#define XCHAL_PS_CALLINC_SHIFT 16 +#define XCHAL_PS_CALLINC_MASK 0x00030000 +#define XCHAL_PS_WOE_BITS 1 +#define XCHAL_PS_WOE_NUM 2 +#define XCHAL_PS_WOE_SHIFT 18 +#define XCHAL_PS_WOE_MASK 0x00040000 +/* EXCCAUSE (special register number 232): */ +#define XCHAL_EXCCAUSE_VALIDMASK 0x0000003F +#define XCHAL_EXCCAUSE_BITS 6 +#define XCHAL_EXCCAUSE_NUM 64 +#define XCHAL_EXCCAUSE_SHIFT 0 +#define XCHAL_EXCCAUSE_MASK 0x0000003F +/* DEBUGCAUSE (special register number 233): */ +#define XCHAL_DEBUGCAUSE_VALIDMASK 0x0000003F +#define XCHAL_DEBUGCAUSE_ICOUNT_BITS 1 +#define XCHAL_DEBUGCAUSE_ICOUNT_NUM 2 +#define XCHAL_DEBUGCAUSE_ICOUNT_SHIFT 0 +#define XCHAL_DEBUGCAUSE_ICOUNT_MASK 0x00000001 +#define XCHAL_DEBUGCAUSE_IBREAK_BITS 1 +#define XCHAL_DEBUGCAUSE_IBREAK_NUM 2 +#define XCHAL_DEBUGCAUSE_IBREAK_SHIFT 1 +#define XCHAL_DEBUGCAUSE_IBREAK_MASK 0x00000002 +#define XCHAL_DEBUGCAUSE_DBREAK_BITS 1 +#define XCHAL_DEBUGCAUSE_DBREAK_NUM 2 +#define XCHAL_DEBUGCAUSE_DBREAK_SHIFT 2 +#define XCHAL_DEBUGCAUSE_DBREAK_MASK 0x00000004 +#define XCHAL_DEBUGCAUSE_BREAK_BITS 1 +#define XCHAL_DEBUGCAUSE_BREAK_NUM 2 +#define XCHAL_DEBUGCAUSE_BREAK_SHIFT 3 +#define XCHAL_DEBUGCAUSE_BREAK_MASK 0x00000008 +#define XCHAL_DEBUGCAUSE_BREAKN_BITS 1 +#define XCHAL_DEBUGCAUSE_BREAKN_NUM 2 +#define XCHAL_DEBUGCAUSE_BREAKN_SHIFT 4 +#define XCHAL_DEBUGCAUSE_BREAKN_MASK 0x00000010 +#define XCHAL_DEBUGCAUSE_DEBUGINT_BITS 1 +#define XCHAL_DEBUGCAUSE_DEBUGINT_NUM 2 +#define XCHAL_DEBUGCAUSE_DEBUGINT_SHIFT 5 +#define XCHAL_DEBUGCAUSE_DEBUGINT_MASK 0x00000020 + + + + +/*---------------------------------------------------------------------- + TIMERS + ----------------------------------------------------------------------*/ + +/*#define XCHAL_HAVE_TIMERS XCHAL_HAVE_CCOUNT*/ + + + +/*---------------------------------------------------------------------- + INTERNAL I/D RAM/ROMs and XLMI + ----------------------------------------------------------------------*/ + +#define XCHAL_NUM_IROM XCHAL_NUM_INSTROM /* (DEPRECATED) */ +#define XCHAL_NUM_IRAM XCHAL_NUM_INSTRAM /* (DEPRECATED) */ +#define XCHAL_NUM_DROM XCHAL_NUM_DATAROM /* (DEPRECATED) */ +#define XCHAL_NUM_DRAM XCHAL_NUM_DATARAM /* (DEPRECATED) */ + +#define XCHAL_IROM0_VADDR XCHAL_INSTROM0_VADDR /* (DEPRECATED) */ +#define XCHAL_IROM0_PADDR XCHAL_INSTROM0_PADDR /* (DEPRECATED) */ +#define XCHAL_IROM0_SIZE XCHAL_INSTROM0_SIZE /* (DEPRECATED) */ +#define XCHAL_IROM1_VADDR XCHAL_INSTROM1_VADDR /* (DEPRECATED) */ +#define XCHAL_IROM1_PADDR XCHAL_INSTROM1_PADDR /* (DEPRECATED) */ +#define XCHAL_IROM1_SIZE XCHAL_INSTROM1_SIZE /* (DEPRECATED) */ +#define XCHAL_IRAM0_VADDR XCHAL_INSTRAM0_VADDR /* (DEPRECATED) */ +#define XCHAL_IRAM0_PADDR XCHAL_INSTRAM0_PADDR /* (DEPRECATED) */ +#define XCHAL_IRAM0_SIZE XCHAL_INSTRAM0_SIZE /* (DEPRECATED) */ +#define XCHAL_IRAM1_VADDR XCHAL_INSTRAM1_VADDR /* (DEPRECATED) */ +#define XCHAL_IRAM1_PADDR XCHAL_INSTRAM1_PADDR /* (DEPRECATED) */ +#define XCHAL_IRAM1_SIZE XCHAL_INSTRAM1_SIZE /* (DEPRECATED) */ +#define XCHAL_DROM0_VADDR XCHAL_DATAROM0_VADDR /* (DEPRECATED) */ +#define XCHAL_DROM0_PADDR XCHAL_DATAROM0_PADDR /* (DEPRECATED) */ +#define XCHAL_DROM0_SIZE XCHAL_DATAROM0_SIZE /* (DEPRECATED) */ +#define XCHAL_DROM1_VADDR XCHAL_DATAROM1_VADDR /* (DEPRECATED) */ +#define XCHAL_DROM1_PADDR XCHAL_DATAROM1_PADDR /* (DEPRECATED) */ +#define XCHAL_DROM1_SIZE XCHAL_DATAROM1_SIZE /* (DEPRECATED) */ +#define XCHAL_DRAM0_VADDR XCHAL_DATARAM0_VADDR /* (DEPRECATED) */ +#define XCHAL_DRAM0_PADDR XCHAL_DATARAM0_PADDR /* (DEPRECATED) */ +#define XCHAL_DRAM0_SIZE XCHAL_DATARAM0_SIZE /* (DEPRECATED) */ +#define XCHAL_DRAM1_VADDR XCHAL_DATARAM1_VADDR /* (DEPRECATED) */ +#define XCHAL_DRAM1_PADDR XCHAL_DATARAM1_PADDR /* (DEPRECATED) */ +#define XCHAL_DRAM1_SIZE XCHAL_DATARAM1_SIZE /* (DEPRECATED) */ + + + +/*---------------------------------------------------------------------- + CACHE + ----------------------------------------------------------------------*/ + + +/* Default PREFCTL value to enable prefetch. */ +#if XCHAL_HW_MIN_VERSION < XTENSA_HWVERSION_RE_2012_0 +#define XCHAL_CACHE_PREFCTL_DEFAULT 0x00044 /* enabled, not aggressive */ +#elif XCHAL_HW_MIN_VERSION < XTENSA_HWVERSION_RF_2014_0 +#define XCHAL_CACHE_PREFCTL_DEFAULT 0x01044 /* + enable prefetch to L1 */ +#elif XCHAL_PREFETCH_ENTRIES >= 16 +#define XCHAL_CACHE_PREFCTL_DEFAULT 0x81044 /* 12 entries for block ops */ +#elif XCHAL_PREFETCH_ENTRIES >= 8 +#define XCHAL_CACHE_PREFCTL_DEFAULT 0x51044 /* 5 entries for block ops */ +#else +#define XCHAL_CACHE_PREFCTL_DEFAULT 0x01044 /* 0 entries for block ops */ +#endif + + +/* Max for both I-cache and D-cache (used for general alignment): */ +#if XCHAL_ICACHE_LINESIZE > XCHAL_DCACHE_LINESIZE +# define XCHAL_CACHE_LINEWIDTH_MAX XCHAL_ICACHE_LINEWIDTH +# define XCHAL_CACHE_LINESIZE_MAX XCHAL_ICACHE_LINESIZE +#else +# define XCHAL_CACHE_LINEWIDTH_MAX XCHAL_DCACHE_LINEWIDTH +# define XCHAL_CACHE_LINESIZE_MAX XCHAL_DCACHE_LINESIZE +#endif + +#define XCHAL_ICACHE_SETSIZE (1< XCHAL_DCACHE_SETWIDTH +# define XCHAL_CACHE_SETWIDTH_MAX XCHAL_ICACHE_SETWIDTH +# define XCHAL_CACHE_SETSIZE_MAX XCHAL_ICACHE_SETSIZE +#else +# define XCHAL_CACHE_SETWIDTH_MAX XCHAL_DCACHE_SETWIDTH +# define XCHAL_CACHE_SETSIZE_MAX XCHAL_DCACHE_SETSIZE +#endif + +/* Instruction cache tag bits: */ +#define XCHAL_ICACHE_TAG_V_SHIFT 0 +#define XCHAL_ICACHE_TAG_V 0x1 /* valid bit */ +#if XCHAL_ICACHE_WAYS > 1 +# define XCHAL_ICACHE_TAG_F_SHIFT 1 +# define XCHAL_ICACHE_TAG_F 0x2 /* fill (LRU) bit */ +#else +# define XCHAL_ICACHE_TAG_F_SHIFT 0 +# define XCHAL_ICACHE_TAG_F 0 /* no fill (LRU) bit */ +#endif +#if XCHAL_ICACHE_LINE_LOCKABLE +# define XCHAL_ICACHE_TAG_L_SHIFT (XCHAL_ICACHE_TAG_F_SHIFT+1) +# define XCHAL_ICACHE_TAG_L (1 << XCHAL_ICACHE_TAG_L_SHIFT) /* lock bit */ +#else +# define XCHAL_ICACHE_TAG_L_SHIFT XCHAL_ICACHE_TAG_F_SHIFT +# define XCHAL_ICACHE_TAG_L 0 /* no lock bit */ +#endif +/* Data cache tag bits: */ +#define XCHAL_DCACHE_TAG_V_SHIFT 0 +#define XCHAL_DCACHE_TAG_V 0x1 /* valid bit */ +#if XCHAL_DCACHE_WAYS > 1 +# define XCHAL_DCACHE_TAG_F_SHIFT 1 +# define XCHAL_DCACHE_TAG_F 0x2 /* fill (LRU) bit */ +#else +# define XCHAL_DCACHE_TAG_F_SHIFT 0 +# define XCHAL_DCACHE_TAG_F 0 /* no fill (LRU) bit */ +#endif +#if XCHAL_DCACHE_IS_WRITEBACK +# define XCHAL_DCACHE_TAG_D_SHIFT (XCHAL_DCACHE_TAG_F_SHIFT+1) +# define XCHAL_DCACHE_TAG_D (1 << XCHAL_DCACHE_TAG_D_SHIFT) /* dirty bit */ +#else +# define XCHAL_DCACHE_TAG_D_SHIFT XCHAL_DCACHE_TAG_F_SHIFT +# define XCHAL_DCACHE_TAG_D 0 /* no dirty bit */ +#endif +#if XCHAL_DCACHE_LINE_LOCKABLE +# define XCHAL_DCACHE_TAG_L_SHIFT (XCHAL_DCACHE_TAG_D_SHIFT+1) +# define XCHAL_DCACHE_TAG_L (1 << XCHAL_DCACHE_TAG_L_SHIFT) /* lock bit */ +#else +# define XCHAL_DCACHE_TAG_L_SHIFT XCHAL_DCACHE_TAG_D_SHIFT +# define XCHAL_DCACHE_TAG_L 0 /* no lock bit */ +#endif + +/* Whether MEMCTL register has anything useful */ +#define XCHAL_USE_MEMCTL (((XCHAL_LOOP_BUFFER_SIZE > 0) || \ + XCHAL_DCACHE_IS_COHERENT || \ + XCHAL_HAVE_ICACHE_DYN_WAYS || \ + XCHAL_HAVE_DCACHE_DYN_WAYS) && \ + (XCHAL_HW_MIN_VERSION >= XTENSA_HWVERSION_RE_2012_0)) + +/* Default MEMCTL values: */ +#if XCHAL_HAVE_ICACHE_DYN_WAYS || XCHAL_HAVE_DCACHE_DYN_WAYS +/* NOTE: constant defined this way to allow movi instead of l32r in reset code. */ +#define XCHAL_CACHE_MEMCTL_DEFAULT 0xFFFFFF00 /* Init all possible ways */ +#else +#define XCHAL_CACHE_MEMCTL_DEFAULT 0x00000000 /* Nothing to do */ +#endif + +#if XCHAL_DCACHE_IS_COHERENT +#define _MEMCTL_SNOOP_EN 0x02 /* Enable snoop */ +#else +#define _MEMCTL_SNOOP_EN 0x00 /* Don't enable snoop */ +#endif + +#if (XCHAL_LOOP_BUFFER_SIZE == 0) || XCHAL_ERRATUM_453 +#define _MEMCTL_L0IBUF_EN 0x00 /* No loop buffer or don't enable */ +#else +#define _MEMCTL_L0IBUF_EN 0x01 /* Enable loop buffer */ +#endif + +#define XCHAL_SNOOP_LB_MEMCTL_DEFAULT (_MEMCTL_SNOOP_EN | _MEMCTL_L0IBUF_EN) + + +/*---------------------------------------------------------------------- + MMU + ----------------------------------------------------------------------*/ + +/* See for more details. */ + +/* Has different semantic in open source headers (where it means HAVE_PTP_MMU), + so comment out starting with RB-2008.3 release; later, might get + get reintroduced as a synonym for XCHAL_HAVE_PTP_MMU instead: */ +/*#define XCHAL_HAVE_MMU XCHAL_HAVE_TLBS*/ /* (DEPRECATED; use XCHAL_HAVE_TLBS instead) */ + +/* Indexing macros: */ +#define _XCHAL_ITLB_SET(n,_what) XCHAL_ITLB_SET ## n ## _what +#define XCHAL_ITLB_SET(n,what) _XCHAL_ITLB_SET(n, _ ## what ) +#define _XCHAL_ITLB_SET_E(n,i,_what) XCHAL_ITLB_SET ## n ## _E ## i ## _what +#define XCHAL_ITLB_SET_E(n,i,what) _XCHAL_ITLB_SET_E(n,i, _ ## what ) +#define _XCHAL_DTLB_SET(n,_what) XCHAL_DTLB_SET ## n ## _what +#define XCHAL_DTLB_SET(n,what) _XCHAL_DTLB_SET(n, _ ## what ) +#define _XCHAL_DTLB_SET_E(n,i,_what) XCHAL_DTLB_SET ## n ## _E ## i ## _what +#define XCHAL_DTLB_SET_E(n,i,what) _XCHAL_DTLB_SET_E(n,i, _ ## what ) +/* + * Example use: XCHAL_ITLB_SET(XCHAL_ITLB_ARF_SET0,ENTRIES) + * to get the value of XCHAL_ITLB_SET_ENTRIES where is the first auto-refill set. + */ + +/* Number of entries per autorefill way: */ +#define XCHAL_ITLB_ARF_ENTRIES (1< 0 && XCHAL_DTLB_ARF_WAYS > 0 && XCHAL_MMU_RINGS >= 2 +# define XCHAL_HAVE_PTP_MMU 1 /* have full MMU (with page table [autorefill] and protection) */ +#else +# define XCHAL_HAVE_PTP_MMU 0 /* don't have full MMU */ +#endif +#endif + +/* + * For full MMUs, report kernel RAM segment and kernel I/O segment static page mappings: + */ +#if XCHAL_HAVE_PTP_MMU && !XCHAL_HAVE_SPANNING_WAY +#define XCHAL_KSEG_CACHED_VADDR 0xD0000000 /* virt.addr of kernel RAM cached static map */ +#define XCHAL_KSEG_CACHED_PADDR 0x00000000 /* phys.addr of kseg_cached */ +#define XCHAL_KSEG_CACHED_SIZE 0x08000000 /* size in bytes of kseg_cached (assumed power of 2!!!) */ +#define XCHAL_KSEG_BYPASS_VADDR 0xD8000000 /* virt.addr of kernel RAM bypass (uncached) static map */ +#define XCHAL_KSEG_BYPASS_PADDR 0x00000000 /* phys.addr of kseg_bypass */ +#define XCHAL_KSEG_BYPASS_SIZE 0x08000000 /* size in bytes of kseg_bypass (assumed power of 2!!!) */ + +#define XCHAL_KIO_CACHED_VADDR 0xE0000000 /* virt.addr of kernel I/O cached static map */ +#define XCHAL_KIO_CACHED_PADDR 0xF0000000 /* phys.addr of kio_cached */ +#define XCHAL_KIO_CACHED_SIZE 0x10000000 /* size in bytes of kio_cached (assumed power of 2!!!) */ +#define XCHAL_KIO_BYPASS_VADDR 0xF0000000 /* virt.addr of kernel I/O bypass (uncached) static map */ +#define XCHAL_KIO_BYPASS_PADDR 0xF0000000 /* phys.addr of kio_bypass */ +#define XCHAL_KIO_BYPASS_SIZE 0x10000000 /* size in bytes of kio_bypass (assumed power of 2!!!) */ + +#define XCHAL_SEG_MAPPABLE_VADDR 0x00000000 /* start of largest non-static-mapped virtual addr area */ +#define XCHAL_SEG_MAPPABLE_SIZE 0xD0000000 /* size in bytes of " */ +/* define XCHAL_SEG_MAPPABLE2_xxx if more areas present, sorted in order of descending size. */ +#endif + + +/*---------------------------------------------------------------------- + MISC + ----------------------------------------------------------------------*/ + +/* Data alignment required if used for instructions: */ +#if XCHAL_INST_FETCH_WIDTH > XCHAL_DATA_WIDTH +# define XCHAL_ALIGN_MAX XCHAL_INST_FETCH_WIDTH +#else +# define XCHAL_ALIGN_MAX XCHAL_DATA_WIDTH +#endif + +/* + * Names kept for backward compatibility. + * (Here "RELEASE" is now a misnomer; these are product *versions*, not the releases + * under which they are released. In the T10##.# era there was no distinction.) + */ +#define XCHAL_HW_RELEASE_MAJOR XCHAL_HW_VERSION_MAJOR +#define XCHAL_HW_RELEASE_MINOR XCHAL_HW_VERSION_MINOR +#define XCHAL_HW_RELEASE_NAME XCHAL_HW_VERSION_NAME + + + + +/*---------------------------------------------------------------------- + COPROCESSORS and EXTRA STATE + ----------------------------------------------------------------------*/ + +#define XCHAL_EXTRA_SA_SIZE XCHAL_NCP_SA_SIZE +#define XCHAL_EXTRA_SA_ALIGN XCHAL_NCP_SA_ALIGN +#define XCHAL_CPEXTRA_SA_SIZE XCHAL_TOTAL_SA_SIZE +#define XCHAL_CPEXTRA_SA_ALIGN XCHAL_TOTAL_SA_ALIGN + +#if defined (_ASMLANGUAGE) || defined (__ASSEMBLER__) + + /* Invoked at start of save area load/store sequence macro to setup macro + * internal offsets. Not usually invoked directly. + * continue 0 for 1st sequence, 1 for subsequent consecutive ones. + * totofs offset from original ptr to next load/store location. + */ + .macro xchal_sa_start continue totofs + .ifeq \continue + .set .Lxchal_pofs_, 0 /* offset from original ptr to current \ptr */ + .set .Lxchal_ofs_, 0 /* offset from current \ptr to next load/store location */ + .endif + .if \totofs + 1 /* if totofs specified (not -1) */ + .set .Lxchal_ofs_, \totofs - .Lxchal_pofs_ /* specific offset from original ptr */ + .endif + .endm + + /* Align portion of save area and bring ptr in range if necessary. + * Used by save area load/store sequences. Not usually invoked directly. + * Allows combining multiple (sub-)sequences arbitrarily. + * ptr pointer to save area (may be off, see .Lxchal_pofs_) + * minofs,maxofs range of offset from cur ptr to next load/store loc; + * minofs <= 0 <= maxofs (0 must always be valid offset) + * range must be within +/- 30kB or so. + * ofsalign alignment granularity of minofs .. maxofs (pow of 2) + * (restriction on offset from ptr to next load/store loc) + * totalign align from orig ptr to next load/store loc (pow of 2) + */ + .macro xchal_sa_align ptr minofs maxofs ofsalign totalign + /* First align where we start accessing the next register + * per \totalign relative to original ptr (i.e. start of the save area): + */ + .set .Lxchal_ofs_, ((.Lxchal_pofs_ + .Lxchal_ofs_ + \totalign - 1) & -\totalign) - .Lxchal_pofs_ + /* If necessary, adjust \ptr to bring .Lxchal_ofs_ in acceptable range: */ + .if (((\maxofs) - .Lxchal_ofs_) & 0xC0000000) | ((.Lxchal_ofs_ - (\minofs)) & 0xC0000000) | (.Lxchal_ofs_ & (\ofsalign-1)) + .set .Ligmask, 0xFFFFFFFF /* TODO: optimize to addmi, per aligns and .Lxchal_ofs_ */ + addi \ptr, \ptr, (.Lxchal_ofs_ & .Ligmask) + .set .Lxchal_pofs_, .Lxchal_pofs_ + (.Lxchal_ofs_ & .Ligmask) + .set .Lxchal_ofs_, (.Lxchal_ofs_ & ~.Ligmask) + .endif + .endm + /* + * We could optimize for addi to expand to only addmi instead of + * "addmi;addi", where possible. Here's a partial example how: + * .set .Lmaxmask, -(\ofsalign) & -(\totalign) + * .if (((\maxofs) + ~.Lmaxmask + 1) & 0xFFFFFF00) && ((.Lxchal_ofs_ & ~.Lmaxmask) == 0) + * .set .Ligmask, 0xFFFFFF00 + * .elif ... ditto for negative ofs range ... + * .set .Ligmask, 0xFFFFFF00 + * .set ... adjust per offset ... + * .else + * .set .Ligmask, 0xFFFFFFFF + * .endif + */ + + /* Invoke this after xchal_XXX_{load,store} macros to restore \ptr. */ + .macro xchal_sa_ptr_restore ptr + .if .Lxchal_pofs_ + addi \ptr, \ptr, - .Lxchal_pofs_ + .set .Lxchal_ofs_, .Lxchal_ofs_ + .Lxchal_pofs_ + .set .Lxchal_pofs_, 0 + .endif + .endm + + /* + * Use as eg: + * xchal_atmps_store a1, SOMEOFS, XCHAL_SA_NUM_ATMPS, a4, a5 + * xchal_ncp_load a2, a0,a3,a4,a5 + * xchal_atmps_load a1, SOMEOFS, XCHAL_SA_NUM_ATMPS, a4, a5 + * + * Specify only the ARs you *haven't* saved/restored already, up to 4. + * They *must* be the *last* ARs (in same order) specified to save area + * load/store sequences. In the example above, a0 and a3 were already + * saved/restored and unused (thus available) but a4 and a5 were not. + */ +#define xchal_atmps_store xchal_atmps_loadstore s32i, +#define xchal_atmps_load xchal_atmps_loadstore l32i, + .macro xchal_atmps_loadstore inst ptr offset nreq aa=0 ab=0 ac=0 ad=0 + .set .Lnsaved_, 0 + .irp reg,\aa,\ab,\ac,\ad + .ifeq 0x\reg ; .set .Lnsaved_,.Lnsaved_+1 ; .endif + .endr + .set .Laofs_, 0 + .irp reg,\aa,\ab,\ac,\ad + .ifgt (\nreq)-.Lnsaved_ + \inst \reg, \ptr, .Laofs_+\offset + .set .Laofs_,.Laofs_+4 + .set .Lnsaved_,.Lnsaved_+1 + .endif + .endr + .endm + +/*#define xchal_ncp_load_a2 xchal_ncp_load a2,a3,a4,a5,a6*/ +/*#define xchal_ncp_store_a2 xchal_ncp_store a2,a3,a4,a5,a6*/ +#define xchal_extratie_load xchal_ncptie_load +#define xchal_extratie_store xchal_ncptie_store +#define xchal_extratie_load_a2 xchal_ncptie_load a2,a3,a4,a5,a6 +#define xchal_extratie_store_a2 xchal_ncptie_store a2,a3,a4,a5,a6 +#define xchal_extra_load xchal_ncp_load +#define xchal_extra_store xchal_ncp_store +#define xchal_extra_load_a2 xchal_ncp_load a2,a3,a4,a5,a6 +#define xchal_extra_store_a2 xchal_ncp_store a2,a3,a4,a5,a6 +#define xchal_extra_load_funcbody xchal_ncp_load a2,a3,a4,a5,a6 +#define xchal_extra_store_funcbody xchal_ncp_store a2,a3,a4,a5,a6 +#define xchal_cp0_store_a2 xchal_cp0_store a2,a3,a4,a5,a6 +#define xchal_cp0_load_a2 xchal_cp0_load a2,a3,a4,a5,a6 +#define xchal_cp1_store_a2 xchal_cp1_store a2,a3,a4,a5,a6 +#define xchal_cp1_load_a2 xchal_cp1_load a2,a3,a4,a5,a6 +#define xchal_cp2_store_a2 xchal_cp2_store a2,a3,a4,a5,a6 +#define xchal_cp2_load_a2 xchal_cp2_load a2,a3,a4,a5,a6 +#define xchal_cp3_store_a2 xchal_cp3_store a2,a3,a4,a5,a6 +#define xchal_cp3_load_a2 xchal_cp3_load a2,a3,a4,a5,a6 +#define xchal_cp4_store_a2 xchal_cp4_store a2,a3,a4,a5,a6 +#define xchal_cp4_load_a2 xchal_cp4_load a2,a3,a4,a5,a6 +#define xchal_cp5_store_a2 xchal_cp5_store a2,a3,a4,a5,a6 +#define xchal_cp5_load_a2 xchal_cp5_load a2,a3,a4,a5,a6 +#define xchal_cp6_store_a2 xchal_cp6_store a2,a3,a4,a5,a6 +#define xchal_cp6_load_a2 xchal_cp6_load a2,a3,a4,a5,a6 +#define xchal_cp7_store_a2 xchal_cp7_store a2,a3,a4,a5,a6 +#define xchal_cp7_load_a2 xchal_cp7_load a2,a3,a4,a5,a6 + +/* Empty placeholder macros for undefined coprocessors: */ +#if (XCHAL_CP_MASK & ~XCHAL_CP_PORT_MASK) == 0 +# if XCHAL_CP0_SA_SIZE == 0 + .macro xchal_cp0_store p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp0_load p a b c d continue=0 ofs=-1 select=-1 ; .endm +# endif +# if XCHAL_CP1_SA_SIZE == 0 + .macro xchal_cp1_store p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp1_load p a b c d continue=0 ofs=-1 select=-1 ; .endm +# endif +# if XCHAL_CP2_SA_SIZE == 0 + .macro xchal_cp2_store p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp2_load p a b c d continue=0 ofs=-1 select=-1 ; .endm +# endif +# if XCHAL_CP3_SA_SIZE == 0 + .macro xchal_cp3_store p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp3_load p a b c d continue=0 ofs=-1 select=-1 ; .endm +# endif +# if XCHAL_CP4_SA_SIZE == 0 + .macro xchal_cp4_store p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp4_load p a b c d continue=0 ofs=-1 select=-1 ; .endm +# endif +# if XCHAL_CP5_SA_SIZE == 0 + .macro xchal_cp5_store p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp5_load p a b c d continue=0 ofs=-1 select=-1 ; .endm +# endif +# if XCHAL_CP6_SA_SIZE == 0 + .macro xchal_cp6_store p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp6_load p a b c d continue=0 ofs=-1 select=-1 ; .endm +# endif +# if XCHAL_CP7_SA_SIZE == 0 + .macro xchal_cp7_store p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp7_load p a b c d continue=0 ofs=-1 select=-1 ; .endm +# endif +#endif + + /******************** + * Macros to create functions that save and restore the state of *any* TIE + * coprocessor (by dynamic index). + */ + + /* + * Macro that expands to the body of a function + * that stores the selected coprocessor's state (registers etc). + * Entry: a2 = ptr to save area in which to save cp state + * a3 = coprocessor number + * Exit: any register a2-a15 (?) may have been clobbered. + */ + .macro xchal_cpi_store_funcbody +#if (XCHAL_CP_MASK & ~XCHAL_CP_PORT_MASK) +# if XCHAL_CP0_SA_SIZE + bnez a3, 99f + xchal_cp0_store_a2 + j 90f +99: +# endif +# if XCHAL_CP1_SA_SIZE + bnei a3, 1, 99f + xchal_cp1_store_a2 + j 90f +99: +# endif +# if XCHAL_CP2_SA_SIZE + bnei a3, 2, 99f + xchal_cp2_store_a2 + j 90f +99: +# endif +# if XCHAL_CP3_SA_SIZE + bnei a3, 3, 99f + xchal_cp3_store_a2 + j 90f +99: +# endif +# if XCHAL_CP4_SA_SIZE + bnei a3, 4, 99f + xchal_cp4_store_a2 + j 90f +99: +# endif +# if XCHAL_CP5_SA_SIZE + bnei a3, 5, 99f + xchal_cp5_store_a2 + j 90f +99: +# endif +# if XCHAL_CP6_SA_SIZE + bnei a3, 6, 99f + xchal_cp6_store_a2 + j 90f +99: +# endif +# if XCHAL_CP7_SA_SIZE + bnei a3, 7, 99f + xchal_cp7_store_a2 + j 90f +99: +# endif +90: +#endif + .endm + + /* + * Macro that expands to the body of a function + * that loads the selected coprocessor's state (registers etc). + * Entry: a2 = ptr to save area from which to restore cp state + * a3 = coprocessor number + * Exit: any register a2-a15 (?) may have been clobbered. + */ + .macro xchal_cpi_load_funcbody +#if (XCHAL_CP_MASK & ~XCHAL_CP_PORT_MASK) +# if XCHAL_CP0_SA_SIZE + bnez a3, 99f + xchal_cp0_load_a2 + j 90f +99: +# endif +# if XCHAL_CP1_SA_SIZE + bnei a3, 1, 99f + xchal_cp1_load_a2 + j 90f +99: +# endif +# if XCHAL_CP2_SA_SIZE + bnei a3, 2, 99f + xchal_cp2_load_a2 + j 90f +99: +# endif +# if XCHAL_CP3_SA_SIZE + bnei a3, 3, 99f + xchal_cp3_load_a2 + j 90f +99: +# endif +# if XCHAL_CP4_SA_SIZE + bnei a3, 4, 99f + xchal_cp4_load_a2 + j 90f +99: +# endif +# if XCHAL_CP5_SA_SIZE + bnei a3, 5, 99f + xchal_cp5_load_a2 + j 90f +99: +# endif +# if XCHAL_CP6_SA_SIZE + bnei a3, 6, 99f + xchal_cp6_load_a2 + j 90f +99: +# endif +# if XCHAL_CP7_SA_SIZE + bnei a3, 7, 99f + xchal_cp7_load_a2 + j 90f +99: +# endif +90: +#endif + .endm + +#endif /*_ASMLANGUAGE or __ASSEMBLER__*/ + + +/* Other default macros for undefined coprocessors: */ +#ifndef XCHAL_CP0_NAME +# define XCHAL_CP0_NAME 0 +# define XCHAL_CP0_SA_CONTENTS_LIBDB_NUM 0 +# define XCHAL_CP0_SA_CONTENTS_LIBDB /* empty */ +#endif +#ifndef XCHAL_CP1_NAME +# define XCHAL_CP1_NAME 0 +# define XCHAL_CP1_SA_CONTENTS_LIBDB_NUM 0 +# define XCHAL_CP1_SA_CONTENTS_LIBDB /* empty */ +#endif +#ifndef XCHAL_CP2_NAME +# define XCHAL_CP2_NAME 0 +# define XCHAL_CP2_SA_CONTENTS_LIBDB_NUM 0 +# define XCHAL_CP2_SA_CONTENTS_LIBDB /* empty */ +#endif +#ifndef XCHAL_CP3_NAME +# define XCHAL_CP3_NAME 0 +# define XCHAL_CP3_SA_CONTENTS_LIBDB_NUM 0 +# define XCHAL_CP3_SA_CONTENTS_LIBDB /* empty */ +#endif +#ifndef XCHAL_CP4_NAME +# define XCHAL_CP4_NAME 0 +# define XCHAL_CP4_SA_CONTENTS_LIBDB_NUM 0 +# define XCHAL_CP4_SA_CONTENTS_LIBDB /* empty */ +#endif +#ifndef XCHAL_CP5_NAME +# define XCHAL_CP5_NAME 0 +# define XCHAL_CP5_SA_CONTENTS_LIBDB_NUM 0 +# define XCHAL_CP5_SA_CONTENTS_LIBDB /* empty */ +#endif +#ifndef XCHAL_CP6_NAME +# define XCHAL_CP6_NAME 0 +# define XCHAL_CP6_SA_CONTENTS_LIBDB_NUM 0 +# define XCHAL_CP6_SA_CONTENTS_LIBDB /* empty */ +#endif +#ifndef XCHAL_CP7_NAME +# define XCHAL_CP7_NAME 0 +# define XCHAL_CP7_SA_CONTENTS_LIBDB_NUM 0 +# define XCHAL_CP7_SA_CONTENTS_LIBDB /* empty */ +#endif + +#if XCHAL_CP_MASK == 0 +/* Filler info for unassigned coprocessors, to simplify arrays etc: */ +#define XCHAL_CP0_SA_SIZE 0 +#define XCHAL_CP0_SA_ALIGN 1 +#define XCHAL_CP1_SA_SIZE 0 +#define XCHAL_CP1_SA_ALIGN 1 +#define XCHAL_CP2_SA_SIZE 0 +#define XCHAL_CP2_SA_ALIGN 1 +#define XCHAL_CP3_SA_SIZE 0 +#define XCHAL_CP3_SA_ALIGN 1 +#define XCHAL_CP4_SA_SIZE 0 +#define XCHAL_CP4_SA_ALIGN 1 +#define XCHAL_CP5_SA_SIZE 0 +#define XCHAL_CP5_SA_ALIGN 1 +#define XCHAL_CP6_SA_SIZE 0 +#define XCHAL_CP6_SA_ALIGN 1 +#define XCHAL_CP7_SA_SIZE 0 +#define XCHAL_CP7_SA_ALIGN 1 +#endif + + +/* Indexing macros: */ +#define _XCHAL_CP_SA_SIZE(n) XCHAL_CP ## n ## _SA_SIZE +#define XCHAL_CP_SA_SIZE(n) _XCHAL_CP_SA_SIZE(n) /* n = 0 .. 7 */ +#define _XCHAL_CP_SA_ALIGN(n) XCHAL_CP ## n ## _SA_ALIGN +#define XCHAL_CP_SA_ALIGN(n) _XCHAL_CP_SA_ALIGN(n) /* n = 0 .. 7 */ + +#define XCHAL_CPEXTRA_SA_SIZE_TOR2 XCHAL_CPEXTRA_SA_SIZE /* Tor2Beta only - do not use */ + +/* Link-time HAL global variables that report coprocessor numbers by name + (names are case-preserved from the original TIE): */ +#if !defined(_ASMLANGUAGE) && !defined(_NOCLANGUAGE) && !defined(__ASSEMBLER__) +# define _XCJOIN(a,b) a ## b +# define XCJOIN(a,b) _XCJOIN(a,b) +# ifdef XCHAL_CP0_NAME +extern const unsigned char XCJOIN(Xthal_cp_id_,XCHAL_CP0_IDENT); +extern const unsigned int XCJOIN(Xthal_cp_mask_,XCHAL_CP0_IDENT); +# endif +# ifdef XCHAL_CP1_NAME +extern const unsigned char XCJOIN(Xthal_cp_id_,XCHAL_CP1_IDENT); +extern const unsigned int XCJOIN(Xthal_cp_mask_,XCHAL_CP1_IDENT); +# endif +# ifdef XCHAL_CP2_NAME +extern const unsigned char XCJOIN(Xthal_cp_id_,XCHAL_CP2_IDENT); +extern const unsigned int XCJOIN(Xthal_cp_mask_,XCHAL_CP2_IDENT); +# endif +# ifdef XCHAL_CP3_NAME +extern const unsigned char XCJOIN(Xthal_cp_id_,XCHAL_CP3_IDENT); +extern const unsigned int XCJOIN(Xthal_cp_mask_,XCHAL_CP3_IDENT); +# endif +# ifdef XCHAL_CP4_NAME +extern const unsigned char XCJOIN(Xthal_cp_id_,XCHAL_CP4_IDENT); +extern const unsigned int XCJOIN(Xthal_cp_mask_,XCHAL_CP4_IDENT); +# endif +# ifdef XCHAL_CP5_NAME +extern const unsigned char XCJOIN(Xthal_cp_id_,XCHAL_CP5_IDENT); +extern const unsigned int XCJOIN(Xthal_cp_mask_,XCHAL_CP5_IDENT); +# endif +# ifdef XCHAL_CP6_NAME +extern const unsigned char XCJOIN(Xthal_cp_id_,XCHAL_CP6_IDENT); +extern const unsigned int XCJOIN(Xthal_cp_mask_,XCHAL_CP6_IDENT); +# endif +# ifdef XCHAL_CP7_NAME +extern const unsigned char XCJOIN(Xthal_cp_id_,XCHAL_CP7_IDENT); +extern const unsigned int XCJOIN(Xthal_cp_mask_,XCHAL_CP7_IDENT); +# endif +#endif + + + + +/*---------------------------------------------------------------------- + DERIVED + ----------------------------------------------------------------------*/ + +#if XCHAL_HAVE_BE +#define XCHAL_INST_ILLN 0xD60F /* 2-byte illegal instruction, msb-first */ +#define XCHAL_INST_ILLN_BYTE0 0xD6 /* 2-byte illegal instruction, 1st byte */ +#define XCHAL_INST_ILLN_BYTE1 0x0F /* 2-byte illegal instruction, 2nd byte */ +#else +#define XCHAL_INST_ILLN 0xF06D /* 2-byte illegal instruction, lsb-first */ +#define XCHAL_INST_ILLN_BYTE0 0x6D /* 2-byte illegal instruction, 1st byte */ +#define XCHAL_INST_ILLN_BYTE1 0xF0 /* 2-byte illegal instruction, 2nd byte */ +#endif +/* Belongs in xtensa/hal.h: */ +#define XTHAL_INST_ILL 0x000000 /* 3-byte illegal instruction */ + + +/* + * Because information as to exactly which hardware version is targeted + * by a given software build is not always available, compile-time HAL + * Hardware-Release "_AT" macros are fuzzy (return 0, 1, or XCHAL_MAYBE): + * (Here "RELEASE" is now a misnomer; these are product *versions*, not the releases + * under which they are released. In the T10##.# era there was no distinction.) + */ +#if XCHAL_HW_CONFIGID_RELIABLE +# define XCHAL_HW_RELEASE_AT_OR_BELOW(major,minor) (XTHAL_REL_LE( XCHAL_HW_VERSION_MAJOR,XCHAL_HW_VERSION_MINOR, major,minor ) ? 1 : 0) +# define XCHAL_HW_RELEASE_AT_OR_ABOVE(major,minor) (XTHAL_REL_GE( XCHAL_HW_VERSION_MAJOR,XCHAL_HW_VERSION_MINOR, major,minor ) ? 1 : 0) +# define XCHAL_HW_RELEASE_AT(major,minor) (XTHAL_REL_EQ( XCHAL_HW_VERSION_MAJOR,XCHAL_HW_VERSION_MINOR, major,minor ) ? 1 : 0) +# define XCHAL_HW_RELEASE_MAJOR_AT(major) ((XCHAL_HW_VERSION_MAJOR == (major)) ? 1 : 0) +#else +# define XCHAL_HW_RELEASE_AT_OR_BELOW(major,minor) ( ((major) < 1040 && XCHAL_HAVE_XEA2) ? 0 \ + : ((major) > 1050 && XCHAL_HAVE_XEA1) ? 1 \ + : XTHAL_MAYBE ) +# define XCHAL_HW_RELEASE_AT_OR_ABOVE(major,minor) ( ((major) >= 2000 && XCHAL_HAVE_XEA1) ? 0 \ + : (XTHAL_REL_LE(major,minor, 1040,0) && XCHAL_HAVE_XEA2) ? 1 \ + : XTHAL_MAYBE ) +# define XCHAL_HW_RELEASE_AT(major,minor) ( (((major) < 1040 && XCHAL_HAVE_XEA2) || \ + ((major) >= 2000 && XCHAL_HAVE_XEA1)) ? 0 : XTHAL_MAYBE) +# define XCHAL_HW_RELEASE_MAJOR_AT(major) XCHAL_HW_RELEASE_AT(major,0) +#endif + +/* + * Specific errata: + */ + +/* + * Erratum T1020.H13, T1030.H7, T1040.H10, T1050.H4 (fixed in T1040.3 and T1050.1; + * relevant only in XEA1, kernel-vector mode, level-one interrupts and overflows enabled): + */ +#define XCHAL_MAYHAVE_ERRATUM_XEA1KWIN (XCHAL_HAVE_XEA1 && \ + (XCHAL_HW_RELEASE_AT_OR_BELOW(1040,2) != 0 \ + || XCHAL_HW_RELEASE_AT(1050,0))) +/* + * Erratum 453 present in RE-2013.2 up to RF-2014.0, fixed in RF-2014.1. + * Applies to specific set of configuration options. + * Part of the workaround is to add ISYNC at certain points in the code. + * The workaround gated by this macro can be disabled if not needed, e.g. if + * zero-overhead loop buffer will be disabled, by defining _NO_ERRATUM_453. + */ +#if ( XCHAL_HW_MAX_VERSION >= XTENSA_HWVERSION_RE_2013_2 && \ + XCHAL_HW_MIN_VERSION <= XTENSA_HWVERSION_RF_2014_0 && \ + XCHAL_ICACHE_SIZE != 0 && XCHAL_HAVE_PIF /*covers also AXI/AHB*/ && \ + XCHAL_HAVE_LOOPS && XCHAL_LOOP_BUFFER_SIZE != 0 && \ + XCHAL_CLOCK_GATING_GLOBAL && !defined(_NO_ERRATUM_453) ) +#define XCHAL_ERRATUM_453 1 +#else +#define XCHAL_ERRATUM_453 0 +#endif + +/* + * Erratum 497 present in RE-2012.2 up to RG/RF-2015.2 + * Applies to specific set of configuration options. + * Workaround is to add MEMWs after at most 8 cache WB instructions + */ +#if ( ((XCHAL_HW_MAX_VERSION >= XTENSA_HWVERSION_RE_2012_0 && \ + XCHAL_HW_MIN_VERSION <= XTENSA_HWVERSION_RF_2015_2) || \ + (XCHAL_HW_MAX_VERSION >= XTENSA_HWVERSION_RG_2015_0 && \ + XCHAL_HW_MIN_VERSION <= XTENSA_HWVERSION_RG_2015_2) \ + ) && \ + XCHAL_DCACHE_IS_WRITEBACK && \ + XCHAL_HAVE_AXI && \ + XCHAL_HAVE_PIF_WR_RESP && \ + XCHAL_HAVE_PIF_REQ_ATTR && !defined(_NO_ERRATUM_497) \ + ) +#define XCHAL_ERRATUM_497 1 +#else +#define XCHAL_ERRATUM_497 0 +#endif + +/* + * Erratum 572 (releases TBD, but present in ESP32) + * Disable zero-overhead loop buffer to prevent rare illegal instruction + * exceptions while executing zero-overhead loops. + */ +#if ( XCHAL_HAVE_LOOPS && XCHAL_LOOP_BUFFER_SIZE != 0 ) +#define XCHAL_ERRATUM_572 1 +#else +#define XCHAL_ERRATUM_572 0 +#endif + +#endif /*XTENSA_CONFIG_CORE_H*/ + diff --git a/arch/xtensa/include/esp32/xtensa/esp32/include/xtensa/config/defs.h b/arch/xtensa/include/esp32/xtensa/esp32/include/xtensa/config/defs.h new file mode 100644 index 0000000000000..d7c48ea84ab65 --- /dev/null +++ b/arch/xtensa/include/esp32/xtensa/esp32/include/xtensa/config/defs.h @@ -0,0 +1,38 @@ +/* Definitions for Xtensa instructions, types, and protos. */ + +/* Customer ID=11657; Build=0x5fe96; Copyright (c) 2003-2004 Tensilica Inc. + + 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 the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 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. */ + +/* NOTE: This file exists only for backward compatibility with T1050 + and earlier Xtensa releases. It includes only a subset of the + available header files. */ + +#ifndef _XTENSA_BASE_HEADER +#define _XTENSA_BASE_HEADER + +#ifdef __XTENSA__ + +#include +#include +#include + +#endif /* __XTENSA__ */ +#endif /* !_XTENSA_BASE_HEADER */ diff --git a/arch/xtensa/include/esp32/xtensa/esp32/include/xtensa/config/specreg.h b/arch/xtensa/include/esp32/xtensa/esp32/include/xtensa/config/specreg.h new file mode 100644 index 0000000000000..164c884210d7c --- /dev/null +++ b/arch/xtensa/include/esp32/xtensa/esp32/include/xtensa/config/specreg.h @@ -0,0 +1,117 @@ +/* + * Xtensa Special Register symbolic names + */ + +/* $Id: //depot/rel/Eaglenest/Xtensa/SWConfig/hal/specreg.h.tpp#1 $ */ + +/* Customer ID=11657; Build=0x5fe96; Copyright (c) 1998-2002 Tensilica Inc. + + 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 the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 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. */ + +#ifndef XTENSA_SPECREG_H +#define XTENSA_SPECREG_H + +/* Include these special register bitfield definitions, for historical reasons: */ +#include "../../../../include/xtensa/corebits.h" + + +/* Special registers: */ +#define LBEG 0 +#define LEND 1 +#define LCOUNT 2 +#define SAR 3 +#define BR 4 +#define SCOMPARE1 12 +#define ACCLO 16 +#define ACCHI 17 +#define MR_0 32 +#define MR_1 33 +#define MR_2 34 +#define MR_3 35 +#define WINDOWBASE 72 +#define WINDOWSTART 73 +#define IBREAKENABLE 96 +#define MEMCTL 97 +#define ATOMCTL 99 +#define DDR 104 +#define IBREAKA_0 128 +#define IBREAKA_1 129 +#define DBREAKA_0 144 +#define DBREAKA_1 145 +#define DBREAKC_0 160 +#define DBREAKC_1 161 +#define EPC_1 177 +#define EPC_2 178 +#define EPC_3 179 +#define EPC_4 180 +#define EPC_5 181 +#define EPC_6 182 +#define EPC_7 183 +#define DEPC 192 +#define EPS_2 194 +#define EPS_3 195 +#define EPS_4 196 +#define EPS_5 197 +#define EPS_6 198 +#define EPS_7 199 +#define EXCSAVE_1 209 +#define EXCSAVE_2 210 +#define EXCSAVE_3 211 +#define EXCSAVE_4 212 +#define EXCSAVE_5 213 +#define EXCSAVE_6 214 +#define EXCSAVE_7 215 +#define CPENABLE 224 +#define INTERRUPT 226 +#define INTENABLE 228 +#define PS 230 +#define VECBASE 231 +#define EXCCAUSE 232 +#define DEBUGCAUSE 233 +#define CCOUNT 234 +#define PRID 235 +#define ICOUNT 236 +#define ICOUNTLEVEL 237 +#define EXCVADDR 238 +#define CCOMPARE_0 240 +#define CCOMPARE_1 241 +#define CCOMPARE_2 242 +#define MISC_REG_0 244 +#define MISC_REG_1 245 +#define MISC_REG_2 246 +#define MISC_REG_3 247 + +/* Special cases (bases of special register series): */ +#define MR 32 +#define IBREAKA 128 +#define DBREAKA 144 +#define DBREAKC 160 +#define EPC 176 +#define EPS 192 +#define EXCSAVE 208 +#define CCOMPARE 240 + +/* Special names for read-only and write-only interrupt registers: */ +#define INTREAD 226 +#define INTSET 226 +#define INTCLEAR 227 + +#endif /* XTENSA_SPECREG_H */ + diff --git a/arch/xtensa/include/esp32/xtensa/esp32/include/xtensa/config/system.h b/arch/xtensa/include/esp32/xtensa/esp32/include/xtensa/config/system.h new file mode 100644 index 0000000000000..0d56eef74fc3d --- /dev/null +++ b/arch/xtensa/include/esp32/xtensa/esp32/include/xtensa/config/system.h @@ -0,0 +1,274 @@ +/* + * xtensa/config/system.h -- HAL definitions that are dependent on SYSTEM configuration + * + * NOTE: The location and contents of this file are highly subject to change. + * + * Source for configuration-independent binaries (which link in a + * configuration-specific HAL library) must NEVER include this file. + * The HAL itself has historically included this file in some instances, + * but this is not appropriate either, because the HAL is meant to be + * core-specific but system independent. + */ + +/* Customer ID=11657; Build=0x5fe96; Copyright (c) 2000-2010 Tensilica Inc. + + 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 the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 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. */ + + +#ifndef XTENSA_CONFIG_SYSTEM_H +#define XTENSA_CONFIG_SYSTEM_H + +/*#include */ + + + +/*---------------------------------------------------------------------- + CONFIGURED SOFTWARE OPTIONS + ----------------------------------------------------------------------*/ + +#define XSHAL_USE_ABSOLUTE_LITERALS 0 /* (sw-only option, whether software uses absolute literals) */ +#define XSHAL_HAVE_TEXT_SECTION_LITERALS 1 /* Set if there is some memory that allows both code and literals. */ + +#define XSHAL_ABI XTHAL_ABI_WINDOWED /* (sw-only option, selected ABI) */ +/* The above maps to one of the following constants: */ +#define XTHAL_ABI_WINDOWED 0 +#define XTHAL_ABI_CALL0 1 +/* Alternatives: */ +/*#define XSHAL_WINDOWED_ABI 1*/ /* set if windowed ABI selected */ +/*#define XSHAL_CALL0_ABI 0*/ /* set if call0 ABI selected */ + +#define XSHAL_CLIB XTHAL_CLIB_NEWLIB /* (sw-only option, selected C library) */ +/* The above maps to one of the following constants: */ +#define XTHAL_CLIB_NEWLIB 0 +#define XTHAL_CLIB_UCLIBC 1 +#define XTHAL_CLIB_XCLIB 2 +/* Alternatives: */ +/*#define XSHAL_NEWLIB 1*/ /* set if newlib C library selected */ +/*#define XSHAL_UCLIBC 0*/ /* set if uCLibC C library selected */ +/*#define XSHAL_XCLIB 0*/ /* set if Xtensa C library selected */ + +#define XSHAL_USE_FLOATING_POINT 1 + +#define XSHAL_FLOATING_POINT_ABI 0 + +/* SW workarounds enabled for HW errata: */ + +/*---------------------------------------------------------------------- + DEVICE ADDRESSES + ----------------------------------------------------------------------*/ + +/* + * Strange place to find these, but the configuration GUI + * allows moving these around to account for various core + * configurations. Specific boards (and their BSP software) + * will have specific meanings for these components. + */ + +/* I/O Block areas: */ +#define XSHAL_IOBLOCK_CACHED_VADDR 0x70000000 +#define XSHAL_IOBLOCK_CACHED_PADDR 0x70000000 +#define XSHAL_IOBLOCK_CACHED_SIZE 0x0E000000 + +#define XSHAL_IOBLOCK_BYPASS_VADDR 0x90000000 +#define XSHAL_IOBLOCK_BYPASS_PADDR 0x90000000 +#define XSHAL_IOBLOCK_BYPASS_SIZE 0x0E000000 + +/* System ROM: */ +#define XSHAL_ROM_VADDR 0x50000000 +#define XSHAL_ROM_PADDR 0x50000000 +#define XSHAL_ROM_SIZE 0x01000000 +/* Largest available area (free of vectors): */ +#define XSHAL_ROM_AVAIL_VADDR 0x50000000 +#define XSHAL_ROM_AVAIL_VSIZE 0x01000000 + +/* System RAM: */ +#define XSHAL_RAM_VADDR 0x60000000 +#define XSHAL_RAM_PADDR 0x60000000 +#define XSHAL_RAM_VSIZE 0x20000000 +#define XSHAL_RAM_PSIZE 0x20000000 +#define XSHAL_RAM_SIZE XSHAL_RAM_PSIZE +/* Largest available area (free of vectors): */ +#define XSHAL_RAM_AVAIL_VADDR 0x60000000 +#define XSHAL_RAM_AVAIL_VSIZE 0x20000000 + +/* + * Shadow system RAM (same device as system RAM, at different address). + * (Emulation boards need this for the SONIC Ethernet driver + * when data caches are configured for writeback mode.) + * NOTE: on full MMU configs, this points to the BYPASS virtual address + * of system RAM, ie. is the same as XSHAL_RAM_* except that virtual + * addresses are viewed through the BYPASS static map rather than + * the CACHED static map. + */ +#define XSHAL_RAM_BYPASS_VADDR 0xA0000000 +#define XSHAL_RAM_BYPASS_PADDR 0xA0000000 +#define XSHAL_RAM_BYPASS_PSIZE 0x20000000 + +/* Alternate system RAM (different device than system RAM): */ +/*#define XSHAL_ALTRAM_[VP]ADDR ...not configured...*/ +/*#define XSHAL_ALTRAM_SIZE ...not configured...*/ + +/* Some available location in which to place devices in a simulation (eg. XTMP): */ +#define XSHAL_SIMIO_CACHED_VADDR 0xC0000000 +#define XSHAL_SIMIO_BYPASS_VADDR 0xC0000000 +#define XSHAL_SIMIO_PADDR 0xC0000000 +#define XSHAL_SIMIO_SIZE 0x20000000 + + +/*---------------------------------------------------------------------- + * For use by reference testbench exit and diagnostic routines. + */ +#define XSHAL_MAGIC_EXIT 0x0 + +/*---------------------------------------------------------------------- + * DEVICE-ADDRESS DEPENDENT... + * + * Values written to CACHEATTR special register (or its equivalent) + * to enable and disable caches in various modes. + *----------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------- + BACKWARD COMPATIBILITY ... + ----------------------------------------------------------------------*/ + +/* + * NOTE: the following two macros are DEPRECATED. Use the latter + * board-specific macros instead, which are specially tuned for the + * particular target environments' memory maps. + */ +#define XSHAL_CACHEATTR_BYPASS XSHAL_XT2000_CACHEATTR_BYPASS /* disable caches in bypass mode */ +#define XSHAL_CACHEATTR_DEFAULT XSHAL_XT2000_CACHEATTR_DEFAULT /* default setting to enable caches (no writeback!) */ + +/*---------------------------------------------------------------------- + GENERIC + ----------------------------------------------------------------------*/ + +/* For the following, a 512MB region is used if it contains a system (PIF) RAM, + * system (PIF) ROM, local memory, or XLMI. */ + +/* These set any unused 512MB region to cache-BYPASS attribute: */ +#define XSHAL_ALLVALID_CACHEATTR_WRITEBACK 0x22221112 /* enable caches in write-back mode */ +#define XSHAL_ALLVALID_CACHEATTR_WRITEALLOC 0x22221112 /* enable caches in write-allocate mode */ +#define XSHAL_ALLVALID_CACHEATTR_WRITETHRU 0x22221112 /* enable caches in write-through mode */ +#define XSHAL_ALLVALID_CACHEATTR_BYPASS 0x22222222 /* disable caches in bypass mode */ +#define XSHAL_ALLVALID_CACHEATTR_DEFAULT XSHAL_ALLVALID_CACHEATTR_WRITEBACK /* default setting to enable caches */ + +/* These set any unused 512MB region to ILLEGAL attribute: */ +#define XSHAL_STRICT_CACHEATTR_WRITEBACK 0xFFFF111F /* enable caches in write-back mode */ +#define XSHAL_STRICT_CACHEATTR_WRITEALLOC 0xFFFF111F /* enable caches in write-allocate mode */ +#define XSHAL_STRICT_CACHEATTR_WRITETHRU 0xFFFF111F /* enable caches in write-through mode */ +#define XSHAL_STRICT_CACHEATTR_BYPASS 0xFFFF222F /* disable caches in bypass mode */ +#define XSHAL_STRICT_CACHEATTR_DEFAULT XSHAL_STRICT_CACHEATTR_WRITEBACK /* default setting to enable caches */ + +/* These set the first 512MB, if unused, to ILLEGAL attribute to help catch + * NULL-pointer dereference bugs; all other unused 512MB regions are set + * to cache-BYPASS attribute: */ +#define XSHAL_TRAPNULL_CACHEATTR_WRITEBACK 0x2222111F /* enable caches in write-back mode */ +#define XSHAL_TRAPNULL_CACHEATTR_WRITEALLOC 0x2222111F /* enable caches in write-allocate mode */ +#define XSHAL_TRAPNULL_CACHEATTR_WRITETHRU 0x2222111F /* enable caches in write-through mode */ +#define XSHAL_TRAPNULL_CACHEATTR_BYPASS 0x2222222F /* disable caches in bypass mode */ +#define XSHAL_TRAPNULL_CACHEATTR_DEFAULT XSHAL_TRAPNULL_CACHEATTR_WRITEBACK /* default setting to enable caches */ + +/*---------------------------------------------------------------------- + ISS (Instruction Set Simulator) SPECIFIC ... + ----------------------------------------------------------------------*/ + +/* For now, ISS defaults to the TRAPNULL settings: */ +#define XSHAL_ISS_CACHEATTR_WRITEBACK XSHAL_TRAPNULL_CACHEATTR_WRITEBACK +#define XSHAL_ISS_CACHEATTR_WRITEALLOC XSHAL_TRAPNULL_CACHEATTR_WRITEALLOC +#define XSHAL_ISS_CACHEATTR_WRITETHRU XSHAL_TRAPNULL_CACHEATTR_WRITETHRU +#define XSHAL_ISS_CACHEATTR_BYPASS XSHAL_TRAPNULL_CACHEATTR_BYPASS +#define XSHAL_ISS_CACHEATTR_DEFAULT XSHAL_TRAPNULL_CACHEATTR_WRITEBACK + +#define XSHAL_ISS_PIPE_REGIONS 0 +#define XSHAL_ISS_SDRAM_REGIONS 0 + + +/*---------------------------------------------------------------------- + XT2000 BOARD SPECIFIC ... + ----------------------------------------------------------------------*/ + +/* For the following, a 512MB region is used if it contains any system RAM, + * system ROM, local memory, XLMI, or other XT2000 board device or memory. + * Regions containing devices are forced to cache-BYPASS mode regardless + * of whether the macro is _WRITEBACK vs. _BYPASS etc. */ + +/* These set any 512MB region unused on the XT2000 to ILLEGAL attribute: */ +#define XSHAL_XT2000_CACHEATTR_WRITEBACK 0xFF22111F /* enable caches in write-back mode */ +#define XSHAL_XT2000_CACHEATTR_WRITEALLOC 0xFF22111F /* enable caches in write-allocate mode */ +#define XSHAL_XT2000_CACHEATTR_WRITETHRU 0xFF22111F /* enable caches in write-through mode */ +#define XSHAL_XT2000_CACHEATTR_BYPASS 0xFF22222F /* disable caches in bypass mode */ +#define XSHAL_XT2000_CACHEATTR_DEFAULT XSHAL_XT2000_CACHEATTR_WRITEBACK /* default setting to enable caches */ + +#define XSHAL_XT2000_PIPE_REGIONS 0x00000000 /* BusInt pipeline regions */ +#define XSHAL_XT2000_SDRAM_REGIONS 0x00000440 /* BusInt SDRAM regions */ + + +/*---------------------------------------------------------------------- + VECTOR INFO AND SIZES + ----------------------------------------------------------------------*/ + +#define XSHAL_VECTORS_PACKED 0 +#define XSHAL_STATIC_VECTOR_SELECT 1 +#define XSHAL_RESET_VECTOR_VADDR 0x40000400 +#define XSHAL_RESET_VECTOR_PADDR 0x40000400 + +/* + * Sizes allocated to vectors by the system (memory map) configuration. + * These sizes are constrained by core configuration (eg. one vector's + * code cannot overflow into another vector) but are dependent on the + * system or board (or LSP) memory map configuration. + * + * Whether or not each vector happens to be in a system ROM is also + * a system configuration matter, sometimes useful, included here also: + */ +#define XSHAL_RESET_VECTOR_SIZE 0x00000300 +#define XSHAL_RESET_VECTOR_ISROM 0 +#define XSHAL_USER_VECTOR_SIZE 0x00000038 +#define XSHAL_USER_VECTOR_ISROM 0 +#define XSHAL_PROGRAMEXC_VECTOR_SIZE XSHAL_USER_VECTOR_SIZE /* for backward compatibility */ +#define XSHAL_USEREXC_VECTOR_SIZE XSHAL_USER_VECTOR_SIZE /* for backward compatibility */ +#define XSHAL_KERNEL_VECTOR_SIZE 0x00000038 +#define XSHAL_KERNEL_VECTOR_ISROM 0 +#define XSHAL_STACKEDEXC_VECTOR_SIZE XSHAL_KERNEL_VECTOR_SIZE /* for backward compatibility */ +#define XSHAL_KERNELEXC_VECTOR_SIZE XSHAL_KERNEL_VECTOR_SIZE /* for backward compatibility */ +#define XSHAL_DOUBLEEXC_VECTOR_SIZE 0x00000040 +#define XSHAL_DOUBLEEXC_VECTOR_ISROM 0 +#define XSHAL_WINDOW_VECTORS_SIZE 0x00000178 +#define XSHAL_WINDOW_VECTORS_ISROM 0 +#define XSHAL_INTLEVEL2_VECTOR_SIZE 0x00000038 +#define XSHAL_INTLEVEL2_VECTOR_ISROM 0 +#define XSHAL_INTLEVEL3_VECTOR_SIZE 0x00000038 +#define XSHAL_INTLEVEL3_VECTOR_ISROM 0 +#define XSHAL_INTLEVEL4_VECTOR_SIZE 0x00000038 +#define XSHAL_INTLEVEL4_VECTOR_ISROM 0 +#define XSHAL_INTLEVEL5_VECTOR_SIZE 0x00000038 +#define XSHAL_INTLEVEL5_VECTOR_ISROM 0 +#define XSHAL_INTLEVEL6_VECTOR_SIZE 0x00000038 +#define XSHAL_INTLEVEL6_VECTOR_ISROM 0 +#define XSHAL_DEBUG_VECTOR_SIZE XSHAL_INTLEVEL6_VECTOR_SIZE +#define XSHAL_DEBUG_VECTOR_ISROM XSHAL_INTLEVEL6_VECTOR_ISROM +#define XSHAL_NMI_VECTOR_SIZE 0x00000038 +#define XSHAL_NMI_VECTOR_ISROM 0 +#define XSHAL_INTLEVEL7_VECTOR_SIZE XSHAL_NMI_VECTOR_SIZE + + +#endif /*XTENSA_CONFIG_SYSTEM_H*/ + diff --git a/arch/xtensa/include/esp32/xtensa/esp32/include/xtensa/config/tie-asm.h b/arch/xtensa/include/esp32/xtensa/esp32/include/xtensa/config/tie-asm.h new file mode 100644 index 0000000000000..831d8676ae2c8 --- /dev/null +++ b/arch/xtensa/include/esp32/xtensa/esp32/include/xtensa/config/tie-asm.h @@ -0,0 +1,323 @@ +/* + * tie-asm.h -- compile-time HAL assembler definitions dependent on CORE & TIE + * + * NOTE: This header file is not meant to be included directly. + */ + +/* This header file contains assembly-language definitions (assembly + macros, etc.) for this specific Xtensa processor's TIE extensions + and options. It is customized to this Xtensa processor configuration. + + Customer ID=11657; Build=0x5fe96; Copyright (c) 1999-2016 Cadence Design Systems Inc. + + 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 the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 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. */ + +#ifndef _XTENSA_CORE_TIE_ASM_H +#define _XTENSA_CORE_TIE_ASM_H + +/* Selection parameter values for save-area save/restore macros: */ +/* Option vs. TIE: */ +#define XTHAL_SAS_TIE 0x0001 /* custom extension or coprocessor */ +#define XTHAL_SAS_OPT 0x0002 /* optional (and not a coprocessor) */ +#define XTHAL_SAS_ANYOT 0x0003 /* both of the above */ +/* Whether used automatically by compiler: */ +#define XTHAL_SAS_NOCC 0x0004 /* not used by compiler w/o special opts/code */ +#define XTHAL_SAS_CC 0x0008 /* used by compiler without special opts/code */ +#define XTHAL_SAS_ANYCC 0x000C /* both of the above */ +/* ABI handling across function calls: */ +#define XTHAL_SAS_CALR 0x0010 /* caller-saved */ +#define XTHAL_SAS_CALE 0x0020 /* callee-saved */ +#define XTHAL_SAS_GLOB 0x0040 /* global across function calls (in thread) */ +#define XTHAL_SAS_ANYABI 0x0070 /* all of the above three */ +/* Misc */ +#define XTHAL_SAS_ALL 0xFFFF /* include all default NCP contents */ +#define XTHAL_SAS3(optie,ccuse,abi) ( ((optie) & XTHAL_SAS_ANYOT) \ + | ((ccuse) & XTHAL_SAS_ANYCC) \ + | ((abi) & XTHAL_SAS_ANYABI) ) + + + /* + * Macro to store all non-coprocessor (extra) custom TIE and optional state + * (not including zero-overhead loop registers). + * Required parameters: + * ptr Save area pointer address register (clobbered) + * (register must contain a 4 byte aligned address). + * at1..at4 Four temporary address registers (first XCHAL_NCP_NUM_ATMPS + * registers are clobbered, the remaining are unused). + * Optional parameters: + * continue If macro invoked as part of a larger store sequence, set to 1 + * if this is not the first in the sequence. Defaults to 0. + * ofs Offset from start of larger sequence (from value of first ptr + * in sequence) at which to store. Defaults to next available space + * (or 0 if is 0). + * select Select what category(ies) of registers to store, as a bitmask + * (see XTHAL_SAS_xxx constants). Defaults to all registers. + * alloc Select what category(ies) of registers to allocate; if any + * category is selected here that is not in , space for + * the corresponding registers is skipped without doing any load. + */ + .macro xchal_ncp_load ptr at1 at2 at3 at4 continue=0 ofs=-1 select=XTHAL_SAS_ALL alloc=0 + xchal_sa_start \continue, \ofs + // Optional global registers used by default by the compiler: + .ifeq (XTHAL_SAS_OPT | XTHAL_SAS_CC | XTHAL_SAS_GLOB) & ~(\select) + xchal_sa_align \ptr, 0, 1016, 4, 4 + l32i \at1, \ptr, .Lxchal_ofs_+0 + wur.THREADPTR \at1 // threadptr option + .set .Lxchal_ofs_, .Lxchal_ofs_ + 4 + .elseif ((XTHAL_SAS_OPT | XTHAL_SAS_CC | XTHAL_SAS_GLOB) & ~(\alloc)) == 0 + xchal_sa_align \ptr, 0, 1016, 4, 4 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 4 + .endif + // Optional caller-saved registers used by default by the compiler: + .ifeq (XTHAL_SAS_OPT | XTHAL_SAS_CC | XTHAL_SAS_CALR) & ~(\select) + xchal_sa_align \ptr, 0, 1012, 4, 4 + l32i \at1, \ptr, .Lxchal_ofs_+0 + wsr.ACCLO \at1 // MAC16 option + l32i \at1, \ptr, .Lxchal_ofs_+4 + wsr.ACCHI \at1 // MAC16 option + .set .Lxchal_ofs_, .Lxchal_ofs_ + 8 + .elseif ((XTHAL_SAS_OPT | XTHAL_SAS_CC | XTHAL_SAS_CALR) & ~(\alloc)) == 0 + xchal_sa_align \ptr, 0, 1012, 4, 4 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 8 + .endif + // Optional caller-saved registers not used by default by the compiler: + .ifeq (XTHAL_SAS_OPT | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\select) + xchal_sa_align \ptr, 0, 996, 4, 4 + l32i \at1, \ptr, .Lxchal_ofs_+0 + wsr.BR \at1 // boolean option + l32i \at1, \ptr, .Lxchal_ofs_+4 + wsr.SCOMPARE1 \at1 // conditional store option + l32i \at1, \ptr, .Lxchal_ofs_+8 + wsr.M0 \at1 // MAC16 option + l32i \at1, \ptr, .Lxchal_ofs_+12 + wsr.M1 \at1 // MAC16 option + l32i \at1, \ptr, .Lxchal_ofs_+16 + wsr.M2 \at1 // MAC16 option + l32i \at1, \ptr, .Lxchal_ofs_+20 + wsr.M3 \at1 // MAC16 option + .set .Lxchal_ofs_, .Lxchal_ofs_ + 24 + .elseif ((XTHAL_SAS_OPT | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\alloc)) == 0 + xchal_sa_align \ptr, 0, 996, 4, 4 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 24 + .endif + // Custom caller-saved registers not used by default by the compiler: + .ifeq (XTHAL_SAS_TIE | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\select) + xchal_sa_align \ptr, 0, 1008, 4, 4 + l32i \at1, \ptr, .Lxchal_ofs_+0 + wur.F64R_LO \at1 // ureg 234 + l32i \at1, \ptr, .Lxchal_ofs_+4 + wur.F64R_HI \at1 // ureg 235 + l32i \at1, \ptr, .Lxchal_ofs_+8 + wur.F64S \at1 // ureg 236 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 12 + .elseif ((XTHAL_SAS_TIE | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\alloc)) == 0 + xchal_sa_align \ptr, 0, 1008, 4, 4 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 12 + .endif + .endm // xchal_ncp_load + + +#define XCHAL_NCP_NUM_ATMPS 1 + + /* + * Macro to store the state of TIE coprocessor FPU. + * Required parameters: + * ptr Save area pointer address register (clobbered) + * (register must contain a 4 byte aligned address). + * at1..at4 Four temporary address registers (first XCHAL_CP0_NUM_ATMPS + * registers are clobbered, the remaining are unused). + * Optional parameters are the same as for xchal_ncp_store. + */ +#define xchal_cp_FPU_store xchal_cp0_store + .macro xchal_cp0_store ptr at1 at2 at3 at4 continue=0 ofs=-1 select=XTHAL_SAS_ALL alloc=0 + xchal_sa_start \continue, \ofs + // Custom caller-saved registers not used by default by the compiler: + .ifeq (XTHAL_SAS_TIE | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\select) + xchal_sa_align \ptr, 0, 948, 4, 4 + rur.FCR \at1 // ureg 232 + s32i \at1, \ptr, .Lxchal_ofs_+0 + rur.FSR \at1 // ureg 233 + s32i \at1, \ptr, .Lxchal_ofs_+4 + ssi f0, \ptr, .Lxchal_ofs_+8 + ssi f1, \ptr, .Lxchal_ofs_+12 + ssi f2, \ptr, .Lxchal_ofs_+16 + ssi f3, \ptr, .Lxchal_ofs_+20 + ssi f4, \ptr, .Lxchal_ofs_+24 + ssi f5, \ptr, .Lxchal_ofs_+28 + ssi f6, \ptr, .Lxchal_ofs_+32 + ssi f7, \ptr, .Lxchal_ofs_+36 + ssi f8, \ptr, .Lxchal_ofs_+40 + ssi f9, \ptr, .Lxchal_ofs_+44 + ssi f10, \ptr, .Lxchal_ofs_+48 + ssi f11, \ptr, .Lxchal_ofs_+52 + ssi f12, \ptr, .Lxchal_ofs_+56 + ssi f13, \ptr, .Lxchal_ofs_+60 + ssi f14, \ptr, .Lxchal_ofs_+64 + ssi f15, \ptr, .Lxchal_ofs_+68 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 72 + .elseif ((XTHAL_SAS_TIE | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\alloc)) == 0 + xchal_sa_align \ptr, 0, 948, 4, 4 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 72 + .endif + .endm // xchal_cp0_store + + /* + * Macro to load the state of TIE coprocessor FPU. + * Required parameters: + * ptr Save area pointer address register (clobbered) + * (register must contain a 4 byte aligned address). + * at1..at4 Four temporary address registers (first XCHAL_CP0_NUM_ATMPS + * registers are clobbered, the remaining are unused). + * Optional parameters are the same as for xchal_ncp_load. + */ +#define xchal_cp_FPU_load xchal_cp0_load + .macro xchal_cp0_load ptr at1 at2 at3 at4 continue=0 ofs=-1 select=XTHAL_SAS_ALL alloc=0 + xchal_sa_start \continue, \ofs + // Custom caller-saved registers not used by default by the compiler: + .ifeq (XTHAL_SAS_TIE | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\select) + xchal_sa_align \ptr, 0, 948, 4, 4 + l32i \at1, \ptr, .Lxchal_ofs_+0 + wur.FCR \at1 // ureg 232 + l32i \at1, \ptr, .Lxchal_ofs_+4 + wur.FSR \at1 // ureg 233 + lsi f0, \ptr, .Lxchal_ofs_+8 + lsi f1, \ptr, .Lxchal_ofs_+12 + lsi f2, \ptr, .Lxchal_ofs_+16 + lsi f3, \ptr, .Lxchal_ofs_+20 + lsi f4, \ptr, .Lxchal_ofs_+24 + lsi f5, \ptr, .Lxchal_ofs_+28 + lsi f6, \ptr, .Lxchal_ofs_+32 + lsi f7, \ptr, .Lxchal_ofs_+36 + lsi f8, \ptr, .Lxchal_ofs_+40 + lsi f9, \ptr, .Lxchal_ofs_+44 + lsi f10, \ptr, .Lxchal_ofs_+48 + lsi f11, \ptr, .Lxchal_ofs_+52 + lsi f12, \ptr, .Lxchal_ofs_+56 + lsi f13, \ptr, .Lxchal_ofs_+60 + lsi f14, \ptr, .Lxchal_ofs_+64 + lsi f15, \ptr, .Lxchal_ofs_+68 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 72 + .elseif ((XTHAL_SAS_TIE | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~(\alloc)) == 0 + xchal_sa_align \ptr, 0, 948, 4, 4 + .set .Lxchal_ofs_, .Lxchal_ofs_ + 72 + .endif + .endm // xchal_cp0_load + +#define XCHAL_CP0_NUM_ATMPS 1 +#define XCHAL_SA_NUM_ATMPS 1 + + /* Empty macros for unconfigured coprocessors: */ + .macro xchal_cp1_store p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp1_load p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp2_store p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp2_load p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp3_store p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp3_load p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp4_store p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp4_load p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp5_store p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp5_load p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp6_store p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp6_load p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp7_store p a b c d continue=0 ofs=-1 select=-1 ; .endm + .macro xchal_cp7_load p a b c d continue=0 ofs=-1 select=-1 ; .endm + +#endif /*_XTENSA_CORE_TIE_ASM_H*/ + diff --git a/arch/xtensa/include/esp32/xtensa/esp32/include/xtensa/config/tie.h b/arch/xtensa/include/esp32/xtensa/esp32/include/xtensa/config/tie.h new file mode 100644 index 0000000000000..e178799708e27 --- /dev/null +++ b/arch/xtensa/include/esp32/xtensa/esp32/include/xtensa/config/tie.h @@ -0,0 +1,182 @@ +/* + * tie.h -- compile-time HAL definitions dependent on CORE & TIE configuration + * + * NOTE: This header file is not meant to be included directly. + */ + +/* This header file describes this specific Xtensa processor's TIE extensions + that extend basic Xtensa core functionality. It is customized to this + Xtensa processor configuration. + + Customer ID=11657; Build=0x5fe96; Copyright (c) 1999-2016 Cadence Design Systems Inc. + + 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 the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 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. */ + +#ifndef _XTENSA_CORE_TIE_H +#define _XTENSA_CORE_TIE_H + +#define XCHAL_CP_NUM 1 /* number of coprocessors */ +#define XCHAL_CP_MAX 1 /* max CP ID + 1 (0 if none) */ +#define XCHAL_CP_MASK 0x01 /* bitmask of all CPs by ID */ +#define XCHAL_CP_PORT_MASK 0x00 /* bitmask of only port CPs */ + +/* Basic parameters of each coprocessor: */ +#define XCHAL_CP0_NAME "FPU" +#define XCHAL_CP0_IDENT FPU +#define XCHAL_CP0_SA_SIZE 72 /* size of state save area */ +#define XCHAL_CP0_SA_ALIGN 4 /* min alignment of save area */ +#define XCHAL_CP_ID_FPU 0 /* coprocessor ID (0..7) */ + +/* Filler info for unassigned coprocessors, to simplify arrays etc: */ +#define XCHAL_CP1_SA_SIZE 0 +#define XCHAL_CP1_SA_ALIGN 1 +#define XCHAL_CP2_SA_SIZE 0 +#define XCHAL_CP2_SA_ALIGN 1 +#define XCHAL_CP3_SA_SIZE 0 +#define XCHAL_CP3_SA_ALIGN 1 +#define XCHAL_CP4_SA_SIZE 0 +#define XCHAL_CP4_SA_ALIGN 1 +#define XCHAL_CP5_SA_SIZE 0 +#define XCHAL_CP5_SA_ALIGN 1 +#define XCHAL_CP6_SA_SIZE 0 +#define XCHAL_CP6_SA_ALIGN 1 +#define XCHAL_CP7_SA_SIZE 0 +#define XCHAL_CP7_SA_ALIGN 1 + +/* Save area for non-coprocessor optional and custom (TIE) state: */ +#define XCHAL_NCP_SA_SIZE 48 +#define XCHAL_NCP_SA_ALIGN 4 + +/* Total save area for optional and custom state (NCP + CPn): */ +#define XCHAL_TOTAL_SA_SIZE 128 /* with 16-byte align padding */ +#define XCHAL_TOTAL_SA_ALIGN 4 /* actual minimum alignment */ + +/* + * Detailed contents of save areas. + * NOTE: caller must define the XCHAL_SA_REG macro (not defined here) + * before expanding the XCHAL_xxx_SA_LIST() macros. + * + * XCHAL_SA_REG(s,ccused,abikind,kind,opt,name,galign,align,asize, + * dbnum,base,regnum,bitsz,gapsz,reset,x...) + * + * s = passed from XCHAL_*_LIST(s), eg. to select how to expand + * ccused = set if used by compiler without special options or code + * abikind = 0 (caller-saved), 1 (callee-saved), or 2 (thread-global) + * kind = 0 (special reg), 1 (TIE user reg), or 2 (TIE regfile reg) + * opt = 0 (custom TIE extension or coprocessor), or 1 (optional reg) + * name = lowercase reg name (no quotes) + * galign = group byte alignment (power of 2) (galign >= align) + * align = register byte alignment (power of 2) + * asize = allocated size in bytes (asize*8 == bitsz + gapsz + padsz) + * (not including any pad bytes required to galign this or next reg) + * dbnum = unique target number f/debug (see ) + * base = reg shortname w/o index (or sr=special, ur=TIE user reg) + * regnum = reg index in regfile, or special/TIE-user reg number + * bitsz = number of significant bits (regfile width, or ur/sr mask bits) + * gapsz = intervening bits, if bitsz bits not stored contiguously + * (padsz = pad bits at end [TIE regfile] or at msbits [ur,sr] of asize) + * reset = register reset value (or 0 if undefined at reset) + * x = reserved for future use (0 until then) + * + * To filter out certain registers, e.g. to expand only the non-global + * registers used by the compiler, you can do something like this: + * + * #define XCHAL_SA_REG(s,ccused,p...) SELCC##ccused(p) + * #define SELCC0(p...) + * #define SELCC1(abikind,p...) SELAK##abikind(p) + * #define SELAK0(p...) REG(p) + * #define SELAK1(p...) REG(p) + * #define SELAK2(p...) + * #define REG(kind,tie,name,galn,aln,asz,csz,dbnum,base,rnum,bsz,rst,x...) \ + * ...what you want to expand... + */ + +#define XCHAL_NCP_SA_NUM 12 +#define XCHAL_NCP_SA_LIST(s) \ + XCHAL_SA_REG(s,1,2,1,1, threadptr, 4, 4, 4,0x03E7, ur,231, 32,0,0,0) \ + XCHAL_SA_REG(s,1,0,0,1, acclo, 4, 4, 4,0x0210, sr,16 , 32,0,0,0) \ + XCHAL_SA_REG(s,1,0,0,1, acchi, 4, 4, 4,0x0211, sr,17 , 8,0,0,0) \ + XCHAL_SA_REG(s,0,0,0,1, br, 4, 4, 4,0x0204, sr,4 , 16,0,0,0) \ + XCHAL_SA_REG(s,0,0,0,1, scompare1, 4, 4, 4,0x020C, sr,12 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,0,1, m0, 4, 4, 4,0x0220, sr,32 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,0,1, m1, 4, 4, 4,0x0221, sr,33 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,0,1, m2, 4, 4, 4,0x0222, sr,34 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,0,1, m3, 4, 4, 4,0x0223, sr,35 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, f64r_lo, 4, 4, 4,0x03EA, ur,234, 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, f64r_hi, 4, 4, 4,0x03EB, ur,235, 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, f64s, 4, 4, 4,0x03EC, ur,236, 32,0,0,0) + +#define XCHAL_CP0_SA_NUM 18 +#define XCHAL_CP0_SA_LIST(s) \ + XCHAL_SA_REG(s,0,0,1,0, fcr, 4, 4, 4,0x03E8, ur,232, 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,1,0, fsr, 4, 4, 4,0x03E9, ur,233, 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f0, 4, 4, 4,0x0030, f,0 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f1, 4, 4, 4,0x0031, f,1 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f2, 4, 4, 4,0x0032, f,2 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f3, 4, 4, 4,0x0033, f,3 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f4, 4, 4, 4,0x0034, f,4 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f5, 4, 4, 4,0x0035, f,5 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f6, 4, 4, 4,0x0036, f,6 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f7, 4, 4, 4,0x0037, f,7 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f8, 4, 4, 4,0x0038, f,8 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f9, 4, 4, 4,0x0039, f,9 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f10, 4, 4, 4,0x003A, f,10 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f11, 4, 4, 4,0x003B, f,11 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f12, 4, 4, 4,0x003C, f,12 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f13, 4, 4, 4,0x003D, f,13 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f14, 4, 4, 4,0x003E, f,14 , 32,0,0,0) \ + XCHAL_SA_REG(s,0,0,2,0, f15, 4, 4, 4,0x003F, f,15 , 32,0,0,0) + +#define XCHAL_CP1_SA_NUM 0 +#define XCHAL_CP1_SA_LIST(s) /* empty */ + +#define XCHAL_CP2_SA_NUM 0 +#define XCHAL_CP2_SA_LIST(s) /* empty */ + +#define XCHAL_CP3_SA_NUM 0 +#define XCHAL_CP3_SA_LIST(s) /* empty */ + +#define XCHAL_CP4_SA_NUM 0 +#define XCHAL_CP4_SA_LIST(s) /* empty */ + +#define XCHAL_CP5_SA_NUM 0 +#define XCHAL_CP5_SA_LIST(s) /* empty */ + +#define XCHAL_CP6_SA_NUM 0 +#define XCHAL_CP6_SA_LIST(s) /* empty */ + +#define XCHAL_CP7_SA_NUM 0 +#define XCHAL_CP7_SA_LIST(s) /* empty */ + +/* Byte length of instruction from its first nibble (op0 field), per FLIX. */ +#define XCHAL_OP0_FORMAT_LENGTHS 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3 +/* Byte length of instruction from its first byte, per FLIX. */ +#define XCHAL_BYTE0_FORMAT_LENGTHS \ + 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3,\ + 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3,\ + 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3,\ + 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3,\ + 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3,\ + 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3,\ + 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3,\ + 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3 + +#endif /*_XTENSA_CORE_TIE_H*/ + diff --git a/arch/xtensa/include/esp32/xtensa/include/eri.h b/arch/xtensa/include/esp32/xtensa/include/eri.h new file mode 100644 index 0000000000000..33e4dd09180f6 --- /dev/null +++ b/arch/xtensa/include/esp32/xtensa/include/eri.h @@ -0,0 +1,31 @@ +#ifndef ERI_H +#define ERI_H + +#include + +/* + The ERI is a bus internal to each Xtensa core. It connects, amongst others, to the debug interface, where it + allows reading/writing the same registers as available over JTAG. +*/ + + +/** + * @brief Perform an ERI read + * @param addr : ERI register to read from + * + * @return Value read + */ +uint32_t eri_read(int addr); + + +/** + * @brief Perform an ERI write + * @param addr : ERI register to write to + * @param data : Value to write + * + * @return Value read + */ +void eri_write(int addr, uint32_t data); + + +#endif \ No newline at end of file diff --git a/arch/xtensa/include/esp32/xtensa/include/esp_attr.h b/arch/xtensa/include/esp32/xtensa/include/esp_attr.h new file mode 100644 index 0000000000000..d8ad803ed57c9 --- /dev/null +++ b/arch/xtensa/include/esp32/xtensa/include/esp_attr.h @@ -0,0 +1,124 @@ +// 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. +#ifndef __ESP_ATTR_H__ +#define __ESP_ATTR_H__ + +#include + +#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__) + +// 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 ets_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 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/arch/xtensa/include/esp32/xtensa/include/esp_debug_helpers.h b/arch/xtensa/include/esp32/xtensa/include/esp_debug_helpers.h new file mode 100644 index 0000000000000..123aa76a028b0 --- /dev/null +++ b/arch/xtensa/include/esp32/xtensa/include/esp_debug_helpers.h @@ -0,0 +1,133 @@ +// 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. + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef __ASSEMBLER__ + +#include +#include "../../esp_common/esp_err.h" +#include "../../soc/esp32/include/soc/soc.h" + +#define ESP_WATCHPOINT_LOAD 0x40000000 +#define ESP_WATCHPOINT_STORE 0x80000000 +#define ESP_WATCHPOINT_ACCESS 0xC0000000 + +/* + * @brief Structure used for backtracing + * + * This structure stores the backtrace information of a particular stack frame + * (i.e. the PC and SP). This structure is used iteratively with the + * esp_cpu_get_next_backtrace_frame() function to traverse each frame within a + * single stack. The next_pc represents the PC of the current frame's caller, thus + * a next_pc of 0 indicates that the current frame is the last frame on the stack. + * + * @note Call esp_backtrace_get_start() to obtain initialization values for + * this structure + */ +typedef struct { + uint32_t pc; /* PC of the current frame */ + uint32_t sp; /* SP of the current frame */ + uint32_t next_pc; /* PC of the current frame's caller */ +} esp_backtrace_frame_t; + +/** + * @brief If an OCD is connected over JTAG. set breakpoint 0 to the given function + * address. Do nothing otherwise. + * @param fn Pointer to the target breakpoint position + */ +void esp_set_breakpoint_if_jtag(void *fn); + +/** + * @brief Set a watchpoint to break/panic when a certain memory range is accessed. + * + * @param no Watchpoint number. On the ESP32, this can be 0 or 1. + * @param adr Base address to watch + * @param size Size of the region, starting at the base address, to watch. Must + * be one of 2^n, with n in [0..6]. + * @param flags One of ESP_WATCHPOINT_* flags + * + * @return ESP_ERR_INVALID_ARG on invalid arg, ESP_OK otherwise + * + * @warning The ESP32 watchpoint hardware watches a region of bytes by effectively + * masking away the lower n bits for a region with size 2^n. If adr does + * not have zero for these lower n bits, you may not be watching the + * region you intended. + */ +esp_err_t esp_set_watchpoint(int no, void *adr, int size, int flags); + +/** + * @brief Clear a watchpoint + * + * @param no Watchpoint to clear + * + */ +void esp_clear_watchpoint(int no); + +/** + * Get the first frame of the current stack's backtrace + * + * Given the following function call flow (B -> A -> X -> esp_backtrace_get_start), + * this function will do the following. + * - Flush CPU registers and window frames onto the current stack + * - Return PC and SP of function A (i.e. start of the stack's backtrace) + * - Return PC of function B (i.e. next_pc) + * + * @note This function is implemented in assembly + * + * @param[out] pc PC of the first frame in the backtrace + * @param[out] sp SP of the first frame in the backtrace + * @param[out] next_pc PC of the first frame's caller + */ +extern void esp_backtrace_get_start(uint32_t *pc, uint32_t *sp, uint32_t *next_pc); + +/** + * Get the next frame on a stack for backtracing + * + * Given a stack frame(i), this function will obtain the next stack frame(i-1) + * on the same call stack (i.e. the caller of frame(i)). This function is meant to be + * called iteratively when doing a backtrace. + * + * Entry Conditions: Frame structure containing valid SP and next_pc + * Exit Conditions: + * - Frame structure updated with SP and PC of frame(i-1). next_pc now points to frame(i-2). + * - If a next_pc of 0 is returned, it indicates that frame(i-1) is last frame on the stack + * + * @param[inout] frame Pointer to frame structure + * + * @return + * - True if the SP and PC of the next frame(i-1) are sane + * - False otherwise + */ +bool esp_backtrace_get_next_frame(esp_backtrace_frame_t *frame); + +/** + * @brief Print the backtrace of the current stack + * + * @param depth The maximum number of stack frames to print (should be > 0) + * + * @return + * - ESP_OK Backtrace successfully printed to completion or to depth limit + * - ESP_FAIL Backtrace is corrupted + */ +esp_err_t esp_backtrace_print(int depth); + +#endif +#ifdef __cplusplus +} +#endif diff --git a/arch/xtensa/include/esp32/xtensa/include/esp_panic.h b/arch/xtensa/include/esp32/xtensa/include/esp_panic.h new file mode 100644 index 0000000000000..587c7953b0895 --- /dev/null +++ b/arch/xtensa/include/esp32/xtensa/include/esp_panic.h @@ -0,0 +1,4 @@ +#pragma once +#warning "esp_panic.h is deprecated, please use esp_debug_helpers.h or/and esp_private/panic_reason.h" +#include "esp_private/panic_reason.h" +#include "esp_debug_helpers.h" diff --git a/arch/xtensa/include/esp32/xtensa/include/esp_private/panic_reason.h b/arch/xtensa/include/esp32/xtensa/include/esp_private/panic_reason.h new file mode 100644 index 0000000000000..a83c5de7733dc --- /dev/null +++ b/arch/xtensa/include/esp32/xtensa/include/esp_private/panic_reason.h @@ -0,0 +1,11 @@ +#pragma once + +#define PANIC_RSN_NONE 0 +#define PANIC_RSN_DEBUGEXCEPTION 1 +#define PANIC_RSN_DOUBLEEXCEPTION 2 +#define PANIC_RSN_KERNELEXCEPTION 3 +#define PANIC_RSN_COPROCEXCEPTION 4 +#define PANIC_RSN_INTWDT_CPU0 5 +#define PANIC_RSN_INTWDT_CPU1 6 +#define PANIC_RSN_CACHEERR 7 +#define PANIC_RSN_MAX 7 diff --git a/arch/xtensa/include/esp32/xtensa/include/trax.h b/arch/xtensa/include/esp32/xtensa/include/trax.h new file mode 100644 index 0000000000000..5141bc5a90d27 --- /dev/null +++ b/arch/xtensa/include/esp32/xtensa/include/trax.h @@ -0,0 +1,61 @@ +#include +#include "esp_err.h" +#include "eri.h" +#include "xtensa-debug-module.h" + + +typedef enum { + TRAX_DOWNCOUNT_WORDS, + TRAX_DOWNCOUNT_INSTRUCTIONS +} trax_downcount_unit_t; + +typedef enum { + TRAX_ENA_NONE = 0, + TRAX_ENA_PRO, + TRAX_ENA_APP, + TRAX_ENA_PRO_APP, + TRAX_ENA_PRO_APP_SWAP +} trax_ena_select_t; + + +/** + * @brief Enable the trax memory blocks to be used as Trax memory. + * + * @param pro_cpu_enable : true if Trax needs to be enabled for the pro CPU + * @param app_cpu_enable : true if Trax needs to be enabled for the pro CPU + * @param swap_regions : Normally, the pro CPU writes to Trax mem block 0 while + * the app cpu writes to block 1. Setting this to true + * inverts this. + * + * @return esp_err_t. Fails with ESP_ERR_NO_MEM if Trax enable is requested for 2 CPUs + * but memmap only has room for 1, or if Trax memmap is disabled + * entirely. + */ +int trax_enable(trax_ena_select_t ena); + +/** + * @brief Start a Trax trace on the current CPU + * + * @param units_until_stop : Set the units of the delay that gets passed to + * trax_trigger_traceend_after_delay. One of TRAX_DOWNCOUNT_WORDS + * or TRAX_DOWNCOUNT_INSTRUCTIONS. + * + * @return esp_err_t. Fails with ESP_ERR_NO_MEM if Trax is disabled. + */ +int trax_start_trace(trax_downcount_unit_t units_until_stop); + + +/** + * @brief Trigger a Trax trace stop after the indicated delay. If this is called + * before and the previous delay hasn't ended yet, this will overwrite + * that delay with the new value. The delay will always start at the time + * the function is called. + * + * @param delay : The delay to stop the trace in, in the unit indicated to + * trax_start_trace. Note: the trace memory has 4K words available. + * + * @return esp_err_t + */ +int trax_trigger_traceend_after_delay(int delay); + + diff --git a/arch/xtensa/include/esp32/xtensa/include/xtensa-debug-module.h b/arch/xtensa/include/esp32/xtensa/include/xtensa-debug-module.h new file mode 100644 index 0000000000000..6e44d782616dc --- /dev/null +++ b/arch/xtensa/include/esp32/xtensa/include/xtensa-debug-module.h @@ -0,0 +1,115 @@ +#ifndef XTENSA_DEBUG_MODULE_H +#define XTENSA_DEBUG_MODULE_H +#include "soc/cpu.h" +/* +ERI registers / OCD offsets and field definitions +*/ + +#define ERI_DEBUG_OFFSET 0x100000 + +#define ERI_TRAX_OFFSET (ERI_DEBUG_OFFSET+0) +#define ERI_PERFMON_OFFSET (ERI_DEBUG_OFFSET+0x1000) +#define ERI_OCDREG_OFFSET (ERI_DEBUG_OFFSET+0x2000) +#define ERI_MISCDBG_OFFSET (ERI_DEBUG_OFFSET+0x3000) +#define ERI_CORESIGHT_OFFSET (ERI_DEBUG_OFFSET+0x3F00) + +#define ERI_TRAX_TRAXID (ERI_TRAX_OFFSET+0x00) +#define ERI_TRAX_TRAXCTRL (ERI_TRAX_OFFSET+0x04) +#define ERI_TRAX_TRAXSTAT (ERI_TRAX_OFFSET+0x08) +#define ERI_TRAX_TRAXDATA (ERI_TRAX_OFFSET+0x0C) +#define ERI_TRAX_TRAXADDR (ERI_TRAX_OFFSET+0x10) +#define ERI_TRAX_TRIGGERPC (ERI_TRAX_OFFSET+0x14) +#define ERI_TRAX_PCMATCHCTRL (ERI_TRAX_OFFSET+0x18) +#define ERI_TRAX_DELAYCNT (ERI_TRAX_OFFSET+0x1C) +#define ERI_TRAX_MEMADDRSTART (ERI_TRAX_OFFSET+0x20) +#define ERI_TRAX_MEMADDREND (ERI_TRAX_OFFSET+0x24) + +#define TRAXCTRL_TREN (1<<0) //Trace enable. Tracing starts on 0->1 +#define TRAXCTRL_TRSTP (1<<1) //Trace Stop. Make 1 to stop trace. +#define TRAXCTRL_PCMEN (1<<2) //PC match enable +#define TRAXCTRL_PTIEN (1<<4) //Processor-trigger enable +#define TRAXCTRL_CTIEN (1<<5) //Cross-trigger enable +#define TRAXCTRL_TMEN (1<<7) //Tracemem Enable. Always set. +#define TRAXCTRL_CNTU (1<<9) //Post-stop-trigger countdown units; selects when DelayCount-- happens. + //0 - every 32-bit word written to tracemem, 1 - every cpu instruction +#define TRAXCTRL_TSEN (1<<11) //Undocumented/deprecated? +#define TRAXCTRL_SMPER_SHIFT 12 //Send sync every 2^(9-smper) messages. 7=reserved, 0=no sync msg +#define TRAXCTRL_SMPER_MASK 0x7 //Synchronization message period +#define TRAXCTRL_PTOWT (1<<16) //Processor Trigger Out (OCD halt) enabled when stop triggered +#define TRAXCTRL_PTOWS (1<<17) //Processor Trigger Out (OCD halt) enabled when trace stop completes +#define TRAXCTRL_CTOWT (1<<20) //Cross-trigger Out enabled when stop triggered +#define TRAXCTRL_CTOWS (1<<21) //Cross-trigger Out enabled when trace stop completes +#define TRAXCTRL_ITCTO (1<<22) //Integration mode: cross-trigger output +#define TRAXCTRL_ITCTIA (1<<23) //Integration mode: cross-trigger ack +#define TRAXCTRL_ITATV (1<<24) //replaces ATID when in integration mode: ATVALID output +#define TRAXCTRL_ATID_MASK 0x7F //ARB source ID +#define TRAXCTRL_ATID_SHIFT 24 +#define TRAXCTRL_ATEN (1<<31) //ATB interface enable + +#define TRAXSTAT_TRACT (1<<0) //Trace active flag. +#define TRAXSTAT_TRIG (1<<1) //Trace stop trigger. Clears on TREN 1->0 +#define TRAXSTAT_PCMTG (1<<2) //Stop trigger caused by PC match. Clears on TREN 1->0 +#define TRAXSTAT_PJTR (1<<3) //JTAG transaction result. 1=err in preceding jtag transaction. +#define TRAXSTAT_PTITG (1<<4) //Stop trigger caused by Processor Trigger Input. Clears on TREN 1->0 +#define TRAXSTAT_CTITG (1<<5) //Stop trigger caused by Cross-Trigger Input. Clears on TREN 1->0 +#define TRAXSTAT_MEMSZ_SHIFT 8 //Traceram size inducator. Usable trace ram is 2^MEMSZ bytes. +#define TRAXSTAT_MEMSZ_MASK 0x1F +#define TRAXSTAT_PTO (1<<16) //Processor Trigger Output: current value +#define TRAXSTAT_CTO (1<<17) //Cross-Trigger Output: current value +#define TRAXSTAT_ITCTOA (1<<22) //Cross-Trigger Out Ack: current value +#define TRAXSTAT_ITCTI (1<<23) //Cross-Trigger Input: current value +#define TRAXSTAT_ITATR (1<<24) //ATREADY Input: current value + +#define TRAXADDR_TADDR_SHIFT 0 //Trax memory address, in 32-bit words. +#define TRAXADDR_TADDR_MASK 0x1FFFFF //Actually is only as big as the trace buffer size max addr. +#define TRAXADDR_TWRAP_SHIFT 21 //Amount of times TADDR has overflown +#define TRAXADDR_TWRAP_MASK 0x3FF +#define TRAXADDR_TWSAT (1<<31) //1 if TWRAP has overflown, clear by disabling tren. + +#define PCMATCHCTRL_PCML_SHIFT 0 //Amount of lower bits to ignore in pc trigger register +#define PCMATCHCTRL_PCML_MASK 0x1F +#define PCMATCHCTRL_PCMS (1<<31) //PC Match Sense, 0 - match when procs PC is in-range, 1 - match when + //out-of-range + +// Global control/status for all performance counters +#define ERI_PERFMON_PGM (ERI_PERFMON_OFFSET+0x0000) +//PC at the cycle of the event that caused PerfMonInt assertion +#define ERI_PERFMON_INTPC (ERI_PERFMON_OFFSET+0x0010) + +// Maximum amount of counter (depends on chip) +#define ERI_PERFMON_MAX XCHAL_NUM_PERF_COUNTERS + +// Performance counter value +#define ERI_PERFMON_PM0 (ERI_PERFMON_OFFSET+0x0080) +// Performance counter control register +#define ERI_PERFMON_PMCTRL0 (ERI_PERFMON_OFFSET+0x0100) +// Performance counter status register +#define ERI_PERFMON_PMSTAT0 (ERI_PERFMON_OFFSET+0x0180) + + +#define PMCTRL_INTEN (1<<0) // Enables assertion of PerfMonInt output when overflow happens +#define PMCTRL_KRNLCNT (1<<3) // Enables counting when CINTLEVEL* > +// TRACELEVEL (i.e. If this bit is set, this counter +// counts only when CINTLEVEL >TRACELEVEL; +// if this bit is cleared, this counter counts only when +// CINTLEVEL ≤ TRACELEVEL) +#define PMCTRL_KRNLCNT_SHIFT 3 +#define PMCTRL_TRACELEVEL_SHIFT 4 // Compares this value to CINTLEVEL* when deciding whether to count +#define PMCTRL_TRACELEVEL_MASK 0xf +#define PMCTRL_SELECT_SHIFT 8 // Selects input to be counted by the counter +#define PMCTRL_SELECT_MASK 0x1f +#define PMCTRL_MASK_SHIFT 16 // Selects input subsets to be counted (counter will +// increment only once even if more than one condition +// corresponding to a mask bit occurs) +#define PMCTRL_MASK_MASK 0xffff + + +#define PMSTAT_OVFL (1<<0) // Counter Overflow. Sticky bit set when a counter rolls over +// from 0xffffffff to 0x0. +#define PMSTAT_INTSTART (1<<4) // This counter’s overflow caused PerfMonInt to be asserted. + + +#define PGM_PMEN (1<<0) // Overall enable for all performance counting + + +#endif \ No newline at end of file diff --git a/arch/xtensa/include/esp32/xtensa/include/xtensa/cacheasm.h b/arch/xtensa/include/esp32/xtensa/include/xtensa/cacheasm.h new file mode 100644 index 0000000000000..b9961ae1f16fa --- /dev/null +++ b/arch/xtensa/include/esp32/xtensa/include/xtensa/cacheasm.h @@ -0,0 +1,962 @@ +/* + * xtensa/cacheasm.h -- assembler-specific cache related definitions + * that depend on CORE configuration + * + * This file is logically part of xtensa/coreasm.h , + * but is kept separate for modularity / compilation-performance. + */ + +/* + * Copyright (c) 2001-2014 Cadence Design Systems, Inc. + * + * 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 the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 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. + */ + +#ifndef XTENSA_CACHEASM_H +#define XTENSA_CACHEASM_H + +#include +#include +#include +#include + +/* + * This header file defines assembler macros of the form: + * cache_ + * where is 'i' or 'd' for instruction and data caches, + * and indicates the function of the macro. + * + * The following functions are defined, + * and apply only to the specified cache (I or D): + * + * reset + * Resets the cache. + * + * sync + * Makes sure any previous cache instructions have been completed; + * ie. makes sure any previous cache control operations + * have had full effect and been synchronized to memory. + * Eg. any invalidate completed [so as not to generate a hit], + * any writebacks or other pipelined writes written to memory, etc. + * + * invalidate_line (single cache line) + * invalidate_region (specified memory range) + * invalidate_all (entire cache) + * Invalidates all cache entries that cache + * data from the specified memory range. + * NOTE: locked entries are not invalidated. + * + * writeback_line (single cache line) + * writeback_region (specified memory range) + * writeback_all (entire cache) + * Writes back to memory all dirty cache entries + * that cache data from the specified memory range, + * and marks these entries as clean. + * NOTE: on some future implementations, this might + * also invalidate. + * NOTE: locked entries are written back, but never invalidated. + * NOTE: instruction caches never implement writeback. + * + * writeback_inv_line (single cache line) + * writeback_inv_region (specified memory range) + * writeback_inv_all (entire cache) + * Writes back to memory all dirty cache entries + * that cache data from the specified memory range, + * and invalidates these entries (including all clean + * cache entries that cache data from that range). + * NOTE: locked entries are written back but not invalidated. + * NOTE: instruction caches never implement writeback. + * + * lock_line (single cache line) + * lock_region (specified memory range) + * Prefetch and lock the specified memory range into cache. + * NOTE: if any part of the specified memory range cannot + * be locked, a Load/Store Error (for dcache) or Instruction + * Fetch Error (for icache) exception occurs. These macros don't + * do anything special (yet anyway) to handle this situation. + * + * unlock_line (single cache line) + * unlock_region (specified memory range) + * unlock_all (entire cache) + * Unlock cache entries that cache the specified memory range. + * Entries not already locked are unaffected. + * + * coherence_on + * coherence_off + * Turn off and on cache coherence + * + */ + + + +/*************************** GENERIC -- ALL CACHES ***************************/ + + +/* + * The following macros assume the following cache size/parameter limits + * in the current Xtensa core implementation: + * cache size: 1024 bytes minimum + * line size: 16 - 64 bytes + * way count: 1 - 4 + * + * Minimum entries per way (ie. per associativity) = 1024 / 64 / 4 = 4 + * Hence the assumption that each loop can execute four cache instructions. + * + * Correspondingly, the offset range of instructions is assumed able to cover + * four lines, ie. offsets {0,1,2,3} * line_size are assumed valid for + * both hit and indexed cache instructions. Ie. these offsets are all + * valid: 0, 16, 32, 48, 64, 96, 128, 192 (for line sizes 16, 32, 64). + * This is true of all original cache instructions + * (dhi, ihi, dhwb, dhwbi, dii, iii) which have offsets + * of 0 to 1020 in multiples of 4 (ie. 8 bits shifted by 2). + * This is also true of subsequent cache instructions + * (dhu, ihu, diu, iiu, diwb, diwbi, dpfl, ipfl) which have offsets + * of 0 to 240 in multiples of 16 (ie. 4 bits shifted by 4). + * + * (Maximum cache size, currently 32k, doesn't affect the following macros. + * Cache ways > MMU min page size cause aliasing but that's another matter.) + */ + + + +/* + * Macro to apply an 'indexed' cache instruction to the entire cache. + * + * Parameters: + * cainst instruction/ that takes an address register parameter + * and an offset parameter (in range 0 .. 3*linesize). + * size size of cache in bytes + * linesize size of cache line in bytes (always power-of-2) + * assoc_or1 number of associativities (ways/sets) in cache + * if all sets affected by cainst, + * or 1 if only one set (or not all sets) of the cache + * is affected by cainst (eg. DIWB or DIWBI [not yet ISA defined]). + * aa, ab unique address registers (temporaries). + * awb set to other than a0 if wb type of instruction + * loopokay 1 allows use of zero-overhead loops, 0 does not + * immrange range (max value) of cainst's immediate offset parameter, in bytes + * (NOTE: macro assumes immrange allows power-of-2 number of lines) + */ + + .macro cache_index_all cainst, size, linesize, assoc_or1, aa, ab, loopokay, maxofs, awb=a0 + + // Number of indices in cache (lines per way): + .set .Lindices, (\size / (\linesize * \assoc_or1)) + // Number of indices processed per loop iteration (max 4): + .set .Lperloop, .Lindices + .ifgt .Lperloop - 4 + .set .Lperloop, 4 + .endif + // Also limit instructions per loop if cache line size exceeds immediate range: + .set .Lmaxperloop, (\maxofs / \linesize) + 1 + .ifgt .Lperloop - .Lmaxperloop + .set .Lperloop, .Lmaxperloop + .endif + // Avoid addi of 128 which takes two instructions (addmi,addi): + .ifeq .Lperloop*\linesize - 128 + .ifgt .Lperloop - 1 + .set .Lperloop, .Lperloop / 2 + .endif + .endif + + // \size byte cache, \linesize byte lines, \assoc_or1 way(s) affected by each \cainst. + // XCHAL_ERRATUM_497 - don't execute using loop, to reduce the amount of added code + .ifne (\loopokay & XCHAL_HAVE_LOOPS && !XCHAL_ERRATUM_497) + + movi \aa, .Lindices / .Lperloop // number of loop iterations + // Possible improvement: need only loop if \aa > 1 ; + // however \aa == 1 is highly unlikely. + movi \ab, 0 // to iterate over cache + loop \aa, .Lend_cachex\@ + .set .Li, 0 ; .rept .Lperloop + \cainst \ab, .Li*\linesize + .set .Li, .Li+1 ; .endr + addi \ab, \ab, .Lperloop*\linesize // move to next line +.Lend_cachex\@: + + .else + + movi \aa, (\size / \assoc_or1) + // Possible improvement: need only loop if \aa > 1 ; + // however \aa == 1 is highly unlikely. + movi \ab, 0 // to iterate over cache + .ifne ((\awb !=a0) & XCHAL_ERRATUM_497) // don't use awb if set to a0 + movi \awb, 0 + .endif +.Lstart_cachex\@: + .set .Li, 0 ; .rept .Lperloop + \cainst \ab, .Li*\linesize + .set .Li, .Li+1 ; .endr + .ifne ((\awb !=a0) & XCHAL_ERRATUM_497) // do memw after 8 cainst wb instructions + addi \awb, \awb, .Lperloop + blti \awb, 8, .Lstart_memw\@ + memw + movi \awb, 0 +.Lstart_memw\@: + .endif + addi \ab, \ab, .Lperloop*\linesize // move to next line + bltu \ab, \aa, .Lstart_cachex\@ + .endif + + .endm + + +/* + * Macro to apply a 'hit' cache instruction to a memory region, + * ie. to any cache entries that cache a specified portion (region) of memory. + * Takes care of the unaligned cases, ie. may apply to one + * more cache line than $asize / lineSize if $aaddr is not aligned. + * + * + * Parameters are: + * cainst instruction/macro that takes an address register parameter + * and an offset parameter (currently always zero) + * and generates a cache instruction (eg. "dhi", "dhwb", "ihi", etc.) + * linesize_log2 log2(size of cache line in bytes) + * addr register containing start address of region (clobbered) + * asize register containing size of the region in bytes (clobbered) + * askew unique register used as temporary + * awb unique register used as temporary for erratum 497. + * + * Note: A possible optimization to this macro is to apply the operation + * to the entire cache if the region exceeds the size of the cache + * by some empirically determined amount or factor. Some experimentation + * is required to determine the appropriate factors, which also need + * to be tunable if required. + */ + + .macro cache_hit_region cainst, linesize_log2, addr, asize, askew, awb=a0 + + // Make \asize the number of iterations: + extui \askew, \addr, 0, \linesize_log2 // get unalignment amount of \addr + add \asize, \asize, \askew // ... and add it to \asize + addi \asize, \asize, (1 << \linesize_log2) - 1 // round up! + srli \asize, \asize, \linesize_log2 + + // Iterate over region: + .ifne ((\awb !=a0) & XCHAL_ERRATUM_497) // don't use awb if set to a0 + movi \awb, 0 + .endif + floopnez \asize, cacheh\@ + \cainst \addr, 0 + .ifne ((\awb !=a0) & XCHAL_ERRATUM_497) // do memw after 8 cainst wb instructions + addi \awb, \awb, 1 + blti \awb, 8, .Lstart_memw\@ + memw + movi \awb, 0 +.Lstart_memw\@: + .endif + addi \addr, \addr, (1 << \linesize_log2) // move to next line + floopend \asize, cacheh\@ + .endm + + + + + +/*************************** INSTRUCTION CACHE ***************************/ + + +/* + * Reset/initialize the instruction cache by simply invalidating it: + * (need to unlock first also, if cache locking implemented): + * + * Parameters: + * aa, ab unique address registers (temporaries) + */ + .macro icache_reset aa, ab, loopokay=0 + icache_unlock_all \aa, \ab, \loopokay + icache_invalidate_all \aa, \ab, \loopokay + .endm + + +/* + * Synchronize after an instruction cache operation, + * to be sure everything is in sync with memory as to be + * expected following any previous instruction cache control operations. + * + * Even if a config doesn't have caches, an isync is still needed + * when instructions in any memory are modified, whether by a loader + * or self-modifying code. Therefore, this macro always produces + * an isync, whether or not an icache is present. + * + * Parameters are: + * ar an address register (temporary) (currently unused, but may be used in future) + */ + .macro icache_sync ar + isync + .endm + + + +/* + * Invalidate a single line of the instruction cache. + * Parameters are: + * ar address register that contains (virtual) address to invalidate + * (may get clobbered in a future implementation, but not currently) + * offset (optional) offset to add to \ar to compute effective address to invalidate + * (note: some number of lsbits are ignored) + */ + .macro icache_invalidate_line ar, offset +#if XCHAL_ICACHE_SIZE > 0 + ihi \ar, \offset // invalidate icache line + icache_sync \ar +#endif + .endm + + + + +/* + * Invalidate instruction cache entries that cache a specified portion of memory. + * Parameters are: + * astart start address (register gets clobbered) + * asize size of the region in bytes (register gets clobbered) + * ac unique register used as temporary + */ + .macro icache_invalidate_region astart, asize, ac +#if XCHAL_ICACHE_SIZE > 0 + // Instruction cache region invalidation: + cache_hit_region ihi, XCHAL_ICACHE_LINEWIDTH, \astart, \asize, \ac + icache_sync \ac + // End of instruction cache region invalidation +#endif + .endm + + + +/* + * Invalidate entire instruction cache. + * + * Parameters: + * aa, ab unique address registers (temporaries) + */ + .macro icache_invalidate_all aa, ab, loopokay=1 +#if XCHAL_ICACHE_SIZE > 0 + // Instruction cache invalidation: + cache_index_all iii, XCHAL_ICACHE_SIZE, XCHAL_ICACHE_LINESIZE, XCHAL_ICACHE_WAYS, \aa, \ab, \loopokay, 1020 + icache_sync \aa + // End of instruction cache invalidation +#endif + .endm + + + +/* + * Lock (prefetch & lock) a single line of the instruction cache. + * + * Parameters are: + * ar address register that contains (virtual) address to lock + * (may get clobbered in a future implementation, but not currently) + * offset offset to add to \ar to compute effective address to lock + * (note: some number of lsbits are ignored) + */ + .macro icache_lock_line ar, offset +#if XCHAL_ICACHE_SIZE > 0 && XCHAL_ICACHE_LINE_LOCKABLE + ipfl \ar, \offset /* prefetch and lock icache line */ + icache_sync \ar +#endif + .endm + + + +/* + * Lock (prefetch & lock) a specified portion of memory into the instruction cache. + * Parameters are: + * astart start address (register gets clobbered) + * asize size of the region in bytes (register gets clobbered) + * ac unique register used as temporary + */ + .macro icache_lock_region astart, asize, ac +#if XCHAL_ICACHE_SIZE > 0 && XCHAL_ICACHE_LINE_LOCKABLE + // Instruction cache region lock: + cache_hit_region ipfl, XCHAL_ICACHE_LINEWIDTH, \astart, \asize, \ac + icache_sync \ac + // End of instruction cache region lock +#endif + .endm + + + +/* + * Unlock a single line of the instruction cache. + * + * Parameters are: + * ar address register that contains (virtual) address to unlock + * (may get clobbered in a future implementation, but not currently) + * offset offset to add to \ar to compute effective address to unlock + * (note: some number of lsbits are ignored) + */ + .macro icache_unlock_line ar, offset +#if XCHAL_ICACHE_SIZE > 0 && XCHAL_ICACHE_LINE_LOCKABLE + ihu \ar, \offset /* unlock icache line */ + icache_sync \ar +#endif + .endm + + + +/* + * Unlock a specified portion of memory from the instruction cache. + * Parameters are: + * astart start address (register gets clobbered) + * asize size of the region in bytes (register gets clobbered) + * ac unique register used as temporary + */ + .macro icache_unlock_region astart, asize, ac +#if XCHAL_ICACHE_SIZE > 0 && XCHAL_ICACHE_LINE_LOCKABLE + // Instruction cache region unlock: + cache_hit_region ihu, XCHAL_ICACHE_LINEWIDTH, \astart, \asize, \ac + icache_sync \ac + // End of instruction cache region unlock +#endif + .endm + + + +/* + * Unlock entire instruction cache. + * + * Parameters: + * aa, ab unique address registers (temporaries) + */ + .macro icache_unlock_all aa, ab, loopokay=1 +#if XCHAL_ICACHE_SIZE > 0 && XCHAL_ICACHE_LINE_LOCKABLE + // Instruction cache unlock: + cache_index_all iiu, XCHAL_ICACHE_SIZE, XCHAL_ICACHE_LINESIZE, 1, \aa, \ab, \loopokay, 240 + icache_sync \aa + // End of instruction cache unlock +#endif + .endm + + + + + +/*************************** DATA CACHE ***************************/ + + + +/* + * Reset/initialize the data cache by simply invalidating it + * (need to unlock first also, if cache locking implemented): + * + * Parameters: + * aa, ab unique address registers (temporaries) + */ + .macro dcache_reset aa, ab, loopokay=0 + dcache_unlock_all \aa, \ab, \loopokay + dcache_invalidate_all \aa, \ab, \loopokay + .endm + + + + +/* + * Synchronize after a data cache operation, + * to be sure everything is in sync with memory as to be + * expected following any previous data cache control operations. + * + * Parameters are: + * ar an address register (temporary) (currently unused, but may be used in future) + */ + .macro dcache_sync ar, wbtype=0 +#if XCHAL_DCACHE_SIZE > 0 + // No synchronization is needed. + // (memw may be desired e.g. after writeback operation to help ensure subsequent + // external accesses are seen to follow that writeback, however that's outside + // the scope of this macro) + + //dsync + .ifne (\wbtype & XCHAL_ERRATUM_497) + memw + .endif +#endif + .endm + + + +/* + * Turn on cache coherence. + * + * WARNING: for RE-201x.x and later hardware, any interrupt that tries + * to change MEMCTL will see its changes dropped if the interrupt comes + * in the middle of this routine. If this might be an issue, call this + * routine with interrupts disabled. + * + * Parameters are: + * ar,at two scratch address registers (both clobbered) + */ + .macro cache_coherence_on ar at +#if XCHAL_DCACHE_IS_COHERENT +# if XCHAL_HW_MIN_VERSION >= XTENSA_HWVERSION_RE_2012_0 + /* Have MEMCTL. Enable snoop responses. */ + rsr.memctl \ar + movi \at, MEMCTL_SNOOP_EN + or \ar, \ar, \at + wsr.memctl \ar +# elif XCHAL_HAVE_EXTERN_REGS && XCHAL_HAVE_MX + /* Opt into coherence for MX (for backward compatibility / testing). */ + movi \ar, 1 + movi \at, XER_CCON + wer \ar, \at + extw +# endif +#endif + .endm + + + +/* + * Turn off cache coherence. + * + * NOTE: this is generally preceded by emptying the cache; + * see xthal_cache_coherence_optout() in hal/coherence.c for details. + * + * WARNING: for RE-201x.x and later hardware, any interrupt that tries + * to change MEMCTL will see its changes dropped if the interrupt comes + * in the middle of this routine. If this might be an issue, call this + * routine with interrupts disabled. + * + * Parameters are: + * ar,at two scratch address registers (both clobbered) + */ + .macro cache_coherence_off ar at +#if XCHAL_DCACHE_IS_COHERENT +# if XCHAL_HW_MIN_VERSION >= XTENSA_HWVERSION_RE_2012_0 + /* Have MEMCTL. Disable snoop responses. */ + rsr.memctl \ar + movi \at, ~MEMCTL_SNOOP_EN + and \ar, \ar, \at + wsr.memctl \ar +# elif XCHAL_HAVE_EXTERN_REGS && XCHAL_HAVE_MX + /* Opt out of coherence, for MX (for backward compatibility / testing). */ + extw + movi \at, 0 + movi \ar, XER_CCON + wer \at, \ar + extw +# endif +#endif + .endm + + + +/* + * Synchronize after a data store operation, + * to be sure the stored data is completely off the processor + * (and assuming there is no buffering outside the processor, + * that the data is in memory). This may be required to + * ensure that the processor's write buffers are emptied. + * A MEMW followed by a read guarantees this, by definition. + * We also try to make sure the read itself completes. + * + * Parameters are: + * ar an address register (temporary) + */ + .macro write_sync ar + memw // ensure previous memory accesses are complete prior to subsequent memory accesses + l32i \ar, sp, 0 // completing this read ensures any previous write has completed, because of MEMW + //slot + add \ar, \ar, \ar // use the result of the read to help ensure the read completes (in future architectures) + .endm + + +/* + * Invalidate a single line of the data cache. + * Parameters are: + * ar address register that contains (virtual) address to invalidate + * (may get clobbered in a future implementation, but not currently) + * offset (optional) offset to add to \ar to compute effective address to invalidate + * (note: some number of lsbits are ignored) + */ + .macro dcache_invalidate_line ar, offset +#if XCHAL_DCACHE_SIZE > 0 + dhi \ar, \offset + dcache_sync \ar +#endif + .endm + + + + + +/* + * Invalidate data cache entries that cache a specified portion of memory. + * Parameters are: + * astart start address (register gets clobbered) + * asize size of the region in bytes (register gets clobbered) + * ac unique register used as temporary + */ + .macro dcache_invalidate_region astart, asize, ac +#if XCHAL_DCACHE_SIZE > 0 + // Data cache region invalidation: + cache_hit_region dhi, XCHAL_DCACHE_LINEWIDTH, \astart, \asize, \ac + dcache_sync \ac + // End of data cache region invalidation +#endif + .endm + + + +/* + * Invalidate entire data cache. + * + * Parameters: + * aa, ab unique address registers (temporaries) + */ + .macro dcache_invalidate_all aa, ab, loopokay=1 +#if XCHAL_DCACHE_SIZE > 0 + // Data cache invalidation: + cache_index_all dii, XCHAL_DCACHE_SIZE, XCHAL_DCACHE_LINESIZE, XCHAL_DCACHE_WAYS, \aa, \ab, \loopokay, 1020 + dcache_sync \aa + // End of data cache invalidation +#endif + .endm + + + +/* + * Writeback a single line of the data cache. + * Parameters are: + * ar address register that contains (virtual) address to writeback + * (may get clobbered in a future implementation, but not currently) + * offset offset to add to \ar to compute effective address to writeback + * (note: some number of lsbits are ignored) + */ + .macro dcache_writeback_line ar, offset +#if XCHAL_DCACHE_SIZE > 0 && XCHAL_DCACHE_IS_WRITEBACK + dhwb \ar, \offset + dcache_sync \ar, wbtype=1 +#endif + .endm + + + +/* + * Writeback dirty data cache entries that cache a specified portion of memory. + * Parameters are: + * astart start address (register gets clobbered) + * asize size of the region in bytes (register gets clobbered) + * ac unique register used as temporary + */ + .macro dcache_writeback_region astart, asize, ac, awb +#if XCHAL_DCACHE_SIZE > 0 && XCHAL_DCACHE_IS_WRITEBACK + // Data cache region writeback: + cache_hit_region dhwb, XCHAL_DCACHE_LINEWIDTH, \astart, \asize, \ac, \awb + dcache_sync \ac, wbtype=1 + // End of data cache region writeback +#endif + .endm + + + +/* + * Writeback entire data cache. + * Parameters: + * aa, ab unique address registers (temporaries) + */ + .macro dcache_writeback_all aa, ab, awb, loopokay=1 +#if XCHAL_DCACHE_SIZE > 0 && XCHAL_DCACHE_IS_WRITEBACK + // Data cache writeback: + cache_index_all diwb, XCHAL_DCACHE_SIZE, XCHAL_DCACHE_LINESIZE, 1, \aa, \ab, \loopokay, 240, \awb, + dcache_sync \aa, wbtype=1 + // End of data cache writeback +#endif + .endm + + + +/* + * Writeback and invalidate a single line of the data cache. + * Parameters are: + * ar address register that contains (virtual) address to writeback and invalidate + * (may get clobbered in a future implementation, but not currently) + * offset offset to add to \ar to compute effective address to writeback and invalidate + * (note: some number of lsbits are ignored) + */ + .macro dcache_writeback_inv_line ar, offset +#if XCHAL_DCACHE_SIZE > 0 + dhwbi \ar, \offset /* writeback and invalidate dcache line */ + dcache_sync \ar, wbtype=1 +#endif + .endm + + + +/* + * Writeback and invalidate data cache entries that cache a specified portion of memory. + * Parameters are: + * astart start address (register gets clobbered) + * asize size of the region in bytes (register gets clobbered) + * ac unique register used as temporary + */ + .macro dcache_writeback_inv_region astart, asize, ac, awb +#if XCHAL_DCACHE_SIZE > 0 + // Data cache region writeback and invalidate: + cache_hit_region dhwbi, XCHAL_DCACHE_LINEWIDTH, \astart, \asize, \ac, \awb + dcache_sync \ac, wbtype=1 + // End of data cache region writeback and invalidate +#endif + .endm + + + +/* + * Writeback and invalidate entire data cache. + * Parameters: + * aa, ab unique address registers (temporaries) + */ + .macro dcache_writeback_inv_all aa, ab, awb, loopokay=1 +#if XCHAL_DCACHE_SIZE > 0 + // Data cache writeback and invalidate: +#if XCHAL_DCACHE_IS_WRITEBACK + cache_index_all diwbi, XCHAL_DCACHE_SIZE, XCHAL_DCACHE_LINESIZE, 1, \aa, \ab, \loopokay, 240, \awb + dcache_sync \aa, wbtype=1 +#else /*writeback*/ + // Data cache does not support writeback, so just invalidate: */ + dcache_invalidate_all \aa, \ab, \loopokay +#endif /*writeback*/ + // End of data cache writeback and invalidate +#endif + .endm + + + + +/* + * Lock (prefetch & lock) a single line of the data cache. + * + * Parameters are: + * ar address register that contains (virtual) address to lock + * (may get clobbered in a future implementation, but not currently) + * offset offset to add to \ar to compute effective address to lock + * (note: some number of lsbits are ignored) + */ + .macro dcache_lock_line ar, offset +#if XCHAL_DCACHE_SIZE > 0 && XCHAL_DCACHE_LINE_LOCKABLE + dpfl \ar, \offset /* prefetch and lock dcache line */ + dcache_sync \ar +#endif + .endm + + + +/* + * Lock (prefetch & lock) a specified portion of memory into the data cache. + * Parameters are: + * astart start address (register gets clobbered) + * asize size of the region in bytes (register gets clobbered) + * ac unique register used as temporary + */ + .macro dcache_lock_region astart, asize, ac +#if XCHAL_DCACHE_SIZE > 0 && XCHAL_DCACHE_LINE_LOCKABLE + // Data cache region lock: + cache_hit_region dpfl, XCHAL_DCACHE_LINEWIDTH, \astart, \asize, \ac + dcache_sync \ac + // End of data cache region lock +#endif + .endm + + + +/* + * Unlock a single line of the data cache. + * + * Parameters are: + * ar address register that contains (virtual) address to unlock + * (may get clobbered in a future implementation, but not currently) + * offset offset to add to \ar to compute effective address to unlock + * (note: some number of lsbits are ignored) + */ + .macro dcache_unlock_line ar, offset +#if XCHAL_DCACHE_SIZE > 0 && XCHAL_DCACHE_LINE_LOCKABLE + dhu \ar, \offset /* unlock dcache line */ + dcache_sync \ar +#endif + .endm + + + +/* + * Unlock a specified portion of memory from the data cache. + * Parameters are: + * astart start address (register gets clobbered) + * asize size of the region in bytes (register gets clobbered) + * ac unique register used as temporary + */ + .macro dcache_unlock_region astart, asize, ac +#if XCHAL_DCACHE_SIZE > 0 && XCHAL_DCACHE_LINE_LOCKABLE + // Data cache region unlock: + cache_hit_region dhu, XCHAL_DCACHE_LINEWIDTH, \astart, \asize, \ac + dcache_sync \ac + // End of data cache region unlock +#endif + .endm + + + +/* + * Unlock entire data cache. + * + * Parameters: + * aa, ab unique address registers (temporaries) + */ + .macro dcache_unlock_all aa, ab, loopokay=1 +#if XCHAL_DCACHE_SIZE > 0 && XCHAL_DCACHE_LINE_LOCKABLE + // Data cache unlock: + cache_index_all diu, XCHAL_DCACHE_SIZE, XCHAL_DCACHE_LINESIZE, 1, \aa, \ab, \loopokay, 240 + dcache_sync \aa + // End of data cache unlock +#endif + .endm + + + +/* + * Get the number of enabled icache ways. Note that this may + * be different from the value read from the MEMCTL register. + * + * Parameters: + * aa address register where value is returned + */ + .macro icache_get_ways aa +#if XCHAL_ICACHE_SIZE > 0 +#if XCHAL_HAVE_ICACHE_DYN_WAYS + // Read from MEMCTL and shift/mask + rsr.memctl \aa + extui \aa, \aa, MEMCTL_ICWU_SHIFT, MEMCTL_ICWU_BITS + blti \aa, XCHAL_ICACHE_WAYS, .Licgw + movi \aa, XCHAL_ICACHE_WAYS +.Licgw: +#else + // All ways are always enabled + movi \aa, XCHAL_ICACHE_WAYS +#endif +#else + // No icache + movi \aa, 0 +#endif + .endm + + + +/* + * Set the number of enabled icache ways. + * + * Parameters: + * aa address register specifying number of ways (trashed) + * ab,ac address register for scratch use (trashed) + */ + .macro icache_set_ways aa, ab, ac +#if XCHAL_ICACHE_SIZE > 0 +#if XCHAL_HAVE_ICACHE_DYN_WAYS + movi \ac, MEMCTL_ICWU_CLR_MASK // set up to clear bits 18-22 + rsr.memctl \ab + and \ab, \ab, \ac + movi \ac, MEMCTL_INV_EN // set bit 23 + slli \aa, \aa, MEMCTL_ICWU_SHIFT // move to right spot + or \ab, \ab, \aa + or \ab, \ab, \ac + wsr.memctl \ab + isync +#else + // All ways are always enabled +#endif +#else + // No icache +#endif + .endm + + + +/* + * Get the number of enabled dcache ways. Note that this may + * be different from the value read from the MEMCTL register. + * + * Parameters: + * aa address register where value is returned + */ + .macro dcache_get_ways aa +#if XCHAL_DCACHE_SIZE > 0 +#if XCHAL_HAVE_DCACHE_DYN_WAYS + // Read from MEMCTL and shift/mask + rsr.memctl \aa + extui \aa, \aa, MEMCTL_DCWU_SHIFT, MEMCTL_DCWU_BITS + blti \aa, XCHAL_DCACHE_WAYS, .Ldcgw + movi \aa, XCHAL_DCACHE_WAYS +.Ldcgw: +#else + // All ways are always enabled + movi \aa, XCHAL_DCACHE_WAYS +#endif +#else + // No dcache + movi \aa, 0 +#endif + .endm + + + +/* + * Set the number of enabled dcache ways. + * + * Parameters: + * aa address register specifying number of ways (trashed) + * ab,ac address register for scratch use (trashed) + */ + .macro dcache_set_ways aa, ab, ac +#if (XCHAL_DCACHE_SIZE > 0) && XCHAL_HAVE_DCACHE_DYN_WAYS + movi \ac, MEMCTL_DCWA_CLR_MASK // set up to clear bits 13-17 + rsr.memctl \ab + and \ab, \ab, \ac // clear ways allocatable + slli \ac, \aa, MEMCTL_DCWA_SHIFT + or \ab, \ab, \ac // set ways allocatable + wsr.memctl \ab +#if XCHAL_DCACHE_IS_WRITEBACK + // Check if the way count is increasing or decreasing + extui \ac, \ab, MEMCTL_DCWU_SHIFT, MEMCTL_DCWU_BITS // bits 8-12 - ways in use + bge \aa, \ac, .Ldsw3 // equal or increasing + slli \ab, \aa, XCHAL_DCACHE_LINEWIDTH + XCHAL_DCACHE_SETWIDTH // start way number + slli \ac, \ac, XCHAL_DCACHE_LINEWIDTH + XCHAL_DCACHE_SETWIDTH // end way number +.Ldsw1: + diwbui.p \ab // auto-increments ab + bge \ab, \ac, .Ldsw2 + beqz \ab, .Ldsw2 + j .Ldsw1 +.Ldsw2: + rsr.memctl \ab +#endif +.Ldsw3: + // No dirty data to write back, just set the new number of ways + movi \ac, MEMCTL_DCWU_CLR_MASK // set up to clear bits 8-12 + and \ab, \ab, \ac // clear ways in use + movi \ac, MEMCTL_INV_EN + or \ab, \ab, \ac // set bit 23 + slli \aa, \aa, MEMCTL_DCWU_SHIFT + or \ab, \ab, \aa // set ways in use + wsr.memctl \ab +#else + // No dcache or no way disable support +#endif + .endm + +#endif /*XTENSA_CACHEASM_H*/ + diff --git a/arch/xtensa/include/esp32/xtensa/include/xtensa/cacheattrasm.h b/arch/xtensa/include/esp32/xtensa/include/xtensa/cacheattrasm.h new file mode 100644 index 0000000000000..9c1c9c939e3a5 --- /dev/null +++ b/arch/xtensa/include/esp32/xtensa/include/xtensa/cacheattrasm.h @@ -0,0 +1,436 @@ +/* + * xtensa/cacheattrasm.h -- assembler-specific CACHEATTR register related definitions + * that depend on CORE configuration + * + * This file is logically part of xtensa/coreasm.h (or perhaps xtensa/cacheasm.h), + * but is kept separate for modularity / compilation-performance. + */ + +/* + * Copyright (c) 2001-2009 Tensilica Inc. + * + * 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 the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 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. + */ + +#ifndef XTENSA_CACHEATTRASM_H +#define XTENSA_CACHEATTRASM_H + +#include + +/* Determine whether cache attributes are controlled using eight 512MB entries: */ +#define XCHAL_CA_8X512 (XCHAL_HAVE_CACHEATTR || XCHAL_HAVE_MIMIC_CACHEATTR || XCHAL_HAVE_XLT_CACHEATTR \ + || (XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY)) + + +/* + * This header file defines assembler macros of the form: + * cacheattr_ + * where: + * is 'i', 'd' or absent for instruction, data + * or both caches; and + * indicates the function of the macro. + * + * The following functions are defined: + * + * icacheattr_get + * Reads I-cache CACHEATTR into a2 (clobbers a3-a5). + * + * dcacheattr_get + * Reads D-cache CACHEATTR into a2 (clobbers a3-a5). + * (Note: for configs with a real CACHEATTR register, the + * above two macros are identical.) + * + * cacheattr_set + * Writes both I-cache and D-cache CACHEATTRs from a2 (a3-a8 clobbered). + * Works even when changing one's own code's attributes. + * + * icacheattr_is_enabled label + * Branches to \label if I-cache appears to have been enabled + * (eg. if CACHEATTR contains a cache-enabled attribute). + * (clobbers a2-a5,SAR) + * + * dcacheattr_is_enabled label + * Branches to \label if D-cache appears to have been enabled + * (eg. if CACHEATTR contains a cache-enabled attribute). + * (clobbers a2-a5,SAR) + * + * cacheattr_is_enabled label + * Branches to \label if either I-cache or D-cache appears to have been enabled + * (eg. if CACHEATTR contains a cache-enabled attribute). + * (clobbers a2-a5,SAR) + * + * The following macros are only defined under certain conditions: + * + * icacheattr_set (if XCHAL_HAVE_MIMIC_CACHEATTR || XCHAL_HAVE_XLT_CACHEATTR) + * Writes I-cache CACHEATTR from a2 (a3-a8 clobbered). + * + * dcacheattr_set (if XCHAL_HAVE_MIMIC_CACHEATTR || XCHAL_HAVE_XLT_CACHEATTR) + * Writes D-cache CACHEATTR from a2 (a3-a8 clobbered). + */ + + + +/*************************** GENERIC -- ALL CACHES ***************************/ + +/* + * _cacheattr_get + * + * (Internal macro.) + * Returns value of CACHEATTR register (or closest equivalent) in a2. + * + * Entry: + * (none) + * Exit: + * a2 value read from CACHEATTR + * a3-a5 clobbered (temporaries) + */ + .macro _cacheattr_get tlb +#if XCHAL_HAVE_CACHEATTR + rsr.cacheattr a2 +#elif XCHAL_CA_8X512 + // We have a config that "mimics" CACHEATTR using a simplified + // "MMU" composed of a single statically-mapped way. + // DTLB and ITLB are independent, so there's no single + // cache attribute that can describe both. So for now + // just return the DTLB state. + movi a5, 0xE0000000 + movi a2, 0 + movi a3, XCHAL_SPANNING_WAY +1: add a3, a3, a5 // next segment + r&tlb&1 a4, a3 // get PPN+CA of segment at 0xE0000000, 0xC0000000, ..., 0 + dsync // interlock??? + slli a2, a2, 4 + extui a4, a4, 0, 4 // extract CA + or a2, a2, a4 + bgeui a3, 16, 1b +#else + // This macro isn't applicable to arbitrary MMU configurations. + // Just return zero. + movi a2, 0 +#endif + .endm + + .macro icacheattr_get + _cacheattr_get itlb + .endm + + .macro dcacheattr_get + _cacheattr_get dtlb + .endm + + +/* Default (powerup/reset) value of CACHEATTR, + all BYPASS mode (ie. disabled/bypassed caches): */ +#if XCHAL_HAVE_PTP_MMU +# define XCHAL_CACHEATTR_ALL_BYPASS 0x33333333 +#else +# define XCHAL_CACHEATTR_ALL_BYPASS 0x22222222 +#endif + +#if XCHAL_CA_8X512 + +#if XCHAL_HAVE_PTP_MMU +# define XCHAL_FCA_ENAMASK 0x0AA0 /* bitmap of fetch attributes that require enabled icache */ +# define XCHAL_LCA_ENAMASK 0x0FF0 /* bitmap of load attributes that require enabled dcache */ +# define XCHAL_SCA_ENAMASK 0x0CC0 /* bitmap of store attributes that require enabled dcache */ +#else +# define XCHAL_FCA_ENAMASK 0x003A /* bitmap of fetch attributes that require enabled icache */ +# define XCHAL_LCA_ENAMASK 0x0033 /* bitmap of load attributes that require enabled dcache */ +# define XCHAL_SCA_ENAMASK 0x0033 /* bitmap of store attributes that require enabled dcache */ +#endif +#define XCHAL_LSCA_ENAMASK (XCHAL_LCA_ENAMASK|XCHAL_SCA_ENAMASK) /* l/s attrs requiring enabled dcache */ +#define XCHAL_ALLCA_ENAMASK (XCHAL_FCA_ENAMASK|XCHAL_LSCA_ENAMASK) /* all attrs requiring enabled caches */ + +/* + * _cacheattr_is_enabled + * + * (Internal macro.) + * Branches to \label if CACHEATTR in a2 indicates an enabled + * cache, using mask in a3. + * + * Parameters: + * label where to branch to if cache is enabled + * Entry: + * a2 contains CACHEATTR value used to determine whether + * caches are enabled + * a3 16-bit constant where each bit correspond to + * one of the 16 possible CA values (in a CACHEATTR mask); + * CA values that indicate the cache is enabled + * have their corresponding bit set in this mask + * (eg. use XCHAL_xCA_ENAMASK , above) + * Exit: + * a2,a4,a5 clobbered + * SAR clobbered + */ + .macro _cacheattr_is_enabled label + movi a4, 8 // loop 8 times +.Lcaife\@: + extui a5, a2, 0, 4 // get CA nibble + ssr a5 // index into mask according to CA... + srl a5, a3 // ...and get CA's mask bit in a5 bit 0 + bbsi.l a5, 0, \label // if CA indicates cache enabled, jump to label + srli a2, a2, 4 // next nibble + addi a4, a4, -1 + bnez a4, .Lcaife\@ // loop for each nibble + .endm + +#else /* XCHAL_CA_8X512 */ + .macro _cacheattr_is_enabled label + j \label // macro not applicable, assume caches always enabled + .endm +#endif /* XCHAL_CA_8X512 */ + + + +/* + * icacheattr_is_enabled + * + * Branches to \label if I-cache is enabled. + * + * Parameters: + * label where to branch to if icache is enabled + * Entry: + * (none) + * Exit: + * a2-a5, SAR clobbered (temporaries) + */ + .macro icacheattr_is_enabled label +#if XCHAL_CA_8X512 + icacheattr_get + movi a3, XCHAL_FCA_ENAMASK +#endif + _cacheattr_is_enabled \label + .endm + +/* + * dcacheattr_is_enabled + * + * Branches to \label if D-cache is enabled. + * + * Parameters: + * label where to branch to if dcache is enabled + * Entry: + * (none) + * Exit: + * a2-a5, SAR clobbered (temporaries) + */ + .macro dcacheattr_is_enabled label +#if XCHAL_CA_8X512 + dcacheattr_get + movi a3, XCHAL_LSCA_ENAMASK +#endif + _cacheattr_is_enabled \label + .endm + +/* + * cacheattr_is_enabled + * + * Branches to \label if either I-cache or D-cache is enabled. + * + * Parameters: + * label where to branch to if a cache is enabled + * Entry: + * (none) + * Exit: + * a2-a5, SAR clobbered (temporaries) + */ + .macro cacheattr_is_enabled label +#if XCHAL_HAVE_CACHEATTR + rsr.cacheattr a2 + movi a3, XCHAL_ALLCA_ENAMASK +#elif XCHAL_CA_8X512 + icacheattr_get + movi a3, XCHAL_FCA_ENAMASK + _cacheattr_is_enabled \label + dcacheattr_get + movi a3, XCHAL_LSCA_ENAMASK +#endif + _cacheattr_is_enabled \label + .endm + + + +/* + * The ISA does not have a defined way to change the + * instruction cache attributes of the running code, + * ie. of the memory area that encloses the current PC. + * However, each micro-architecture (or class of + * configurations within a micro-architecture) + * provides a way to deal with this issue. + * + * Here are a few macros used to implement the relevant + * approach taken. + */ + +#if XCHAL_CA_8X512 && !XCHAL_HAVE_CACHEATTR + // We have a config that "mimics" CACHEATTR using a simplified + // "MMU" composed of a single statically-mapped way. + +/* + * icacheattr_set + * + * Entry: + * a2 cacheattr value to set + * Exit: + * a2 unchanged + * a3-a8 clobbered (temporaries) + */ + .macro icacheattr_set + + movi a5, 0xE0000000 // mask of upper 3 bits + movi a6, 3f // PC where ITLB is set + movi a3, XCHAL_SPANNING_WAY // start at region 0 (0 .. 7) + mov a7, a2 // copy a2 so it doesn't get clobbered + and a6, a6, a5 // upper 3 bits of local PC area + j 3f + + // Use micro-architecture specific method. + // The following 4-instruction sequence is aligned such that + // it all fits within a single I-cache line. Sixteen byte + // alignment is sufficient for this (using XCHAL_ICACHE_LINESIZE + // actually causes problems because that can be greater than + // the alignment of the reset vector, where this macro is often + // invoked, which would cause the linker to align the reset + // vector code away from the reset vector!!). + .begin no-transform + .align 16 /*XCHAL_ICACHE_LINESIZE*/ +1: witlb a4, a3 // write wired PTE (CA, no PPN) of 512MB segment to ITLB + isync + .end no-transform + nop + nop + + sub a3, a3, a5 // next segment (add 0x20000000) + bltui a3, 16, 4f // done? + + // Note that in the WITLB loop, we don't do any load/stores + // (may not be an issue here, but it is important in the DTLB case). +2: srli a7, a7, 4 // next CA +3: +# if XCHAL_HAVE_MIMIC_CACHEATTR + extui a4, a7, 0, 4 // extract CA to set +# else /* have translation, preserve it: */ + ritlb1 a8, a3 // get current PPN+CA of segment + //dsync // interlock??? + extui a4, a7, 0, 4 // extract CA to set + srli a8, a8, 4 // clear CA but keep PPN ... + slli a8, a8, 4 // ... + add a4, a4, a8 // combine new CA with PPN to preserve +# endif + beq a3, a6, 1b // current PC's region? if so, do it in a safe way + witlb a4, a3 // write wired PTE (CA [+PPN]) of 512MB segment to ITLB + sub a3, a3, a5 // next segment (add 0x20000000) + bgeui a3, 16, 2b + isync // make sure all ifetch changes take effect +4: + .endm // icacheattr_set + + +/* + * dcacheattr_set + * + * Entry: + * a2 cacheattr value to set + * Exit: + * a2 unchanged + * a3-a8 clobbered (temporaries) + */ + + .macro dcacheattr_set + + movi a5, 0xE0000000 // mask of upper 3 bits + movi a3, XCHAL_SPANNING_WAY // start at region 0 (0 .. 7) + mov a7, a2 // copy a2 so it doesn't get clobbered + // Note that in the WDTLB loop, we don't do any load/stores +2: // (including implicit l32r via movi) because it isn't safe. +# if XCHAL_HAVE_MIMIC_CACHEATTR + extui a4, a7, 0, 4 // extract CA to set +# else /* have translation, preserve it: */ + rdtlb1 a8, a3 // get current PPN+CA of segment + //dsync // interlock??? + extui a4, a7, 0, 4 // extract CA to set + srli a8, a8, 4 // clear CA but keep PPN ... + slli a8, a8, 4 // ... + add a4, a4, a8 // combine new CA with PPN to preserve +# endif + wdtlb a4, a3 // write wired PTE (CA [+PPN]) of 512MB segment to DTLB + sub a3, a3, a5 // next segment (add 0x20000000) + srli a7, a7, 4 // next CA + bgeui a3, 16, 2b + dsync // make sure all data path changes take effect + .endm // dcacheattr_set + +#endif /* XCHAL_CA_8X512 && !XCHAL_HAVE_CACHEATTR */ + + + +/* + * cacheattr_set + * + * Macro that sets the current CACHEATTR safely + * (both i and d) according to the current contents of a2. + * It works even when changing the cache attributes of + * the currently running code. + * + * Entry: + * a2 cacheattr value to set + * Exit: + * a2 unchanged + * a3-a8 clobbered (temporaries) + */ + .macro cacheattr_set + +#if XCHAL_HAVE_CACHEATTR +# if XCHAL_ICACHE_LINESIZE < 4 + // No i-cache, so can always safely write to CACHEATTR: + wsr.cacheattr a2 +# else + // The Athens micro-architecture, when using the old + // exception architecture option (ie. with the CACHEATTR register) + // allows changing the cache attributes of the running code + // using the following exact sequence aligned to be within + // an instruction cache line. (NOTE: using XCHAL_ICACHE_LINESIZE + // alignment actually causes problems because that can be greater + // than the alignment of the reset vector, where this macro is often + // invoked, which would cause the linker to align the reset + // vector code away from the reset vector!!). + j 1f + .begin no-transform + .align 16 /*XCHAL_ICACHE_LINESIZE*/ // align to within an I-cache line +1: wsr.cacheattr a2 + isync + .end no-transform + nop + nop +# endif +#elif XCHAL_CA_8X512 + // DTLB and ITLB are independent, but to keep semantics + // of this macro we simply write to both. + icacheattr_set + dcacheattr_set +#else + // This macro isn't applicable to arbitrary MMU configurations. + // Do nothing in this case. +#endif + .endm + + +#endif /*XTENSA_CACHEATTRASM_H*/ + diff --git a/arch/xtensa/include/esp32/xtensa/include/xtensa/core-macros.h b/arch/xtensa/include/esp32/xtensa/include/xtensa/core-macros.h new file mode 100644 index 0000000000000..b9c99fad3555b --- /dev/null +++ b/arch/xtensa/include/esp32/xtensa/include/xtensa/core-macros.h @@ -0,0 +1,506 @@ +/* + * xtensa/core-macros.h -- C specific definitions + * that depend on CORE configuration + */ + +/* + * Copyright (c) 2012 Tensilica Inc. + * + * 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 the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 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. + */ + +#ifndef XTENSA_CACHE_H +#define XTENSA_CACHE_H + +#include + +/* Only define things for C code. */ +#if !defined(_ASMLANGUAGE) && !defined(_NOCLANGUAGE) && !defined(__ASSEMBLER__) + + + +/*************************** CACHE ***************************/ + +/* All the macros are in the lower case now and some of them + * share the name with the existing functions from hal.h. + * Including this header file will define XTHAL_USE_CACHE_MACROS + * which directs hal.h not to use the functions. + * + + * + * Single-cache-line operations in C-callable inline assembly. + * Essentially macro versions (uppercase) of: + * + * xthal_icache_line_invalidate(void *addr); + * xthal_icache_line_lock(void *addr); + * xthal_icache_line_unlock(void *addr); + * xthal_icache_sync(void); + * + * NOTE: unlike the above functions, the following macros do NOT + * execute the xthal_icache_sync() as part of each line operation. + * This sync must be called explicitly by the caller. This is to + * allow better optimization when operating on more than one line. + * + * xthal_dcache_line_invalidate(void *addr); + * xthal_dcache_line_writeback(void *addr); + * xthal_dcache_line_writeback_inv(void *addr); + * xthal_dcache_line_lock(void *addr); + * xthal_dcache_line_unlock(void *addr); + * xthal_dcache_sync(void); + * xthal_dcache_line_prefetch_for_write(void *addr); + * xthal_dcache_line_prefetch_for_read(void *addr); + * + * All are made memory-barriers, given that's how they're typically used + * (ops operate on a whole line, so clobbers all memory not just *addr). + * + * NOTE: All the block block cache ops and line prefetches are implemented + * using intrinsics so they are better optimized regarding memory barriers etc. + * + * All block downgrade functions exist in two forms: with and without + * the 'max' parameter: This parameter allows compiler to optimize + * the functions whenever the parameter is smaller than the cache size. + * + * xthal_dcache_block_invalidate(void *addr, unsigned size); + * xthal_dcache_block_writeback(void *addr, unsigned size); + * xthal_dcache_block_writeback_inv(void *addr, unsigned size); + * xthal_dcache_block_invalidate_max(void *addr, unsigned size, unsigned max); + * xthal_dcache_block_writeback_max(void *addr, unsigned size, unsigned max); + * xthal_dcache_block_writeback_inv_max(void *addr, unsigned size, unsigned max); + * + * xthal_dcache_block_prefetch_for_read(void *addr, unsigned size); + * xthal_dcache_block_prefetch_for_write(void *addr, unsigned size); + * xthal_dcache_block_prefetch_modify(void *addr, unsigned size); + * xthal_dcache_block_prefetch_read_write(void *addr, unsigned size); + * xthal_dcache_block_prefetch_for_read_grp(void *addr, unsigned size); + * xthal_dcache_block_prefetch_for_write_grp(void *addr, unsigned size); + * xthal_dcache_block_prefetch_modify_grp(void *addr, unsigned size); + * xthal_dcache_block_prefetch_read_write_grp(void *addr, unsigned size) + * + * xthal_dcache_block_wait(); + * xthal_dcache_block_required_wait(); + * xthal_dcache_block_abort(); + * xthal_dcache_block_prefetch_end(); + * xthal_dcache_block_newgrp(); + */ + +/*** INSTRUCTION CACHE ***/ + +#define XTHAL_USE_CACHE_MACROS + +#if XCHAL_ICACHE_SIZE > 0 +# define xthal_icache_line_invalidate(addr) do { void *__a = (void*)(addr); \ + __asm__ __volatile__("ihi %0, 0" :: "a"(__a) : "memory"); \ + } while(0) +#else +# define xthal_icache_line_invalidate(addr) do {/*nothing*/} while(0) +#endif + +#if XCHAL_ICACHE_SIZE > 0 && XCHAL_ICACHE_LINE_LOCKABLE +# define xthal_icache_line_lock(addr) do { void *__a = (void*)(addr); \ + __asm__ __volatile__("ipfl %0, 0" :: "a"(__a) : "memory"); \ + } while(0) +# define xthal_icache_line_unlock(addr) do { void *__a = (void*)(addr); \ + __asm__ __volatile__("ihu %0, 0" :: "a"(__a) : "memory"); \ + } while(0) +#else +# define xthal_icache_line_lock(addr) do {/*nothing*/} while(0) +# define xthal_icache_line_unlock(addr) do {/*nothing*/} while(0) +#endif + +/* + * Even if a config doesn't have caches, an isync is still needed + * when instructions in any memory are modified, whether by a loader + * or self-modifying code. Therefore, this macro always produces + * an isync, whether or not an icache is present. + */ +#define xthal_icache_sync() \ + __asm__ __volatile__("isync":::"memory") + + +/*** DATA CACHE ***/ + +#if XCHAL_DCACHE_SIZE > 0 + +# include + +# define xthal_dcache_line_invalidate(addr) do { void *__a = (void*)(addr); \ + __asm__ __volatile__("dhi %0, 0" :: "a"(__a) : "memory"); \ + } while(0) +# define xthal_dcache_line_writeback(addr) do { void *__a = (void*)(addr); \ + __asm__ __volatile__("dhwb %0, 0" :: "a"(__a) : "memory"); \ + } while(0) +# define xthal_dcache_line_writeback_inv(addr) do { void *__a = (void*)(addr); \ + __asm__ __volatile__("dhwbi %0, 0" :: "a"(__a) : "memory"); \ + } while(0) +# define xthal_dcache_sync() \ + __asm__ __volatile__("" /*"dsync"?*/:::"memory") +# define xthal_dcache_line_prefetch_for_read(addr) do { \ + XT_DPFR((const int*)addr, 0); \ + } while(0) +#else +# define xthal_dcache_line_invalidate(addr) do {/*nothing*/} while(0) +# define xthal_dcache_line_writeback(addr) do {/*nothing*/} while(0) +# define xthal_dcache_line_writeback_inv(addr) do {/*nothing*/} while(0) +# define xthal_dcache_sync() __asm__ __volatile__("":::"memory") +# define xthal_dcache_line_prefetch_for_read(addr) do {/*nothing*/} while(0) +#endif + +#if XCHAL_DCACHE_SIZE > 0 && XCHAL_DCACHE_LINE_LOCKABLE +# define xthal_dcache_line_lock(addr) do { void *__a = (void*)(addr); \ + __asm__ __volatile__("dpfl %0, 0" :: "a"(__a) : "memory"); \ + } while(0) +# define xthal_dcache_line_unlock(addr) do { void *__a = (void*)(addr); \ + __asm__ __volatile__("dhu %0, 0" :: "a"(__a) : "memory"); \ + } while(0) +#else +# define xthal_dcache_line_lock(addr) do {/*nothing*/} while(0) +# define xthal_dcache_line_unlock(addr) do {/*nothing*/} while(0) +#endif + +#if XCHAL_DCACHE_SIZE > 0 && XCHAL_DCACHE_IS_WRITEBACK + +# define xthal_dcache_line_prefetch_for_write(addr) do { \ + XT_DPFW((const int*)addr, 0); \ + } while(0) +#else +# define xthal_dcache_line_prefetch_for_write(addr) do {/*nothing*/} while(0) +#endif + + +/***** Block Operations *****/ + +#if XCHAL_DCACHE_SIZE > 0 && XCHAL_HAVE_CACHE_BLOCKOPS + +/* upgrades */ + +# define _XTHAL_DCACHE_BLOCK_UPGRADE(addr, size, type) \ + { \ + type((const int*)addr, size); \ + } + +/*downgrades */ + +# define _XTHAL_DCACHE_BLOCK_DOWNGRADE(addr, size, type) \ + unsigned _s = size; \ + unsigned _a = (unsigned) addr; \ + do { \ + unsigned __s = (_s > XCHAL_DCACHE_SIZE) ? \ + XCHAL_DCACHE_SIZE : _s; \ + type((const int*)_a, __s); \ + _s -= __s; \ + _a += __s; \ + } while(_s > 0); + +# define _XTHAL_DCACHE_BLOCK_DOWNGRADE_MAX(addr, size, type, max) \ + if (max <= XCHAL_DCACHE_SIZE) { \ + unsigned _s = size; \ + unsigned _a = (unsigned) addr; \ + type((const int*)_a, _s); \ + } \ + else { \ + _XTHAL_DCACHE_BLOCK_DOWNGRADE(addr, size, type); \ + } + +# define xthal_dcache_block_invalidate(addr, size) do { \ + _XTHAL_DCACHE_BLOCK_DOWNGRADE(addr, size, XT_DHI_B); \ + } while(0) +# define xthal_dcache_block_writeback(addr, size) do { \ + _XTHAL_DCACHE_BLOCK_DOWNGRADE(addr, size, XT_DHWB_B); \ + } while(0) +# define xthal_dcache_block_writeback_inv(addr, size) do { \ + _XTHAL_DCACHE_BLOCK_DOWNGRADE(addr, size, XT_DHWBI_B); \ + } while(0) + +# define xthal_dcache_block_invalidate_max(addr, size, max) do { \ + _XTHAL_DCACHE_BLOCK_DOWNGRADE_MAX(addr, size, XT_DHI_B, max); \ + } while(0) +# define xthal_dcache_block_writeback_max(addr, size, max) do { \ + _XTHAL_DCACHE_BLOCK_DOWNGRADE_MAX(addr, size, XT_DHWB_B, max); \ + } while(0) +# define xthal_dcache_block_writeback_inv_max(addr, size, max) do { \ + _XTHAL_DCACHE_BLOCK_DOWNGRADE_MAX(addr, size, XT_DHWBI_B, max); \ + } while(0) + +/* upgrades that are performed even with write-thru caches */ + +# define xthal_dcache_block_prefetch_read_write(addr, size) do { \ + _XTHAL_DCACHE_BLOCK_UPGRADE(addr, size, XT_DPFW_B); \ + } while(0) +# define xthal_dcache_block_prefetch_read_write_grp(addr, size) do { \ + _XTHAL_DCACHE_BLOCK_UPGRADE(addr, size, XT_DPFW_BF); \ + } while(0) +# define xthal_dcache_block_prefetch_for_read(addr, size) do { \ + _XTHAL_DCACHE_BLOCK_UPGRADE(addr, size, XT_DPFR_B); \ + } while(0) +# define xthal_dcache_block_prefetch_for_read_grp(addr, size) do { \ + _XTHAL_DCACHE_BLOCK_UPGRADE(addr, size, XT_DPFR_BF); \ + } while(0) + +/* abort all or end optional block cache operations */ +# define xthal_dcache_block_abort() do { \ + XT_PFEND_A(); \ + } while(0) +# define xthal_dcache_block_end() do { \ + XT_PFEND_O(); \ + } while(0) + +/* wait for all/required block cache operations to finish */ +# define xthal_dcache_block_wait() do { \ + XT_PFWAIT_A(); \ + } while(0) +# define xthal_dcache_block_required_wait() do { \ + XT_PFWAIT_R(); \ + } while(0) +/* Start a new group */ +# define xthal_dcache_block_newgrp() do { \ + XT_PFNXT_F(); \ + } while(0) +#else +# define xthal_dcache_block_invalidate(addr, size) do {/*nothing*/} while(0) +# define xthal_dcache_block_writeback(addr, size) do {/*nothing*/} while(0) +# define xthal_dcache_block_writeback_inv(addr, size) do {/*nothing*/} while(0) +# define xthal_dcache_block_invalidate_max(addr, size, max) do {/*nothing*/} while(0) +# define xthal_dcache_block_writeback_max(addr, size, max) do {/*nothing*/} while(0) +# define xthal_dcache_block_writeback_inv_max(addr, size, max) do {/*nothing*/} while(0) +# define xthal_dcache_block_prefetch_read_write(addr, size) do {/*nothing*/} while(0) +# define xthal_dcache_block_prefetch_read_write_grp(addr, size) do {/*nothing*/} while(0) +# define xthal_dcache_block_prefetch_for_read(addr, size) do {/*nothing*/} while(0) +# define xthal_dcache_block_prefetch_for_read_grp(addr, size) do {/*nothing*/} while(0) +# define xthal_dcache_block_end() do {/*nothing*/} while(0) +# define xthal_dcache_block_abort() do {/*nothing*/} while(0) +# define xthal_dcache_block_wait() do {/*nothing*/} while(0) +# define xthal_dcache_block_required_wait() do {/*nothing*/} while(0) +# define xthal_dcache_block_newgrp() do {/*nothing*/} while(0) +#endif + +#if XCHAL_DCACHE_SIZE > 0 && XCHAL_HAVE_CACHE_BLOCKOPS && XCHAL_DCACHE_IS_WRITEBACK + +# define xthal_dcache_block_prefetch_for_write(addr, size) do { \ + _XTHAL_DCACHE_BLOCK_UPGRADE(addr, size, XT_DPFW_B); \ + } while(0) +# define xthal_dcache_block_prefetch_modify(addr, size) do { \ + _XTHAL_DCACHE_BLOCK_UPGRADE(addr, size, XT_DPFM_B); \ + } while(0) +# define xthal_dcache_block_prefetch_for_write_grp(addr, size) do { \ + _XTHAL_DCACHE_BLOCK_UPGRADE(addr, size, XT_DPFW_BF); \ + } while(0) +# define xthal_dcache_block_prefetch_modify_grp(addr, size) do { \ + _XTHAL_DCACHE_BLOCK_UPGRADE(addr, size, XT_DPFM_BF); \ + } while(0) +#else +# define xthal_dcache_block_prefetch_for_write(addr, size) do {/*nothing*/} while(0) +# define xthal_dcache_block_prefetch_modify(addr, size) do {/*nothing*/} while(0) +# define xthal_dcache_block_prefetch_for_write_grp(addr, size) do {/*nothing*/} while(0) +# define xthal_dcache_block_prefetch_modify_grp(addr, size) do {/*nothing*/} while(0) +#endif + +/*************************** INTERRUPTS ***************************/ + +/* + * Macro versions of: + * unsigned xthal_get_intenable( void ); + * void xthal_set_intenable( unsigned ); + * unsigned xthal_get_interrupt( void ); + * void xthal_set_intset( unsigned ); + * void xthal_set_intclear( unsigned ); + * unsigned xthal_get_ccount(void); + * void xthal_set_ccompare(int, unsigned); + * unsigned xthal_get_ccompare(int); + * + * NOTE: for {set,get}_ccompare, the first argument MUST be a decimal constant. + */ + +#if XCHAL_HAVE_INTERRUPTS +# define XTHAL_GET_INTENABLE() ({ int __intenable; \ + __asm__("rsr.intenable %0" : "=a"(__intenable)); \ + __intenable; }) +# define XTHAL_SET_INTENABLE(v) do { int __intenable = (int)(v); \ + __asm__ __volatile__("wsr.intenable %0" :: "a"(__intenable):"memory"); \ + } while(0) +# define XTHAL_GET_INTERRUPT() ({ int __interrupt; \ + __asm__ __volatile__("rsr.interrupt %0" : "=a"(__interrupt)); \ + __interrupt; }) +# define XTHAL_SET_INTSET(v) do { int __interrupt = (int)(v); \ + __asm__ __volatile__("wsr.intset %0" :: "a"(__interrupt):"memory"); \ + } while(0) +# define XTHAL_SET_INTCLEAR(v) do { int __interrupt = (int)(v); \ + __asm__ __volatile__("wsr.intclear %0" :: "a"(__interrupt):"memory"); \ + } while(0) +# define XTHAL_GET_CCOUNT() ({ int __ccount; \ + __asm__ __volatile__("rsr.ccount %0" : "=a"(__ccount)); \ + __ccount; }) +# define XTHAL_SET_CCOUNT(v) do { int __ccount = (int)(v); \ + __asm__ __volatile__("wsr.ccount %0" :: "a"(__ccount):"memory"); \ + } while(0) +# define _XTHAL_GET_CCOMPARE(n) ({ int __ccompare; \ + __asm__("rsr.ccompare" #n " %0" : "=a"(__ccompare)); \ + __ccompare; }) +# define XTHAL_GET_CCOMPARE(n) _XTHAL_GET_CCOMPARE(n) +# define _XTHAL_SET_CCOMPARE(n,v) do { int __ccompare = (int)(v); \ + __asm__ __volatile__("wsr.ccompare" #n " %0 ; esync" :: "a"(__ccompare):"memory"); \ + } while(0) +# define XTHAL_SET_CCOMPARE(n,v) _XTHAL_SET_CCOMPARE(n,v) +#else +# define XTHAL_GET_INTENABLE() 0 +# define XTHAL_SET_INTENABLE(v) do {/*nothing*/} while(0) +# define XTHAL_GET_INTERRUPT() 0 +# define XTHAL_SET_INTSET(v) do {/*nothing*/} while(0) +# define XTHAL_SET_INTCLEAR(v) do {/*nothing*/} while(0) +# define XTHAL_GET_CCOUNT() 0 +# define XTHAL_SET_CCOUNT(v) do {/*nothing*/} while(0) +# define XTHAL_GET_CCOMPARE(n) 0 +# define XTHAL_SET_CCOMPARE(n,v) do {/*nothing*/} while(0) +#endif + +/* New functions added to accomodate XEA3 and allow deprecation of older + functions. For this release they just map to the older ones. */ + +/* Enables the specified interrupt. */ +static inline void xthal_interrupt_enable(unsigned intnum) +{ + xthal_int_enable(1 << intnum); +} + +/* Disables the specified interrupt. */ +static inline void xthal_interrupt_disable(unsigned intnum) +{ + xthal_int_disable(1 << intnum); +} + +/* Triggers the specified interrupt. */ +static inline void xthal_interrupt_trigger(unsigned intnum) +{ + xthal_set_intset(1 << intnum); +} + +/* Clears the specified interrupt. */ +static inline void xthal_interrupt_clear(unsigned intnum) +{ + xthal_set_intclear(1 << intnum); +} + + +/*************************** MISC ***************************/ + +/* + * Macro or inline versions of: + * void xthal_clear_regcached_code( void ); + * unsigned xthal_get_prid( void ); + * unsigned xthal_compare_and_set( int *addr, int testval, int setval ); + */ + +#if XCHAL_HAVE_LOOPS +# define XTHAL_CLEAR_REGCACHED_CODE() \ + __asm__ __volatile__("wsr.lcount %0" :: "a"(0) : "memory") +#else +# define XTHAL_CLEAR_REGCACHED_CODE() do {/*nothing*/} while(0) +#endif + +#if XCHAL_HAVE_PRID +# define XTHAL_GET_PRID() ({ int __prid; \ + __asm__("rsr.prid %0" : "=a"(__prid)); \ + __prid; }) +#else +# define XTHAL_GET_PRID() 0 +#endif + + +static inline unsigned XTHAL_COMPARE_AND_SET( int *addr, int testval, int setval ) +{ + int result; + +#if XCHAL_HAVE_S32C1I && XCHAL_HW_MIN_VERSION_MAJOR >= 2200 + __asm__ __volatile__ ( + " wsr.scompare1 %2 \n" + " s32c1i %0, %3, 0 \n" + : "=a"(result) : "0" (setval), "a" (testval), "a" (addr) + : "memory"); +#elif XCHAL_HAVE_INTERRUPTS + int tmp; + __asm__ __volatile__ ( + " rsil %4, 15 \n" // %4 == saved ps + " l32i %0, %3, 0 \n" // %0 == value to test, return val + " bne %2, %0, 9f \n" // test + " s32i %1, %3, 0 \n" // write the new value + "9: wsr.ps %4 ; rsync \n" // restore the PS + : "=a"(result) + : "0" (setval), "a" (testval), "a" (addr), "a" (tmp) + : "memory"); +#else + __asm__ __volatile__ ( + " l32i %0, %3, 0 \n" // %0 == value to test, return val + " bne %2, %0, 9f \n" // test + " s32i %1, %3, 0 \n" // write the new value + "9: \n" + : "=a"(result) : "0" (setval), "a" (testval), "a" (addr) + : "memory"); +#endif + return result; +} + +#if XCHAL_HAVE_EXTERN_REGS + +static inline unsigned XTHAL_RER (unsigned int reg) +{ + unsigned result; + + __asm__ __volatile__ ( + " rer %0, %1" + : "=a" (result) : "a" (reg) : "memory"); + + return result; +} + +static inline void XTHAL_WER (unsigned reg, unsigned value) +{ + __asm__ __volatile__ ( + " wer %0, %1" + : : "a" (value), "a" (reg) : "memory"); +} + +#endif /* XCHAL_HAVE_EXTERN_REGS */ + +/* + * Sets a single entry at 'index' within the MPU + * + * The caller must ensure that the resulting MPU map is ordered. + */ +static inline void xthal_mpu_set_entry (xthal_MPU_entry entry) +{ +#if XCHAL_HAVE_MPU + __asm__ __volatile__("j 1f\n\t.align 8\n\t1: memw\n\twptlb %0, %1\n\t" : : "a" (entry.at), "a"(entry.as)); +#endif +} + +/* Same as xthal_mpu_set_entry except that this function must not be used to change the MPU entry + * for the currently executing instruction ... use xthal_mpu_set_entry instead. */ +static inline void xthal_mpu_set_entry_ (xthal_MPU_entry entry) +{ +#if XCHAL_HAVE_MPU + __asm__ __volatile__("wptlb %0, %1\n\t" : : "a" (entry.at), "a"(entry.as)); +#endif +} + + + +#endif /* C code */ + +#endif /*XTENSA_CACHE_H*/ + diff --git a/arch/xtensa/include/esp32/xtensa/include/xtensa/coreasm.h b/arch/xtensa/include/esp32/xtensa/include/xtensa/coreasm.h new file mode 100644 index 0000000000000..8df8d6ecde007 --- /dev/null +++ b/arch/xtensa/include/esp32/xtensa/include/xtensa/coreasm.h @@ -0,0 +1,1059 @@ +/* + * xtensa/coreasm.h -- assembler-specific definitions that depend on CORE configuration + * + * Source for configuration-independent binaries (which link in a + * configuration-specific HAL library) must NEVER include this file. + * It is perfectly normal, however, for the HAL itself to include this file. + * + * This file must NOT include xtensa/config/system.h. Any assembler + * header file that depends on system information should likely go + * in a new systemasm.h (or sysasm.h) header file. + * + * NOTE: macro beqi32 is NOT configuration-dependent, and is placed + * here until we have a proper configuration-independent header file. + */ + +/* $Id: //depot/rel/Foxhill/dot.9/Xtensa/OS/include/xtensa/coreasm.h#1 $ */ + +/* + * Copyright (c) 2000-2014 Tensilica Inc. + * + * 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 the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 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. + */ + +#ifndef XTENSA_COREASM_H +#define XTENSA_COREASM_H + +/* + * Tell header files this is assembly source, so they can avoid non-assembler + * definitions (eg. C types etc): + */ +#ifndef _ASMLANGUAGE /* conditionalize to avoid cpp warnings (3rd parties might use same macro) */ +#define _ASMLANGUAGE +#endif + +#include +#include +#include + +/* + * Assembly-language specific definitions (assembly macros, etc.). + */ + +/*---------------------------------------------------------------------- + * find_ms_setbit + * + * This macro finds the most significant bit that is set in + * and return its index + in , or - 1 if is zero. + * The index counts starting at zero for the lsbit, so the return + * value ranges from -1 (no bit set) to +31 (msbit set). + * + * Parameters: + * destination address register (any register) + * source address register + * temporary address register (must be different than ) + * constant value added to result (usually 0 or 1) + * On entry: + * = undefined if different than + * = value whose most significant set bit is to be found + * = undefined + * no other registers are used by this macro. + * On exit: + * = + index of msbit set in original , + * = - 1 if original was zero. + * clobbered (if not ) + * clobbered (if not ) + * Example: + * find_ms_setbit a0, a4, a0, 0 -- return in a0 index of msbit set in a4 + */ + + .macro find_ms_setbit ad, as, at, base +#if XCHAL_HAVE_NSA + movi \at, 31+\base + nsau \as, \as // get index of \as, numbered from msbit (32 if absent) + sub \ad, \at, \as // get numbering from lsbit (0..31, -1 if absent) +#else /* XCHAL_HAVE_NSA */ + movi \at, \base // start with result of 0 (point to lsbit of 32) + + beqz \as, 2f // special case for zero argument: return -1 + bltui \as, 0x10000, 1f // is it one of the 16 lsbits? (if so, check lower 16 bits) + addi \at, \at, 16 // no, increment result to upper 16 bits (of 32) + //srli \as, \as, 16 // check upper half (shift right 16 bits) + extui \as, \as, 16, 16 // check upper half (shift right 16 bits) +1: bltui \as, 0x100, 1f // is it one of the 8 lsbits? (if so, check lower 8 bits) + addi \at, \at, 8 // no, increment result to upper 8 bits (of 16) + srli \as, \as, 8 // shift right to check upper 8 bits +1: bltui \as, 0x10, 1f // is it one of the 4 lsbits? (if so, check lower 4 bits) + addi \at, \at, 4 // no, increment result to upper 4 bits (of 8) + srli \as, \as, 4 // shift right 4 bits to check upper half +1: bltui \as, 0x4, 1f // is it one of the 2 lsbits? (if so, check lower 2 bits) + addi \at, \at, 2 // no, increment result to upper 2 bits (of 4) + srli \as, \as, 2 // shift right 2 bits to check upper half +1: bltui \as, 0x2, 1f // is it the lsbit? + addi \at, \at, 2 // no, increment result to upper bit (of 2) +2: addi \at, \at, -1 // (from just above: add 1; from beqz: return -1) + //srli \as, \as, 1 +1: // done! \at contains index of msbit set (or -1 if none set) + .if 0x\ad - 0x\at // destination different than \at ? (works because regs are a0-a15) + mov \ad, \at // then move result to \ad + .endif +#endif /* XCHAL_HAVE_NSA */ + .endm // find_ms_setbit + +/*---------------------------------------------------------------------- + * find_ls_setbit + * + * This macro finds the least significant bit that is set in , + * and return its index in . + * Usage is the same as for the find_ms_setbit macro. + * Example: + * find_ls_setbit a0, a4, a0, 0 -- return in a0 index of lsbit set in a4 + */ + + .macro find_ls_setbit ad, as, at, base + neg \at, \as // keep only the least-significant bit that is set... + and \as, \at, \as // ... in \as + find_ms_setbit \ad, \as, \at, \base + .endm // find_ls_setbit + +/*---------------------------------------------------------------------- + * find_ls_one + * + * Same as find_ls_setbit with base zero. + * Source (as) and destination (ad) registers must be different. + * Provided for backward compatibility. + */ + + .macro find_ls_one ad, as + find_ls_setbit \ad, \as, \ad, 0 + .endm // find_ls_one + +/*---------------------------------------------------------------------- + * floop, floopnez, floopgtz, floopend + * + * These macros are used for fast inner loops that + * work whether or not the Loops options is configured. + * If the Loops option is configured, they simply use + * the zero-overhead LOOP instructions; otherwise + * they use explicit decrement and branch instructions. + * + * They are used in pairs, with floop, floopnez or floopgtz + * at the beginning of the loop, and floopend at the end. + * + * Each pair of loop macro calls must be given the loop count + * address register and a unique label for that loop. + * + * Example: + * + * movi a3, 16 // loop 16 times + * floop a3, myloop1 + * : + * bnez a7, end1 // exit loop if a7 != 0 + * : + * floopend a3, myloop1 + * end1: + * + * Like the LOOP instructions, these macros cannot be + * nested, must include at least one instruction, + * cannot call functions inside the loop, etc. + * The loop can be exited by jumping to the instruction + * following floopend (or elsewhere outside the loop), + * or continued by jumping to a NOP instruction placed + * immediately before floopend. + * + * Unlike LOOP instructions, the register passed to floop* + * cannot be used inside the loop, because it is used as + * the loop counter if the Loops option is not configured. + * And its value is undefined after exiting the loop. + * And because the loop counter register is active inside + * the loop, you can't easily use this construct to loop + * across a register file using ROTW as you might with LOOP + * instructions, unless you copy the loop register along. + */ + + /* Named label version of the macros: */ + + .macro floop ar, endlabel + floop_ \ar, .Lfloopstart_\endlabel, .Lfloopend_\endlabel + .endm + + .macro floopnez ar, endlabel + floopnez_ \ar, .Lfloopstart_\endlabel, .Lfloopend_\endlabel + .endm + + .macro floopgtz ar, endlabel + floopgtz_ \ar, .Lfloopstart_\endlabel, .Lfloopend_\endlabel + .endm + + .macro floopend ar, endlabel + floopend_ \ar, .Lfloopstart_\endlabel, .Lfloopend_\endlabel + .endm + + /* Numbered local label version of the macros: */ +#if 0 /*UNTESTED*/ + .macro floop89 ar + floop_ \ar, 8, 9f + .endm + + .macro floopnez89 ar + floopnez_ \ar, 8, 9f + .endm + + .macro floopgtz89 ar + floopgtz_ \ar, 8, 9f + .endm + + .macro floopend89 ar + floopend_ \ar, 8b, 9 + .endm +#endif /*0*/ + + /* Underlying version of the macros: */ + + .macro floop_ ar, startlabel, endlabelref + .ifdef _infloop_ + .if _infloop_ + .err // Error: floop cannot be nested + .endif + .endif + .set _infloop_, 1 +#if XCHAL_HAVE_LOOPS + loop \ar, \endlabelref +#else /* XCHAL_HAVE_LOOPS */ +\startlabel: + addi \ar, \ar, -1 +#endif /* XCHAL_HAVE_LOOPS */ + .endm // floop_ + + .macro floopnez_ ar, startlabel, endlabelref + .ifdef _infloop_ + .if _infloop_ + .err // Error: floopnez cannot be nested + .endif + .endif + .set _infloop_, 1 +#if XCHAL_HAVE_LOOPS + loopnez \ar, \endlabelref +#else /* XCHAL_HAVE_LOOPS */ + beqz \ar, \endlabelref +\startlabel: + addi \ar, \ar, -1 +#endif /* XCHAL_HAVE_LOOPS */ + .endm // floopnez_ + + .macro floopgtz_ ar, startlabel, endlabelref + .ifdef _infloop_ + .if _infloop_ + .err // Error: floopgtz cannot be nested + .endif + .endif + .set _infloop_, 1 +#if XCHAL_HAVE_LOOPS + loopgtz \ar, \endlabelref +#else /* XCHAL_HAVE_LOOPS */ + bltz \ar, \endlabelref + beqz \ar, \endlabelref +\startlabel: + addi \ar, \ar, -1 +#endif /* XCHAL_HAVE_LOOPS */ + .endm // floopgtz_ + + + .macro floopend_ ar, startlabelref, endlabel + .ifndef _infloop_ + .err // Error: floopend without matching floopXXX + .endif + .ifeq _infloop_ + .err // Error: floopend without matching floopXXX + .endif + .set _infloop_, 0 +#if ! XCHAL_HAVE_LOOPS + bnez \ar, \startlabelref +#endif /* XCHAL_HAVE_LOOPS */ +\endlabel: + .endm // floopend_ + +/*---------------------------------------------------------------------- + * crsil -- conditional RSIL (read/set interrupt level) + * + * Executes the RSIL instruction if it exists, else just reads PS. + * The RSIL instruction does not exist in the new exception architecture + * if the interrupt option is not selected. + */ + + .macro crsil ar, newlevel +#if XCHAL_HAVE_OLD_EXC_ARCH || XCHAL_HAVE_INTERRUPTS + rsil \ar, \newlevel +#else + rsr.ps \ar +#endif + .endm // crsil + +/*---------------------------------------------------------------------- + * safe_movi_a0 -- move constant into a0 when L32R is not safe + * + * This macro is typically used by interrupt/exception handlers. + * Loads a 32-bit constant in a0, without using any other register, + * and without corrupting the LITBASE register, even when the + * value of the LITBASE register is unknown (eg. when application + * code and interrupt/exception handling code are built independently, + * and thus with independent values of the LITBASE register; + * debug monitors are one example of this). + * + * Worst-case size of resulting code: 17 bytes. + */ + + .macro safe_movi_a0 constant +#if XCHAL_HAVE_ABSOLUTE_LITERALS + /* Contort a PC-relative literal load even though we may be in litbase-relative mode: */ + j 1f + .begin no-transform // ensure what follows is assembled exactly as-is + .align 4 // ensure constant and call0 target ... + .byte 0 // ... are 4-byte aligned (call0 instruction is 3 bytes long) +1: call0 2f // read PC (that follows call0) in a0 + .long \constant // 32-bit constant to load into a0 +2: + .end no-transform + l32i a0, a0, 0 // load constant +#else + movi a0, \constant // no LITBASE, can assume PC-relative L32R +#endif + .endm + + + + +/*---------------------------------------------------------------------- + * window_spill{4,8,12} + * + * These macros spill callers' register windows to the stack. + * They work for both privileged and non-privileged tasks. + * Must be called from a windowed ABI context, eg. within + * a windowed ABI function (ie. valid stack frame, window + * exceptions enabled, not in exception mode, etc). + * + * This macro requires a single invocation of the window_spill_common + * macro in the same assembly unit and section. + * + * Note that using window_spill{4,8,12} macros is more efficient + * than calling a function implemented using window_spill_function, + * because the latter needs extra code to figure out the size of + * the call to the spilling function. + * + * Example usage: + * + * .text + * .align 4 + * .global some_function + * .type some_function,@function + * some_function: + * entry a1, 16 + * : + * : + * + * window_spill4 // Spill windows of some_function's callers; preserves a0..a3 only; + * // to use window_spill{8,12} in this example function we'd have + * // to increase space allocated by the entry instruction, because + * // 16 bytes only allows call4; 32 or 48 bytes (+locals) are needed + * // for call8/window_spill8 or call12/window_spill12 respectively. + * + * : + * + * retw + * + * window_spill_common // instantiates code used by window_spill4 + * + * + * On entry: + * none (if window_spill4) + * stack frame has enough space allocated for call8 (if window_spill8) + * stack frame has enough space allocated for call12 (if window_spill12) + * On exit: + * a4..a15 clobbered (if window_spill4) + * a8..a15 clobbered (if window_spill8) + * a12..a15 clobbered (if window_spill12) + * no caller windows are in live registers + */ + + .macro window_spill4 +#if XCHAL_HAVE_WINDOWED +# if XCHAL_NUM_AREGS == 16 + movi a15, 0 // for 16-register files, no need to call to reach the end +# elif XCHAL_NUM_AREGS == 32 + call4 .L__wdwspill_assist28 // call deep enough to clear out any live callers +# elif XCHAL_NUM_AREGS == 64 + call4 .L__wdwspill_assist60 // call deep enough to clear out any live callers +# endif +#endif + .endm // window_spill4 + + .macro window_spill8 +#if XCHAL_HAVE_WINDOWED +# if XCHAL_NUM_AREGS == 16 + movi a15, 0 // for 16-register files, no need to call to reach the end +# elif XCHAL_NUM_AREGS == 32 + call8 .L__wdwspill_assist24 // call deep enough to clear out any live callers +# elif XCHAL_NUM_AREGS == 64 + call8 .L__wdwspill_assist56 // call deep enough to clear out any live callers +# endif +#endif + .endm // window_spill8 + + .macro window_spill12 +#if XCHAL_HAVE_WINDOWED +# if XCHAL_NUM_AREGS == 16 + movi a15, 0 // for 16-register files, no need to call to reach the end +# elif XCHAL_NUM_AREGS == 32 + call12 .L__wdwspill_assist20 // call deep enough to clear out any live callers +# elif XCHAL_NUM_AREGS == 64 + call12 .L__wdwspill_assist52 // call deep enough to clear out any live callers +# endif +#endif + .endm // window_spill12 + + +/*---------------------------------------------------------------------- + * window_spill_function + * + * This macro outputs a function that will spill its caller's callers' + * register windows to the stack. Eg. it could be used to implement + * a version of xthal_window_spill() that works in non-privileged tasks. + * This works for both privileged and non-privileged tasks. + * + * Typical usage: + * + * .text + * .align 4 + * .global my_spill_function + * .type my_spill_function,@function + * my_spill_function: + * window_spill_function + * + * On entry to resulting function: + * none + * On exit from resulting function: + * none (no caller windows are in live registers) + */ + + .macro window_spill_function +#if XCHAL_HAVE_WINDOWED +# if XCHAL_NUM_AREGS == 32 + entry sp, 48 + bbci.l a0, 31, 1f // branch if called with call4 + bbsi.l a0, 30, 2f // branch if called with call12 + call8 .L__wdwspill_assist16 // called with call8, only need another 8 + retw +1: call12 .L__wdwspill_assist16 // called with call4, only need another 12 + retw +2: call4 .L__wdwspill_assist16 // called with call12, only need another 4 + retw +# elif XCHAL_NUM_AREGS == 64 + entry sp, 48 + bbci.l a0, 31, 1f // branch if called with call4 + bbsi.l a0, 30, 2f // branch if called with call12 + call4 .L__wdwspill_assist52 // called with call8, only need a call4 + retw +1: call8 .L__wdwspill_assist52 // called with call4, only need a call8 + retw +2: call12 .L__wdwspill_assist40 // called with call12, can skip a call12 + retw +# elif XCHAL_NUM_AREGS == 16 + entry sp, 16 + bbci.l a0, 31, 1f // branch if called with call4 + bbsi.l a0, 30, 2f // branch if called with call12 + movi a7, 0 // called with call8 + retw +1: movi a11, 0 // called with call4 +2: retw // if called with call12, everything already spilled + +// movi a15, 0 // trick to spill all but the direct caller +// j 1f +// // The entry instruction is magical in the assembler (gets auto-aligned) +// // so we have to jump to it to avoid falling through the padding. +// // We need entry/retw to know where to return. +//1: entry sp, 16 +// retw +# else +# error "unrecognized address register file size" +# endif + +#endif /* XCHAL_HAVE_WINDOWED */ + window_spill_common + .endm // window_spill_function + +/*---------------------------------------------------------------------- + * window_spill_common + * + * Common code used by any number of invocations of the window_spill## + * and window_spill_function macros. + * + * Must be instantiated exactly once within a given assembly unit, + * within call/j range of and same section as window_spill## + * macro invocations for that assembly unit. + * (Is automatically instantiated by the window_spill_function macro.) + */ + + .macro window_spill_common +#if XCHAL_HAVE_WINDOWED && (XCHAL_NUM_AREGS == 32 || XCHAL_NUM_AREGS == 64) + .ifndef .L__wdwspill_defined +# if XCHAL_NUM_AREGS >= 64 +.L__wdwspill_assist60: + entry sp, 32 + call8 .L__wdwspill_assist52 + retw +.L__wdwspill_assist56: + entry sp, 16 + call4 .L__wdwspill_assist52 + retw +.L__wdwspill_assist52: + entry sp, 48 + call12 .L__wdwspill_assist40 + retw +.L__wdwspill_assist40: + entry sp, 48 + call12 .L__wdwspill_assist28 + retw +# endif +.L__wdwspill_assist28: + entry sp, 48 + call12 .L__wdwspill_assist16 + retw +.L__wdwspill_assist24: + entry sp, 32 + call8 .L__wdwspill_assist16 + retw +.L__wdwspill_assist20: + entry sp, 16 + call4 .L__wdwspill_assist16 + retw +.L__wdwspill_assist16: + entry sp, 16 + movi a15, 0 + retw + .set .L__wdwspill_defined, 1 + .endif +#endif /* XCHAL_HAVE_WINDOWED with 32 or 64 aregs */ + .endm // window_spill_common + +/*---------------------------------------------------------------------- + * beqi32 + * + * macro implements version of beqi for arbitrary 32-bit immediate value + * + * beqi32 ax, ay, imm32, label + * + * Compares value in register ax with imm32 value and jumps to label if + * equal. Clobbers register ay if needed + * + */ + .macro beqi32 ax, ay, imm, label + .ifeq ((\imm-1) & ~7) // 1..8 ? + beqi \ax, \imm, \label + .else + .ifeq (\imm+1) // -1 ? + beqi \ax, \imm, \label + .else + .ifeq (\imm) // 0 ? + beqz \ax, \label + .else + // We could also handle immediates 10,12,16,32,64,128,256 + // but it would be a long macro... + movi \ay, \imm + beq \ax, \ay, \label + .endif + .endif + .endif + .endm // beqi32 + +/*---------------------------------------------------------------------- + * isync_retw_nop + * + * This macro must be invoked immediately after ISYNC if ISYNC + * would otherwise be immediately followed by RETW (or other instruction + * modifying WindowBase or WindowStart), in a context where + * kernel vector mode may be selected, and level-one interrupts + * and window overflows may be enabled, on an XEA1 configuration. + * + * On hardware with erratum "XEA1KWIN" (see for details), + * XEA1 code must have at least one instruction between ISYNC and RETW if + * run in kernel vector mode with interrupts and window overflows enabled. + */ + .macro isync_retw_nop +#if XCHAL_MAYHAVE_ERRATUM_XEA1KWIN + nop +#endif + .endm + +/*---------------------------------------------------------------------- + * isync_return_nop + * + * This macro should be used instead of isync_retw_nop in code that is + * intended to run on both the windowed and call0 ABIs + */ + .macro isync_return_nop +#ifdef __XTENSA_WINDOWED_ABI__ + isync_retw_nop +#endif + .endm + +/*---------------------------------------------------------------------- + * isync_erratum453 + * + * This macro must be invoked at certain points in the code, + * such as in exception and interrupt vectors in particular, + * to work around erratum 453. + */ + .macro isync_erratum453 +#if XCHAL_ERRATUM_453 + isync +#endif + .endm + + +/*---------------------------------------------------------------------- + * readsr + * + * wrapper for 'rsr' that constructs register names that involve levels + * e.g. EPCn etc. Use like so: + * readsr epc XCHAL_DEBUGLEVEL a2 + */ + .macro readsr reg suf ar + rsr.\reg\suf \ar + .endm + +/*---------------------------------------------------------------------- + * writesr + * + * wrapper for 'wsr' that constructs register names that involve levels + * e.g. EPCn etc. Use like so: + * writesr epc XCHAL_DEBUGLEVEL a2 + */ + .macro writesr reg suf ar + wsr.\reg\suf \ar + .endm + +/*---------------------------------------------------------------------- + * xchgsr + * + * wrapper for 'xsr' that constructs register names that involve levels + * e.g. EPCn etc. Use like so: + * xchgsr epc XCHAL_DEBUGLEVEL a2 + */ + .macro xchgsr reg suf ar + xsr.\reg\suf \ar + .endm + +/*---------------------------------------------------------------------- + * INDEX_SR + * + * indexing wrapper for rsr/wsr/xsr that constructs register names from + * the provided base name and the current index. Use like so: + * .set _idx, 0 + * INDEX_SR rsr.ccompare a2 + * + * this yields: rsr.ccompare0 a2 + */ + .macro INDEX_SR instr ar +.ifeq (_idx) + &instr&0 \ar +.endif +.ifeq (_idx-1) + &instr&1 \ar +.endif +.ifeq (_idx-2) + &instr&2 \ar +.endif +.ifeq (_idx-3) + &instr&3 \ar +.endif +.ifeq (_idx-4) + &instr&4 \ar +.endif +.ifeq (_idx-5) + &instr&5 \ar +.endif +.ifeq (_idx-6) + &instr&6 \ar +.endif +.ifeq (_idx-7) + &instr&7 \ar +.endif + .endm + + +/*---------------------------------------------------------------------- + * abs + * + * implements abs on machines that do not have it configured + */ + +#if !XCHAL_HAVE_ABS + .macro abs arr, ars + .ifc \arr, \ars + //src equal dest is less efficient + bgez \arr, 1f + neg \arr, \arr +1: + .else + neg \arr, \ars + movgez \arr, \ars, \ars + .endif + .endm +#endif /* !XCHAL_HAVE_ABS */ + + +/*---------------------------------------------------------------------- + * addx2 + * + * implements addx2 on machines that do not have it configured + * + */ + +#if !XCHAL_HAVE_ADDX + .macro addx2 arr, ars, art + .ifc \arr, \art + .ifc \arr, \ars + // addx2 a, a, a (not common) + .err + .else + add \arr, \ars, \art + add \arr, \ars, \art + .endif + .else + //addx2 a, b, c + //addx2 a, a, b + //addx2 a, b, b + slli \arr, \ars, 1 + add \arr, \arr, \art + .endif + .endm +#endif /* !XCHAL_HAVE_ADDX */ + +/*---------------------------------------------------------------------- + * addx4 + * + * implements addx4 on machines that do not have it configured + * + */ + +#if !XCHAL_HAVE_ADDX + .macro addx4 arr, ars, art + .ifc \arr, \art + .ifc \arr, \ars + // addx4 a, a, a (not common) + .err + .else + //# addx4 a, b, a + add \arr, \ars, \art + add \arr, \ars, \art + add \arr, \ars, \art + add \arr, \ars, \art + .endif + .else + //addx4 a, b, c + //addx4 a, a, b + //addx4 a, b, b + slli \arr, \ars, 2 + add \arr, \arr, \art + .endif + .endm +#endif /* !XCHAL_HAVE_ADDX */ + +/*---------------------------------------------------------------------- + * addx8 + * + * implements addx8 on machines that do not have it configured + * + */ + +#if !XCHAL_HAVE_ADDX + .macro addx8 arr, ars, art + .ifc \arr, \art + .ifc \arr, \ars + //addx8 a, a, a (not common) + .err + .else + //addx8 a, b, a + add \arr, \ars, \art + add \arr, \ars, \art + add \arr, \ars, \art + add \arr, \ars, \art + add \arr, \ars, \art + add \arr, \ars, \art + add \arr, \ars, \art + add \arr, \ars, \art + .endif + .else + //addx8 a, b, c + //addx8 a, a, b + //addx8 a, b, b + slli \arr, \ars, 3 + add \arr, \arr, \art + .endif + .endm +#endif /* !XCHAL_HAVE_ADDX */ + + +/*---------------------------------------------------------------------- + * rfe_rfue + * + * Maps to RFUE on XEA1, and RFE on XEA2. No mapping on XEAX. + */ + +#if XCHAL_HAVE_XEA1 + .macro rfe_rfue + rfue + .endm +#elif XCHAL_HAVE_XEA2 + .macro rfe_rfue + rfe + .endm +#endif + + +/*---------------------------------------------------------------------- + * abi_entry + * + * Generate proper function entry sequence for the current ABI + * (windowed or call0). Takes care of allocating stack space (up to 1kB) + * and saving the return PC, if necessary. The corresponding abi_return + * macro does the corresponding stack deallocation and restoring return PC. + * + * Parameters are: + * + * locsize Number of bytes to allocate on the stack + * for local variables (and for args to pass to + * callees, if any calls are made). Defaults to zero. + * The macro rounds this up to a multiple of 16. + * NOTE: large values are allowed (e.g. up to 1 GB). + * + * callsize Maximum call size made by this function. + * Leave zero (default) for leaf functions, i.e. if + * this function makes no calls to other functions. + * Otherwise must be set to 4, 8, or 12 according + * to whether the "largest" call made is a call[x]4, + * call[x]8, or call[x]12 (for call0 ABI, it makes + * no difference whether this is set to 4, 8 or 12, + * but it must be set to one of these values). + * + * NOTE: It is up to the caller to align the entry point, declare the + * function symbol, make it global, etc. + * + * NOTE: This macro relies on assembler relaxation for large values + * of locsize. It might not work with the no-transform directive. + * NOTE: For the call0 ABI, this macro ensures SP is allocated or + * de-allocated cleanly, i.e. without temporarily allocating too much + * (or allocating negatively!) due to addi relaxation. + * + * NOTE: Generating the proper sequence and register allocation for + * making calls in an ABI independent manner is a separate topic not + * covered by this macro. + * + * NOTE: To access arguments, you can't use a fixed offset from SP. + * The offset depends on the ABI, whether the function is leaf, etc. + * The simplest method is probably to use the .locsz symbol, which + * is set by this macro to the actual number of bytes allocated on + * the stack, in other words, to the offset from SP to the arguments. + * E.g. for a function whose arguments are all 32-bit integers, you + * can get the 7th and 8th arguments (1st and 2nd args stored on stack) + * using: + * l32i a2, sp, .locsz + * l32i a3, sp, .locsz+4 + * (this example works as long as locsize is under L32I's offset limit + * of 1020 minus up to 48 bytes of ABI-specific stack usage; + * otherwise you might first need to do "addi a?, sp, .locsz" + * or similar sequence). + * + * NOTE: For call0 ABI, this macro (and abi_return) may clobber a9 + * (a caller-saved register). + * + * Examples: + * abi_entry + * abi_entry 5 + * abi_entry 22, 8 + * abi_entry 0, 4 + */ + + /* + * Compute .locsz and .callsz without emitting any instructions. + * Used by both abi_entry and abi_return. + * Assumes locsize >= 0. + */ + .macro abi_entry_size locsize=0, callsize=0 +#if XCHAL_HAVE_WINDOWED && !__XTENSA_CALL0_ABI__ + .ifeq \callsize + .set .callsz, 16 + .else + .ifeq \callsize-4 + .set .callsz, 16 + .else + .ifeq \callsize-8 + .set .callsz, 32 + .else + .ifeq \callsize-12 + .set .callsz, 48 + .else + .error "abi_entry: invalid call size \callsize" + .endif + .endif + .endif + .endif + .set .locsz, .callsz + ((\locsize + 15) & -16) +#else + .set .callsz, \callsize + .if .callsz /* if calls, need space for return PC */ + .set .locsz, (\locsize + 4 + 15) & -16 + .else + .set .locsz, (\locsize + 15) & -16 + .endif +#endif + .endm + + .macro abi_entry locsize=0, callsize=0 + .iflt \locsize + .error "abi_entry: invalid negative size of locals (\locsize)" + .endif + abi_entry_size \locsize, \callsize +#if XCHAL_HAVE_WINDOWED && !__XTENSA_CALL0_ABI__ +# define ABI_ENTRY_MINSIZE 3 /* size of abi_entry (no arguments) instructions in bytes */ + .ifgt .locsz - 32760 /* .locsz > 32760 (ENTRY's max range)? */ + /* Funky computation to try to have assembler use addmi efficiently if possible: */ + entry sp, 0x7F00 + (.locsz & 0xF0) + addi a12, sp, - ((.locsz & -0x100) - 0x7F00) + movsp sp, a12 + .else + entry sp, .locsz + .endif +#else +# define ABI_ENTRY_MINSIZE 0 /* size of abi_entry (no arguments) instructions in bytes */ + .if .locsz + .ifle .locsz - 128 /* if locsz <= 128 */ + addi sp, sp, -.locsz + .if .callsz + s32i a0, sp, .locsz - 4 + .endif + .elseif .callsz /* locsz > 128, with calls: */ + movi a9, .locsz - 16 /* note: a9 is caller-saved */ + addi sp, sp, -16 + s32i a0, sp, 12 + sub sp, sp, a9 + .else /* locsz > 128, no calls: */ + movi a9, .locsz + sub sp, sp, a9 + .endif /* end */ + .endif +#endif + .endm + + + +/*---------------------------------------------------------------------- + * abi_return + * + * Generate proper function exit sequence for the current ABI + * (windowed or call0). Takes care of freeing stack space and + * restoring the return PC, if necessary. + * NOTE: This macro MUST be invoked following a corresponding + * abi_entry macro invocation. For call0 ABI in particular, + * all stack and PC restoration are done according to the last + * abi_entry macro invoked before this macro in the assembly file. + * + * Normally this macro takes no arguments. However to allow + * for placing abi_return *before* abi_entry (as must be done + * for some highly optimized assembly), it optionally takes + * exactly the same arguments as abi_entry. + */ + + .macro abi_return locsize=-1, callsize=0 + .ifge \locsize + abi_entry_size \locsize, \callsize + .endif +#if XCHAL_HAVE_WINDOWED && !__XTENSA_CALL0_ABI__ + retw +#else + .if .locsz + .iflt .locsz - 128 /* if locsz < 128 */ + .if .callsz + l32i a0, sp, .locsz - 4 + .endif + addi sp, sp, .locsz + .elseif .callsz /* locsz >= 128, with calls: */ + addi a9, sp, .locsz - 16 + l32i a0, a9, 12 + addi sp, a9, 16 + .else /* locsz >= 128, no calls: */ + movi a9, .locsz + add sp, sp, a9 + .endif /* end */ + .endif + ret +#endif + .endm + + +/* + * HW erratum fixes. + */ + + .macro hw_erratum_487_fix +#if defined XSHAL_ERRATUM_487_FIX + isync +#endif + .endm + +/* + * These macros are internal, subject to change, and should not be used in + * any new code. + */ + +#define _GBL(x) .global x +#define _TYP(x) .type x,@function +#define _ALN(x) .align x +#define _SIZ(x) .size x, . - x +#define _MKEND(x) .purgem endfunc ; .macro endfunc ; _SIZ(x) ; .purgem endfunc ; .macro endfunc ; .endm ; .endm +#define _SYMT(x) _GBL(x); _MKEND(x); _TYP(x); _ALN(4); x: +#define _SYM2(x) _GBL(x); _TYP(x); x: +#define _SYM(x) _GBL(x); _MKEND(x); _ALN(4); x: +.macro endfunc ; .endm + +/* + * the DECLFUNC() macro provides a mechanism for implementing both the + * standard and _nw interface with a single copy of the code. + * + * For Call0 ABI there is one function definition which is labeled with + * both the xthal_..._nw and xthal_... symbols. + * + * For windowed ABI, two compilations are involved (one with the __NW_FUNCTION__ + * symbol defined) resulting in two separate functions (the _nw one without + * the window adjustments). +*/ + +#if defined(__NW_FUNCTION__) +# define DECLFUNC(x) _SYMT(x ## _nw) +#else +# if defined (__XTENSA_CALL0_ABI__) +# define DECLFUNC(x) _SYMT(x); _SYM2(x ## _nw) +# else +# define DECLFUNC(x) _SYMT(x) +# endif +#endif + +#endif /*XTENSA_COREASM_H*/ + diff --git a/arch/xtensa/include/esp32/xtensa/include/xtensa/corebits.h b/arch/xtensa/include/esp32/xtensa/include/xtensa/corebits.h new file mode 100644 index 0000000000000..452aa69d69bcc --- /dev/null +++ b/arch/xtensa/include/esp32/xtensa/include/xtensa/corebits.h @@ -0,0 +1,195 @@ +/* + * xtensa/corebits.h - Xtensa Special Register field positions, masks, values. + * + * (In previous releases, these were defined in specreg.h, a generated file. + * This file is not generated, ie. it is processor configuration independent.) + */ + +/* $Id: //depot/rel/Foxhill/dot.9/Xtensa/OS/include/xtensa/corebits.h#1 $ */ + +/* + * Copyright (c) 2005-2011 Tensilica Inc. + * + * 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 the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 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. + */ + +#ifndef XTENSA_COREBITS_H +#define XTENSA_COREBITS_H + +/* EXCCAUSE register fields: */ +#define EXCCAUSE_EXCCAUSE_SHIFT 0 +#define EXCCAUSE_EXCCAUSE_MASK 0x3F +/* EXCCAUSE register values: */ +/* + * General Exception Causes + * (values of EXCCAUSE special register set by general exceptions, + * which vector to the user, kernel, or double-exception vectors). + */ +#define EXCCAUSE_ILLEGAL 0 /* Illegal Instruction */ +#define EXCCAUSE_SYSCALL 1 /* System Call (SYSCALL instruction) */ +#define EXCCAUSE_INSTR_ERROR 2 /* Instruction Fetch Error */ +# define EXCCAUSE_IFETCHERROR 2 /* (backward compatibility macro, deprecated, avoid) */ +#define EXCCAUSE_LOAD_STORE_ERROR 3 /* Load Store Error */ +# define EXCCAUSE_LOADSTOREERROR 3 /* (backward compatibility macro, deprecated, avoid) */ +#define EXCCAUSE_LEVEL1_INTERRUPT 4 /* Level 1 Interrupt */ +# define EXCCAUSE_LEVEL1INTERRUPT 4 /* (backward compatibility macro, deprecated, avoid) */ +#define EXCCAUSE_ALLOCA 5 /* Stack Extension Assist (MOVSP instruction) for alloca */ +#define EXCCAUSE_DIVIDE_BY_ZERO 6 /* Integer Divide by Zero */ +# define EXCCAUSE_SPECULATION 7 /* Use of Failed Speculative Access (deprecated) */ +#define EXCCAUSE_PC_ERROR 7 /* Next PC Value Illegal */ +#define EXCCAUSE_PRIVILEGED 8 /* Privileged Instruction */ +#define EXCCAUSE_UNALIGNED 9 /* Unaligned Load or Store */ +#define EXCCAUSE_EXTREG_PRIVILEGE 10 /* External Register Privilege Error */ +#define EXCCAUSE_EXCLUSIVE_ERROR 11 /* Load exclusive to unsupported memory type or unaligned address */ +#define EXCCAUSE_INSTR_DATA_ERROR 12 /* PIF Data Error on Instruction Fetch (RB-200x and later) */ +#define EXCCAUSE_LOAD_STORE_DATA_ERROR 13 /* PIF Data Error on Load or Store (RB-200x and later) */ +#define EXCCAUSE_INSTR_ADDR_ERROR 14 /* PIF Address Error on Instruction Fetch (RB-200x and later) */ +#define EXCCAUSE_LOAD_STORE_ADDR_ERROR 15 /* PIF Address Error on Load or Store (RB-200x and later) */ +#define EXCCAUSE_ITLB_MISS 16 /* ITLB Miss (no ITLB entry matches, hw refill also missed) */ +#define EXCCAUSE_ITLB_MULTIHIT 17 /* ITLB Multihit (multiple ITLB entries match) */ +#define EXCCAUSE_INSTR_RING 18 /* Ring Privilege Violation on Instruction Fetch */ +/* Reserved 19 */ /* Size Restriction on IFetch (not implemented) */ +#define EXCCAUSE_INSTR_PROHIBITED 20 /* Cache Attribute does not allow Instruction Fetch */ +/* Reserved 21..23 */ +#define EXCCAUSE_DTLB_MISS 24 /* DTLB Miss (no DTLB entry matches, hw refill also missed) */ +#define EXCCAUSE_DTLB_MULTIHIT 25 /* DTLB Multihit (multiple DTLB entries match) */ +#define EXCCAUSE_LOAD_STORE_RING 26 /* Ring Privilege Violation on Load or Store */ +/* Reserved 27 */ /* Size Restriction on Load/Store (not implemented) */ +#define EXCCAUSE_LOAD_PROHIBITED 28 /* Cache Attribute does not allow Load */ +#define EXCCAUSE_STORE_PROHIBITED 29 /* Cache Attribute does not allow Store */ +/* Reserved 30..31 */ +#define EXCCAUSE_CP_DISABLED(n) (32+(n)) /* Access to Coprocessor 'n' when disabled */ +#define EXCCAUSE_CP0_DISABLED 32 /* Access to Coprocessor 0 when disabled */ +#define EXCCAUSE_CP1_DISABLED 33 /* Access to Coprocessor 1 when disabled */ +#define EXCCAUSE_CP2_DISABLED 34 /* Access to Coprocessor 2 when disabled */ +#define EXCCAUSE_CP3_DISABLED 35 /* Access to Coprocessor 3 when disabled */ +#define EXCCAUSE_CP4_DISABLED 36 /* Access to Coprocessor 4 when disabled */ +#define EXCCAUSE_CP5_DISABLED 37 /* Access to Coprocessor 5 when disabled */ +#define EXCCAUSE_CP6_DISABLED 38 /* Access to Coprocessor 6 when disabled */ +#define EXCCAUSE_CP7_DISABLED 39 /* Access to Coprocessor 7 when disabled */ +/* Reserved 40..63 */ + +/* PS register fields: */ +#define PS_WOE_SHIFT 18 +#define PS_WOE_MASK 0x00040000 +#define PS_WOE PS_WOE_MASK +#define PS_CALLINC_SHIFT 16 +#define PS_CALLINC_MASK 0x00030000 +#define PS_CALLINC(n) (((n)&3)<4) 0 2 or >3 (TBD) + * T1030.0 0 1 (HAL beta) + * T1030.{1,2} 0 3 Equivalent to first release. + * T1030.n (n>=3) 0 >= 3 (TBD) + * T1040.n 1040 n Full CHAL available from T1040.2 + * T1050.n 1050 n . + * 6.0.n 6000 n Xtensa Tools v6 (RA-200x.n) + * 7.0.n 7000 n Xtensa Tools v7 (RB-200x.n) + * 7.1.n 7010 n Xtensa Tools v7.1 (RB-200x.(n+2)) + * 8.0.n 8000 n Xtensa Tools v8 (RC-20xx.n) + * 9.0.n 9000 n Xtensa Tools v9 (RD-201x.n) + * 10.0.n 10000 n Xtensa Tools v10 (RE-201x.n) + * + * + * Note: there is a distinction between the software version with + * which something is compiled (accessible using XTHAL_RELEASE_* macros) + * and the software version with which the HAL library was compiled + * (accessible using Xthal_release_* global variables). This + * distinction is particularly relevant for vendors that distribute + * configuration-independent binaries (eg. an OS), where their customer + * might link it with a HAL of a different Xtensa software version. + * In this case, it may be appropriate for the OS to verify at run-time + * whether XTHAL_RELEASE_* and Xthal_release_* are compatible. + * [Guidelines as to which version is compatible with which are not + * currently provided explicitly, but might be inferred from reading + * OSKit documentation for all releases -- compatibility is also highly + * dependent on which HAL features are used. Each version is usually + * backward compatible, with very few exceptions if any.] + */ + +/* Version comparison operators (among major/minor pairs): */ +#define XTHAL_REL_GE(maja,mina, majb,minb) ((maja) > (majb) || \ + ((maja) == (majb) && (mina) >= (minb))) +#define XTHAL_REL_GT(maja,mina, majb,minb) ((maja) > (majb) || \ + ((maja) == (majb) && (mina) > (minb))) +#define XTHAL_REL_LE(maja,mina, majb,minb) ((maja) < (majb) || \ + ((maja) == (majb) && (mina) <= (minb))) +#define XTHAL_REL_LT(maja,mina, majb,minb) ((maja) < (majb) || \ + ((maja) == (majb) && (mina) < (minb))) +#define XTHAL_REL_EQ(maja,mina, majb,minb) ((maja) == (majb) && (mina) == (minb)) + +/* Fuzzy (3-way) logic operators: */ +#define XTHAL_MAYBE -1 /* 0=NO, 1=YES, -1=MAYBE */ +#define XTHAL_FUZZY_AND(a,b) (((a)==0 || (b)==0) ? 0 : ((a)==1 && (b)==1) ? 1 : XTHAL_MAYBE) +#define XTHAL_FUZZY_OR(a,b) (((a)==1 || (b)==1) ? 1 : ((a)==0 && (b)==0) ? 0 : XTHAL_MAYBE) +#define XTHAL_FUZZY_NOT(a) (((a)==0 || (a)==1) ? (1-(a)) : XTHAL_MAYBE) + + +/* + * Architectural limit, independent of configuration: + */ +#define XTHAL_MAX_CPS 8 /* max number of coprocessors (0..7) */ + +/* Misc: */ +#define XTHAL_LITTLEENDIAN 0 +#define XTHAL_BIGENDIAN 1 + + + +#if !defined(_ASMLANGUAGE) && !defined(_NOCLANGUAGE) && !defined(__ASSEMBLER__) +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +/*---------------------------------------------------------------------- + HAL + ----------------------------------------------------------------------*/ + +/* Constant to be checked in build = (XTHAL_MAJOR_REV<<16)|XTHAL_MINOR_REV */ +extern const unsigned int Xthal_rev_no; + + +/*---------------------------------------------------------------------- + Optional/Custom Processor State + ----------------------------------------------------------------------*/ + +/* save & restore the extra processor state */ +extern void xthal_save_extra(void *base); +extern void xthal_restore_extra(void *base); + +extern void xthal_save_cpregs(void *base, int); +extern void xthal_restore_cpregs(void *base, int); +/* versions specific to each coprocessor id */ +extern void xthal_save_cp0(void *base); +extern void xthal_save_cp1(void *base); +extern void xthal_save_cp2(void *base); +extern void xthal_save_cp3(void *base); +extern void xthal_save_cp4(void *base); +extern void xthal_save_cp5(void *base); +extern void xthal_save_cp6(void *base); +extern void xthal_save_cp7(void *base); +extern void xthal_restore_cp0(void *base); +extern void xthal_restore_cp1(void *base); +extern void xthal_restore_cp2(void *base); +extern void xthal_restore_cp3(void *base); +extern void xthal_restore_cp4(void *base); +extern void xthal_restore_cp5(void *base); +extern void xthal_restore_cp6(void *base); +extern void xthal_restore_cp7(void *base); +/* pointers to each of the functions above */ +extern void* Xthal_cpregs_save_fn[XTHAL_MAX_CPS]; +extern void* Xthal_cpregs_restore_fn[XTHAL_MAX_CPS]; +/* similarly for non-windowed ABI (may be same or different) */ +extern void* Xthal_cpregs_save_nw_fn[XTHAL_MAX_CPS]; +extern void* Xthal_cpregs_restore_nw_fn[XTHAL_MAX_CPS]; + +/*extern void xthal_save_all_extra(void *base);*/ +/*extern void xthal_restore_all_extra(void *base);*/ + +/* space for processor state */ +extern const unsigned int Xthal_extra_size; +extern const unsigned int Xthal_extra_align; +extern const unsigned int Xthal_cpregs_size[XTHAL_MAX_CPS]; +extern const unsigned int Xthal_cpregs_align[XTHAL_MAX_CPS]; +extern const unsigned int Xthal_all_extra_size; +extern const unsigned int Xthal_all_extra_align; +/* coprocessor names */ +extern const char * const Xthal_cp_names[XTHAL_MAX_CPS]; + +/* initialize the extra processor */ +/*extern void xthal_init_extra(void);*/ +/* initialize the TIE coprocessor */ +/*extern void xthal_init_cp(int);*/ + +/* initialize the extra processor */ +extern void xthal_init_mem_extra(void *); +/* initialize the TIE coprocessor */ +extern void xthal_init_mem_cp(void *, int); + +/* the number of TIE coprocessors contiguous from zero (for Tor2) */ +extern const unsigned int Xthal_num_coprocessors; + +/* actual number of coprocessors */ +extern const unsigned char Xthal_cp_num; +/* index of highest numbered coprocessor, plus one */ +extern const unsigned char Xthal_cp_max; +/* index of highest allowed coprocessor number, per cfg, plus one */ +/*extern const unsigned char Xthal_cp_maxcfg;*/ +/* bitmask of which coprocessors are present */ +extern const unsigned int Xthal_cp_mask; + +/* read & write extra state register */ +/*extern int xthal_read_extra(void *base, unsigned reg, unsigned *value);*/ +/*extern int xthal_write_extra(void *base, unsigned reg, unsigned value);*/ + +/* read & write a TIE coprocessor register */ +/*extern int xthal_read_cpreg(void *base, int cp, unsigned reg, unsigned *value);*/ +/*extern int xthal_write_cpreg(void *base, int cp, unsigned reg, unsigned value);*/ + +/* return coprocessor number based on register */ +/*extern int xthal_which_cp(unsigned reg);*/ + + +/*---------------------------------------------------------------------- + Register Windows + ----------------------------------------------------------------------*/ + +/* number of registers in register window */ +extern const unsigned int Xthal_num_aregs; +extern const unsigned char Xthal_num_aregs_log2; + + +/*---------------------------------------------------------------------- + Cache + ----------------------------------------------------------------------*/ + +/* size of the cache lines in log2(bytes) */ +extern const unsigned char Xthal_icache_linewidth; +extern const unsigned char Xthal_dcache_linewidth; +/* size of the cache lines in bytes (2^linewidth) */ +extern const unsigned short Xthal_icache_linesize; +extern const unsigned short Xthal_dcache_linesize; + +/* size of the caches in bytes (ways * 2^(linewidth + setwidth)) */ +extern const unsigned int Xthal_icache_size; +extern const unsigned int Xthal_dcache_size; +/* cache features */ +extern const unsigned char Xthal_dcache_is_writeback; + +/* cache region operations*/ +extern void xthal_icache_region_invalidate( void *addr, unsigned size ); +extern void xthal_dcache_region_invalidate( void *addr, unsigned size ); +extern void xthal_dcache_region_writeback( void *addr, unsigned size ); +extern void xthal_dcache_region_writeback_inv( void *addr, unsigned size ); + +#ifndef XTHAL_USE_CACHE_MACROS +/* cache line operations*/ +extern void xthal_icache_line_invalidate(void *addr); +extern void xthal_dcache_line_invalidate(void *addr); +extern void xthal_dcache_line_writeback(void *addr); +extern void xthal_dcache_line_writeback_inv(void *addr); +/* sync icache and memory */ +extern void xthal_icache_sync( void ); +/* sync dcache and memory */ +extern void xthal_dcache_sync( void ); +#endif + +/* get/set number of icache ways enabled */ +extern unsigned int xthal_icache_get_ways(void); +extern void xthal_icache_set_ways(unsigned int ways); +/* get/set number of dcache ways enabled */ +extern unsigned int xthal_dcache_get_ways(void); +extern void xthal_dcache_set_ways(unsigned int ways); + +/* coherency (low-level -- not normally called directly) */ +extern void xthal_cache_coherence_on( void ); +extern void xthal_cache_coherence_off( void ); +/* coherency (high-level) */ +extern void xthal_cache_coherence_optin( void ); +extern void xthal_cache_coherence_optout( void ); + +/* + * Cache prefetch control. + * The parameter to xthal_set_cache_prefetch() contains both + * a PREFCTL register value and a mask of which bits to actually modify. + * This allows easily combining field macros (below) by ORing, + * leaving unspecified fields unmodified. + * + * For backward compatibility with the older version of this routine + * (that took 15-bit value and mask in a 32-bit parameter, for pre-RF + * cores with only the lower 15 bits of PREFCTL defined), the 32-bit + * value and mask are staggered as follows in a 64-bit parameter: + * param[63:48] are PREFCTL[31:16] if param[31] is set + * param[47:32] are mask[31:16] if param[31] is set + * param[31] is set if mask is used, 0 if not + * param[31:16] are mask[15:0] if param[31] is set + * param[31:16] are PREFCTL[31:16] if param[31] is clear + * param[15:0] are PREFCTL[15:0] + * + * Limitation: PREFCTL register bit 31 cannot be set without masking, + * and bit 15 must always be set when using masking, so it is hoped that + * these two bits will remain reserved, read-as-zero in PREFCTL. + */ +#define XTHAL_PREFETCH_ENABLE -1 /* enable inst+data prefetch */ +#define XTHAL_PREFETCH_DISABLE 0xFFFF0000 /* disab inst+data prefetch*/ +#define XTHAL_DCACHE_PREFETCH(n) (0x800F0000+((n)&0xF)) /* data-side */ +#define XTHAL_DCACHE_PREFETCH_OFF XTHAL_DCACHE_PREFETCH(0) /* disable */ +#define XTHAL_DCACHE_PREFETCH_LOW XTHAL_DCACHE_PREFETCH(4) /* less aggr.*/ +#define XTHAL_DCACHE_PREFETCH_MEDIUM XTHAL_DCACHE_PREFETCH(5) /* mid aggr. */ +#define XTHAL_DCACHE_PREFETCH_HIGH XTHAL_DCACHE_PREFETCH(8) /* more aggr.*/ +#define XTHAL_DCACHE_PREFETCH_L1_OFF 0x90000000 /* to prefetch buffers*/ +#define XTHAL_DCACHE_PREFETCH_L1 0x90001000 /* direct to L1 dcache*/ +#define XTHAL_ICACHE_PREFETCH(n) (0x80F00000+(((n)&0xF)<<4)) /* i-side */ +#define XTHAL_ICACHE_PREFETCH_OFF XTHAL_ICACHE_PREFETCH(0) /* disable */ +#define XTHAL_ICACHE_PREFETCH_LOW XTHAL_ICACHE_PREFETCH(4) /* less aggr.*/ +#define XTHAL_ICACHE_PREFETCH_MEDIUM XTHAL_ICACHE_PREFETCH(5) /* mid aggr. */ +#define XTHAL_ICACHE_PREFETCH_HIGH XTHAL_ICACHE_PREFETCH(8) /* more aggr.*/ +#define XTHAL_ICACHE_PREFETCH_L1_OFF 0xA0000000 /* (not implemented) */ +#define XTHAL_ICACHE_PREFETCH_L1 0xA0002000 /* (not implemented) */ +#define _XTHAL_PREFETCH_BLOCKS(n) ((n)<0?0:(n)<5?(n):(n)<15?((n)>>1)+2:9) +#define XTHAL_PREFETCH_BLOCKS(n) (0x0000000F80000000ULL + \ + (((unsigned long long)_XTHAL_PREFETCH_BLOCKS(n))<<48)) + +extern int xthal_get_cache_prefetch( void ); +extern int xthal_set_cache_prefetch( int ); +extern int xthal_set_cache_prefetch_long( unsigned long long ); +/* Only use the new extended function from now on: */ +#define xthal_set_cache_prefetch xthal_set_cache_prefetch_long +#define xthal_set_cache_prefetch_nw xthal_set_cache_prefetch_long_nw + + +/*---------------------------------------------------------------------- + Debug + ----------------------------------------------------------------------*/ + +/* 1 if debug option configured, 0 if not: */ +extern const int Xthal_debug_configured; + +/* Set (plant) and remove software breakpoint, both synchronizing cache: */ +extern unsigned int xthal_set_soft_break(void *addr); +extern void xthal_remove_soft_break(void *addr, unsigned int); + + +/*---------------------------------------------------------------------- + Disassembler + ----------------------------------------------------------------------*/ + +/* Max expected size of the return buffer for a disassembled instruction (hint only): */ +#define XTHAL_DISASM_BUFSIZE 80 + +/* Disassembly option bits for selecting what to return: */ +#define XTHAL_DISASM_OPT_ADDR 0x0001 /* display address */ +#define XTHAL_DISASM_OPT_OPHEX 0x0002 /* display opcode bytes in hex */ +#define XTHAL_DISASM_OPT_OPCODE 0x0004 /* display opcode name (mnemonic) */ +#define XTHAL_DISASM_OPT_PARMS 0x0008 /* display parameters */ +#define XTHAL_DISASM_OPT_ALL 0x0FFF /* display everything */ + +/* routine to get a string for the disassembled instruction */ +extern int xthal_disassemble( unsigned char *instr_buf, void *tgt_addr, + char *buffer, unsigned buflen, unsigned options ); + +/* routine to get the size of the next instruction. Returns 0 for + illegal instruction */ +extern int xthal_disassemble_size( unsigned char *instr_buf ); + + +/*---------------------------------------------------------------------- + Instruction/Data RAM/ROM Access + ----------------------------------------------------------------------*/ + +extern void* xthal_memcpy(void *dst, const void *src, unsigned len); +extern void* xthal_bcopy(const void *src, void *dst, unsigned len); + + +/*---------------------------------------------------------------------- + MP Synchronization + ----------------------------------------------------------------------*/ + +extern int xthal_compare_and_set( int *addr, int test_val, int compare_val ); + +/*extern const char Xthal_have_s32c1i;*/ + + +/*---------------------------------------------------------------------- + Miscellaneous + ----------------------------------------------------------------------*/ + +extern const unsigned int Xthal_release_major; +extern const unsigned int Xthal_release_minor; +extern const char * const Xthal_release_name; +extern const char * const Xthal_release_internal; + +extern const unsigned char Xthal_memory_order; +extern const unsigned char Xthal_have_windowed; +extern const unsigned char Xthal_have_density; +extern const unsigned char Xthal_have_booleans; +extern const unsigned char Xthal_have_loops; +extern const unsigned char Xthal_have_nsa; +extern const unsigned char Xthal_have_minmax; +extern const unsigned char Xthal_have_sext; +extern const unsigned char Xthal_have_clamps; +extern const unsigned char Xthal_have_mac16; +extern const unsigned char Xthal_have_mul16; +extern const unsigned char Xthal_have_fp; +extern const unsigned char Xthal_have_speculation; +extern const unsigned char Xthal_have_threadptr; + +extern const unsigned char Xthal_have_pif; +extern const unsigned short Xthal_num_writebuffer_entries; + +extern const unsigned int Xthal_build_unique_id; +/* Version info for hardware targeted by software upgrades: */ +extern const unsigned int Xthal_hw_configid0; +extern const unsigned int Xthal_hw_configid1; +extern const unsigned int Xthal_hw_release_major; +extern const unsigned int Xthal_hw_release_minor; +extern const char * const Xthal_hw_release_name; +extern const char * const Xthal_hw_release_internal; + +/* Clear any remnant code-dependent state (i.e. clear loop count regs). */ +extern void xthal_clear_regcached_code( void ); + +#ifdef __cplusplus +} +#endif +#endif /*!_ASMLANGUAGE && !_NOCLANGUAGE && !__ASSEMBLER__ */ + + + + + +/**************************************************************************** + Definitions Useful for PRIVILEGED (Supervisory or Non-Virtualized) Code + ****************************************************************************/ + + +#ifndef XTENSA_HAL_NON_PRIVILEGED_ONLY + +/*---------------------------------------------------------------------- + Constant Definitions (shared with assembly) + ----------------------------------------------------------------------*/ + +/* + * Architectural limits, independent of configuration. + * Note that these are ISA-defined limits, not micro-architecture implementation + * limits enforced by the Xtensa Processor Generator (which may be stricter than + * these below). + */ +#define XTHAL_MAX_INTERRUPTS 32 /* max number of interrupts (0..31) */ +#define XTHAL_MAX_INTLEVELS 16 /* max number of interrupt levels (0..15) */ + /* (as of T1040, implementation limit is 7: 0..6) */ +#define XTHAL_MAX_TIMERS 4 /* max number of timers (CCOMPARE0..CCOMPARE3) */ + /* (as of T1040, implementation limit is 3: 0..2) */ + +/* Interrupt types: */ +#define XTHAL_INTTYPE_UNCONFIGURED 0 +#define XTHAL_INTTYPE_SOFTWARE 1 +#define XTHAL_INTTYPE_EXTERN_EDGE 2 +#define XTHAL_INTTYPE_EXTERN_LEVEL 3 +#define XTHAL_INTTYPE_TIMER 4 +#define XTHAL_INTTYPE_NMI 5 +#define XTHAL_INTTYPE_WRITE_ERROR 6 +#define XTHAL_INTTYPE_PROFILING 7 +#define XTHAL_INTTYPE_IDMA_DONE 8 +#define XTHAL_INTTYPE_IDMA_ERR 9 +#define XTHAL_INTTYPE_GS_ERR 10 +#define XTHAL_INTTYPE_SG_ERR 10 /* backward compatibility name - deprecated */ +#define XTHAL_MAX_INTTYPES 11 /* number of interrupt types */ + +/* Timer related: */ +#define XTHAL_TIMER_UNCONFIGURED -1 /* Xthal_timer_interrupt[] value for non-existent timers */ +#define XTHAL_TIMER_UNASSIGNED XTHAL_TIMER_UNCONFIGURED /* (for backwards compatibility only) */ + +/* Local Memory ECC/Parity: */ +#define XTHAL_MEMEP_PARITY 1 +#define XTHAL_MEMEP_ECC 2 +/* Flags parameter to xthal_memep_inject_error(): */ +#define XTHAL_MEMEP_F_LOCAL 0 /* local memory (default) */ +#define XTHAL_MEMEP_F_DCACHE_DATA 4 /* data cache data */ +#define XTHAL_MEMEP_F_DCACHE_TAG 5 /* data cache tag */ +#define XTHAL_MEMEP_F_ICACHE_DATA 6 /* instruction cache data */ +#define XTHAL_MEMEP_F_ICACHE_TAG 7 /* instruction cache tag */ +#define XTHAL_MEMEP_F_CORRECTABLE 16 /* inject correctable error + (default is non-corr.) */ + + +/* Access Mode bits (tentative): */ /* bit abbr unit short_name PPC equ - Description */ +#define XTHAL_AMB_EXCEPTION 0 /* 001 E EX fls: EXception none + exception on any access (aka "illegal") */ +#define XTHAL_AMB_HITCACHE 1 /* 002 C CH fls: use Cache on Hit ~(I CI) + [or H HC] way from tag match; + [or U UC] (ISA: same except Isolate case) */ +#define XTHAL_AMB_ALLOCATE 2 /* 004 A AL fl?: ALlocate none + [or F FI fill] refill cache on miss, way from LRU + (ISA: Read/Write Miss Refill) */ +#define XTHAL_AMB_WRITETHRU 3 /* 008 W WT --s: WriteThrough W WT + store immediately to memory (ISA: same) */ +#define XTHAL_AMB_ISOLATE 4 /* 010 I IS fls: ISolate none + use cache regardless of hit-vs-miss, + way from vaddr (ISA: use-cache-on-miss+hit) */ +#define XTHAL_AMB_GUARD 5 /* 020 G GU ?l?: GUard G * + non-speculative; spec/replay refs not permitted */ +#define XTHAL_AMB_COHERENT 6 /* 040 M MC ?ls: Mem/MP Coherent M + on read, other CPU/bus-master may need to supply data; + on write, maybe redirect to or flush other CPU dirty line; etc */ +#if 0 +#define XTHAL_AMB_BUFFERABLE x /* 000 B BU --s: BUfferable ? + write response may return earlier than from final destination */ +#define XTHAL_AMB_ORDERED x /* 000 O OR fls: ORdered G * + mem accesses cannot be out of order */ +#define XTHAL_AMB_FUSEWRITES x /* 000 F FW --s: FuseWrites none + allow combining/merging/coalescing multiple writes + (to same datapath data unit) into one + (implied by writeback) */ +#define XTHAL_AMB_TRUSTED x /* 000 T TR ?l?: TRusted none + memory will not bus error (if it does, + handle as fatal imprecise interrupt) */ +#define XTHAL_AMB_PREFETCH x /* 000 P PR fl?: PRefetch none + on refill, read line+1 into prefetch buffers */ +#define XTHAL_AMB_STREAM x /* 000 S ST ???: STreaming none + access one of N stream buffers */ +#endif /*0*/ + +#define XTHAL_AM_EXCEPTION (1< = bit is set + * '-' = bit is clear + * '.' = bit is irrelevant / don't care, as follows: + * E=1 makes all others irrelevant + * W,F relevant only for stores + * "2345" + * Indicates which Xtensa releases support the corresponding + * access mode. Releases for each character column are: + * 2 = prior to T1020.2: T1015 (V1.5), T1020.0, T1020.1 + * 3 = T1020.2 and later: T1020.2+, T1030 + * 4 = T1040 + * 5 = T1050 (maybe), LX1, LX2, LX2.1 + * 7 = LX2.2 + * 8 = LX3, LX4 + * 9 = LX5 + * And the character column contents are: + * = supported by release(s) + * "." = unsupported by release(s) + * "?" = support unknown + */ + /* foMGIWACE 2345789 */ +/* For instruction fetch: */ +#define XTHAL_FAM_EXCEPTION 0x001 /* ........E 2345789 exception */ +/*efine XTHAL_FAM_ISOLATE*/ /*0x012*/ /* .---I.-C- ....... isolate */ +#define XTHAL_FAM_BYPASS 0x000 /* .----.--- 2345789 bypass */ +/*efine XTHAL_FAM_NACACHED*/ /*0x002*/ /* .----.-C- ....... cached no-allocate (frozen) */ +#define XTHAL_FAM_CACHED 0x006 /* .----.AC- 2345789 cached */ +/* For data load: */ +#define XTHAL_LAM_EXCEPTION 0x001 /* ........E 2345789 exception */ +#define XTHAL_LAM_ISOLATE 0x012 /* .---I.-C- 2345789 isolate */ +#define XTHAL_LAM_BYPASS 0x000 /* .O---.--- 2...... bypass speculative */ +#define XTHAL_LAM_BYPASSG 0x020 /* .O-G-.--- .345789 bypass guarded */ +#define XTHAL_LAM_CACHED_NOALLOC 0x002 /* .O---.-C- 2345789 cached no-allocate speculative */ +#define XTHAL_LAM_NACACHED XTHAL_LAM_CACHED_NOALLOC +#define XTHAL_LAM_NACACHEDG 0x022 /* .O-G-.-C- .?..... cached no-allocate guarded */ +#define XTHAL_LAM_CACHED 0x006 /* .----.AC- 2345789 cached speculative */ +#define XTHAL_LAM_COHCACHED 0x046 /* .-M--.AC- ....*89 cached speculative MP-coherent */ +/* For data store: */ +#define XTHAL_SAM_EXCEPTION 0x001 /* ........E 2345789 exception */ +#define XTHAL_SAM_ISOLATE 0x032 /* .--GI--C- 2345789 isolate */ +#define XTHAL_SAM_BYPASS 0x028 /* -O-G-W--- 2345789 bypass */ +#define XTHAL_SAM_WRITETHRU 0x02A /* -O-G-W-C- 2345789 writethrough */ +/*efine XTHAL_SAM_WRITETHRU_ALLOC*/ /*0x02E*/ /* -O-G-WAC- ....... writethrough allocate */ +#define XTHAL_SAM_WRITEBACK 0x026 /* F--G--AC- ...5789 writeback */ +#define XTHAL_SAM_WRITEBACK_NOALLOC 0x022 /* ?--G---C- .....89 writeback no-allocate */ +#define XTHAL_SAM_COHWRITEBACK 0x066 /* F-MG--AC- ....*89 writeback MP-coherent */ +/* For PIF attributes: */ /* -PIwrWCBUUUU ...9 */ +#define XTHAL_PAM_BYPASS 0x000 /* xxx00000xxxx ...9 bypass non-bufferable */ +#define XTHAL_PAM_BYPASS_BUF 0x010 /* xxx0000bxxxx ...9 bypass */ +#define XTHAL_PAM_CACHED_NOALLOC 0x030 /* xxx0001bxxxx ...9 cached no-allocate */ +#define XTHAL_PAM_WRITETHRU 0x0B0 /* xxx0101bxxxx ...9 writethrough (WT) */ +#define XTHAL_PAM_WRITEBACK_NOALLOC 0x0F0 /* xxx0111bxxxx ...9 writeback no-alloc (WBNA) */ +#define XTHAL_PAM_WRITEBACK 0x1F0 /* xxx1111bxxxx ...9 writeback (WB) */ +/*efine XTHAL_PAM_NORMAL*/ /*0x050*/ /* xxx0010bxxxx .... (unimplemented) */ +/*efine XTHAL_PAM_WRITETHRU_WA*/ /*0x130*/ /* xxx1001bxxxx .... (unimplemented, less likely) */ +/*efine XTHAL_PAM_WRITETHRU_RWA*/ /*0x1B0*/ /* xxx1101bxxxx .... (unimplemented, less likely) */ +/*efine XTHAL_PAM_WRITEBACK_WA*/ /*0x170*/ /* xxx1011bxxxx .... (unimplemented, less likely) */ + + +#if 0 +/* + Cache attribute encoding for CACHEATTR (per ISA): + (Note: if this differs from ISA Ref Manual, ISA has precedence) + + Inst-fetches Loads Stores + ------------- ------------ ------------- +0x0 FCA_EXCEPTION LCA_NACACHED SCA_WRITETHRU cached no-allocate (previously misnamed "uncached") +0x1 FCA_CACHED LCA_CACHED SCA_WRITETHRU cached +0x2 FCA_BYPASS LCA_BYPASS_G* SCA_BYPASS bypass cache (what most people call uncached) +0x3 FCA_CACHED LCA_CACHED SCA_WRITEALLOCF write-allocate + or LCA_EXCEPTION SCA_EXCEPTION (if unimplemented) +0x4 FCA_CACHED LCA_CACHED SCA_WRITEBACK[M] write-back [MP-coherent] + or LCA_EXCEPTION SCA_EXCEPTION (if unimplemented) +0x5 FCA_CACHED LCA_CACHED SCA_WRITEBACK_NOALLOC write-back no-allocate + or FCA_EXCEPTION LCA_EXCEPTION SCA_EXCEPTION (if unimplemented) +0x6..D FCA_EXCEPTION LCA_EXCEPTION SCA_EXCEPTION (reserved) +0xE FCA_EXCEPTION LCA_ISOLATE SCA_ISOLATE isolate +0xF FCA_EXCEPTION LCA_EXCEPTION SCA_EXCEPTION illegal + * Prior to T1020.2?, guard feature not supported, this defaulted to speculative (no _G) +*/ +#endif /*0*/ + + +#if !defined(_ASMLANGUAGE) && !defined(_NOCLANGUAGE) && !defined(__ASSEMBLER__) +#ifdef __cplusplus +extern "C" { +#endif + + +/*---------------------------------------------------------------------- + Register Windows + ----------------------------------------------------------------------*/ + +/* This spill any live register windows (other than the caller's): + * (NOTE: current implementation require privileged code, but + * a user-callable implementation is possible.) */ +extern void xthal_window_spill( void ); + + +/*---------------------------------------------------------------------- + Optional/Custom Processor State + ----------------------------------------------------------------------*/ + +/* validate & invalidate the TIE register file */ +extern void xthal_validate_cp(int); +extern void xthal_invalidate_cp(int); + +/* read and write cpenable register */ +extern void xthal_set_cpenable(unsigned); +extern unsigned xthal_get_cpenable(void); + + +/*---------------------------------------------------------------------- + Interrupts + ----------------------------------------------------------------------*/ + +/* the number of interrupt levels */ +extern const unsigned char Xthal_num_intlevels; +/* the number of interrupts */ +extern const unsigned char Xthal_num_interrupts; +/* the highest level of interrupts masked by PS.EXCM */ +extern const unsigned char Xthal_excm_level; + +/* mask for level of interrupts */ +extern const unsigned int Xthal_intlevel_mask[XTHAL_MAX_INTLEVELS]; +/* mask for level 0 to N interrupts */ +extern const unsigned int Xthal_intlevel_andbelow_mask[XTHAL_MAX_INTLEVELS]; + +/* level of each interrupt */ +extern const unsigned char Xthal_intlevel[XTHAL_MAX_INTERRUPTS]; + +/* type per interrupt */ +extern const unsigned char Xthal_inttype[XTHAL_MAX_INTERRUPTS]; + +/* masks of each type of interrupt */ +extern const unsigned int Xthal_inttype_mask[XTHAL_MAX_INTTYPES]; + +/* interrupt numbers assigned to each timer interrupt */ +extern const int Xthal_timer_interrupt[XTHAL_MAX_TIMERS]; + +/* INTENABLE,INTERRUPT,INTSET,INTCLEAR register access functions: */ +extern unsigned xthal_get_intenable( void ); +extern void xthal_set_intenable( unsigned ); +extern unsigned xthal_get_interrupt( void ); +#define xthal_get_intread xthal_get_interrupt /* backward compatibility */ + +/* These two functions are deprecated. Use the newer functions + xthal_interrupt_trigger and xthal_interrupt_clear instead. */ +extern void xthal_set_intset( unsigned ); +extern void xthal_set_intclear( unsigned ); + + +/*---------------------------------------------------------------------- + Debug + ----------------------------------------------------------------------*/ + +/* Number of instruction and data break registers: */ +extern const int Xthal_num_ibreak; +extern const int Xthal_num_dbreak; + + +/*---------------------------------------------------------------------- + Core Counter + ----------------------------------------------------------------------*/ + +/* counter info */ +extern const unsigned char Xthal_have_ccount; /* set if CCOUNT register present */ +extern const unsigned char Xthal_num_ccompare; /* number of CCOMPAREn registers */ + +/* get CCOUNT register (if not present return 0) */ +extern unsigned xthal_get_ccount(void); + +/* set and get CCOMPAREn registers (if not present, get returns 0) */ +extern void xthal_set_ccompare(int, unsigned); +extern unsigned xthal_get_ccompare(int); + + +/*---------------------------------------------------------------------- + Miscellaneous + ----------------------------------------------------------------------*/ + +extern const unsigned char Xthal_have_prid; +extern const unsigned char Xthal_have_exceptions; +extern const unsigned char Xthal_xea_version; +extern const unsigned char Xthal_have_interrupts; +extern const unsigned char Xthal_have_highlevel_interrupts; +extern const unsigned char Xthal_have_nmi; + +extern unsigned xthal_get_prid( void ); + + +/*---------------------------------------------------------------------- + Virtual interrupt prioritization (DEPRECATED) + ----------------------------------------------------------------------*/ + +/* Convert between interrupt levels (as per PS.INTLEVEL) and virtual interrupt priorities: */ +extern unsigned xthal_vpri_to_intlevel(unsigned vpri); +extern unsigned xthal_intlevel_to_vpri(unsigned intlevel); + +/* Enables/disables given set (mask) of interrupts; returns previous enabled-mask of all ints: */ +/* These functions are deprecated. Use xthal_interrupt_enable and xthal_interrupt_disable instead. */ +extern unsigned xthal_int_enable(unsigned); +extern unsigned xthal_int_disable(unsigned); + +/* Set/get virtual priority of an interrupt: */ +extern int xthal_set_int_vpri(int intnum, int vpri); +extern int xthal_get_int_vpri(int intnum); + +/* Set/get interrupt lockout level for exclusive access to virtual priority data structures: */ +extern void xthal_set_vpri_locklevel(unsigned intlevel); +extern unsigned xthal_get_vpri_locklevel(void); + +/* Set/get current virtual interrupt priority: */ +extern unsigned xthal_set_vpri(unsigned vpri); +extern unsigned xthal_get_vpri(void); +extern unsigned xthal_set_vpri_intlevel(unsigned intlevel); +extern unsigned xthal_set_vpri_lock(void); + + +/*---------------------------------------------------------------------- + Generic Interrupt Trampolining Support (DEPRECATED) + ----------------------------------------------------------------------*/ + +typedef void (XtHalVoidFunc)(void); + +/* Bitmask of interrupts currently trampolining down: */ +extern unsigned Xthal_tram_pending; + +/* + * Bitmask of which interrupts currently trampolining down synchronously are + * actually enabled; this bitmask is necessary because INTENABLE cannot hold + * that state (sync-trampolining interrupts must be kept disabled while + * trampolining); in the current implementation, any bit set here is not set + * in INTENABLE, and vice-versa; once a sync-trampoline is handled (at level + * one), its enable bit must be moved from here to INTENABLE: + */ +extern unsigned Xthal_tram_enabled; + +/* Bitmask of interrupts configured for sync trampolining: */ +extern unsigned Xthal_tram_sync; + +/* Trampoline support functions: */ +extern unsigned xthal_tram_pending_to_service( void ); +extern void xthal_tram_done( unsigned serviced_mask ); +extern int xthal_tram_set_sync( int intnum, int sync ); +extern XtHalVoidFunc* xthal_set_tram_trigger_func( XtHalVoidFunc *trigger_fn ); + + +/*---------------------------------------------------------------------- + Internal Memories + ----------------------------------------------------------------------*/ + +extern const unsigned char Xthal_num_instrom; +extern const unsigned char Xthal_num_instram; +extern const unsigned char Xthal_num_datarom; +extern const unsigned char Xthal_num_dataram; +extern const unsigned char Xthal_num_xlmi; + +/* Each of the following arrays contains at least one entry, + * or as many entries as needed if more than one: */ +extern const unsigned int Xthal_instrom_vaddr[]; +extern const unsigned int Xthal_instrom_paddr[]; +extern const unsigned int Xthal_instrom_size []; +extern const unsigned int Xthal_instram_vaddr[]; +extern const unsigned int Xthal_instram_paddr[]; +extern const unsigned int Xthal_instram_size []; +extern const unsigned int Xthal_datarom_vaddr[]; +extern const unsigned int Xthal_datarom_paddr[]; +extern const unsigned int Xthal_datarom_size []; +extern const unsigned int Xthal_dataram_vaddr[]; +extern const unsigned int Xthal_dataram_paddr[]; +extern const unsigned int Xthal_dataram_size []; +extern const unsigned int Xthal_xlmi_vaddr[]; +extern const unsigned int Xthal_xlmi_paddr[]; +extern const unsigned int Xthal_xlmi_size []; + + +/*---------------------------------------------------------------------- + Cache + ----------------------------------------------------------------------*/ + +/* number of cache sets in log2(lines per way) */ +extern const unsigned char Xthal_icache_setwidth; +extern const unsigned char Xthal_dcache_setwidth; +/* cache set associativity (number of ways) */ +extern const unsigned int Xthal_icache_ways; +extern const unsigned int Xthal_dcache_ways; +/* cache features */ +extern const unsigned char Xthal_icache_line_lockable; +extern const unsigned char Xthal_dcache_line_lockable; + +/* cache attribute register control (used by other HAL routines) */ +extern unsigned xthal_get_cacheattr( void ); +extern unsigned xthal_get_icacheattr( void ); +extern unsigned xthal_get_dcacheattr( void ); +extern void xthal_set_cacheattr( unsigned ); +extern void xthal_set_icacheattr( unsigned ); +extern void xthal_set_dcacheattr( unsigned ); +/* set cache attribute (access modes) for a range of memory */ +extern int xthal_set_region_attribute( void *addr, unsigned size, + unsigned cattr, unsigned flags ); +/* Bits of flags parameter to xthal_set_region_attribute(): */ +#define XTHAL_CAFLAG_EXPAND 0x000100 /* only expand allowed access to range, don't reduce it */ +#define XTHAL_CAFLAG_EXACT 0x000200 /* return error if can't apply change to exact range specified */ +#define XTHAL_CAFLAG_NO_PARTIAL 0x000400 /* don't apply change to regions partially covered by range */ +#define XTHAL_CAFLAG_NO_AUTO_WB 0x000800 /* don't writeback data after leaving writeback attribute */ +#define XTHAL_CAFLAG_NO_AUTO_INV 0x001000 /* don't invalidate after disabling cache (entering bypass) */ + +/* enable caches */ +extern void xthal_icache_enable( void ); /* DEPRECATED */ +extern void xthal_dcache_enable( void ); /* DEPRECATED */ +/* disable caches */ +extern void xthal_icache_disable( void ); /* DEPRECATED */ +extern void xthal_dcache_disable( void ); /* DEPRECATED */ + +/* whole cache operations (privileged) */ +extern void xthal_icache_all_invalidate( void ); +extern void xthal_dcache_all_invalidate( void ); +extern void xthal_dcache_all_writeback( void ); +extern void xthal_dcache_all_writeback_inv( void ); +extern void xthal_icache_all_unlock( void ); +extern void xthal_dcache_all_unlock( void ); + +/* address-range cache operations (privileged) */ +/* prefetch and lock specified memory range into cache */ +extern void xthal_icache_region_lock( void *addr, unsigned size ); +extern void xthal_dcache_region_lock( void *addr, unsigned size ); +/* unlock from cache */ +extern void xthal_icache_region_unlock( void *addr, unsigned size ); +extern void xthal_dcache_region_unlock( void *addr, unsigned size ); + +/* huge-range cache operations (privileged) (EXPERIMENTAL) */ +extern void xthal_icache_hugerange_invalidate( void *addr, unsigned size ); +extern void xthal_icache_hugerange_unlock( void *addr, unsigned size ); +extern void xthal_dcache_hugerange_invalidate( void *addr, unsigned size ); +extern void xthal_dcache_hugerange_unlock( void *addr, unsigned size ); +extern void xthal_dcache_hugerange_writeback( void *addr, unsigned size ); +extern void xthal_dcache_hugerange_writeback_inv( void *addr, unsigned size ); + +# ifndef XTHAL_USE_CACHE_MACROS +/* cache line operations (privileged) */ +extern void xthal_icache_line_lock(void *addr); +extern void xthal_dcache_line_lock(void *addr); +extern void xthal_icache_line_unlock(void *addr); +extern void xthal_dcache_line_unlock(void *addr); +# endif + + + +/*---------------------------------------------------------------------- + Local Memory ECC/Parity + ----------------------------------------------------------------------*/ + +/* Inject memory errors; flags is bit combination of XTHAL_MEMEP_F_xxx: */ +extern void xthal_memep_inject_error(void *addr, int size, int flags); + + + +/*---------------------------------------------------------------------- + Memory Management Unit + ----------------------------------------------------------------------*/ + +extern const unsigned char Xthal_have_spanning_way; +extern const unsigned char Xthal_have_identity_map; +extern const unsigned char Xthal_have_mimic_cacheattr; +extern const unsigned char Xthal_have_xlt_cacheattr; +extern const unsigned char Xthal_have_cacheattr; +extern const unsigned char Xthal_have_tlbs; + +extern const unsigned char Xthal_mmu_asid_bits; /* 0 .. 8 */ +extern const unsigned char Xthal_mmu_asid_kernel; +extern const unsigned char Xthal_mmu_rings; /* 1 .. 4 (perhaps 0 if no MMU and/or no protection?) */ +extern const unsigned char Xthal_mmu_ring_bits; +extern const unsigned char Xthal_mmu_sr_bits; +extern const unsigned char Xthal_mmu_ca_bits; +extern const unsigned int Xthal_mmu_max_pte_page_size; +extern const unsigned int Xthal_mmu_min_pte_page_size; + +extern const unsigned char Xthal_itlb_way_bits; +extern const unsigned char Xthal_itlb_ways; +extern const unsigned char Xthal_itlb_arf_ways; +extern const unsigned char Xthal_dtlb_way_bits; +extern const unsigned char Xthal_dtlb_ways; +extern const unsigned char Xthal_dtlb_arf_ways; + +/* Return error codes for hal functions */ + +/* function sucessful, operation completed as expected */ +#define XTHAL_SUCCESS 0 +/* XTHAL_CAFLAGS_NO_PARTIAL was specified, and no full region is + * covered by the address range. */ +#define XTHAL_NO_REGIONS_COVERED -1 +/* The XTHAL_CAFLAGS_EXACT flag was given, but no exact mapping is possible. */ +#define XTHAL_INEXACT -2 +/* The supplied address doesn't correspond to the start of a region. */ +#define XTHAL_INVALID_ADDRESS -3 +/* This functionality is not available on this architecture. */ +#define XTHAL_UNSUPPORTED -4 +/* Translation failed because vaddr and paddr were not aligned. */ +#define XTHAL_ADDRESS_MISALIGNED -5 +/* There is mapping for the supplied address. */ +#define XTHAL_NO_MAPPING -6 +/* The requested access rights are not supported */ +#define XTHAL_BAD_ACCESS_RIGHTS -7 +/* The requested memory type is not supported */ +#define XTHAL_BAD_MEMORY_TYPE -8 +/* The entries supplied are not properly aligned to the MPU's background map. */ +#define XTHAL_MAP_NOT_ALIGNED -9 +/* There are not enough MPU entries available to do the requeste mapping. */ +#define XTHAL_OUT_OF_ENTRIES -10 +/* The entries supplied are not properly ordered for the MPU. */ +#define XTHAL_OUT_OF_ORDER_MAP -11 +/* an invalid argument such as a null pointer was supplied to the function */ +#define XTHAL_INVALID -12 +/* specified region is of zero size, therefore no mapping is done. */ +#define XTHAL_ZERO_SIZED_REGION -13 +/* specified range wraps around '0' */ +#define XTHAL_INVALID_ADDRESS_RANGE -14 + +/* + For backward compatibility we retain the following inconsistenly named + constants. Do not use them as they may be removed in a future release. + */ +#define XCHAL_SUCCESS XTHAL_SUCCESS +#define XCHAL_ADDRESS_MISALIGNED XTHAL_ADDRESS_MISALIGNED +#define XCHAL_INEXACT XTHAL_INEXACT +#define XCHAL_INVALID_ADDRESS XTHAL_INVALID_ADDRESS +#define XCHAL_UNSUPPORTED_ON_THIS_ARCH XTHAL_UNSUPPORTED +#define XCHAL_NO_PAGES_MAPPED XTHAL_NO_REGIONS_COVERED + + +/* Convert between virtual and physical addresses (through static maps only) + * WARNING: these two functions may go away in a future release; + * don't depend on them! +*/ +extern int xthal_static_v2p( unsigned vaddr, unsigned *paddrp ); +extern int xthal_static_p2v( unsigned paddr, unsigned *vaddrp, unsigned cached ); + +extern int xthal_set_region_translation(void* vaddr, void* paddr, + unsigned size, unsigned cache_atr, unsigned flags); +extern int xthal_v2p(void*, void**, unsigned*, unsigned*); +extern int xthal_invalidate_region(void* addr); +extern int xthal_set_region_translation_raw(void *vaddr, void *paddr, unsigned cattr); + +/*------------------------------------------------------------------------ + MPU (Memory Protection Unit) +-------------------------------------------------------------------------*/ + +/* + * General notes on MPU (Memory Protection Unit): + * + * The MPU supports setting the access rights (read, write, execute) as + * well as the memory type (cacheablity, ...) + * for regions of memory. The granularity can be as small as 32 bytes. + * (XCHAL_MPU_ALIGN specifies the granularity for any specific MPU config) + * + * The MPU doesn't support mapping between virtual and physical addresses. + * + * The MPU contains a fixed number of map changeable forground map entries, + * and a background map which is fixed at configuration time. + * + * Each entry has a start address (up to 27 bits), valid flag, + * access rights (4 bits), and memory type (9 bits); + * + */ + + +/* + MPU access rights constants: + Only the combinations listed below are supported by the MPU. +*/ + +#define XTHAL_AR_NONE 0 /* no access */ +#define XTHAL_AR_R 4 /* Kernel read, User no access*/ +#define XTHAL_AR_RX 5 /* Kernel read/execute, User no access */ +#define XTHAL_AR_RW 6 /* Kernel read/write, User no access */ +#define XTHAL_AR_RWX 7 /* Kernel read/write/execute, User no access */ +#define XTHAL_AR_Ww 8 /* Kernel write, User write */ +#define XTHAL_AR_RWrwx 9 /* Kernel read/write , User read/write/execute */ +#define XTHAL_AR_RWr 10 /* Kernel read/write, User read */ +#define XTHAL_AR_RWXrx 11 /* Kernel read/write/execute, User read/execute */ +#define XTHAL_AR_Rr 12 /* Kernel read, User read */ +#define XTHAL_AR_RXrx 13 /* Kernel read/execute, User read/execute */ +#define XTHAL_AR_RWrw 14 /* Kernel read/write, User read/write */ +#define XTHAL_AR_RWXrwx 15 /* Kernel read/write/execute, + User read/write/execute */ + +#define XTHAL_AR_WIDTH 4 /* # bits used to encode access rights */ + +/* If the bit XTHAL_MPU_USE_EXISTING_ACCESS_RIGHTS is set in the accessRights + * argument to xthal_mpu_set_region_attribute(), or to the cattr argument of + * xthal_set_region_attribute() then the existing access rights for the first + * byte of the region will be used as the access rights of the new region. + */ +#define XTHAL_MPU_USE_EXISTING_ACCESS_RIGHTS 0x00002000 + +/* If the bit XTHAL_MPU_USE_EXISTING_MEMORY_TYPE is set in the memoryType + * argument to xthal_mpu_set_region_attribute(), or to the cattr argument of + * xthal_set_region_attribute() then the existing memory type for the first + * byte of the region will be used as the memory type of the new region. + */ +#define XTHAL_MPU_USE_EXISTING_MEMORY_TYPE 0x00004000 + +/* The following groups of constants are bit-wise or'd together to specify + * the memory type as input to the macros and functions that accept an + * unencoded memory type specifier: + * XTHAL_ENCODE_MEMORY_TYPE, xthal_encode_memory_type, + * xthal_mpu_set_region_attribute(), and xthal_set_region_attribute(). + * + * example: + * XTHAL_MEM_DEVICE | XTHAL_MEM_INTERRUPTIBLE | XTHAL_MEM_SYSTEM_SHARABLE + * + * or + * XTHAL_MEM_WRITEBACK | XTHAL_MEM_INNER_SHAREABLE + * + * If it is desired to specify different attributes for the system and + * local cache, then macro XTHAL_MEM_PROC_CACHE is used: + * + * XTHAL_MEM_PROC_CACHE(XTHAL_MEM_WRITEBACK, XTHAL_MEM_WRITETHRU) + * + * indicates the shared cache is writeback, but the processor's local cache + * is writethrough. + * + */ + +/* The following group of constants are used to specify cache attributes of + * an MPU entry. If the processors local cache and the system's shared cache + * have the same attributes (or if there aren't distinct local and shared + * caches) then the constant can be used directly. If different attributes + * for the shared and local caches, then use these constants as the parameters + * to the XTHAL_MEM_PROC_CACHE() macro. + */ +#define XTHAL_MEM_DEVICE 0x00008000 +#define XTHAL_MEM_NON_CACHEABLE 0x00090000 +#define XTHAL_MEM_WRITETHRU_NOALLOC 0x00080000 +#define XTHAL_MEM_WRITETHRU 0x00040000 +#define XTHAL_MEM_WRITETHRU_WRITEALLOC 0x00060000 +#define XTHAL_MEM_WRITEBACK_NOALLOC 0x00050000 +#define XTHAL_MEM_WRITEBACK 0x00070000 + +/* Indicates a read is interruptible. Only applicable to devices */ +#define XTHAL_MEM_INTERRUPTIBLE 0x08000000 + +/* Indicates if writes to this memory are bufferable ... only applicable + * to devices, and non-cacheable memory. + */ +#define XTHAL_MEM_BUFFERABLE 0x01000000 + +/* The following group of constants indicates the scope of the sharing of + * the memory region. XTHAL_MEM_INNER_SHAREABLE and XTHAL_MEM_OUTER_SHARABLE are + * only applicable to cacheable regions. XTHAL_MEM_SYSTEM_SHAREABLE is only + * applicable to devices and non-cacheable regions. + */ +#define XTHAL_MEM_NON_SHAREABLE 0x00000000 +#define XTHAL_MEM_INNER_SHAREABLE 0x02000000 +#define XTHAL_MEM_OUTER_SHAREABLE 0x04000000 +#define XTHAL_MEM_SYSTEM_SHAREABLE 0x06000000 + + +/* + * This macro is needed when the cache attributes are different for the shared + * and processor's local caches. For example: + * + * XTHAL_MEM_PROC_CACHE(XTHAL_MEM_WRITEBACK, XTHAL_MEM_NON_CACHEABLE) + * creates a memory type that is writeback cacheable in the system cache, and not + * cacheable in the processor's local cache. + */ +#define XTHAL_MEM_PROC_CACHE(system, processor) \ + (((system) & 0x000f0000) | (((processor) & 0x000f0000 ) << 4) | \ + (((system) & XTHAL_MEM_DEVICE) | ((processor) & XTHAL_MEM_DEVICE))) + +/* + * This macro converts a bit-wise combination of the XTHAL_MEM_... constants + * to the corresponding MPU memory type (9-bits). + * + * Unsupported combinations are mapped to the best available substitute. + * + * The same functionality plus error checking is available from + * xthal_encode_memory_type(). + */ +#define XTHAL_ENCODE_MEMORY_TYPE(x) \ + (((x) & 0xffffe000) ? \ + (_XTHAL_MEM_IS_DEVICE((x)) ? _XTHAL_ENCODE_DEVICE((x)) : \ + (_XTHAL_IS_SYSTEM_NONCACHEABLE((x)) ? \ + _XTHAL_ENCODE_SYSTEM_NONCACHEABLE((x)) : \ + _XTHAL_ENCODE_SYSTEM_CACHEABLE((x)))) : (x)) + +/* + * This structure is used to represent each MPU entry (both foreground and + * background). The internal representation of the structure is subject to + * change, so it should only be accessed by the XTHAL_MPU_ENTRY_... macros + * below. + */ +typedef struct xthal_MPU_entry +{ + uint32_t as; /* virtual start address, and valid bit */ + uint32_t at; /* access rights, and memory type (and space for entry index) */ +} xthal_MPU_entry; + +extern const xthal_MPU_entry Xthal_mpu_bgmap[]; + + + + +/* + * XTHAL_MPU_ENTRY creates an MPU entry from its component values. It is + * intended for initializing an MPU map. Example: + * const struct xthal_MPU_entry mpumap[] = + { XTHAL_MPU_ENTRY( 0x00000000, 1, XTHAL_AR_RWXrwx, XTHAL_MEM_WRITEBACK), + XTHAL_MPU_ENTRY( 0xE0000000, 1, XTHAL_AR_RWXrwx, + XTHAL_MEM_NON_CACHEABLE | XTHAL_MEM_BUFFERABLE), + XTHAL_MPU_ENTRY( 0xF0000000, 1, XTHAL_AR_RWX, + XTHAL_MEM_NON_CACHEABLE | XTHAL_MEM_BUFFERABLE) }; + xthal_write_map(mpumap, sizeof(mpumap) / sizeof(struct xthal_MPU_entry)); + * + */ +#define XTHAL_MPU_ENTRY(vaddr, valid, access, memtype) \ + { (((vaddr) & 0xffffffe0) | ((valid & 0x1))), \ + (((XTHAL_ENCODE_MEMORY_TYPE(memtype)) << 12) | (((access) & 0xf) << 8)) } + +/* + * These macros get (or set) the specified field of the MPU entry. + */ +#define XTHAL_MPU_ENTRY_GET_VSTARTADDR(x) ((x).as & 0xffffffe0) + +#define XTHAL_MPU_ENTRY_SET_VSTARTADDR(x, vaddr) (x).as = \ + (((x).as) & 0x1) | ((vaddr) & 0xffffffe0) + +#define XTHAL_MPU_ENTRY_GET_VALID(x) (((x).as & 0x1)) + +#define XTHAL_MPU_ENTRY_SET_VALID(x, valid) (x).as = \ + (((x).as & 0xfffffffe) | ((valid) & 0x1)) +#define XTHAL_MPU_ENTRY_GET_ACCESS(x) ((((x).at) >> 8) & 0xf) + +#define XTHAL_MPU_ENTRY_SET_ACCESS(x, accessRights) ((x).at = \ + ((x).at & 0xfffff0ff) | (((accessRights) & 0xf) << 8)) + +#define XTHAL_MPU_ENTRY_GET_MEMORY_TYPE(x) ((((x).at) >> 12) & 0x1ff) + +#define XTHAL_MPU_ENTRY_SET_MEMORY_TYPE(x, memtype) ((x).at = \ + ((x).at & 0xffe00fff) | (((XTHAL_ENCODE_MEMORY_TYPE(memtype)) & 0x1ff) << 12)) + +/* + * These functions accept encoded access rights, and return 1 if the + * supplied memory type has the property specified by the function name, + * otherwise they return 0. + */ +extern int32_t xthal_is_kernel_readable(uint32_t accessRights); +extern int32_t xthal_is_kernel_writeable(uint32_t accessRights); +extern int32_t xthal_is_kernel_executable(uint32_t accessRights); +extern int32_t xthal_is_user_readable(uint32_t accessRights); +extern int32_t xthal_is_user_writeable (uint32_t accessRights); +extern int32_t xthal_is_user_executable(uint32_t accessRights); + + +/* + * This function converts a bit-wise combination of the XTHAL_MEM_.. constants + * to the corresponding MPU memory type (9-bits). + * + * If none of the XTHAL_MEM_.. bits are present in the argument, then + * bits 4-12 (9-bits) are returned ... this supports using an already encoded + * memoryType (perhaps obtained from an xthal_MPU_entry structure) as input + * to xthal_set_region_attribute(). + * + * This function first checks that the supplied constants are a valid and + * supported combination. If not, it returns XTHAL_BAD_MEMORY_TYPE. + */ +extern int xthal_encode_memory_type(uint32_t x); + +/* + * This function accepts a 9-bit memory type value (such as returned by + * XTHAL_MEM_ENTRY_GET_MEMORY_TYPE() or xthal_encode_memory_type(). They + * return 1 if the memoryType has the property specified in the function + * name and 0 otherwise. + */ +extern int32_t xthal_is_cacheable(uint32_t memoryType); +extern int32_t xthal_is_writeback(uint32_t memoryType); +extern int32_t xthal_is_device(uint32_t memoryType); + +/* + * Copies the current MPU entry list into 'entries' which + * must point to available memory of at least + * sizeof(struct xthal_MPU_entry) * XCHAL_MPU_ENTRIES. + * + * This function returns XTHAL_SUCCESS. + * XTHAL_INVALID, or + * XTHAL_UNSUPPORTED. + */ +extern int32_t xthal_read_map(struct xthal_MPU_entry* entries); + +/* + * Writes the map pointed to by 'entries' to the MPU. Before updating + * the map, it commits any uncommitted + * cache writes, and invalidates the cache if necessary. + * + * This function does not check for the correctness of the map. Generally + * xthal_check_map() should be called first to check the map. + * + * If n == 0 then the existing map is cleared, and no new map is written + * (useful for returning to reset state) + * + * If (n > 0 && n < XCHAL_MPU_ENTRIES) then a new map is written with + * (XCHAL_MPU_ENTRIES-n) padding entries added to ensure a properly ordered + * map. The resulting foreground map will be equivalent to the map vector + * fg, but the position of the padding entries should not be relied upon. + * + * If n == XCHAL_MPU_ENTRIES then the complete map as specified by fg is + * written. + * + * The CACHEADRDIS register will be set to enable caching any 512MB region + * that is overlapped by an MPU region with a cacheable memory type. + * Caching will be disabled if none of the 512 MB region is cacheable. + * + * xthal_write_map() disables the MPU foreground map during the MPU + * update and relies on the background map. + * + * As a result any interrupt that does not meet the following conditions + * must be disabled before calling xthal_write_map(): + * 1) All code and data needed for the interrupt must be + * mapped by the background map with sufficient access rights. + * 2) The interrupt code must not access the MPU. + * + */ +extern void xthal_write_map(const struct xthal_MPU_entry* entries, uint32_t n); + +/* + * Checks if entry vector 'entries' of length 'n' is a valid MPU access map. + * Returns: + * XTHAL_SUCCESS if valid, + * XTHAL_OUT_OF_ENTRIES + * XTHAL_MAP_NOT_ALIGNED, + * XTHAL_BAD_ACCESS_RIGHTS, + * XTHAL_OUT_OF_ORDER_MAP, or + * XTHAL_UNSUPPORTED if config doesn't have an MPU. + */ +extern int xthal_check_map(const struct xthal_MPU_entry* entries, uint32_t n); + +/* + * Returns the MPU entry that maps 'vaddr'. If 'infgmap' is non-NULL then + * *infgmap is set to 1 if 'vaddr' is mapped by the foreground map, and + * *infgmap is set to 0 if 'vaddr' is mapped by the background map. + */ +extern struct xthal_MPU_entry xthal_get_entry_for_address(void* vaddr, + int32_t* infgmap); + +/* + * Scans the supplied MPU map and returns a value suitable for writing to + * the CACHEADRDIS register: + * Bits 0-7 -> 1 if there are no cacheable areas in the corresponding 512MB + * region and 0 otherwise. + * Bits 8-31 -> undefined. + * This function can accept a partial memory map in the same manner + * xthal_write_map() does, */ +extern uint32_t +xthal_calc_cacheadrdis(const struct xthal_MPU_entry* e, uint32_t n); + +/* + * This function is intended as an MPU specific version of + * xthal_set_region_attributes(). xthal_set_region_attributes() calls + * this function for MPU configurations. + * + * This function sets the attributes for the region [vaddr, vaddr+size) + * in the MPU. + * + * Depending on the state of the MPU this function will require from + * 0 to 3 unused MPU entries. + * + * This function typically will move, add, and subtract entries from + * the MPU map during execution, so that the resulting map may + * be quite different than when the function was called. + * + * This function does make the following guarantees: + * 1) The MPU access map remains in a valid state at all times + * during its execution. + * 2) At all points during (and after) completion the memoryType + * and accessRights remain the same for all addresses + * that are not in the range [vaddr, vaddr+size). + * 3) If XTHAL_SUCCESS is returned, then the range + * [vaddr, vaddr+size) will have the accessRights and memoryType + * specified. + * 4) The CACHEADRDIS register will be set to enable caching any 512MB region + * that is overlapped by an MPU region with a cacheable memory type. + * Caching will be disabled if none of the 512 MB region is cacheable. + * + * The accessRights parameter should be either a 4-bit value corresponding + * to an MPU access mode (as defined by the XTHAL_AR_.. constants), or + * XTHAL_MPU_USE_EXISTING_ACCESS_RIGHTS. + * + * The memoryType parameter should be either a bit-wise or-ing of XTHAL_MEM_.. + * constants that represent a valid MPU memoryType, a 9-bit MPU memoryType + * value, or XTHAL_MPU_USE_EXISTING_MEMORY_TYPE. + * + * In addition to the error codes that xthal_set_region_attribute() + * returns, this function can also return: XTHAL_BAD_ACCESS_RIGHTS + * (if the access rights bits map to an unsupported combination), or + * XTHAL_OUT_OF_MAP_ENTRIES (if there are not enough unused MPU entries) + * + * If this function is called with an invalid MPU map, then this function + * will return one of the codes that is returned by xthal_check_map(). + * + * The flag, XTHAL_CAFLAG_EXPAND, is not supported + * + */ + +extern int xthal_mpu_set_region_attribute(void* vaddr, size_t size, + int32_t accessRights, int32_t memoryType, uint32_t flags); + +/* The following are internal implementation macros. These should not + * be directly used except by the hal code and headers. +*/ + +/* + * Layout of the MPU specifier for: XTHAL_ENCODE_MEMORY_TYPE(), + * xthal_encode_memory_type(), xthal_set_region_attribute(), + * and xthal_mpu_set_region_attribute(). THIS IS SUBJECT TO CHANGE: + * + * Bits 0-3 - reserved for pass through of accessRights + * Bits 4-12 - reserved for pass through of memoryType bits + * Bit 13 - indicates to use existing access rights of region + * Bit 14 - indicates to use existing memory type of region + * Bit 15 - indicates device + * Bit 16-19- system cache properties + * Bit 20-23- local cache properties + * Bit 24 - indicates bufferable + * Bit 25-26- encodes shareability (1=inner, 2=outer, 3=system) + * Bit 27 - indicates interruptible + * Bits 28-31- reserved for future use + */ +#define _XTHAL_SYSTEM_CACHE_BITS 0x000f0000 +#define _XTHAL_LOCAL_CACHE_BITS 0x00f00000 +#define _XTHAL_MEM_SYSTEM_RWC_MASK 0x00070000 +#define _XTHAL_MEM_LOCAL_RWC_MASK 0x00700000 +#define _XTHAL_SHIFT_RWC 16 + +#define _XTHAL_MEM_ANY_SHAREABLE(x) (((x) & XTHAL_MEM_SYSTEM_SHAREABLE) ? 1 : 0) + +#define _XTHAL_MEM_INNER_SHAREABLE(x) ((((x) & XTHAL_MEM_SYSTEM_SHAREABLE) \ + == XTHAL_MEM_INNER_SHAREABLE) ? 1 : 0) + +#define _XTHAL_MEM_IS_BUFFERABLE(x) (((x) & XTHAL_MEM_BUFFERABLE) ? 1 : 0) + +#define _XTHAL_MEM_IS_DEVICE(x) (((x) & XTHAL_MEM_DEVICE) ? 1 : 0) + +#define _XTHAL_NON_CACHEABLE_DOMAIN(x) \ + (_XTHAL_MEM_IS_DEVICE(x) || _XTHAL_MEM_ANY_SHAREABLE(x)? 0x3 : 0) + +#define _XTHAL_CACHEABLE_DOMAIN(x) (_XTHAL_MEM_ANY_SHAREABLE(x) ? \ + 0x3 : 0x1) + +#define _XTHAL_MEM_CACHE_MASK(x) ((x) & _XTHAL_SYSTEM_CACHE_BITS) + +#define _XTHAL_IS_SYSTEM_NONCACHEABLE(x) \ + (((_XTHAL_MEM_CACHE_MASK(x) & XTHAL_MEM_NON_CACHEABLE) == \ + XTHAL_MEM_NON_CACHEABLE) ? 1 : 0) + +#define _XTHAL_ENCODE_DEVICE(x) \ + (((((x) & XTHAL_MEM_INTERRUPTIBLE) ? 1 : 0) << 3) | \ + (_XTHAL_NON_CACHEABLE_DOMAIN(x) << 1) | _XTHAL_MEM_IS_BUFFERABLE(x)) + +#define _XTHAL_ENCODE_SYSTEM_NONCACHEABLE(x) \ + (0x18 | (_XTHAL_NON_CACHEABLE_DOMAIN(x) << 1) \ + | _XTHAL_MEM_IS_BUFFERABLE(x)) + +#define _XTHAL_ENCODE_SYSTEM_CACHEABLE(x) \ + (((((((x) & _XTHAL_LOCAL_CACHE_BITS) >> 4) & XTHAL_MEM_NON_CACHEABLE) == \ + XTHAL_MEM_NON_CACHEABLE) ? 1 : 0) ? \ + (_XTHAL_CACHEABLE_DOMAIN(x) << 4) : \ + _XTHAL_ENCODE_SYSTEM_CACHEABLE_LOCAL_CACHEABLE(x)) | \ + ((_XTHAL_MEM_INNER_SHAREABLE(x) << 3) | \ + (_XTHAL_MEM_CACHE_MASK(x) & _XTHAL_MEM_SYSTEM_RWC_MASK) \ + >> _XTHAL_SHIFT_RWC) + +#define _XTHAL_ENCODE_SYSTEM_CACHEABLE_LOCAL_CACHEABLE(x) \ + ((_XTHAL_CACHEABLE_DOMAIN(x) << 7) | (((((x) & _XTHAL_LOCAL_CACHE_BITS) ? \ + ((x) & _XTHAL_LOCAL_CACHE_BITS) : \ + (_XTHAL_MEM_CACHE_MASK(x) << 4)) \ + & (_XTHAL_MEM_LOCAL_RWC_MASK)) >> _XTHAL_SHIFT_RWC )) + +/* End of internal macros */ + +/* The functions and constants below here have been deprecated.*/ +#define XTHAL_MEM_NON_CACHED XTHAL_MEM_NON_CACHEABLE +#define XTHAL_MEM_NON_SHARED XTHAL_MEM_NON_SHAREABLE +#define XTHAL_MEM_INNER_SHARED XTHAL_MEM_INNER_SHAREABLE +#define XTHAL_MEM_OUTER_SHARED XTHAL_MEM_OUTER_SHAREABLE +#define XTHAL_MEM_SYSTEM_SHARED XTHAL_MEM_SYSTEM_SHAREABLE +#define XTHAL_MEM_SW_SHAREABLE 0 + +#define xthal_is_cached(memoryType) (xthal_is_cacheable((memoryType))) +extern int32_t xthal_read_background_map(struct xthal_MPU_entry* entries); + +/* end deprecated functions and constants */ + +#ifdef __cplusplus +} +#endif +#endif /*!_ASMLANGUAGE && !_NOCLANGUAGE && !__ASSEMBLER__ */ + +#endif /* !XTENSA_HAL_NON_PRIVILEGED_ONLY */ + + + + +/**************************************************************************** + EXPERIMENTAL and DEPRECATED Definitions + ****************************************************************************/ + + +#if !defined(_ASMLANGUAGE) && !defined(_NOCLANGUAGE) && !defined(__ASSEMBLER__) +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef INCLUDE_DEPRECATED_HAL_DEBUG_CODE +#define XTHAL_24_BIT_BREAK 0x80000000 +#define XTHAL_16_BIT_BREAK 0x40000000 +extern const unsigned short Xthal_ill_inst_16[16]; +#define XTHAL_DEST_REG 0xf0000000 /* Mask for destination register */ +#define XTHAL_DEST_REG_INST 0x08000000 /* Branch address is in register */ +#define XTHAL_DEST_REL_INST 0x04000000 /* Branch address is relative */ +#define XTHAL_RFW_INST 0x00000800 +#define XTHAL_RFUE_INST 0x00000400 +#define XTHAL_RFI_INST 0x00000200 +#define XTHAL_RFE_INST 0x00000100 +#define XTHAL_RET_INST 0x00000080 +#define XTHAL_BREAK_INST 0x00000040 +#define XTHAL_SYSCALL_INST 0x00000020 +#define XTHAL_LOOP_END 0x00000010 /* Not set by xthal_inst_type */ +#define XTHAL_JUMP_INST 0x00000008 /* Call or jump instruction */ +#define XTHAL_BRANCH_INST 0x00000004 /* Branch instruction */ +#define XTHAL_24_BIT_INST 0x00000002 +#define XTHAL_16_BIT_INST 0x00000001 +typedef struct xthal_state { + unsigned pc; + unsigned ar[16]; + unsigned lbeg; + unsigned lend; + unsigned lcount; + unsigned extra_ptr; + unsigned cpregs_ptr[XTHAL_MAX_CPS]; +} XTHAL_STATE; +extern unsigned int xthal_inst_type(void *addr); +extern unsigned int xthal_branch_addr(void *addr); +extern unsigned int xthal_get_npc(XTHAL_STATE *user_state); +#endif /* INCLUDE_DEPRECATED_HAL_DEBUG_CODE */ + +#ifdef __cplusplus +} +#endif +#endif /*!_ASMLANGUAGE && !_NOCLANGUAGE && !__ASSEMBLER__ */ + +#endif /*XTENSA_HAL_H*/ + diff --git a/arch/xtensa/include/esp32/xtensa/include/xtensa/idmaasm.h b/arch/xtensa/include/esp32/xtensa/include/xtensa/idmaasm.h new file mode 100644 index 0000000000000..6c8499c5711b9 --- /dev/null +++ b/arch/xtensa/include/esp32/xtensa/include/xtensa/idmaasm.h @@ -0,0 +1,72 @@ +/* $Id: //depot/dev/Foxhill/Xtensa/OS/include/xtensa/mpuasm.h#5 $ */ + +/* + * Copyright (c) 2016 Cadence Design Systems, Inc. + * + * 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 the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 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. + */ + +#ifndef _IDMAASM_H_ +#define _IDMAASM_H_ + +#if XCHAL_HAVE_IDMA +#include +#endif + +/* + * Macro for restore IDMA regs + * + * Parameters: + * a_save => address register containing pointer to IDMA save area + * a_temp1, a_temp2, a_temp3. => address register temporaries + */ +// IDMA_REG_SETTINGS, +// IDMA_REG_TIMEOUT, +// IDMA_REG_DESC_START, +// IDMA_REG_CONTROL, +// IDMA_REG_USERPRIV, + +.macro _idma_restore a_save, a_temp1, a_temp2, a_temp3 +#if XCHAL_HAVE_IDMA + l32i \a_temp1, \a_save, 0 + movi \a_temp3, idmareg_base + movi \a_temp2, IDMA_REG_SETTINGS + add \a_temp2, \a_temp2, \a_temp3 + wer \a_temp1, \a_temp2 + l32i \a_temp1, \a_save, 4 + movi \a_temp2, IDMA_REG_TIMEOUT + add \a_temp2, \a_temp2, \a_temp3 + wer \a_temp1, \a_temp2 + l32i \a_temp1, \a_save, 8 + movi \a_temp2, IDMA_REG_DESC_START + add \a_temp2, \a_temp2, \a_temp3 + wer \a_temp1, \a_temp2 + l32i \a_temp1, \a_save, 12 + movi \a_temp2, IDMA_REG_CONTROL + add \a_temp2, \a_temp2, \a_temp3 + wer \a_temp1, \a_temp2 + l32i \a_temp1, \a_save, 16 + movi \a_temp2, IDMA_REG_USERPRIV + add \a_temp2, \a_temp2, \a_temp3 + wer \a_temp1, \a_temp2 +#endif +.endm + +#endif //_IDMAASM_H_ diff --git a/arch/xtensa/include/esp32/xtensa/include/xtensa/mpuasm.h b/arch/xtensa/include/esp32/xtensa/include/xtensa/mpuasm.h new file mode 100644 index 0000000000000..ec43f41827cc8 --- /dev/null +++ b/arch/xtensa/include/esp32/xtensa/include/xtensa/mpuasm.h @@ -0,0 +1,111 @@ +/* $Id: //depot/dev/Foxhill/Xtensa/OS/include/xtensa/mpuasm.h#5 $ */ + +/* + * Copyright (c) 2016 Cadence Design Systems, Inc. + * + * 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 the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 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. + */ + +#ifndef _MPUASM_H_ +#define _MPUASM_H_ +#include + +/* + * Macro for writing MPU map. + * + * Parameters: + * a_map => address register containing pointer to MPU map + * a_num_entries => number of entries in the forementioned map + * a_temp1, a_temp2. => address register temporaries + * a_temp3, a_temp4 + */ + +.macro mpu_write_map a_map, a_num_entries, a_temp1, a_temp2, a_temp3, a_temp4 +#if XCHAL_HAVE_MPU + movi \a_temp1, 0 + wsr.cacheadrdis \a_temp1 // enable the cache in all regions + wsr.mpuenb \a_temp1 // disable all foreground entries + + // Clear out the unused entries. + // + // Currently we are clearing out all the entries because currently + // the entries must be ordered even if they are all disabled. + // If out of order entries were permitted when all are disabled, + // performance could be improved by clearing XCHAL_MPU_ENTRIES - n + // (n = number of entries) rather than XCHAL_MPU_ENTRIES - 1 entries. + // + movi \a_temp2, 0 + movi \a_temp3, XCHAL_MPU_ENTRIES - 1 + j 1f + .align 16 // this alignment is done to ensure that +1: + memw // todo currently wptlb must be preceeded by a memw. The instructions must + // be aligned to ensure that both are in the same cache line. These statements should be + // properly conditionalized when that restriction is removed from the HW + wptlb \a_temp2, \a_temp1 + addi \a_temp2, \a_temp2, 1 + bltu \a_temp2, \a_temp3, 1b + + // Write the new entries. + // + beqz \a_num_entries, 4f // if no entries, skip loop + addx8 \a_map, \a_num_entries, \a_map // compute end of provided map + j 3f + .align 16 +2: memw // todo currently wptlb must be preceeded by a memw. The instructions must + // be aligned to ensure that both are in the same cache line. These statements should be + // properly conditionalized when that restriction is removed from the HW + wptlb \a_temp2, \a_temp4 + addi \a_temp3, \a_temp3, -1 + beqz \a_num_entries, 4f // loop until done +3: addi \a_map, \a_map, -8 + l32i \a_temp2, \a_map, 4 // get at (acc.rights, memtype) + l32i \a_temp4, \a_map, 0 // get as (vstart, valid) + addi \a_num_entries, \a_num_entries, -1 + extui \a_temp1, \a_temp2, 0, 5 // entry index portion + xor \a_temp2, \a_temp2, \a_temp1 // zero it + or \a_temp2, \a_temp2, \a_temp3 // set index = \a_temp3 + j 2b +4: +#endif +.endm + +/* + * Macro for reading MPU map + * + * Parameters: + * a_map_ptr => address register pointing to memory where map is written + * a_temp1, a_temp2 => address register temporaries + */ +.macro mpu_read_map a_map_ptr, a_temp1, a_temp2 +#if XCHAL_HAVE_MPU + movi \a_temp1, XCHAL_MPU_ENTRIES // set index to last entry + 1 + addx8 \a_map_ptr, \a_temp1, \a_map_ptr // set map ptr to last entry + 1 +1: addi \a_temp1, \a_temp1, -1 // decrement index + addi \a_map_ptr, \a_map_ptr, -8 // decrement index + rptlb0 \a_temp2, \a_temp1 // read 1/2 of entry + s32i \a_temp2, \a_map_ptr, 0 // write 1/2 of entry + rptlb1 \a_temp2, \a_temp1 + s32i \a_temp2, \a_map_ptr, 4 + bnez \a_temp1, 1b // loop until done +#endif + .endm + +#endif diff --git a/arch/xtensa/include/esp32/xtensa/include/xtensa/specreg.h b/arch/xtensa/include/esp32/xtensa/include/xtensa/specreg.h new file mode 100644 index 0000000000000..df1856347b433 --- /dev/null +++ b/arch/xtensa/include/esp32/xtensa/include/xtensa/specreg.h @@ -0,0 +1,144 @@ +/* + * Xtensa Special Register symbolic names + */ + +/* $Id: //depot/rel/Foxhill/dot.9/Xtensa/OS/include/xtensa/specreg.h#1 $ */ + +/* + * Copyright (c) 2005-2011 Tensilica Inc. + * + * 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 the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 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. + */ + +#ifndef XTENSA_SPECREG_H +#define XTENSA_SPECREG_H + +/* Special registers: */ +#define LBEG 0 +#define LEND 1 +#define LCOUNT 2 +#define SAR 3 +#define BR 4 +#define LITBASE 5 +#define SCOMPARE1 12 +#define ACCLO 16 +#define ACCHI 17 +#define MR_0 32 +#define MR_1 33 +#define MR_2 34 +#define MR_3 35 +#define PREFCTL 40 +#define WINDOWBASE 72 +#define WINDOWSTART 73 +#define PTEVADDR 83 +#define RASID 90 +#define ITLBCFG 91 +#define DTLBCFG 92 +#define IBREAKENABLE 96 +#define MEMCTL 97 +#define CACHEATTR 98 /* until T1050, XEA1 */ +#define CACHEADRDIS 98 /* LX7+ */ +#define ATOMCTL 99 +#define DDR 104 +#define MECR 110 +#define IBREAKA_0 128 +#define IBREAKA_1 129 +#define DBREAKA_0 144 +#define DBREAKA_1 145 +#define DBREAKC_0 160 +#define DBREAKC_1 161 +#define CONFIGID0 176 +#define EPC_1 177 +#define EPC_2 178 +#define EPC_3 179 +#define EPC_4 180 +#define EPC_5 181 +#define EPC_6 182 +#define EPC_7 183 +#define DEPC 192 +#define EPS_2 194 +#define EPS_3 195 +#define EPS_4 196 +#define EPS_5 197 +#define EPS_6 198 +#define EPS_7 199 +#define CONFIGID1 208 +#define EXCSAVE_1 209 +#define EXCSAVE_2 210 +#define EXCSAVE_3 211 +#define EXCSAVE_4 212 +#define EXCSAVE_5 213 +#define EXCSAVE_6 214 +#define EXCSAVE_7 215 +#define CPENABLE 224 +#define INTERRUPT 226 +#define INTREAD INTERRUPT /* alternate name for backward compatibility */ +#define INTSET INTERRUPT /* alternate name for backward compatibility */ +#define INTCLEAR 227 +#define INTENABLE 228 +#define PS 230 +#define VECBASE 231 +#define EXCCAUSE 232 +#define DEBUGCAUSE 233 +#define CCOUNT 234 +#define PRID 235 +#define ICOUNT 236 +#define ICOUNTLEVEL 237 +#define EXCVADDR 238 +#define CCOMPARE_0 240 +#define CCOMPARE_1 241 +#define CCOMPARE_2 242 +#define MISC_REG_0 244 +#define MISC_REG_1 245 +#define MISC_REG_2 246 +#define MISC_REG_3 247 + +/* Special cases (bases of special register series): */ +#define MR 32 +#define IBREAKA 128 +#define DBREAKA 144 +#define DBREAKC 160 +#define EPC 176 +#define EPS 192 +#define EXCSAVE 208 +#define CCOMPARE 240 +#define MISC_REG 244 + +/* Tensilica-defined user registers: */ +#if 0 +/*#define ... 21..24 */ /* (545CK) */ +/*#define ... 140..143 */ /* (545CK) */ +#define EXPSTATE 230 /* Diamond */ +#define THREADPTR 231 /* threadptr option */ +#define FCR 232 /* FPU */ +#define FSR 233 /* FPU */ +#define AE_OVF_SAR 240 /* HiFi2 */ +#define AE_BITHEAD 241 /* HiFi2 */ +#define AE_TS_FTS_BU_BP 242 /* HiFi2 */ +#define AE_SD_NO 243 /* HiFi2 */ +#define VSAR 240 /* VectraLX */ +#define ROUND_LO 242 /* VectraLX */ +#define ROUND_HI 243 /* VectraLX */ +#define CBEGIN 246 /* VectraLX */ +#define CEND 247 /* VectraLX */ +#endif + +#endif /* XTENSA_SPECREG_H */ + diff --git a/arch/xtensa/include/esp32/xtensa/include/xtensa/traxreg.h b/arch/xtensa/include/esp32/xtensa/include/xtensa/traxreg.h new file mode 100644 index 0000000000000..9f7202f3dacff --- /dev/null +++ b/arch/xtensa/include/esp32/xtensa/include/xtensa/traxreg.h @@ -0,0 +1,196 @@ +/* TRAX register definitions + + Copyright (c) 2006-2012 Tensilica Inc. + + 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 the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 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. */ + +#ifndef _TRAX_REGISTERS_H_ +#define _TRAX_REGISTERS_H_ + +#define SHOW 1 +#define HIDE 0 + +#define RO 0 +#define RW 1 + +/* TRAX Register Numbers (from possible range of 0..127) */ +#if 0 +#define TRAXREG_ID 0 +#define TRAXREG_CONTROL 1 +#define TRAXREG_STATUS 2 +#define TRAXREG_DATA 3 +#define TRAXREG_ADDRESS 4 +#define TRAXREG_TRIGGER 5 +#define TRAXREG_MATCH 6 +#define TRAXREG_DELAY 7 +#define TRAXREG_STARTADDR 8 +#define TRAXREG_ENDADDR 9 +/* Internal use only (unpublished): */ +#define TRAXREG_P4CHANGE 16 +#define TRAXREG_P4REV 17 +#define TRAXREG_P4DATE 18 +#define TRAXREG_P4TIME 19 +#define TRAXREG_PDSTATUS 20 +#define TRAXREG_PDDATA 21 +#define TRAXREG_STOP_PC 22 +#define TRAXREG_STOP_ICNT 23 +#define TRAXREG_MSG_STATUS 24 +#define TRAXREG_FSM_STATUS 25 +#define TRAXREG_IB_STATUS 26 +#define TRAXREG_MAX 27 +#define TRAXREG_ITCTRL 96 +#endif +/* The registers above match the NAR addresses. So, their values are used for NAR access */ + +/* TRAX Register Fields */ + +/* TRAX ID register fields: */ +#define TRAX_ID_PRODNO 0xf0000000 /* product number (0=TRAX) */ +#define TRAX_ID_PRODOPT 0x0f000000 /* product options */ +#define TRAX_ID_MIW64 0x08000000 /* opt: instruction width */ +#define TRAX_ID_AMTRAX 0x04000000 /* opt: collection of options, internal (VER_2_0 or later)*/ +#define TRAX_ID_MAJVER(id) (((id) >> 20) & 0x0f) +#define TRAX_ID_MINVER(id) (((id) >> 17) & 0x07) +#define TRAX_ID_VER(id) ((TRAX_ID_MAJVER(id)<<4)|TRAX_ID_MINVER(id)) +#define TRAX_ID_STDCFG 0x00010000 /* standard config */ +#define TRAX_ID_CFGID 0x0000ffff /* TRAX configuration ID */ +#define TRAX_ID_MEMSHARED 0x00001000 /* Memshared option in TRAX */ +#define TRAX_ID_FROM_VER(ver) ((((ver) & 0xf0) << 16) | (((ver) & 0x7) << 17)) +/* Other TRAX ID register macros: */ +/* TRAX versions of interest (TRAX_ID_VER(), ie. MAJVER*16 + MINVER): */ +#define TRAX_VER_1_0 0x10 /* RA */ +#define TRAX_VER_1_1 0x11 /* RB thru RC-2010.1 */ +#define TRAX_VER_2_0 0x20 /* RC-2010.2, RD-2010.0, RD-2011.1 */ +#define TRAX_VER_2_1 0x21 /* RC-2011.3 / RD-2011.2 and later */ +#define TRAX_VER_3_0 0x30 /* RE-2012.0 */ +#define TRAX_VER_3_1 0x31 /* RE-2012.1 */ +#define TRAX_VER_HUAWEI_3 TRAX_VER_3_0 /* For Huawei, PRs: 25223, 25224, 24880 */ + + +/* TRAX version 1.0 requires a couple software workarounds: */ +#define TRAX_ID_1_0_ERRATUM(id) (TRAX_ID_VER(id) == TRAX_VER_1_0) +/* TRAX version 2.0 requires software workaround for PR 22161: */ +#define TRAX_ID_MEMSZ_ERRATUM(id) (TRAX_ID_VER(id) == TRAX_VER_2_0) + +/* TRAX Control register fields: */ +#define TRAX_CONTROL_TREN 0x00000001 +#define TRAX_CONTROL_TRSTP 0x00000002 +#define TRAX_CONTROL_PCMEN 0x00000004 +#define TRAX_CONTROL_PTIEN 0x00000010 +#define TRAX_CONTROL_CTIEN 0x00000020 +#define TRAX_CONTROL_TMEN 0x00000080 /* 2.0+ */ +#define TRAX_CONTROL_CNTU 0x00000200 +#define TRAX_CONTROL_BIEN 0x00000400 +#define TRAX_CONTROL_BOEN 0x00000800 +#define TRAX_CONTROL_TSEN 0x00000800 +#define TRAX_CONTROL_SMPER 0x00007000 +#define TRAX_CONTROL_SMPER_SHIFT 12 +#define TRAX_CONTROL_PTOWT 0x00010000 +#define TRAX_CONTROL_CTOWT 0x00020000 +#define TRAX_CONTROL_PTOWS 0x00100000 +#define TRAX_CONTROL_CTOWS 0x00200000 +#define TRAX_CONTROL_ATID 0x7F000000 /* 2.0+, amtrax */ +#define TRAX_CONTROL_ATID_SHIFT 24 +#define TRAX_CONTROL_ATEN 0x80000000 /* 2.0+, amtrax */ + +#define TRAX_CONTROL_PTOWS_ER 0x00020000 /* For 3.0 */ +#define TRAX_CONTROL_CTOWT_ER 0x00100000 /* For 3.0 */ + +#define TRAX_CONTROL_ITCTO 0x00400000 /* For 3.0 */ +#define TRAX_CONTROL_ITCTIA 0x00800000 /* For 3.0 */ +#define TRAX_CONTROL_ITATV 0x01000000 /* For 3.0 */ + + +/* TRAX Status register fields: */ +#define TRAX_STATUS_TRACT 0x00000001 +#define TRAX_STATUS_TRIG 0x00000002 +#define TRAX_STATUS_PCMTG 0x00000004 +#define TRAX_STATUS_BUSY 0x00000008 /* ER ??? */ +#define TRAX_STATUS_PTITG 0x00000010 +#define TRAX_STATUS_CTITG 0x00000020 +#define TRAX_STATUS_MEMSZ 0x00001F00 +#define TRAX_STATUS_MEMSZ_SHIFT 8 +#define TRAX_STATUS_PTO 0x00010000 +#define TRAX_STATUS_CTO 0x00020000 + +#define TRAX_STATUS_ITCTOA 0x00400000 /* For 3.0 */ +#define TRAX_STATUS_ITCTI 0x00800000 /* For 3.0 */ +#define TRAX_STATUS_ITATR 0x01000000 /* For 3.0 */ + + +/* TRAX Address register fields: */ +#define TRAX_ADDRESS_TWSAT 0x80000000 +#define TRAX_ADDRESS_TWSAT_SHIFT 31 +#define TRAX_ADDRESS_TOTALMASK 0x00FFFFFF +// !!! VUakiVU. added for new TRAX: +#define TRAX_ADDRESS_WRAPCNT 0x7FE00000 /* version ???... */ +#define TRAX_ADDRESS_WRAP_SHIFT 21 + +/* TRAX PCMatch register fields: */ +#define TRAX_PCMATCH_PCML 0x0000001F +#define TRAX_PCMATCH_PCML_SHIFT 0 +#define TRAX_PCMATCH_PCMS 0x80000000 + +/* Compute trace ram buffer size (in bytes) from status register: */ +#define TRAX_MEM_SIZE(status) (1L << (((status) & TRAX_STATUS_MEMSZ) >> TRAX_STATUS_MEMSZ_SHIFT)) + +#if 0 +/* Describes a field within a register: */ +typedef struct { + const char* name; +// unsigned width; +// unsigned shift; + char width; + char shift; + char visible; /* 0 = internal use only, 1 = shown */ + char reserved; +} trax_regfield_t; +#endif + +/* Describes a TRAX register: */ +typedef struct { + const char* name; + unsigned id; + char width; + char visible; + char writable; + char reserved; + //const trax_regfield_t * fieldset; +} trax_regdef_t; + + +extern const trax_regdef_t trax_reglist[]; +extern const signed int trax_readable_regs[]; +extern const signed int trax_unamed_header_regs[]; + +#ifdef __cplusplus +extern "C" { +#endif + +/* Prototypes: */ +extern int trax_find_reg(char * regname, char **errmsg); +extern const char * trax_regname(int regno); + +#ifdef __cplusplus +} +#endif + +#endif /* _TRAX_REGISTERS_H_ */ + diff --git a/arch/xtensa/include/esp32/xtensa/include/xtensa/xdm-regs.h b/arch/xtensa/include/esp32/xtensa/include/xtensa/xdm-regs.h new file mode 100644 index 0000000000000..d45ee323c59a6 --- /dev/null +++ b/arch/xtensa/include/esp32/xtensa/include/xtensa/xdm-regs.h @@ -0,0 +1,536 @@ +/* xdm-regs.h - Common register and related definitions for the XDM + (Xtensa Debug Module) */ + +/* Copyright (c) 2016 Cadence Design Systems Inc. + + 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 the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 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. */ + + +#ifndef _XDM_REGS_H_ +#define _XDM_REGS_H_ + +/* NOTE: This header file is included by C, assembler, and other sources. + So any C-specific or asm-specific content must be appropriately #ifdef'd. */ + + +/* + * XDM registers can be accessed using APB, ERI, or JTAG (via NAR). + * Address offsets for APB and ERI are the same, and for JTAG + * is different (due to the limited 7-bit NAR addressing). + * + * Here, we first provide the constants as APB / ERI address offsets. + * This is necessary for assembler code (which accesses XDM via ERI), + * because complex conversion macros between the two address maps + * don't work in the assembler. + * Conversion macros are used to convert these to/from JTAG (NAR), + * addresses, for software using JTAG. + */ +/* FIXME: maybe provide only MISC+CS registers here, and leave specific + subsystem registers in separate headers? eg. for TRAX, PERF, OCD */ + +/* XDM_.... ERI addr [NAR addr] Description...... */ + +/* TRAX */ +#define XDM_TRAX_ID 0x100000 /*[0x00] ID */ +#define XDM_TRAX_CONTROL 0x100004 /*[0x01] Control */ +#define XDM_TRAX_STATUS 0x100008 /*[0x02] Status */ +#define XDM_TRAX_DATA 0x10000C /*[0x03] Data */ +#define XDM_TRAX_ADDRESS 0x100010 /*[0x04] Address */ +#define XDM_TRAX_TRIGGER 0x100014 /*[0x05] Stop PC */ +#define XDM_TRAX_MATCH 0x100018 /*[0x06] Stop PC Range */ +#define XDM_TRAX_DELAY 0x10001C /*[0x07] Post Stop Trigger Capture Size */ +#define XDM_TRAX_STARTADDR 0x100020 /*[0x08] Trace Memory Start */ +#define XDM_TRAX_ENDADDR 0x100024 /*[0x09] Trace Memory End */ +#define XDM_TRAX_DEBUGPC 0x10003C /*[0x0F] Debug PC */ +#define XDM_TRAX_P4CHANGE 0x100040 /*[0x10] X */ +#define XDM_TRAX_TIME0 0x100040 /*[0x10] First Time Register */ +#define XDM_TRAX_P4REV 0x100044 /*[0x11] X */ +#define XDM_TRAX_TIME1 0x100044 /*[0x11] Second Time Register */ +#define XDM_TRAX_P4DATE 0x100048 /*[0x12] X */ +#define XDM_TRAX_INTTIME_MAX 0x100048 /*[0x12] maximal Value of Timestamp IntTime */ +#define XDM_TRAX_P4TIME 0x10004C /*[0x13] X */ +#define XDM_TRAX_PDSTATUS 0x100050 /*[0x14] Sample of PDebugStatus */ +#define XDM_TRAX_PDDATA 0x100054 /*[0x15] Sample of PDebugData */ +#define XDM_TRAX_STOP_PC 0x100058 /*[0x16] X */ +#define XDM_TRAX_STOP_ICNT 0x10005C /*[0x16] X */ +#define XDM_TRAX_MSG_STATUS 0x100060 /*[0x17] X */ +#define XDM_TRAX_FSM_STATUS 0x100064 /*[0x18] X */ +#define XDM_TRAX_IB_STATUS 0x100068 /*[0x19] X */ +#define XDM_TRAX_STOPCNT 0x10006C /*[0x1A] X */ + +/* Performance Monitoring Counters */ +#define XDM_PERF_PMG 0x101000 /*[0x20] perf. mon. global control register */ +#define XDM_PERF_INTPC 0x101010 /*[0x24] perf. mon. interrupt PC */ +#define XDM_PERF_PM0 0x101080 /*[0x28] perf. mon. counter 0 value */ +#define XDM_PERF_PM1 0x101084 /*[0x29] perf. mon. counter 1 value */ +#define XDM_PERF_PM2 0x101088 /*[0x2A] perf. mon. counter 2 value */ +#define XDM_PERF_PM3 0x10108C /*[0x2B] perf. mon. counter 3 value */ +#define XDM_PERF_PM4 0x101090 /*[0x2C] perf. mon. counter 4 value */ +#define XDM_PERF_PM5 0x101094 /*[0x2D] perf. mon. counter 5 value */ +#define XDM_PERF_PM6 0x101098 /*[0x2E] perf. mon. counter 6 value */ +#define XDM_PERF_PM7 0x10109C /*[0x2F] perf. mon. counter 7 value */ +#define XDM_PERF_PM(n) (0x101080+((n)<<2)) /* perfmon cnt n=0..7 value */ +#define XDM_PERF_PMCTRL0 0x101100 /*[0x30] perf. mon. counter 0 control */ +#define XDM_PERF_PMCTRL1 0x101104 /*[0x31] perf. mon. counter 1 control */ +#define XDM_PERF_PMCTRL2 0x101108 /*[0x32] perf. mon. counter 2 control */ +#define XDM_PERF_PMCTRL3 0x10110C /*[0x33] perf. mon. counter 3 control */ +#define XDM_PERF_PMCTRL4 0x101110 /*[0x34] perf. mon. counter 4 control */ +#define XDM_PERF_PMCTRL5 0x101114 /*[0x35] perf. mon. counter 5 control */ +#define XDM_PERF_PMCTRL6 0x101118 /*[0x36] perf. mon. counter 6 control */ +#define XDM_PERF_PMCTRL7 0x10111C /*[0x37] perf. mon. counter 7 control */ +#define XDM_PERF_PMCTRL(n) (0x101100+((n)<<2)) /* perfmon cnt n=0..7 control */ +#define XDM_PERF_PMSTAT0 0x101180 /*[0x38] perf. mon. counter 0 status */ +#define XDM_PERF_PMSTAT1 0x101184 /*[0x39] perf. mon. counter 1 status */ +#define XDM_PERF_PMSTAT2 0x101188 /*[0x3A] perf. mon. counter 2 status */ +#define XDM_PERF_PMSTAT3 0x10118C /*[0x3B] perf. mon. counter 3 status */ +#define XDM_PERF_PMSTAT4 0x101190 /*[0x3C] perf. mon. counter 4 status */ +#define XDM_PERF_PMSTAT5 0x101194 /*[0x3D] perf. mon. counter 5 status */ +#define XDM_PERF_PMSTAT6 0x101198 /*[0x3E] perf. mon. counter 6 status */ +#define XDM_PERF_PMSTAT7 0x10119C /*[0x3F] perf. mon. counter 7 status */ +#define XDM_PERF_PMSTAT(n) (0x101180+((n)<<2)) /* perfmon cnt n=0..7 status */ + +/* On-Chip-Debug (OCD) */ +#define XDM_OCD_ID 0x102000 /*[0x40] ID register */ +#define XDM_OCD_DCR_CLR 0x102008 /*[0x42] Debug Control reg clear */ +#define XDM_OCD_DCR_SET 0x10200C /*[0x43] Debug Control reg set */ +#define XDM_OCD_DSR 0x102010 /*[0x44] Debug Status reg */ +#define XDM_OCD_DDR 0x102014 /*[0x45] Debug Data reg */ +#define XDM_OCD_DDREXEC 0x102018 /*[0x46] Debug Data reg + execute-DIR */ +#define XDM_OCD_DIR0EXEC 0x10201C /*[0x47] Debug Instruction reg, word 0 + execute-DIR */ +#define XDM_OCD_DIR0 0x102020 /*[0x48] Debug Instruction reg, word 1 */ +#define XDM_OCD_DIR1 0x102024 /*[0x49] Debug Instruction reg, word 2 */ +#define XDM_OCD_DIR2 0x102028 /*[0x4A] Debug Instruction reg, word 3 */ +#define XDM_OCD_DIR3 0x10202C /*[0x49] Debug Instruction reg, word 4 */ +#define XDM_OCD_DIR4 0x102030 /*[0x4C] Debug Instruction reg, word 5 */ +#define XDM_OCD_DIR5 0x102034 /*[0x4D] Debug Instruction reg, word 5 */ +#define XDM_OCD_DIR6 0x102038 /*[0x4E] Debug Instruction reg, word 6 */ +#define XDM_OCD_DIR7 0x10203C /*[0x4F] Debug Instruction reg, word 7 */ + +/* Miscellaneous Registers */ +#define XDM_MISC_PWRCTL 0x103020 /*[0x58] Power and Reset Control */ +#define XDM_MISC_PWRSTAT 0x103024 /*[0x59] Power and Reset Status */ +#define XDM_MISC_ERISTAT 0x103028 /*[0x5A] ERI Transaction Status */ +#define XDM_MISC_DATETIME 0x103034 +#define XDM_MISC_CONFIGID1_V0 0x103034 /*[0x5D] [INTERNAL] ConfigID1 in XDM v0/1 */ +#define XDM_MISC_CONFIGID1_V2 0x10007c /*[0x1F] [INTERNAL] ConfigID1 since XDM v2 */ +#define XDM_MISC_CONFIGID0_V2 0x100078 /*[0x1E] [INTERNAL] ConfigID0 since XDM v2 */ +#define XDM_MISC_UBID 0x103038 /*[0x5E] [INTERNAL] Build Unique ID */ +#define XDM_MISC_CID 0x10303C /*[0x5F] [INTERNAL] Customer ID */ + +/* CoreSight compatibility */ +#define XDM_CS_ITCTRL 0x103F00 /*[0x60] InTegration Mode control reg */ +#define XDM_CS_CLAIMSET 0x103FA0 /*[0x68] Claim Tag Set reg */ +#define XDM_CS_CLAIMCLR 0x103FA4 /*[0x69] Claim Tag Clear reg */ +#define XDM_CS_LOCK_ACCESS 0x103FB0 /*[0x6B] Lock Access (writing 0xC5ACCE55 unlocks) */ +#define XDM_CS_LOCK_STATUS 0x103FB4 /*[0x6D] Lock Status */ +#define XDM_CS_AUTH_STATUS 0x103FB8 /*[0x6E] Authentication Status */ +#define XDM_CS_DEV_ID 0x103FC8 /*[0x72] Device ID */ +#define XDM_CS_DEV_TYPE 0x103FCC /*[0x73] Device Type */ +#define XDM_CS_PER_ID4 0x103FD0 /*[0x74] Peripheral ID reg byte 4 */ +#define XDM_CS_PER_ID5 0x103FD4 /*[0x75] Peripheral ID reg byte 5 */ +#define XDM_CS_PER_ID6 0x103FD8 /*[0x76] Peripheral ID reg byte 6 */ +#define XDM_CS_PER_ID7 0x103FDC /*[0x77] Peripheral ID reg byte 7 */ +#define XDM_CS_PER_ID0 0x103FE0 /*[0x78] Peripheral ID reg byte 0 */ +#define XDM_CS_PER_ID1 0x103FE4 /*[0x79] Peripheral ID reg byte 1 */ +#define XDM_CS_PER_ID2 0x103FE8 /*[0x7A] Peripheral ID reg byte 2 */ +#define XDM_CS_PER_ID3 0x103FEC /*[0x7B] Peripheral ID reg byte 3 */ +#define XDM_CS_COMP_ID0 0x103FF0 /*[0x7C] Component ID reg byte 0 */ +#define XDM_CS_COMP_ID1 0x103FF4 /*[0x7D] Component ID reg byte 1 */ +#define XDM_CS_COMP_ID2 0x103FF8 /*[0x7E] Component ID reg byte 2 */ +#define XDM_CS_COMP_ID3 0x103FFC /*[0x7F] Component ID reg byte 3 */ + +#define CS_PER_ID0 0x00000003 +#define CS_PER_ID1 0x00000021 +#define CS_PER_ID2 0x0000000f +#define CS_PER_ID3 0x00000000 +#define CS_PER_ID4 0x00000024 + +#define CS_COMP_ID0 0x0000000d +#define CS_COMP_ID1 0x00000090 +#define CS_COMP_ID2 0x00000005 +#define CS_COMP_ID3 0x000000b1 + +#define CS_DEV_TYPE 0x00000015 + +#define XTENSA_IDCODE 0x120034e5 // FIXME (upper bits not spec. out but BE is !) +#define XTENSA_MFC_ID (XTENSA_IDCODE & 0xFFF) +#define CS_DEV_ID XTENSA_IDCODE //FIXME - for XDM v0 only, for v2 is the new ID, that includes vars like PRID but also can be custom +#define CS_DEV_ID_v0_MASK 0x00000FFF // can compare only the lower 12 bits +#define CS_DEV_ID_v2_MASK 0xF0000000 // can compare only the upper 4 bits + +#define NXS_OCD_REG(val) ((val >= 0x40) && (val <= 0x5F)) +#define NXS_TRAX_REG(val) val <= 0x3F + +#define ERI_TRAX_REG(val) ((val & 0xFFFF) < 0x1000) +#define ERI_OCD_REG(val) ((val & 0xFFFF) >= 0x2000) && ((val & 0xFFFF) < 0x4000)) + +/* Convert above 14-bit ERI/APB address/offset to 7-bit NAR address: */ +#define _XDM_ERI_TO_NAR(a) ( ((a)&0x3F80)==0x0000 ? (((a)>>2) & 0x1F) \ + : ((a)&0x3E00)==0x1000 ? (0x20 | (((a)>>2) & 7) | (((a)>>4) & 0x18)) \ + : ((a)&0x3FC0)==0x2000 ? (0x40 | (((a)>>2) & 0xF)) \ + : ((a)&0x3FE0)==0x3020 ? (0x50 | (((a)>>2) & 0xF)) \ + : ((a)&0x3FFC)==0x3F00 ? 0x60 \ + : ((a)&0x3F80)==0x3F80 ? (0x60 | (((a)>>2) & 0x1F)) \ + : -1 ) + +#define XDM_ERI_TO_NAR(a) _XDM_ERI_TO_NAR(a & 0xFFFF) + +/* Convert 7-bit NAR address back to ERI/APB address/offset: */ +#define _XDM_NAR_TO_APB(a) ((a) <= 0x1f ? ((a) << 2) \ + :(a) >= 0x20 && (a) <= 0x3F ? (0x1000 | (((a)& 7) << 2) | (((a)&0x18)<<4)) \ + :(a) >= 0x40 && (a) <= 0x4F ? (0x2000 | (((a)&0xF) << 2)) \ + :(a) >= 0x58 && (a) <= 0x5F ? (0x3000 | (((a)&0xF) << 2)) \ + :(a) == 0x60 ? (0x3F00) \ + :(a) >= 0x68 && (a) <= 0x7F ? (0x3F80 | (((a)&0x1F) << 2)) \ + : -1) + +#define XDM_NAR_TO_APB(a) _XDM_NAR_TO_APB((a & 0xFFFF)) +#define XDM_NAR_TO_ERI(a) _XDM_NAR_TO_APB((a & 0xFFFF)) | 0x100000 + +/* Convert APB to ERI address */ +#define XDM_APB_TO_ERI(a) ((a) | (0x100000)) +#define XDM_ERI_TO_APB(a) ((a) & (0x0FFFFF)) + +/*********** Bit definitions within some of the above registers ***********/ +#define OCD_ID_LSDDRP 0x01000000 +#define OCD_ID_LSDDRP_SHIFT 24 +#define OCD_ID_ENDIANESS 0x00000001 +#define OCD_ID_ENDIANESS_SHIFT 0 +#define OCD_ID_PSO 0x0000000C +#define OCD_ID_PSO_SHIFT 2 +#define OCD_ID_TRACEPORT 0x00000080 +#define OCD_ID_TRACEPORT_SHIFT 7 + +#define OCD_ID_LSDDRP_XEA3 0x00000400 + +/* Power Status register. NOTE: different bit positions in JTAG vs. ERI/APB !! */ +/* ERI/APB: */ +#define PWRSTAT_CORE_DOMAIN_ON 0x00000001 /* set if core is powered on */ +#define PWRSTAT_CORE_DOMAIN_ON_SHIFT 0 +#define PWRSTAT_WAKEUP_RESET 0x00000002 /* [ERI only] 0=cold start, 1=PSO wakeup */ +#define PWRSTAT_WAKEUP_RESET_SHIFT 1 +#define PWRSTAT_CACHES_LOST_POWER 0x00000004 /* [ERI only] set if caches (/localmems?) lost power */ + /* FIXME: does this include local memories? */ +#define PWRSTAT_CACHES_LOST_POWER_SHIFT 2 +#define PWRSTAT_CORE_STILL_NEEDED 0x00000010 /* set if others keeping core awake */ +#define PWRSTAT_CORE_STILL_NEEDED_SHIFT 4 +#define PWRSTAT_MEM_DOMAIN_ON 0x00000100 /* set if memory domain is powered on */ +#define PWRSTAT_MEM_DOMAIN_ON_SHIFT 8 +#define PWRSTAT_DEBUG_DOMAIN_ON 0x00001000 /* set if debug domain is powered on */ +#define PWRSTAT_DEBUG_DOMAIN_ON_SHIFT 12 +#define PWRSTAT_ALL_ON (PWRSTAT_CORE_DOMAIN_ON | PWRSTAT_MEM_DOMAIN_ON | PWRSTAT_DEBUG_DOMAIN_ON) +#define PWRSTAT_CORE_WAS_RESET 0x00010000 /* [APB only] set if core got reset */ +#define PWRSTAT_CORE_WAS_RESET_SHIFT 16 +#define PWRSTAT_DEBUG_WAS_RESET 0x10000000 /* set if debug module got reset */ +#define PWRSTAT_DEBUG_WAS_RESET_SHIFT 28 +/* JTAG: */ +#define J_PWRSTAT_CORE_DOMAIN_ON 0x01 /* set if core is powered on */ +#define J_PWRSTAT_MEM_DOMAIN_ON 0x02 /* set if memory domain is powered on */ +#define J_PWRSTAT_DEBUG_DOMAIN_ON 0x04 /* set if debug domain is powered on */ +#define J_PWRSTAT_ALL_ON (J_PWRSTAT_CORE_DOMAIN_ON | J_PWRSTAT_MEM_DOMAIN_ON | J_PWRSTAT_DEBUG_DOMAIN_ON) +#define J_PWRSTAT_CORE_STILL_NEEDED 0x08 /* set if others keeping core awake */ +#define J_PWRSTAT_CORE_WAS_RESET 0x10 /* set if core got reset */ +#define J_PWRSTAT_DEBUG_WAS_RESET 0x40 /* set if debug module got reset */ + +/* Power Control register. NOTE: different bit positions in JTAG vs. ERI/APB !! */ +/* ERI/APB: */ +#define PWRCTL_CORE_SHUTOFF 0x00000001 /* [ERI only] core wants to shut off on WAITI */ +#define PWRCTL_CORE_SHUTOFF_SHIFT 0 +#define PWRCTL_CORE_WAKEUP 0x00000001 /* [APB only] set to force core to stay powered on */ +#define PWRCTL_CORE_WAKEUP_SHIFT 0 +#define PWRCTL_MEM_WAKEUP 0x00000100 /* set to force memory domain to stay powered on */ +#define PWRCTL_MEM_WAKEUP_SHIFT 8 +#define PWRCTL_DEBUG_WAKEUP 0x00001000 /* set to force debug domain to stay powered on */ +#define PWRCTL_DEBUG_WAKEUP_SHIFT 12 +#define PWRCTL_ALL_ON (PWRCTL_CORE_WAKEUP | PWRCTL_MEM_WAKEUP | PWRCTL_DEBUG_WAKEUP) +#define PWRCTL_CORE_RESET 0x00010000 /* [APB only] set to assert core reset */ +#define PWRCTL_CORE_RESET_SHIFT 16 +#define PWRCTL_DEBUG_RESET 0x10000000 /* set to assert debug module reset */ +#define PWRCTL_DEBUG_RESET_SHIFT 28 +/* JTAG: */ +#define J_PWRCTL_CORE_WAKEUP 0x01 /* set to force core to stay powered on */ +#define J_PWRCTL_MEM_WAKEUP 0x02 /* set to force memory domain to stay powered on */ +#define J_PWRCTL_DEBUG_WAKEUP 0x04 /* set to force debug domain to stay powered on */ +#define J_DEBUG_USE 0x80 /* */ +#define J_PWRCTL_ALL_ON (J_DEBUG_USE | J_PWRCTL_CORE_WAKEUP | J_PWRCTL_MEM_WAKEUP | J_PWRCTL_DEBUG_WAKEUP) +#define J_PWRCTL_DEBUG_ON J_DEBUG_USE | J_PWRCTL_DEBUG_WAKEUP +#define J_PWRCTL_CORE_RESET 0x10 /* set to assert core reset */ +#define J_PWRCTL_DEBUG_RESET 0x40 /* set to assert debug module reset */ + +#define J_PWRCTL_WRITE_MASK 0xFF +#define J_PWRSTAT_WRITE_MASK 0xFF + +#define PWRCTL_WRITE_MASK ~0 +#define PWRSTAT_WRITE_MASK ~0 + +/************ The following are only relevant for JTAG, so perhaps belong in OCD only **************/ + +/* XDM 5-bit JTAG Instruction Register (IR) values: */ +#define XDM_IR_PWRCTL 0x08 /* select 8-bit Power/Reset Control (PRC) */ +#define XDM_IR_PWRSTAT 0x09 /* select 8-bit Power/Reset Status (PRS) */ +#define XDM_IR_NAR_SEL 0x1c /* select altern. 8-bit NAR / 32-bit NDR (Nexus-style) */ +#define XDM_IR_NDR_SEL 0x1d /* select altern. 32-bit NDR / 8-bit NAR + (FIXME - functionality not yet in HW) */ +#define XDM_IR_IDCODE 0x1e /* select 32-bit JTAG IDCODE */ +#define XDM_IR_BYPASS 0x1f /* select 1-bit bypass */ + +#define XDM_IR_WIDTH 5 /* width of IR for Xtensa TAP */ + +/* NAR register bits: */ +#define XDM_NAR_WRITE 0x01 +#define XDM_NAR_ADDR_MASK 0xFE +#define XDM_NAR_ADDR_SHIFT 1 + +#define XDM_NAR_BUSY 0x02 +#define XDM_NAR_ERROR 0x01 + +#define NEXUS_DIR_READ 0x00 +#define NEXUS_DIR_WRITE 0x01 + +/************ Define DCR register bits **************/ + +#define DCR_ENABLEOCD 0x0000001 +#define DCR_ENABLEOCD_SHIFT 0 +#define DCR_DEBUG_INT 0x0000002 +#define DCR_DEBUG_INT_SHIFT 1 +#define DCR_DEBUG_OVERRIDE 0x0000004 //ER or later +#define DCR_DEBUG_OVERRIDE_SHIFT 2 +#define DCR_DEBUG_SS_REQ 0x0000008 +#define DCR_DEBUG_SS_REQ_SHIFT 3 +#define DCR_DEBUG_OVERRIDE_CW 0x0000010 //RD and earlier +#define DCR_DEBUG_OVERRIDE_CW_SHIFT 4 +#define DCR_MASK_NMI 0x0000020 +#define DCR_MASK_NMI_SHIFT 5 +#define DCR_STEP_ENABLE 0x0000040 +#define DCR_STEP_ENABLE_SHIFT 6 +#define DCR_BREAK_IN_EN 0x0010000 +#define DCR_BREAK_IN_EN_SHIFT 16 +#define DCR_BREAK_OUT_EN 0x0020000 +#define DCR_BREAK_OUT_EN_SHIFT 17 +#define DCR_DEBUG_INT_EN 0x0040000 +#define DCR_DEBUG_INT_EN_SHIFT 18 +#define DCR_DBG_SW_ACTIVE 0x0100000 +#define DCR_DBG_SW_ACTIVE_SHIFT 20 +#define DCR_STALL_IN_EN 0x0200000 +#define DCR_STALL_IN_EN_SHIFT 21 +#define DCR_DEBUG_OUT_EN 0x0400000 +#define DCR_DEBUG_OUT_EN_SHIFT 22 +#define DCR_BREAK_OUT_ITO 0x1000000 +#define DCR_STALL_OUT_ITO 0x2000000 +#define DCR_STALL_OUT_ITO_SHIFT 25 + +/************ Define DSR register bits **************/ + +#define DOSR_STOP_CAUSE_SHIFT 5 +#define DOSR_STOP_CAUSE_MASK 0xF + +#define DOSR_EXECDONE_SHIFT 0 +#define DOSR_EXECDONE_ER 0x01 +#define DOSR_EXECDONE_SHIFT 0 +#define DOSR_EXCEPTION_ER 0x02 +#define DOSR_EXCEPTION_SHIFT 1 +#define DOSR_BUSY 0x04 +#define DOSR_BUSY_SHIFT 2 +#define DOSR_OVERRUN 0x08 +#define DOSR_OVERRUN_SHIFT 3 +#define DOSR_INOCDMODE_ER 0x10 +#define DOSR_INOCDMODE_SHIFT 4 +#define DOSR_CORE_WROTE_DDR_ER 0x400 +#define DOSR_CORE_WROTE_DDR_SHIFT 10 +#define DOSR_CORE_READ_DDR_ER 0x800 +#define DOSR_CORE_READ_DDR_SHIFT 11 +#define DOSR_HOST_WROTE_DDR_ER 0x4000 +#define DOSR_HOST_WROTE_DDR_SHIFT 14 +#define DOSR_HOST_READ_DDR_ER 0x8000 +#define DOSR_HOST_READ_DDR_SHIFT 15 + +#define DOSR_DEBUG_PEND_BIN 0x10000 +#define DOSR_DEBUG_PEND_HOST 0x20000 +#define DOSR_DEBUG_PEND_TRAX 0x40000 +#define DOSR_DEBUG_BIN 0x100000 +#define DOSR_DEBUG_HOST 0x200000 +#define DOSR_DEBUG_TRAX 0x400000 +#define DOSR_DEBUG_PEND_BIN_SHIFT 16 +#define DOSR_DEBUG_PEND_HOST_SHIFT 17 +#define DOSR_DEBUG_PEND_TRAX_SHIFT 18 +#define DOSR_DEBUG_BREAKIN 0x0100000 +#define DOSR_DEBUG_BREAKIN_SHIFT 20 +#define DOSR_DEBUG_HOST_SHIFT 21 +#define DOSR_DEBUG_TRAX_SHIFT 22 + +#define DOSR_DEBUG_STALL 0x1000000 +#define DOSR_DEBUG_STALL_SHIFT 24 + +#define DOSR_CORE_ON 0x40000000 +#define DOSR_CORE_ON_SHIFT 30 +#define DOSR_DEBUG_ON 0x80000000 +#define DOSR_DEBUG_ON_SHIFT 31 + +/********** Performance monitor registers bits **********/ + +#define PERF_PMG_ENABLE 0x00000001 /* global enable bit */ +#define PERF_PMG_ENABLE_SHIFT 0 + +#define PERF_PMCTRL_INT_ENABLE 0x00000001 /* assert interrupt on overflow */ +#define PERF_PMCTRL_INT_ENABLE_SHIFT 0 +#define PERF_PMCTRL_KRNLCNT 0x00000008 /* ignore TRACELEVEL */ +#define PERF_PMCTRL_KRNLCNT_SHIFT 3 +#define PERF_PMCTRL_TRACELEVEL 0x000000F0 /* count when CINTLEVEL <= TRACELEVEL */ +#define PERF_PMCTRL_TRACELEVEL_SHIFT 4 +#define PERF_PMCTRL_SELECT 0x00001F00 /* events group selector */ +#define PERF_PMCTRL_SELECT_SHIFT 8 +#define PERF_PMCTRL_MASK 0xFFFF0000 /* events mask */ +#define PERF_PMCTRL_MASK_SHIFT 16 + +#define PERF_PMSTAT_OVERFLOW 0x00000001 /* counter overflowed */ +#define PERF_PMSTAT_OVERFLOW_SHIFT 0 +#define PERF_PMSTAT_INT 0x00000010 /* interrupt asserted */ +#define PERF_PMSTAT_INT_SHIFT 4 + +#if defined (USE_XDM_REGNAME) || defined (USE_DAP_REGNAME) +/* Describes XDM register: */ +typedef struct { + int reg; + char* name; +} regdef_t; + +/* + * Returns the name of the specified XDM register number, + * or simply "???" if the register number is not recognized. + * FIXME - requires -1 as the last entry - change to compare the name to ??? + * or even better, make the code above to work. + */ +static char* +regname(regdef_t* list, int reg) +{ + int i = 0; + while (list[i].reg != -1) { + if (list[i].reg == reg) + break; + i++; + } + return list[i].name; +} + +#if defined (USE_XDM_REGNAME) +static regdef_t xdm_reglist[] = +{ + {XDM_OCD_DSR ,"DOSR" }, + {XDM_OCD_DDR ,"DDR" }, + {XDM_OCD_DDREXEC ,"DDREXEC" }, + {XDM_OCD_DIR0EXEC ,"DIR0EXEC"}, + {XDM_OCD_DCR_CLR ,"DCR_CLR" }, + {XDM_OCD_DCR_SET ,"DCR_SET" }, + {XDM_TRAX_CONTROL ,"CONTROL" }, + {XDM_TRAX_STATUS ,"STATUS" }, + {XDM_TRAX_DATA ,"DATA" }, + {XDM_TRAX_ADDRESS ,"ADDRESS" }, + + {XDM_TRAX_ID ,"TRAX_ID" }, + + {XDM_TRAX_TRIGGER ,"TRIGGER PC" }, + {XDM_TRAX_MATCH ,"PC MATCH" }, + {XDM_TRAX_DELAY ,"DELAY CNT." }, + {XDM_TRAX_STARTADDR ,"START ADDRESS"}, + {XDM_TRAX_ENDADDR ,"END ADDRESS" }, + {XDM_TRAX_DEBUGPC ,"DEBUG PC" }, + {XDM_TRAX_P4CHANGE ,"P4 CHANGE" }, + {XDM_TRAX_P4REV ,"P4 REV." }, + {XDM_TRAX_P4DATE ,"P4 DATE" }, + {XDM_TRAX_P4TIME ,"P4 TIME" }, + {XDM_TRAX_PDSTATUS ,"PD STATUS" }, + {XDM_TRAX_PDDATA ,"PD DATA" }, + {XDM_TRAX_STOP_PC ,"STOP PC" }, + {XDM_TRAX_STOP_ICNT ,"STOP ICNT" }, + {XDM_TRAX_MSG_STATUS,"MSG STAT." }, + {XDM_TRAX_FSM_STATUS,"FSM STAT." }, + {XDM_TRAX_IB_STATUS ,"IB STAT." }, + + {XDM_OCD_ID ,"OCD_ID" }, + {XDM_OCD_DIR0 ,"DIR0" }, + {XDM_OCD_DIR1 ,"DIR1" }, + {XDM_OCD_DIR2 ,"DIR2" }, + {XDM_OCD_DIR3 ,"DIR3" }, + {XDM_OCD_DIR4 ,"DIR4" }, + {XDM_OCD_DIR5 ,"DIR5" }, + {XDM_OCD_DIR6 ,"DIR6" }, + {XDM_OCD_DIR7 ,"DIR7" }, + + {XDM_PERF_PMG ,"PMG" }, + {XDM_PERF_INTPC ,"INTPC" }, + {XDM_PERF_PM0 ,"PM0 " }, + {XDM_PERF_PM1 ,"PM1 " }, + {XDM_PERF_PM2 ,"PM2 " }, + {XDM_PERF_PM3 ,"PM3 " }, + {XDM_PERF_PM4 ,"PM4 " }, + {XDM_PERF_PM5 ,"PM5 " }, + {XDM_PERF_PM6 ,"PM6 " }, + {XDM_PERF_PM7 ,"PM7 " }, + {XDM_PERF_PMCTRL0 ,"PMCTRL0"}, + {XDM_PERF_PMCTRL1 ,"PMCTRL1"}, + {XDM_PERF_PMCTRL2 ,"PMCTRL2"}, + {XDM_PERF_PMCTRL3 ,"PMCTRL3"}, + {XDM_PERF_PMCTRL4 ,"PMCTRL4"}, + {XDM_PERF_PMCTRL5 ,"PMCTRL5"}, + {XDM_PERF_PMCTRL6 ,"PMCTRL6"}, + {XDM_PERF_PMCTRL7 ,"PMCTRL7"}, + {XDM_PERF_PMSTAT0 ,"PMSTAT0"}, + {XDM_PERF_PMSTAT1 ,"PMSTAT1"}, + {XDM_PERF_PMSTAT2 ,"PMSTAT2"}, + {XDM_PERF_PMSTAT3 ,"PMSTAT3"}, + {XDM_PERF_PMSTAT4 ,"PMSTAT4"}, + {XDM_PERF_PMSTAT5 ,"PMSTAT5"}, + {XDM_PERF_PMSTAT6 ,"PMSTAT6"}, + {XDM_PERF_PMSTAT7 ,"PMSTAT7"}, + + {XDM_MISC_PWRCTL ,"PWRCTL" }, + {XDM_MISC_PWRSTAT ,"PWRSTAT" }, + {XDM_MISC_ERISTAT ,"ERISTAT" }, + {XDM_MISC_DATETIME ,"DATETIME"}, + {XDM_MISC_UBID ,"UBID" }, + {XDM_MISC_CID ,"CID" }, + + {XDM_CS_ITCTRL ,"ITCTRL" }, + {XDM_CS_CLAIMSET ,"CLAIMSET" }, + {XDM_CS_CLAIMCLR ,"CLAIMCLR" }, + {XDM_CS_LOCK_ACCESS ,"LOCK_ACCESS"}, + {XDM_CS_LOCK_STATUS ,"LOCK_STATUS"}, + {XDM_CS_AUTH_STATUS ,"AUTH_STATUS"}, + {XDM_CS_DEV_ID ,"DEV_ID" }, + {XDM_CS_DEV_TYPE ,"DEV_TYPE" }, + {XDM_CS_PER_ID4 ,"PER_ID4" }, + {XDM_CS_PER_ID5 ,"PER_ID5" }, + {XDM_CS_PER_ID6 ,"PER_ID6" }, + {XDM_CS_PER_ID7 ,"PER_ID7" }, + {XDM_CS_PER_ID0 ,"PER_ID0" }, + {XDM_CS_PER_ID1 ,"PER_ID1" }, + {XDM_CS_PER_ID2 ,"PER_ID2" }, + {XDM_CS_PER_ID3 ,"PER_ID3" }, + {XDM_CS_COMP_ID0 ,"COMP_ID0" }, + {XDM_CS_COMP_ID1 ,"COMP_ID1" }, + {XDM_CS_COMP_ID2 ,"COMP_ID2" }, + {XDM_CS_COMP_ID3 ,"COMP_ID3" }, + {-1 ,"???" }, +}; +#endif + +#endif + +#endif /* _XDM_REGS_H_ */ diff --git a/arch/xtensa/include/esp32/xtensa/include/xtensa/xt_perf_consts.h b/arch/xtensa/include/esp32/xtensa/include/xtensa/xt_perf_consts.h new file mode 100644 index 0000000000000..a713ac9c19199 --- /dev/null +++ b/arch/xtensa/include/esp32/xtensa/include/xtensa/xt_perf_consts.h @@ -0,0 +1,325 @@ +/* + * Copyright (c) 2012 by Tensilica Inc. 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 the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER 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. + */ + +#ifndef __XT_PERF_CONSTS_H__ +#define __XT_PERF_CONSTS_H__ + +#include + +/* + * Performance monitor counter selectors + */ + +#define XTPERF_CNT_COMMITTED_INSN 0x8002 /* Instructions committed */ +#define XTPERF_CNT_BRANCH_PENALTY 0x8003 /* Branch penalty cycles */ +#define XTPERF_CNT_PIPELINE_INTERLOCKS 0x8004 /* Pipeline interlocks cycles */ +#define XTPERF_CNT_ICACHE_MISSES 0x8005 /* ICache misses penalty in cycles */ +#define XTPERF_CNT_DCACHE_MISSES 0x8006 /* DCache misses penalty in cycles */ + +#define XTPERF_CNT_CYCLES 0 /* Count cycles */ +#define XTPERF_CNT_OVERFLOW 1 /* Overflow of counter n-1 (assuming this is counter n) */ +#define XTPERF_CNT_INSN 2 /* Successfully completed instructions */ +#define XTPERF_CNT_D_STALL 3 /* Data-related GlobalStall cycles */ +#define XTPERF_CNT_I_STALL 4 /* Instruction-related and other GlobalStall cycles */ +#define XTPERF_CNT_EXR 5 /* Exceptions and pipeline replays */ +#define XTPERF_CNT_BUBBLES 6 /* Hold and other bubble cycles */ +#define XTPERF_CNT_I_TLB 7 /* Instruction TLB Accesses (per instruction retiring) */ +#define XTPERF_CNT_I_MEM 8 /* Instruction memory accesses (per instruction retiring) */ +#define XTPERF_CNT_D_TLB 9 /* Data TLB accesses */ +#define XTPERF_CNT_D_LOAD_U1 10 /* Data memory load instruction (load-store unit 1) */ +#define XTPERF_CNT_D_STORE_U1 11 /* Data memory store instruction (load-store unit 1) */ +#define XTPERF_CNT_D_ACCESS_U1 12 /* Data memory accesses (load, store, S32C1I, etc; load-store unit 1) */ +#define XTPERF_CNT_D_LOAD_U2 13 /* Data memory load instruction (load-store unit 2) */ +#define XTPERF_CNT_D_STORE_U2 14 /* Data memory store instruction (load-store unit 2) */ +#define XTPERF_CNT_D_ACCESS_U2 15 /* Data memory accesses (load, store, S32C1I, etc; load-store unit 2) */ +#define XTPERF_CNT_D_LOAD_U3 16 /* Data memory load instruction (load-store unit 3) */ +#define XTPERF_CNT_D_STORE_U3 17 /* Data memory store instruction (load-store unit 3) */ +#define XTPERF_CNT_D_ACCESS_U3 18 /* Data memory accesses (load, store, S32C1I, etc; load-store unit 3) */ +#define XTPERF_CNT_MULTIPLE_LS 22 /* Multiple Load/Store */ +#define XTPERF_CNT_OUTBOUND_PIF 23 /* Outbound PIF transactions */ +#define XTPERF_CNT_INBOUND_PIF 24 /* Inbound PIF transactions */ +#define XTPERF_CNT_PREFETCH 26 /* Prefetch events */ + +#if XCHAL_HW_VERSION >= 270004 + +#define XTPERF_CNT_IDMA 27 /* iDMA counters */ +#define XTPERF_CNT_INSN_LENGTH 28 /* Instruction length counters */ + +#endif /* HW version >= 270004 */ + +/* + * Masks for each of the selector listed above + */ + +/* XTPERF_CNT_COMMITTED_INSN selector mask */ + +#define XTPERF_MASK_COMMITTED_INSN 0x0001 + +/* XTPERF_CNT_BRANCH_PENALTY selector mask */ + +#define XTPERF_MASK_BRANCH_PENALTY 0x0001 + +/* XTPERF_CNT_PIPELINE_INTERLOCKS selector mask */ + +#define XTPERF_MASK_PIPELINE_INTERLOCKS 0x0001 + +/* XTPERF_CNT_ICACHE_MISSES selector mask */ + +#define XTPERF_MASK_ICACHE_MISSES 0x0001 + +/* XTPERF_CNT_DCACHE_MISSES selector mask */ + +#define XTPERF_MASK_DCACHE_MISSES 0x0001 + +/* XTPERF_CNT_CYCLES selector mask */ + +#define XTPERF_MASK_CYCLES 0x0001 + +/* XTPERF_CNT_OVERFLOW selector mask */ + +#define XTPERF_MASK_OVERFLOW 0x0001 + +/* + * XTPERF_CNT_INSN selector mask + */ + +#define XTPERF_MASK_INSN_ALL 0x8DFF + +#define XTPERF_MASK_INSN_JX 0x0001 /* JX */ +#define XTPERF_MASK_INSN_CALLX 0x0002 /* CALLXn */ +#define XTPERF_MASK_INSN_RET 0x0004 /* call return i.e. RET, RETW */ +#define XTPERF_MASK_INSN_RF 0x0008 /* supervisor return i.e. RFDE, RFE, RFI, RFWO, RFWU */ +#define XTPERF_MASK_INSN_BRANCH_TAKEN 0x0010 /* Conditional branch taken, or loopgtz/loopnez skips loop */ +#define XTPERF_MASK_INSN_J 0x0020 /* J */ +#define XTPERF_MASK_INSN_CALL 0x0040 /* CALLn */ +#define XTPERF_MASK_INSN_BRANCH_NOT_TAKEN 0x0080 /* Conditional branch fall through (aka. not-taken branch) */ +#define XTPERF_MASK_INSN_LOOP_TAKEN 0x0100 /* Loop instr falls into loop (aka. taken loop) */ +#define XTPERF_MASK_INSN_LOOP_BEG 0x0400 /* Loopback taken to LBEG */ +#define XTPERF_MASK_INSN_LOOP_END 0x0800 /* Loopback falls through to LEND */ +#define XTPERF_MASK_INSN_NON_BRANCH 0x8000 /* Non-branch instruction (aka. non-CTI) */ + +/* + * XTPERF_CNT_D_STALL selector mask + */ + +#define XTPERF_MASK_D_STALL_ALL 0x01FE + +#define XTPERF_MASK_D_STALL_STORE_BUF_FULL 0x0002 /* Store buffer full stall */ +#define XTPERF_MASK_D_STALL_STORE_BUF_CONFLICT 0x0004 /* Store buffer conflict stall */ +#define XTPERF_MASK_D_STALL_CACHE_MISS 0x0008 /* DCache-miss stall */ +#define XTPERF_MASK_D_STALL_BUSY 0x0010 /* Data RAM/ROM/XLMI busy stall */ +#define XTPERF_MASK_D_STALL_IN_PIF 0x0020 /* Data inbound-PIF request stall (incl s32c1i) */ +#define XTPERF_MASK_D_STALL_MHT_LOOKUP 0x0040 /* MHT lookup stall */ +#define XTPERF_MASK_D_STALL_UNCACHED_LOAD 0x0080 /* Uncached load stall (included in MHT lookup stall) */ +#define XTPERF_MASK_D_STALL_BANK_CONFLICT 0x0100 /* Bank-conflict stall */ + +/* + * XTPERF_CNT_I_STALL selector mask + */ + +#define XTPERF_MASK_I_STALL_ALL 0x01FF + +#define XTPERF_MASK_I_STALL_CACHE_MISS 0x0001 /* ICache-miss stall */ +#define XTPERF_MASK_I_STALL_BUSY 0x0002 /* Instruction RAM/ROM busy stall */ +#define XTPERF_MASK_I_STALL_IN_PIF 0x0004 /* Instruction RAM inbound-PIF request stall */ +#define XTPERF_MASK_I_STALL_TIE_PORT 0x0008 /* TIE port stall */ +#define XTPERF_MASK_I_STALL_EXTERNAL_SIGNAL 0x0010 /* External RunStall signal status */ +#define XTPERF_MASK_I_STALL_UNCACHED_FETCH 0x0020 /* Uncached fetch stall */ +#define XTPERF_MASK_I_STALL_FAST_L32R 0x0040 /* FastL32R stall */ +#define XTPERF_MASK_I_STALL_ITERATIVE_MUL 0x0080 /* Iterative multiply stall */ +#define XTPERF_MASK_I_STALL_ITERATIVE_DIV 0x0100 /* Iterative divide stall */ + +/* + * XTPERF_CNT_EXR selector mask + */ + +#define XTPERF_MASK_EXR_ALL 0x01FF + +#define XTPERF_MASK_EXR_REPLAYS 0x0001 /* Other Pipeline Replay (i.e. excludes $ miss etc.) */ +#define XTPERF_MASK_EXR_LEVEL1_INT 0x0002 /* Level-1 interrupt */ +#define XTPERF_MASK_EXR_LEVELH_INT 0x0004 /* Greater-than-level-1 interrupt */ +#define XTPERF_MASK_EXR_DEBUG 0x0008 /* Debug exception */ +#define XTPERF_MASK_EXR_NMI 0x0010 /* NMI */ +#define XTPERF_MASK_EXR_WINDOW 0x0020 /* Window exception */ +#define XTPERF_MASK_EXR_ALLOCA 0x0040 /* Alloca exception */ +#define XTPERF_MASK_EXR_OTHER 0x0080 /* Other exceptions */ +#define XTPERF_MASK_EXR_MEM_ERR 0x0100 /* HW-corrected memory error */ + +/* + * XTPERF_CNT_BUBBLES selector mask + */ + +#define XTPERF_MASK_BUBBLES_ALL 0x01FD + +#define XTPERF_MASK_BUBBLES_PSO 0x0001 /* Processor domain PSO bubble */ +#define XTPERF_MASK_BUBBLES_R_HOLD_D_CACHE_MISS 0x0004 /* R hold caused by DCache miss */ +#define XTPERF_MASK_BUBBLES_R_HOLD_STORE_RELEASE 0x0008 /* R hold caused by Store release */ +#define XTPERF_MASK_BUBBLES_R_HOLD_REG_DEP 0x0010 /* R hold caused by register dependency */ +#define XTPERF_MASK_BUBBLES_R_HOLD_WAIT 0x0020 /* R hold caused by MEMW, EXTW or EXCW */ +#define XTPERF_MASK_BUBBLES_R_HOLD_HALT 0x0040 /* R hold caused by Halt instruction (TX only) */ +#define XTPERF_MASK_BUBBLES_CTI 0x0080 /* CTI bubble (e.g. branch delay slot) */ +#define XTPERF_MASK_BUBBLES_WAITI 0x0100 /* WAITI bubble */ + +/* + * XTPERF_CNT_I_TLB selector mask + */ + +#define XTPERF_MASK_I_TLB_ALL 0x000F + +#define XTPERF_MASK_I_TLB_HITS 0x0001 /* Hit */ +#define XTPERF_MASK_I_TLB_REPLAYS 0x0002 /* Replay of instruction due to ITLB miss */ +#define XTPERF_MASK_I_TLB_REFILLS 0x0004 /* HW-assisted TLB Refill completes */ +#define XTPERF_MASK_I_TLB_MISSES 0x0008 /* ITLB Miss Exception */ + +/* + * XTPERF_CNT_I_MEM selector mask + */ + +#define XTPERF_MASK_I_MEM_ALL 0x000F + +#define XTPERF_MASK_I_MEM_CACHE_HITS 0x0001 /* ICache Hit */ +#define XTPERF_MASK_I_MEM_CACHE_MISSES 0x0002 /* ICache Miss (includes uncached) */ +#define XTPERF_MASK_I_MEM_IRAM 0x0004 /* InstRAM or InstROM */ +#define XTPERF_MASK_I_MEM_BYPASS 0x0008 /* Bypass (i.e. uncached) fetch */ + +/* + * XTPERF_CNT_D_TLB selector mask + */ + +#define XTPERF_MASK_D_TLB_ALL 0x000F + +#define XTPERF_MASK_D_TLB_HITS 0x0001 /* Hit */ +#define XTPERF_MASK_D_TLB_REPLAYS 0x0002 /* Replay of instruction due to DTLB miss */ +#define XTPERF_MASK_D_TLB_REFILLS 0x0004 /* HW-assisted TLB Refill completes */ +#define XTPERF_MASK_D_TLB_MISSES 0x0008 /* DTLB Miss Exception */ + +/* + * XTPERF_CNT_D_LOAD_U* selector mask + */ + +#define XTPERF_MASK_D_LOAD_ALL 0x000F + +#define XTPERF_MASK_D_LOAD_CACHE_HITS 0x0001 /* Cache Hit */ +#define XTPERF_MASK_D_LOAD_CACHE_MISSES 0x0002 /* Cache Miss */ +#define XTPERF_MASK_D_LOAD_LOCAL_MEM 0x0004 /* Local memory hit */ +#define XTPERF_MASK_D_LOAD_BYPASS 0x0008 /* Bypass (i.e. uncached) load */ + +/* + * XTPERF_CNT_D_STORE_U* selector mask + */ + +#define XTPERF_MASK_D_STORE_ALL 0x000F + +#define XTPERF_MASK_D_STORE_CACHE_HITS 0x0001 /* DCache Hit */ +#define XTPERF_MASK_D_STORE_CACHE_MISSES 0x0002 /* DCache Miss */ +#define XTPERF_MASK_D_STORE_LOCAL_MEM 0x0004 /* Local memory hit */ +#define XTPERF_MASK_D_STORE_PIF 0x0008 /* PIF Store */ + +/* + * XTPERF_CNT_D_ACCESS_U* selector mask + */ + +#define XTPERF_MASK_D_ACCESS_ALL 0x000F + +#define XTPERF_MASK_D_ACCESS_CACHE_MISSES 0x0001 /* DCache Miss */ +#define XTPERF_MASK_D_ACCESS_HITS_SHARED 0x0002 /* Hit Shared */ +#define XTPERF_MASK_D_ACCESS_HITS_EXCLUSIVE 0x0004 /* Hit Exclusive */ +#define XTPERF_MASK_D_ACCESS_HITS_MODIFIED 0x0008 /* Hit Modified */ + +/* + * XTPERF_CNT_MULTIPLE_LS selector mask + */ + +#define XTPERF_MASK_MULTIPLE_LS_ALL 0x003F + +#define XTPERF_MASK_MULTIPLE_LS_0S_0L 0x0001 /* 0 stores and 0 loads */ +#define XTPERF_MASK_MULTIPLE_LS_0S_1L 0x0002 /* 0 stores and 1 loads */ +#define XTPERF_MASK_MULTIPLE_LS_1S_0L 0x0004 /* 1 stores and 0 loads */ +#define XTPERF_MASK_MULTIPLE_LS_1S_1L 0x0008 /* 1 stores and 1 loads */ +#define XTPERF_MASK_MULTIPLE_LS_0S_2L 0x0010 /* 0 stores and 2 loads */ +#define XTPERF_MASK_MULTIPLE_LS_2S_0L 0x0020 /* 2 stores and 0 loads */ + +/* + * XTPERF_CNT_OUTBOUND_PIF selector mask + */ + +#define XTPERF_MASK_OUTBOUND_PIF_ALL 0x0003 + +#define XTPERF_MASK_OUTBOUND_PIF_CASTOUT 0x0001 /* Castout */ +#define XTPERF_MASK_OUTBOUND_PIF_PREFETCH 0x0002 /* Prefetch */ + +/* + * XTPERF_CNT_INBOUND_PIF selector mask + */ + +#define XTPERF_MASK_INBOUND_PIF_ALL 0x0003 + +#define XTPERF_MASK_INBOUND_PIF_I_DMA 0x0001 /* Instruction DMA */ +#define XTPERF_MASK_INBOUND_PIF_D_DMA 0x0002 /* Data DMA */ + +/* + * XTPERF_CNT_PREFETCH selector mask + */ + +#define XTPERF_MASK_PREFETCH_ALL 0x002F + +#define XTPERF_MASK_PREFETCH_I_HIT 0x0001 /* I prefetch-buffer-lookup hit */ +#define XTPERF_MASK_PREFETCH_D_HIT 0x0002 /* D prefetch-buffer-lookup hit */ +#define XTPERF_MASK_PREFETCH_I_MISS 0x0004 /* I prefetch-buffer-lookup miss */ +#define XTPERF_MASK_PREFETCH_D_MISS 0x0008 /* D prefetch-buffer-lookup miss */ +#define XTPERF_MASK_PREFETCH_D_L1_FILL 0x0020 /* Fill directly to DCache L1 */ + +#if XCHAL_HW_VERSION >= 270004 + +/* + * XTPERF_CNT_IDMA selector mask + */ + +#define XTPERF_MASK_IDMA_ALL 0x0001 + +#define XTPERF_MASK_IDMA_ACTIVE_CYCLES 0x0001 /* Active Cycles */ + +/* + * XTPERF_CNT_INSN_LENGTH selector mask + */ + +#define XTPERF_MASK_INSN_LENGTH_ALL 0x7FFF + +#define XTPERF_MASK_INSN_LENGTH_16 0x0001 /* 16-bit instruction length */ +#define XTPERF_MASK_INSN_LENGTH_24 0x0002 /* 24-bit instruction length */ +#define XTPERF_MASK_INSN_LENGTH_32 0x0004 /* 32-bit instruction length */ +#define XTPERF_MASK_INSN_LENGTH_40 0x0008 /* 40-bit instruction length */ +#define XTPERF_MASK_INSN_LENGTH_48 0x0010 /* 48-bit instruction length */ +#define XTPERF_MASK_INSN_LENGTH_56 0x0020 /* 56-bit instruction length */ +#define XTPERF_MASK_INSN_LENGTH_64 0x0040 /* 64-bit instruction length */ +#define XTPERF_MASK_INSN_LENGTH_72 0x0080 /* 72-bit instruction length */ +#define XTPERF_MASK_INSN_LENGTH_80 0x0100 /* 80-bit instruction length */ +#define XTPERF_MASK_INSN_LENGTH_88 0x0200 /* 88-bit instruction length */ +#define XTPERF_MASK_INSN_LENGTH_96 0x0400 /* 96-bit instruction length */ +#define XTPERF_MASK_INSN_LENGTH_104 0x0800 /* 104-bit instruction length */ +#define XTPERF_MASK_INSN_LENGTH_112 0x1000 /* 112-bit instruction length */ +#define XTPERF_MASK_INSN_LENGTH_120 0x2000 /* 120-bit instruction length */ +#define XTPERF_MASK_INSN_LENGTH_128 0x4000 /* 128-bit instruction length */ + +#endif /* HW version >= 270004 */ + +#endif /* __XT_PERF_CONSTS_H__ */ diff --git a/arch/xtensa/include/esp32/xtensa/include/xtensa/xtensa-libdb-macros.h b/arch/xtensa/include/esp32/xtensa/include/xtensa/xtensa-libdb-macros.h new file mode 100644 index 0000000000000..c9d275452bdf3 --- /dev/null +++ b/arch/xtensa/include/esp32/xtensa/include/xtensa/xtensa-libdb-macros.h @@ -0,0 +1,161 @@ +/* + * xtensa-libdb-macros.h + */ + +/* $Id: //depot/rel/Foxhill/dot.9/Xtensa/Software/libdb/xtensa-libdb-macros.h#1 $ */ + +/* Copyright (c) 2004-2008 Tensilica Inc. + + 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 the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 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. */ + +#ifndef __H_LIBDB_MACROS +#define __H_LIBDB_MACROS + +/* + * This header file provides macros used to construct, identify and use + * "target numbers" that are assigned to various types of Xtensa processor + * registers and states. These target numbers are used by GDB in the remote + * protocol, and are thus used by all GDB debugger agents (targets). + * They are also used in ELF debugger information sections (stabs, dwarf, etc). + * + * These macros are separated from xtensa-libdb.h because they are needed + * by certain debugger agents that do not use or have access to libdb, + * e.g. the OCD daemon, RedBoot, XMON, etc. + * + * For the time being, for compatibility with certain 3rd party debugger + * software vendors, target numbers are limited to 16 bits. It is + * conceivable that this will be extended in the future to 32 bits. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef uint32 + #define uint32 unsigned int +#endif +#ifndef int32 + #define int32 int +#endif + + +/* + * Macros to form register "target numbers" for various standard registers/states: + */ +#define XTENSA_DBREGN_INVALID -1 /* not a valid target number */ +#define XTENSA_DBREGN_A(n) (0x0000+(n)) /* address registers a0..a15 */ +#define XTENSA_DBREGN_B(n) (0x0010+(n)) /* boolean bits b0..b15 */ +#define XTENSA_DBREGN_PC 0x0020 /* program counter */ + /* 0x0021 RESERVED for use by Tensilica */ +#define XTENSA_DBREGN_BO(n) (0x0022+(n)) /* boolean octuple-bits bo0..bo1 */ +#define XTENSA_DBREGN_BQ(n) (0x0024+(n)) /* boolean quadruple-bits bq0..bq3 */ +#define XTENSA_DBREGN_BD(n) (0x0028+(n)) /* boolean double-bits bd0..bd7 */ +#define XTENSA_DBREGN_F(n) (0x0030+(n)) /* floating point registers f0..f15 */ +#define XTENSA_DBREGN_VEC(n) (0x0040+(n)) /* Vectra vec regs v0..v15 */ +#define XTENSA_DBREGN_VSEL(n) (0x0050+(n)) /* Vectra sel s0..s3 (V1) ..s7 (V2) */ +#define XTENSA_DBREGN_VALIGN(n) (0x0058+(n)) /* Vectra valign regs u0..u3 */ +#define XTENSA_DBREGN_VCOEFF(n) (0x005C+(n)) /* Vectra I vcoeff regs c0..c1 */ + /* 0x005E..0x005F RESERVED for use by Tensilica */ +#define XTENSA_DBREGN_AEP(n) (0x0060+(n)) /* HiFi2 Audio Engine regs aep0..aep7 */ +#define XTENSA_DBREGN_AEQ(n) (0x0068+(n)) /* HiFi2 Audio Engine regs aeq0..aeq3 */ + /* 0x006C..0x00FF RESERVED for use by Tensilica */ +#define XTENSA_DBREGN_AR(n) (0x0100+(n)) /* physical address regs ar0..ar63 + (note: only with window option) */ + /* 0x0140..0x01FF RESERVED for use by Tensilica */ +#define XTENSA_DBREGN_SREG(n) (0x0200+(n)) /* special registers 0..255 (core) */ +#define XTENSA_DBREGN_BR XTENSA_DBREGN_SREG(0x04) /* all 16 boolean bits, BR */ +#define XTENSA_DBREGN_MR(n) XTENSA_DBREGN_SREG(0x20+(n)) /* MAC16 registers m0..m3 */ +#define XTENSA_DBREGN_UREG(n) (0x0300+(n)) /* user registers 0..255 (TIE) */ + /* 0x0400..0x0FFF RESERVED for use by Tensilica */ + /* 0x1000..0x1FFF user-defined regfiles */ + /* 0x2000..0xEFFF other states (and regfiles) */ +#define XTENSA_DBREGN_DBAGENT(n) (0xF000+(n)) /* non-processor "registers" 0..4095 for + 3rd-party debugger agent defined use */ + /* > 0xFFFF (32-bit) RESERVED for use by Tensilica */ +/*#define XTENSA_DBREGN_CONTEXT(n) (0x02000000+((n)<<20))*/ /* add this macro's value to a target + number to identify a specific context 0..31 + for context-replicated registers */ +#define XTENSA_DBREGN_MASK 0xFFFF /* mask of valid target_number bits */ +#define XTENSA_DBREGN_WRITE_SIDE 0x04000000 /* flag to request write half of a register + split into distinct read and write entries + with the same target number (currently only + valid in a couple of libdb API functions; + see xtensa-libdb.h for details) */ + +/* + * Macros to identify specific ranges of target numbers (formed above): + * NOTE: any context number (or other upper 12 bits) are considered + * modifiers and are thus stripped out for identification purposes. + */ +#define XTENSA_DBREGN_IS_VALID(tn) (((tn) & ~0xFFFF) == 0) /* just tests it's 16-bit unsigned */ +#define XTENSA_DBREGN_IS_A(tn) (((tn) & 0xFFF0)==0x0000) /* is a0..a15 */ +#define XTENSA_DBREGN_IS_B(tn) (((tn) & 0xFFF0)==0x0010) /* is b0..b15 */ +#define XTENSA_DBREGN_IS_PC(tn) (((tn) & 0xFFFF)==0x0020) /* is program counter */ +#define XTENSA_DBREGN_IS_BO(tn) (((tn) & 0xFFFE)==0x0022) /* is bo0..bo1 */ +#define XTENSA_DBREGN_IS_BQ(tn) (((tn) & 0xFFFC)==0x0024) /* is bq0..bq3 */ +#define XTENSA_DBREGN_IS_BD(tn) (((tn) & 0xFFF8)==0x0028) /* is bd0..bd7 */ +#define XTENSA_DBREGN_IS_F(tn) (((tn) & 0xFFF0)==0x0030) /* is f0..f15 */ +#define XTENSA_DBREGN_IS_VEC(tn) (((tn) & 0xFFF0)==0x0040) /* is v0..v15 */ +#define XTENSA_DBREGN_IS_VSEL(tn) (((tn) & 0xFFF8)==0x0050) /* is s0..s7 (s0..s3 in V1) */ +#define XTENSA_DBREGN_IS_VALIGN(tn) (((tn) & 0xFFFC)==0x0058) /* is u0..u3 */ +#define XTENSA_DBREGN_IS_VCOEFF(tn) (((tn) & 0xFFFE)==0x005C) /* is c0..c1 */ +#define XTENSA_DBREGN_IS_AEP(tn) (((tn) & 0xFFF8)==0x0060) /* is aep0..aep7 */ +#define XTENSA_DBREGN_IS_AEQ(tn) (((tn) & 0xFFFC)==0x0068) /* is aeq0..aeq3 */ +#define XTENSA_DBREGN_IS_AR(tn) (((tn) & 0xFFC0)==0x0100) /* is ar0..ar63 */ +#define XTENSA_DBREGN_IS_SREG(tn) (((tn) & 0xFF00)==0x0200) /* is special register */ +#define XTENSA_DBREGN_IS_BR(tn) (((tn) & 0xFFFF)==XTENSA_DBREGN_SREG(0x04)) /* is BR */ +#define XTENSA_DBREGN_IS_MR(tn) (((tn) & 0xFFFC)==XTENSA_DBREGN_SREG(0x20)) /* m0..m3 */ +#define XTENSA_DBREGN_IS_UREG(tn) (((tn) & 0xFF00)==0x0300) /* is user register */ +#define XTENSA_DBREGN_IS_DBAGENT(tn) (((tn) & 0xF000)==0xF000) /* is non-processor */ +/*#define XTENSA_DBREGN_IS_CONTEXT(tn) (((tn) & 0x02000000) != 0)*/ /* specifies context # */ + +/* + * Macros to extract register index from a register "target number" + * when a specific range has been identified using one of the _IS_ macros above. + * These macros only return a useful value if the corresponding _IS_ macro returns true. + */ +#define XTENSA_DBREGN_A_INDEX(tn) ((tn) & 0x0F) /* 0..15 for a0..a15 */ +#define XTENSA_DBREGN_B_INDEX(tn) ((tn) & 0x0F) /* 0..15 for b0..b15 */ +#define XTENSA_DBREGN_BO_INDEX(tn) ((tn) & 0x01) /* 0..1 for bo0..bo1 */ +#define XTENSA_DBREGN_BQ_INDEX(tn) ((tn) & 0x03) /* 0..3 for bq0..bq3 */ +#define XTENSA_DBREGN_BD_INDEX(tn) ((tn) & 0x07) /* 0..7 for bd0..bd7 */ +#define XTENSA_DBREGN_F_INDEX(tn) ((tn) & 0x0F) /* 0..15 for f0..f15 */ +#define XTENSA_DBREGN_VEC_INDEX(tn) ((tn) & 0x0F) /* 0..15 for v0..v15 */ +#define XTENSA_DBREGN_VSEL_INDEX(tn) ((tn) & 0x07) /* 0..7 for s0..s7 */ +#define XTENSA_DBREGN_VALIGN_INDEX(tn) ((tn) & 0x03) /* 0..3 for u0..u3 */ +#define XTENSA_DBREGN_VCOEFF_INDEX(tn) ((tn) & 0x01) /* 0..1 for c0..c1 */ +#define XTENSA_DBREGN_AEP_INDEX(tn) ((tn) & 0x07) /* 0..7 for aep0..aep7 */ +#define XTENSA_DBREGN_AEQ_INDEX(tn) ((tn) & 0x03) /* 0..3 for aeq0..aeq3 */ +#define XTENSA_DBREGN_AR_INDEX(tn) ((tn) & 0x3F) /* 0..63 for ar0..ar63 */ +#define XTENSA_DBREGN_SREG_INDEX(tn) ((tn) & 0xFF) /* 0..255 for special registers */ +#define XTENSA_DBREGN_MR_INDEX(tn) ((tn) & 0x03) /* 0..3 for m0..m3 */ +#define XTENSA_DBREGN_UREG_INDEX(tn) ((tn) & 0xFF) /* 0..255 for user registers */ +#define XTENSA_DBREGN_DBAGENT_INDEX(tn) ((tn) & 0xFFF) /* 0..4095 for non-processor */ +/*#define XTENSA_DBREGN_CONTEXT_INDEX(tn) (((tn) >> 20) & 0x1F)*/ /* 0..31 context numbers */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __H_LIBDB_MACROS */ + diff --git a/arch/xtensa/include/esp32/xtensa/include/xtensa/xtensa-versions.h b/arch/xtensa/include/esp32/xtensa/include/xtensa/xtensa-versions.h new file mode 100644 index 0000000000000..9a5819ff0b6dc --- /dev/null +++ b/arch/xtensa/include/esp32/xtensa/include/xtensa/xtensa-versions.h @@ -0,0 +1,404 @@ +/* + xtensa-versions.h -- definitions of Xtensa version and release numbers + + This file defines most Xtensa-related product versions and releases + that exist so far. + It also provides a bit of information about which ones are current. + This file changes every release, as versions/releases get added. + +*/ +// $Id: //depot/rel/Foxhill/dot.9/Xtensa/Software/misc/xtensa-versions.h.tpp#1 $ + +/* + Copyright (c) 2006-2018 Tensilica Inc. + + 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 the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 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. +*/ + +#ifndef XTENSA_VERSIONS_H +#define XTENSA_VERSIONS_H + + +/* + * NOTE: A "release" is a collection of product versions + * made available at once (together) to customers. + * In the past, release and version names all matched in T####.# form, + * making the distinction irrelevant. + * Starting with the RA-2004.1 release, this is no longer the case. + */ + + +/* Hardware (Xtensa/Diamond processor) versions: */ +#define XTENSA_HWVERSION_T1020_0 102000 /* versions T1020.0 */ +#define XTENSA_HWCIDSCHEME_T1020_0 10 +#define XTENSA_HWCIDVERS_T1020_0 2 +#define XTENSA_HWVERSION_T1020_1 102001 /* versions T1020.1 */ +#define XTENSA_HWCIDSCHEME_T1020_1 10 +#define XTENSA_HWCIDVERS_T1020_1 3 +#define XTENSA_HWVERSION_T1020_2 102002 /* versions T1020.2 */ +#define XTENSA_HWCIDSCHEME_T1020_2 10 +#define XTENSA_HWCIDVERS_T1020_2 4 +#define XTENSA_HWVERSION_T1020_2B 102002 /* versions T1020.2b */ +#define XTENSA_HWCIDSCHEME_T1020_2B 10 +#define XTENSA_HWCIDVERS_T1020_2B 5 +#define XTENSA_HWVERSION_T1020_3 102003 /* versions T1020.3 */ +#define XTENSA_HWCIDSCHEME_T1020_3 10 +#define XTENSA_HWCIDVERS_T1020_3 6 +#define XTENSA_HWVERSION_T1020_4 102004 /* versions T1020.4 */ +#define XTENSA_HWCIDSCHEME_T1020_4 10 +#define XTENSA_HWCIDVERS_T1020_4 7 +#define XTENSA_HWVERSION_T1030_0 103000 /* versions T1030.0 */ +#define XTENSA_HWCIDSCHEME_T1030_0 10 +#define XTENSA_HWCIDVERS_T1030_0 9 +#define XTENSA_HWVERSION_T1030_1 103001 /* versions T1030.1 */ +#define XTENSA_HWCIDSCHEME_T1030_1 10 +#define XTENSA_HWCIDVERS_T1030_1 10 +#define XTENSA_HWVERSION_T1030_2 103002 /* versions T1030.2 */ +#define XTENSA_HWCIDSCHEME_T1030_2 10 +#define XTENSA_HWCIDVERS_T1030_2 11 +#define XTENSA_HWVERSION_T1030_3 103003 /* versions T1030.3 */ +#define XTENSA_HWCIDSCHEME_T1030_3 10 +#define XTENSA_HWCIDVERS_T1030_3 12 +#define XTENSA_HWVERSION_T1040_0 104000 /* versions T1040.0 */ +#define XTENSA_HWCIDSCHEME_T1040_0 10 +#define XTENSA_HWCIDVERS_T1040_0 15 +#define XTENSA_HWVERSION_T1040_1 104001 /* versions T1040.1 */ +#define XTENSA_HWCIDSCHEME_T1040_1 1 +#define XTENSA_HWCIDVERS_T1040_1 32 +#define XTENSA_HWVERSION_T1040_1P 104001 /* versions T1040.1-prehotfix */ +#define XTENSA_HWCIDSCHEME_T1040_1P 10 +#define XTENSA_HWCIDVERS_T1040_1P 16 +#define XTENSA_HWVERSION_T1040_2 104002 /* versions T1040.2 */ +#define XTENSA_HWCIDSCHEME_T1040_2 1 +#define XTENSA_HWCIDVERS_T1040_2 33 +#define XTENSA_HWVERSION_T1040_3 104003 /* versions T1040.3 */ +#define XTENSA_HWCIDSCHEME_T1040_3 1 +#define XTENSA_HWCIDVERS_T1040_3 34 +#define XTENSA_HWVERSION_T1050_0 105000 /* versions T1050.0 */ +#define XTENSA_HWCIDSCHEME_T1050_0 1100 +#define XTENSA_HWCIDVERS_T1050_0 1 +#define XTENSA_HWVERSION_T1050_1 105001 /* versions T1050.1 */ +#define XTENSA_HWCIDSCHEME_T1050_1 1100 +#define XTENSA_HWCIDVERS_T1050_1 2 +#define XTENSA_HWVERSION_T1050_2 105002 /* versions T1050.2 */ +#define XTENSA_HWCIDSCHEME_T1050_2 1100 +#define XTENSA_HWCIDVERS_T1050_2 4 +#define XTENSA_HWVERSION_T1050_3 105003 /* versions T1050.3 */ +#define XTENSA_HWCIDSCHEME_T1050_3 1100 +#define XTENSA_HWCIDVERS_T1050_3 6 +#define XTENSA_HWVERSION_T1050_4 105004 /* versions T1050.4 */ +#define XTENSA_HWCIDSCHEME_T1050_4 1100 +#define XTENSA_HWCIDVERS_T1050_4 7 +#define XTENSA_HWVERSION_T1050_5 105005 /* versions T1050.5 */ +#define XTENSA_HWCIDSCHEME_T1050_5 1100 +#define XTENSA_HWCIDVERS_T1050_5 8 +#define XTENSA_HWVERSION_RA_2004_1 210000 /* versions LX1.0.0 */ +#define XTENSA_HWCIDSCHEME_RA_2004_1 1100 +#define XTENSA_HWCIDVERS_RA_2004_1 3 +#define XTENSA_HWVERSION_RA_2005_1 210001 /* versions LX1.0.1 */ +#define XTENSA_HWCIDSCHEME_RA_2005_1 1100 +#define XTENSA_HWCIDVERS_RA_2005_1 20 +#define XTENSA_HWVERSION_RA_2005_2 210002 /* versions LX1.0.2 */ +#define XTENSA_HWCIDSCHEME_RA_2005_2 1100 +#define XTENSA_HWCIDVERS_RA_2005_2 21 +#define XTENSA_HWVERSION_RA_2005_3 210003 /* versions LX1.0.3, X6.0.3 */ +#define XTENSA_HWCIDSCHEME_RA_2005_3 1100 +#define XTENSA_HWCIDVERS_RA_2005_3 22 +#define XTENSA_HWVERSION_RA_2006_4 210004 /* versions LX1.0.4, X6.0.4 */ +#define XTENSA_HWCIDSCHEME_RA_2006_4 1100 +#define XTENSA_HWCIDVERS_RA_2006_4 23 +#define XTENSA_HWVERSION_RA_2006_5 210005 /* versions LX1.0.5, X6.0.5 */ +#define XTENSA_HWCIDSCHEME_RA_2006_5 1100 +#define XTENSA_HWCIDVERS_RA_2006_5 24 +#define XTENSA_HWVERSION_RA_2006_6 210006 /* versions LX1.0.6, X6.0.6 */ +#define XTENSA_HWCIDSCHEME_RA_2006_6 1100 +#define XTENSA_HWCIDVERS_RA_2006_6 25 +#define XTENSA_HWVERSION_RA_2007_7 210007 /* versions LX1.0.7, X6.0.7 */ +#define XTENSA_HWCIDSCHEME_RA_2007_7 1100 +#define XTENSA_HWCIDVERS_RA_2007_7 26 +#define XTENSA_HWVERSION_RA_2008_8 210008 /* versions LX1.0.8, X6.0.8 */ +#define XTENSA_HWCIDSCHEME_RA_2008_8 1100 +#define XTENSA_HWCIDVERS_RA_2008_8 27 +#define XTENSA_HWVERSION_RB_2006_0 220000 /* versions LX2.0.0, X7.0.0 */ +#define XTENSA_HWCIDSCHEME_RB_2006_0 1100 +#define XTENSA_HWCIDVERS_RB_2006_0 48 +#define XTENSA_HWVERSION_RB_2007_1 220001 /* versions LX2.0.1, X7.0.1 */ +#define XTENSA_HWCIDSCHEME_RB_2007_1 1100 +#define XTENSA_HWCIDVERS_RB_2007_1 49 +#define XTENSA_HWVERSION_RB_2007_2 221000 /* versions LX2.1.0, X7.1.0 */ +#define XTENSA_HWCIDSCHEME_RB_2007_2 1100 +#define XTENSA_HWCIDVERS_RB_2007_2 52 +#define XTENSA_HWVERSION_RB_2008_3 221001 /* versions LX2.1.1, X7.1.1 */ +#define XTENSA_HWCIDSCHEME_RB_2008_3 1100 +#define XTENSA_HWCIDVERS_RB_2008_3 53 +#define XTENSA_HWVERSION_RB_2008_4 221002 /* versions LX2.1.2, X7.1.2 */ +#define XTENSA_HWCIDSCHEME_RB_2008_4 1100 +#define XTENSA_HWCIDVERS_RB_2008_4 54 +#define XTENSA_HWVERSION_RB_2009_5 221003 /* versions LX2.1.3, X7.1.3 */ +#define XTENSA_HWCIDSCHEME_RB_2009_5 1100 +#define XTENSA_HWCIDVERS_RB_2009_5 55 +#define XTENSA_HWVERSION_RB_2007_2_MP 221100 /* versions LX2.1.8-MP, X7.1.8-MP */ +#define XTENSA_HWCIDSCHEME_RB_2007_2_MP 1100 +#define XTENSA_HWCIDVERS_RB_2007_2_MP 64 +#define XTENSA_HWVERSION_RC_2009_0 230000 /* versions LX3.0.0, X8.0.0, MX1.0.0 */ +#define XTENSA_HWCIDSCHEME_RC_2009_0 1100 +#define XTENSA_HWCIDVERS_RC_2009_0 65 +#define XTENSA_HWVERSION_RC_2010_1 230001 /* versions LX3.0.1, X8.0.1, MX1.0.1 */ +#define XTENSA_HWCIDSCHEME_RC_2010_1 1100 +#define XTENSA_HWCIDVERS_RC_2010_1 66 +#define XTENSA_HWVERSION_RC_2010_2 230002 /* versions LX3.0.2, X8.0.2, MX1.0.2 */ +#define XTENSA_HWCIDSCHEME_RC_2010_2 1100 +#define XTENSA_HWCIDVERS_RC_2010_2 67 +#define XTENSA_HWVERSION_RC_2011_3 230003 /* versions LX3.0.3, X8.0.3, MX1.0.3 */ +#define XTENSA_HWCIDSCHEME_RC_2011_3 1100 +#define XTENSA_HWCIDVERS_RC_2011_3 68 +#define XTENSA_HWVERSION_RD_2010_0 240000 /* versions LX4.0.0, X9.0.0, MX1.1.0, TX1.0.0 */ +#define XTENSA_HWCIDSCHEME_RD_2010_0 1100 +#define XTENSA_HWCIDVERS_RD_2010_0 80 +#define XTENSA_HWVERSION_RD_2011_1 240001 /* versions LX4.0.1, X9.0.1, MX1.1.1, TX1.0.1 */ +#define XTENSA_HWCIDSCHEME_RD_2011_1 1100 +#define XTENSA_HWCIDVERS_RD_2011_1 81 +#define XTENSA_HWVERSION_RD_2011_2 240002 /* versions LX4.0.2, X9.0.2, MX1.1.2, TX1.0.2 */ +#define XTENSA_HWCIDSCHEME_RD_2011_2 1100 +#define XTENSA_HWCIDVERS_RD_2011_2 82 +#define XTENSA_HWVERSION_RD_2011_3 240003 /* versions LX4.0.3, X9.0.3, MX1.1.3, TX1.0.3 */ +#define XTENSA_HWCIDSCHEME_RD_2011_3 1100 +#define XTENSA_HWCIDVERS_RD_2011_3 83 +#define XTENSA_HWVERSION_RD_2012_4 240004 /* versions LX4.0.4, X9.0.4, MX1.1.4, TX1.0.4 */ +#define XTENSA_HWCIDSCHEME_RD_2012_4 1100 +#define XTENSA_HWCIDVERS_RD_2012_4 84 +#define XTENSA_HWVERSION_RD_2012_5 240005 /* versions LX4.0.5, X9.0.5, MX1.1.5, TX1.0.5 */ +#define XTENSA_HWCIDSCHEME_RD_2012_5 1100 +#define XTENSA_HWCIDVERS_RD_2012_5 85 +#define XTENSA_HWVERSION_RE_2012_0 250000 /* versions LX5.0.0, X10.0.0, MX1.2.0 */ +#define XTENSA_HWCIDSCHEME_RE_2012_0 1100 +#define XTENSA_HWCIDVERS_RE_2012_0 96 +#define XTENSA_HWVERSION_RE_2012_1 250001 /* versions LX5.0.1, X10.0.1, MX1.2.1 */ +#define XTENSA_HWCIDSCHEME_RE_2012_1 1100 +#define XTENSA_HWCIDVERS_RE_2012_1 97 +#define XTENSA_HWVERSION_RE_2013_2 250002 /* versions LX5.0.2, X10.0.2, MX1.2.2 */ +#define XTENSA_HWCIDSCHEME_RE_2013_2 1100 +#define XTENSA_HWCIDVERS_RE_2013_2 98 +#define XTENSA_HWVERSION_RE_2013_3 250003 /* versions LX5.0.3, X10.0.3, MX1.2.3 */ +#define XTENSA_HWCIDSCHEME_RE_2013_3 1100 +#define XTENSA_HWCIDVERS_RE_2013_3 99 +#define XTENSA_HWVERSION_RE_2013_4 250004 /* versions LX5.0.4, X10.0.4, MX1.2.4 */ +#define XTENSA_HWCIDSCHEME_RE_2013_4 1100 +#define XTENSA_HWCIDVERS_RE_2013_4 100 +#define XTENSA_HWVERSION_RE_2014_5 250005 /* versions LX5.0.5, X10.0.5, MX1.2.5 */ +#define XTENSA_HWCIDSCHEME_RE_2014_5 1100 +#define XTENSA_HWCIDVERS_RE_2014_5 101 +#define XTENSA_HWVERSION_RE_2015_6 250006 /* versions LX5.0.6, X10.0.6, MX1.2.6 */ +#define XTENSA_HWCIDSCHEME_RE_2015_6 1100 +#define XTENSA_HWCIDVERS_RE_2015_6 102 +#define XTENSA_HWVERSION_RF_2014_0 260000 /* versions LX6.0.0, X11.0.0, MX1.3.0 */ +#define XTENSA_HWCIDSCHEME_RF_2014_0 1100 +#define XTENSA_HWCIDVERS_RF_2014_0 112 +#define XTENSA_HWVERSION_RF_2014_1 260001 /* versions LX6.0.1, X11.0.1 */ +#define XTENSA_HWCIDSCHEME_RF_2014_1 1100 +#define XTENSA_HWCIDVERS_RF_2014_1 113 +#define XTENSA_HWVERSION_RF_2015_2 260002 /* versions LX6.0.2, X11.0.2 */ +#define XTENSA_HWCIDSCHEME_RF_2015_2 1100 +#define XTENSA_HWCIDVERS_RF_2015_2 114 +#define XTENSA_HWVERSION_RF_2015_3 260003 /* versions LX6.0.3, X11.0.3 */ +#define XTENSA_HWCIDSCHEME_RF_2015_3 1100 +#define XTENSA_HWCIDVERS_RF_2015_3 115 +#define XTENSA_HWVERSION_RF_2016_4 260004 /* versions LX6.0.4, X11.0.4 */ +#define XTENSA_HWCIDSCHEME_RF_2016_4 1100 +#define XTENSA_HWCIDVERS_RF_2016_4 116 +#define XTENSA_HWVERSION_RG_2015_0 270000 /* versions LX7.0.0 */ +#define XTENSA_HWCIDSCHEME_RG_2015_0 1100 +#define XTENSA_HWCIDVERS_RG_2015_0 128 +#define XTENSA_HWVERSION_RG_2015_1 270001 /* versions LX7.0.1 */ +#define XTENSA_HWCIDSCHEME_RG_2015_1 1100 +#define XTENSA_HWCIDVERS_RG_2015_1 129 +#define XTENSA_HWVERSION_RG_2015_2 270002 /* versions LX7.0.2 */ +#define XTENSA_HWCIDSCHEME_RG_2015_2 1100 +#define XTENSA_HWCIDVERS_RG_2015_2 130 +#define XTENSA_HWVERSION_RG_2016_3 270003 /* versions LX7.0.3 */ +#define XTENSA_HWCIDSCHEME_RG_2016_3 1100 +#define XTENSA_HWCIDVERS_RG_2016_3 131 +#define XTENSA_HWVERSION_RG_2016_4 270004 /* versions LX7.0.4 */ +#define XTENSA_HWCIDSCHEME_RG_2016_4 1100 +#define XTENSA_HWCIDVERS_RG_2016_4 132 +#define XTENSA_HWVERSION_RG_2017_5 270005 /* versions LX7.0.5 */ +#define XTENSA_HWCIDSCHEME_RG_2017_5 1100 +#define XTENSA_HWCIDVERS_RG_2017_5 133 +#define XTENSA_HWVERSION_RG_2017_6 270006 /* versions LX7.0.6 */ +#define XTENSA_HWCIDSCHEME_RG_2017_6 1100 +#define XTENSA_HWCIDVERS_RG_2017_6 134 +#define XTENSA_HWVERSION_RG_2017_7 270007 /* versions LX7.0.7 */ +#define XTENSA_HWCIDSCHEME_RG_2017_7 1100 +#define XTENSA_HWCIDVERS_RG_2017_7 135 +#define XTENSA_HWVERSION_RG_2017_8 270008 /* versions LX7.0.8 */ +#define XTENSA_HWCIDSCHEME_RG_2017_8 1100 +#define XTENSA_HWCIDVERS_RG_2017_8 136 +#define XTENSA_HWVERSION_RG_2018_9 270009 /* versions LX7.0.9 */ +#define XTENSA_HWCIDSCHEME_RG_2018_9 1100 +#define XTENSA_HWCIDVERS_RG_2018_9 137 +#define XTENSA_HWVERSION_RH_2016_0 280000 /* versions LX8.0.0, NX1.0.0, SX1.0.0 */ +#define XTENSA_HWCIDSCHEME_RH_2016_0 1100 +#define XTENSA_HWCIDVERS_RH_2016_0 144 + +/* Software (Xtensa Tools) versions: */ +#define XTENSA_SWVERSION_T1020_0 102000 /* versions T1020.0 */ +#define XTENSA_SWVERSION_T1020_1 102001 /* versions T1020.1 */ +#define XTENSA_SWVERSION_T1020_2 102002 /* versions T1020.2 */ +#define XTENSA_SWVERSION_T1020_2B 102002 /* versions T1020.2b */ +#define XTENSA_SWVERSION_T1020_3 102003 /* versions T1020.3 */ +#define XTENSA_SWVERSION_T1020_4 102004 /* versions T1020.4 */ +#define XTENSA_SWVERSION_T1030_0 103000 /* versions T1030.0 */ +#define XTENSA_SWVERSION_T1030_1 103001 /* versions T1030.1 */ +#define XTENSA_SWVERSION_T1030_2 103002 /* versions T1030.2 */ +#define XTENSA_SWVERSION_T1030_3 103003 /* versions T1030.3 */ +#define XTENSA_SWVERSION_T1040_0 104000 /* versions T1040.0 */ +#define XTENSA_SWVERSION_T1040_1 104001 /* versions T1040.1 */ +#define XTENSA_SWVERSION_T1040_1P 104001 /* versions T1040.1-prehotfix */ +#define XTENSA_SWVERSION_T1040_2 104002 /* versions T1040.2 */ +#define XTENSA_SWVERSION_T1040_3 104003 /* versions T1040.3 */ +#define XTENSA_SWVERSION_T1050_0 105000 /* versions T1050.0 */ +#define XTENSA_SWVERSION_T1050_1 105001 /* versions T1050.1 */ +#define XTENSA_SWVERSION_T1050_2 105002 /* versions T1050.2 */ +#define XTENSA_SWVERSION_T1050_3 105003 /* versions T1050.3 */ +#define XTENSA_SWVERSION_T1050_4 105004 /* versions T1050.4 */ +#define XTENSA_SWVERSION_T1050_5 105005 /* versions T1050.5 */ +#define XTENSA_SWVERSION_RA_2004_1 600000 /* versions 6.0.0 */ +#define XTENSA_SWVERSION_RA_2005_1 600001 /* versions 6.0.1 */ +#define XTENSA_SWVERSION_RA_2005_2 600002 /* versions 6.0.2 */ +#define XTENSA_SWVERSION_RA_2005_3 600003 /* versions 6.0.3 */ +#define XTENSA_SWVERSION_RA_2006_4 600004 /* versions 6.0.4 */ +#define XTENSA_SWVERSION_RA_2006_5 600005 /* versions 6.0.5 */ +#define XTENSA_SWVERSION_RA_2006_6 600006 /* versions 6.0.6 */ +#define XTENSA_SWVERSION_RA_2007_7 600007 /* versions 6.0.7 */ +#define XTENSA_SWVERSION_RA_2008_8 600008 /* versions 6.0.8 */ +#define XTENSA_SWVERSION_RB_2006_0 700000 /* versions 7.0.0 */ +#define XTENSA_SWVERSION_RB_2007_1 700001 /* versions 7.0.1 */ +#define XTENSA_SWVERSION_RB_2007_2 701000 /* versions 7.1.0 */ +#define XTENSA_SWVERSION_RB_2008_3 701001 /* versions 7.1.1 */ +#define XTENSA_SWVERSION_RB_2008_4 701002 /* versions 7.1.2 */ +#define XTENSA_SWVERSION_RB_2009_5 701003 /* versions 7.1.3 */ +#define XTENSA_SWVERSION_RB_2007_2_MP 701100 /* versions 7.1.8-MP */ +#define XTENSA_SWVERSION_RC_2009_0 800000 /* versions 8.0.0 */ +#define XTENSA_SWVERSION_RC_2010_1 800001 /* versions 8.0.1 */ +#define XTENSA_SWVERSION_RC_2010_2 800002 /* versions 8.0.2 */ +#define XTENSA_SWVERSION_RC_2011_3 800003 /* versions 8.0.3 */ +#define XTENSA_SWVERSION_RD_2010_0 900000 /* versions 9.0.0 */ +#define XTENSA_SWVERSION_RD_2011_1 900001 /* versions 9.0.1 */ +#define XTENSA_SWVERSION_RD_2011_2 900002 /* versions 9.0.2 */ +#define XTENSA_SWVERSION_RD_2011_3 900003 /* versions 9.0.3 */ +#define XTENSA_SWVERSION_RD_2012_4 900004 /* versions 9.0.4 */ +#define XTENSA_SWVERSION_RD_2012_5 900005 /* versions 9.0.5 */ +#define XTENSA_SWVERSION_RE_2012_0 1000000 /* versions 10.0.0 */ +#define XTENSA_SWVERSION_RE_2012_1 1000001 /* versions 10.0.1 */ +#define XTENSA_SWVERSION_RE_2013_2 1000002 /* versions 10.0.2 */ +#define XTENSA_SWVERSION_RE_2013_3 1000003 /* versions 10.0.3 */ +#define XTENSA_SWVERSION_RE_2013_4 1000004 /* versions 10.0.4 */ +#define XTENSA_SWVERSION_RE_2014_5 1000005 /* versions 10.0.5 */ +#define XTENSA_SWVERSION_RE_2015_6 1000006 /* versions 10.0.6 */ +#define XTENSA_SWVERSION_RF_2014_0 1100000 /* versions 11.0.0 */ +#define XTENSA_SWVERSION_RF_2014_1 1100001 /* versions 11.0.1 */ +#define XTENSA_SWVERSION_RF_2015_2 1100002 /* versions 11.0.2 */ +#define XTENSA_SWVERSION_RF_2015_3 1100003 /* versions 11.0.3 */ +#define XTENSA_SWVERSION_RF_2016_4 1100004 /* versions 11.0.4 */ +#define XTENSA_SWVERSION_RG_2015_0 1200000 /* versions 12.0.0 */ +#define XTENSA_SWVERSION_RG_2015_1 1200001 /* versions 12.0.1 */ +#define XTENSA_SWVERSION_RG_2015_2 1200002 /* versions 12.0.2 */ +#define XTENSA_SWVERSION_RG_2016_3 1200003 /* versions 12.0.3 */ +#define XTENSA_SWVERSION_RG_2016_4 1200004 /* versions 12.0.4 */ +#define XTENSA_SWVERSION_RG_2017_5 1200005 /* versions 12.0.5 */ +#define XTENSA_SWVERSION_RG_2017_6 1200006 /* versions 12.0.6 */ +#define XTENSA_SWVERSION_RG_2017_7 1200007 /* versions 12.0.7 */ +#define XTENSA_SWVERSION_RG_2017_8 1200008 /* versions 12.0.8 */ +#define XTENSA_SWVERSION_RG_2018_9 1200009 /* versions 12.0.9 */ +#define XTENSA_SWVERSION_RH_2016_0 1300000 /* versions 13.0.0 */ +#define XTENSA_SWVERSION_T1040_1_PREHOTFIX XTENSA_SWVERSION_T1040_1P /* T1040.1-prehotfix */ +#define XTENSA_SWVERSION_6_0_0 XTENSA_SWVERSION_RA_2004_1 /* 6.0.0 */ +#define XTENSA_SWVERSION_6_0_1 XTENSA_SWVERSION_RA_2005_1 /* 6.0.1 */ +#define XTENSA_SWVERSION_6_0_2 XTENSA_SWVERSION_RA_2005_2 /* 6.0.2 */ +#define XTENSA_SWVERSION_6_0_3 XTENSA_SWVERSION_RA_2005_3 /* 6.0.3 */ +#define XTENSA_SWVERSION_6_0_4 XTENSA_SWVERSION_RA_2006_4 /* 6.0.4 */ +#define XTENSA_SWVERSION_6_0_5 XTENSA_SWVERSION_RA_2006_5 /* 6.0.5 */ +#define XTENSA_SWVERSION_6_0_6 XTENSA_SWVERSION_RA_2006_6 /* 6.0.6 */ +#define XTENSA_SWVERSION_6_0_7 XTENSA_SWVERSION_RA_2007_7 /* 6.0.7 */ +#define XTENSA_SWVERSION_6_0_8 XTENSA_SWVERSION_RA_2008_8 /* 6.0.8 */ +#define XTENSA_SWVERSION_7_0_0 XTENSA_SWVERSION_RB_2006_0 /* 7.0.0 */ +#define XTENSA_SWVERSION_7_0_1 XTENSA_SWVERSION_RB_2007_1 /* 7.0.1 */ +#define XTENSA_SWVERSION_7_1_0 XTENSA_SWVERSION_RB_2007_2 /* 7.1.0 */ +#define XTENSA_SWVERSION_7_1_1 XTENSA_SWVERSION_RB_2008_3 /* 7.1.1 */ +#define XTENSA_SWVERSION_7_1_2 XTENSA_SWVERSION_RB_2008_4 /* 7.1.2 */ +#define XTENSA_SWVERSION_7_1_3 XTENSA_SWVERSION_RB_2009_5 /* 7.1.3 */ +#define XTENSA_SWVERSION_7_1_8_MP XTENSA_SWVERSION_RB_2007_2_MP /* 7.1.8-MP */ +#define XTENSA_SWVERSION_8_0_0 XTENSA_SWVERSION_RC_2009_0 /* 8.0.0 */ +#define XTENSA_SWVERSION_8_0_1 XTENSA_SWVERSION_RC_2010_1 /* 8.0.1 */ +#define XTENSA_SWVERSION_8_0_2 XTENSA_SWVERSION_RC_2010_2 /* 8.0.2 */ +#define XTENSA_SWVERSION_8_0_3 XTENSA_SWVERSION_RC_2011_3 /* 8.0.3 */ +#define XTENSA_SWVERSION_9_0_0 XTENSA_SWVERSION_RD_2010_0 /* 9.0.0 */ +#define XTENSA_SWVERSION_9_0_1 XTENSA_SWVERSION_RD_2011_1 /* 9.0.1 */ +#define XTENSA_SWVERSION_9_0_2 XTENSA_SWVERSION_RD_2011_2 /* 9.0.2 */ +#define XTENSA_SWVERSION_9_0_3 XTENSA_SWVERSION_RD_2011_3 /* 9.0.3 */ +#define XTENSA_SWVERSION_9_0_4 XTENSA_SWVERSION_RD_2012_4 /* 9.0.4 */ +#define XTENSA_SWVERSION_9_0_5 XTENSA_SWVERSION_RD_2012_5 /* 9.0.5 */ +#define XTENSA_SWVERSION_10_0_0 XTENSA_SWVERSION_RE_2012_0 /* 10.0.0 */ +#define XTENSA_SWVERSION_10_0_1 XTENSA_SWVERSION_RE_2012_1 /* 10.0.1 */ +#define XTENSA_SWVERSION_10_0_2 XTENSA_SWVERSION_RE_2013_2 /* 10.0.2 */ +#define XTENSA_SWVERSION_10_0_3 XTENSA_SWVERSION_RE_2013_3 /* 10.0.3 */ +#define XTENSA_SWVERSION_10_0_4 XTENSA_SWVERSION_RE_2013_4 /* 10.0.4 */ +#define XTENSA_SWVERSION_10_0_5 XTENSA_SWVERSION_RE_2014_5 /* 10.0.5 */ +#define XTENSA_SWVERSION_10_0_6 XTENSA_SWVERSION_RE_2015_6 /* 10.0.6 */ +#define XTENSA_SWVERSION_11_0_0 XTENSA_SWVERSION_RF_2014_0 /* 11.0.0 */ +#define XTENSA_SWVERSION_11_0_1 XTENSA_SWVERSION_RF_2014_1 /* 11.0.1 */ +#define XTENSA_SWVERSION_11_0_2 XTENSA_SWVERSION_RF_2015_2 /* 11.0.2 */ +#define XTENSA_SWVERSION_11_0_3 XTENSA_SWVERSION_RF_2015_3 /* 11.0.3 */ +#define XTENSA_SWVERSION_11_0_4 XTENSA_SWVERSION_RF_2016_4 /* 11.0.4 */ +#define XTENSA_SWVERSION_12_0_0 XTENSA_SWVERSION_RG_2015_0 /* 12.0.0 */ +#define XTENSA_SWVERSION_12_0_1 XTENSA_SWVERSION_RG_2015_1 /* 12.0.1 */ +#define XTENSA_SWVERSION_12_0_2 XTENSA_SWVERSION_RG_2015_2 /* 12.0.2 */ +#define XTENSA_SWVERSION_12_0_3 XTENSA_SWVERSION_RG_2016_3 /* 12.0.3 */ +#define XTENSA_SWVERSION_12_0_4 XTENSA_SWVERSION_RG_2016_4 /* 12.0.4 */ +#define XTENSA_SWVERSION_12_0_5 XTENSA_SWVERSION_RG_2017_5 /* 12.0.5 */ +#define XTENSA_SWVERSION_12_0_6 XTENSA_SWVERSION_RG_2017_6 /* 12.0.6 */ +#define XTENSA_SWVERSION_12_0_7 XTENSA_SWVERSION_RG_2017_7 /* 12.0.7 */ +#define XTENSA_SWVERSION_12_0_8 XTENSA_SWVERSION_RG_2017_8 /* 12.0.8 */ +#define XTENSA_SWVERSION_12_0_9 XTENSA_SWVERSION_RG_2018_9 /* 12.0.9 */ +#define XTENSA_SWVERSION_13_0_0 XTENSA_SWVERSION_RH_2016_0 /* 13.0.0 */ + + +/* The current release: */ +#define XTENSA_RELEASE_NAME "RG-2018.9" +#define XTENSA_RELEASE_CANONICAL_NAME "RG-2018.9" + +/* The product versions within the current release: */ +#define XTENSA_SWVERSION XTENSA_SWVERSION_RG_2018_9 +#define XTENSA_SWVERSION_NAME "12.0.9" +#define XTENSA_SWVERSION_NAME_IDENT 12_0_9 +#define XTENSA_SWVERSION_CANONICAL_NAME "12.0.9" +#define XTENSA_SWVERSION_MAJORMID_NAME "12.0" +#define XTENSA_SWVERSION_MAJOR_NAME "12" +/* For product licensing (not necessarily same as *_MAJORMID_NAME): */ +#define XTENSA_SWVERSION_LICENSE_NAME "12.0" + +/* Note: there may be multiple hardware products in one release, + and software can target older hardware, so the notion of + "current" hardware versions is partially configuration dependent. + For now, "current" hardware product version info is left out + to avoid confusion. */ + +#endif /*XTENSA_VERSIONS_H*/ + diff --git a/arch/xtensa/include/esp32/xtensa/include/xtensa/xtensa-xer.h b/arch/xtensa/include/esp32/xtensa/include/xtensa/xtensa-xer.h new file mode 100644 index 0000000000000..900bda3338434 --- /dev/null +++ b/arch/xtensa/include/esp32/xtensa/include/xtensa/xtensa-xer.h @@ -0,0 +1,149 @@ +/* xer-constants.h -- various constants describing external registers accessed + via wer and rer. + + TODO: find a better prefix. Also conditionalize certain constants based + on number of cores and interrupts actually present. +*/ + +/* + * Copyright (c) 1999-2008 Tensilica Inc. + * + * 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 the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 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. + */ + +#include + +#define NUM_INTERRUPTS 27 +#define NUM_CORES 4 + +/* Routing of NMI (BInterrupt2) and interrupts 0..n-1 (BInterrupt3+) + RER reads + WER writes + */ + +#define XER_MIROUT 0x0000 +#define XER_MIROUT_LAST (XER_MIROUT + NUM_INTERRUPTS) + + +/* IPI to core M (all 16 causes). + + RER reads + WER clears + */ +#define XER_MIPICAUSE 0x0100 +#define XER_MIPICAUSE_FIELD_A_FIRST 0x0 +#define XER_MIPICAUSE_FIELD_A_LAST 0x0 +#define XER_MIPICAUSE_FIELD_B_FIRST 0x1 +#define XER_MIPICAUSE_FIELD_B_LAST 0x3 +#define XER_MIPICAUSE_FIELD_C_FIRST 0x4 +#define XER_MIPICAUSE_FIELD_C_LAST 0x7 +#define XER_MIPICAUSE_FIELD_D_FIRST 0x8 +#define XER_MIPICAUSE_FIELD_D_LAST 0xF + + +/* IPI from cause bit 0..15 + + RER invalid + WER sets +*/ +#define XER_MIPISET 0x0140 +#define XER_MIPISET_LAST 0x014F + + +/* Global enable + + RER read + WER clear +*/ +#define XER_MIENG 0x0180 + + +/* Global enable + + RER invalid + WER set +*/ +#define XER_MIENG_SET 0x0184 + +/* Global assert + + RER read + WER clear +*/ +#define XER_MIASG 0x0188 + + +/* Global enable + + RER invalid + WER set +*/ +#define XER_MIASG_SET 0x018C + + +/* IPI partition register + + RER read + WER write +*/ +#define XER_PART 0x0190 +#define XER_IPI0 0x0 +#define XER_IPI1 0x1 +#define XER_IPI2 0x2 +#define XER_IPI3 0x3 + +#define XER_PART_ROUTE_IPI(NUM, FIELD) ((NUM) << ((FIELD) << 2)) + +#define XER_PART_ROUTE_IPI_CAUSE(TO_A, TO_B, TO_C, TO_D) \ + (XER_PART_ROUTE_IPI(TO_A, XER_IPI0) | \ + XER_PART_ROUTE_IPI(TO_B, XER_IPI1) | \ + XER_PART_ROUTE_IPI(TO_C, XER_IPI2) | \ + XER_PART_ROUTE_IPI(TO_D, XER_IPI3)) + +#define XER_IPI_WAKE_EXT_INTERRUPT XCHAL_EXTINT0_NUM +#define XER_IPI_WAKE_CAUSE XER_MIPICAUSE_FIELD_C_FIRST +#define XER_IPI_WAKE_ADDRESS (XER_MIPISET + XER_IPI_WAKE_CAUSE) +#define XER_DEFAULT_IPI_ROUTING XER_PART_ROUTE_IPI_CAUSE(XER_IPI1, XER_IPI0, XER_IPI2, XER_IPI3) + + +/* System configuration ID + + RER read + WER invalid +*/ +#define XER_SYSCFGID 0x01A0 + + +/* RunStall to slave processors + + RER read + WER write +*/ +#define XER_MPSCORE 0x0200 + + +/* Cache coherency ON + + RER read + WER write +*/ +#define XER_CCON 0x0220 + + diff --git a/arch/xtensa/include/esp32/xtensa/include/xtensa/xtruntime-core-state.h b/arch/xtensa/include/esp32/xtensa/include/xtensa/xtruntime-core-state.h new file mode 100644 index 0000000000000..466a26339ff8a --- /dev/null +++ b/arch/xtensa/include/esp32/xtensa/include/xtensa/xtruntime-core-state.h @@ -0,0 +1,240 @@ +/* xtruntime-core-state.h - core state save area (used eg. by PSO) */ +/* $Id: //depot/rel/Foxhill/dot.9/Xtensa/OS/include/xtensa/xtruntime-core-state.h#1 $ */ + +/* + * Copyright (c) 2012-2013 Tensilica Inc. + * + * 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 the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 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. + */ + +#ifndef _XTOS_CORE_STATE_H_ +#define _XTOS_CORE_STATE_H_ + +/* Import STRUCT_xxx macros for defining structures: */ +#include "xtruntime-frames.h" +#include "../../esp32/include/xtensa/config/core.h" +#include "../../esp32/include/xtensa/config/tie.h" +#if XCHAL_HAVE_IDMA +#include +#endif + +//#define XTOS_PSO_TEST 1 // uncommented for internal PSO testing only + +#define CORE_STATE_SIGNATURE 0xB1C5AFED // pattern that indicates state was saved + + +/* + * Save area for saving entire core state, such as across Power Shut-Off (PSO). + */ + +STRUCT_BEGIN +STRUCT_FIELD (long,4,CS_SA_,signature) // for checking whether state was saved +STRUCT_FIELD (long,4,CS_SA_,restore_label) +STRUCT_FIELD (long,4,CS_SA_,aftersave_label) +STRUCT_AFIELD(long,4,CS_SA_,areg,XCHAL_NUM_AREGS) +#if XCHAL_HAVE_WINDOWED +STRUCT_AFIELD(long,4,CS_SA_,caller_regs,16) // save a max of 16 caller regs +STRUCT_FIELD (long,4,CS_SA_,caller_regs_saved) // flag to show if caller regs saved +#endif +#if XCHAL_HAVE_PSO_CDM +STRUCT_FIELD (long,4,CS_SA_,pwrctl) +#endif +#if XCHAL_HAVE_WINDOWED +STRUCT_FIELD (long,4,CS_SA_,windowbase) +STRUCT_FIELD (long,4,CS_SA_,windowstart) +#endif +STRUCT_FIELD (long,4,CS_SA_,sar) +#if XCHAL_HAVE_EXCEPTIONS +STRUCT_FIELD (long,4,CS_SA_,epc1) +STRUCT_FIELD (long,4,CS_SA_,ps) +STRUCT_FIELD (long,4,CS_SA_,excsave1) +# ifdef XCHAL_DOUBLEEXC_VECTOR_VADDR +STRUCT_FIELD (long,4,CS_SA_,depc) +# endif +#endif +#if XCHAL_NUM_INTLEVELS + XCHAL_HAVE_NMI >= 2 +STRUCT_AFIELD(long,4,CS_SA_,epc, XCHAL_NUM_INTLEVELS + XCHAL_HAVE_NMI - 1) +STRUCT_AFIELD(long,4,CS_SA_,eps, XCHAL_NUM_INTLEVELS + XCHAL_HAVE_NMI - 1) +STRUCT_AFIELD(long,4,CS_SA_,excsave,XCHAL_NUM_INTLEVELS + XCHAL_HAVE_NMI - 1) +#endif +#if XCHAL_HAVE_LOOPS +STRUCT_FIELD (long,4,CS_SA_,lcount) +STRUCT_FIELD (long,4,CS_SA_,lbeg) +STRUCT_FIELD (long,4,CS_SA_,lend) +#endif +#if XCHAL_HAVE_ABSOLUTE_LITERALS +STRUCT_FIELD (long,4,CS_SA_,litbase) +#endif +#if XCHAL_HAVE_VECBASE +STRUCT_FIELD (long,4,CS_SA_,vecbase) +#endif +#if XCHAL_HAVE_S32C1I && (XCHAL_HW_MIN_VERSION >= XTENSA_HWVERSION_RC_2009_0) /* have ATOMCTL ? */ +STRUCT_FIELD (long,4,CS_SA_,atomctl) +#endif +#if XCHAL_HAVE_PREFETCH +STRUCT_FIELD (long,4,CS_SA_,prefctl) +#endif +#if XCHAL_USE_MEMCTL +STRUCT_FIELD (long,4,CS_SA_,memctl) +#endif +#if XCHAL_HAVE_CCOUNT +STRUCT_FIELD (long,4,CS_SA_,ccount) +STRUCT_AFIELD(long,4,CS_SA_,ccompare, XCHAL_NUM_TIMERS) +#endif +#if XCHAL_HAVE_INTERRUPTS +STRUCT_FIELD (long,4,CS_SA_,intenable) +STRUCT_FIELD (long,4,CS_SA_,interrupt) +#endif +#if XCHAL_HAVE_DEBUG +STRUCT_FIELD (long,4,CS_SA_,icount) +STRUCT_FIELD (long,4,CS_SA_,icountlevel) +STRUCT_FIELD (long,4,CS_SA_,debugcause) +// DDR not saved +# if XCHAL_NUM_DBREAK +STRUCT_AFIELD(long,4,CS_SA_,dbreakc, XCHAL_NUM_DBREAK) +STRUCT_AFIELD(long,4,CS_SA_,dbreaka, XCHAL_NUM_DBREAK) +# endif +# if XCHAL_NUM_IBREAK +STRUCT_AFIELD(long,4,CS_SA_,ibreaka, XCHAL_NUM_IBREAK) +STRUCT_FIELD (long,4,CS_SA_,ibreakenable) +# endif +#endif +#if XCHAL_NUM_MISC_REGS +STRUCT_AFIELD(long,4,CS_SA_,misc,XCHAL_NUM_MISC_REGS) +#endif +#if XCHAL_HAVE_MEM_ECC_PARITY +STRUCT_FIELD (long,4,CS_SA_,mepc) +STRUCT_FIELD (long,4,CS_SA_,meps) +STRUCT_FIELD (long,4,CS_SA_,mesave) +STRUCT_FIELD (long,4,CS_SA_,mesr) +STRUCT_FIELD (long,4,CS_SA_,mecr) +STRUCT_FIELD (long,4,CS_SA_,mevaddr) +#endif + +/* We put this ahead of TLB and other TIE state, + to keep it within S32I/L32I offset range. */ +#if XCHAL_HAVE_CP +STRUCT_FIELD (long,4,CS_SA_,cpenable) +#endif + +/* TLB state */ +#if XCHAL_HAVE_MIMIC_CACHEATTR || XCHAL_HAVE_XLT_CACHEATTR +STRUCT_AFIELD(long,4,CS_SA_,tlbs,8*2) +#endif +#if XCHAL_HAVE_PTP_MMU +/* Compute number of auto-refill (ARF) entries as max of I and D, + to simplify TLB save logic. On the unusual configs with + ITLB ARF != DTLB ARF entries, we'll just end up + saving/restoring some extra entries redundantly. */ +# if XCHAL_DTLB_ARF_ENTRIES_LOG2 + XCHAL_ITLB_ARF_ENTRIES_LOG2 > 4 +# define ARF_ENTRIES 8 +# else +# define ARF_ENTRIES 4 +# endif +STRUCT_FIELD (long,4,CS_SA_,ptevaddr) +STRUCT_FIELD (long,4,CS_SA_,rasid) +STRUCT_FIELD (long,4,CS_SA_,dtlbcfg) +STRUCT_FIELD (long,4,CS_SA_,itlbcfg) +/*** WARNING: past this point, field offsets may be larger than S32I/L32I range ***/ +STRUCT_AFIELD(long,4,CS_SA_,tlbs,((4*ARF_ENTRIES+4)*2+3)*2) +# if XCHAL_HAVE_SPANNING_WAY /* MMU v3 */ +STRUCT_AFIELD(long,4,CS_SA_,tlbs_ways56,(4+8)*2*2) +# endif +#endif +/* MPU state */ +#if XCHAL_HAVE_MPU +STRUCT_AFIELD(long,4,CS_SA_,mpuentry,8*XCHAL_MPU_ENTRIES) +STRUCT_FIELD (long,4,CS_SA_,cacheadrdis) +#endif + +#if XCHAL_HAVE_IDMA +STRUCT_AFIELD(long,4,CS_SA_,idmaregs, IDMA_PSO_SAVE_SIZE) +#endif + +/* TIE state */ +/* NOTE: NCP area is aligned to XCHAL_TOTAL_SA_ALIGN not XCHAL_NCP_SA_ALIGN, + because the offsets of all subsequent coprocessor save areas are relative + to the NCP save area. */ +STRUCT_AFIELD_A(char,1,XCHAL_TOTAL_SA_ALIGN,CS_SA_,ncp,XCHAL_NCP_SA_SIZE) +#if XCHAL_HAVE_CP +#if XCHAL_CP0_SA_SIZE > 0 +STRUCT_AFIELD_A(char,1,XCHAL_CP0_SA_ALIGN,CS_SA_,cp0,XCHAL_CP0_SA_SIZE) +#endif +#if XCHAL_CP1_SA_SIZE > 0 +STRUCT_AFIELD_A(char,1,XCHAL_CP1_SA_ALIGN,CS_SA_,cp1,XCHAL_CP1_SA_SIZE) +#endif +#if XCHAL_CP2_SA_SIZE > 0 +STRUCT_AFIELD_A(char,1,XCHAL_CP2_SA_ALIGN,CS_SA_,cp2,XCHAL_CP2_SA_SIZE) +#endif +#if XCHAL_CP3_SA_SIZE > 0 +STRUCT_AFIELD_A(char,1,XCHAL_CP3_SA_ALIGN,CS_SA_,cp3,XCHAL_CP3_SA_SIZE) +#endif +#if XCHAL_CP4_SA_SIZE > 0 +STRUCT_AFIELD_A(char,1,XCHAL_CP4_SA_ALIGN,CS_SA_,cp4,XCHAL_CP4_SA_SIZE) +#endif +#if XCHAL_CP5_SA_SIZE > 0 +STRUCT_AFIELD_A(char,1,XCHAL_CP5_SA_ALIGN,CS_SA_,cp5,XCHAL_CP5_SA_SIZE) +#endif +#if XCHAL_CP6_SA_SIZE > 0 +STRUCT_AFIELD_A(char,1,XCHAL_CP6_SA_ALIGN,CS_SA_,cp6,XCHAL_CP6_SA_SIZE) +#endif +#if XCHAL_CP7_SA_SIZE > 0 +STRUCT_AFIELD_A(char,1,XCHAL_CP7_SA_ALIGN,CS_SA_,cp7,XCHAL_CP7_SA_SIZE) +#endif +//STRUCT_AFIELD_A(char,1,XCHAL_CP8_SA_ALIGN,CS_SA_,cp8,XCHAL_CP8_SA_SIZE) +//STRUCT_AFIELD_A(char,1,XCHAL_CP9_SA_ALIGN,CS_SA_,cp9,XCHAL_CP9_SA_SIZE) +//STRUCT_AFIELD_A(char,1,XCHAL_CP10_SA_ALIGN,CS_SA_,cp10,XCHAL_CP10_SA_SIZE) +//STRUCT_AFIELD_A(char,1,XCHAL_CP11_SA_ALIGN,CS_SA_,cp11,XCHAL_CP11_SA_SIZE) +//STRUCT_AFIELD_A(char,1,XCHAL_CP12_SA_ALIGN,CS_SA_,cp12,XCHAL_CP12_SA_SIZE) +//STRUCT_AFIELD_A(char,1,XCHAL_CP13_SA_ALIGN,CS_SA_,cp13,XCHAL_CP13_SA_SIZE) +//STRUCT_AFIELD_A(char,1,XCHAL_CP14_SA_ALIGN,CS_SA_,cp14,XCHAL_CP14_SA_SIZE) +//STRUCT_AFIELD_A(char,1,XCHAL_CP15_SA_ALIGN,CS_SA_,cp15,XCHAL_CP15_SA_SIZE) +#endif + +STRUCT_END(XtosCoreState) + + + +// These are part of non-coprocessor state (ncp): +#if XCHAL_HAVE_MAC16 +//STRUCT_FIELD (long,4,CS_SA_,acclo) +//STRUCT_FIELD (long,4,CS_SA_,acchi) +//STRUCT_AFIELD(long,4,CS_SA_,mr, 4) +#endif +#if XCHAL_HAVE_THREADPTR +//STRUCT_FIELD (long,4,CS_SA_,threadptr) +#endif +#if XCHAL_HAVE_S32C1I +//STRUCT_FIELD (long,4,CS_SA_,scompare1) +#endif +#if XCHAL_HAVE_BOOLEANS +//STRUCT_FIELD (long,4,CS_SA_,br) +#endif + +// Not saved: +// EXCCAUSE ?? +// DEBUGCAUSE ?? +// EXCVADDR ?? +// DDR +// INTERRUPT +// ... locked cache lines ... + +#endif /* _XTOS_CORE_STATE_H_ */ + diff --git a/arch/xtensa/include/esp32/xtensa/include/xtensa/xtruntime-frames.h b/arch/xtensa/include/esp32/xtensa/include/xtensa/xtruntime-frames.h new file mode 100644 index 0000000000000..8529690db4ead --- /dev/null +++ b/arch/xtensa/include/esp32/xtensa/include/xtensa/xtruntime-frames.h @@ -0,0 +1,162 @@ +/* xtruntime-frames.h - exception stack frames for single-threaded run-time */ +/* $Id: //depot/rel/Foxhill/dot.9/Xtensa/OS/include/xtensa/xtruntime-frames.h#1 $ */ + +/* + * Copyright (c) 2002-2012 Tensilica Inc. + * + * 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 the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 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. + */ + +#ifndef _XTRUNTIME_FRAMES_H_ +#define _XTRUNTIME_FRAMES_H_ + +#include "../../esp32/include/xtensa/config/core.h" + +/* Macros that help define structures for both C and assembler: */ +#if defined(_ASMLANGUAGE) || defined(__ASSEMBLER__) +#define STRUCT_BEGIN .pushsection .text; .struct 0 +#define STRUCT_FIELD(ctype,size,pre,name) pre##name: .space size +#define STRUCT_AFIELD(ctype,size,pre,name,n) pre##name: .if n ; .space (size)*(n) ; .endif +#define STRUCT_AFIELD_A(ctype,size,align,pre,name,n) .balign align ; pre##name: .if n ; .space (size)*(n) ; .endif +#define STRUCT_END(sname) sname##Size:; .popsection +#else /*_ASMLANGUAGE||__ASSEMBLER__*/ +#define STRUCT_BEGIN typedef struct { +#define STRUCT_FIELD(ctype,size,pre,name) ctype name; +#define STRUCT_AFIELD(ctype,size,pre,name,n) ctype name[n]; +#define STRUCT_AFIELD_A(ctype,size,align,pre,name,n) ctype name[n] __attribute__((aligned(align))); +#define STRUCT_END(sname) } sname; +#endif /*_ASMLANGUAGE||__ASSEMBLER__*/ + + +/* + * Kernel vector mode exception stack frame. + * + * NOTE: due to the limited range of addi used in the current + * kernel exception vector, and the fact that historically + * the vector is limited to 12 bytes, the size of this + * stack frame is limited to 128 bytes (currently at 64). + */ +STRUCT_BEGIN +STRUCT_FIELD (long,4,KEXC_,pc) /* "parm" */ +STRUCT_FIELD (long,4,KEXC_,ps) +STRUCT_AFIELD(long,4,KEXC_,areg, 4) /* a12 .. a15 */ +STRUCT_FIELD (long,4,KEXC_,sar) /* "save" */ +#if XCHAL_HAVE_LOOPS +STRUCT_FIELD (long,4,KEXC_,lcount) +STRUCT_FIELD (long,4,KEXC_,lbeg) +STRUCT_FIELD (long,4,KEXC_,lend) +#endif +#if XCHAL_HAVE_MAC16 +STRUCT_FIELD (long,4,KEXC_,acclo) +STRUCT_FIELD (long,4,KEXC_,acchi) +STRUCT_AFIELD(long,4,KEXC_,mr, 4) +#endif +STRUCT_END(KernelFrame) + + +/* + * User vector mode exception stack frame: + * + * WARNING: if you modify this structure, you MUST modify the + * computation of the pad size (ALIGNPAD) accordingly. + */ +STRUCT_BEGIN +STRUCT_FIELD (long,4,UEXC_,pc) +STRUCT_FIELD (long,4,UEXC_,ps) +STRUCT_FIELD (long,4,UEXC_,sar) +STRUCT_FIELD (long,4,UEXC_,vpri) +#ifdef __XTENSA_CALL0_ABI__ +STRUCT_FIELD (long,4,UEXC_,a0) +#endif +STRUCT_FIELD (long,4,UEXC_,a2) +STRUCT_FIELD (long,4,UEXC_,a3) +STRUCT_FIELD (long,4,UEXC_,a4) +STRUCT_FIELD (long,4,UEXC_,a5) +#ifdef __XTENSA_CALL0_ABI__ +STRUCT_FIELD (long,4,UEXC_,a6) +STRUCT_FIELD (long,4,UEXC_,a7) +STRUCT_FIELD (long,4,UEXC_,a8) +STRUCT_FIELD (long,4,UEXC_,a9) +STRUCT_FIELD (long,4,UEXC_,a10) +STRUCT_FIELD (long,4,UEXC_,a11) +STRUCT_FIELD (long,4,UEXC_,a12) +STRUCT_FIELD (long,4,UEXC_,a13) +STRUCT_FIELD (long,4,UEXC_,a14) +STRUCT_FIELD (long,4,UEXC_,a15) +#endif +STRUCT_FIELD (long,4,UEXC_,exccause) /* NOTE: can probably rid of this one (pass direct) */ +#if XCHAL_HAVE_LOOPS +STRUCT_FIELD (long,4,UEXC_,lcount) +STRUCT_FIELD (long,4,UEXC_,lbeg) +STRUCT_FIELD (long,4,UEXC_,lend) +#endif +#if XCHAL_HAVE_MAC16 +STRUCT_FIELD (long,4,UEXC_,acclo) +STRUCT_FIELD (long,4,UEXC_,acchi) +STRUCT_AFIELD(long,4,UEXC_,mr, 4) +#endif +/* ALIGNPAD is the 16-byte alignment padding. */ +#ifdef __XTENSA_CALL0_ABI__ +# define CALL0_ABI 1 +#else +# define CALL0_ABI 0 +#endif +#define ALIGNPAD ((3 + XCHAL_HAVE_LOOPS*1 + XCHAL_HAVE_MAC16*2 + CALL0_ABI*1) & 3) +#if ALIGNPAD +STRUCT_AFIELD(long,4,UEXC_,pad, ALIGNPAD) /* 16-byte alignment padding */ +#endif +/*STRUCT_AFIELD_A(char,1,XCHAL_CPEXTRA_SA_ALIGN,UEXC_,ureg, (XCHAL_CPEXTRA_SA_SIZE+3)&-4)*/ /* not used */ +STRUCT_END(UserFrame) + + +#if defined(_ASMLANGUAGE) || defined(__ASSEMBLER__) + + +/* Check for UserFrameSize small enough not to require rounding...: */ + /* Skip 16-byte save area, then 32-byte space for 8 regs of call12 + * (which overlaps with 16-byte GCC nested func chaining area), + * then exception stack frame: */ + .set UserFrameTotalSize, 16+32+UserFrameSize + /* Greater than 112 bytes? (max range of ADDI, both signs, when aligned to 16 bytes): */ + .ifgt UserFrameTotalSize-112 + /* Round up to 256-byte multiple to accelerate immediate adds: */ + .set UserFrameTotalSize, ((UserFrameTotalSize+255) & 0xFFFFFF00) + .endif +# define ESF_TOTALSIZE UserFrameTotalSize + +#endif /* _ASMLANGUAGE || __ASSEMBLER__ */ + + +#if XCHAL_NUM_CONTEXTS > 1 +/* Structure of info stored on new context's stack for setup: */ +STRUCT_BEGIN +STRUCT_FIELD (long,4,INFO_,sp) +STRUCT_FIELD (long,4,INFO_,arg1) +STRUCT_FIELD (long,4,INFO_,funcpc) +STRUCT_FIELD (long,4,INFO_,prevps) +STRUCT_END(SetupInfo) +#endif + + +#define KERNELSTACKSIZE 1024 + + +#endif /* _XTRUNTIME_FRAMES_H_ */ + diff --git a/arch/xtensa/include/esp32/xtensa/include/xtensa/xtruntime.h b/arch/xtensa/include/esp32/xtensa/include/xtensa/xtruntime.h new file mode 100644 index 0000000000000..842a543f6e2ca --- /dev/null +++ b/arch/xtensa/include/esp32/xtensa/include/xtensa/xtruntime.h @@ -0,0 +1,237 @@ +/* + * xtruntime.h -- general C definitions for single-threaded run-time + * + * Copyright (c) 2002-2013 Tensilica Inc. + * + * 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 the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 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. + */ + +#ifndef XTRUNTIME_H +#define XTRUNTIME_H + +#include "../../esp32/include/xtensa/config/core.h" +#include "../../esp32/include/xtensa/config/specreg.h" +#include "xtruntime-core-state.h" + +#ifndef XTSTR +#define _XTSTR(x) # x +#define XTSTR(x) _XTSTR(x) +#endif + +/* _xtos_core_shutoff() flags parameter values: */ +#define XTOS_KEEPON_MEM 0x00000100 /* ==PWRCTL_MEM_WAKEUP */ +#define XTOS_KEEPON_MEM_SHIFT 8 +#define XTOS_KEEPON_DEBUG 0x00001000 /* ==PWRCTL_DEBUG_WAKEUP */ +#define XTOS_KEEPON_DEBUG_SHIFT 12 + +#define XTOS_IDMA_NO_WAIT 0x00010000 /* Do not wait for idma to finish. Disable if necessary */ +#define XTOS_IDMA_WAIT_STANDBY 0x00020000 /* Also treat standby state as the end of wait */ + +#define XTOS_COREF_PSO 0x00000001 /* do power shutoff */ +#define XTOS_COREF_PSO_SHIFT 0 + +#define _xtos_set_execption_handler _xtos_set_exception_handler /* backward compatibility */ +#define _xtos_set_saved_intenable _xtos_ints_on /* backward compatibility */ +#define _xtos_clear_saved_intenable _xtos_ints_off /* backward compatibility */ + +#if !defined(_ASMLANGUAGE) && !defined(__ASSEMBLER__) + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(XTOS_MISRA) +typedef void (_xtos_handler_func)(void *); +#elif defined(__cplusplus) +typedef void (_xtos_handler_func)(...); +#else +typedef void (_xtos_handler_func)(void); +#endif +typedef _xtos_handler_func *_xtos_handler; + +/* + * unsigned XTOS_SET_INTLEVEL(int intlevel); + * This macro sets the current interrupt level. + * The 'intlevel' parameter must be a constant. + * This macro returns a 32-bit value that must be passed to + * XTOS_RESTORE_INTLEVEL() to restore the previous interrupt level. + * XTOS_RESTORE_JUST_INTLEVEL() also does this, but in XEA2 configs + * it restores only PS.INTLEVEL rather than the entire PS register + * and thus is slower. + */ +#if !XCHAL_HAVE_INTERRUPTS +# define XTOS_SET_INTLEVEL(intlevel) 0 +# define XTOS_SET_MIN_INTLEVEL(intlevel) 0 +# define XTOS_RESTORE_INTLEVEL(restoreval) +# define XTOS_RESTORE_JUST_INTLEVEL(restoreval) +#elif XCHAL_HAVE_XEA2 +/* In XEA2, we can simply safely set PS.INTLEVEL directly: */ +/* NOTE: these asm macros don't modify memory, but they are marked + * as such to act as memory access barriers to the compiler because + * these macros are sometimes used to delineate critical sections; + * function calls are natural barriers (the compiler does not know + * whether a function modifies memory) unless declared to be inlined. */ +# define XTOS_SET_INTLEVEL(intlevel) __extension__({ unsigned __tmp; \ + __asm__ __volatile__( "rsil %0, " XTSTR(intlevel) "\n" \ + : "=a" (__tmp) : : "memory" ); \ + __tmp;}) +# define XTOS_SET_MIN_INTLEVEL(intlevel) ({ unsigned __tmp, __tmp2, __tmp3; \ + __asm__ __volatile__( "rsr.ps %0\n" /* get old (current) PS.INTLEVEL */ \ + "movi %2, " XTSTR(intlevel) "\n" \ + "extui %1, %0, 0, 4\n" /* keep only INTLEVEL bits of parameter */ \ + "blt %2, %1, 1f\n" \ + "rsil %0, " XTSTR(intlevel) "\n" \ + "1:\n" \ + : "=a" (__tmp), "=&a" (__tmp2), "=&a" (__tmp3) : : "memory" ); \ + __tmp;}) +# define XTOS_RESTORE_INTLEVEL(restoreval) do{ unsigned __tmp = (restoreval); \ + __asm__ __volatile__( "wsr.ps %0 ; rsync\n" \ + : : "a" (__tmp) : "memory" ); \ + }while(0) +# define XTOS_RESTORE_JUST_INTLEVEL(restoreval) _xtos_set_intlevel(restoreval) +#else +/* In XEA1, we have to rely on INTENABLE register virtualization: */ +extern unsigned _xtos_set_vpri( unsigned vpri ); +extern unsigned _xtos_vpri_enabled; /* current virtual priority */ +# define XTOS_SET_INTLEVEL(intlevel) _xtos_set_vpri(~XCHAL_INTLEVEL_ANDBELOW_MASK(intlevel)) +# define XTOS_SET_MIN_INTLEVEL(intlevel) _xtos_set_vpri(_xtos_vpri_enabled & ~XCHAL_INTLEVEL_ANDBELOW_MASK(intlevel)) +# define XTOS_RESTORE_INTLEVEL(restoreval) _xtos_set_vpri(restoreval) +# define XTOS_RESTORE_JUST_INTLEVEL(restoreval) _xtos_set_vpri(restoreval) +#endif + +/* + * The following macros build upon the above. They are generally used + * instead of invoking the SET_INTLEVEL and SET_MIN_INTLEVEL macros directly. + * They all return a value that can be used with XTOS_RESTORE_INTLEVEL() + * or _xtos_restore_intlevel() or _xtos_restore_just_intlevel() to restore + * the effective interrupt level to what it was before the macro was invoked. + * In XEA2, the DISABLE macros are much faster than the MASK macros + * (in all configs, DISABLE sets the effective interrupt level, whereas MASK + * makes ensures the effective interrupt level is at least the level given + * without lowering it; in XEA2 with INTENABLE virtualization, these macros + * affect PS.INTLEVEL only, not the virtual priority, so DISABLE has partial + * MASK semantics). + * + * A typical critical section sequence might be: + * unsigned rval = XTOS_DISABLE_EXCM_INTERRUPTS; + * ... critical section ... + * XTOS_RESTORE_INTLEVEL(rval); + */ +/* Enable all interrupts (those activated with _xtos_ints_on()): */ +#define XTOS_ENABLE_INTERRUPTS XTOS_SET_INTLEVEL(0) +/* Disable low priority level interrupts (they can interact with the OS): */ +#define XTOS_DISABLE_LOWPRI_INTERRUPTS XTOS_SET_INTLEVEL(XCHAL_NUM_LOWPRI_LEVELS) +#define XTOS_MASK_LOWPRI_INTERRUPTS XTOS_SET_MIN_INTLEVEL(XCHAL_NUM_LOWPRI_LEVELS) +/* Disable interrupts that can interact with the OS: */ +#define XTOS_DISABLE_EXCM_INTERRUPTS XTOS_SET_INTLEVEL(XCHAL_EXCM_LEVEL) +#define XTOS_MASK_EXCM_INTERRUPTS XTOS_SET_MIN_INTLEVEL(XCHAL_EXCM_LEVEL) +#if 0 /* XTOS_LOCK_LEVEL is not exported to applications */ +/* Disable interrupts that can interact with the OS, or manipulate virtual INTENABLE: */ +#define XTOS_DISABLE_LOCK_INTERRUPTS XTOS_SET_INTLEVEL(XTOS_LOCK_LEVEL) +#define XTOS_MASK_LOCK_INTERRUPTS XTOS_SET_MIN_INTLEVEL(XTOS_LOCK_LEVEL) +#endif +/* Disable ALL interrupts (not for common use, particularly if one's processor + * configuration has high-level interrupts and one cares about their latency): */ +#define XTOS_DISABLE_ALL_INTERRUPTS XTOS_SET_INTLEVEL(15) + +/* These two are deprecated. Use the newer functions below. */ +extern unsigned int _xtos_ints_off( unsigned int mask ); +extern unsigned int _xtos_ints_on( unsigned int mask ); + +/* Newer functions to enable/disable the specified interrupt. */ +static inline void _xtos_interrupt_enable(unsigned int intnum) +{ + _xtos_ints_on(1 << intnum); +} + +static inline void _xtos_interrupt_disable(unsigned int intnum) +{ + _xtos_ints_off(1 << intnum); +} + +extern unsigned _xtos_set_intlevel( int intlevel ); +extern unsigned _xtos_set_min_intlevel( int intlevel ); +extern unsigned _xtos_restore_intlevel( unsigned restoreval ); +extern unsigned _xtos_restore_just_intlevel( unsigned restoreval ); +extern _xtos_handler _xtos_set_interrupt_handler( int n, _xtos_handler f ); +extern _xtos_handler _xtos_set_interrupt_handler_arg( int n, _xtos_handler f, void *arg ); +extern _xtos_handler _xtos_set_exception_handler( int n, _xtos_handler f ); + +extern void _xtos_memep_initrams( void ); +extern void _xtos_memep_enable( int flags ); + +/* For use with the tiny LSP (see LSP reference manual). */ +#if XCHAL_NUM_INTLEVELS >= 1 +extern void _xtos_dispatch_level1_interrupts( void ); +#endif +#if XCHAL_NUM_INTLEVELS >= 2 +extern void _xtos_dispatch_level2_interrupts( void ); +#endif +#if XCHAL_NUM_INTLEVELS >= 3 +extern void _xtos_dispatch_level3_interrupts( void ); +#endif +#if XCHAL_NUM_INTLEVELS >= 4 +extern void _xtos_dispatch_level4_interrupts( void ); +#endif +#if XCHAL_NUM_INTLEVELS >= 5 +extern void _xtos_dispatch_level5_interrupts( void ); +#endif +#if XCHAL_NUM_INTLEVELS >= 6 +extern void _xtos_dispatch_level6_interrupts( void ); +#endif + +/* Deprecated (but kept because they were documented): */ +extern unsigned int _xtos_read_ints( void ); +extern void _xtos_clear_ints( unsigned int mask ); + + +/* Power shut-off related routines. */ +extern int _xtos_core_shutoff(unsigned flags); +extern int _xtos_core_save(unsigned flags, XtosCoreState *savearea, void *code); +extern void _xtos_core_restore(unsigned retvalue, XtosCoreState *savearea); + + +#if XCHAL_NUM_CONTEXTS > 1 +extern unsigned _xtos_init_context(int context_num, int stack_size, + _xtos_handler_func *start_func, int arg1); +#endif + +/* Deprecated: */ +#if XCHAL_NUM_TIMERS > 0 +extern void _xtos_timer_0_delta( int cycles ); +#endif +#if XCHAL_NUM_TIMERS > 1 +extern void _xtos_timer_1_delta( int cycles ); +#endif +#if XCHAL_NUM_TIMERS > 2 +extern void _xtos_timer_2_delta( int cycles ); +#endif +#if XCHAL_NUM_TIMERS > 3 +extern void _xtos_timer_3_delta( int cycles ); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* !_ASMLANGUAGE && !__ASSEMBLER__ */ + +#endif /* XTRUNTIME_H */ + From d66cc01afaea06058fe2abfa6af4cf6894b32634 Mon Sep 17 00:00:00 2001 From: Chen Wen Date: Tue, 9 Jun 2020 16:18:45 +0800 Subject: [PATCH 2/4] xtensa/esp32: Add adaptation file --- .../spi_flash/include/esp_flash_internal.h | 4 +- arch/xtensa/include/sdkconfig.h | 419 ++++++++++ arch/xtensa/src/Makefile | 75 +- arch/xtensa/src/common/xtensa_assert.c | 13 + arch/xtensa/src/esp_wifi/FreeRTOS-openocd.c | 24 + arch/xtensa/src/esp_wifi/Make.defs | 40 + arch/xtensa/src/esp_wifi/croutine.c | 391 +++++++++ arch/xtensa/src/esp_wifi/esp_adapter.c | 653 +++++++++++++++ arch/xtensa/src/esp_wifi/esp_ota_eps.c | 12 + arch/xtensa/src/esp_wifi/event_groups.c | 779 ++++++++++++++++++ arch/xtensa/src/esp_wifi/heap_caps.c | 55 ++ arch/xtensa/src/esp_wifi/intr_alloc.c | 130 +++ arch/xtensa/src/esp_wifi/lib/libcoexist.a | Bin 0 -> 114834 bytes arch/xtensa/src/esp_wifi/lib/libcore.a | Bin 0 -> 6226 bytes arch/xtensa/src/esp_wifi/lib/libdriver.a | Bin 0 -> 1021672 bytes arch/xtensa/src/esp_wifi/lib/libefuse.a | Bin 0 -> 62396 bytes arch/xtensa/src/esp_wifi/lib/libesp32.a | Bin 0 -> 170566 bytes arch/xtensa/src/esp_wifi/lib/libesp_common.a | Bin 0 -> 62274 bytes arch/xtensa/src/esp_wifi/lib/libesp_event.a | Bin 0 -> 54368 bytes arch/xtensa/src/esp_wifi/lib/libesp_wifi.a | Bin 0 -> 87840 bytes arch/xtensa/src/esp_wifi/lib/libespnow.a | Bin 0 -> 48302 bytes arch/xtensa/src/esp_wifi/lib/liblog.a | Bin 0 -> 22652 bytes arch/xtensa/src/esp_wifi/lib/libmesh.a | Bin 0 -> 934354 bytes arch/xtensa/src/esp_wifi/lib/libnet80211.a | Bin 0 -> 980378 bytes arch/xtensa/src/esp_wifi/lib/libnvs_flash.a | Bin 0 -> 180396 bytes arch/xtensa/src/esp_wifi/lib/libphy.a | Bin 0 -> 201074 bytes arch/xtensa/src/esp_wifi/lib/libpp.a | Bin 0 -> 476546 bytes arch/xtensa/src/esp_wifi/lib/librtc.a | Bin 0 -> 81582 bytes arch/xtensa/src/esp_wifi/lib/libsmartconfig.a | Bin 0 -> 108494 bytes arch/xtensa/src/esp_wifi/lib/libsoc.a | Bin 0 -> 295610 bytes arch/xtensa/src/esp_wifi/lib/libspi_flash.a | Bin 0 -> 156448 bytes .../src/esp_wifi/lib/libwpa_supplicant.a | Bin 0 -> 1482826 bytes arch/xtensa/src/esp_wifi/list.c | 233 ++++++ arch/xtensa/src/esp_wifi/lock.c | 152 ++++ arch/xtensa/src/esp_wifi/lock.h | 19 + arch/xtensa/src/esp_wifi/port.c | 147 ++++ arch/xtensa/src/esp_wifi/portmacro_priv.h | 80 ++ arch/xtensa/src/esp_wifi/portmux_impl.h | 118 +++ arch/xtensa/src/esp_wifi/portmux_impl.inc.h | 169 ++++ arch/xtensa/src/esp_wifi/queue.c | 398 +++++++++ arch/xtensa/src/esp_wifi/tasks.c | 322 ++++++++ .../esp32/esp32-azure/configs/nsh/defconfig | 14 + .../esp32/esp32-azure/scripts/esp32_flash.ld | 113 ++- .../esp32/esp32-azure/scripts/esp32_rom.ld | 53 +- .../esp32/esp32-azure/src/esp32_bringup.c | 20 + .../esp32/esp32-core/configs/nsh/defconfig | 15 + .../esp32/esp32-core/scripts/esp32_flash.ld | 113 ++- .../esp32/esp32-core/scripts/esp32_rom.ld | 50 +- .../esp32/esp32-core/src/esp32_bringup.c | 20 + 49 files changed, 4565 insertions(+), 66 deletions(-) create mode 100644 arch/xtensa/include/sdkconfig.h create mode 100644 arch/xtensa/src/esp_wifi/FreeRTOS-openocd.c create mode 100644 arch/xtensa/src/esp_wifi/Make.defs create mode 100644 arch/xtensa/src/esp_wifi/croutine.c create mode 100644 arch/xtensa/src/esp_wifi/esp_adapter.c create mode 100644 arch/xtensa/src/esp_wifi/esp_ota_eps.c create mode 100644 arch/xtensa/src/esp_wifi/event_groups.c create mode 100644 arch/xtensa/src/esp_wifi/heap_caps.c create mode 100644 arch/xtensa/src/esp_wifi/intr_alloc.c create mode 100755 arch/xtensa/src/esp_wifi/lib/libcoexist.a create mode 100755 arch/xtensa/src/esp_wifi/lib/libcore.a create mode 100755 arch/xtensa/src/esp_wifi/lib/libdriver.a create mode 100755 arch/xtensa/src/esp_wifi/lib/libefuse.a create mode 100755 arch/xtensa/src/esp_wifi/lib/libesp32.a create mode 100755 arch/xtensa/src/esp_wifi/lib/libesp_common.a create mode 100755 arch/xtensa/src/esp_wifi/lib/libesp_event.a create mode 100755 arch/xtensa/src/esp_wifi/lib/libesp_wifi.a create mode 100755 arch/xtensa/src/esp_wifi/lib/libespnow.a create mode 100755 arch/xtensa/src/esp_wifi/lib/liblog.a create mode 100755 arch/xtensa/src/esp_wifi/lib/libmesh.a create mode 100755 arch/xtensa/src/esp_wifi/lib/libnet80211.a create mode 100755 arch/xtensa/src/esp_wifi/lib/libnvs_flash.a create mode 100755 arch/xtensa/src/esp_wifi/lib/libphy.a create mode 100755 arch/xtensa/src/esp_wifi/lib/libpp.a create mode 100755 arch/xtensa/src/esp_wifi/lib/librtc.a create mode 100755 arch/xtensa/src/esp_wifi/lib/libsmartconfig.a create mode 100755 arch/xtensa/src/esp_wifi/lib/libsoc.a create mode 100755 arch/xtensa/src/esp_wifi/lib/libspi_flash.a create mode 100755 arch/xtensa/src/esp_wifi/lib/libwpa_supplicant.a create mode 100644 arch/xtensa/src/esp_wifi/list.c create mode 100644 arch/xtensa/src/esp_wifi/lock.c create mode 100644 arch/xtensa/src/esp_wifi/lock.h create mode 100644 arch/xtensa/src/esp_wifi/port.c create mode 100644 arch/xtensa/src/esp_wifi/portmacro_priv.h create mode 100644 arch/xtensa/src/esp_wifi/portmux_impl.h create mode 100644 arch/xtensa/src/esp_wifi/portmux_impl.inc.h create mode 100644 arch/xtensa/src/esp_wifi/queue.c create mode 100644 arch/xtensa/src/esp_wifi/tasks.c diff --git a/arch/xtensa/include/esp32/spi_flash/include/esp_flash_internal.h b/arch/xtensa/include/esp32/spi_flash/include/esp_flash_internal.h index 0496f5649c40c..a943b0c512b54 100644 --- a/arch/xtensa/include/esp32/spi_flash/include/esp_flash_internal.h +++ b/arch/xtensa/include/esp32/spi_flash/include/esp_flash_internal.h @@ -13,10 +13,10 @@ // limitations under the License. #pragma once -#include "esp_err.h" +#include "../../esp_common/esp_err.h" #include #include -#include "sdkconfig.h" +#include #include "esp_flash.h" diff --git a/arch/xtensa/include/sdkconfig.h b/arch/xtensa/include/sdkconfig.h new file mode 100644 index 0000000000000..5002efc585259 --- /dev/null +++ b/arch/xtensa/include/sdkconfig.h @@ -0,0 +1,419 @@ +/* + * Automatically generated file. DO NOT EDIT. + * Espressif IoT Development Framework (ESP-IDF) Configuration Header + */ +#pragma once +#define CONFIG_IDF_TARGET "esp32" +#define CONFIG_IDF_TARGET_ESP32 1 +#define CONFIG_IDF_FIRMWARE_CHIP_ID 0x0000 +#define CONFIG_SDK_TOOLPREFIX "xtensa-esp32-elf-" +#define CONFIG_SDK_PYTHON "python" +#define CONFIG_SDK_MAKE_WARN_UNDEFINED_VARIABLES 1 +#define CONFIG_APP_BUILD_TYPE_APP_2NDBOOT 1 +#define CONFIG_APP_BUILD_GENERATE_BINARIES 1 +#define CONFIG_APP_BUILD_BOOTLOADER 1 +#define CONFIG_APP_BUILD_USE_FLASH_SECTIONS 1 +#define CONFIG_APP_COMPILE_TIME_DATE 1 +#define CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE 1 +#define CONFIG_BOOTLOADER_LOG_LEVEL_INFO 1 +#define CONFIG_BOOTLOADER_LOG_LEVEL 3 +#define CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V 1 +#define CONFIG_BOOTLOADER_WDT_ENABLE 1 +#define CONFIG_BOOTLOADER_WDT_TIME_MS 9000 +#define CONFIG_BOOTLOADER_RESERVE_RTC_SIZE 0x0 +#define CONFIG_ESPTOOLPY_PORT "/dev/ttyUSB0" +#define CONFIG_ESPTOOLPY_BAUD_921600B 1 +#define CONFIG_ESPTOOLPY_BAUD_OTHER_VAL 115200 +#define CONFIG_ESPTOOLPY_BAUD 921600 +#define CONFIG_ESPTOOLPY_COMPRESSED 1 +#define CONFIG_ESPTOOLPY_FLASHMODE_DIO 1 +#define CONFIG_ESPTOOLPY_FLASHMODE "dio" +#define CONFIG_ESPTOOLPY_FLASHFREQ_40M 1 +#define CONFIG_ESPTOOLPY_FLASHFREQ "40m" +#define CONFIG_ESPTOOLPY_FLASHSIZE_2MB 1 +#define CONFIG_ESPTOOLPY_FLASHSIZE "2MB" +#define CONFIG_ESPTOOLPY_FLASHSIZE_DETECT 1 +#define CONFIG_ESPTOOLPY_BEFORE_RESET 1 +#define CONFIG_ESPTOOLPY_BEFORE "default_reset" +#define CONFIG_ESPTOOLPY_AFTER_RESET 1 +#define CONFIG_ESPTOOLPY_AFTER "hard_reset" +#define CONFIG_ESPTOOLPY_MONITOR_BAUD_115200B 1 +#define CONFIG_ESPTOOLPY_MONITOR_BAUD_OTHER_VAL 115200 +#define CONFIG_ESPTOOLPY_MONITOR_BAUD 115200 +#define CONFIG_PARTITION_TABLE_SINGLE_APP 1 +#define CONFIG_PARTITION_TABLE_CUSTOM_FILENAME "partitions.csv" +#define CONFIG_PARTITION_TABLE_FILENAME "partitions_singleapp.csv" +#define CONFIG_PARTITION_TABLE_OFFSET 0x8000 +#define CONFIG_PARTITION_TABLE_MD5 1 +#define CONFIG_COMPILER_OPTIMIZATION_DEFAULT 1 +#define CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE 1 +#define CONFIG_COMPILER_STACK_CHECK_MODE_NONE 1 +#define CONFIG_APPTRACE_DEST_NONE 1 +#define CONFIG_APPTRACE_LOCK_ENABLE 1 +#define CONFIG_BTDM_CTRL_BR_EDR_SCO_DATA_PATH_EFF 0 +#define CONFIG_BTDM_CTRL_BLE_MAX_CONN_EFF 0 +#define CONFIG_BTDM_CTRL_BR_EDR_MAX_ACL_CONN_EFF 0 +#define CONFIG_BTDM_CTRL_BR_EDR_MAX_SYNC_CONN_EFF 0 +#define CONFIG_BTDM_CTRL_PINNED_TO_CORE 0 +#define CONFIG_BTDM_BLE_SLEEP_CLOCK_ACCURACY_INDEX_EFF 1 +#define CONFIG_BT_RESERVE_DRAM 0x0 +#define CONFIG_COAP_MBEDTLS_PSK 1 +#define CONFIG_COAP_LOG_DEFAULT_LEVEL 0 +#define CONFIG_ADC_DISABLE_DAC 1 +#define CONFIG_SPI_MASTER_ISR_IN_IRAM 1 +#define CONFIG_SPI_SLAVE_ISR_IN_IRAM 1 +#define CONFIG_EFUSE_CODE_SCHEME_COMPAT_3_4 1 +#define CONFIG_EFUSE_MAX_BLK_LEN 192 +#define CONFIG_ESP_TLS_USING_MBEDTLS 1 +#define CONFIG_ESP32_REV_MIN_0 1 +#define CONFIG_ESP32_REV_MIN 0 +#define CONFIG_ESP32_DPORT_WORKAROUND 1 +#define CONFIG_ESP32_DEFAULT_CPU_FREQ_160 1 +#define CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ 160 +#define CONFIG_ESP32_TRACEMEM_RESERVE_DRAM 0x0 +#define CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_FOUR 1 +#define CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES 4 +#define CONFIG_ESP32_ULP_COPROC_RESERVE_MEM 0 +#define CONFIG_ESP32_PANIC_PRINT_REBOOT 1 +#define CONFIG_ESP32_DEBUG_OCDAWARE 1 +#define CONFIG_ESP32_BROWNOUT_DET 1 +#define CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_0 1 +#define CONFIG_ESP32_BROWNOUT_DET_LVL 0 +#define CONFIG_ESP32_REDUCE_PHY_TX_POWER 1 +#define CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1 1 +#define CONFIG_ESP32_RTC_CLK_SRC_INT_RC 1 +#define CONFIG_ESP32_RTC_CLK_CAL_CYCLES 1024 +#define CONFIG_ESP32_DEEP_SLEEP_WAKEUP_DELAY 2000 +#define CONFIG_ESP32_XTAL_FREQ_40 1 +#define CONFIG_ESP32_XTAL_FREQ 40 +#define CONFIG_ESP32_DPORT_DIS_INTERRUPT_LVL 5 +#define CONFIG_ESP32S2_TRACEMEM_RESERVE_DRAM 0x0 +#define CONFIG_ESP32S2_ULP_COPROC_RESERVE_MEM 0 +#define CONFIG_ESP32S2_DEBUG_OCDAWARE 1 +#define CONFIG_ESP32S2_BROWNOUT_DET 1 +#define CONFIG_ADC_CAL_EFUSE_TP_ENABLE 1 +#define CONFIG_ADC_CAL_EFUSE_VREF_ENABLE 1 +#define CONFIG_ADC_CAL_LUT_ENABLE 1 +#define CONFIG_ESP_ERR_TO_NAME_LOOKUP 1 +#define CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE 32 +#define CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE 2304 +#define CONFIG_ESP_MAIN_TASK_STACK_SIZE 3584 +#define CONFIG_ESP_IPC_TASK_STACK_SIZE 1024 +#define CONFIG_ESP_IPC_USES_CALLERS_PRIORITY 1 +#define CONFIG_ESP_TIMER_TASK_STACK_SIZE 3584 +#define CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE 2048 +#define CONFIG_ESP_CONSOLE_UART_DEFAULT 1 +#define CONFIG_ESP_CONSOLE_UART_NUM 0 +#define CONFIG_ESP_CONSOLE_UART_BAUDRATE 115200 +#define CONFIG_ESP_INT_WDT 1 +#define CONFIG_ESP_INT_WDT_TIMEOUT_MS 300 +#define CONFIG_ESP_INT_WDT_CHECK_CPU1 1 +#define CONFIG_ESP_TASK_WDT 1 +#define CONFIG_ESP_TASK_WDT_TIMEOUT_S 5 +#define CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0 1 +#define CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1 1 +#define CONFIG_ETH_ENABLED 0 +#define CONFIG_ETH_USE_ESP32_EMAC 1 +#define CONFIG_ETH_PHY_INTERFACE_RMII 1 +#define CONFIG_ETH_RMII_CLK_INPUT 1 +#define CONFIG_ETH_RMII_CLK_IN_GPIO 0 +#define CONFIG_ETH_DMA_BUFFER_SIZE 512 +#define CONFIG_ETH_DMA_RX_BUFFER_NUM 10 +#define CONFIG_ETH_DMA_TX_BUFFER_NUM 10 +#define CONFIG_ETH_USE_SPI_ETHERNET 0 +#define CONFIG_ETH_SPI_ETHERNET_DM9051 1 +#define CONFIG_ESP_EVENT_POST_FROM_ISR 1 +#define CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR 1 +#define CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS 1 +#define CONFIG_HTTPD_MAX_REQ_HDR_LEN 512 +#define CONFIG_HTTPD_MAX_URI_LEN 512 +#define CONFIG_HTTPD_ERR_RESP_NO_DELAY 1 +#define CONFIG_HTTPD_PURGE_BUF_LEN 32 +#define CONFIG_ESP_NETIF_IP_LOST_TIMER_INTERVAL 120 +#define CONFIG_ESP_NETIF_TCPIP_LWIP 1 +#define CONFIG_ESP_NETIF_TCPIP_ADAPTER_COMPATIBLE_LAYER 0 +#define CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM 10 +#define CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM 32 +#define CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER 1 +#define CONFIG_ESP32_WIFI_TX_BUFFER_TYPE 1 +#define CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM 32 +#define CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED 1 +#define CONFIG_ESP32_WIFI_TX_BA_WIN 6 +#define CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED 1 +#define CONFIG_ESP32_WIFI_RX_BA_WIN 6 +#define CONFIG_ESP32_WIFI_NVS_ENABLED 1 +#define CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0 1 +#define CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN 752 +#define CONFIG_ESP32_WIFI_MGMT_SBUF_NUM 32 +#define CONFIG_ESP32_WIFI_IRAM_OPT 1 +#define CONFIG_ESP32_WIFI_RX_IRAM_OPT 1 +#define CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE 1 +#define CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER 20 +#define CONFIG_ESP32_PHY_MAX_TX_POWER 20 +#define CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE 1 +#define CONFIG_FATFS_CODEPAGE_437 1 +#define CONFIG_FATFS_CODEPAGE 437 +#define CONFIG_FATFS_LFN_NONE 1 +#define CONFIG_FATFS_FS_LOCK 0 +#define CONFIG_FATFS_TIMEOUT_MS 10000 +#define CONFIG_FATFS_PER_FILE_CACHE 1 +#define CONFIG_FMB_COMM_MODE_RTU_EN 1 +#define CONFIG_FMB_COMM_MODE_ASCII_EN 1 +#define CONFIG_FMB_MASTER_TIMEOUT_MS_RESPOND 150 +#define CONFIG_FMB_MASTER_DELAY_MS_CONVERT 200 +#define CONFIG_FMB_QUEUE_LENGTH 20 +#define CONFIG_FMB_SERIAL_TASK_STACK_SIZE 2048 +#define CONFIG_FMB_SERIAL_BUF_SIZE 256 +#define CONFIG_FMB_SERIAL_ASCII_BITS_PER_SYMB 8 +#define CONFIG_FMB_SERIAL_ASCII_TIMEOUT_RESPOND_MS 1000 +#define CONFIG_FMB_SERIAL_TASK_PRIO 10 +#define CONFIG_FMB_CONTROLLER_NOTIFY_TIMEOUT 20 +#define CONFIG_FMB_CONTROLLER_NOTIFY_QUEUE_SIZE 20 +#define CONFIG_FMB_CONTROLLER_STACK_SIZE 4096 +#define CONFIG_FMB_EVENT_QUEUE_TIMEOUT 20 +#define CONFIG_FMB_TIMER_PORT_ENABLED 1 +#define CONFIG_FMB_TIMER_GROUP 0 +#define CONFIG_FMB_TIMER_INDEX 0 +#define CONFIG_FREERTOS_UNICORE 1 +#define CONFIG_FREERTOS_NO_AFFINITY 0x7FFFFFFF +#define CONFIG_FREERTOS_CORETIMER_0 1 +#define CONFIG_FREERTOS_HZ 100 +#define CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION 1 +#define CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY 1 +#define CONFIG_FREERTOS_INTERRUPT_BACKTRACE 1 +#define CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS 1 +#define CONFIG_FREERTOS_ASSERT_FAIL_ABORT 1 +#define CONFIG_FREERTOS_IDLE_TASK_STACKSIZE 1536 +#define CONFIG_FREERTOS_ISR_STACKSIZE 1536 +#define CONFIG_FREERTOS_MAX_TASK_NAME_LEN 16 +#define CONFIG_FREERTOS_TIMER_TASK_PRIORITY 1 +#define CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH 2048 +#define CONFIG_FREERTOS_TIMER_QUEUE_LENGTH 10 +#define CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE 0 +#define CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER 1 +#define CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER 1 +#define CONFIG_FREERTOS_DEBUG_OCDAWARE 1 +#define CONFIG_HEAP_POISONING_DISABLED 1 +#define CONFIG_HEAP_TRACING_OFF 1 +#define CONFIG_LOG_DEFAULT_LEVEL_INFO 1 +#define CONFIG_LOG_DEFAULT_LEVEL 3 +#define CONFIG_LOG_COLORS 1 +#define CONFIG_LOG_TIMESTAMP_SOURCE_RTOS 1 +#define CONFIG_LWIP_LOCAL_HOSTNAME "espressif" +#define CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES 1 +#define CONFIG_LWIP_TIMERS_ONDEMAND 1 +#define CONFIG_LWIP_MAX_SOCKETS 10 +#define CONFIG_LWIP_SO_REUSE 1 +#define CONFIG_LWIP_SO_REUSE_RXTOALL 1 +#define CONFIG_LWIP_IP_FRAG 1 +#define CONFIG_LWIP_ESP_GRATUITOUS_ARP 1 +#define CONFIG_LWIP_GARP_TMR_INTERVAL 60 +#define CONFIG_LWIP_TCPIP_RECVMBOX_SIZE 32 +#define CONFIG_LWIP_DHCP_DOES_ARP_CHECK 1 +#define CONFIG_LWIP_DHCPS_LEASE_UNIT 60 +#define CONFIG_LWIP_DHCPS_MAX_STATION_NUM 8 +#define CONFIG_LWIP_NETIF_LOOPBACK 1 +#define CONFIG_LWIP_LOOPBACK_MAX_PBUFS 8 +#define CONFIG_LWIP_MAX_ACTIVE_TCP 16 +#define CONFIG_LWIP_MAX_LISTENING_TCP 16 +#define CONFIG_LWIP_TCP_MAXRTX 12 +#define CONFIG_LWIP_TCP_SYNMAXRTX 6 +#define CONFIG_LWIP_TCP_MSS 1440 +#define CONFIG_LWIP_TCP_TMR_INTERVAL 250 +#define CONFIG_LWIP_TCP_MSL 60000 +#define CONFIG_LWIP_TCP_SND_BUF_DEFAULT 5744 +#define CONFIG_LWIP_TCP_WND_DEFAULT 5744 +#define CONFIG_LWIP_TCP_RECVMBOX_SIZE 6 +#define CONFIG_LWIP_TCP_QUEUE_OOSEQ 1 +#define CONFIG_LWIP_TCP_OVERSIZE_MSS 1 +#define CONFIG_LWIP_MAX_UDP_PCBS 16 +#define CONFIG_LWIP_UDP_RECVMBOX_SIZE 6 +#define CONFIG_LWIP_TCPIP_TASK_STACK_SIZE 3072 +#define CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY 1 +#define CONFIG_LWIP_TCPIP_TASK_AFFINITY 0x7FFFFFFF +#define CONFIG_LWIP_MAX_RAW_PCBS 16 +#define CONFIG_LWIP_DHCP_MAX_NTP_SERVERS 1 +#define CONFIG_LWIP_SNTP_UPDATE_DELAY 3600000 +#define CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC 1 +#define CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN 1 +#define CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN 16384 +#define CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN 4096 +#define CONFIG_MBEDTLS_HARDWARE_AES 1 +#define CONFIG_MBEDTLS_HARDWARE_MPI 1 +#define CONFIG_MBEDTLS_HARDWARE_SHA 1 +#define CONFIG_MBEDTLS_HAVE_TIME 1 +#define CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT 1 +#define CONFIG_MBEDTLS_TLS_SERVER 1 +#define CONFIG_MBEDTLS_TLS_CLIENT 1 +#define CONFIG_MBEDTLS_TLS_ENABLED 1 +#define CONFIG_MBEDTLS_PSK_MODES 1 +#define CONFIG_MBEDTLS_KEY_EXCHANGE_PSK 1 +#define CONFIG_MBEDTLS_KEY_EXCHANGE_DHE_PSK 1 +#define CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_PSK 1 +#define CONFIG_MBEDTLS_KEY_EXCHANGE_RSA_PSK 1 +#define CONFIG_MBEDTLS_KEY_EXCHANGE_RSA 1 +#define CONFIG_MBEDTLS_KEY_EXCHANGE_DHE_RSA 1 +#define CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE 1 +#define CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA 1 +#define CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA 1 +#define CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA 1 +#define CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA 1 +#define CONFIG_MBEDTLS_SSL_RENEGOTIATION 1 +#define CONFIG_MBEDTLS_SSL_PROTO_TLS1 1 +#define CONFIG_MBEDTLS_SSL_PROTO_TLS1_1 1 +#define CONFIG_MBEDTLS_SSL_PROTO_TLS1_2 1 +#define CONFIG_MBEDTLS_SSL_PROTO_DTLS 1 +#define CONFIG_MBEDTLS_SSL_ALPN 1 +#define CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS 1 +#define CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS 1 +#define CONFIG_MBEDTLS_AES_C 1 +#define CONFIG_MBEDTLS_RC4_DISABLED 1 +#define CONFIG_MBEDTLS_CCM_C 1 +#define CONFIG_MBEDTLS_GCM_C 1 +#define CONFIG_MBEDTLS_PEM_PARSE_C 1 +#define CONFIG_MBEDTLS_PEM_WRITE_C 1 +#define CONFIG_MBEDTLS_X509_CRL_PARSE_C 1 +#define CONFIG_MBEDTLS_X509_CSR_PARSE_C 1 +#define CONFIG_MBEDTLS_ECP_C 1 +#define CONFIG_MBEDTLS_ECDH_C 1 +#define CONFIG_MBEDTLS_ECDSA_C 1 +#define CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED 1 +#define CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED 1 +#define CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED 1 +#define CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED 1 +#define CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED 1 +#define CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED 1 +#define CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED 1 +#define CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED 1 +#define CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED 1 +#define CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED 1 +#define CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED 1 +#define CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED 1 +#define CONFIG_MBEDTLS_ECP_NIST_OPTIM 1 +#define CONFIG_MDNS_MAX_SERVICES 10 +#define CONFIG_MDNS_TASK_PRIORITY 1 +#define CONFIG_MDNS_TASK_AFFINITY_CPU0 1 +#define CONFIG_MDNS_TASK_AFFINITY 0x0 +#define CONFIG_MDNS_SERVICE_ADD_TIMEOUT_MS 2000 +#define CONFIG_MDNS_TIMER_PERIOD_MS 100 +#define CONFIG_MQTT_PROTOCOL_311 1 +#define CONFIG_MQTT_TRANSPORT_SSL 1 +#define CONFIG_MQTT_TRANSPORT_WEBSOCKET 1 +#define CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE 1 +#define CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF 1 +#define CONFIG_NEWLIB_STDIN_LINE_ENDING_CR 1 +#define CONFIG_OPENSSL_ASSERT_EXIT 1 +#define CONFIG_PTHREAD_TASK_PRIO_DEFAULT 5 +#define CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT 3072 +#define CONFIG_PTHREAD_STACK_MIN 768 +#define CONFIG_PTHREAD_DEFAULT_CORE_NO_AFFINITY 1 +#define CONFIG_PTHREAD_TASK_CORE_DEFAULT -1 +#define CONFIG_PTHREAD_TASK_NAME_DEFAULT "pthread" +#define CONFIG_SPI_FLASH_ROM_DRIVER_PATCH 1 +#define CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS 1 +#define CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP 1 +#define CONFIG_SPI_FLASH_SUPPORT_GD_CHIP 1 +#define CONFIG_SPIFFS_MAX_PARTITIONS 3 +#define CONFIG_SPIFFS_CACHE 1 +#define CONFIG_SPIFFS_CACHE_WR 1 +#define CONFIG_SPIFFS_PAGE_CHECK 1 +#define CONFIG_SPIFFS_GC_MAX_RUNS 10 +#define CONFIG_SPIFFS_PAGE_SIZE 256 +#define CONFIG_SPIFFS_OBJ_NAME_LEN 32 +#define CONFIG_SPIFFS_USE_MAGIC 1 +#define CONFIG_SPIFFS_USE_MAGIC_LENGTH 1 +#define CONFIG_SPIFFS_META_LENGTH 4 +#define CONFIG_SPIFFS_USE_MTIME 1 +#define CONFIG_UNITY_ENABLE_FLOAT 1 +#define CONFIG_UNITY_ENABLE_DOUBLE 1 +#define CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER 1 +#define CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT 1 +#define CONFIG_VFS_SUPPORT_TERMIOS 1 +#define CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS 1 +#define CONFIG_SEMIHOSTFS_HOST_PATH_MAX_LEN 128 +#define CONFIG_WL_SECTOR_SIZE_4096 1 +#define CONFIG_WL_SECTOR_SIZE 4096 +#define CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES 16 +#define CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT 30 + +/* List of deprecated options */ +#define CONFIG_ADC2_DISABLE_DAC CONFIG_ADC_DISABLE_DAC +#define CONFIG_BROWNOUT_DET CONFIG_ESP32_BROWNOUT_DET +#define CONFIG_BROWNOUT_DET_LVL_SEL_0 CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_0 +#define CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG CONFIG_COMPILER_OPTIMIZATION_DEFAULT +#define CONFIG_CONSOLE_UART_BAUDRATE CONFIG_ESP_CONSOLE_UART_BAUDRATE +#define CONFIG_CONSOLE_UART_DEFAULT CONFIG_ESP_CONSOLE_UART_DEFAULT +#define CONFIG_ESP32_APPTRACE_DEST_NONE CONFIG_APPTRACE_DEST_NONE +#define CONFIG_ESP32_DEFAULT_PTHREAD_CORE_NO_AFFINITY CONFIG_PTHREAD_DEFAULT_CORE_NO_AFFINITY +#define CONFIG_ESP32_PTHREAD_STACK_MIN CONFIG_PTHREAD_STACK_MIN +#define CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT CONFIG_PTHREAD_TASK_NAME_DEFAULT +#define CONFIG_ESP32_WIFI_DEBUG_LOG_DEBUG 1 +#define CONFIG_ESP32_WIFI_DEBUG_LOG_MODULE_WIFI 1AME_DEFAULT +#define CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT CONFIG_PTHREAD_TASK_PRIO_DEFAULT +#define CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT +#define CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_RC CONFIG_ESP32_RTC_CLK_SRC_INT_RC +#define CONFIG_ESP_GRATUITOUS_ARP CONFIG_LWIP_ESP_GRATUITOUS_ARP +#define CONFIG_FLASHMODE_DIO CONFIG_ESPTOOLPY_FLASHMODE_DIO +#define CONFIG_FOUR_UNIVERSAL_MAC_ADDRESS CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_FOUR +#define CONFIG_GARP_TMR_INTERVAL CONFIG_LWIP_GARP_TMR_INTERVAL +#define CONFIG_INT_WDT CONFIG_ESP_INT_WDT +#define CONFIG_INT_WDT_CHECK_CPU1 CONFIG_ESP_INT_WDT_CHECK_CPU1 +#define CONFIG_INT_WDT_TIMEOUT_MS CONFIG_ESP_INT_WDT_TIMEOUT_MS +#define CONFIG_IPC_TASK_STACK_SIZE CONFIG_ESP_IPC_TASK_STACK_SIZE +#define CONFIG_LOG_BOOTLOADER_LEVEL_INFO CONFIG_BOOTLOADER_LOG_LEVEL_INFO +#define CONFIG_MAIN_TASK_STACK_SIZE CONFIG_ESP_MAIN_TASK_STACK_SIZE +#define CONFIG_MAKE_WARN_UNDEFINED_VARIABLES CONFIG_SDK_MAKE_WARN_UNDEFINED_VARIABLES +#define CONFIG_MB_CONTROLLER_NOTIFY_QUEUE_SIZE CONFIG_FMB_CONTROLLER_NOTIFY_QUEUE_SIZE +#define CONFIG_MB_CONTROLLER_NOTIFY_TIMEOUT CONFIG_FMB_CONTROLLER_NOTIFY_TIMEOUT +#define CONFIG_MB_CONTROLLER_STACK_SIZE CONFIG_FMB_CONTROLLER_STACK_SIZE +#define CONFIG_MB_EVENT_QUEUE_TIMEOUT CONFIG_FMB_EVENT_QUEUE_TIMEOUT +#define CONFIG_MB_MASTER_DELAY_MS_CONVERT CONFIG_FMB_MASTER_DELAY_MS_CONVERT +#define CONFIG_MB_MASTER_TIMEOUT_MS_RESPOND CONFIG_FMB_MASTER_TIMEOUT_MS_RESPOND +#define CONFIG_MB_QUEUE_LENGTH CONFIG_FMB_QUEUE_LENGTH +#define CONFIG_MB_SERIAL_BUF_SIZE CONFIG_FMB_SERIAL_BUF_SIZE +#define CONFIG_MB_SERIAL_TASK_PRIO CONFIG_FMB_SERIAL_TASK_PRIO +#define CONFIG_MB_SERIAL_TASK_STACK_SIZE CONFIG_FMB_SERIAL_TASK_STACK_SIZE +#define CONFIG_MB_TIMER_GROUP CONFIG_FMB_TIMER_GROUP +#define CONFIG_MB_TIMER_INDEX CONFIG_FMB_TIMER_INDEX +#define CONFIG_MB_TIMER_PORT_ENABLED CONFIG_FMB_TIMER_PORT_ENABLED +#define CONFIG_MONITOR_BAUD_115200B CONFIG_ESPTOOLPY_MONITOR_BAUD_115200B +#define CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE +#define CONFIG_OPTIMIZATION_LEVEL_DEBUG CONFIG_COMPILER_OPTIMIZATION_DEFAULT +#define CONFIG_POST_EVENTS_FROM_IRAM_ISR CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR +#define CONFIG_POST_EVENTS_FROM_ISR CONFIG_ESP_EVENT_POST_FROM_ISR +#define CONFIG_PYTHON CONFIG_SDK_PYTHON +#define CONFIG_REDUCE_PHY_TX_POWER CONFIG_ESP32_REDUCE_PHY_TX_POWER +#define CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS +#define CONFIG_STACK_CHECK_NONE CONFIG_COMPILER_STACK_CHECK_MODE_NONE +#define CONFIG_SUPPORT_TERMIOS CONFIG_VFS_SUPPORT_TERMIOS +#define CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT +#define CONFIG_SYSTEM_EVENT_QUEUE_SIZE CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE +#define CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE +#define CONFIG_TASK_WDT CONFIG_ESP_TASK_WDT +#define CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0 CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0 +#define CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1 CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1 +#define CONFIG_TASK_WDT_TIMEOUT_S CONFIG_ESP_TASK_WDT_TIMEOUT_S +#define CONFIG_TCPIP_RECVMBOX_SIZE CONFIG_LWIP_TCPIP_RECVMBOX_SIZE +#define CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY +#define CONFIG_TCPIP_TASK_STACK_SIZE CONFIG_LWIP_TCPIP_TASK_STACK_SIZE +#define CONFIG_TCP_MAXRTX CONFIG_LWIP_TCP_MAXRTX +#define CONFIG_TCP_MSL CONFIG_LWIP_TCP_MSL +#define CONFIG_TCP_MSS CONFIG_LWIP_TCP_MSS +#define CONFIG_TCP_OVERSIZE_MSS CONFIG_LWIP_TCP_OVERSIZE_MSS +#define CONFIG_TCP_QUEUE_OOSEQ CONFIG_LWIP_TCP_QUEUE_OOSEQ +#define CONFIG_TCP_RECVMBOX_SIZE CONFIG_LWIP_TCP_RECVMBOX_SIZE +#define CONFIG_TCP_SND_BUF_DEFAULT CONFIG_LWIP_TCP_SND_BUF_DEFAULT +#define CONFIG_TCP_SYNMAXRTX CONFIG_LWIP_TCP_SYNMAXRTX +#define CONFIG_TCP_WND_DEFAULT CONFIG_LWIP_TCP_WND_DEFAULT +#define CONFIG_TIMER_QUEUE_LENGTH CONFIG_FREERTOS_TIMER_QUEUE_LENGTH +#define CONFIG_TIMER_TASK_PRIORITY CONFIG_FREERTOS_TIMER_TASK_PRIORITY +#define CONFIG_TIMER_TASK_STACK_DEPTH CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH +#define CONFIG_TIMER_TASK_STACK_SIZE CONFIG_ESP_TIMER_TASK_STACK_SIZE +#define CONFIG_TOOLPREFIX CONFIG_SDK_TOOLPREFIX +#define CONFIG_UDP_RECVMBOX_SIZE CONFIG_LWIP_UDP_RECVMBOX_SIZE + +#define CONFIG_ESP32_WIFI_DEBUG_LOG_ENABLE 1 +#define CONFIG_ESP32_WIFI_DEBUG_LOG_DEBUG 1 +#define CONFIG_ESP32_WIFI_DEBUG_LOG_MODULE_WIFI 1 +#define CONFIG_ESP32_WIFI_DEBUG_LOG_SUBMODULE 1 +#define CONFIG_ESP32_WIFI_DEBUG_LOG_SUBMODULE_ALL 1 \ No newline at end of file diff --git a/arch/xtensa/src/Makefile b/arch/xtensa/src/Makefile index 24de7382364f7..efa4d7c1d8be4 100644 --- a/arch/xtensa/src/Makefile +++ b/arch/xtensa/src/Makefile @@ -33,29 +33,44 @@ # ############################################################################ -include $(TOPDIR)/Make.defs -include chip/Make.defs +-include $(TOPDIR)/Make.defs +-include chip/Make.defs +-include esp_wifi/Make.defs ifeq ($(CONFIG_ARCH_FAMILY_LX6),y) ARCH_SUBDIR = lx6 +ARCH_WIFI = esp_wifi endif -ARCH_SRCDIR = $(TOPDIR)$(DELIM)arch$(DELIM)$(CONFIG_ARCH)$(DELIM)src - -INCLUDES += ${shell $(INCDIR) "$(CC)" $(ARCH_SRCDIR)$(DELIM)chip} -INCLUDES += ${shell $(INCDIR) "$(CC)" $(ARCH_SRCDIR)$(DELIM)common} -INCLUDES += ${shell $(INCDIR) "$(CC)" $(ARCH_SRCDIR)$(DELIM)$(ARCH_SUBDIR)} -INCLUDES += ${shell $(INCDIR) "$(CC)" $(TOPDIR)$(DELIM)sched} - -CPPFLAGS += $(INCLUDES) $(EXTRAFLAGS) -CFLAGS += $(INCLUDES) $(EXTRAFLAGS) -CXXFLAGS += $(INCLUDES) $(EXTRAFLAGS) -AFLAGS += $(INCLUDES) $(EXTRAFLAGS) - -ifeq ($(CONFIG_CYGWIN_WINTOOL),y) - NUTTX = "${shell cygpath -w $(TOPDIR)$(DELIM)nuttx$(EXEEXT)}" +CPPFLAGS += $(EXTRAFLAGS) +CFLAGS += $(EXTRAFLAGS) +CXXFLAGS += $(EXTRAFLAGS) + +ifeq ($(CONFIG_WINDOWS_NATIVE),y) + ARCH_SRCDIR = $(TOPDIR)\arch\$(CONFIG_ARCH)\src + NUTTX = $(TOPDIR)\nuttx$(EXEEXT) + CFLAGS += -I$(ARCH_SRCDIR)\chip + CFLAGS += -I$(ARCH_SRCDIR)\$(ARCH_WIFI) + CFLAGS += -I$(ARCH_SRCDIR)\common + CFLAGS += -I$(ARCH_SRCDIR)\$(ARCH_SUBDIR) + CFLAGS += -I$(TOPDIR)\sched +else + ARCH_SRCDIR = $(TOPDIR)/arch/$(CONFIG_ARCH)/src +ifeq ($(WINTOOL),y) + NUTTX = "${shell cygpath -w $(TOPDIR)/nuttx$(EXEEXT)}" + CFLAGS += -I "${shell cygpath -w $(ARCH_SRCDIR)/chip}" + CFLAGS += -I "${shell cygpath -w $(ARCH_SRCDIR)/$(ARCH_WIFI)}" + CFLAGS += -I "${shell cygpath -w $(ARCH_SRCDIR)/common}" + CFLAGS += -I "${shell cygpath -w $(ARCH_SRCDIR)/$(ARCH_SUBDIR)}" + CFLAGS += -I "${shell cygpath -w $(TOPDIR)/sched}" else - NUTTX = "$(TOPDIR)$(DELIM)nuttx$(EXEEXT)" + NUTTX = $(TOPDIR)/nuttx$(EXEEXT) + CFLAGS += -I$(ARCH_SRCDIR)/chip + CFLAGS += -I$(ARCH_SRCDIR)/$(ARCH_WIFI) + CFLAGS += -I$(ARCH_SRCDIR)/common + CFLAGS += -I$(ARCH_SRCDIR)/$(ARCH_SUBDIR) + CFLAGS += -I$(TOPDIR)/sched +endif endif HEAD_AOBJ = $(HEAD_ASRC:.S=$(OBJEXT)) @@ -65,7 +80,7 @@ STARTUP_OBJS ?= $(HEAD_AOBJ) $(HEAD_COBJ) ASRCS = $(CHIP_ASRCS) $(CMN_ASRCS) AOBJS = $(ASRCS:.S=$(OBJEXT)) -CSRCS = $(CHIP_CSRCS) $(CMN_CSRCS) +CSRCS = $(CHIP_CSRCS) $(CMN_CSRCS) $(WIFI_CSRCS) COBJS = $(CSRCS:.c=$(OBJEXT)) SRCS = $(ASRCS) $(CSRCS) @@ -76,31 +91,45 @@ OBJS = $(AOBJS) $(COBJS) LDSTARTGROUP ?= --start-group LDENDGROUP ?= --end-group LDFLAGS += $(ARCHSCRIPT) +EXTRA_LIBS ?= +LINKLIBS := board core rtc net80211 pp smartconfig coexist espnow phy mesh wpa_supplicant esp_wifi driver nvs_flash esp_common log esp32 spi_flash soc efuse esp_event -BOARDMAKE = $(if $(wildcard board$(DELIM)Makefile),y,) +ifeq ($(CONFIG_WINDOWS_NATIVE),y) + BOARDMAKE = $(if $(wildcard .\board\Makefile),y,) + LIBPATHS += -L"$(TOPDIR)\staging" +ifeq ($(BOARDMAKE),y) + LIBPATHS += -L"$(TOPDIR)\arch\$(CONFIG_ARCH)\src\board" + LIBPATHS += -L"$(TOPDIR)\arch\$(CONFIG_ARCH)\src\esp_wifi\lib" +endif + +else + BOARDMAKE = $(if $(wildcard ./board/Makefile),y,) ifeq ($(CONFIG_CYGWIN_WINTOOL),y) LIBPATHS += -L"${shell cygpath -w "$(TOPDIR)$(DELIM)staging"}" ifeq ($(BOARDMAKE),y) - LIBPATHS += -L"${shell cygpath -w "$(TOPDIR)$(DELIM)arch$(DELIM)$(CONFIG_ARCH)$(DELIM)src$(DELIM)board"}" + LIBPATHS += -L"${shell cygpath -w "$(TOPDIR)/arch/$(CONFIG_ARCH)/src/board"}" + LIBPATHS += -L"${shell cygpath -w "$(TOPDIR)/arch/$(CONFIG_ARCH)/src/esp_wifi/lib"}" endif else LIBPATHS += -L"$(TOPDIR)$(DELIM)staging" ifeq ($(BOARDMAKE),y) - LIBPATHS += -L"$(TOPDIR)$(DELIM)arch$(DELIM)$(CONFIG_ARCH)$(DELIM)src$(DELIM)board" + LIBPATHS += -L"$(TOPDIR)/arch/$(CONFIG_ARCH)/src/board" + LIBPATHS += -L"$(TOPDIR)/arch/$(CONFIG_ARCH)/src/esp_wifi/lib" +endif endif endif LDLIBS = $(patsubst %.a,%,$(patsubst lib%,-l%,$(LINKLIBS))) ifeq ($(BOARDMAKE),y) - LDLIBS += -lboard + LDLIBS += -lboard -lcore -lrtc -lnet80211 -lpp -lsmartconfig -lcoexist -lespnow -lphy -lmesh -lwpa_supplicant -lesp_wifi -ldriver -lnvs_flash -lesp_common -llog -lesp32 -lspi_flash -lsoc -lefuse -lesp_event endif LIBGCC = "${shell "$(CC)" $(ARCHCPUFLAGS) -print-libgcc-file-name}" -VPATH = chip:common:$(ARCH_SUBDIR) +VPATH = chip:common:$(ARCH_SUBDIR):$(ARCH_WIFI) all: $(STARTUP_OBJS) libarch$(LIBEXT) diff --git a/arch/xtensa/src/common/xtensa_assert.c b/arch/xtensa/src/common/xtensa_assert.c index 94e2b289538ff..29f99009755be 100644 --- a/arch/xtensa/src/common/xtensa_assert.c +++ b/arch/xtensa/src/common/xtensa_assert.c @@ -337,3 +337,16 @@ void xtensa_user_panic(int exccause, uint32_t *regs) xtensa_assert(EXIT_FAILURE); /* Should not return */ for (; ; ); } + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: __assert_func + ****************************************************************************/ +void __assert_func(const char *file, int line, const char *func, const char *expr) +{ + _alert("Assert failed in %s, %s:%d (%s)", func, file, line, expr); + up_assert(file, line); +} \ No newline at end of file diff --git a/arch/xtensa/src/esp_wifi/FreeRTOS-openocd.c b/arch/xtensa/src/esp_wifi/FreeRTOS-openocd.c new file mode 100644 index 0000000000000..a912f841c45d5 --- /dev/null +++ b/arch/xtensa/src/esp_wifi/FreeRTOS-openocd.c @@ -0,0 +1,24 @@ +/* + * Since at least FreeRTOS V7.5.3 uxTopUsedPriority is no longer + * present in the kernel, so it has to be supplied by other means for + * OpenOCD's threads awareness. + * + * Add this file to your project, and, if you're using --gc-sections, + * ``--undefined=uxTopUsedPriority'' (or + * ``-Wl,--undefined=uxTopUsedPriority'' when using gcc for final + * linking) to your LDFLAGS; same with all the other symbols you need. + */ + +#include +#include +#include + +#ifdef __GNUC__ +#define USED __attribute__((used)) +#else +#define USED +#endif + +#ifdef CONFIG_FREERTOS_DEBUG_OCDAWARE +const int USED DRAM_ATTR uxTopUsedPriority = configMAX_PRIORITIES - 1; +#endif diff --git a/arch/xtensa/src/esp_wifi/Make.defs b/arch/xtensa/src/esp_wifi/Make.defs new file mode 100644 index 0000000000000..01f3af97c6b70 --- /dev/null +++ b/arch/xtensa/src/esp_wifi/Make.defs @@ -0,0 +1,40 @@ +############################################################################ +# arch/xtensa/src/lx6/Make.defs +# +# Copyright (C) 2016 Gregory Nutt. All rights reserved. +# Author: Gregory Nutt +# +# 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 NuttX 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. +# +############################################################################ + +ifeq ($(CONFIG_ESP32_WIRELESS),y) +WIFI_CSRCS = croutine.c event_groups.c FreeRTOS-openocd.c +WIFI_CSRCS += list.c port.c queue.c tasks.c intr_alloc.c +WIFI_CSRCS += esp_adapter.c lock.c heap_caps.c esp_ota_eps.c +endif \ No newline at end of file diff --git a/arch/xtensa/src/esp_wifi/croutine.c b/arch/xtensa/src/esp_wifi/croutine.c new file mode 100644 index 0000000000000..c13bffc11643f --- /dev/null +++ b/arch/xtensa/src/esp_wifi/croutine.c @@ -0,0 +1,391 @@ +/* + FreeRTOS V8.2.0 - Copyright (C) 2015 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! +*/ + +#include +#include +#include + +/* + * Some kernel aware debuggers require data to be viewed to be global, rather + * than file scope. + */ +#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. */ + +/* Other file private variables. --------------------------------*/ +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 ) + +/* + * Place the co-routine represented by pxCRCB into the appropriate ready queue + * for the priority. It is inserted at the end of the list. + * + * 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 ) ); \ +} + +/* + * 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 ); + +/* + * Co-routines that are readied by an interrupt cannot be placed directly into + * the ready lists (there is no mutual exclusion). Instead they are placed in + * 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 ); + +/* + * Macro that looks at the list of co-routines that are currently delayed to + * see if any require waking. + * + * Co-routines are stored in the queue in the order of their wake time - + * 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 ); + +/*-----------------------------------------------------------*/ + +BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, UBaseType_t uxPriority, UBaseType_t uxIndex ) +{ +BaseType_t xReturn; +CRCB_t *pxCoRoutine; + + UNTESTED_FUNCTION(); //Actually, coroutines are entirely unsupported + /* 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(); + } + + /* Check the priority is within limits. */ + if( uxPriority >= configMAX_CO_ROUTINE_PRIORITIES ) + { + uxPriority = configMAX_CO_ROUTINE_PRIORITIES - 1; + } + + /* Fill out the co-routine control block from the function parameters. */ + pxCoRoutine->uxState = corINITIAL_STATE; + pxCoRoutine->uxPriority = uxPriority; + pxCoRoutine->uxIndex = uxIndex; + pxCoRoutine->pxCoRoutineFunction = pxCoRoutineCode; + + /* Initialise all the other co-routine control block parameters. */ + vListInitialiseItem( &( pxCoRoutine->xGenericListItem ) ); + vListInitialiseItem( &( pxCoRoutine->xEventListItem ) ); + + /* 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 ); + + /* Event lists are always in priority order. */ + listSET_LIST_ITEM_VALUE( &( pxCoRoutine->xEventListItem ), ( ( TickType_t ) configMAX_CO_ROUTINE_PRIORITIES - ( TickType_t ) uxPriority ) ); + + /* Now the co-routine has been initialised it can be added to the ready + list at the correct priority. */ + prvAddCoRoutineToReadyQueue( pxCoRoutine ); + + xReturn = pdPASS; + } + else + { + xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +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; + + /* 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 ); + + 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 ) ); + } +} +/*-----------------------------------------------------------*/ + +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(); + + ( void ) uxListRemove( &( pxUnblockedCRCB->xGenericListItem ) ); + prvAddCoRoutineToReadyQueue( pxUnblockedCRCB ); + } +} +/*-----------------------------------------------------------*/ + +static void prvCheckDelayedList( void ) +{ +CRCB_t *pxCRCB; + + xPassedTicks = xTaskGetTickCount() - xLastTickCount; + while( xPassedTicks ) + { + xCoRoutineTickCount++; + xPassedTicks--; + + /* If the tick count has overflowed we need to swap the ready lists. */ + if( xCoRoutineTickCount == 0 ) + { + List_t * pxTemp; + + /* 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; + } + + /* See if this tick has made a timeout expire. */ + while( listLIST_IS_EMPTY( pxDelayedCoRoutineList ) == pdFALSE ) + { + pxCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedCoRoutineList ); + + if( xCoRoutineTickCount < listGET_LIST_ITEM_VALUE( &( pxCRCB->xGenericListItem ) ) ) + { + /* Timeout not yet expired. */ + break; + } + + 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 ) ); + + /* Is the co-routine waiting on an event also? */ + if( pxCRCB->xEventListItem.pvContainer ) + { + ( void ) uxListRemove( &( pxCRCB->xEventListItem ) ); + } + } + portENABLE_INTERRUPTS(); + + prvAddCoRoutineToReadyQueue( pxCRCB ); + } + } + + xLastTickCount = xCoRoutineTickCount; +} +/*-----------------------------------------------------------*/ + +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(); + + /* 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 ] ) ); + + /* Call the co-routine. */ + ( pxCurrentCoRoutine->pxCoRoutineFunction )( pxCurrentCoRoutine, pxCurrentCoRoutine->uxIndex ); + + return; +} +/*-----------------------------------------------------------*/ + +static void prvInitialiseCoRoutineLists( void ) +{ +UBaseType_t 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 ); + + /* 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; + + /* 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; + } + + return xReturn; +} + diff --git a/arch/xtensa/src/esp_wifi/esp_adapter.c b/arch/xtensa/src/esp_wifi/esp_adapter.c new file mode 100644 index 0000000000000..eaf5f6f3863c1 --- /dev/null +++ b/arch/xtensa/src/esp_wifi/esp_adapter.c @@ -0,0 +1,653 @@ +// 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. + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TAG "esp_adapter" + +/** interrupt wrapper task arg */ +typedef struct { + void *(*func)(void *); ///< user task entry + void *arg; ///< user task argument +} interrupt_arg_t; + +static void IRAM_ATTR s_esp_dport_access_stall_other_cpu_start(void) +{ + DPORT_STALL_OTHER_CPU_START(); +} + +static void IRAM_ATTR s_esp_dport_access_stall_other_cpu_end(void) +{ + DPORT_STALL_OTHER_CPU_END(); +} + +/* + If CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP is enabled. Prefer to allocate a chunk of memory in SPIRAM firstly. + If failed, try to allocate it in internal memory then. + */ +IRAM_ATTR void *wifi_malloc( size_t size ) +{ + return malloc(size); +} + +/* + If CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP is enabled. Prefer to allocate a chunk of memory in SPIRAM firstly. + If failed, try to allocate it in internal memory then. + */ +IRAM_ATTR void *wifi_realloc( void *ptr, size_t size ) +{ + return realloc(ptr, size); +} + +/* + If CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP is enabled. Prefer to allocate a chunk of memory in SPIRAM firstly. + If failed, try to allocate it in internal memory then. + */ +IRAM_ATTR void *wifi_calloc( size_t n, size_t size ) +{ + return calloc(n, size); +} + +static void * IRAM_ATTR wifi_zalloc_wrapper(size_t size) +{ + void *ptr = wifi_calloc(1, size); + if (ptr) { + memset(ptr, 0, size); + } + return ptr; +} + +wifi_static_queue_t* wifi_create_queue( int queue_len, int item_size) +{ + wifi_static_queue_t *queue = NULL; + + queue = (wifi_static_queue_t*)heap_caps_malloc(sizeof(wifi_static_queue_t), MALLOC_CAP_INTERNAL|MALLOC_CAP_8BIT); + if (!queue) { + return NULL; + } + +#if CONFIG_SPIRAM_USE_MALLOC + queue->storage = heap_caps_calloc(1, sizeof(StaticQueue_t) + (queue_len*item_size), MALLOC_CAP_INTERNAL|MALLOC_CAP_8BIT); + if (!queue->storage) { + goto _error; + } + + queue->handle = xQueueCreateStatic( queue_len, item_size, ((uint8_t*)(queue->storage)) + sizeof(StaticQueue_t), (StaticQueue_t*)(queue->storage)); + + if (!queue->handle) { + goto _error; + } + + return queue; + +_error: + if (queue) { + if (queue->storage) { + free(queue->storage); + } + + free(queue); + } + + return NULL; +#else + queue->handle = xQueueCreate( queue_len, item_size); + return queue; +#endif +} + +void wifi_delete_queue(wifi_static_queue_t *queue) +{ + if (queue) { + vQueueDelete(queue->handle); + +#if CONFIG_SPIRAM_USE_MALLOC + if (queue->storage) { + free(queue->storage); + } +#endif + + free(queue); + } +} + +static void * wifi_create_queue_wrapper(int queue_len, int item_size) +{ + return wifi_create_queue(queue_len, item_size); +} + +static void wifi_delete_queue_wrapper(void *queue) +{ + wifi_delete_queue(queue); +} + +xcpt_t set_irq_attach(int n, xt_handler f, void * arg) +{ + interrupt_arg_t *irq_arg = (interrupt_arg_t *)arg; + if (irq_arg) { + irq_arg->func(irq_arg->arg); + } + + return 0; +} + +xt_handler xt_set_interrupt_handler(int n, xt_handler f, void * arg) +{ + interrupt_arg_t *intter_arg = calloc(1, sizeof(interrupt_arg_t)); + intter_arg->func = f; + intter_arg->arg = arg; + irq_attach(n+XTENSA_IRQ_FIRSTPERIPH, (xcpt_t)set_irq_attach, intter_arg); + + return intter_arg->func; +} + +static void set_isr_wrapper(int32_t n, void *f, void *arg) +{ + int cpu = 0; + int ret = OK; + int inter_count = esp32_alloc_levelint(1); + if (inter_count < 0) { + /* Failed to allocate a CPU interrupt of this type */ + return; + } + + /* Attach the to the allocated CPU interrupt */ + up_disable_irq(inter_count); + esp32_attach_peripheral(cpu, n, inter_count); + //esp32_attach_peripheral(cpu, priv->config->periph, priv->cpuint); + /* Attach and enable the IRQ */ + xt_handler test_handle = xt_set_interrupt_handler(n, (xt_handler)f, arg); + up_enable_irq(inter_count); +} + +static void * spin_lock_create_wrapper(void) +{ + portMUX_TYPE tmp = portMUX_INITIALIZER_UNLOCKED; + void *mux = malloc(sizeof(portMUX_TYPE)); + + if (mux) { + memcpy(mux,&tmp,sizeof(portMUX_TYPE)); + return mux; + } + + return NULL; +} + +static uint32_t IRAM_ATTR wifi_int_disable_wrapper(void *wifi_int_mux) +{ + if (xPortInIsrContext()) { + portENTER_CRITICAL_ISR(wifi_int_mux); + } else { + portENTER_CRITICAL(wifi_int_mux); + } + + return 0; +} + +static void IRAM_ATTR wifi_int_restore_wrapper(void *wifi_int_mux, uint32_t tmp) +{ + if (xPortInIsrContext()) { + portEXIT_CRITICAL_ISR(wifi_int_mux); + } else { + portEXIT_CRITICAL(wifi_int_mux); + } +} + +void xt_ints_on(unsigned int mask) +{ + up_enable_irq(mask); +} + +void xt_ints_off(unsigned int mask) +{ + up_disable_irq(mask); +} + +static void IRAM_ATTR task_yield_from_isr_wrapper(void) +{ + portYIELD_FROM_ISR(); +} + +static void * semphr_create_wrapper(uint32_t max, uint32_t init) +{ + return (void *)xSemaphoreCreateCounting(max, init); +} + +static void semphr_delete_wrapper(void *semphr) +{ + vSemaphoreDelete(semphr); +} + +static void wifi_thread_semphr_free(void* data) +{ + xSemaphoreHandle *sem = (xSemaphoreHandle*)(data); + + if (sem) { + vSemaphoreDelete(sem); + } +} + +static void * wifi_thread_semphr_get_wrapper(void) +{ + static bool s_wifi_thread_sem_key_init = false; + static pthread_key_t s_wifi_thread_sem_key; + xSemaphoreHandle sem = NULL; + + if (s_wifi_thread_sem_key_init == false) { + if (0 != pthread_key_create(&s_wifi_thread_sem_key, wifi_thread_semphr_free)) { + return NULL; + } + s_wifi_thread_sem_key_init = true; + } + + sem = pthread_getspecific(s_wifi_thread_sem_key); + if (!sem) { + sem = xSemaphoreCreateCounting(1, 0); + if (sem) { + pthread_setspecific(s_wifi_thread_sem_key, sem); + ESP_LOGV(TAG, "thread sem create: sem=%p", sem); + } + } + + ESP_LOGV(TAG, "thread sem get: sem=%p", sem); + return (void*)sem; +} + +static int32_t IRAM_ATTR semphr_take_from_isr_wrapper(void *semphr, void *hptw) +{ + return (int32_t)xSemaphoreTakeFromISR(semphr, hptw); +} + +static int32_t IRAM_ATTR semphr_give_from_isr_wrapper(void *semphr, void *hptw) +{ + return (int32_t)xSemaphoreGiveFromISR(semphr, hptw); +} + +static int32_t semphr_take_wrapper(void *semphr, uint32_t block_time_tick) +{ + if (block_time_tick == OSI_FUNCS_TIME_BLOCKING) { + return (int32_t)xSemaphoreTake(semphr, portMAX_DELAY); + } else { + return (int32_t)xSemaphoreTake(semphr, block_time_tick); + } +} + +static int32_t semphr_give_wrapper(void *semphr) +{ + return (int32_t)xSemaphoreGive(semphr); +} + +static void * recursive_mutex_create_wrapper(void) +{ + return (void *)xSemaphoreCreateRecursiveMutex(); +} + +static void * mutex_create_wrapper(void) +{ + return (void *)xSemaphoreCreateMutex(); +} + +static void mutex_delete_wrapper(void *mutex) +{ + vSemaphoreDelete(mutex); +} + +static int32_t IRAM_ATTR mutex_lock_wrapper(void *mutex) +{ + return (int32_t)xSemaphoreTakeRecursive(mutex, portMAX_DELAY); +} + +static int32_t IRAM_ATTR mutex_unlock_wrapper(void *mutex) +{ + return (int32_t)xSemaphoreGiveRecursive(mutex); +} + +static void * queue_create_wrapper(uint32_t queue_len, uint32_t item_size) +{ + return (void *)xQueueCreate(queue_len, item_size); +} + +static int32_t queue_send_wrapper(void *queue, void *item, uint32_t block_time_tick) +{ + if (block_time_tick == OSI_FUNCS_TIME_BLOCKING) { + return (int32_t)xQueueSend(queue, item, portMAX_DELAY); + } else { + return (int32_t)xQueueSend(queue, item, block_time_tick); + } +} + +static int32_t IRAM_ATTR queue_send_from_isr_wrapper(void *queue, void *item, void *hptw) +{ + return (int32_t)xQueueSendFromISR(queue, item, hptw); +} + +static int32_t queue_send_to_back_wrapper(void *queue, void *item, uint32_t block_time_tick) +{ + return (int32_t)xQueueGenericSend(queue, item, block_time_tick, queueSEND_TO_BACK); +} + +static int32_t queue_send_to_front_wrapper(void *queue, void *item, uint32_t block_time_tick) +{ + return (int32_t)xQueueGenericSend(queue, item, block_time_tick, queueSEND_TO_FRONT); +} + +static int32_t queue_recv_wrapper(void *queue, void *item, uint32_t block_time_tick) +{ + if (block_time_tick == OSI_FUNCS_TIME_BLOCKING) { + return (int32_t)xQueueReceive(queue, item, portMAX_DELAY); + } else { + return (int32_t)xQueueReceive(queue, item, block_time_tick); + } +} + +static uint32_t event_group_wait_bits_wrapper(void *event, uint32_t bits_to_wait_for, int clear_on_exit, int wait_for_all_bits, uint32_t block_time_tick) +{ + if (block_time_tick == OSI_FUNCS_TIME_BLOCKING) { + return (uint32_t)xEventGroupWaitBits(event, bits_to_wait_for, clear_on_exit, wait_for_all_bits, portMAX_DELAY); + } else { + return (uint32_t)xEventGroupWaitBits(event, bits_to_wait_for, clear_on_exit, wait_for_all_bits, block_time_tick); + } +} + +static int32_t task_create_pinned_to_core_wrapper(void *task_func, const char *name, uint32_t stack_depth, void *param, uint32_t prio, void *task_handle, uint32_t core_id) +{ + return (uint32_t)xTaskCreatePinnedToCore(task_func, name, stack_depth, param, prio, task_handle, (core_id < portNUM_PROCESSORS ? core_id : tskNO_AFFINITY)); +} + +static int32_t task_create_wrapper(void *task_func, const char *name, uint32_t stack_depth, void *param, uint32_t prio, void *task_handle) +{ + return (uint32_t)xTaskCreate(task_func, name, stack_depth, param, prio, task_handle); +} + +static int32_t IRAM_ATTR task_ms_to_tick_wrapper(uint32_t ms) +{ + return (int32_t)(ms / portTICK_PERIOD_MS); +} + +static int32_t task_get_max_priority_wrapper(void) +{ + return (int32_t)(configMAX_PRIORITIES); +} + +static int32_t esp_event_post_wrapper(const char* event_base, int32_t event_id, void* event_data, size_t event_data_size, uint32_t ticks_to_wait) +{ + if (ticks_to_wait == OSI_FUNCS_TIME_BLOCKING) { + return (int32_t)esp_event_post(event_base, event_id, event_data, event_data_size, portMAX_DELAY); + } else { + return (int32_t)esp_event_post(event_base, event_id, event_data, event_data_size, ticks_to_wait); + } +} + +static void IRAM_ATTR timer_arm_wrapper(void *timer, uint32_t tmout, bool repeat) +{ + ets_timer_arm(timer, tmout, repeat); +} + +static void IRAM_ATTR timer_disarm_wrapper(void *timer) +{ + ets_timer_disarm(timer); +} + +static void timer_done_wrapper(void *ptimer) +{ + ets_timer_done(ptimer); +} + +static void timer_setfn_wrapper(void *ptimer, void *pfunction, void *parg) +{ + ets_timer_setfn(ptimer, pfunction, parg); +} + +static void IRAM_ATTR timer_arm_us_wrapper(void *ptimer, uint32_t us, bool repeat) +{ + ets_timer_arm_us(ptimer, us, repeat); +} + +static int get_time_wrapper(void *t) +{ + return os_get_time(t); +} + +static void * IRAM_ATTR malloc_internal_wrapper(size_t size) +{ + return heap_caps_malloc(size, MALLOC_CAP_8BIT|MALLOC_CAP_DMA|MALLOC_CAP_INTERNAL); +} + +static void * IRAM_ATTR realloc_internal_wrapper(void *ptr, size_t size) +{ + return heap_caps_realloc(ptr, size, MALLOC_CAP_8BIT|MALLOC_CAP_DMA|MALLOC_CAP_INTERNAL); +} + +static void * IRAM_ATTR calloc_internal_wrapper(size_t n, size_t size) +{ + return heap_caps_calloc(n, size, MALLOC_CAP_8BIT|MALLOC_CAP_DMA|MALLOC_CAP_INTERNAL); +} + +static void * IRAM_ATTR zalloc_internal_wrapper(size_t size) +{ + void *ptr = heap_caps_calloc(1, size, MALLOC_CAP_8BIT|MALLOC_CAP_DMA|MALLOC_CAP_INTERNAL); + if (ptr) { + memset(ptr, 0, size); + } + return ptr; +} + +static uint32_t coex_status_get_wrapper(void) +{ +#if CONFIG_ESP32_WIFI_SW_COEXIST_ENABLE + return coex_status_get(); +#else + return 0; +#endif +} + +static void coex_condition_set_wrapper(uint32_t type, bool dissatisfy) +{ +#if CONFIG_SW_COEXIST_ENABLE + coex_condition_set(type, dissatisfy); +#endif +} + +static int coex_wifi_request_wrapper(uint32_t event, uint32_t latency, uint32_t duration) +{ +#if CONFIG_ESP32_WIFI_SW_COEXIST_ENABLE + return coex_wifi_request(event, latency, duration); +#else + return 0; +#endif +} + +static int coex_wifi_release_wrapper(uint32_t event) +{ +#if CONFIG_ESP32_WIFI_SW_COEXIST_ENABLE + return coex_wifi_release(event); +#else + return 0; +#endif +} + +int IRAM_ATTR coex_bt_request_wrapper(uint32_t event, uint32_t latency, uint32_t duration) +{ +#if CONFIG_ESP32_WIFI_SW_COEXIST_ENABLE + return coex_bt_request(event, latency, duration); +#else + return 0; +#endif +} + +int IRAM_ATTR coex_bt_release_wrapper(uint32_t event) +{ +#if CONFIG_ESP32_WIFI_SW_COEXIST_ENABLE + return coex_bt_release(event); +#else + return 0; +#endif +} + +int coex_register_bt_cb_wrapper(coex_func_cb_t cb) +{ +#if CONFIG_ESP32_WIFI_SW_COEXIST_ENABLE + return coex_register_bt_cb(cb); +#else + return 0; +#endif +} + +uint32_t IRAM_ATTR coex_bb_reset_lock_wrapper(void) +{ +#if CONFIG_ESP32_WIFI_SW_COEXIST_ENABLE + return coex_bb_reset_lock(); +#else + return 0; +#endif +} + +void IRAM_ATTR coex_bb_reset_unlock_wrapper(uint32_t restore) +{ +#if CONFIG_ESP32_WIFI_SW_COEXIST_ENABLE + coex_bb_reset_unlock(restore); +#endif +} + +int32_t IRAM_ATTR coex_is_in_isr_wrapper(void) +{ + return !xPortCanYield(); +} + +wifi_osi_funcs_t g_wifi_osi_funcs = { + ._version = ESP_WIFI_OS_ADAPTER_VERSION, + ._set_isr = set_isr_wrapper, + ._ints_on = xt_ints_on, + ._ints_off = xt_ints_off, + ._spin_lock_create = spin_lock_create_wrapper, + ._spin_lock_delete = free, + ._wifi_int_disable = wifi_int_disable_wrapper, + ._wifi_int_restore = wifi_int_restore_wrapper, + ._task_yield_from_isr = task_yield_from_isr_wrapper, + ._semphr_create = semphr_create_wrapper, + ._semphr_delete = semphr_delete_wrapper, + ._semphr_take = semphr_take_wrapper, + ._semphr_give = semphr_give_wrapper, + ._wifi_thread_semphr_get = wifi_thread_semphr_get_wrapper, + ._mutex_create = mutex_create_wrapper, + ._recursive_mutex_create = recursive_mutex_create_wrapper, + ._mutex_delete = mutex_delete_wrapper, + ._mutex_lock = mutex_lock_wrapper, + ._mutex_unlock = mutex_unlock_wrapper, + ._queue_create = queue_create_wrapper, + ._queue_delete = (void(*)(void *))vQueueDelete, + ._queue_send = queue_send_wrapper, + ._queue_send_from_isr = queue_send_from_isr_wrapper, + ._queue_send_to_back = queue_send_to_back_wrapper, + ._queue_send_to_front = queue_send_to_front_wrapper, + ._queue_recv = queue_recv_wrapper, + ._queue_msg_waiting = (uint32_t(*)(void *))uxQueueMessagesWaiting, + ._event_group_create = (void *(*)(void))xEventGroupCreate, + ._event_group_delete = (void(*)(void *))vEventGroupDelete, + ._event_group_set_bits = (uint32_t(*)(void *,uint32_t))xEventGroupSetBits, + ._event_group_clear_bits = (uint32_t(*)(void *,uint32_t))xEventGroupClearBits, + ._event_group_wait_bits = event_group_wait_bits_wrapper, + ._task_create_pinned_to_core = task_create_pinned_to_core_wrapper, + ._task_create = task_create_wrapper, + ._task_delete = (void(*)(void *))vTaskDelete, + ._task_delay = vTaskDelay, + ._task_ms_to_tick = task_ms_to_tick_wrapper, + ._task_get_current_task = (void *(*)(void))xTaskGetCurrentTaskHandle, + ._task_get_max_priority = task_get_max_priority_wrapper, + ._malloc = malloc, + ._free = free, + ._event_post = esp_event_post_wrapper, + ._get_free_heap_size = esp_get_free_heap_size, + ._rand = esp_random, + ._dport_access_stall_other_cpu_start_wrap = s_esp_dport_access_stall_other_cpu_start, + ._dport_access_stall_other_cpu_end_wrap = s_esp_dport_access_stall_other_cpu_end, + ._phy_rf_deinit = esp_phy_rf_deinit, + ._phy_load_cal_and_init = esp_phy_load_cal_and_init, + ._phy_common_clock_enable = esp_phy_common_clock_enable, + ._phy_common_clock_disable = esp_phy_common_clock_disable, + ._read_mac = esp_read_mac, + ._timer_arm = timer_arm_wrapper, + ._timer_disarm = timer_disarm_wrapper, + ._timer_done = timer_done_wrapper, + ._timer_setfn = timer_setfn_wrapper, + ._timer_arm_us = timer_arm_us_wrapper, + ._periph_module_enable = periph_module_enable, + ._periph_module_disable = periph_module_disable, + ._esp_timer_get_time = esp_timer_get_time, + ._nvs_set_i8 = nvs_set_i8, + ._nvs_get_i8 = nvs_get_i8, + ._nvs_set_u8 = nvs_set_u8, + ._nvs_get_u8 = nvs_get_u8, + ._nvs_set_u16 = nvs_set_u16, + ._nvs_get_u16 = nvs_get_u16, + ._nvs_open = nvs_open, + ._nvs_close = nvs_close, + ._nvs_commit = nvs_commit, + ._nvs_set_blob = nvs_set_blob, + ._nvs_get_blob = nvs_get_blob, + ._nvs_erase_key = nvs_erase_key, + ._get_random = os_get_random, + ._get_time = get_time_wrapper, + ._random = os_random, + ._log_write = esp_log_write, + ._log_writev = esp_log_writev, + ._log_timestamp = esp_log_timestamp, + ._malloc_internal = malloc_internal_wrapper, + ._realloc_internal = realloc_internal_wrapper, + ._calloc_internal = calloc_internal_wrapper, + ._zalloc_internal = zalloc_internal_wrapper, + ._wifi_malloc = wifi_malloc, + ._wifi_realloc = wifi_realloc, + ._wifi_calloc = wifi_calloc, + ._wifi_zalloc = wifi_zalloc_wrapper, + ._wifi_create_queue = wifi_create_queue_wrapper, + ._wifi_delete_queue = wifi_delete_queue_wrapper, + ._modem_sleep_enter = esp_modem_sleep_enter, + ._modem_sleep_exit = esp_modem_sleep_exit, + ._modem_sleep_register = esp_modem_sleep_register, + ._modem_sleep_deregister = esp_modem_sleep_deregister, + ._coex_status_get = coex_status_get_wrapper, + ._coex_condition_set = coex_condition_set_wrapper, + ._coex_wifi_request = coex_wifi_request_wrapper, + ._coex_wifi_release = coex_wifi_release_wrapper, + ._magic = ESP_WIFI_OS_ADAPTER_MAGIC, +}; \ No newline at end of file diff --git a/arch/xtensa/src/esp_wifi/esp_ota_eps.c b/arch/xtensa/src/esp_wifi/esp_ota_eps.c new file mode 100644 index 0000000000000..02fc97a276662 --- /dev/null +++ b/arch/xtensa/src/esp_wifi/esp_ota_eps.c @@ -0,0 +1,12 @@ +#include + +const esp_partition_t* esp_ota_get_running_partition(void) +{ + // Return first instance of an app partition + const esp_partition_t* partition = esp_partition_find_first(ESP_PARTITION_TYPE_APP, + ESP_PARTITION_SUBTYPE_ANY, + NULL); + assert(partition != NULL); + + return partition; +} diff --git a/arch/xtensa/src/esp_wifi/event_groups.c b/arch/xtensa/src/esp_wifi/event_groups.c new file mode 100644 index 0000000000000..f280a4be50729 --- /dev/null +++ b/arch/xtensa/src/esp_wifi/event_groups.c @@ -0,0 +1,779 @@ +/* + FreeRTOS V8.2.0 - Copyright (C) 2015 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! +*/ + +/* 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. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* FreeRTOS includes. */ +#include +#include +#include +#include + +const char * IP_EVENT = "ip_event"; +/* Lint 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. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750. */ + +#if ( INCLUDE_xEventGroupSetBitFromISR == 1 ) && ( configUSE_TIMERS == 0 ) + #error configUSE_TIMERS must be set to 1 to make the xEventGroupSetBitFromISR() function available. +#endif + +#if ( INCLUDE_xEventGroupSetBitFromISR == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 0 ) + #error INCLUDE_xTimerPendFunctionCall must also be set to one to make the xEventGroupSetBitFromISR() function available. +#endif + +/* 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. */ +#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 +#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 +#endif + +typedef struct xEventGroupDefinition +{ + 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( ( 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 +} EventGroup_t; + + +/*-----------------------------------------------------------*/ + +/* + * Test the bits set in uxCurrentEventBits to see if the wait condition is met. + * The wait condition is defined by xWaitForAllBits. If xWaitForAllBits is + * pdTRUE then the wait condition is met if all the bits set in uxBitsToWaitFor + * are also set in uxCurrentEventBits. If xWaitForAllBits is pdFALSE then the + * 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 ); + +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + + EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer ) + { + EventGroup_t *pxEventBits; + + /* A StaticEventGroup_t object must be provided. */ + configASSERT( pxEventGroupBuffer ); + + /* The user has provided a statically allocated event group - use it. */ + pxEventBits = ( EventGroup_t * ) pxEventGroupBuffer; /*lint !e740 EventGroup_t and StaticEventGroup_t are guaranteed to have the same size and alignment requirement - checked by configASSERT(). */ + + 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 */ + + vPortCPUInitializeMutex(&pxEventBits->eventGroupMux); + + traceEVENT_GROUP_CREATE( pxEventBits ); + } + else + { + traceEVENT_GROUP_CREATE_FAILED(); + } + + return ( EventGroupHandle_t ) pxEventBits; + } + +#endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + EventGroupHandle_t xEventGroupCreate( void ) + { + EventGroup_t *pxEventBits; + + /* Allocate the event group. */ + pxEventBits = ( EventGroup_t * ) pvPortMalloc( sizeof( EventGroup_t ) ); + + 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 */ + + vPortCPUInitializeMutex(&pxEventBits->eventGroupMux); + + traceEVENT_GROUP_CREATE( pxEventBits ); + } + else + { + traceEVENT_GROUP_CREATE_FAILED(); + } + + return ( EventGroupHandle_t ) pxEventBits; + } + +#endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait ) +{ +EventBits_t uxOriginalBitValue, uxReturn; +EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; +BaseType_t xAlreadyYielded; +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 + + vTaskSuspendAll(); + taskENTER_CRITICAL(&pxEventBits->eventGroupMux); + { + uxOriginalBitValue = pxEventBits->uxEventBits; + + ( void ) xEventGroupSetBits( xEventGroup, 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; + + 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 ); + + /* 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; + } + } + } + taskEXIT_CRITICAL( &pxEventBits->eventGroupMux ); + xAlreadyYielded = xTaskResumeAll(); + + if( xTicksToWait != ( TickType_t ) 0 ) + { + if( xAlreadyYielded == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* 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; + + /* 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. */ + } + + /* 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 ); + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait ) +{ +EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; +EventBits_t uxReturn, uxControlBits = 0; +BaseType_t xWaitConditionMet, xAlreadyYielded; +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 + + vTaskSuspendAll(); + 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 ); + + 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; + } + 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(); + } + + /* 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; + + traceEVENT_GROUP_WAIT_BITS_BLOCK( xEventGroup, uxBitsToWaitFor ); + } + } + taskEXIT_CRITICAL( &pxEventBits->eventGroupMux ); + xAlreadyYielded = xTaskResumeAll(); + + if( xTicksToWait != ( TickType_t ) 0 ) + { + if( xAlreadyYielded == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* 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; + + /* 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(); + } + } + taskEXIT_CRITICAL( &pxEventBits->eventGroupMux ); + + /* Prevent compiler warnings when trace macros are not used. */ + xTimeoutOccurred = pdFALSE; + } + else + { + /* The task unblocked because the bits were set. */ + } + + /* The task blocked so control bits may have been set. */ + uxReturn &= ~eventEVENT_BITS_CONTROL_BYTES; + } + traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxBitsToWaitFor, xTimeoutOccurred ); + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) +{ +EventGroup_t *pxEventBits = ( EventGroup_t * ) 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 ); + + 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; + + /* Clear the bits. */ + pxEventBits->uxEventBits &= ~uxBitsToClear; + } + taskEXIT_CRITICAL( &pxEventBits->eventGroupMux ); + + 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; + + traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear ); + xReturn = xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL ); + + return xReturn; + } + +#endif +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ) +{ +UBaseType_t uxSavedInterruptStatus; +EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; +EventBits_t uxReturn; + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + uxReturn = pxEventBits->uxEventBits; + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) +{ +ListItem_t *pxListItem, *pxNext; +ListItem_t const *pxListEnd; +List_t *pxList; +EventBits_t uxBitsToClear = 0, uxBitsWaitedFor, uxControlBits; +EventGroup_t *pxEventBits = ( EventGroup_t * ) 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 ); + + pxList = &( pxEventBits->xTasksWaitingForBits ); + pxListEnd = listGET_END_MARKER( pxList ); /*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + + vTaskSuspendAll(); + taskENTER_CRITICAL(&pxEventBits->eventGroupMux); + { + traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet ); + + pxListItem = listGET_HEAD_ENTRY( pxList ); + + /* 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; + + /* 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( 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. */ + ( void ) 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; + } + + /* 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); + ( void ) xTaskResumeAll(); + + return pxEventBits->uxEventBits; +} +/*-----------------------------------------------------------*/ + +void vEventGroupDelete( EventGroupHandle_t xEventGroup ) +{ + EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; + const List_t *pxTasksWaitingForBits = &( pxEventBits->xTasksWaitingForBits ); + + vTaskSuspendAll(); + taskENTER_CRITICAL( &pxEventBits->eventGroupMux ); + { + traceEVENT_GROUP_DELETE( xEventGroup ); + + 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 != ( ListItem_t * ) &( pxTasksWaitingForBits->xListEnd ) ); + ( void ) xTaskRemoveFromUnorderedEventList( pxTasksWaitingForBits->xListEnd.pxNext, eventUNBLOCKED_DUE_TO_BIT_SET ); + } + + #if( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) ) + { + /* The event group can only have been allocated dynamically - free + it again. */ + taskEXIT_CRITICAL( &pxEventBits->eventGroupMux ); + 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 ) + { + taskEXIT_CRITICAL( &pxEventBits->eventGroupMux ); //Exit mux of event group before deleting it + vPortFree( pxEventBits ); + } + else + { + taskEXIT_CRITICAL( &pxEventBits->eventGroupMux ); + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + } + ( void ) xTaskResumeAll(); +} +/*-----------------------------------------------------------*/ + +/* For internal use only - execute a 'set bits' command that was pended from +an interrupt. */ +void vEventGroupSetBitsCallback( void *pvEventGroup, const uint32_t ulBitsToSet ) +{ + ( void ) xEventGroupSetBits( pvEventGroup, ( EventBits_t ) ulBitsToSet ); +} +/*-----------------------------------------------------------*/ + +/* For internal use only - execute a 'clear bits' command that was pended from +an interrupt. */ +void vEventGroupClearBitsCallback( void *pvEventGroup, const uint32_t ulBitsToClear ) +{ + ( void ) xEventGroupClearBits( pvEventGroup, ( EventBits_t ) ulBitsToClear ); +} +/*-----------------------------------------------------------*/ + +static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, const EventBits_t uxBitsToWaitFor, const BaseType_t xWaitForAllBits ) +{ +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(); + } + } + + 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; + + traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet ); + xReturn = xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken ); + + return xReturn; + } + +#endif +/*-----------------------------------------------------------*/ + +#if (configUSE_TRACE_FACILITY == 1) + + UBaseType_t uxEventGroupGetNumber( void* xEventGroup ) + { + UBaseType_t xReturn; + EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; + + if( xEventGroup == NULL ) + { + xReturn = 0; + } + else + { + xReturn = pxEventBits->uxEventGroupNumber; + } + + return xReturn; + } + +#endif + diff --git a/arch/xtensa/src/esp_wifi/heap_caps.c b/arch/xtensa/src/esp_wifi/heap_caps.c new file mode 100644 index 0000000000000..4ce78d6a89a60 --- /dev/null +++ b/arch/xtensa/src/esp_wifi/heap_caps.c @@ -0,0 +1,55 @@ +// 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 +#include +#include +#include "xtensa_attr.h" + +#define MAX_ALLOC (0xFFFFFFFF) +#define FREE_HEAP (100000) + +/* +Routine to allocate a bit of memory with certain capabilities. caps is a bitfield of MALLOC_CAP_* bits. +*/ +IRAM_ATTR void *heap_caps_malloc( size_t size, uint32_t caps ) +{ + ( void ) caps; + return malloc(size); +} + +IRAM_ATTR void *heap_caps_realloc( void *ptr, size_t size, int caps) +{ + ( void ) caps; + return realloc(ptr, size); +} + +IRAM_ATTR void *heap_caps_calloc( size_t n, size_t size, uint32_t caps) +{ + ( void ) caps; + return calloc(n, size) ; +} + +size_t heap_caps_get_largest_free_block( uint32_t caps ) +{ + ( void ) caps; + return MAX_ALLOC; + +} + +size_t heap_caps_get_free_size( uint32_t caps ) +{ + ( void ) caps; + return FREE_HEAP; +} \ No newline at end of file diff --git a/arch/xtensa/src/esp_wifi/intr_alloc.c b/arch/xtensa/src/esp_wifi/intr_alloc.c new file mode 100644 index 0000000000000..a7acb04ef9a66 --- /dev/null +++ b/arch/xtensa/src/esp_wifi/intr_alloc.c @@ -0,0 +1,130 @@ +// 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 +#include +#include +#include +#include +#include +#include +#include +#include +//#define LOG_LOCAL_LEVEL ESP_LOG_VERBOSE +#include +#include +#include +#include + +#include + +#include "irq/irq.h" + +#include +#include + +#if !CONFIG_FREERTOS_UNICORE +#include "esp_ipc.h" +#endif + +static const char* TAG = "intr_alloc"; +static portMUX_TYPE spinlock = portMUX_INITIALIZER_UNLOCKED; + +//This bitmask has an 1 if the int should be disabled when the flash is disabled. +static uint32_t non_iram_int_mask[portNUM_PROCESSORS]; +//This bitmask has 1 in it if the int was disabled using esp_intr_noniram_disable. +static uint32_t non_iram_int_disabled[portNUM_PROCESSORS]; +static bool non_iram_int_disabled_flag[portNUM_PROCESSORS]; +static irqstate_t s_irqstate; +static uint32_t s_irq_nested_cnt; +int inter_count = 0; + +extern xt_handler xt_set_interrupt_handler(int n, xt_handler f, void * arg); + +void IRAM_ATTR esp_intr_noniram_disable(void) +{ + irqstate_t flags = enter_critical_section(); + if (s_irq_nested_cnt++ == 0) { + s_irqstate = flags; + } +} + +void IRAM_ATTR esp_intr_noniram_enable(void) +{ + if (s_irq_nested_cnt && s_irq_nested_cnt-- == 1) { + leave_critical_section(s_irqstate); + } +} + +//We use ESP_EARLY_LOG* here because this can be called before the scheduler is running. +esp_err_t esp_intr_alloc_intrstatus(int source, int flags, uint32_t intrstatusreg, uint32_t intrstatusmask, intr_handler_t handler, + void *arg, intr_handle_t *ret_handle) +{ + int cpu = 0; + int ret = OK; + portENTER_CRITICAL(&spinlock); + inter_count = esp32_alloc_levelint(1); + if (inter_count < 0) { + /* Failed to allocate a CPU interrupt of this type */ + portEXIT_CRITICAL(&spinlock); + return ESP_FAIL; + } + /* Attach the GPIO peripheral to the allocated CPU interrupt */ + + up_disable_irq(inter_count); + esp32_attach_peripheral(cpu, source, inter_count); + //esp32_attach_peripheral(cpu, priv->config->periph, priv->cpuint); + /* Attach and enable the IRQ */ + xt_set_interrupt_handler(source, handler, arg); + if (ret == OK) { + /* Enable the CPU interrupt (RX and TX interrupts are still disabled + * in the UART + */ + portEXIT_CRITICAL(&spinlock); + return ESP_OK; + } + portEXIT_CRITICAL(&spinlock); + return ESP_FAIL; +} + +esp_err_t esp_intr_alloc(int source, int flags, intr_handler_t handler, void *arg, intr_handle_t *ret_handle) +{ + /* + As an optimization, we can create a table with the possible interrupt status registers and masks for every single + source there is. We can then add code here to look up an applicable value and pass that to the + esp_intr_alloc_intrstatus function. + */ + return esp_intr_alloc_intrstatus(source, flags, 0, 0, handler, arg, ret_handle); +} + +esp_err_t IRAM_ATTR esp_intr_enable(intr_handle_t handle) +{ + up_enable_irq(inter_count); + return ESP_OK; +} + +void IRAM_ATTR ets_isr_unmask(uint32_t mask) { + xt_ints_on(mask); +} + +void IRAM_ATTR ets_isr_mask(uint32_t mask) { + xt_ints_off(mask); +} + + + + diff --git a/arch/xtensa/src/esp_wifi/lib/libcoexist.a b/arch/xtensa/src/esp_wifi/lib/libcoexist.a new file mode 100755 index 0000000000000000000000000000000000000000..eff728e1ce1989a01a8f4020d37acedc440c1b3c GIT binary patch literal 114834 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 literal 0 HcmV?d00001 diff --git a/arch/xtensa/src/esp_wifi/lib/libdriver.a b/arch/xtensa/src/esp_wifi/lib/libdriver.a new file mode 100755 index 0000000000000000000000000000000000000000..57251a78dfdc89dee8e94947fb1f953bc6e9d07e GIT binary patch literal 1021672 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

1o8xAZjOkZI?|?4xLiyWcfMd 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≫TdU}UowRqZte%WnbszGT-Io23#38Kxr$M@< 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

05}Er_IxMczVESevW(I*jb3ooAzxC%GS5B#H(oG zzU?$D^Qn57PsK8yie)|(%X})9`BW_PsW^i+j9=zc^)jD|Wj+pDgQ@zBS>LuP(pCPB}Wn3DQvft??M%nNBV5oA!vcs+YOad6T))OUp7>eXei(f5LN8 z>*^kJPP9KE`L#dC+%Hx;PMH(!b2aPg^GV_s)SI2&$F;Gk%eEz4DAQ>+8u=Gc5#!!C={z1kfMeh?M*5jk} zNBb%LVIvTUN%fb^zxG+?U-dHos+aj!eFpW-zjef_ulMwTQUBSzjpdkQyqLBA2-aSW zx3?W*dKve)V@!P~KGiv|#C(}Aey={&{ZV}S`x-BU2y)!x)iKI=f5&}FVpzu_G2ACz zkbf4F#~q&+xw?O}{pYPNkU!e~>(?TGwEbr=9_Rf3UiWd0{|wsBIWOA8-Z(koePO1n zcRarM9~p}t6OVgeo^kyB4`FJ@I2p_DYc0~R#WUpZ!#|Z1_QeIR;_>(*gsHtx_4n!* zU8^(X*ZHX<_Kzd_HUHZ_ZdQXBa@^y6CypaJmJIswwtUCi;2<&2sV@iWcU{hj)-&DE9jkUod`|AhOXUzz_weX6&GWZ3^c{8KsM zvG9Z%@&_HucGrgtvV@LH_QyV_=l>HP*ZHpQ?-VEcnNH$FKhw$i>Z6WRK7;f*%>O6c zw<)gf@6@*)uI}58;mIf12k$nZ6CN)o4|3e&eLHQv$7`$5VOgVey^=Lb^&vLDBgaa; z1u8@SKKxTT;dwjHRs4hQn|ixe23>huW0~lU zOn$znoi-HS&qGXp-s59DD?L2m;V*kQi8{0&j=V@Qe@)9W^%o8P(lPHa5uR9}spIJFx8Ae)iM&tDZksQAB; zZ&&;h@-GsDvqrJC^ zrw%x!-_x{U>VE2peLn+pqc-=!vb*8&%&1J+aw8r1}o%iOrs|k;cFak)NVibc#!npRE{~ zyi=6+#lSoz<^5DgkV{PB-wa@hN!W0|Cbs$ElFGW=FNke^=vV5;A}3C*!aoT8M182( z^qgPnE07bLzESm+$catgq54V4iA~SYBoAYl*!1gEUyYpD^aHA|K~8M?2UO3#6Ptd! z>NCiRO}|U^b;yZLzen{PH?isWsUBUG`wdNhK=lid6Px~!>Nz*WrZ1uXD$m!zqEme- za`83vlyi`1UyNLQJ;~4OrGl$Ba>eh7*8AZ%0o9(KL+_a#pLAI zGt`eozCkfLKcg5~z>mbn`9)&od`9);l$eCR23TSeoT1{Jn1sFpdOs#vhny>r%P|W! zm5Qxy18tz6gq+yoc@6cbyA%0Gh+$Ku*y?UoeKm4otGieAY@awq0?7A~$io;TPVt}z z`5_YZ8O5nS0EqY%3pwXg_G{qC*T9@l@iiBF$T>)9;KeMFkwepCs zmFN8)kN8@7#MiK)U)HG&ImOq|N4{20@wIY_uYuV&@wIY_uc0TW_!@f78!{P7sMzLQ z)*skcKtIUWsI&rl@ilDn`WpJYzDC{1*RaX!Yv}X(8v4AxhCcH3T67E|zJ@-dILFu5 zc)kXXd<`7=8ki!!29A7v5^zF&4L$u*hm;16d<{$<@ij0-d<{&VHl(!j^bkWI`5HL# zHE`r>U~-DDfhpo^U~-DDm2)@B#`)JCW{jF%VgUA041g!ZcE&?a3_zbZ22l5A*h&n* zrc$xhmHi$1yfJ{fJ7F*TJ8Y^HTV3ws>}Na%{#NzuGqLUOuc)3eK%82Ke~{OZ$dgf= z`WOHO{-d6LBTn@ZXdEo?Vgope4d7DP$T|Q_k=Ov{{7*+pBFnQXLj7Qc1=*K|EA(4licPox!1Nu_vBsPF45*xtel-SU|$vHgq z&Y*6z&cKGT#CWs15@XO;K{x1_g1S4Qml%T$V~N=6N{m6zz7g9og>^W_pCEsN7&eS6 zVypWD)n||sTiqfZdmVJd7N7FD20Zo96Q}4v$PBfguQ(?Tul3>(IEq8yQrJrz0#hUo zf$1ZO!x1<~19vUTY3S)|_K7%(Ltyeq90F4$4uQ$jhLlzwi9_h=({a%{}MybzP;gL`8=Zf z3osY7slfIc#g)JxP|Ug#tLPi!L1Gp5jJHASA@o(ypNC|AXC3w@idEP!-Uh`g^t2rm ztEjsZdWluoFy02mD)brX2gNGta$T2Lg-xB}oLGgv9(q4klR9?B9~OHM`9lOG0?4}9+;dG^T1<) zH>jSR67$egB<6w1DKW2{67$OQG`5j5ME0?0Pi*_tO{(X_Hqg^|>^Jq?r-*Hyr>H(ePHgkcI;`7; z{1Rf+tx#-rn^j+loY?Ait9}x4V!P({7pkv9PHet=NcD_Q;?yVc5AtOsw#%3#P7UB6 zgr5zlmvI5xxhQ|TNPPx2#C9%vx#}5*#1rONqDl*vO*S)-t*FJz5^K2&V+ zAZrx#70?e_qfmDR^jw$7S*h6Sa$TZ+67oT76zcATUe+ksR4KN)T$fn48ac7Wq4?u^ zcZ?Gs0jFup1k7=XkAOLL@ewfRhi%Y?BK`tF0sJrif}Y&sFJR8C_zRev;xAxw%CQfa zoUKU4*+#6Kt5hE%7vI62{Ng)c&gTXs>$CU{dh(0!fXTmIZ3>Z#AC+H@iOTu3+EgNc zRx$f5$3*4)p6bc@BgM#qgT%`DIx*}+=sB;0Vgq%f*nkcF z$T+dO5*yHye^6|o?oQ|>Hekawf!OLwY(SrZ&W{b&;aCnKe}Wh`b&9R79KWEihu%Ma z(KqSE-o6hkI@NRDB(9*RNL&HaUlL0&m}{}5JZzhsj7^CpVDd;T0aGNFfXUN_lvbV| zV(96|b&3m-OZ-3|?fbyw{EXTlbMXT`IVEP4Q(^{s@<_}8hrkjuz~qsb0j5aI0F&n+ zlJ)K9#L%;E5+|q_#R>Ek&<~0e=qsTg6ep;AGxV~Cz=kn4C{CcSf__k(pzcoSB~D<& z7#kEP(6euY;skYn0=>iuY#3w2IdKAg20A}Z$E%FnO+1 zJu(+>%F{-@@~l#uDBhG);te>8H|6|{+9PxErkoOQ$|>=tJQ8ofA?%+;Vn5k8i8o-1 z#2YZjco50@Ch-P+6mQ^<;tl!=*ba&}=qsTg6mO^-txK@U8*k88q3)n~L*1RwOT57* zZ@fXDH{MV;iZ|HgjW_5s;Qs-V9q)L2;#|?U#CCoqpF5zhho0EtP0ppEXS~U|bRPgj zVrz*PZ@^K!0n-<=j^YiNoDy%q6gfTulT+eNIlqoFdBz}@bqV?!U^%yeK2&V`xE#Nr zuYi6~oS<$LC$Oo6&7gG&ddAP7I6>VnLoaaxn<~ZDF4rRVlkwxPOW#s`4RT`h^{-UV zm?6$tLvHYV3LNxK7~G1Y;!9r>R-348G=Y^oGnyW&&m<38OBJNBP_CN`h`TJ`iPvH4Vv1(;yY8^S0^ z1JkFcE9Sh7Q;bZ;KpW26OzPn{ewMn7Sb6Fd)2CM{CJ&Ygu|eiO!zxb)^~!U*+Hn5+ z6|--jP)wf=C?@Cqijf6d6tiz%Ay&?3RZmXwBlMhy;i?Z6+uTl3eFbu2TN_!2oVOsq zgc$v=RBUydRZpK1TirhDQFj;ewZy1frP%5|r21;)#8&rt)zhcM=FAqQ{@q#D$j@1hCJd^<+)Au zkx!LVdRvmU4T6#B@gs2gHC{cCe8K7~H7Pf@oMw&GLRa6X8w zuJ{!Cygo(U$fvN$>r?3S`V{)OPv!UvJ;x%)-#!4yDM;z1o=<@zp8`id1*UKew5Kn` zr=vZeLLd1QIPxhldBmr{6!9r=6q0cBz^#MReAf-PjP;hFK!}M_)PT<^13;>Hx z^_<(Y6(e)UT-b1Kr&Eu~tUPs!>Gyex$#b1zWbT-&JZ;n~&nmT{kJc$>-{d?B z_G5uJsGgjkQH;zTbCpw$xymWWTz*QsJj#SM~GoVzY|+sIsQV=z7bp9y}-1m--*rdd{!9s z8R&@3@8U}|&N&qS0!RJ@<{X}llx7DZa!v&t`S*+<;60nQ*hU-j)G3bqt32Xg<-uV? z?8zhkRUYv#Y%qN1U*#140!RJ@j{FNuk#j0wa*BVIb2rND8#%?lip9UM;T(#8p$`?? zJd1y!uYi7#e^EE`FKjAdGswTt)9=V4ABlfaH}WqwR$==`Xmcz6LBzk%)9=2251^bz z-G4#;pTw|X|B21l@|hia#(;cg=fptd`v~YWigRM1(Tf4#CXEXKW0L zAJmQF2R4k8i;%1?TqSK)At$zdT;d0HzYHB?hW*LAK0wdD`SG)p_Ne<4PGD1|*y_qU1ATm*`9AE}7W+(WzCNh>*~p2_*N0V~K~9|G>t&v=fg@i7b3Vn_ zz!dQ{Fz0hRQu-`+FZ^Z1(9^$-9+tUMM{F+uF!F zb)Q7OmKZiwimmQLs^@-6Y;|8&eGPJAi{W3Wp8XA|+DN#!>(HhU`ngEN^!1gB$#cD8Wb!n8+K`9)Kst0h;%n$5Un{5h z8aVPbaO7)Xiuf8h@^$Dq#n;eBzJ~rn*o&{BN6~%uQGbcAp|616_ciOVpY-*6iD5%u z6Pv%5sh++jHh=X|A9}t<-MqerKJM#7tP4GTO>Dk?MfLPGacVpML0(6qeMYgxfSeyf zUkAOMANB!2=(rGT@g|m`n>Z1eS99~t9^)^*ycgj zbJ%kpWIf*j0FiYDdd`Etp34~8ym0}G4t8naXk5S)85eLdu=sbp`)$zWDAPU~7xdA% zpwBxl=<|*X`Vf3Ft}g>Xq)+W$KY^ou0!RG>rbs`5i-Dz|n2-+vOFyA!KW{)vt3IhX z>N9Ne_8I!TeTF^+hu`N#%DEJ|^c4YE2z(0lz)}B!qy7U^r2oKC|DiYneJv8}lBZ5F z$1+bbd9G88%$?sV52iIpE6*ym;TYE`CgK#2f?Nix{GL|>u>{Ypr3@C*y^sK9(8vj{|GT` zsuWw@t*Wm^PHc6*t9rIiZ2Qzps-KOVIQ1C*K@K62KchHjt-yhc^C`Xtj(iQw`II#i zn1b#GY2e7$6TII9K~J7KwTXPKJmPERkuc1Fd<~nt zzJ@;T>%H0^woh!n{=VwzYvR-s_y_qR633fSoa5^b&)2{uv}FR0d<{$yUjs+J#$Xwz z7bDT0evy3~m>hFePo4#ek;xm+XiuISsaGEH1#on1g$;c~zvTD=dive>1?!LpAuYZn zf2i2%euy^E(~rdFNA8x?qq_T@@{<56i7Oo_MwXcGFvpYN$v%YrOI$5b+DlyHFu4*O zG^7eCajihD z?o5zAqy!J7kbb1ZQi1ZBBJn|oH&V~ZfNVxea6y7>M@lpjxfo3}IlLQLVwuBxh?^aL zp18%~{lu*fA0S@t@Ihia9C8>b(I!x?eI#%UqP&Kbpc5$x{2^{B{7y6hADNh6N}w>m zj3HLP(8uN%nSb>Q_YLz)J+b z*+r~=*+Z;;*+;B?IY6v_IYg{}IZCX4d4sqS{~$6a>KESMZhi@g)i0BX)i3-Fi1~%@ z(lEa)AXdLDC04(*5vyPLdvo(kAF=vn1F`yLBXNQ2+cppH^f2EgVm8lv_(cyN^zac6 zzvkgWv|~J_9vsHxqL)gY59|ZV&JE@O}@! zL_EyZJ?!CEJfH#}TinB`1+I3ynK+M49y8V}cbc!7uct`w`==HXrs_j!1O zhc|k78}SI&hn*gN+QZL#_(cyN^zac6zvkgW#E9{idU&jdD~Y*4LaIHS@$h^PFY$1T zhr2wy#>4#{zR$y(J-oxiyFI*@c%H(4_6VN?An^` z;d&1*@^GVvJ3PGF!|Oae;Nb^|dEyM&?%`b?-s9nY9zNjVLmocr;Ws>7jQz>l;_s>r zhs33>50gAx4`)0)-@{8h+~VOb53liXzlZN5KGn6g*~2?LyxYTjJ-pw; zFM0T|hhOzDZ`4Te1RGM~;V~Yr@NkufXM4Eb!;3uJ=;03H(_CAtJ-p7t10H_B!`nT) z%fov-ywAf2h)27&4te;fhu`pUG1gbJ=kHJrhaR5f;TjLu5ufhbTHxWO9&RJ%NhPG$ z!+jp!;NguP-sa(*9)8-x&wKbq;xk-Z2R(em!>@U`FqO40_3&5^S9-YG!x`c;U0d@# zyu`yT9`5q+8V~n-_&yJB_V5l5@AmLs;<2s|`#t=UhYx%BRS)w+s?{y=@E8wQc({uA zEZ5d-57&Emk%t>S+(CS{tGn96>pVQ*;Rigto%r3Z?k*4S@$fzmAMo%Y4Tn+($glwY9;+8$GLAaEXVc{K z&cg#9e!#=qJ-mx}qT}2{e4fMmh~MMz0pdvxA0nRY@KNF^4!=QszQe^h$4OK<%-=R8 zraBxFPjh$@@pOl4h^rm0Bfh}l1;jHPUP?UE;WpwLhkJ=dc*u%@D{_o8}K@_<=w5ftZH4^eEX0Vd~@D0H|m=PhiW1F-obnp@@l$# z8**PKIF!XPJLkV@FdqS@Q*HR-!F(pM*AO1d#NH}*EF13?g>Pl%y|D0DruM!(yjnAQ zvF35xA5WKaUu}3S>LFbjf2m>|=-xq?uX}ln<)wr9Z2ead4!QkUJ~m)h|62M+dEqZ_tF}PX3)L6bC0jb0D)tc!!Ta-O3%x(=GS?852K^Wc8k(xfjv z9mHeXha83(46zV;-Ogj_t%9E6;3Y7=G20v8dH%{br00AiOoyxA&@lJyj!Y=+%kRUP<5uw8gk3@p|(t|8FEY2P+O{|4zZ6izkpi7H#@>c+Xi2}lTAd<`1lYXA{`ob?It6_E%p z?-6IDgzwd_#eET|_%)PSpWARLN$%b7`L;o)Uta?`JLdf8>+@CN`*D8%Og?-i7xD2c zZl90eSJxq#kb}an(S5#}Mee!Pu?*SkmE|W!kzX106`oOmoIuqmjcPM%?oYAt;_^e(zw=^zlMqaL$pu!d~X8XvzVFh04r0%cnd_+54eWfR&_z8K>x#JweZpyzmPt>FB9Ki0p2A^83_ z#<$nwzv_#2FSK zb&XlRaVQ(#ycpjC@YS(`it*LO_zIh{eB)tje7DE=_`SGskkW8(jBhXaIR6~)Icmr9 zqcOgXL-g+pF~0p?|IYRJUX1ba`}R6)H?jVGH^w)xEW3a3GA`}dzyFBwg$Tra@q9GK zx3oDM&%FF=d}m<)N}z1<+y#)Ye|)C|>tv89^INk0<7H#xyEw+j@8Ks&4fl_Blvy#p zF|F=?Q~Kk4B;)&FjPKwOd`n_{4|sf2J-&~`_)2iFs>5~@>)-7$zHoVVyu7?^{rf_U zkKgU*JHBm>@f`u59p5hS`1Z&6_#MAqLYFRD|NbV%xA#W(o(s+&FQ;4oejVf62flp% zcqPWy*p~H&or^I3P6x3cFT6*fLVD)@S^vrah%>tF5coQP**{*s=Qi@meL=|KRuSG$ zP@$L^?I@Q35NB9`ENIX2@v=X+k*^ED?;r0ysDs{wc9fd|h%+oeo(A7O+U4FX*w`AMBTJ1QFwisU{P9pR1HOKhY^kn(C?%Oy%6634K z_m_NbhKcp>_84E=D%{&$;O1qa$H(IytJ}Qr`%1l4L@3F}?O%_z%kM8UdD?v{*6zC7 zaL%voUJo7{$KS{Jc9gp3ZA+tSN6dTJSSP~*q~yavzer~XN zxhlq2ahiMH068ee$9wGj{>@(-1iUwx^MX^xh)?dbL)rRw6nuqw`gdcD@93TQysG_c z^!V#OMM=`J7RqGcVW#|zGWWY!!f?uW3Z0r;oBPH+ufh#Yw`I0I>y(BlX`wu zHnI8pW{j`$6G6axr8$4gk!Z*L_upcCYu<%540;pedpXAU#)d3k8;p%l?kz+a<|1qG zAtB%Xo5b;!bu!K@*#Bo)J{)o)zDcm-bQxd&SoAy3{GA))+cuEp>+tv%#rW>ShmL%F z*Tnc%-x~x6b^ca*e0Rk7HlK~pzu0bK^S36(x8y$e8xZ=V3(4m1D>1%Z;LF#)M`L_l z;Isa9dwl;83H`Wm^k12VthLvaKC}0-~PnoTOH%;2j2=KQ#%%WVtn^~E_?orB{&-IXJUM>fiIEA zZ=Z_sb^K*^ydU-Wz82$qqXO4^^6)(w<6E*BebP9%!{d87##b^S2-ah}iTU?OF}|f+ zv)BKy1V`g7!1z9P61Q>Py*0+S2YjzUZ$dlDEit}rUwOM1lj z=@{S6%KYbHe-`5#csR>*#!!qHzJkmj|}WiHzVX`R}r&Y0=s*B#^A47>8kD%-yeF}uC6%Qw#t#q18jF5f)wiP`Z( za=!8YQ_OA*?DEBd+|P`D+jy&nusa!x4EIm7s~@7>%9vdv?C{Yi5}Us{F}p6<{dQAnZWN(3hzf%$ho5R@DVHv%+v{RaKSuf5r@$ zPMtY*29%J-5g)y5{@g^unCOoWiBGJJ#u-59M71a?gKPaOu^YyriJ$q~L37`})#*wvYN0zH8aEarkHc zF*viFczu7(hA~gg`RB8a2C(n%-qF9YVC}d6t>ny-5tB#sz30w*3d+CzO8CV)H}{7x zRgRr=?iuNl$N8^dZeal8WKdG}973U_Y%c$S1<$To(K7jB-YL-0x-vW`l;X0En^}7A zd&8>W{I<>&t>-u2*4EU1d;9sVJzbqW4LvP4pTDf>=JT&!)!Vz8y2UMRP-McN6Y6Xzp$ATsfs#`d!dBuxR=A;;DEF!K@Hn+t=^l zUFe%b`|9sN>`V{)@BQnxk@JTSObRj^vTD!)NTm^P#!D}zEt4y&6^7|kB%CL$eLcdd3rcGdDhW! zEv-GxlP~VPZDngq!?N2O+FMpMHDiu?+CSXd(A(LtyuG6%oE=t&Yu1E0x^tkD*}`)o zYJ-xJxfigp?PEq?II_QT&u;qhYw+VgoMHXh{DUplpU3blgReF3ynj#0StTbA{QS<( zoxJD3sDBB9fBNykpN-l$a?M{I-BfyTQ#kfy{DT_*H;n|};o(1<{D0n6dgjJ~f%KkD zqcF~Y+H@ECS~48fe~HpRZ+h=jSB%~{kbYn|Ha?3LX!E~Bjb8K@0|T!@y?;}wn!h

gVWW%HX^-Kg_S*G{*J^kE-*EFk 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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 literal 0 HcmV?d00001 diff --git a/arch/xtensa/src/esp_wifi/lib/libefuse.a b/arch/xtensa/src/esp_wifi/lib/libefuse.a new file mode 100755 index 0000000000000000000000000000000000000000..a8d7793dc3e713371b380652c1536f2040a15d2e GIT binary patch literal 62396 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

MRFN+cD+o1q*=wldieaKhHIlUl8t=t4L=ugOD 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 U@}nF|&hl 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 P{#wBqX+tg~+vWa0(9ckf literal 0 HcmV?d00001 diff --git a/arch/xtensa/src/esp_wifi/lib/libesp_common.a b/arch/xtensa/src/esp_wifi/lib/libesp_common.a new file mode 100755 index 0000000000000000000000000000000000000000..572491b7484eb4a23842f4ac474f91a52e21bd9b GIT binary patch literal 62274 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 N{=WWCOi8in{U0XQ0LZ`p#y%R0|n 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

DmRKsP4%MC9vTyMD5@OrY`r))IbVYu5c*L7F@ zy@n4MK1i1Pog;>i8$M|`6X#*o=lg_}p6)WBuaPd!Xby>+a_bHLX45{IYsjx2D$p=7I9U z>QxQREqvEb;RQX)^?VfZMAicERrftY+}T04p><4Y1;#zY(xof*%W5p_=abCN1e2{rP|`puZ#N(9s*lX9$5u zqS`A6*~`KGmV9*LOsYLT+qCx9;GrNd|7mZWu{R@RkN2g0)$ihvz0I(iL)(=A`u(vK`kN36lKKkRvki8PvD}hhh77U%h-W?%(ybt8}0yL=q zJ|D8T248^VGZfn6vrTR9wy-_iXL0V-p!WEE337>S$oWueyj%d8+S?bh*L_-QaU~X2 zd*2G#n>roOQKfzuI)Oc1AV!b3^%yM2Xh?$Edp2Zm%?vy%6nlJLs`Wb&s$U~MKdVt= zqQ~qXLiUc9rsgZSGO)*WNZFlQzh_`i7p$Qj?w27OKrUehVdqTGTY^ID54bY0r|&IO zdxvoEzkmfKsJ()az1%se@jMN>)Z=_G9boHMg!}%>#TFB_$9IL1ODIIxV(h_{fj##Q zd*ro#YhZ673rJ9VSA^_My43$3B-@Lo2liG%kM)DQT{sAPYJ&phHKK=U-i1TZW4~&k z4aQrbhbcJ-@5g5n#X-*3VfKq+Pd8l-z3rMoN?QzfKo9=|zZ^w7GO>~En2pG7^mBK} zUJ~{;<5<$5_U;MUI}StCqdmAhut)u<7Dl=mCyh9q&c2(B$o=9_;Pf8&4(RPV2fx`c V1$Dm|mOb>^7kl0g8j+xS{}lqyePET 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 @iK&g*6l# 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
F?)Siq;q~8HhiRAI*>D)`P48_u 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
9Xa4*= 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 ~ISUh2IHb>e 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≈fhL!OU& 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%0D^#i}@FOR(p?s9Y=R6_MV#*k%t2J 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

D@B;`xQ<#tH#bd0I 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

*yv~r$(1)LUWgf)bG}hC{Bo?%(E9SSu%HaXy&Y0 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

F)L~pTDdx1S=q<_E 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 literal 0 HcmV?d00001 diff --git a/arch/xtensa/src/esp_wifi/lib/libpp.a b/arch/xtensa/src/esp_wifi/lib/libpp.a new file mode 100755 index 0000000000000000000000000000000000000000..fcd2e67648546be5ba3f677228dc6de993db57e6 GIT binary patch literal 476546 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

qyv_FS+dTqgaB8aYGs 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 z zKR#bde~pOhZ*rQy#wxr^fGbF#j^Ua#T{Cot{Vexab$ph{mb-_McOp!Ito&0pJojCa{?YarJ8 z?N6)Ux@!OXM(O^(mFDmH@A&<~`rU5)olNt068<)*Gtn{mdYZr9XH))KMaT9|7}kFr zteu17$^he_2s*Z@0+FHpyO@Why>}q3?Y%M0--fIG`Pr=`I`X14f7Q>W`tL5$v3{RQ z^H+j{-{t@mzMAIm+3)$s18$Fd z5VgH8q}A^@56%Ph-=Q>r1>eW{r0hqZF#i6M?r)y|ogzqF(E7cR=C9(A|DAZ&?_NZ$ zUqMd)?K|%p&l~Bx>gR6+bX=!G@|xjKk6RtEslO8FvXKsnt`YvUPBbY`AEd5I>Sz67 zNGF5(`)HbO*BQ!n&zxaxoL0H82fE9Jx!|T@Tn2x3etI1`9DL=7ka4)BH{SD8|8XWJpkd_oVr&{C8hRe-9w4Kk9WX z(?wk!%D~w8NAOBS>T(e=9VE9I&^vky+H1}ewOm$3w*_@gzeN2}7Y(XwZeH59YW0ei ziEBO>VJN$7dfAlerI$^c4lXS%HGii}nH-5sDW5dO2_tpG?!9VWRUn|A*oQYI`;q08 zNG1Hw^2PYx`=#ELSzb8rf)lP9;NHA&UdOwMquJj7LpImg$O`l32R zHdit37zo_XHlV&o@?Q8$B3u~0;mN-wI{qg0-W~LQk@KrRCyqX_3#UilC>ZtmvpeJ7 z_V|!H@6W+;;}_ZAD9jnv^}r)p+)i)ZbI#FU?CQE;+ukRFXf|yx{KmNq2cP^^qT@Hd z(~PTUFh3pH)z+20x#x$W@YC>l>97k?^OF5h-5YvZl4QZOxjdOFuF@l1kim^QC1I%gZO0 zUOIK!r8iHmpEh;MWu+4$mraDpbzKC0SoC6dGi2!;-V9lI?Nv)>#jgG6yoC#{S~_pe zf~#t0&AaxB(qXe=bMV(MSgSDDrB3_ldV0$!_I+}SVDojVkS**oRm1hQtIiR`2vtgLT*!7{rRZ`DCCVwOKa17 zbEw}ZVd^7kdNw;1LheebO>?uQLdbQWP1_?9{p&94YeN051TkOF-Zfu$UrpPtr=Ca0 zR0w%8qlhWwnFAnfp|lx3;ZvoKFU(Z%n5A ze4c}AVE!jHfhE)1Bwc~!a16tplIDW>Pa|@x@?10zgwu^=VE%t1ve&sY_|1)gU@_VP6=)W-7PRSWzU!0!fC|L+(41h z$gbivV(0b`$PniC=d~~fE&^t#tDRNk^#z7vL^7K&U6|`F5#~hQEZl{qo4BE8IUI|+ z?)}273%io`$y_1^SO~%;h_us2&JlY|?8~skX};62{Dr~|STc|6viw!TtPdx1_1`Xb z+Q{l3nEW0tyN}-;(xBhZb#`_t0uNYxKQi|n_KSXR+V!n$BiF6~G7+fL?|K)Jxe`JN zqW(6;WU`Dm<|$_zjoXg0u4|W!nFuvfF1t+YQ%XjkFib<#??+dVr7ghZ_u^gsrOwX3 zu&cAw&G{6b$#sRR4KENpbxY^OAPaxzuMh*=cS)(XcuiBiWOdP%j$n%e017z^vHGtV1!v@GThpFVl#K{(%c9=R{qQ|S#A31i9Dkfbu z_??t`z%7~6ubT$Qw;grHY}Zu-`=}AI8D>yKRs< z9=`|U?~8-f@qBeK{@gqc?fbR&%|ZGrK%s*vm%lOkUOMJ6xZ?npa=1Hfd#LV103OTV zPj@ABT*tOo4n?r~=NnvpEKSE_vHg^&<7F{)B|NmX{#%JcfCkjz5v+uLib( z{H;y%_m1($59aD`TbjRyGx&Qr&0hq^Dy<*OSAS2Z`Q!P+K=u22n!ifpkDr>=-;dM$ zZ9ap)=hOT(8h^Y1qW<_^X8ccXxA+X?6l z=ybfi1e;zMp_V#^0_eyUOd#w+xe++vI4DHaa%ZObYlbG5D@ag(e1Ej{_dL!e3ZS9C z(TM7AS(?9g_=_N4gZf*N=I=QC6+uLQ5k&RJcPYX}azBbAQGv7u^|v<7UpU9V|3iOK zMD_O&bauZy3V-T@K9%{dMwVMjBLZ~;-Iw?m=AYH8q zELF#M!?6w(l2?azG=bTU@rc?EzB5wSq4aY|^Y@4}Xx>5CtiMC>M;-l5KvaL!o7KG{ zoNw=fp#*k*exr`#0>db|Er1?>w}Zb+sX>u*gU)@-TYyVoKQRTU&V6BI`I_6>TGll2 z-o*RemzX@MblPC=OT2@&vJ(EWwHWOf?e0s+C3U&R9*MNIM|VYoS#oDWue}dwfACZS z_U`De&R|w|*RE&*eI-837UG$}2BcuJ+C!XW^W<>_npbzFDQ0@9K_hh(u2Igu3G!x*s{& zUEbOLv(CuHoincJ?&)lvG`!=tiHpbH-`U<-_Gs5r4`f~5wQhf;EBE_F_eZf7>JomV zWZpM+2WHMg$y>g6Zr00*es#k=7{6Uxf?03fcS#g=yFMI^--5@@#Y6ieyLyK9-8a0u ztFNzX_=9gG9_{Jw{P6+Y4f$J1?BS<_(fDLYx`wX%Uc7hs{g1al-re!L1pdai|M>F9 zyYJ7fdJQFJcr)Av4q|L%dJ}Q*|0QP1^FD@mi@Lpq`5aL}ysN>_zgP0_K>k8Z+$9)k zk6-LB7vh6|DX#H7{y6V(=6G-63N!O>$3({EE7;+f|J?0<{(YbKm(PC0x39+lV17Mz zAnIq~hANj&;()?s2L>ybeKs^X5PCI9q z#{;N5_L%#F+{^xl!vDAK)9^Hcfzzo5y%x?Xk$XFr3dm58$uX@3Aw?VG{8=Rx}y5E%yYPaFMn$wMaf7a=mx zM%I42ltu*F$vjn{9wX8P+Q}Sbv^OI%(5^wZg{DtizW;S|OiU*H@87r3S>Jd1|Neag z`O!3Kg9_A)JR{H6)+{R-*2Vfq~z#F6o%i2~jJ$psltmU_wRBc#x_lPqUi?w_fvddNu@s3$>32=gYM@4pcJpc@9Ko+bV?DVp%Cn zO_MM+pA)7(_Bz+)jy1;EIoN5Z5Bef^V%aVH87vvJZan!?%?E$ zuv}{FtBsx8j+!bgc}`BIpR0vyuw>9{qil~}59K+NJJeyxcIkD@2pN7f=;IX}8_G^E z1Fnd6?&%1nh|2sNs9bG$0a>kgb|)*Us?th;oYx!=BhhO2|8RWEgEEUkj+8ObW9XCy0` zo{_9(dPe_>%JsfAceLORqdV`%uP6K;`$jDf_}qnLQ=fLdMuxnz4@Nh4kpAiisk?iS zI=4>_q8&Tm#~<6sup5!AQ@#Hgi8+2y-CiU)pS_>%ThOHUpYBHVsQv8b1f+F)aQ@Ph zKCAnYtW!ZFLMfaTU|ERBd7b_^SN;jnmdkl>Ab+pI&UGpf8LExHvyfJQ!{E&NYeF8! zkOpl>CPda>o$+U{vyDyj*9Avn!jSCn_<_W{-&n+ z%g07s3laVCIvREKw^01ap~XD|$!mxj)F0oaM02TRoWKe^j%r{YBcDk})sx{844i4n zl&@j(lh9GGVL5cgn!r-?+5xOXh2(8UJ7$8}4vq(H$CfmIeD`~gI)P5{Q)&JV!XI_? zhmVCxf7ENA0R8JBF!K1%@x^j;5l_1wf`PpRb`A8yz-_4e5Yu(TaL%KdNGsyk5A+eu z2*dkb51CTt9@m8O{h!n9e$lUlzpoeLH~GKKs<>+wk+zcF@zX|kypw3}jCWW$Bko4rkNDyRCkneF#eKMdfD|r#M6oVE$gtlgN=#3y{eODNF*O*UJZHQJk%8A{ z+S^LL8jUA5O&>Dm?}__6qxwMVnexQ`NI37|f?=Hpf3hW>2nX9IJfs(kkpHP*;TuzT z2eaxuxQtAS7l-0Oul(SDm6o<`i603Er+zcI@kSVaSz0!xbW%6W8y6z^vdcf}=U)rM zE2;czko>jFf5p$A3&U?x`Bx$NdzXLQ&%Y9eKcw=nK=O5$|C*nFISeOK`IjO2hRer> zWc?<=@aI(irAVH1`EU67m%#95Dt{c3e{uP5`uSsFcsrGU0g`XI{FBI^emm9L_^NY} z`6rk8Ix`orDw>&fju$<65+kfU{>J#P-OnpyESNp{XNt$uuZj;~hl(D2)2aVF{%fz` zB34N-GIqH?I`KUV>{Kfe7a>kZd^9c1{d61R5yW>8XCkgc+=o~QEp106y$#ECh)WP> zA{HXPgLnjSAL2H|b%;w4XCf9N+JJEq&JK^CuP1hGa_-5kb3ApOk-4zc{-yY2Ael&t-jkm;dI%CeTAGgQa2QRepO$j)JbsndpxTHoH@mKE?W>B92h z{!#lLJel~$^o*X}RY9+3ci)qX}EozPbOt-A}DAxZ;HWuQNErt^I)UO!T0Wd{=-2NUo;E!34g zW7>2~Ol&UO8{PjpcJc7;M%sKKp^D1y%cGK6g%WGp;xhmjwIw&oh zwdrd^%4=uAi2BPC{u1~w&uhDhd!2hP;+KKZSRQMDxT2!1rl#$!vB9j%y{E3scxw5o z3r<{=AKv-WMMWbnnp{}LV*{@1me*E5oR#gB{ZTp7TlZ(*jPCc!ek1m`K3SM-z84T?Ih>Tb8G-)3oL;Q-8Onw8iOpJYSCW#;|m_s)1{IB(PFF`e;l z>}#XX$JFA5V;7uw;n#_9c=vWMd_%`8{DuSPr4m=VmR}MZKl;PJE&o7au`8>v%as*w zS@|y$v7gTCVsTSYtC`s>t>i!^%BqvHnzSqy<-PFxWLd|xti}Dxy67XL-nwZ>xcs7t z7guF^;k|SdDQrx7iPFoTlV09XFXANSt25YeQ9z5aDc#j}WO7Oq zg@?$Fhg@mFj<-@J_?6@5o%FCl4C%)p9vgVxT9mfJUZhz*^B8r+(8e&O!@K?WiMnpw z)@t+Tyv`wBeei*8$G1J}tsnbt*2}?$aG~4iFZ?QTU*M5h9Vb}No>{N{t`_|eY-<*c6G5#1E3W^sVOZ7I>vYvK zi|eiT9{XN$jYY>UuG-^u#04OcWQ50VfNJCk%fz=_Kqs-<)6d&Q!?sPnNu%0 zKU`du;f2>`;ouTpyfNT~tE)iMYPwpV>dGvS52;xHQ1{~X;l=HrTwYUpvh<|9XHxgkNyBG!Jy@40yD3pIeLcD-tH29iAD&b<9UD5+ zRI02#QC@#xczJCsBb-?t%j&EjrS&blA+d2Zx~UUc1>wxje(QBymnd79=)|hU<@KX+ z5`Ya|Zq}Wf*m#Z?o)o^m?xFRMU6TlBZt1uBgO!Pn%Eb2i(cxiR;A53vX4w_+IC6U| zV@tn^;I|aEUAJxWyO}QsGj%*qPjq~kV=vQ!%L_5lc;(Sij-DKz2=_dZvm3Q~V0XXjK6zmR z9kjdt!m7Cm%vL|I+q?eTS&8uRC&FpE42kM^Y-D-z+4Z+C7m{QXiNJ3G_||w^QLeuE<6? z8`nbWeF>8o-{r(>IX1ok+s60E<6Otj^cs227|ii{#(s8sxTh7T(qB10m^ING-^f1P z9?c!~cxPzD_WInF1#Me)$nMt}&B8hPqJtUx~rT=Y)8S5k9}@rX7~N= z?Hz4ff`RSvd%Z`-?v8Qi{>u61cR$kYb&b9MzRP>s@B3nV=a|k|02!PYe0n0t?Rp~O z?G9yj{3pjF#}f`PI1PWR_@c5G66GOp+t??9;oZB3W=Eb`-tiwQLi&kd$01Eho4Uq+ zwkK=LV_sK1YkNF%J7%-^z1zQE7mv5?4hFqv#!ekI!h3Y=qYt3I+hal0=80_9$7g8$ zfwmv)&YO#fjcf$%xuzz|*Bd$-bYp^_0kyBWw4Vo==CvQ5JpL0lW+M9v zFOKClq@PFBVkX2tApx9sq)uI{Rbi}p>qi+Z!R#P4mv z4)>L@50AX596Q{ku@8^Pm~lVGFE%q$EpBIPiQjwIhyonBxW7%hytQ=d7fZ{>l)L>6 zAK3ieEo+EZ9?IPOlblHvSAP5IY80^%4m~7*RRQnjJ;AI@R66g5`^t7CHciSZj}AWo z1r|8w*p83{w!K_*@yb3G05w8F5F4=NPi z+Of%K&cZ>yV}sG~b8F$;j&|R)ntn38!pl28;TxLh2Qxvud7f+_$edvFw_}oc;Cn1#@=C>T_eUQMIwc+88fO_#Un}5ew!{ zU66w>M_-N^?^;%N)TEW`kK*JyBNhv@K2ym^G7B(AhzE)znfFrFX|iY_8V<9Zu^Zg8rgp5`KHwN z%l8fax8JNlOLF^7k?nU~W_|zd_v)##*G|3v_6vuOW_Z_x&b0l0acVlZpI!kvZTpo6 zb7x znTNe*^FzEM#chtMw?24Q_y0P0H&P2oXXwN;pg5sWB+4+ z{>IGgZ*Ms@duDLsuf13_ue);iuFCxt&$sQ4o;T{5{lU?@>(48%&wnv?0o-ld*LS45 zVprSK*HpyD#A2gi!tPpikN1_C7azDA^Fw?5@$MOq$IEAx*0lZSWx=c;dKm6FFkd|h z7g)>P3I`5)+k?fMf3`hZ@Z=q*zH)iyiN}ZIx}Da0d-MZenUooy#ERl?&ZNhhPEDN= zta^r{J?kU*ZHu<>cQ8xc{I%f5h*!4qRO!n2v@Cy?dLp~yPWF#KPi@5WO@;Ts*5cdT zP|xQ~1>0>#hg)mhARV_D9WJR9&V_BIZ{v91h^Gh&FNdw(xAhzH2R3;AkjFXw6nC(n zecFI8JylkUjnNx=&-v!i;pl>^Id+%U5^Gg`Wx%} zH_!OUWADBjUm0)Aier!XJ3cC7-@rN3tp~7|+=yAB z7ZWthL`g8p$K*yeKGftdb^TNNLdfC~&VAglv#Vj2g;c;%> zlO5~-$-83KENA2u-zv`61dN6dSFVkYj9q1~T+jbk^j2PNeE|;S<@GqDy8ydWEOt(L z{dt&NYGb3z;~oTlF3dE^-KQ@gUX1ja zVjuE5Fv?dU&PSYqco|~Pd&E-Y4a4n$x3IZhM&xfVK8<(*Y-fsJM*iKnN4gC0M#M#k z^AWq>Bl4Y!2*D!!!TEmAZroMu9ol|>U%PYl#@U{nm6>_wI`6%)w}!LVHsQE%WI># z*L`#9{2wJYeZB0#A0@hmj_O*xAIE|C!u>VPZTHR6;(BLw1`FrB@ztTYo`9ivZrAXv zad;Fknt#`2nay`_e#PIMyE=nshchlJ4p!~(I{sJUu4%!n?OsdPujA66CF$9O9IWKNp=G}#z zvkvO~IWK43 zdD)PTM|s-OIb>*0$H8TX=O4fQ(B38g8c+0vM_u>feB8pDm$T{e54;g?5K|zWvujt| zq8l>~m%1a6+E!iJHXrC>yA~d%*E+# z{p_4reL>c_UhLVE=*h60NY-cM)GUhBR@$vI{~CYLT>XomzIw`*Cz{$1|QhGd&~&uVk10UlNHVIk_Cr{w74;;=l9D-Bx2E#7=YLBzkYXZ zeQs@RR7A95(x+;KnZ|4#X2O@${Q#&=Pz$b#upG zF?UpA?sz-#!rO@_-{#!$HamxN2O5*=cgz;!Ia>_V=2zE$5mGqZh)#?5Bqo4nsE2mWSaZWz=o^NM+piAS!~8UN_oMzn;*|cLz6)Lp{sC^zlEv zmH1&0^?Wn&!kdXF-%Lz5a~v*UwYTSQ>z%qP+!@U7l-Uf|j)FsziG!_2c9wr>!=H{N z;N)21g=2{)kI~7mrLixEGDq!e?}==WXS^87dj7v!@4Wwlmvg*Jp85SF-Q8^uf9veN zuI^6k;_7@<*99luVMP&a{lnOw1`24;tNU>q=7&N5#*yn}%-tsv(JyzPO0Oqgcs=pt z>+FAbhX(z>C7Ait^%>KG-}v)w(^}s7&f9rE44pVJ*{yy&cJ!6Z;viZPUFPBIGU)H< zmp9{6;SGN}lK9n;#0y6fPadH!caMSFa?H;Y(V(|28r~f)C=X?qMwgHOYF;?o-G4^9 zGakSr5|PeGyL<2@&mOJ@YL2tvxHsl+iEz#nIpN=x;WxxiCcYW^W^i|X;LiKPqn_Sg zJq#mvSG?^9T^zbkp1?yTVcds{&K(xci_Sea9F5M6hRdUKCx&CuxiiAG(YaOO`sm!+ za7%RVO&s){To1GOW4}y9=iUO#on7Hk-`sMw^V{9_gU6ZQ@$*D@c{m5RprQ}{ED`>2 z_#@$uefw~tyt+2ry1RPV_Udz^)zLSqC%#-gI*e+FkfaXLfkg^i>c3jn68$Cx*7<<%A2OdBZNAux0!0<0mZN zc%ElWUpzj3LJcN$W7@uN{DdpA&bFo-|u?dm4?9#5x?)i2uadIC##$+G>CNVvNFzDTFL zK6$|j-@fj6`y;vQ_PVDtc-_+3i|ZpF%rM=UJdeRT*iCtzdFWZ~?HP-D!#(wX`CV{h zsW=zE_D{G1@7C`b8Xn2(xQ{;;|6>FX>U6xA_}MS_ zb*y#8H^NR!c zT=Yan$M=|!e!#fEZvYl&r*(^0nbt4R&3~KU>#K>z(J70AvlmXP_`k?|`|zl$bMJr8 zOb8P)NC*)l#JV#?nP{X*h!PZQfQZ4Oh8HzjdPpF_paDV%8Y~_sf$D&GnnYTI#Wqmd z280?YT2yEwrAifBu=EsLY@_v5v|6K5MWyWD_q+C5Gk1nqb3Nzz)Z6g`Iv&>`q-Mh_nZ~SQSER^W6_N%5noYB$}Qfh zJ`}?1>3rqkTTbKKq8h6A-MXNRaIn4QGpEBF!2x~lYK)fEJcN%5?esH-?IG{BU~<#w zNQNCQ$CdE#$)a$$yy?LCcn~ri>BQ587ln|OcL+qYo3bXJVta~$?SXSvd{pMe4@~!> zJG=Y-jp6%p58j%00#8Do*Au=mr8Hb#YTQpcaDGu%XXCpLZm7DbgKHa2pP$ghQgRb5 zs|&#h>WV@z3=i(ZtwIrR=1FH<*$DjHMFlqu!?pH^e_Yw1+_9ZqV~1wCrCG*Dw4E)e z>FS3rkt+$yGXLcSMs|3U*R;2#1pLhpJcJ812T!&?u<~F>=Er#7qy4~2W-)JXj9rsA z*YoM)Q)l0gO9RRFCcE)7t`FQS*7S1X&d0->ULJ_idBS=2gwtAm;mg$*wN{UAtq$$0 z&fZya#mpwPKJ5^0UXtb&OG>ji^LlpkrqM*DdgToJh;_Pd; zup8afKEQqLWpE=puJL^bx1^z&^XCl@c=M2Y-^s5Y(OUhb*6NY@)x5Zgdz%7Y=<=(- zly7vrPy1{5ZAoE!PC0>Z27D7gbC!JOG%Iziv+hV5{xJU3U{bN5xzQOo~0ZAq=!A)H4a zpU4dEPaXKZtvbDFU&Y*g3-JET-PkWi{2hs|gYk*DhhS()8>vYdpA;D8wiOdtxT$@r|5z$!)OR=n0#Bpqh;e>vyD$HjoYb zwqPMX*QW1B<6UTmCoZh5Ts9LgrqlPIxo8daCVCTniRaoyc!t67czkmKk2+gE>s%WQ zav3*6U*yF`Ok^uEQ?QJJ_2)Ncx7>S{cMusJ z2J#Le&%ikx?+|Y?8J!7oxe(7q7)IUbKbiH^{uOKginV{m+P`AuKiO>~{LA)2`+ueF z=X-~H&u0Bmw{yH_d($)z_ojJ=X+GOK%$rIs$MbgHRPRvojd*s!FzN=aH-&n%7v%N> z9!dbYoR4=Gpe)rcU6x^%Wte3t)@3QyWhvHWDOP3a{?TQr@qn`aH{;>+#)-R5F|I7g z|69+0)7Ns{z6)B z%FBqeGxnxlCZExp*pzGX8+)_d)W?)#(k#wAlg(wGkbBB*^?am) zLOq#zsShGhs3#l!g;YYQCmTHnX}#Az}*kWMe;pN(l8vOuLvi zOnXnr%_rMv>Tde4FF*gAyzFn5VPf_T`;+oTWtlv(Ze$yQK4sgHO4 z6za(~0`(gZDAbc}1nT!7P^c%{2-F`#piocdDLd-lMZh&NwZ2XvrqG6LBhZGAGEk@| z^ARTM#|u5#==rz=h4y6nr+pQei>RLuI7{p6wM`J|mBMC~)-&%zU<&h+c~nR}AIYFl zPo|E3HVFQnu)!iFW{fdmnA@QzTm>caGQ)ojrZONt*LOq!=eezI` z(w9%>^@Lm>Hkkek5Gb@Kb6nBSBm^#}z8Hb)m-s zfo-P#egq2jWX^jmuLXfZJ=yr#KqZ8FvZ?1*F!NEr4Z+lBH<&^_+35FE389{B{Qnkg z>Ujuk>iHg+LVL2QC&vJVda}{`#P&j_f7b6Tu&E~>!QgEoL4C$kRJ=OR%0@>34I zCuCWSX-}UuIxz211Pb$#**5BVOEHCdaw1~txlK{1C-Yc}`mYE*c>r`lgvnqoqCHRP z8U0i$A=HzN{(7M&8~seM*_LO6uSY)m-zx0MW~}ZNdUC3^|1Fq{SneS}MC*AgHHCVz zY43jsJ(=515TQ}%$s9k_^A&Xz`XOJ2m@3|uO`)F5xqzy{KKy}DPyQj|Ai_>Cms7tB z%$WK;!k*0WO8x6XPv*AG{DV1wAj&^@ESUC1LQgJ)j`j^gPv-njJuXcsp&zo@zy1Ks z<<#?*baNcFOW2c5|NKVi$)=x=2tC=@{{w9N_h|bd%KAvylg+VrfCC1?`jC0-!Tje6 zJ(5by_Q?6gFc%nR5uT8{4VrBy1-dc>`m9D^KeIj$A((Ns4s7cG6EJOApH75P2(5Vj-3Zi^Uq_%YuMtzXtDvAAV^eMsm~#R1)*?`tm&|^q{!RquBR3#W`tnbm zC*&^M0cM`35UxaE-j5I{v?FuBOg$?@Tk3IEE4qKr1W$&JHkI0j%wuc{?Twf=avNbC z7<0~|X@_Q(kp_k7|Eq)_vY9JNgr3ZKfO&5PGiJG*PmDc}|0&dy&9U?fFc(pO58wvG ztp7o<*`|0?y0M{i?z311Z;hfbFWKmWU@oFw-9m+!Y2H#rp`L8)r+~SLdfs|v^t=^| zLOt2&c{>(`dh!~?L4*@vGd|D4Trp7V&jwRyPyQNWx~LU;@-XP=XC>IQcNN(5;e*1S z%>JRDE}dD4F5gV+r=WS+2&)d!@v?m)qZ#$z< zPd5D%KVO;t`Mt0w^Z0}1c`>(`audL24jcwH{lnLIah?ex@D?=+%Ox|({Jgb|LOt2& zdD|O>dNRi(?RiTag?h5lSA$Ktymij#!$Qy7>WrSZ(^2S$JPtAI`CFkUn=$hinDY*8 zLY!D2%u5a-roL3@$>!LyQgDN?A+tZ3_lICpf8LtM@#aN%O6Yk@pV7Z0^t|2A=wB0h z-U?{+{}g)OCTR3YSkb0j-a=^fyls%eHj?j0%zADHn?CtD82^?2R|E*{$x{)t{%1kK znEDj_;dw5m#|V8c*o+f>i=nb7b9K<3w5ycF6RF@B1m zpdZF5WQ0-#<8!IjF>gHr{nBSU0)_f^1Rl3gza4=>J$XI?^~2!U)Q$T=9-mNeQwgCx z`EJD2$Df1ZaUJy?!k*0W>_ylI<}o2{J{2}(b1WTzAy)@&&SoYE%O$5FrYc+L$?Q9- zZpI(Fr9F?gjh_lI^9B)?fhn{hb39PL3e0Vj{4m(~X#?}Pl=>&Y_^IR)Ar-QrrbiX*_LktGoNY~*!1&!usKHJKGfu00>*z;hk9Z2 zpJ3xB3^x6<8f<(%3^sn+z}ec*vqHZQOg}+{{a|yP`CDOg2s|0fX*Ue}HRCf4Y_`Es zV&6wL`h1}$8$Zj0o^0xHm(Zg)C1%@E+e^sZZfM4Oa4d{MV1DkGOx-v(+2?H6O$ZeB zIoWJeO<*(UJPbB1lHkJ1TJTu*$AeeZvz|q zYOsw!y9fe>_T(=kQ2#RoW4~ML=>KWKd%zUtHDcu?PD9lSX z^}HQC5rJhrhG6Qj4a_-#`sWbngLw}im^tSNnEMpkyn;ZX4Vmka`d1Ms)EhB%wxRHZ z+`jo8m}Pv3KB|q-uP5ZL zXR|$WOqsFHF;j^UMEDJY87IfVrtR;7Sq^R9L!k6kmib-An9`SxISye=>C1-m1?$XM zF=8a~F<-YH_h~)r^N7~b504GZe(fhkHXisK8u-wZKD1G^nZ881EF)|&2KC2KYedT2v zJt4QPCNIa5IWHIAx2y{Tf76?FJsZsSQok61(pOn>9$=kWHL93{Q^i`HxM(`8PZm$&D zlldEgeJ8g~veADPOrbs5=*y^tP){~`Io`-dUkCOf(0-X__Co^#%O~HBK%tEh)6Y!* z|BX!_^oo7z5H_arMW;Yl=j-*hS$6uBF=LQVopy<-eCm)*rp+|x>U`GKv4tR?+SSBV zK6PqBrp=IXbv|{8UM{~OmH_$GR25VC)MZVXo)t?ddmf(0#HWUzOy3$yfP8AYim80o z*JBB_+#JrjYM)gRx177wnE0Yos;l#<%dK*`*|g2_J7Nn#K5JoI+Dx0qeo5T&rEzI) zJ~8oGcf}GQpS3(L{f)TvinuhV)tLCK|BNL-K6OYMQ~9jMSVAptic7DIOMf#ieSchf zbzJ&^xb%Z@>2JlQTjJ6W#ihR;mwq@dy*@7e-MI9lap~{Jr8mZF8xGY`pLMo*-g7@pSlGkX5v$a8Zyn@MNE9Cv6TP!zoBjp@7-FT`K=i4+GBF& zH}6wp3qd}0_!U$6)M1oNpB+mm`{8lvbK=rGY={YN)s7`V{I-h}U$3{mb2$&|V&YSW zLNfiOSOVmW-dg3Ved^FJW`c)IVhLr>Lxq_5)Tter&Wa^KK6NWtOy!H-p5f|z*67$m zWgm)5XUC;^xE>Rq`pF^FIk5!Dr!GmvRKDn`UsvZ-r)}hN9(u;a7rjl))!`Kuv4tRC z^z?*T&O^+Y_|##iOq-t*uFj_}$;#zV#}Xi)^-NrPZ*+^~NJz!;gdAZUy%!_!V3h~8 zsW?6;LQLTSXDSXOXCUT*D}NZL;`o3EiahA!!C)$u$~_eQaSy`fm1_Ac^+TI!9;l|` zbe)-jIC4{QYT+fsET3y475o3!5F4St4^09w(;n2r2-7?nUW0f$oTTD-Aq#2hUq(p9 z@xfSa@78yoH3@0f=RXjqqBW(6JCOb(l&LsA;6-3A=a1@C>kjK~q)Wl0mH&n69sfuw zVL9ut+z8X#kY<0eA5!r%YY)t>Z+Vm*g6+sc_b)mmyDMcM}cPNkPwuOV%O{@z8J z_2Hf~6~_;s=;Z@c`Wtv|0swLQbA>gcSNfjl33>iNO2zTQI4q~%zo_)R7B4bWI8&wK zcwvrCbEZkfmx%a%>k!zrUx{zOA)$qSTH?|?DQ|?!zmGK6uUq~%t;dk&tivO}R9sqn z8fmtVGfk?sT76HEX^#9MN|e z2D~d;8BV;ewD?B%shzrc_)^xa2KA(l(YSACRz{^2brlQE%cJ97G;OIuY8KySmdCwZ z+Nk5+Bkih--4`w671OadKf6nMzjYdISy;8Sdd`BSbC%Xu)YVs2LbG`3f;sb-Et+kK+xt{T>_qIS-r#dB)vthOP%>NRo%Ra_4Rnb%BsOyoV<9^{OcCXRrR>Os;Y9vteJ`zFDhQJ6dwRuR5h<& zD`w8CSTvIzCDN+ZY{P=3ZZj9@g{7ssOWcKe7~FtnR@5(8yr`l^+2JkP$l1q2cywDf z2l=gqRSV}WtYw6*QmNYI=%hKfq2m@-EahsMQ@LO%dqUawPR^OTe9nSJ^;LEAE9SAM zR5q+}V@fY9MK586RgTK42C38U@1|<;qMGF#Gb)>E;37PwMsVNt%`Yb{nuFJs&sm5U zm#YPpRSRgN%b35Q!K`Vu_M_>_xwon6aX2U^te8==Q1Ar7MS_b3mk6FF zxK!{g!DWJH3oaL2DY#m2jo@0r^@1A&uMiv-yh?CH@LIvmg4YRd6TCriyWq`&I|KtQ z4-Z%%+%KkKj;E+G12#w19(}q-*(3-XFm1Tc&st4^htXjg`4jM@(7!}0s3n+ zUx)Zwp}$S@Ld3TV{r#FBM7&1mf2?^s;;lmeyylk>zaaE)YJL~-+d|J{R@QAWV&2qj z>N#3)vEVtH>1T=1Kd8ALF~tL)6s~f^e!&63DT31kb4-}L8G>!WS%O1?a|GuKE)ZNO zc!J;}!Nr101WyxODtMOQGQqP2mkX{GTrIdpaIN5a!3}~}2v+@k0~8R||6g^Pe?6=? zWE29w4Mt&~keM8>nfY$g%(~p7nKpTvsS6-@9>5<+CPG@0d%@`v&D3A2c@p9Z%@M@Q z1oNyE^RnFEYVJmSTr?Z~?e{-;G@+XMZ_5wZv zrg%6IAZZMP6sj9#$mb!c<}qya{4I!VRvMVU7kO+>&PJSq;2DfR5Y<1LuR=NvifY8g zniCLTr+EotjwRZ#y{gZ_)T_2=W`5dGxZcT3syP902)s?}>Hi7MuOQy7nf{*@`h$X* z-}rw+Guw2b<{ZRqCv7;7GEL?<`m*K?h}F1)z8E}C>sj~ln%P!%H}lR$%yyDn5Hmk{ z8)BZJB(q){HM1R?HSb5vw$X+UU{E|@N&gJL)NH7nyy|-+pA4!~HJ#KM`|G zlP^NdwirE+^9-x)SKCh%`eMzq5Kj|&HEy+ih0rH}J`+rrzH||Bb)lD zxeI^T2b{Cgz$~BVF~~)TDV}e+G0Uc&LQd9tRaT2qtMeYTp^oD}S?krd*6P}*c>p%l zk(0Ha(_&g$>>(}>Y$$3SL2o!2`T!EM5j<0rTCG2iKIWW7y~ov;lBc@NF=@7=5^}Mt zXXIJqauHeEv#*Q|w>1wN1>rdHJgiWSEzfscW_!*4B8$uw1+ftfv)@b|(#hY(9|)Ug z+Jd2Dc{tD@Y^Ud1g{r@do>lR%5n4RgxUd*e8dfHKvx;Pv`I2TEv7?!F~AH2a~y zSTp;eKyv~3M$OYu=dWolLWlgPWHjyH>HoOq zV(9;_xd=QE%jk#pgEZ5gzk8_Xs!`|B!1RBS)^kix8lRWrvdA6%m!%71H~ z1^$a>?$_SZjOJRWh0P!+n3pzR(p(0cOrr;1shJP#-6U*o(VPYw-jqr|dOGk7{PS+BNf`K0fG18|piR{SIMsKr`3Ti<-G!4r}H^YsWQn-ThtIe5jcZu+ffX z&4x`P(q#Hf(oCPUqn>_-3;imjss9n;`vjMR&A#b-T2CF>%%9A|yhjl~tND4v`!(}n z#Y(W5$NsGK)RE0R_KDVWyF8_tdDZVP_~%&Q1KBK#+or9V50PG=nZL;{(#(fNzpR-L zh^pVS$jjfd>h~;|4|MTcx%A10LU(B9gP`1QsXv7HbU)?=7Af8Qdw8hv8c#qC;89oejl?`!=o#N$vl>&7vD zxn@2XxmYvDb)9C8f7X@ujbM&-G9Pea9x@-cq+7~Q8dgVV4xe+2PUni09bm7wniXClys#||u)+>MxNGLJpf z@rl-RE~CB^F?UO3`oBr=9L-!ucWGXSSoK>H0HU@X6sp!FYWeI~Y}2?!=HAIda&ak!=!UF6mcc`LD8rNKN-AE9l$(6c?v z%flERmXSX~tmZDw+qHf#Vy-{hJcU@D^8wSpnsdOco0>PktmAkD+S7((z{4NB5HFV+pzzQ=1b5Rbvyt+%fNwuhU$QJ}lFm1Dj= z*9(IGEcgS#_(YWQL;Deer)Xy1PSwo5eLyq&_Ib^0V=@d`9}nt$fo9rVteI_@sJRgO z>ow0qJX3I);I9i_ruiYn4+`$kyc2PkX4YpQ%42;vJ~K35fH+U{<%nl$W<7Tx(4O=6 zPc?_J{3*>pNBoS?Kdbq9#QTN*14#)F{oI zQ`K)4*zlN#cC_bQQLUN&mulvN>*{w6Z1|wEIu-)+cg%CzhWu;Id=aO4!bbi6f*`+J-u^u_+fef73S9k&R8Iu=!ZqP)9a4)xt*o zzC%5!BO9920zr1 z&3ZYc?Roq>P|wfo^PpxvJYO&BIa%weBb$0Q2%B5A4RvH=vqIR^X&dUu#wILm)@U2* z$i`-))^9`noMt}E{|C*SA70hW2mAjj_;11{N$(f&3sUQmFS^iM?C{9M~mM>aNVh0V*_hB~sbX%;qr(>BzRjmj%;k&gw0ucA4(nB z*l>T$ez*|vD9s$_`I;vozEty95I?S&FDckS|9YJ7)_Us5W}J6vJzsDz0PB@yaUbs2 zoPx53Y0gDFR`Ynomucqu`if@0ETEm`qMel6wZ2`mY1d|?jZKrbp^j{9xQ}Oj)+7Fo zW|qY?_1{OlLFhMW=8FlQ(EJSI-I|&Av}V;Vr0It*EZ}h}xd1W61EwS(7)I782Lz`G zP7|CiI76^4I7@IyaE{-Ys~K;4Z=Y1s@Q6Q1Bta zM+6@gd`xh+;5P&x7yORk9>FIBpA>vbu!Z9~Gv*VhFUB9pV1%>`h3@$lFqdDb^*M-h z5j>Oe2a<(guA!%s^|ik=!71cP_yY+bm}?e(vM!fp7(Fn09pPqh8crb4hdNgSrti60 z&oZktv)Z+q8E@6h7bQHQ*+$HB3iQdkAJZH{{JQ2`#5^BO8@@#2Jk1v%&ecr&X`0z5 z4{OduSw9r~vF1TI_De;e&kDrqxL5Nmt!G}If27SQbV!5d0{CC2`BB6Sv?+vsr)K8e zqnY*jmC(Pf*@pfjp+Bve=WltePoK0Y(9C}0i!P|=dQ-ps!PN8jKlNOP-_T6`I>GAL z6*d!K^8>91T0hgwb^dc<->sSTPr*X^XS;08eDTMZg?^G|+N*Pygcv9G`R`!y_ySAA6^2az8x_Gndhr^YGyzDTJvuZ zAJWXo%;kk2lo*a6PyGyj5$Ms`1^IVrY_XQj3zoqrOkBdRo z6Y-;(*`Iqg??YUSI+%U5`rQXV)RE0T`tREQQ^e}r6m0mim{VGRHh3Tc%c6dWW}bH+ zshMMbl+YJx=KbmF{1x)DZt6E0nD#v1O`nILuhe`yVs%~%dcM#^ovYV*zoBjTTkXFz z^ITWEX8Qk;=52@>=%3rrlM>ibU&i`q=2$M*%zMJ;Y32)G7--M)VI}O(@8b`I zY3ivXCu{wETF-508kTw5@drY`w5N`o+)gdlsn&B_RKEdX!!fo|>&Z_DR=>Gm!)<6V z0)6u3I3qOMh|kl!4Ek)%+_rKwvkz-DbK6qaBjCq_a=6W#c^-?R%({9e@~?Z3QQDVW z9)*ZZTeTkn(?_<}2M}|PqYYzq-WbgJEd{}Bzhkrwb!4;svVWQPCd6f$d8&4q<|f4d zw$4Q`fP@gz&R6K(3j}7J^R=EnF4fFB7ing!u4U`IoOkGldGFH9ymxD6-fwDVjBZu- z>?d3E(}-2S!A~(*_QU1chB~t8hikRI8ZpNZ>o6NJ=Q?tPF@ovOd$pcAvhlNC>sf~% zY2J-E9ii7f0B1n~VSCJYU^@-7{hq7vM~l(tA)RKs%E_8(`&G^KalK~xR@W?Sw-4AJ z=4ITdne|_%nSQwLX+uAcXr`Y>HM8G3G&A0&neF?f<|Bx|ta%RN3nY34qmMlOn*Pr%(`@HW*wi>%({=)%qFyG-iTP$hYqxOSP{tC2x&ou>Nu9n z{ka;4n$^0~yg=L2W`*F@npsY&W^O~5XkLf7NU%C4flun^3;lAz>ROn#f!gwbDXJ}+ zRiA5C>q4_yN1D~T)2!C1X0@(0+wg1rX9*4o=K3-=xq=G>7Yd#rxJYoZ;1a>p1eXe) zCAduRY{BJ%D+Q~*;sl_@T=%R)I*pBkEJGmER-OL``@!dG{kw?I7o4T}BE+MG{xZ#M zw;G4=!@QHUz63EhA(ln`e`sEWxI#1MfmbviN37PVKA-ct)>B6|=X2iHdTz(c{wx5* zk6^Y<)em~x2R*iWueN-YCo3)x*jvAk^;aJBBX}OiAIO~uw4siito5t3{wIjlcy0zjxJ}ZYI=$K>xF$})(b7ox>IA16A46(F)(efMMwij*AbZI-l6p=h?$Kxm5dQg->NYQJ#}Q$ zwV5*FmAhv^N>)v@vcySq7Q%d2LkoUv_QSO=)1-4%a*Z@d(YA zBmO);LuiwWKM))ODrVk%&CGYbVD_EqlT59rj%@mb?&y=-v>K~mE@xkx^`-pKG31Q8 z-Qem+B1+41*O#rCOVlwi^jx>uT2CMBGGos+kXfdhm%y}D`%~~luW3@f?pI0B% z=j<5BP=quvZI%7!ty4ONs5*mbtHvjouCfr)G^_s6#|)}}im?!){A*^~^x-++v;u1M zu{W5uYRrS_L(QvT`c6SG+jS7kyws7+cAZ8WU6!(+3I#;fO|z=oS*~8yO|LI%Ox=|K zOGO>P6t!N!%*R8bG%$UuZ4=BgXKOv{qWTJYwnJ`TYF$H59ocMO+&1ZxK2$xw1Au&9 zJ=OSUhe3uTq=9Lx#tfJ~Zqa&jo#6F?RXt%}0-f5&fziDxO`p}^o3uTdf%>(GYc=14 zm}%-e5Ub;G@Q=XTwf?7wJ2ht@R_&Sw(Bk>33u>&6bC+{frGY7!suaVmyDdPU3s!z~ zUL-B^tdN=$3aQa^0=O8=BGbUkH(zrYF}HK-u?pP#qreNmegqHyK*|tk!z9_v{{gVE zDF@SrI!~9fdth|js{IZJ8${*RV_uc3w@p>g z64!>V&2hWxLw1f94}aW1)V9w_7=r1>N(0mOE1KzpT~9rIvrot@vr04TVryq)Ms?M5KTQsXSYG!_qhky0@^0}<+=@^oZ;7L@d>SNYLi25W~pGzL( zGFDIY*_I+QH#kTMf`^VFr3fBQs1UZ@+(TPVW(6VD2D(v09aPodRD=AeeOBY3#sLOKvUHvT|55j-5oklhI87`}@f!XL;11kc3^)%i(J zj>|`>=SBwUM(}WQf*eQid|9E@L(X;iB$c27HJ=iC)z4bb^UKCw^=$&Z;5dPL&8j~&7Ylu< zVBUM=8Q|uv7F;hlEO;$hZ&Pi8Hw*3*yhrc>!AAsl3w}rNNx=!|CsS^U;0(chM#I?f zxeUWaf~N`QIcsCXbIyi&Uyxzm3vM_fnAd2GzFjcSGaLPG!TSXt5`0YXalt19TUh7D zXFzbe;4Hzpf+q;(xo!`48jx9Jzsu!^Ej#dOf_YBc=nDn&-XWte6+ByTHCgWq>IH`duNB-Tcr%#?GLTNedj#`- zBx7?#aJS%h1fL{x!h`UhKf@`4GX#eO7YHsAJWX(!;7Y-@f>#KR2wo?+T`=!eGWFao zc)#F7f{zJ4F8G9CegVn&3;8}vp1=k4X{Y)nBD#6WyHwf+! zyo)^8U3XoA50dq9#Zkd;2<{PlO0XZ>uF0DwnD-PJeU9Kl!Nr101g!Mxwd*mMfsBlv*eBZ9jH^S*84=cM2S%vDCu`_&9*koECcNN|DRBEkF^i?QcD z$%ZQh*9u-CI3jqR;C6DV+dta`^FAe`-!J%(;A4W13qB#(!u)Fd1O%s(hq>iu3CkH=8=}JqLzu z!8w8p1s4l06+ByTwcvWeVZmz!w+Y@XxKr>R!3P8%5!@~K9l<9BCt%-V+M6OcLvToN zf#4#+(*&0Zt`uA=c!l7I;B|uA1#c6)Tkw9thXfxJd|dDe!Th0V+8z*`E;vhYuHXrR zO9amnTrRjqaD(7gf|~_z5Zpl??rtNy1b313Z@`0sj|zT6aF5_qg8kT^7(Z!(ZNWK$ z3k4SoE)_hR%pX#aYQgn_!-CfeZWFv&aHrrsWc{1>fZ!v7y9K`^_@v+joES2GQUqrR z4hb$0Ttpt>wsD%^GQpLCYXz?m91*-uaJ%4bf_DqvFZht)V}g$hJ|UPdt1|Tu2u>HA zB{)~`1i>YOX9+GBTqC$a@G8O0f;R~65WGupm*9hfj|zT6aF5_qg8euKG5x^zSQxei z=LjwoTr9X$@NB`=g6jo`1+Nv{CU~>pPQiNw9}s**aJS%h1fLX~fMXof-W0(Zf0%%(J;CjJf!D|J#3EnKYQ}7<~!9{|n2`&>{ zDY%x*3wn?hf+K?032qm>jjYe*?iRdX@FBs+1RocCf~?O2^F|iK0m12lvjpb~o*=kH z@GQaQf@=gf2wo+)S?~tI9fEfW?h<@Z@KM2U2<{PlO0XZtR;C})1lxjh1Q!Y}7F;TL zw%}^P^@78K*9vYEyjgIk;5~v52tFdXTkt!APYO=J@uO*bir@^vA;ATLiv&*-Tqd|u zaIN4Kf+K?032qm>P4I5P`vo5od`$3h!6yXsM89c!KybR?EWx>Cecfb&;1a>J1eXi0 z5!@hnmEdN<8w7U<-bL2eYq|s<6ns?h8-jZTpAziHakTNtcODqF1?LDZ6kII0RPb!U z)q?BEHYPwwSnyiGZGtxo?i9R7@BzU`1a}L5NAO9(2{?ZD*r*I7MR11T5INJeDG*#F zc$(lca?rJ}6kIEKh2V(bb%NUkZxg&*@P5IE1RoQ8T<{6Oe2Jr}XFzbe;4Jbew=KEk zESDz;E)hJ7e1U6IF1SW;1NlPNW|iP(!5hek!v$saJAri^2M%ASnyiGZGtxo?i9R7@BzU`1b35j z+_K&gd{S@%js=WO3i%S(K0|OwaDm_=!P5kn39clMaedYbULiOlcpdr6u6?`UZGv|T z-Y@u&;A4W1lXG34Cj|3mFQX3#P8XadI9Kol!6kxck@MWL$_3X5ZVeQa5k4;CjJf z!D|J#3EnKYQ}74LKa=L()czTCAh5j;z9 zx!@YX4T4t*ZWg>jaEIVsg1ZDC6ns?h8-jZTpAziHzS`WU#C!QY6Wn&$n)BN66D$?j~R7@;l_~T|P;^!DVaA(&Y>B?E}R1b#7d3sAd7a?NCuOrf#132ubv7 zC1d2WYt#oy`d&8abC;d@36z-ArTAFL!iu`v7A&%2%Gmcj)CU~Qrya6t@#T!H0%9zdZgcEAh+YKey6*d2i=#dkaOw z=AjOKew*drxsmyMe|lvMzY&wW03VSVlW#nnX|2D+VhqOc8yc}svIrkzjY-T0ZO`~N zi^x)NW)}737V#YxV}Zem)~gS)2-S=#e1>I4RejxZ_xm_vk^V$WRKvQM@3Zt$_WDpu z+>+QATl!d_KHbtwANz(&FZJR@(T}-^#$Re|ETOzCri^WQ@=GpeIr<~^^%kj=pK!YufE7-y*~dET|jH~jh9}U zK0gT4%R+w{CaTjlGxJ8TDswcRxxjoMrq@SfqW;WM*3bQV%$WMBhI(sEWkr33HD>P8 zrPi3bs+tO=?Q;@UOY0WX{_~g9r&=06&Gz;kKhesieN44tv7Bss)#!``x+>9ax9@pa zxSrQ*CKe0&oQuWsGrn-ut0&K#k9*Zye@aSx3~P+;WbE1U#$Z<=OX_<9Kf~gTDf|qJ zGbZski_e+Hb*Fyr9R6>;^lnPrJg#y^hgV+<#Z2FqCo{*#s=%=>W_h(B=47mP;+82r zGT)gqeq8o5SB#wSW0eq7zEqwu>C1&?+K=g2rRc=3)ViyBEl_L6ZMFDrm%B;3YOya6 z#?-nyf~ZpL1$x)wbM^zh=6~6lsJQrsSFgb==Kfe2uHncL%XW zX3FoqLpXCe>#BDNYM~xkCc9kh&i<2U-aKn^N!EBA)@fU;* zO7lze@~$~U-Iq?8Uf+l5nL6&g;tVHMEL||~hAG9@DZN|GrD9!T*E=SbcE4oD{qdOS z*Xq>pRA0DLdajUI>NfS!!01=v#>`v1aADOV?AROXs}?P-fS37;^@zu=8OLL>L~Y&T zTK&W7izA$Zv^)s76;p{m)uL1Gb1Y2oR6>93X7D)v~&7t zHv*m4pZ?=JaQb6+Q$OwQ?5Ev#`f2xcKkZ)arybwLga2PR{`lV2{@AJKB>Le`JvY%0 zyPNx2ZcRV!*7Vbk-=pnMd)0Fo{b&cjwb37cf9t2+$$r}Lom~AXm+$QEk6lqe?aKOT zx455n_xICIJu}je^|7O${tooh?$v(U{j;BTe8*CM)(77+)gQZ(e%e*_)2^|fc8~Pa zZd*U?_)gybwDQmjyKe|K7f547hshpk5K57Utn9{Ft3%*goTvp&*a zE&TDhJNn}#2jh?LC6@h{fdnp9M#cEs5a+Lceyo012!Fqb^T+2F`||g6oWC~VkEj1l z{rFB~S-)9G;BtCYO#P0=`P&13>@T+WDg@*2RGhzB`1>9U&|>_39Ov%<{PCGb`kRPg z{0&QV>u1(S3IcSoGRk~?DK zg_l!|KlS_-(lA$&fqvJQa#h;+dmzqVjqu0IFvj2ZxcZgCAHQp4#Q5X$UF0IYpc($m z`rzdo_1-iG5+`-YF0;ITDGe?u zm~y+~{2hlsjxGB8I)d@1o~J|Fj6eSn_x+0T{{9r_Z`NJzy9MZPj_~)dxcU{r-|NPi zwqugd>#+_+Oh8V-pN)pmUj>4x-w=!=+1{)a_uUB0Low|g1Uu<3W4ZfI7W$i~?YQ2u z^Og`R>#I4rmkrH z8sq%&o~64?BZWUc3rTem0%aHcadKe&Foi_@@jdTy{T5{69q(9f#JK*icz@r5PZ-f3 zHunIGFXR02n*OWM8!`3!d7Qs(E$(+z z=x-?k?dY#N&R@+a%lZ&{BgWsK;{1gla=+0>f6EYzKlSV<(q`T*&+5DX-iz~Bw$8G; zkdOYb=|%nV8)IA_X8fIkziOn7nEEBcj$EV{q<i(t?~b$UfZcn2*e!#dY;Wmz@NGTVvH$Kx z;4-e?Z^ij*yU=|PBo-+#?N!ghLSy=68|==}HjIqjPvZRThaJClX2jTSiK}1H!+7VC zULPy9Ki2R0IDZF6#ZSMMDd%vme=c=-r|?$-roRUejKA@5{`SCMrOw01_$!F>7kb3~P6_=zsO{L^X>tDSZ1emDG8DNpVnmxuM^{)_G4`u!lzU&+Ombvg7# zOncvr^T&@Kn*Kx6qy7db_a4uy;E(-c#Q5{Wj$EV{l)&F9Fzbh^M*XShz>zlV!=Hn9 zbRliT_!|}HulW11`2ZO8R}xph4EV#LPE?G)$#MQ>!-*Ns8->3r?a%Cw+TgFR{X%)1 zzl8Q!|NTJtyEo2XC;WXWT06HLOt!??9fIA(ec1gV&hFIb*gX+v7rLbH{lahK>?Xht zLnA7t|K5tTD}fyjWus#3d;xd7nEoq+9kNEn*qsMEKeRZ6R8k2$vy2ME>Unvjr5(qq z5o1@Z%Qbe};IG^mAvShji?a*h;1ru?RE*u?IJ*wm)kLjg{_cyjhU^$?~REs*Z7eBhV)^_ zce@xdc}BsG`%CUiDQw3TE~>v=#=v(6i0sx#WGIZYWAZE7pII~$b|rM6#o&0@u?|IA zKds%e_H@DppdI@?3BinIpw(IKesh6LG35>gOS=ib!uzvO7bC{*uF9%A$1MJ`Z6xo~@p+ex z&%Ly8ylv;@=H`mOmt9t1+m{t6CCtkQ-Fx-4DISmU#IpY*T0YBZ{{#M@5(TQz5WZ#e zCu`ZFI~FazYmq%~=>mK1vfDDb2p6^&E?A1>{LAgd%j)gL^X-LI3m4b%_FJVTN3LRC{Nm8>4LkfF1NXSVMPsmn~d|}{qyp` zshh?1S-E^s#ll`rqXt(u)K<-_7qz^glC5yd&ao@z)i0~4vC&JY0PY~ME0)zSu9$a+ zT~|?$S}j;~XGP5dG;w)tm8znp*6Tcc{}eg!e;Ma)_R4Jw>uuFDOI1^?$^~`x%UO(l zL2h9KDvQ54g5{hK7uIDHt&rCa@3M1twfUOcca3iI9ISpIIJ)hu`%{C$X2dct`bL%XsvR39LE{rXp3HRqS5`k__B>w#c^k9MRwzrJ?_6y zVx*!vHP}9P;$NN7ZRZ5W2fP`-s>}M>$h+1r39QbZSXcS8DLC>B-L&MGbC^i$vjIC_On>^Oy64jO4%j}h@fe%CW#ar1R~YxLiRqgX&uzWhLaSrC z5u2{|2t{4u$kwa9byxeKOH8mL69WTV51eiuz4AHsQ1--&?sT)(opaWcqtd58Nj49&9a}Us}3r#;-D-^H^mATx`vHlFOg0tt|+gyL`#o zKLjqSd;V1IBM+@#k}8A2+EeA*7tZ+lp_5o($J%id>j$Io{>X;r3hPu60Fsp-ZI^f1?t7vMUd;j`L z!F}m_6EoIcG{12j`)E?4m7nODbWOVGg-MCt{A?tBNe;T);!aACl^2+NeHjq)pX$anw3)$nLd!P-4DaY#d>*RLhgiJm#+y7 zF3HMRyWRgnVO!(F>wYkN-&utd=a2O!j<+(F-i&yhm3Omqov+Y0eAM8a7pBj2TCR5@ z0}7LxLemR}jjupi?U&obZ%^LWp1AY*3pc%x(OAX;_Ifrwo6vX@@nug!#=%2}3anR$ z?oB*?;dWnRu@nBUltU4F^@VQt_t-G9VAA!f=e4gm-4QNqn(uAAhWRTlcV0@Ii$m)9 zqkc4e_`Zsy#z|CPytRE(=Dy6NP1D%Az=*v*I;)BL)W9EiProubv}F0n?BvEv=y(2ztlA&jnddtBK`Vb$ zsN09BVpFCz&l}f=A#ZC*4%B8q2ECqO$t6&*9BtQl+6k7hwbUV>SwzONY`>`!%VeH% zlwXOEf`BCJ*?7_kB*DdQ|HhA;_QzP0Eq+tz#t)tKgQAHZXUF?&kx>0ZrITCR!>$z_ z4Ql=_+Z(e&qQl?vhSU6r(xX;wZuw!9-)BF`dTxMiI|A$asnhZ)OU#beu<>K2$0x}e zbofn4rs^&4sa#2|8+CtX{#|AB8Uy$U`I}o!{m?f`*iW+%es|s66qJAXQztNL#a|+W zpZ&zy_=)q{Cr(>n&Fa+w;UzLCH$pF~ququ?+gbRtdr;3aDUm>PTNe^fMHfc~KU}yw z^SEPYZ?Z3(I5Mc#VbKI%xmyFZURzE%wq1{Gk)#cCGe32LUTf{^nV(>HGj8s{z$80j zCwikO~%>FyZ1^~xq+VqpFKPX!u3a#nm$ z=pQ+DJXTJV58G!rf}K_Sn(ceN4{UXJZ%~hngv0e0w)vYTC!jLVc`$1S6$W%i!r#b9 z)8s@f?NtSq|1Xq3{Jg}#Fjiq@m#)R`p-;0G!y_njySK?V00noV;JrIv^f$iG?GL(G zxdUS55=FVm(Q;RO(5vj;J%Rpgv{cs(pOG9G7PxGZ*D4y@HT@&!o&oujEci4lbK?8X z6pV_5z?xuiI;Q(e24%c(@b$cRu)%ZQpV#pmf6){ss_Xqw&DkvIg`v$|DFF8JAA@5o5tj|;r{b3IK}KWqGxJHd?H?xP>hE!(}J1igE? zfb&Y#*6p6gmuYt4An$X3a_;k5c`u?0kFg4m$u+IcD~KOO=yMF3;hPdNKXy92c^^B& z*H}%Xtfo*1&NgkDQ0U7absb9F;yrfvOM?Qp1~+=H>^b}oXUBVvyTaLv`!-DoBsadp z@>y2i|2Q4KwNE#`;Y9qdqimn-?1VgDIs4l!d(TdHtnSHI9e&Q-oXnHl>>}Q9_ypqB z(ao>%L+abS5r25Kt(H9Jvs&I!#!1>ZNjEl^1?YCZk?SkB!j@&Wmtrh(?scNaO-S|< z(h7|gnA7Y)M%<28_O+imtzOS2wI_9*UfHwB>uoKO2d_b|FId9ED`Sz_=a;h;UmgLfD04!b>X1~En@%5FLBJm?L0Hzip+lj6%y z^6u!-< zJuUxqR@_tbSzwLoy`B%a^phmht4Ms1ZFRrLLH7Cr>&`V-H67URE`+A-NLyT35FHWEp6 z=e=7}FY%2_8+6my(}^BtyeAUm*PDC=@3V(p8zbmiF`Qe@61(3ifx? z|K`}6n!C3SZEru3U17S3hrFfOQDy$c*%CZpTJP>gfvy-iMklOl}*n-Pf9ZT{p&T@;!rI^8M_Q)Ii4JUpjjO_$mDx zdbn>a_L(n{xPlW$248%#agP&TpAwlKcGqj7X$1^A5?h`$2bWUcme}09t7ywmm>fuK z`H9oKA*H>~+#SfRhLFq+uRnV;2S^M znB+a+OkCqEA7;{pnd1}QRlT*TeZb*wIgJmqW$e9*l^8R}haY~xX?%#fNX7j-&-<76 zUH{?xoj`!S+xTD9yMM7>&g;pn$Jku5+^M+RnI3iyp2+)8Cy)^EPEva<4rsJClwjMt zg8NR{xw}-VHkg7v05Chj)X7*C<+FQ23FXS9FijcVqJBEj)RK45}y0WJv>!x*| zOnHrilh^bq*p`x;o-8^0@F~Y_C@TIbD<0g4qXu`!U4Fn*?tJVxD-d&@Ips7x#yOh5 zkJ$OE<@Vl@)c8*)yftOV37Tw?i`tU)oSuAM4}DtLj)c$6?10#BF411?)BYTv?4Q-f zC(co7pN*%SfI6$=$4`&uNXo-)gK#thTbwYuH~}4g6vrT0SNh7iPnm{L!((?l96knp zHv*4Q>Y+<>kB!1OuhWAr^EN=&fPAwMJJ`fCm=D{$jW~;p!Vza$j+%Fl)1qtoR91bqC$ z=Vv@1abOzaWJn6)440GA5hp<+s0+&L=^lUFGmZXp@$D7Fl?WwFyK|afu4_vO)_dL) zPJrjeN_=(}yF55Ay7y$K`UcK@FLOJF^oozB4ak4|FVIc(?t6Sl-Q(7#b_~eOA3Kdd zX7?|Mjz=V_{h2>-?D=-)qiRv~*C7{qOXu5%U45@CgQ4HirtAlcQF1)F^dEM`L)5>O zEcJ=dQz_?&ZoTY%6^otnXIPD=8l zS^ld1eu-N<*|kGD|B=%E5Bu;WE_!Q-Tr{}z=PB)v(bX1N!46;fR;85wcl$Pu#VHJX zM?U>*k&6nGyMCEcI@`|6;i6k)g*$xHLr&?f^ww+MEAy3CQMteuxXG>2blb`MlFA=- zotNRJ0~fd^dFL`cX`bbtliGL=lZAsy$J#s2CXSE(?nj~{Id7*g^RZIu2k(K zDW&V}>4Uhab)FR%yglKi!FvZI)#e>pT<-42CBH#H-5}Tu`Md|gi8D8KCZV-ERA@}t2uyURuz9g z9ZAF=C|ApkBI2!h^K`s%;~S?lUstBlI%jsDu83E?8ds4&ov!#(oa&X+6@Q>AJ6dMN z@8ibmNh@jK4iyafqtb(HbBTNz6QW+76{mY;}DEo^w|u7KIW@<93>j_n*#u zR@wO*51vLJPwYCK`Ex3!dINgbnz_eKn?XGBsneNHQMEwsd#k+@pEzAKh2v|gtWJry zbe0;4y_CMp$4+CmoVZn$?F&BUL@QaCV2|Qz>9uDsOvr3MZI4Zv-p&l;Wx<65wEX}c zD{vpe{nq)+UEMYaM_P?)PZxhC?}Rxl@~bn4>-{S}aqEL06Ue#V zPuEJSJ-7~r!2QBA?!G}U!7)RHWw+Pgy!1;b1jjnJzJJ1b?SymqgoFL_Y7fpxp??!` z2z=Ypl$H;irtD{NW@*8*?l~b-KndzxjljCIjLq1;=>qI5tLG}qDz~y?mk+H~*x%N4 zdCE_s-6s%w5F*eq&k8rj{u%pP2##;Cs|N5=%vA`E^D*@e)`_ba$p22zzPvv;Azv_< z+wHX~e(y~DZ)f@+*g>Jh;WP4aQU_S*$Dizko147%NNmt{?tXLgO>eJ^q$MPUk$UEvaE(=ii2<*jD?GIo!7RvE)Uk-CfeImaKTI z`7VyE<nT}^&#`O4uX=b4RV$-}rpGwx0Alv-=ax7i6t2QFFX zv?$y?u(8!ya=-KJI@LP^(K;AJ*nu5MEe}%J#uM4c1N++NK7WpP%Ga%D*Ek;pteb`m zc=NmoOCnBVL>Ud#=a>eXQkiogF0bh0%Ba3!9@;x^%5_-hGeI*0!}8U&h387FKYV3K zjq``A2EBQnH*umhWf;0-Nv#uLW!eTdDJ$c>@eVj<&#aC*b_<+;W`UDY%;dy8E8O$X zXXiNK_lCYT)VMjC@!Hp%?pITe5AA-{e#P@jhFNgb?lTNz8U9v`SEbL zu=3EKQ?Q2)UzO1G_`Ts*Q<}#PJzj$ydgtzm&5a4|KRNsGwN7cobLbx_J5_aiI(K#c z*|wh^x;=0_&{FI)e=ntTy}e_S(>XRJJl1}trnSb(ukqAP<7KMG$y}j<AN z&_|7FntRrgkxt>mIJf+8V<9!;>V_;i$0_{r$g%mi4Qec) z>i*Ypfyu$%F!a-r!R((l=2CfIfn((*sx2rFTM)PT3~Zy=4tty-UC!p))Me2wZiAS& zaIUlEq;sfgXn1{BZf-$%EKlBaBo!5{D=Hp}^NZL%&gu0QTh`jcdN=tzun$Luw)(8*4!hOowbl=9Uk&hu*LyezpK#U$U1#f~ zdj)l(d}zKeA-7PqDRsq%tXPv76gc0&bgM}t5oyi)tE0_ZQ4`kr5avzRyKIuL+$!>w zmm~Hgu11`KSoiBcoi6liQh}I0}#Bd?}q7d88%`sNzmbV;S z=jdxm<{QpM5&VIn2t(dPuejS0A>jPTgv^{MC7c9d>z8_3RclWqh=e znSW+oV~0^l6#8+7#2&@9p{j40`bWn^IM|7WXAB54cGxo7s%t&&NDS_yJGAX2+qUsz zr(KP|_0bkaa5-T$hSmAMwbI>nWv`mJ;*=ds3;$r^j!&KTP0iu8xleBmhqJKCZ~`ds z2^@w7S?NXA`i;#SaMw${y*`D>u^V&O+m^q`wp(DbevoY!xO-W-55LL1aUzT{^9zK( z@Z41VIjB`wPiqmd<5c^|W-xzuS`h3LajNLp>o0jTaf48 zPi*$w=Rf-_xH|Ox1&W<;ojcPEr`McbM-e~LDoBnS1ptrYDpAqb>f-*FyWv?^v^_0w~Icy@{%%^Y<#@Fskv@qAl5G7&p)4QB6RzFkuW;5^wDCp-Gn0jI2BnC)+UMIRjp zvkR`B6hg&=!PN01CoL#YGbz^z*M||gj*U*mz3)x&bL!R0!-#V+2Hrz#BN$2HxG)KG z56cRVtKoPt%Xq&TWwskdVN|P_(t@s|c4gbiXZJ(g`lF@KjIB@EYH$U_~H{Z8ckF)8m4i1kB z2Xy!gmv-aYS;Q$!+W14KWLW-1mtHh>MuIitSMB+?Uux>NW3^K_Yeq3E_cLEnZrQpk zZY-UV*?r^CJr^|nDt*nWeF-D?`Zw)Q&u`CYsyKUJMVfm*OH=0A`!drmylB|vmmYjO z|5q9N{J#6RYGI!7%i$9eXFQ&K>+IoA49IVvJ8r`e+^B+!QETVr)$%&jU&p-U4frzW zI(r9pctfMb>C&$|I9GlTyCHZX@64IMB{2v0MA@D7xYwwG`iVC>FL{wKVaf<^;|%BW zf*Jmt($WI!#-Wj{map-&TxprT@fN3bn03ql*WLLCWLe$)|GK$BQK%5n@JDrnL{w;q zme{NzqM}(LVv(~z1;T|&h>6WMP%|>uL*yDdD>N;1+O+HmOMB3qv1Xfnc~bYt??8wXJS)EPJ zi*h!WK3&>x`0DrxR|jtc-h>ffFwC*XNEb9UnH~8mIKpu$7aXyZ+WUujvdfca7|KZ>6-;eXLLql4MckI}O>flB@DzXwUSx)WW zQTm6g(vzRXxmW44A;ZICJ8<;p-H6dKqr>qe$+WB?`A1vVHkAJ8;P1oolAlR$Ix}c` z+S-`(ruw|nXGRT3NpETzHDFBXAEvu@@{)fT-FwjVTYBe}{?J;U`p@$#KSt(8rbPG6 zD{Ty>{Plc~_mQ&J=2;s|`P2E8@1no*lGoW>>w;;&Kfm&AllGj=_gpaTx93;xF=@}+ ze9s5dj-Frn8n;11@(=KuSm_UJLLNHq>X@AHkH6}hp1hI0vXR#}rTxNl!r!U-?>*z* z3rkOK+S_x`kZ6BmX_L*Cu=BiU3~xJ+F?^W!1bRGT9s=g{%$&08*nz~&_k6ME{Cj@v z^Dmu$|E2RgUpkL{{vD&((b50tjIqz1Zwx;=VCv@cIrrYZB5Y-nlbN&T8`+sz3CFYh zWY&C@cOd@p4foXc&yUP|FMfLjYfx9a>h`_i7|I{a>ROzY)(nH~gM|L214k~q zBtAXDx6JI~HgQ=*SbDa8sF@z&UzQCSpKBh(?o#kY)=$sZZOB}{eDLyu+RSOoS@gx<4Wqw!y!N2aAq-wVx;8o@I-YiOzDPfCF0J6{YxfQ9wdDOrF3FqKcjcA7jM%If zzu8#3ZbX~EwRP7!yDm*netFP{lzr9jrSU*`AsZ;WVYy9!sg|2{W& zSz8QVPKo~6W4p(vC+{ezoxFL_I9SXG!&_}xr8`F5e3k75BmI0~*o5=k?~Ov**4C87 z=-X=Nn9i)7@Mj*=4h@d}PIPbf@qHBE+Z!Ew=+pG%?Y7d}SN_#$9Js$JzT)-3#%q1l zoKDT=exLcBmVq089>3r3`|LKJW!SP`@rUi7+-VE={jW?8OP{QtEZ5aeZnQN+nWJ`x zt-Q|3=m$|_7+yfd1y23R*5sn$DzgdH^@Y$?>wKuVJH|MPp7zv*x^egR~ z-v6y$&xUP}fR3$2_4_INYE!A4p8N_2y}YV$%NbiQ?cT6Gw;j7~_on)49g* z{*Pap`tHu7=Z1f9t}&{mUz@*W(Ee0k!?jai;RF?ngWN5>UrFfKe_(WU`71v+ZyugK zhw@(87qf9+TKgS&YP2dxGdUpnon0+zFkB@Bqv+s+; z=g$0R3@*1nxIe7+bLM|)-#LD|w{6Ia1N+vVqy&@5{;Cacp4&f}9gibtFTQtJ_eIpv z!|RqWONjlfEq=p)oNE}Dh*aCi#tnP}asRl;KRn$qjZfT;^9{tE8_#83?_?#VAeQr5 zdP1MtAD$Z>XY=H|))1N6&}k~7XlO$=uS^EZOwjlmu6QR0LYJ>k)t}4i<&?%fl+*L0 zr0CSiPksMfW3L~s>fL~e7RSLY6RvlLuQ(UIs-<66^6o*|4MUt)u4kWSmF`BjqEByU zpSC@Kof!MWwr|%~pW7bY7-@Sw4jM?uoO!zUhRSn|y|;&FUCRb!B{vVs&MIvVR=?-L z7^k+8J@#zx=<~ zL2Gk*Hk594kAUdm6OV=Ws$I#v97VM&Tq`lBC!sqs!fI; zkJ=Ts^5gT*hH)pLtk>s%jZ9D8nf|sfy>utfGFa!a8RweAqy0Qhxi-9ZK8^S2>2sX^ zlOvL2Z%I$y@E)%G_x7B6!@2a*4YrZZ5gFGkyFYAnMC}}Az?0CyuQUbTAA1gueQOJi zjlW~SPrc<_^b^}7+ahYeMcK2xarb0u#<}S4v_-V;Usij!D?Gh6J$V~S8M3!$ZNGDg zrQ2*NDc3YdHryYUSmxB;Zfu^w`UaPrJK8(vik)%i>hgDF#PokPvZij$H|lDZCE&8J zChe>Kbv>80@wDzh{NBjz(e5bKx`jrz1ouFkDPUt@i<)U<#4F+P8>78%l;D*W z^+pL^mWk#IB^%AVDQHYx?Z&qA(UDCV%X^^9ZiyTnG+sBLE`IT|x3*l)H;nV%j_3Bj zlI3rFm)obUr~Bq|%jGlPtQ|l(gatU{Uv9$OnY)??9K6>c>!R*}L(t zydA$i@>IlUzc`il=hpWwMeWaC@y37fIMs_9=lnQM{c+VTk$(zD((PeGFM-vAJ)O3Q zmRMMV-j_Hp>}ZE-UBs#pUnaysA1Zh=IB{{q(V^kDTxKeG`=zL2%jK;2->4k53~!(p za3Iz7#QW7V3exbpdcx&+DZP0>=5$_dw)C#u-;NVdoS`CiPw={M!`613p(ghWJNT4S z5dP8CNjrbk-W+xCc4z9^_U4F|fq3J-Zouw+cC#aIK_q&hCBCkhKs@+HB8<3Uzm4vq)NI5_SNci+n% zeCSlt_K4aQ?Q(Doo>Pa8jgPm>v9UO;_BCeT@Njz;P9Zi8K~XObys~yDg*ZHBRqb5Z zp4I6b8ydJR99>r%)!g*+<$EKVH)M_1C)stqbM|ehY~MdVF@1X6Bsp2bk$K~F4w?kB z+aspl)t(XIzEA^ewYRr7M@ENp@6EVok{rsh7f);-&GV$%e`8&smzU5dV|VS?_IpC_ zX6(+2OwAgnOV5C4Xx2C$S8eBK?9TC*#`aF!;NUULwf-J>yR)eVh=%K7q6Ov>8w5rd8c?W@_JdTslPetDmvF z{^qAw;=aL#nD%JgoxitNMtIYRn6%wb??|iKaw1yBXG8KDP7rHe!uY)9ob89HJ=#~M zp&Z<6a&Hc0ga7O}T-xX1hwx};)k?Ixv1fht*!nYnt3R~} zF}&sZR==8~V{6(X@Wn_?!_~WeH9PuMj`w{zKJ2sc{$=CCKNuge-&{G{f-`)h!%GMC zDjm=xdip(K6CB)DwD11zJkjySzqjpkU$J#-<;3Cr2uIZ|8XN;32OkeV7(M`>1dq1h zHTR{boY>5oy4pZu6YeRVID?ns&puq!5p#4E?wzB~Etl@7i`nQDAxvW((L?CH&^J+1oQebz?tPjCLg-9c^{*P*Rr&HZWI$X@zY+Q_tJi9NHL1|&8)H6voKnbvcA znETvqP~yafznF~S$moM_g+C6T=`2N`*}gUX45{7zK#qZi2>;%mxObk8@OG2G5Irfr-qa81n_Qqe%HxAxS zOREpB+2RYV@vU38>hYo%n+~t*^KRXS4?1S#Y~6BQc6992_dA^anRq*C#yv2_p z#O(vycykHnZ(CMh*A(5mF=I=H9j(~fFE#W|FmGQ!9)^BT_|m=6xb$p&V;Z$Km`A#G zz2y-`?<>v};F)PY{7iTpMp|4g942uu%PZ(p@M;Y7!EBe-dJs9wTD_&xqB&aghVZf?KgRkIzeMR6cdls3H& zZZn&n-nD93=J>$6#LN+W(8JLYcxAEPJR!P=rY42q4?l;H_ThUPGzfO^XvaL~<9+uP zS^lDG_$qjm)w;4zQCTbBd@Jo!RM!dvxShOyWJ9O#3O0PzQM6Uk>iK?NbMM+S9mv-( z&Dj#XqXT(akGT=pq`bdg@58u;)AwmNs}Iew&t<%l;h#9?{*2iELwZd8E1szH!$erg z@n>f4s_Q#B=TDK1;dt%+?g67G`PK$+T%L_|-vG`DzdJ4v9gSHi;g20({I27~?>gT9 zUB}MfoBQ&gb8q8Zl#@6rE<9t%U4Q+DJJ$H#nd8(rcx2vz_T%+q^if^Gwo~gXqr>pj z!hL@r^fn%IJ@r?@N4{!DT zFCXr~pt}c9r{i*TRsbFjy2JmsV`CGC7QTN-_(z9(haPh`zI{T&u#+Jv#gA9C@5<^h z4O^UD@=$K&f;lA%7iRNQ(yT?L4rPU7D=JFn7w1)H@iW|ou1pm3tKEgHjh@Kzs;4cQ zlg%Huz&b$qCfO?W>Tn>~Cfro6H_mo;YsY&4H9Tl?xUwtXi<3eCQn$ z1EI+L`-cu6mYzN=ZRn_sq4$rRoiXaB8`G{0+=ySONi+A?1F+zOFEC4V7f#|5-P5Oy zFC3dS?anFF^T!uXnUp_1Z|sz5x1{wRn>7i4p$up5o!k5N_O%Wha>k(ZhJ#(PWA)-B zZbNI=hE^|L^lTU-@i7uweOsQ*=Z)KZWs=Y8+5Fxxm7N1;^94){-+xPJ>*KYPBtX9}?b*=EX+Au~Ere-4FhkapRinLr@L})? z@JvgDzZRa3aWeHNzY(5}ax&8>zYm_D>XRRUr)}z#!?Ua~_zHMB%E?wwl?|ldnfQ z>o8i$$yR@Yl9N#tqdy=CjWE4$Saxz}MH~P4ZZ5-{8r=g5Q@L@cfVG{WRFdcQQvwcpPFGcDBW}W~% z-T#HY8K1DvkaeMb_6=QE_Ol|E(EXUO9X^#ky9UFpX`PJM=U4A+3^zE0onfv4*#Z#3jA ziy;D2w~+|xs842J&`uUST~~G}qaB8(KM~Sq0G{nlg}3|BXfPdh$#%ahrVx&D@)htb zw-%m`a_j8))Z5OMOTAopmRlehC?i{&ie+!;6>fH-(?U#e;C?|6)QojbC`s8Ksbkwn~t2&HFBJ)fa zCF+xDlk&OnbY0m=g4~zl@cmEI2DXL$bRM30Z>9i_dCB%ToU7#I(@0N*AA?NHN4}K+ z*HyXEkh5Hd_rp_lA!YE?uY$Mx#WFBmS9Zc7ryYj3z|+oHc)G9CH+e;m38RNtNYfrkz>}5ha~V-@QLu_;5j|9EcU?- z@RW0(WnIXN;pw`nPY&e16vwO+7a+rz!DqrVe=|H?Bs|%U|JT8GTepC}3D2_l^01Yk z1z#ibt01)U0AQ=g-=z?a_Q~@Q(#|Lr4o5ke?WO20{9#CW0f75PBK$rI;V8Gx?rWwG zQ`|9T`;&S+{xBQ&bvnw()S=Dm;OV-uskc!MbZ94^%5eYJ`U$W}`$HvU-MF3Ux+;tP z>q~LWTF9oJ(BpYN_kG&Q0w-b6&`v2Dn-3xRjUM;|*Og6u%$x)r+PR0ya9!#1c*;63 zWIBp;0`MFU%sUaDGN$Fg+p#?p%yic0K6pCnSZB8>k1w>(FqI771kX!i=I8k2F_d^gpRdY514|yj3474 zIF?1`dT10~j_qLW$AcF`mI(iEO3wB5dx?B4n2vVH_89vTnCE%SyBo}RwaJIT+y>;6 zU|ZJjz&zgwgZ~mtN1N8!e%9Nu28q;f6s4~8Df6Ycwh~1D+JB+1_oMHK{$u|_KM85H z&(P{W|1b1;4oZE78{t|1x8UhmSLiFQ**Y(dpBJF33Qdjn|yBYfo^Wmvq z08iJIKF1I1!_eeK$a6QlA91|cZCVYsq5T<%p}_U0f6UY zl)nOAFMJ0K;J?wy1=zMs2XpREgnt2y|3+ss;Bt}ky(v1{C%=x6qJ z;D-?=!v7E0*6l2Kw8)2Zqrfo_ndcSMpReTPfg-O{ax&#CYa^H;?QBx|Zz*}J(*IP+ zk174XgHb(W=O5rfVAhAfRTCwA71*{V0A`ugNdb=%E>t>2;1tMNzdA4-^N{}yA@g32 zxx?Cw2gi#%P0cA}TZeBbIXPMMXDK;3Ao5xzC&!8W2TD%vC-SXIPJTe-{d$J3vl78< z6WfvmP8OZXU^>dlze311UIl?|V*qTo^}R}dA2?O?SAnhl)nIlV?K}nMK1Pn_1vMN* zhV7g+3v$Y+GZ$>H4Ifha8B}?OU#2 zOUHVUZ$-%Z*!5*8KMeVk2x;d&9t`0qC)+wd0Je222UC}J=7V`GBfkZvV_xzUgp~KD z5je`pPa~xKStTcrkp4W339(XivUsuz$Gqeugv?tC9xwc3a2S|6+rixQ)Y%2LbLcx@ zTmLq&opV0|+q_4?9CD2R224krc*{0BE$YVS8 zc}_*wmAC+bL!;tCh`XqR63+BBE-X0sD05hF>Y%30TM&}s`6A?DT z({)u=4CE|}q1|@0&vK}r0pCyJw`v?w+#)ckC5E*C3FeCrJvfI+mfBnHbw65H5?w*8n{N~7_ z;}b&>5I%kJ#BcM&?Pzhue&9ab&aTYwYzQS9{TDp(&7Sy6p7<6|{Kua7c2E2#p7>5r zoU?bx`OOTjp7<|4@xz`tXWfwVo7qOk{h6kA?NQj`_W#nP$I~0X8w@KZ_Y4voHJ#}`OU1T<2;iOIlnn;)N#(LA?G)D zS9F|bCn4uIR}4BH7m9%V=By$l@|(LaI?l6&kn@`}Egk2Xd&v3C-2)xx)qcqNgJ)>2 z%x})dbvo~Gg`7Wlmg36%P9T&B@|&mZA(20Lmg36%=1f(mCxs#)zqtwsiTvj5OUJJX zMT~xmCw{Fbew`Rc;acEIIpTh&hMm$A|Stcs~{xun=>&T=aqQK z`8)jz67!D=C4&5&ehq{1(Vlc(WrUpH+*Q``F`)-T!%yrK^|zj=zIsuiezw>@5V)Q@o#6R@Jk9gw0^29$j=lMK}a7*-YzU=6&G`M&6^~4h;&OCjb z!<~AV`q`b*e`$Vylp-G4`k+1cbxQw5r!yAjUo7bi7}qmA<9bGAoHJx3d^~(Co_cVG z3B@NlA0f`VvfiD<Wi&{lu%47M7@Uhqm*CWpQ=9u`y&e%@zrOsUvA7awK z>&!=-&*q*)1!A2V=evko$9nKNkadi2K%C(u_*lGQ@G9Z~F!$tG{EF8Bk3N5cz6oi0 z2xFa<&YwK#dg%k&jbrDEWBgiAe2gca?}>jKac=(__*kdT`7Yw@p9B+M!^GD(rx3?~^DHISdB!=%h&a|i z2K}0gunv73i}U3qZfH0}vA@6Xd_&@tQU5l?X@Z`|n^}nS*#*}(kHz`*5|92ePrTj} zZ}P-{EO7?0c&gC`V7bdp{8{Hy#M8i^nfUY0Ul3>iab}9e`FS)>nMQ)IH0^o8NkE+Y zvpe24F^#q>pRxOUv)Mj&ie7pB^KxBuStBMiNEf=E&7}}V{v}|A>!82&T)ym{oRU% zC*4#xzR&rxQ+&U3u2cMNr#E+OI9LCGV}Bc(?cw$tgmk9ac)$}kFE@{?sw{UF&n=x> zSiazX=l;Ut+4mRDnO{{{K5y0>MEOp0VP$n8ewOHgLjIHxWD6F~Ei7F$f6l_f3af#i zMS>P$^B2rrSc1QcJEs)Rsj7DH<4AKVmN+E~D+*14_m@-^&MBKUe||~1Q&}>rxUg)o zo4>St!GcPsqN1>3!9sjl!q>9L&!08ByreLzWY(Mo^9%DA%G=u6a~F0gpH@;eZc*hp zF>WkCbZ5ow3yMozgNTk@R8>||9E@7yljcjAc_sM8qQd;F{CrpE_L7BVwj#kA7$J-) zy@`n3QBp0U`wQjAo(kug!r7s;TVZ}Zst~^*HK(xRfhzQu?)t*H^Q%fKD;HIuF3eG} z2xaRm_~|1_S%7|0wn7Q+>+PWuj3IB)RL6#a*fpop=U`}ww|5r$6b-1}W4u8uJi9FV5Z=g%rP+edz>s*t}_c@Wl3A6GvKRWa!3eP{ z=2wqfFt4J#1RbLE@QFiyb-rsw%f~G!FQ2<`?t=O96@|MC=U2{}zi=Km9=DY2znz8C zN~&(3HD_#baV5UaaPq4Q$1SK>l0J1&$)eD{o3(J^T-kNUvEnK&-4QI_EeS>^RL+`L zGIq`b`S`UlJ1p)mUoaaRoF99*dY`ZC4Qb6d%h@u=1kwav2Mg1H+7Wt2*pv;tg+@}6c#$JtYppurXk}i zD{<5h9&0eAbc(QR=gf9R81&cx_6WdOvH2Z6r=)5juzc2%LJV+@?814os$IZWJuYA~ zRaQB(%y&M8bFe9@F#D7*!2IJz7MD~wbLPyeaH<}dTVdx{-?Jpw`FH{amkb|=b77tz zWCAc8sfPfd&!Dg0f8JkRhwhd*$<^G+Sg z$WbEymdIIFiST_0Q{a7@@CPml-uHq*b6()v=rYfvd>dTmxrr~=Wu7njnp|dkeCi_4 z_DLb+adK|WYeX`2pAzOb5I+=VozDyNnQ9a~^~nKYmU)x#T?oes-+{1Fn00(qn04PM z%xkiK=o{L62L2}D7ZLJ$%GPtD@Q)BaEc`=+yM=kq^iyHlZxaSOyhpV)dxg0z77MfgnuIqad`+0&ntUM4?@Q8P-?tfm;C>@=%E(b7ryk26CKLPR%eRH`Mx2qi>*H2gJM~fk*$8F(&4o+btofSoouD^nCMVO zwmN)=ih231495+bW9i4jI}yIDFD|xG8zV~SD#rdYV zV9MejxK#K!Fm+8ofXgWpIn#|z$XTwbzZ_2{iwX`mPUdro4PUbyQ+B}Ky6JhEHgel7xE=5=+yc%INygfcJPCJy5Z5!D?c7K0C zbSNX+{e6qbSs!jY-|P4T_bxnbQbvvv`C*Z>?!4F5Sp=#ywvG0 za>`75Atzt0zWsVZ&yJq~}ig{VDyM<|gwlM9N2-7~_6{UUvoE+vd?PtMLPJ2mUdv0v{3UbQG zb~~m}XE*-9@m!O6DI-UTe4xn3pd7v8j+8rC+C>@J)+d8HV$+<*qAbeDwk-Bnr|l@?4a3xl>xVyZIq+oa-X_dG zuMl2>uvoYXVVPoJaLkzbmxE569p|W)6URvmj&^OGxzAHh8QInu7~DsUO%4(`a}4L? z1IPY~12Zq1K~6zv#vZr{%=Xx^ZOYvMfjE1P!QCv5gALA{CxEG&2~T+rLVBw+O_;X1 zzfn$o(^q1L)uo(m;=p?jt7xbHUr*{huI=ugfJ7{ZqqSjj2k+Z zVVPsaGOJ~ob+gRv;%mYmxEOffPYt^D5u0qM?JKs^UIRV=j=REb`{TmYeO8$DZx*KQ zp9r(eUBdejwg@9|_6k$ym%^;?31Qm*O8B1$FGC$!2exmp@ShQy{Sop2eqJD) z0$wG|?PIPDq0ce(j>vz3@Ka%y`=5&cM|dRU;bCqa*hXG&u|C`mR|s?a@EbkKX@|!S zasd2IVb&*0I2$}sI1~JqFlA37&b-YCbKvcmX%abQWIJZIi=2Ht1>Wi(5jkaKtN(kE z^IOB-(#8P7T*z(S{vxN0Z1d(*=MDUUV;&gssA7p;G{F?f+Bcl##9d znM&tU=@ZJxR;Rzn+22J<-^>fB4`pPlUre0?_yd)8<=mY?8Mkk62fg<(ue9#9|pZ5aD+?O8|W?NSZ$AMQ11I;&3)Q<=6 z5jpqGBfQ6ya9zOyM>#znNlLhrkPjkASfV zoRJ>}^La6Kj)JkCx#8pB9|#`g zh1A%E7{6Buhl3M^Bf+DD`R#16a18j{!f{|e7iQh!!9Nn_e03*0HSp>X|WTTn)h5_uAJ*nw~jqC*)uO62QA&Tp4_j_P~Q)&IM+i!ySQ$j$lB5LYLF zAP$VI?(qlAzPeN7(G213Jzl2SV<7Wb20Feh{*`O1B=`Ix4e>ZI-3WLx^W7v&d!vO} zR<1_IW%WE*yZ|+#83y8f>noz)Qi^N`Heen(y$NZrVu!zah-B%zO#`F#G!k;aqUKa6b4>;R0}( zFyHwx_vcYJvY9Wy$BF9 z$Y%xx{Dd%XoA8@-%IWsNlPNnS`~kvW3a>>U zSAl&L!hHr$eagsDBL5$e^Vr2TD5&!Y!eNSQpyT@xf8fl#51ks}D3NaxeU76QNVE5g zek^jz$o78GE|GJry)Mje^nWJIzWqd)W9^udoAYYaf#W40+lb%#^W8X8e}v{-4m#yv zJ{zE%V_}(MbB+Ny$4i}+!%h@D^|{_a9ozEn_yf08(R{~F_{9$3*zmCiscyMO!08=L$o^tBkEzELf z2(v!sz8rM8uT_bh^?5>=b>a4+odCi_G7E$==iy+MRRm8t%lfV`?JpN*x$H;k(7rkT zgITU=`}F|00q}8P+N3Sp&zDi2ia&5e;K|fMwG30YADJiiaGCHnFZJYEP<9GGr4Jem2-HUiULnaJ4>rf(r z?-d>1M>O*zrd3eE)I1<(4htyAFb`N@2dQ%1Ju zClO-vamcO^rfqZY0(OePGepjE7YXw|=yD}riu`7~_i+2#*8~Av1-#v+<>XD2y7QTR zzF&m6Zycra9Pp&exd?nyU1opTcLU70Vj>*3fjt*WB0o>5yZwCsCtAISwBcX843K?VIaj*yQ-(vvKy@ID|tLXDGf;_*ieuO~L~(HX0Pa zB)k*hRk-0!o7A5uO#Q*w$taHm&k*KX9givgiEuIMwp(~Gc#kma->a8vhvP6=xD1>j z%&~W;;(5a5kgpM@&CSBJ`3GT+)qe=5fqS71tn(WPxt0i-c}FYGSG-V|`fHW^J>icL zCZPSa!*WLobNl8fdAV=}bgGq(Sw94Ms~~?;^NlA&P8r#r zZ)_I%R)jAJvwa7IdH>%$2Z4RA2NNxGL@vUCidV2K#Ocg+I`kPit#TxW}M%8L*-qA%=r zyi4Sik?nRY6L}rN_0)e3f8f3+a>~edY*UZ+xrWmZg`Y*ZPMGU#y&}xDwVIIMj^TGj zP8r#b;o~Cb+Fc9aX}=cXa$(-z-5|{Mv|bfHfbbn*uAy~U@vjy0J09BP`deW#=SCuo z5Dr6IHnE<+#~(O;$3uO}$WbD1M%?!~HE`}EI+T&4L_S*NT)S%<((L;`1tO=6Y~TOc zF7j6q?hxiWUOQCYk3>!x+2;MD$OF*-lQ7r%+Qq!5@CVM1INL%QIZEWiMb2}K7NpsF zW{aFMvMp;5b)+BiM29l6?VncaY{nnBa?xoOwssC6ZtXlII+T&Eogaz33FjIc6mJpc zdC)c`-=+B1irZM0)aUmir;KdtbBH=G;t$-HqC*+kzUO%uacd`C&VMK)TRUS#UV!ij z^QR^P=;@Jf9i`&uz!`*!WYsWUjk*6t--A7^j>vvaQcC z>NMjI+!LZh8QI=9TO)GT;easLZ#xb>-yiS??j4aI7mgD7NyP0KV;p4xLNne2nMGr&zAcLBm8&8QC7wcx+-`p7)Ir=DFc% zmA6pjl#y-TGt`k|V5R6#Mz+Vmuc-4m{=lsi9m>e|IB*tmtMen#p^R*Gcy7vi^4znX z`qHk0BBzXO>-JlbbM3k_!d%nN@!>z_QMxF^X_GRtJ;q)ma;}ZHRG4esg)^`0BTtB& zGO`^@yf0*RUJxD1$W|v>>AWjCl##6tpW9hGr$vV{ven`9JgalLoC8xvwmQQ^&NcaX zZ_4Uti<~mD)n6s@dW7E>=9+m8ivL6SrwI28^ZfiBVV;}6tK>%%pB3i$HJ>}$`uOF% znliGjPk=gd%(+Z-C?nfrPLi^7hv-m7wswj{z6@as_2rl|N92@|?J*~nIw#C9asDDY zl#!!EJ`(-H@souxjry{`-yw3!$o4o;CUTzNt`g>2h9j9*_M?p=r;Kd(qo0VJd3OrG z0v+CuU>$hAe^{8$(z(qj=bDSx#kib?aHufPed5u)xZ!Ra1H#Da-W!K}DR_m*afo-{ z--ev`yemXb#*hqd$0tNi8QJzfFnI5G1UN385{x}~GRyszFv}_zrX6!18#<`Edk-8O z2i_<;Y{xF)!3Ylu2M`_=PD1!c;S_{CUa;I$gmm`4G!7L`94iQSH9R>DA?xQmjX!YL z!Bb8dIZEU(XXMPs@~q8=C?ARQG=zMAkxXaW1*RRQQ67hoLzB#Y*e=Yr?+|W5$Va@? zVgI}*%ziNKg`E9xM&tp6gD_U8&w6oOlGzUvglWgzqlTPripW_vbH5sLmRkbPybmBO z6V8P0Lg7saS1V2h+kR^lIb~$qZ_GoRY|~a@mUW4(Cqf?kOq~&Od)VW~D3Mb}w&RU; zqCVRyJBE)Y+O$HO_aFpBC`$@ky-Ao!jll1`asTd^F+>aIb^BN^l4-^0*?D9nRdP> z%)E~Zv#eFZv=d9taP<>}5t#2QD5ri;%K3l`t{;3H8w-c-Hq5dn3R9nU?LBsuZJBAl zO#Fdk9xFF(`Gyg@-@kyFUI8Bmjz?(58<;j85;<*~{R?uI$>SIG;}F&fGrV5-8H8zy z&31(TYRI_%*kf{$=uk$s$K*1RQ$GN2^_Pj9GP2cwQsgZ6X<=+K{uNWFRb*X2cvj83YoW&gLZlOfx0x)%roP!R|Y+o?t zrf%OfV)y+$Fy)*=;=rsM>*4z+{=k`jhMY2Tl*rjU>T|r%+4C{xxA!Q_n4xhvZg1Xm zq6@(LaGpz-0`KEsgyVMf^)hJs$Jg8COv>3HxEy#ND+8Ac@4LjH`_3okb-E&W-(@8C z_~v6p;40vKeGHmsX+G{Ka5eBgb_`q{ypMwot{&dU&Vy@&_w_gEG?BT}!!^VE*f_Wy z@V)JA2%jk8@%sIgJ#_x-&HOjr96N?aL3_&95`^N;C+b(&0OFc;__L_ zlU#Ou;HzCW=dQ^v^LXpK#$|KfnBsDPavntC%y|?iKse4RK5k^V405W=ndG4^=a7fF zoJ+pJJ*S=o-I~fp?Ilc-eb4=YZNyr-ln)k@d3q$6(3W4O7T~U9qdo`9Dr+mS>}Ct%SnoP zuiwhYD9%xwueeBYx#DWYE68&0QLlKt;%3FW6t^lqM3(cGql!-|KBKr@F`o_Cy!;N{ zazJsa;ta*vWI0F5RXkI1nc^zNHHuf0<@~Bq@g~K5USM_hkmVe#P4N-M#}%Jee3r~f z9xfcmJj*eP`F?_xr;rD@`Xd!*DxN}?bH4(`#fmEwFD3J2AFfXE8pTcI!LAPP|66WR zd_eJG#m5w%Qv8)-F7az^Mw8_nHC}O&;xxr$6z3?;S6rmHTyeGH6^iQ>uUFixc$eZ< z#fKChReVzM8M2&vw=0gs9A)KPr@?YSajN1B#o1&zhtE|!Q*oK%DssTxrZtLJD{fT0 ziJai-?@+u)ahu{JijR{M-MoD6VEL@#a9meed5q%0ic=Kx9TndY*Jh^TDT)ge7n74* z{R+iP71t?Vqqs@&HpMN950I~R?en>U~6{-qlZ0JW_F{;wj`*SHD1UvEmBFOUXlB{W`^K6gMf}Mjqzsw ziuv5c>YP-3Msd61NSqg2eXhS^IiNUIG2f@MI@yYI70*;$rnpLRjpEgc8x?O-yhHIG z#chg@C_b+EwBoah!*QN&+Y+OAu;LWOBNb;Vo}#!wak1hG#Y+{}DPE(vN%1ztEs75) zKCJkd;!}#hQp_9Ww(Zf1;}s_p}1c0dd1C(cPVaFd`R(8 z#U~Y?QQWRL64xKLAGl78<$&T;#TkmT73V6RsklsWmEs!3s}(mY-lTYk;ysGn6dzH1 zT=8keXBCIzn#r~|M)6?9DT+rb&Qv@_ae?Au#TAN|Dy~z!MsbtkZR9jL{wqG9_%M06 zt8+~8DaBtY=7RyNAFViEaS}P*wV9@PjN%-{`Q#CIe%9ji?YZp(OKex2Bq!Q~T&#IagQZi{5E*>8=V$!=&jmsmj&i8kn5G^J143o=Q}5O*Pibp6_s=sq3@i=g`q>M(TCECvEVb7vbKx02iKt= zHW$le4<9zlYO20umWnQxo42a&7Q^cAbFgrCXx;hF$=))#0R2TZf=kd}OylBNWfl3( z8M*v9>W9V_cA2g!rOZtw0e#V z$Mm$2#2x_Dz8zdZ-fFqc@-8pmITbsMT4z3()_KACpx8aiVC{0V@_c8pT7tfF!Ub#5 zcTPqPIxR}Cw`=-vtLtd-@br+lQ%78Eb$F}p_DH8?;yWjK*Ngv`slkQgJ8OAYknfzT zmy+)?#jYveIT61EU{;UsEDfzP@0ACao9~v_;q&;>JLSLrlw zez?VJ*fSfdymsr#^bnd4jgCx;ohr&4T~3D{s~1j)9t93HU96cBFRl}s6fdfCK|NIw zcH;A7?qX{6Xeb+<<~@&^GSo>eG%UPxqcXs;7@8g3EbM2`)ac34d2%#~on}bg9o?B5 zJ?1Z*9X$#c%#WV*u4YJ&ik>4qNu6g&lgQTDsZtu}j?nZp-Bz{phh|8xb@wNfE}D*A zNzam@+@5(dl;D{uJqdcQ^dwz4TY3~wm(KI0NmrXXeYiAV$%dypa!56U%lz&~UbXi} zRJuA)1b8YnDJv3Q*^e&h#J?Wh$%&yadQ>G_5IB9z1YTCRYB{Xq*lGM~` zQdIAzqj!}y_f;Mz%*@%f+|Hez)X?nNMS`6_Wx6aZoG|^4aru+(yrZx%DI;Szx4Ju# zc22oz6z9~gQf?f1u{m@)BAzcXVbXkO^Y zW`-4;tF7UqaaQ0`h9y+PoEv1#nU5*5r1GIzI3vCyQgXYY|c&8tN)5_l8N0QoLY|L3O4?n$y8NRv-zgRSD z*xdQ03uMILECFY*p$MkH3b{Mbt$?p<;MG9~ug(}JwixExdRz~pJN?&}@1b_1pZUAE-O>9-H}wj-srOJf^|)Sccj~vL zn|iI?)cd5HdgguKZuE11z8l*Oy`kOI%kHM$x4WswwX3>QzZbfx_p@&5ecnwyzMtQn z`d!&gy^-D2o6=3al5Xlf(oMZJ-PGe6Cf(_mgWc5o&u;4d{cH4CCpz;kG(sGe2Ow9yyZ{xHO!# zwj%rlejGg0@H(F}#$&Gx^Bvb@wa(fb<*|1L_V~R5?Tv@G_U3r(@tya8H70tD-siD5 zWs&>6AMH&PJ=X70kG+`}vB&qqS%*w`x?*LIj}C49nmzWG!d|k;;r^i>-3uOjOO-u7 zezf)udhBh2J-j9pbk^QJkG(a@9v@p;d%yPBYk@r+N`lVX`8M*!*8S$o%c z>?J)E8VC7Mw)XDy*joX6HP)EuF*?~}Zw%~>ft>Zb3*OqB=ds6k`X52Mb+&$G9(&cW zR|F;6D}cB5p77XPfp`|ut+V!4dh8vAy>ckg-VAtakL&m7?a_vKtu-ckjBfSV%UrX;k%o~_?~klFg3@YrjEy;G8hfwjkP3behE z)%czs4P*U^M340gLw?;}zPG*%a_g+Ua~^xuXv9e<(cWx$>d_w8b=3Cw4*Fckt+VzL zphwP>gqaV!-|*62F}$@m*<+9InR8t^>#V);9($)@@3^$LRM{)>*yDT0UA33rL+JV) zS{fREWy;=T9(#O;c&x3Q=rOv?V=onh9@~xlyi$Qww@wTAcZC^rpy90w1=+jd;-v3Cmgx;j3O^XTzCV(dymXX|&Xr`$G_dlXtMw+h~tTja6F z_k;I!G5)^gvDfrn91k#`(;f~rL3`$#62xu4@LkR85Vy|OZ-K{N5(a4wlxPpTa?svJ zPyGsDkH>H8ti5MF_R3)|2}-nwT_tGmZI8We7qR!2$6md%hg~IT@4r0uoH)n10qNG+ z`u)aZZx`&@ae%H2+UtS+UyrLa*n7ivrs&Z&zd@z#Oh({N!XCdJWqWJjna2Gs!DH|A zK*zZUa_gu^$8T)NnT)`lUKy$%Ob6}V>amxD8<9MITW9TY9WZTg@MEFl=?W+_jrE)A zvDXZHUt(NYXYKKu9&OL5L!GgMu)U~i&|Z6$P*crfaH`y>%XYb+DHN4c2cpytTL2 zWA9YJah^xIb+&%|PKlf;3EN^G$6h(?+5T%#_Iksp-ajf}FB|FB+4@C5kDMt9D`3y=Z)+f98tZqx z$KEd3E08=4ti5E9y=S#U!lj| z$t0W~;23S4wKv0KuLT={@2k_^I(Tc3>(}Z2OS-Y^dFC09UMlpSwuOp4MxXMOJ9ATL zTs58DD| z>Y+=_+S}|dJ5{y9UM}L+S$lIm_9|d62}-QrkKwJoI#2y#ZpQK68WTN6mwW83fj!oT z_O`=YdoOtGrNZ7Eq+4g}_ngOGld9iOplt2!_1LS2J?^*GS$i!Wdk0`IAme2xl&!t@ zJ@!)Y-uYB(O!OE%^}Mw6 zcwP^CI8+9mwHF3Ga;BtI!CpL=^?M!O)-T|(*9v=MB@Y8@Z;;2{YS^>$%x-1xCb1VL zHo|eSfK#WSv-Wa5dhr+0`?g0f6?%Pw)Y+tb1midjUuHS}>=zY(l zx9K9~@;3pry^HB>@zn2PdT)E|HD9EDzxCL=m>#cp*>;|z(QSb}91?<#Y4l$}uV+w- zYYOOLDhxW?e}0@JS!UwkTd;|td`;_>QN@J!=;663LV`c_;c z4M2i8YcC3V+Fs*!SC95ShPU>pZ;w?pakKz!N8V4t_PhyE2e%`FV-M&=&UKutRR`E| Vd2F&{lzJ=P!EbKSfHHxTLv?iuEL-1O-e0F<2}cL=1{8C{}E>Ng#ow1`?AX&`V_( zxf(3BS)?`e(z-!f14;qKiV8KT^`-R%Dy_7IiZ3m+mWqnv3wZwD@0@3LXHPbg_SbuV zzx)5(`Q*ub=b7g`^UTb1X3jY~XHNc@%ElQrU(7zwP7TH9k1ifHy6F6p(Y9TrvdsUs zT|9dDDEEkpY|FALEUV8i|8+FxB+L4*rkZms>t9U|e&4eG3&~gTb1Q|;d&2U$G;V5n z^ZfFX+2z%9DyP>~TW-2`W_j(L+GeI0mp9HYpIKYiT;14YO>Zu*nl-z2esyE{%%>@tk!+YbVW&^$pF|jGEep@|(~kwXlB{>Yc)9sD=eqwKK|R zRMwR@RW|crHcnGrHQH>(f*EzyP2@E;L!_>L#tjs#C8wdWx}mbMy1cpG6;?-9)z+8K zsjWf>HPz2-p2z&Ax(3+zjp`ZA)>Y#te%VYz%dGm8<5j6Fe|F^zDnwLXRjv9MDP~B` zB!5OtHB6$EDpX`#cMkJ7BUb7ogI-GF}7Wtb(nN3(;=XU?swv!ul4rkT~1 zjdcs)Ve>5{U{_t`g7UddR!wDNm8z;#(^ODbIm>EjXjY}oZCYS8SI=%}tZbgkhN+&@ zgqEqSvZ`Qz{oH1&xqj}98rP#;sB&+rsv0rE<+A%!(yFYQQLGLwZ?0}?c9WH}+0vC& zuGuw}b?8xDhL@Kr3vI)_+8UrpHA|wX)KXAwvj8KhbyI$Lxv9r3gnVHu%abB(h=jay zx!F~^$7j^fnQ4&+fu{1=bLTfz*Co?4=gvtUZhtgV{GP81{R=T$f2jB6AdnXIaxH%BwrbLc19U)u!a`YV%7^*pn1UfobU ze6}mVp-j1+RJVLq1I{bg54APr)${eqpjb1|QXZBXbKK!aYSC1M@vI!Z+L&J$=von{rQL%PWv?v`2E zC}T@=?QD$AP0f{!aQykOVa^Rof+sW5%Jpc0o3=Q}O`krjJ~5G-Gk9@P5vK3N|52kx zA~j;f@DeqJS7a}`WYPqm&xeWJ4LUGU1*KBF1D=D`(yJ!`4OKr z9&s4tIA?q~s?>^oeW>YMO8ClVT&c*^Cj*JwLJ2(sfTC#$ElKkQD zisc=?L*x6kwuB-}lwr&$^XLD`u?H#}{L6l$I50{WrynYWP1m`09kr~m-|6ExR-0u_ zBhL>!*|Kclg`I3G3wF0#tqMEaVg7K(Iq_4pwiO}I`qZ&@`K%o(KML9Y)+Fk=1xL=e zEXQ#U;TULjUILu~T(N|*i_jjC{+1Jk+~<|te#aU6A)Ba9*>(uJdRqhY{S`})wyaOs zZn2$Cbf+`mo2b)TwsuD#_M)@t*G}uYQ0xWtT1D#*SZ%lC0R z&p45lq3AE1$WqmC?9sOD#Tz=oZ7r~)+u1vVvsD@SKX+oCj{Rt;eVY@%kK$|T8C$a2 zA9Lc5h4|m)(j;)VDDJ}vZtNka{b$s-C2RZ7RNjM$JaU7pe`-O`>h@itC+Oy; z821~8h;f2g)*fpQ@gk%UCRN~0nwm4p4o zd!770IO8_3I-@i2uQ03l_fB|ms30EKqYt=k{^)O=U@pcNB$m2^#@-COg;ifX!+IkA z>;v~4SlwO_eU(M6j+aFLNPyf9fAm=g=MM(H=rhi-3>o*Rq9hBaPx#`{@c5sL##7To zx_wDj>Eq6}jPO07;-5RgzC{-@XEbx#0>zIx!J$PfL&c9e!J|c^RgM~317kia{#lB1 z_@fUx?GGvEctCe13vKf+{;7p7UL4;eC#>RTNAGir?}MPKV0Mdtb$r(1!gElE7Ju-I zK*ut+W$f)6JPN+coDJr-j2$o7@5bl69!H&B{$ z8L_`O!Txg6QnW2&Z$Mf&L!9GH8aC$k=o{i2Z5h$Ms)z939XvCX**il13hQ(Jijs>E zV`eTwEaQJB<_!3Lm}B^+4^SdY%4t6gHS~s+?&!Pe9j%bIVW4>1X^kI_9n>D8X5B#S zEj6h8RdZcWitSfi{FkBT^h4Sn&QpdhKG&9z<=W{uVc7XpsZ|l)!THWv1RLAmaTXq+ z4cVLCW>smUYg0ShPk9@y*^<3H-WmOi9!=cQBlc%!J6M=@-gGtrB*#9Co3E*ieI~ap zh|{k9RhAR%kQU{T-i9lWXTThwJH#zhh=%lj-AH(Dj|zt4?&E^8KvHV)pw|Tr3UtYny}p-XF`p(zdcMSP!u`|A^C) zF|&V7^aH9`UTE!Kz^-3hXkGf@RqjPo`yp687EBE3e@7c7tlW|{DbW6wZZ$PcXGae> zu>+=1M^>=EjB{DRz*6PZv`4pNS04(C4@H8OmDZ1N#poK;k+lg1$u%YnY{^-^;ly_M za7)6Mp3RQJdsi{7eC^pl@RZi)*-X!|p1T9vUvoP5hPI;xUog3Qoz8=yoqL__dz~GB zWXA6(-V%Imj}zH(IJ(=3e23hnbgA9JD12ux{Vd6RwlDqcdHUHhd*@542m3%wLSuS+izgdW;6IH_c)x?G@}@w}kT zeIbLHVsKK4mbvuei!ZbbXEfF~H8t1Q*A4yBrFJqgXV%c-VZ(GS@03d2KhkKnsG~CSw0cZm8`3;x}>~x+*MzmboJCr$|p^nddZcgldig` zD7$prMEr*^LVq{1@+96OF?BNNxXw*lg%S^xxWtpTB|S#s%zrSZc%~FW+kC)`XMr+6 zi$DwkH&Xw#dl**sc7BkWQX$M0v)z z<52Q=x~jtQ& zLANLSn8z|!*;kBG35eAnN}B#E?$j2A}#F>;7U{O!L_BAeLJI+6W?#_yG_@ zI-LW+r%uLNrwvTv@nO(Z5cSXp$Roy+YZcPzq%Tt^<4-_5<^nb(LOOX>F60?&e_$C5 z|I_48hs~^SK8;5>p8Y+McQvK?@3-*7hY|dV;mKwCty7I$K9XTKCxc%#x0$w+2_V1f z>LkmrT-!{aolGcs^r8{`mOiarrr#Q36~QwRacp5e=?!u>5|Fdw|XTLKz=+IF@xXgVDnrjHTp!1DVd-$r~BC>Q68jkFHTABD6YNON)ilp#&sZvBT@SEi(ktm{(J z!>t=q(j%>JN}2;tt~JV9nvzCMKKrM^hMEQCeE2@I8V{A#Pd5MbuZ6S9p=<(vXmFoJ zt4GxC&vF(^sltQ(ntAF+s+o<|H(J%rP08PgC{R5oC0{+zHk9B8n1AfIM(Q+vU7S%< zIVa8Ujg(6H6;jFl*Z&H68u}{_eZ|00mzd{4v0#og939E0e_SD$K6Jfco@XZ$bB03T z>_ANU@q(#`zDPdx^LXER_=hk8L_T@MIl_+$e>vjEh-Db%MGZ0azaW_UcL?S<@LRzw z>o0<-|6RefIRkZ~9?o991P=tx5o`kw6wGtASnv?wk%HMa7YZ%{zDzLB-N}M^o>d4A z1J4x9wz*Mo8E~`UNx%yQPX%5qcrtK@;Az1339bO%B=|bu?SiX-pAlRG{EFZ@;Jtzy zfH{V-9h!l21B|iXh zKlTfb9RfT^@Ic`61Q!CA3N8YkD0n3B^@2-)XA2$!+#q;7@J)ilz^eq80pBf{^`6Z3 zgbkB{zb1Gp@HCL`eEdVG2T_JR;vC^$2kaY#e+ctHlp&8eNB9-MKDk7D9hfrY5$6cM z3fRXABD@8n40*&k!mk1LU4VZGGsRBwh;xL0F4B2&`NZOh*>|Oa1Blr! zc((A_cdG@n?>Yptzig1M%XfuO9=Kww>$yMS31dBnOdgUF{b2x{yFraj6|U}jAL zQHHi%BbarWC75<9n;}CxmEQu>&RayrM$BuPJh^1NL@>*`S}@D15lsE_1+(0L7i=Sr z3TC-W1Q#M+A(%G&Krn4sCzy3#FL(%IUhB{vcB>kzfky%}_-HJGY9G0*RqX>zo5zFl zfNArW1=Hqo!3mooLpxUrpSGLB5Od4?&&pkg)~l2%mY{&NG4Y z=Ryh$+aWSdea+m-D?97fFIHJ^3xjm1BNFo=Be zh;xL`D366ATm~YhZPyE?ZOVVZr`R&#(>Bh*l&5X#TmYtR9l~c>_X)NUtN9u-Lx8sn ze<0$Wf?20`1Q#Jb!RP8{{mv0w0?eStVVpKr-U*7O{-yBycEdlh8$K%~Aw^F=&GnSa z$wY!)qQLg@Ww=bL^Z8xOcJZ-c5p0l8<{H-7hjEO7b@s7B2&|`%$`HaJpPZXz#PBzU z$siy4lwlgkhqh&?0Qsa%YKWyB8i=Lt^NDF7LImWKI<^p}sTWo2I;y&$KN#45ny>7a zx{o1Wu(Db3RD)k(;5q{<+oau=kT1B^z^e@0K`d>%*}$C!e%`>liKYGDH1HtE z3_PD$&c`JNZZ+^K19uS1IlI}wod$m1z`Kb*=lYd3tZBjQ=E~`an;YG@Mk6jRYpkpr z=DkfHmYSiL@|tX}0W;V1Ch~CWoMv&anQgA}HTkK_eY?$3_u`3MV*zl2m%0+z!%nXD zO=P6pf~(cTiL9>o;)yI&w9#D;eInv+g<6*`FC3k7(9BbH& z`q{Iq=fD-_s~;bS)$+$j*BRzF(|eMMhQ|5^854RCody|96N#tNyhbyFOvmclv?p?x z%lfu(}( z-x)pB$7c-qJFdPvdMNjk9?Jc^hjPC?jvTU8*dub7LRIkky_S0&fR}E^lT+7SkTctP zk*iw$*X_I?`iR4l*L<>N@w&PcbP|YpyhQ55>legYAFqd3fOOFM_Us4?{M_YJLYfk)qbWauC9d7ReQ?9sOj`gom9`)rY8 ze|*oQ?*KaHA@Ft3`dU5urlOL(uc5vIkhbq3kG?qWEqGs~gVwjvqwgs6)j^2*27=PEXo*w#c!*Z+i3<;(p`-Dv+Sagig@)ErhJL&++Kn z1AX7u%0!OIk3IUf82ad6THgR(`y#E+k7nHe=mi7RqwPBxa>QXW5h~8GES^hjzab#4 zZ?s3>{kR`5K)w!I-$;+XJlj3bsE>~~wZ1QT^zGRs?FozE8r!mV1DAsMEKs*gZvcG^*w$^hKYkO(>Y(%Z z9L3bPFyED z7JieV5(!$aVYcxik&SnSjJJUkZxI!#H;UYMiHe60$16n$$A6cokd6!^=%0MT`bD&0 zN#yWYr%$I-g?JR+MbYmbbY$7~n#l$Ij2D5hR<)BW^Yt=ESyxyX(2N#+&kgO+6+Ona z)$3LV`wzO%7YsbQ#eE4N#--AOMuU_8p0jwIyE>fm55yzEZ1*(ymw1R zxkb|x;B?(;uuvl;$YG$TsNRD{XsAz5_ap={*e<5EWXTY z|Imqj=m4N5Te5;BcrOEM%#m0s>u29{V(;lCwb|geWJMx*CzUxYV9OYPg%yF;3Xt`w zJYiFI%_>2o$PF4IU^vcR|;hzNS@k+$sWeGY(-=1*TA@8py zPq#1I^iyVlL0grhUf#^gre-hCvRd5!2rW@@hBY5C)`=eFe;PZwK@*APso zwQl{M6@9_Ue^K>xAox{#u#I*f9EiT6iha(>f6mR)855RTv0pfNBTIEp5U-qsfUrb- zK(Op!#@>u=!Sxx(GM2`cMwi~Wv~uv2!KH(X2j>s&S5RqT?J+75+u}sGq;_ufA!j{Z z>w!WGFP2!3^@}{VdgI3TA;zkAIQbhWzl95?pXI;Z6h4qKp}>l*cB1!mF{MlwAM8() zUclQW>oZ(amco?5zGE5D)k^nWZoyju`QKx?wp;Eh=C$A9-Hr-6)_h(%FzC3-O{)Kyyv{|SZXYn? z!5~hn=YtsZal~4lx+%{XSFcK5|I(FCo;=DkRv0nu=M!U=#aWM-F{eJt5RU;dFs(z1 z4Pep+UcOQfFB2JSJsR`!j3J#K&JmQ;b45BCUM^8aUpA$aVY~YZ-AlsJB0mK&pVHHw z3J^oOW7!rwmND~vAnN1g8_T^4L>}{|f;fv)=PZ!s*8uA_{3b91<#kBcZnzRx`t`4o z>Ey|yZH#FX?Xf`&>EwITRy}F+f0fKXYCrvt^<`W{4B|PXeQY@}+kkpkfOyWZFXA8u z^5Y=g7Y_hy`OUz%`c(4IA!eXFaWRN`J_a$6PyB5VkN*!Ef!BCIb1yyi_LZLHuJ8kIrcJE#Q)0jRH9yJvKVSEa2L(p>*RKN~WN7E*d!Z-IAvGC}zfPQ8k_>*e^21Ei zEtBDY*Lm~KEg6o#&YP!NGWgZBVWvkU6F`2?lV^WoYIMc?SXXQYzjc9`#POrmiKQpk zT==)X4ddk155o)xU_F^~owzL;ctZBW&_IhhIq)RQ#V~vcVjal8QYR2IT?eAR;UKOf zzZtO(%)dht9Avq!e6^%Gc;{kO;zmikN=c8fb|KBlpbW%y=&wt9x=P#Ddx&*l zd29gM!wHA$%KIYC0fIWXuH0rp2yXdjTf-&o+Be7=pOP-Lu1QG`wyKa$>N`iREv$mR zP7F-B7~*add6q$YR(R6wo;263>Ogs}Wnf?(`r&-sfi$t3e%Il;Rf>@MS?@XrJ^9C& zf#Bw2YQbhh#x_g;+|Eke;Dj5YaEZFRKT2W;B)#nra#<85jSZNXxN9JE873x z*qw>X+tDsf)q1BLy{nBi7dy*fQT|QbqNaA{0@b|OZ);BT%zy2cPVfny`+4FYyl5b% zUvZ)(re8DoirkpzNFMxJ2Om#z1U_TV!{p0j;b96RQpfwqK;XDT8R{g?5k6-~@(U1i zoYL!Q2MV7&V!fXBJmJgXiS@3O)9ajx^?FxTFBnGolSGDQ;}%ZI=Ob2Si43B|+C@Oi z$Ez9yCC>&xI1{AT$MX32)2a=h_@RL}82D)e^8%Lg z49|mzsq;<2Y{UJ6*@j01Q$H_qDbF@LCYW{S8aDFPjga60;9oA-2L6iRfxtC_Sr*>| z;<1Imiv^#EbA}hrx~vw#EbA%3Ht>srsdJxT+VF;8+VGZOmi2eREQ@7OKihJkV4k)^ z1+%`qNY^%u5KJ3p3Fhy`ykOTd^@fak?*RH&L59DtQHDByDfkVwJ*&U8S;p=FEt5&0pgnk^XB2-1;-KJEO-gxs9@eO+$wkl;-!M=U&{pZ zW`lXO?FWeO63m+lrpc#|#0CEZ@jZgsmTLuXMtr|u`s2fbw;_I1F#Eq#F#Y#Q!EA3n zY|!W6AB9gIu|5aGz`ip4L*O+EZ3_#|5&n3jeG~ByVY5c zEiukb2DO%0uv$wjSgj=%tkx0>R%?j`Po+-56$VyoiG}}9ttFOYHyb)T4XoA@i;P-J zESSG1YkLkE_^5#c7+16muT?d+4LroaB?caE;K>HQ&cHRqyx>J>Cgz1ULl4$Dr`{GO z*4B2pKTPDLY+5Tj?wXmNJ3lk4%O1RDrrOBU-Hg{{8$0frYN`|-Jbn)I!)BI$6y1ioZ zQ@TrM7=4veaI&`=>$#?!?+O$T8)>d8Pia=8`?xS!KMygtVODF?hox+2&4ud2y6kGL zxaqc}RvF%Xsa+k$uFd~-E1=zbS4?|}wPYjJK$HB3;YS7DYxhKMQV->7dnmW0hjQ&b zl-trnxtDq<_m>{ZvGID+ey8U-UzuLSyd|3G~wi5&I$dEJFr+qV#y_YgX0`#$yPn+$zRAVhuCtL-cB z=;L`X3Z#S9cRJ*V!;-NJ`lbR?->D$2??R70-YdxM0Z_8OQ$2DYBCn5bnX0>M~=^d z)AgI5*SpZG{g3xI>Eyg?k@?Ijo!m%|z9EpapC_ zyr25AU`CXq{a^Kzy9#pp2WBnD_-aqNt57bl!`W{`LAu;|kTb`ZPE?k8I%urka|9FO zDs(4zk4N8A&_}y<(D;!a%Kf^Ba$Lh})}y;}KZG1@;Ij+{%CSv!V4fmW-1IjGawS?w zWSIOMkB!yWmx!`SWPe=m}T?VQRdO_ZI8a&pfAEq30mK2;E^2` z{zB-Z9QE-zJoBiJ@^Fzv2=E>qb>Y~19*A-w5FZDiX%Zm-W|ncFE|<5Jrrc5dP%@ZG zBxpHauvgBhtgD~pt_?o!n&8pHN0!(O$6phy7Cpm=k*dr>{LXNNHK~PbGr2{JGCBjx z(mq8t&B+|E@|;h=!{hW$uCY~N6!!mr*U5jE%kIjsV|A51K7{?6ZP}n7+!lZSL8tVf zW4j*`@Pk$84;QFaf=nQPeUin+KwlT2j zH;E&Zq7CLP_Nnszb3GHgBAZt$k?yBEl~Na)Ba1RVr8iEX{Vyrwc+V( zEBd%o`6N}tz9*cD8{9&f&aQmi*|E|GR_pgEzB2pd8DB+Q6Tt50lc(hsjUsn6D+1Qf zoPAgOibjQst|s?da;F7~vGe)(ensbp!WWY}k=(LC@p>n=!6_OaD!$(-8tE$Ooo%^C zbU3jN2S*^KR8Pw){-LvDyf3MQ>q^VA`%E8Ne78QFYqra>i&r774wUrDL_Q|};=9b; zlB|=b56S!M-z%JqKf7knPlhqc$ zM%6mMje9F^|Eu1im^H=j+V^uuc{_sdZ`kd>r|i<4<#B6qJo~1WlkU3mL@>5w?|3ZK z`50^aNcL$fFJH$>Oq27$J@2zE+RuS~K*6yS`IQUWe#F5y1#nbHpr{D8hl<>N&S{u3 zf75$vAMiuwKHw!eSl_;UjTO0t<*7}yTXOCS90>*nWMf0|gV}ony)&$fPKbZ;mi7K~ z3nH=7U#{G@vL9sIvQBHUvcs+M*y<~-NTfLu&z#xD4}X;8;4=ZzJ2|v{2yE@FI6QXp zKDFlGYE^Zy0!3I$9#lAJU8nMR&c5ob01xMMq(sHe*igj>eD{HdZa4!4!2kcIzn!2u z0vn=75WbM1dh>6h%q@lILYpB;VG31aW(;81R}f5Phc4F^wrBA$g|3;hvQ zU4k9hf2Vhece}0qxBBIP92Srrd)bM;tV^H>8hD4ZX{Xt=U_Ed83-*@(rPKZ^?GLUZ ze(~Vh)D6KGZqcjI(RdMQGq#~_Beo;9DaV%b7=#eeHdBr`!J7+v1{%my$Wg@Lc`^wbOzPDX?)>p>SgIano{58IU0W`R`N(KvL zgzp_(m)MiPrFW#|tgnS?2^#q(#AV zX;3c<0yUX+?@#^;wO>n9%KVov&VSyC+)~Op=~pa&qCZm5i4*YjL#($&!c06>#cBc$ z(Qh~xaBLr`aGyvVafp~JwNG@M0I;4z&`gmrO70lX73_i@{0IeY;g0Mnt^>!xUi$Ju z66IZ4?Qb}*y{TF1J(NKEtIkf&5o}L2kazTr?%{6e=sHX(JKP=1`vxyOw3z40he4}< z*m|^m;l~@-;e$hYht`G2xTRgTeh&ue*DYDwUv#Y8uytO$ZEx;u3GFEG(O;4u`YFj? zn1N4Y*dy3@qv>}g0Ze6bveDX-K*5F+Q_}fcolV>H`RIz|Z*lPb7(=Qs2eU#^K`87N z#a=ATLHoyzbl*)Iouc8PL+`Q9AN6HfS^4XrMfnt)r6nhFEB(RE`mrv6S%q0UeoeXG zDY>kB14k57Nur$2Ct0EAvbyhY-N)=l)yL>x)z9i14;Tn>N2mMS^^If7H{9!oPk_~V z(tg10_xah;KRd1SXwm|A$UrCGnCN8H?|pC;u>E!2$$cP-foHFS?$!N{&JA7&{_aHg zqHoc|Zr|=$7fN(*e@K<|Vc!K!z0$W-UeX6Ir$q7fAh$skE0B+`o_P8< z{|U#sx*uGi;2uk4rB}B(xQ;;vdORhA9s%)q#NZYNiZ?s0%h>>GGHVOqwG>-kmjM&w z!+OVV358uxcCXe-*E)FrXL6ENk_jiOaGivwGU~8ecRMRk)~EPxCqFUyyVV@zKLuHZ zeTsiTPbuqz{+Ek^KBpfFo*MlgFCmfB(q~ZM?OXA_l{@!Yne*K_Jc6zap!Xj~97fD* z-6OzV0?zYde3j%KRg8a1%GGXJFI?^NGT6NU?nO)d`F}Alh#~T4{qdV#7$#sVm-Amb_TK4z4ZvH7dopoy_PgA3y+qzTW z7wbB~syL?;=3MJn10ZVkkJg{_!F$e)@3G!3y(-^z8s@W~7qF5oy>EP*^%j;I-Fw~m z7CiEBs?-4o7ZDBfX&=5!=T;xC7|c1Cx!3{a<2Cw^~d#dIpHr6pkf+R^E_9_!s}19jJB^E!ZcZSHkIpNKo} zslHZYIhv*~F7XrRInn{tJ#n4T5!i|AgyaQVM~;OcHL~z&tyi6QUe&`uR`3glR&z){aH4f;*!orb!cRIMf_V(9y;MCc?@4nEE7GJ!@ZhwKDv$$6IdA2)^f>D^g@C}TyKx%L=JfZk0XZtTW z?2<)u@Xe)8XVZ4D*rn=QM=imP_!Qf%-}_2`)!|wA^3kTPPLcbO4|nj5K8(+&@BsB1 zWlPq>$?+GTyTbWbq6(mJN!GqMnD~ntsk4KhD=JYXv1?mSD8AQ`^a<+Hy30AI8R!Qz z?eMtu!Qwu}A7E~Ymt?H><87+L^a!AwsCo%dp?4Czw-ZRcbs5ZA?~neCJhL=c_xcQc zTnjlx8=Hee?A5mW=_>un4B7#?)p34;3sN{!zZ5+Ei8U4+SAFBk6cnRH{u3pCq5C$h z`#)9K)cZud3ZMMA=Ri6+-41NoaVk7>1mlmv_w}?SS<&Ro;O!f) zy)*J)Xyddy2V}(&fA!8G0c5UTZ2=-tESKf(>@bLFCTc_PQ$&W9|6s-sWV)nwVwXJZt zB{Oo>o#Ba@;VbW4-wU3!Q?(M&O9}L10zEJ7)hqfdqSFs8bmtMwAxC&!km)?m=M1V5 ze9Kf`hV`m?hJfb)sFqq6kA?n;ULH@U!Rb>V0wOZhl7tXdDV3U>M*#u zWnPLhUv%)5Laz|Z#P@VW>>8B$loNY8t=JPH1|w!c?r|sfcv`u~l5+E=7vw+WV5~v0 zZ5cAG^5z2{?|M+*_TW8AKFh(JeY8!D?>>vqaP%`8KFi@V8?{|eJG{<`nh^Ooc@&aE)ABOo7$XPOpwJuZ1l{$F~x)P1z* zZix)*tU~@nu+@KeJ6pnmlAbE@brP3I%!_b_@ouEH$suIRFzA?%Y8iBzkJ1=)+N(#G zOBwzC*brb}p}W+U$FXTykM$rn@oOLkt&>LKO|Fv?Ff_(-at?Jq=%_A_1q zqUcsoCWyy&g2=#@P09>!%L9#aG2PnpznGl+r55|06q|0sxod>yn- z_C0kn<~2EWe!-|ak}7C<8!2rA?WgEK5RcdP6a%x|m7rOIl^}3B8|a_Z$@pq0q@J~i z!BTp50-quH5DP>|r)L`Y)WcZYMxR+DI+bF5EDF&+^Eno%`7TWO9_vP(jPr;=Jb!)x z;$d6@&yda@^H}|J2hSDyC67G-Vn}!Fc<@;+C6P5IvMvT1`PmR38MZvAcl0ul1F*QHi+_2rNZ&#^C3m~!LE2({knY^^QUFX^Cw7# zGuXOALWWkLRFs5GQpm&YyFEIT-u^#CM2C zA+{6gGg3T;$8&HVJcd!BR#^y)zQ zex9_AGzTafl#8jA-w$9qU!_N=_uKU3l#6%DFO_^wKDjtwzlt>NWgFz;e65juTcy8X zH6qRW?pEoG)IiJnjsZUx=j*o-vpv_T{8B7Nub$n|SlK+cu^Qi*n$v{Mj4P{BKQvW^ z)!OxQo2};hxif0i*QEq1(c~wrZmOypF~ZH~LT8nGM3c5HTlFV*1DskbdX)7U7detl#;iuW6b8 z6dCe}wM;YloTU+X!$8cs#00Z0cMIlC(^|o-*JgviMKJ65m|)iNNx`h+QNgUEBbfE- z1-&fS1`Y`xi{pNC6Z4a9PjzgIQw^)-~eLIEaV3f zPZVq;zE&{X|2o0!(>lTI#|47fzY7JkkJt^84T)LM2G=6>y_q+N}BlGPHS# z@M-gHf@#}bf@wdmZK%ga%z2fVHmh=h2Lk_H_-ud6=gP3na|IUxj}y%HzeF(GoDVCg zlYPOPDB|(JocoExz?|2KCjtLRa2fC;f+quS63mAlzZJ}f9_7f>-}9;!oQYVScW4l{ z$wJ|?O_m8}n#M-t(%CON8T0zuF9&wKF+3s5AM+DC3}dA~q=*gnL1uLIRSBJ-%okVmX#E+sz){}9yJ4x9n*`HVs+gD8P-Kzw*b?gv+1|Mw12Q*_K~`70iS(wnefK| zt7{nWOMveYei-;Dh+iS` z=Lnze;=36C5R?y~amXXi5kA|?Hy-~G%0SdZ9&wKF*^a(T@DD+?KLp4l&Jlhdu#YDq z!gV11ojBqg;j`U+>`a82Aj*(OtoO$Nw0x!f@0Ovz^~UmYgsvI7x zp{Fl!9{(XQO3@>}cLw;Bp&nxGdw>Z&xxjg{29P*KkJxsq$WRZlmQj7dhDWeL)I%Pz z-WLKeQI@iql}6}d^H`TZ08t)fSQfGV#vgNiC-J}gu#x*hFq{n{9*&sDX#Y`T1^DC< zr}LjM_&k<26Q}c^%S49$L!8ckriu)!Mx4%nzAiHKDdKegQzJ6;AL11MnFIy`%iud` z48%FYS9K4QEB*r+@|6FC$(8Zsb1wc4qC8;AaO@&xJKQap_3aSMavl^+`yUrfJ4*!5 zM@*ugU5MFt`aIn&eDa8OJKMneJbfLQ$C5{^+j$_cK2QG!Od0ZsbvqYQM$X3%M20+K z-OfWOBj>5*bM=r%tlL@jH7kg41t<@g?K534+owS=BKNzNkO=}W6+YWajnAS-jnBYL zs&*6p6C&Rq@tcC#KKljRh>rbtb7|Xl>e#lDgSf9l)p-F zD`FCLK988e2YVT4lP^O-b>8{>E~YLYjYqISdM_0Ajo$Nw{o(6_e+cXYAC)15K|Wkx zF_eMy-XN2SF>f+V1L-|LDu_?OKZF{P-qWLjSjO=A#3B4ch=BCo6fMLuZnP5PJYr}A z`PeuJagYyn*Fo2veV}oF1Jf@xzsSI2h^4Jmy#!A+_!S1OGqAE>C8T<|d zZ#HnJf!UYZp4|q1)4+!ee3V%Fm;S6VpLJ<$8+eF;OAO5W5$zk34Sbz}d0(bwnhhK= z@G=9p5%+?D2>cOQ3oh2F^r#>toekH=<_%`Qp!o1|DhP zuz~q*rj}QG-N><3^is=aOmtG#XnPo=!z3InUXZiGMI;4dNO$%mlc zCl$QP;H&Ru3V*Y~?)jPdn z!w&LgY~N$x0|q{9U<>EEmJb@ZKk-R!KMo|8d%B+NO_cWMqr~Pp`lq7=!}tx!!&5&d zC3wbfNeN!^N2LS{zonSJE~WDIFEQ>O%7SqZJmlEkk!sqECM zDM_t8xzA9lS?Ty)k5R^?E!6#$EU5*Oi65OzYz`dWp9Pktn^LWWT z+M};OjMa;#k)6=T`x;Z<^U%k8Ch9v)G=OEVhRiQ#pAgzP8?^2JxEd$->4%Bx# zNZU6Za%?}XuMioJYGoqF6RzB@enY#K^~C9ob0OFjD5ob9gFpuRIfy1w^#_2EA8P#S$d^5~m32+wRFM}06g zp>LZsuTMD;L$fQC%M>~$Lae1)}wFhU`u_U zg7yI>^znPIte)=QfoRkNNb8{WaX)U;zCGt8`{P^)GmrgoI{eMl7sNdup9|=q_3<9o z)VCQ*4nc_a4Fzd^7kKn-#eLu$txV*Y9PZJ#W{CTn5cQoWa*Y&7<#r=!5Ggg4TDZN8c*w)AhZ;(DyTszFpAQkkICq%Ot-aOWk265Z;77 zKGULoytdKyz2wn19{1kq`s0@#ef!Q!+Q;9owLbMc0cq{ebXFBNmzUt9eSd=_J z_|uiv_ld{8W;_pwq|x_*M_(D7gwNGj-?4^1z4w&1?=YSbyr_*6IVQb(Pi-9T{uV-g zr6NavJ{yM89GspiJcVZn>Do^{6EWoe207b3ME%$8a+&BubEpu+y*t}i2bM*;3UcxY zO=VpQxe_fTGE7#BKAp7)aveH>n7SA$Acwz%zf8kPq5b7j@R`T@HhT08!t;b8-I&PN z`eu9dO~u4dIkw+Kkk&_e-FAT1G)$&^&N2xYhbTF?P?x>7YHU2W)`cNoL%2uc8UoN- zav|1Vu`mf*4vRliKEQjty|#vzj2J!2W;p&{TWcy&82pj;(;KeFFM>sUR}tUewIcZ4 z9e5PJ=lY4WxWnqS`90Tlp~da}^?Qhlg%_M7kA~V0I{@-3INzl12pBJMy6Jl?{mv*} zZst3wcqj4*NbTK)_*1@jiuhH~+e;Ka=J4G}zN1Pp?rX$D+7Pb-#X)O89iaO`8$qzQ z&-Bwb9dKd?_^XBsKq1~9-Q^!a{w+@ITixaNX&kU=p%a_iUH-|9 zr$y&F`LmhdhRvfg)jO~udxQz{Bp=Ob>v=7?`%!?n8|<(rE>P537LvIjo- zmJ@r6B`TlHi>Edzeew+__GVJR)2D+_=RY{Hy}C|$;dT8?r@jFBFFQr?Jk_Vmf4ZnO zHUCoNzvRSTN*rI2YQQzfe};QAspFw%V`}~^51(ApUH*RL z!zUMZmwyEL@X6-x^2I0Xy2}@ztYSWWGVjm`AKts}>XWa+CqGpqr}*SC441A?KJNS< z`DCW2%e(kwrj^62prPn}4r{(F&c`lPpg9!9?DlivJikZ<~=H~$snn?C8y z-;aFLC%ySckZ<~=H{a`%-h8i5W?Ccqd3;ihg>R?&9ru?w&UiQr!`(X$witwGxN~$k zwQ1);00ZVUfXuuMoyshdF$GclqqQ`^`DpV;}qO$4o`Y`PkOv9`2>olCylnqIkU7tpB~p$5^8Jt0kvv`#g+%j3shS)iwVaM5#(bmk!z~1`7)NMYpQhi%UDuP{cVBJh2vxoeRBv=e(KagOgx&7XyQj3L_- z`IA%i&qMxWPVABH@^3@_W+%3(yZpP5kBx5i{I-;u3wQIZ1Zyo{mUCR9C$!Fi~abkNCeH%|LfPME{C$=+@?>U}*hw<{c z?(*4pnBPp_OSy?=-@!Lc-%H77-(h|;eJ>@SeTVsNZFl9%{MO!GzRYhcnXme8a+m96 z>ASa+eYfbJ>$`Aj({}AUk3g5c^W=BwyVleKy7Zmr_%40t$?wv4p8PI-=gIHVcb@z% zedo#V(s!QxE`1m7(s%A$z$+8Z2JSN<&I#<(WPduJ_TXIXGyPQTpX^?nJaCQ`y2aP} zpCNa*uEpQL!=M41)E2mEUd9+=r}o7l}OXSwuYv;+0{i8Q09`%HjpP74^^^Y7LOBdsF&SOsW81;8# z*>+|eo7LVPiWKmX&|qxTizlSqzZ=o+R9XEr^z=i_hp!Iu=7*qSDO7YKA9?wovXH_I zd&v1N4?4MzXTB=DB_sbRK06Sy&%K0&Hn=+XLndSqcVh28Jj;gsrjHzK?FdzEIqe@| z`|c1nM3+tIxS=t&W5+IX;Nk)8Qr2Q=HWV&{jsdPt%NdJ5=wlhsp9$MPVHuW<_ZeU1 z9)V$tZNp!@`M`lsuhp{$Ja6DWq&zeEV>qAUE>Su^aUNgyDfi4B>%5BRV~VHFVQ9Ph zeI7QS`k@#K9!G31R5D|6-{HLDJi{_o-LU`o^84Jrj_%TXpJ$^I*xzoa6PfA57Izi3 ztd;s)K}`TRYLh3gX#IZ3zPewlxzRtauEOEw`1pRU-wU;l=MfVFW$k?+-qka!wD8kBBGioE8Eyjgl*Lc}erBPsKamRaMGX-~*NqAXDPBWKFp zPQ`e)bgQobY9a@vX_4A-~?t?C8C4jmYwFRCFp2l#e@VowHe=-Ke)@1&j^rGaiWhu$$yQ?4}B6VGsb^bjVrwA&h9lrp-mT`2<{= zgDq1jt9DskpMgC^-*S(_4y}JpAhjE`%H1!#9QV^FMMd1lv-Qb-*#7s|Ypmh-FIpbY zy=m#ddou<=`TY4Bq;|X199S z-d}A$-Ba4#@1dBoHQPt-R+3bXK8gm5_19*?cf zL$XI2WC|DE-U>3X$fv0jDT;1e6pqM~Y#<&r@D%ZW|ZIS)N=9U8j> z#4#PFhB)5y7g5-Z$!GC~$JxQz_#Q{(+sdstR&U7)mbGK{`8H1rwG%TwKcJra2}=#= zS=h)lIfphYy=8}QywWDT>MD>BmExn9m_eGvp463oYnCR%#t`Yc!XQF6+yXogZ6_yf*O2- zXOYA1qb&Sn~47qMhLl)dgF_bzk)O9*!@M>U3rm?@6E?WgbLnR z{~)gU{Y7q##Dx-TeLB{1+D@&<7I{W`+dRtnposA`AWYb5+f784E|*x#PXnerYdy~x1V8~9rW{-J@l8F;UOj~V!M7?{v+;Oh4$Q}%H68bi8vU|+Kx80&Uu0L}*$fMOt9@FoNAH1InH=8j@E(mb}wbI`m?2$1mVr`hU7V|4+ByJRj*}blF;v4Whp-HSk&kKL^bNc#yoZiFjw6dfTjR5kWWk=iMvZMi~MGT z|9xPshbua@Jm(b6r*B*(dibUY1N9J}iI~R>2WA%ed|Trc;pgBf0}fYwzQuj6@b$`e z%9nuOEd2X{`wD&(n1M1n=<8MTe1&eFO$$UFGo+KJf6`9IB_QfA12LqN*Z#v8 z3(=K47F4T{PToci^)tQ`MEwtf7)*JWhcPn;Jn&#&~F`31=YkY8P=Bw7BH z75mJGX-4p;ydl8+Ax19KtaCE>)lPM0TDOJE^UKO%E#X(Y7wHuBvCWgguXcPj(_@ke zAivrfE6MU(;bcPPkMpF*d(sm;=`v6HGEbU*n+$%{e`Z=vD`EN7_+sYsyh#Rs;%x$# z=TBMr&ibYLgkP-|H;q8+nNEKlrOXzkxt5=qxSkqriZ8x zr||gCtMZ4bJ#FX}`Jh~!Z|e{<&52g=3y$15Y+%aJ@6=U<7WIXdTJr=!b} zrvAw)J>I$=Y3eCa=?T^iNYg%!B)Mp*DAGDm?hd4F#2hVixl0*$x1KS(s(fDM4b^iS z%4gKinVHGqndR$l+U=Kc=&8r zU`}nb`)a-tX9@z^`0`l|we`{{310R5W|PHc^RVXC&a5q;S>HILy1c=yL{n8`^{n#x znXbiXk@AMd>W1>V+UDx=;^9{)-I{C7m^rJwsR{+(RA1MuKJbz!{a1|sB4*#xw}|PN zcx^@DAY#5d&i7dvDna_))%y#PYR~*>=T@a_zl7IMV{o8 zC*LoaSKqc^8~9AY1A)VW>Gu~K{0hNCz@H(w2smQ!Z!zTKg4OvVnCC&KV9st&8vK2N z!{EPR@Hy?!{_)`RePv?mu?3d_pK0*Jf;sM7Z15`tPX>R6!H)=@3jQqy|7%FItc8e4 z#C&>5BHo6WM7$RxGEFB}B}pmsip@jCTxIgNW(3O@a|wHwmU6t`LmK-474)^ux^tf0tnT zA+K(!GY|1$gMUOYeUj$~W$1?|3$}qr3Z@@kVDP63rcYjD@S6?(3c>Wxy9Cqz&4THx z4;%blf=7b?ioriDm_ByI;IsW`GyV2t!PGxea2WUkgFjU;{q`Dz-z>Nc{CNhScX8C; zfS5!aLrfyxgqTFU6ETVS9mFJJ&Q~PjV#FlkDTqnLHzFnx#}JcR`@6jlpj=_$ve_{0(|&|7PJQ z{7v|~gg+88%HM>4SojHl6Tb2{;Do;kU-=tw7{qn7=rDiF)uJF~by){)RxkVDfpdKtB7cRWKs;!8(2H4&k%!UKY$g zI%M$Q6U=rC(FW*be|=6c`>05;4Lri&PZrF6xys--82nbj?4vsc)8>tW*+&l={2hXe zz<=4`9}+wg{Pzq#pO(_*67ad_g>I7~!DGN5Velsl4ugM{!EX>e9{eVQ&v&`0vkozd zn7`(bh}R<~5x;<#M0^l2iTDKAOClbMm_&R9ViNIe#3bVHASMy7M@%Aq0WpdAAYu|R zf6XBg4@FEOz5+3ccs61ZF@Mcb^Nze+ujU0_@5 zrjH#q_-d}fv3catW?=f*$%5%)BL&;QYOa9{`BQ~YA5(LU@S6?(3c>WTy9Cp(HVdXN zJ#6rI2_6alD+d3tVEWP#gRkZqluKVanQaJ6{c5fO4g;&XM)+#30j4jhxkmVEt^qCs zf1aU7%{AaRfKQ_S7-ACfM#LoIorp=q?;s`-_k+D8;$p-k;wgwp#5W=)5yuddh&Lf7 z5${AyB7O%kiMSu^B@q`RCJ|3TOd`G!F^RYpv6^e>JP2y80j7_sdk0`0_@N{G);gAa)G?0M-#@+2EZan0m$t9tb?v z;9n=W5d3n3zfdrJW0ApMCAbLuyA8gYcTny$@JX~`0b&yIO2j1MM-Y>Ue}|Yv{1IXj z@hQ+vA|8#HM0_n`67d4WB;u8bNyMCYRDWeb8G`CB;6#4`L(J_j;V(p5f3IVaV9KvD z_;(9V^cRjz^q1(_BQlBp68=%)4?wK?OZWq5Gq4T*8G;l21%9HxL|*k5a3SPXe+ggp z7jUA#gs=JwIMH9iSN#Q?=r7;}&`F{_D-n~3A3;na{vBcx@kfYB#HYY^67gunB;sok zlZY1}CK0bhOd?KPC&**pDbxwfcBm7KNPP>CeD>Wkga2K@LB#hP{0)NHU(X9>f4wA_ z`VScVw**r^_rPIU>_@eaJ23SZ3ZMOWu3+-Z1lz!THppYiuQB+1CP+T}^ftllNA-Oh z@M+II!XE#zopYJ8^hkpnUfQYI83Bf#ew_xg2^DJbjC&ab_rk(+U>GOjGUx1ju7E^{k&or?O ze6iqxz+V!49pWj1>D#LBAkTU<2!9dcX2C_^w+N;WtLtjW^E_x1K7IIp!EA$v1wVsW z^*iLl;6E??@xU($o&@}=;4)wz`k3}l1`Y~76)}IACVwjU>RbRG3m%F5Y2d4CA>iwP z=_}+{0M8O!1$?XE8es0BN0~a{m4X|9`D~8-X5dEz&j4#>qfi+xK?l*@M6KMfKQNi<1g%|3Z^fV z3T8jg5X}DMZ$s3{ep@G){o@E`8y84jc)j_aVAi8R%H=Qnag^cmk_4j}J1N(RZg3th>40*)*+dcz;eP6^sgl~cVS#Xpb&}3 zjuNZw0vcv*l%TjKtc@X3V=^l&itL&o7cmu(HVWfr98ik^|KSkR3h*#4<4)wnE^6xG z_4~c=oZa)D*4F;f3}PK{3?aA1;?Np7k!~@p^sCCp!Io^*ic8l zYT3eI-m-N;K-n^u>D{h3iKv9lClD|es`J6tB1`>gHoV0!pYzm)Z5(Aj2PkI^?=#Hj1GO13JZ6~B4Qg}J@M*)-hA$YNHM{`j zs($$Vue{uFqhUUms7;Ez00jwYHN4d@p99sV$8ewF0mBCk=M5h-%(0Et=Ly5744*Z8 z-tZ;E=*U#?!)Gk@$+3i$8w@86yZLZr-`#vTa@}a7jd0p^#m33!~-pz+2dN&`ATG}8#f=0@QAT-^Wliz&4(lG=ED&_ZS1EFyZLa$#?6N#?B>G}cJtw| zVG42c;Rw6=aD+FY%=BK6GVJEV5gRujj)^M>7gIAY`G z!x47#;Rw6=aD?4_IKpl|9N|mGC%Yl)zPR~t#Kz5s6Z6ZVfi}V%?^bz};TFSfhSP?- z4QCAZ8_pR%WO&r@xZz2|Q-;rwtNi?*GdyGXis2acTkZKiTRCBPjo~K4&4#xa-e$Pd zaIfL4;eCb&$?_~QVtCB(lZHbByBmm6+0yuonFaI4|1hC2-R z816GXVECZnJee%_>y6EtJUYR8pF#BHyBQm<(X}h;TFSf zhSOwuuhnfhW4PaNjvV**_mJUH!{df0$#|bYnKFFF@HxXXhOZcop{}VPzUNa;7+zzz z$#ApbErz!l?ljzMIBR&H;X%VAhQ|y)Y51h!(}t(X^2~g}@T}nls9$OmH@w_%qu~u? zv|%YJ!>xw58tyRMLzZXtKEnfs4;s!JK1P;y+=Ss1hEEwjOP1&V^M)@OWH>f^ocoSLL5iN$>45tm3GnX3sw}!j;7N+HL{b;v$>}r?3zH<|#)9>5_>HS+W z0o{O0>bpwm{f@zN?a@QHgtDWA()Ae**akZf2aR>QU zYhh4p>tQe@R1<@VrY;5(=G4Zy$+kWQQ^Pefm>Q~+!9-IlLkV;1Wzis1Ge3UcjvaUJ z?2W9=xDhqhc5y@v|Bz*RS)GduJrCU1L?;GE95Uc@7WoA7vwu$=C8r{<8KCR{@51N(KxI>e%H3g zqYocp_|BF7ZZiJXhWw485K8SYzl~de)A&xP{u+%x_s$c`dOVuZ&MmdSw}t#Qr~LlF z%-?F`uRWAM{^YcjzYmA}U3y#5-x}lZuR{KwtiyL_l#2@Yk#c{?-^gvn`nMM8v}1kw zV#r?u+G4AqS5bd^L;lum_P;f9f0GF6?^wv+7Whl3GqL01H$wiJjlcC`$NW7L^4D_} ze@}<}Z8QFO4blAlD&#K*fAvUL(f$2J$X_q~F+bejjR@**Hso&v{&;??sK1v&{<0>2 zd}dL9bpU&QoPfXgsWY+T;$qlwofH=!gYeganEB)9cJ=qBkUxIM)X@@P=Ij`+4*8pg zKYml7zfEGt{cj2RJN4?~NC`+T_`5CS@ASLy{SZ4wfBX)LWLKW|g#3;CvEK(9$xdiT z`B=zb!@K?8PS9TpLH#`#^4Et4$A3e*iu%ij{AF8<{@xB_^>;YruN60gPIV@BTzov_ z@9cYu$D>*7Sbmcsf8+4S{shu60Sc^yt7o);>#p{x>r{!%3JA=pjo0%EmmfSt|X8RRd4MCK1z$lu10 zzw2*AzbzJoi27R>@;8fIq1&)o$F)}y0@i6^ynK2&bY;ZhGj5RroL7Dv_GC57&#G=0Q`(ISe zB4|dd_KehK-BfiPGun;$?1n%8UrzJnal7pw#9SC|yGLK1l<%CJT4C}*f6}2< zGD+bR1-n1kV4BOMF6-&eQ;EV_r=o-T&^FrWKYH-AoVqcX^*R`lT!B7(Vns9ZL4n{@Gq)hGPW#fmcjSSs}{hb%}IP92JbujQK%Cf)KPxxQclLho-!(8907-KibRTDW!Wjm?W* z;GI@soQICCd%AkJcemr!)sFi*?xr5YQQWi6t?8NJ>N%#5*aMM1-^C`%d$fzgLYTR<}3Dw**~XQy{hF0dtUvZGnuL!2cz0BPuAd{8^|&2`b6)RM)L$j^)*t)& zFhBIiSp6koXYp&fO4F0AFBAT`< zR4|qS@Aq*8+A$8dfhLgfDd<&nyWutv`ylPsL>MdbDzsyJ zalY_*+dwyOOu8me8FPiRZ-Q+D{SixW3~lH?t4w!qs!V4P&Lk_-XA!0m&LLopcnWbd zLJH}v2+&a`(2JnUy(@%uK2>E#vO92(w=8@4d*3=gmTY1p$`c1^9u@ zj8{A9&GR%kG*x9kmq6@h9~h{5Rp;+8olM_zOo`<;cKNG=rdcxYE~t+r#u|+3aOi4OZ{TXR||z zi%)nbE1(>r$BEis9`mx8V&mlaZr4ouZf)w&(!E0i6-Qn-{0;AiLp7B{OWv}UmWwc* z_g`dgTzA+@zLnc~i`%EFb;Dlr7Pnk=9nZaWk0YIhqUnzz-7QyTb8X9Cdh~GoYtPOk zkH%BqTUt|f@u2t2>m$o|J$m@oi~GIo#)Vk1r8e>AX!gma!;g4lA4nYkqL*)uXE!Vy z{u^)XJBb|TeSB*oKax1`?0MK8sYL-F-|0Ps$6L6*AuKD8qUh2EZ6;hgNhwu0DhvQ@Z(W-SW zhj+Thsi=nUWxH}{(K|EOuj}&mf6}!wE7@v%mgVt-k4KJw!aG?9#QaJf-sIGV{7^hQ z70n%D@=*0?-TpM!X{^rY59U_JQ%9F3Rx@c;_5Kfgf1P2WHC3&+Q)X*e*%kSGhP9@# z>eNqZ_MB^hR;{=LGvzEytd3^~qKN?}NL^jg%4wi>w|dz};@LfZ!fR)E4oRJ#YyqD{ zIDrs*TV)#cet6b9kk7)&z@p>-?d5!bJkpKTyI=B#U-EoUd+v=mn@3~6Tk(R|>S|*} z-;1BGx?#nCai0b&q%u~l_^sQ=ia%KEco3D6vfPi{e{BsjE!r4ygDB!XvAgJg6Y-x! zBaxMee~Oq_5nNv)r@?#>pq@7%3iaf7Af}!JZBVEu^Gyo%`@mS;>AwKx%Pi`r!CQpc zi99Zx0_(PV<>`VxRW$$Hr)Z% z?O0|P64y%gmtB!-KhejqUOhI#ZSXmd%u;Y|JushlrbW-g_M$NF;}uA!{W5T!Fb~yA z;RJZIa08gX388%>xLtS+_%DT%;C^9Ni!TT_fgcy%1b#xe89XkW0-q3W0smO|1;nR? zTcJNE%<5QyGGu<*zzc;35id4+jz3D9t*~hjPJ`blybb(LVPNETVfuN$F#V^6>8D$m z>$=|q!#~CS9vIAZb7tMI3U|O}Ot=&L&%)i{XN7yfQ^LJqo_frG2K-y$J}{qAsLujl zE!+=o5FP-#-vh&DANVfO=fEAp2f_b`bRotHG;nPVB3luLyS+fj%yIJzYg_r#A)Gr#4H!;mmz+yFfSn= z6=wNR^j!h{MrFHJ&uyp;eJM8>P8w!?Rht&WtP`qF8|JZ8J@cf@W24MtpnS;isNr$L zlVsVKDZ^(BpEEpT_=@3j-%;4hPT;+RTz}?!g%DUj*w|MOuUPB;HQZkWG+CT%kXWMy z0@Rmd=Z-mSujY?FD6ErYRCy=i?W$cHQdu|Wv*Z0BoIkzAas#>_cM7Mdgq%P|kIDJN zJkySKp6xB`kH5*%TP>0b{(6N|R6=@i!(yF|BQW3UZ!ehsc&<=ZBB4}U_e)5#ZQYN; zuF0+8|I>2$Iu@0g@@3d@n<|=?hk|)XAyCdDe>{(A%l%{;V_w&E9bn|^NZ|Ve6-8e6 ztiMa}M?3nnZF}0A%SmJm?Cnnkc61Vq{gOA+9a*|N^;KVs`l@ZTo4@eV`HL>iT)6mBn=MnjB>%P9 zaB*=sL|K%gCo!ofZo{z96R5!Hh_KdmV{yQ@sZI()3+uu{T+OWxRMd~XDhV}%QV=cb5n))+Hc zfz4ZL*ZJ$}s>_uttLy5#6?N;X>a#M})mLw<2!tc>RBtL@x4z1^X;Vebx{6IuWIjeo z>qinhN?wj+t{3T)FN96xR`_bxHB{GEDY>p<*E(-eQNcQQp3AF@p{ok6RvId*8>=^o zWCbef>V1Lwb>$T`zHRH)``6WMUhk_>#)_5N;>}yuS7~KmyEK1AbzOaag|A%Eq{yje zL(1)jb$P|>ijnb^Tj~}4dN_`7acrp2Mky>%_|utq6fxq4~- z1q~rA9orIQT{ah4OFCy2)ot6fUaP#Z8O+wJQv{ZjvonRok-E@IXLWfk3nHK_&39eB zEN>ms>+$BTQYz|d*VS!A*{|Qcsj_;*x=LSN{kn~t(U`+kP`7^6WxbgG-9-gq^wy;n z^GJnWx!1HE2^kr8?1E|4mSY7T4jvQQCK#fY4bMoPAA{p=4WQ&);9ci z(V}ddZ9�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 literal 0 HcmV?d00001 diff --git a/arch/xtensa/src/esp_wifi/lib/libsoc.a b/arch/xtensa/src/esp_wifi/lib/libsoc.a new file mode 100755 index 0000000000000000000000000000000000000000..43f69f5b1b7e5dd38384ee7f0e573024ff6481ca GIT binary patch literal 295610 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%0Akt!MD`!@$jKL+C+F2{YwFpziSw%Q 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 literal 0 HcmV?d00001 diff --git a/arch/xtensa/src/esp_wifi/lib/libspi_flash.a b/arch/xtensa/src/esp_wifi/lib/libspi_flash.a new file mode 100755 index 0000000000000000000000000000000000000000..bd7d83d1ee05a66d0d8f41badf9be5e294a86c72 GIT binary patch literal 156448 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 Ne>cWbAuVR+_aCp?&y4^8 literal 0 HcmV?d00001 diff --git a/arch/xtensa/src/esp_wifi/lib/libwpa_supplicant.a b/arch/xtensa/src/esp_wifi/lib/libwpa_supplicant.a new file mode 100755 index 0000000000000000000000000000000000000000..df8000d9dd3fc7a50d3cf075487471eca44f4e59 GIT binary patch literal 1482826 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

nIwP|c{HL;Fm>uH4N+1Sd8 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
ZXI7@ugNlH0|elMruR+ITm$OUaiyyQ`se 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

XaHrc*Y_2Sm*L#MSM1v_ z`Pk-MC>J?Xc5(eW{}KL1E4aV^k@9y?>7tgqV29i(eeCb0nVHN%>G3y4!To(9 z<&T}?C_2={{q0Km+dE6^L$>%EtKj~q57~WvjM9Ss+WTiIf3I9qZtsPWzaOOhZI!fgVZ~7p$4OSFnAiJClIG&x(ZiM-Z%eC9h z!M|5ysO;ck(CRrBwWCQ)J0>Z3J6clyp4Wo@wo9H-i~ZHjN%nvE!>{{$cgi3C`&h2! zF4!SArTlG>KmIq1KmH}_{&*fO9tZ2?&u;h2DzPJef6Cve>yrHe{%DW;`(n!9cKI8P z0~4=bZ^~bj{P}T#e*wEco=u~E_HX3Oe))T|J2N|$zmzKXIoVB1*^&I`RJrR_Zin== zW2%Ce%X4b@)o=|mR0F~pg|~xe*y8%t%5GMYCH!I+mYbax2U#fSH70U@69sS)rR1pU z*CGehkLNB}#{Tp=0e;;d{}*|m(k|E`?E<(+LNZhjR~%K0KOH(t{<>2B*6ZZvE-iO) zf1N3R$K}t*RjZ7#qkearKVNSriT(2N!+8&E@`6SC-mwamwETo#gKDJZ497T*}|!TaxEUSs&`6lD}Ez&)YF)sNR80 z)sN)usdA6$WZ1tLrNzM?@v>C8PrX~uTB%`_t0tAo-Iywu7iRj~e)p!zJtDiGrs_wz zUrLpGbdjzrv@fRIg;BZRPL+E=2ct`5=i=kmE_a1i_hz@LB44Il9ZlVl-(XrD0aJE*~Rr+|2ySz-z7V*-@cT;JIAPw z+BRL>-@)T(@)uH{d3%zN9euvZ<3VpW1X;%hW<)a#K@N^n3Z`QwoLV z$xW9v7m$vc56zr2E1Pvs^x=C-{YW{F&eV@8F(nk*sOu^AsC|X1&*-cA|7?o7a*mEL zM&~FzLgN2O=z+^yGxcLeY+F)4ruN7Z-Dt>H%u+`Uf71yq4a;gDT`Pk}*G{OpJCk{F zNM>S9^OME=S@}2BHFv5+wPNB&g}bb_j3NZ_Kkpn9H>2o-G!tX zBOk76tl8FFKR)~XzC`m?J_rYi0M6k;!`fLZ<8PeUA_I@3nuR=84Bg?R&h| z(-Uj*BlBl`^o%uIKD=>bPjA;JJ34wgRun!nvSQ2IGb>t`9J>5xRr!feSJ(Z~m(NH_ zxK3XrKWkraRg%g#ZknB$H#@s^>9&>&ZWMGZ=$SXWV#(~v`~}4aZ3RppF>iKe`UPLM zJh#@Y`0lntb@_ZQ@xigP&Uo8T-6~(TMaNJb@doA3*fDeHj+w)D%pAUB<~ciN*6x@& zV#mypJ7%7H^2bNcK6&@1Z;jgVWbuK?Q%B!BtSftb@zHlaU2&lG%Yzf|+rC})sCBFX zf6)!~OKbBL^)s6qTX%h_u&+?6=+hOCS+1~-t0q>_iCRBv*7Q7<^*-D7aG8(H&R10H z9OKoShRAVMzT(jE%)9?-)1ay)hyHWi0oR?Gx#t^a*m9jb?EKoc^M3SX-NxkyyR!M} zuBv>?y|rBp`H@{yo*k5ZdT{w;_Y-SE`C7kY&P-af=f_FBdrWGD%P=1E6Kh7^H)zxN z5hEK1<%it6boY4c`{w#l=l=ML!Ar;Q?j4$VdZ?|ga_YQo-+sDgU;W74^&`x`gFZCW zTt8xJTXX%$sq^xc%}Yi!GqhBe`s9g2uU-4~tv8I^nelPA?Y{h=n`>`ws2-*3mv2p4 za_HGZx@fsEw|v{IO@lJy4*&9JgYy&fb#;H_AGp7@=EyDd%%NN+e?d}q{_-WWGx=Fv zwfS-CmFli3`P#OnBUUVJ+r9PbPoEL>&Y(A)n5m1}c?wr4oNjyUvh8uX{>!SpO+iQ1 zZf%LTEwkU zg4ygPhKHT}$cDjvi@E9i>WgPg$d!sMK74Tbw=b*9?|ZV&eee2qvOdDzviEz1$MvdE zZ#L0w(SbHU>fWzysn#YMnT4Hd$!hPEK9zlbcDb?-Jz1{o*05@KR<}I4{L<`8cjVgg z=j4a198z5R;f`X@+?EetQFUhX*xGwOc~<_M=4G{N)V9ks5|`EH>hrbv%EFWnPpk~v zNjBTOxHh%3n;z}#uB_Sj_$c3swdWg^ulZcfnw=lszP+dEzE5iZxAES>mqu00T9WzF zj*99f8M#{XCEJI6peA4QP}ow{?1p=%{H!`Z@rm8D_x0KVM7zb$j>un|bVdG7jo^8M zvSE*yAFCbWoG;FsUAb@fEbm+G17F@X@`akGD-SI88tt0BrI`6yjdov=@}~bdOO~%b z@p!Rp_{8q2Z+~mw<3-=-s&(P=quo_M{ih^r>A<&SckS)V>T+MMPHJ`2?3zux8}9pv z`mR0G+@5W2uV`);S2ec}YHqJ?ZXdj9bnT|Yb(gfdxvcr&BE574Ssg?$fv8zb<2;`;;scxJYHAU?R$K}?#JtrO4N_8ed3AY zzR@FgKRzMRELl=pzk9~`8=GflnrCJYRb{-7bOg}&tz!I!J#n%h-lu)e7n7VTYj)lD zbj@Rxr3OEg^|orSqdiBmcWr0y+BIdx(oMU!-t+14Tc2FsGPaau@3bZ3N9_8^&j!CR z=;^9x-%?YpQ^>~bwzm4+U%PPRnDlOIV$H6a(*EkI=Gok|dn4xrH?Df`s?~QDRt=7sFjgUY*F?Lnp;$iDh+j!JTKXk6y$Q+Bx? zl|CP%FSVa+uAjJT%);;ZS=z*!ZJ(X`A8MeTyN1)vjGq;9wxB$Z>ulnWcK4e1D{JcOcYxs})jW^6()Y^8#JLcRtf99e&*UXow{NHWAf=RB*%63D|PB%z`c)G*VT@0={q7l^>Z8Q=p6f}uCAxP&caMpBfm*MaV75U zr>-zJZ*TnYMrOwsEGPY~~467I8Aj89?&8`ynn;|_uzrk?nmt$_6BQzt;d zC-IvUu(uc0f;~(=^g1ah+2}@I5SGDS2kth}ALu(2ybhgWq`x}w0vzqK7vX{p>^`T9 z5%R+BvnWRT^GQGA^Y!}kOJ+mtb>1UBSAq8ag#vd!@c)DY_Z`p=ld;BbbH(oGo#Md? z*e_5RXZ%6MNPl&^PCgZ9(ql(_ zh648K{&D?8Ekp1Fdwq1HE6iF>-uVg$HZc8&|IG?j3fOE_K>Di>+XME*G%XTRG4VIK4+MY`f$8sIoz&*#C{S@`nNLJm$j9p^N&PV+2_9n91Sik z8;ef;M)&yC@(HQ*q*R*yMp-IL|Cvd2m8J6|PhVa(7FG87F9m7#Z)K?rGfl^7_Elx6 z4F4UE)5UT^R9PCciMq0MeDUaz86T&GOHrmVYso zek7ItlT`X!sr2_#>3>S4D=W(i%KvIK#7J}0aUp#{YWbK{x-pf$B$b|)O8b$LGVs4L zwfqyQ^b@J{@l<*=yD1a=U7kwcluCD}(mZqLLjEnO^k-7(-Kq3LmS*G)*K9t_QQ(3< zo?UYx{mWE(h}H*tYy#g*e@iNz{-*lO)NN$%nnmUP_--PI)hVgt|E_==XE!_Br*{>q4#8E?(8SdS%A{S*vfN>kHD$ z^pe54HLF*xTNZx_J}SQS$?8(RJC$$w`xb>y#FsMb6`NH{_2KjIX>}!*u2`GVSKdX< zdcP}O_xK~)jIo}j+ittF+dDJkhO-F@#`s!rma zK`N8 z3H`tQOXxbQwNpj*McIk^k#MYcCY{y33kf#H!N!=YT%Ws$eYekD#NB~xlYS(l6kN|) zx$9Zh$NwNSRtGz&2>#6v%X|)`P@iTriTE5yK|dwYg?ieprQpX-WkWrULp_Z{J+Dae zhI+OnTu|iYHo$hu+ZgHTN}pqi>Sm|u$D~i)-kK;w-S{!dPER1z-#FMzPV}Mvrbpv_ zeu_O6kpz1?^$zWg^S&*y33;u5LRr=iA+P=;?DB@b-)`d}l*OgDB=oIu=v(7DE%W*p z;J52X68g3nFquoNHDQ|MHlc6LhSi)k8&;Lu&{WrBnr+jMWQKx|!*&>Fk~s>lp9`CQ zK5TVc02lQmS*YOtN%vX5R7w*1^QweHe^R()sDjVS75XP0d&Z%EW(M<20edbrC82+8 zoi-|+hhZ2Q9!`{2|31fNxjKKQ&o;o!46;o#FQ zFhaj^>q$~j$a4Ea68a5il17Cr&Lk5Qe7%Q$YtA*K*5S0_QFbn9O-8J^opoV^By!d*p{co2Gyt{u?m|mZ6e?bG9FtZ#I;Bi`mdd zICr^zB)2Qz=XVrymk~d#U)XIvW_s2y?E0PPm3NQg&%?^AZVa5GvXX}t(6bKVT#J4r zk0_A$3B~(i*%XYupI<~Tn`4S!gJsiToU?O-3hPh)TT>0orcpMq`ze?W{lGl}Y*^2* zx24(i3|%-kO&}>K)N22>K{1=Fb8E!xvR%)5P5e#1Dla~1js z8`?;KsSjNS&rnQ&->H~g8@xbq4=kVRuE04!62>r&jdRlz4r5sQDkZ}hHoZ2#Os(`} zhrJKqVtU38?0#-Uubm(JqEObG1jfE^31!LVcIg>I*u(S%-vFTwu=@<#xcMB9jhHsl z7uZub*!Qbc9UHcTS+H!VC!D)dKa#L-k)HJs_AS=lg3^5dcC+G8mYB_){&oGC#u_%s z@q)@4=iZj^C`H&eC?-G55M?ui89QNLt-Q1s_U-gqvzf2>CRjGK5%%$U7kc@jo*#r| zqhvDIvf7S>V;L()62_;PvO>RWB``)-EAYKm_$~SubzTs|5L?BBK~_= zd9nY#G3)l{#`H&++gN$|?^GBYve(c`_N9{q5-kq?Sxuo2Wm7QDy`+ z>05&L+lOHJp)RnO^^wTt<7UIKgx%*(v-umvyJ7h$8v7j5d(f-g!-^ky7!(=)2%TvQ5E0 zXLi{3rDuDDeZTP`vA1P2Tu@L9`+nmOO+QL8?D|L0s}A2%{7tx!Y@4vpt$q-_Y>q1a zYq*eXo3MYQ{%_IC=CJDjJ>y>~{xMugwo%yk!(q%wPd|k*W7k$;JV?*>7{&t~COMz= zQb@Kz*v}srA71Vfvza1$*ymgibDS%0i}bM1n;zykm!54c%yG_+LGt_Nr)ccoZ~v<4 zXGjnGw<5o7da4Thv643Mjpa)fuQF!a{anOhjE$B;62=%O5t4Hh$a{%m_La4=VZ6cq z4eD{GAEFrc<0kbZFZ-@*B7O%fKY7KlAD3@5n+=L@iFi3Id$|h#Gsz_8qWn7>BTr!vgx@IwoY3_j%#j(uKAd-xk?Ww%dOr;=hXc zClUWET(2KV*bj*5Px=l$F~R#pMFu^61?Mo9P;bg@P#n%rtZrdli`%4UePh$EcpfbO z^daoufe-yGo5j+F+JFJM?VSsEmv-+f+N`ZP-gBrOWrHw6rB$+?0R+UVkSrXRh|p`QFmF!efzx>=p4qvzl$3H7l$ z(;Z&t4%q744YSfD>lLyE{YW+|c%8SyR_9%?)p-wWb>0tW^&>f`;Cv+FqY)pA_(a67 zMLb0QvK3NDxL4%NvB`Nt#9aHken!Nn%->&?_*{XFaZkh>Bi5oNxBH}QAzu6Dbn98yPkZ^C$xe#%fzu#=a{Qbr=BAYOOzv&l7`V|rP zM7%NLFn_=04fFS(mDJ}!Y>dPF{lcSRiL@7H+|vLC(i!HADU9Omygn`4pwM8wQf<9@>Y{bnEL?>8=Jf95t}{(jSk z`TLE-{QbsZ{(j>yf4^~H^d6>7J=wpz)ob3jsPw+(>stCtoqEV(O?Q8jFh^zE z`=77puQVHLdZOx*o6<8gs-Ipa?Qe?XlI^-XmJTp+aLL5p99`7Iq`{|5d|fh23M)N- z^LnP{@%2o~6O9ho%xGfRconT#rblQ>wJJT>a=J;6OF3SD;^UH8X~dN$Q7tWt$JzjM zq4sO54jIr}7?E$xSv+`4Q|6Wn>~G}uW7hAmeH}Yno2Odz8L+1=9$>VdYFHks{d7_^ zNKe;Ek?DYS?td_!TBq_z?x#*RhEG?YzC-=gGHjfe3+R7@4^T}1#=pIZcMICj>#~4T zf*@1$Yo}u&ty8HWT=K!ikP?qht`WKIMShl%ug%i#uc&lE!NvV?%P#iUD1RN&;ZLWl zC4byo!N2?K5Zft)D6u16W?Up8*(!fcit(pYpOU{%h+}_il-A*_BwoL5(!}*UAb(sM zjY}W8xIgZ7#r~d=KdyE0$K`?h`-wRAw^wP(adCe?lp^-mU0+@w zoZh=X?#0Ib4rp0_{m1>g*xz>f^Zq+C@;5Q%@35BDD!6$48dLrb%HMPu(Oyn5y?)Gp ztH09veO}yO{pP3qy%yDPSmbX*%HK;`)}i3y^}8$OZ^D>N_@4#!;}ps3_XjC|bCjOr z&diSF=TrXXG$j9b!5^nk?(eTs{uUkg=<5n1U_zU+K6uUp}UBp7&k@r|T*q0y!*>RtO?f-OktIS_quHDiL z{=FStvV)63tEpPl4&RRIrSo=tD&=p2(z7iOk^9>&eeCbB{IQRrUmDDge))>|YZfEx zmEM$K_{9f(^McuVJ6=<|Gi68esPu8U#S7I>azMGlQagTS{=D1{b!0mZOuXFj(o?>d z%e{@F8!5&P87qBUZhK?7z2mi=CLHYCbF(LAIN6KH7GV%XN z7knUVQvOcJANStqmq`jHhvAo z3ISZS1rKT^91-J>`|T{tE7S|{=i`d&`L8MMf*s4>VRl*^glp*dy&&w6*#fvoLb7I} z%2C@Wcd7!*D0iJ8ZpVosnaqnQOt3>%3E(0L$p)<~?rq}ltqLr|-|q=xf6vq;&zWga z5bTgo3*aIN$w@VQf->UI&z11^4fE&y(xZcYD;Z4iL3uwgJMS01{l)g{f*tZb0bC>@ zY0yfovUU`eW*O!FMnHD=cTh?lLP~-i!Z+aIA_+;OR%*Lq+R>)KGW?yZ@rFNd$8jm` zHmS6U9m{8#otOKH?C|H}<+jQ$E_aQ}-7h1`ovGmE-e&&Twvg#(CjWy?Qc0aCmwR>^ zN+nq$yOvTau_LKTsX{w^(Pw4H{@Ddz$OmK>*RSDSJd#%orbd1#e>FUhurJ10B-B1PkUYkQn9??n3JQkXGxtwdob`3=x z<5U+Hx6>8b8s?jHIo-UIQ?9t&Oiw@WKEcR}!K4%;i7KtX({; ze(}(?qwDHNzbQXtQ)_9yq6_Z6cd;hB`|8cV^U&j6ch4I=?B>6jH+twjpSnO(Bejm0 z*E;gNPvl43{KI*VkGS~@`LQ>@oFAlF>gu&bim>FoFWmg{p@07k53yXZd`W9&?vjHS zy!@lbCp`Q3sQkjms(g;1PmiyxYq{+}ZQZP=t1tNKEnm7@hnOLm+i&dpYIRj6R%wFG zip+(VeI-n^`M+mYA@&6bv9B}IK7+tJ#q3Xr5yl$KHB-GprvmxVFH@MVfc^^#2zr?D zjDDX2f*vNu|2Gv7(lEOs?EhQ=LH~MESvpcBR+W8P!!YqJ#Fs}qJEWFB{hDy~bZqd_OFE>I>&|EJePg zfS$U;uBYDkVVogZ*|<1|_R0nsrI0mlh`1?Y#;e=3M?62`j)=P>=D6>9X`}P@h<8Q& zhW~fcXB@oVo$IUK15yq>fS>K4?2PlSACR5NRM_;oYkRLnN zk51M4_?w}0EVjzRz6ACycObhq*)WDqXE#SSaXawGw(3ItkgFBoq5?8kj*lp&9rOXq zXvZQ2{Lx0FLWy{rW*K3HLVQf+URi&~)c2dcq97fzqg^ieLhewA>&JWY)Q9@9SMvJZ zBlbMP@EwUgfQc{Lq;%}BQ3>quhhO)HeYDAidn_+X$NfDomvNCkw>+Ut6Qy_YaycgW zI%C;0DrmbKDR#RxE8n|r@uH=R^?#diig~(oh{;o0CMPEmr$2}2ouq0EWFky zpiJf%-a0(D_1@uI+n%mEFz?HiFAgcq{Tt?BZMAt9?+zzLkB6t)6Hb16rxo@zC%Cm@ z@9{myn;t&+cjssFH5WXbXdgc%%hNS4EzvlHhZ3<^vUt75VDwVVO_kun)~gF2PxJEisuImC z?O0yc?bVl0{M%5?Ydh$~f=~Wx(6v7~`Zt=SvuaN^G15VO+Ko5=gy^#7<-=QEp89IO z`?0~h4;7Q;3w}6n`8h2W`9WLWl*xDRd$Q=Qx@mm%`tM%-neoM^3aZ7ER*UC9TbIA~ z8`u6plKIFteeTtjm0Kocj@;N@c};~nL(!l%%{c$u(eFO-WbJ_;davi}n!Z*j&2oAu zo5|c-*;0Aa4JTWM=kLGb!AS=y_WoW=ee;;MD}HZyOK#g$?Uh?JPOq!HCihsS+_vPV zR&4v-eBRw{t+;YXesHzs{rT~NpIkk5NYlDP^O(#{zx?%)f4;Z6tHRB;sGOF;Q>(iM zw+z4F(y7C%wJ*z8<2heFv08JEF3x@feH?r2 z^|Eo@SaC>u-fiF2YN_1)gsqn6Z{PNmX5g>7cDMEP?b|-3G5W4iRT^f)e??ZxK2Y)e z*A8)9+H~dASj`r-@<8sUYkxgU?aWQgg}GI?&8x3(3oTFPTHV&HtEnYz zZ#psWhU=#lZdkThvy2q#n_KhWrM-5;wFK!p^&(**4a`PbPP)(loXuGwQOo zzI9jSv%N!`o-BM-51{wjC=CVNbIvf$wOjevkkZ`ByO(Hs@wVsB+4jl{gS0VK`LIj$ zFWta&(4QO9@ySna@8~JEe7LEpM?UTud6p*Z9TeFH2?pW2ePIHQI zJRI9u7~9mme%e4k1=%p8@7T_o%;lQHw_<8*vci(z$4}X@t*n`SgS6T}&2aj6^TV(H zT19Dii=*7_%}Y#FRMkjG{&m{GXn;EyVczo=~8RN1zp@~YjHGxk-^{L{$~ zjecO*y_${}PlJ7(_x}E%O}*K>zFD!UHVWZ~-v-TL8r z`9AvNAC0N)c;Vpb{H#d)RLPCD*QKw9q>rQI*v^zZtMBMpM7);y^KY%F``yy4;1g^1 zj=y>K)LX6@udDU*@2#1vTe#VWhTS_FnEah@e%W?c8rZ+xyFyxDIzSZ&*bpQA*-Voj8{%;a^$Hyd=-?#^NPl@7rN@pK!3HiUkhfid z?Gc`*fMDa|_2gU^Kg0+&Ffn=QKdyt}@d}*h!j~%0H`vi<{9g(^_hu3Fu-o5+Qi9&a z>k#*YhIjDuUd8UeTa2#?g+En5@BF@9_Bm{d*0I;W_+<2Gi>;O z#2C}RBhvHyyZhw-`3Uwf;{=~wkd&5QA?%3}Y+x=QC~LX`%i*^vApQA4 zhaEB1Bc?CCAI=wh|1ic_j!*8hc-wXBzf{)i)tNC*Ssvqy@yvZFe2!M|I*`VexIv-X zm^vWjh0$Zzq=2Az@xJBO5H`f_pK`sQX&=&GUazai)Q7xCfA;hjWf2pwXB+gfJx4sj z^y?L$XZ#7p2tHx2+ow=U`YWp_J!KIOSD>tTe*#Z4{WitE9(ReoA3i5${gL-M1-CgS zMkp8d@&8M)=Y2)&^*kv?`m1M)^wiU1%A#IKY@cZQ{#KUu(uuw@Q|M#xU!SM7F_qs( zl>2Axl%+CkQE}QwTB7@}&&x`0m*v!XS-ocxo64{y$M*a;wk)T=ugq3jmdZYNez?`Z z)?Sv%u$9E=Gs_84W$DP8s4K&sqHIzb?!?Dww(hc2hNp+(G+RJfD#Km7IL#SASt`TR zIC1*z<%Fm*Q%t2>Q|YV1_;n@Yz19TF_m7CO5c@A zv#lZ=mxt@@3m2}$-L9j?8}C0Z^N>ypJQ@8~WqzGKz8V8Lvi;c_5MmI-CbDt%%@6LXdT!qdv-1}$B?O!H&f%FkZtqd>;rJXt@Ixe8wA z`4KOG<2FV+M)woiYc`=jZC!+QXD5qc-9?8*uV=_>byiWO_df&MVJX-c2miJ+4*u;> z8vGlFvB3jUlFW8x>QJ6m4`seJ4;z^#c5rp^=KwnX0) z>CyQ6w4q(Y5}QyrR;(n{ZAQX_74hym0_SXd;hM0P%1U6K!A58X?~^0L6=2GtDz2Xy z=~->)DIfMZ4$d$=b%Ar%54gsjK7(`CC;T4{Jyn8pHlDezMo(YD{+>TwT&n^*6kle{ z>SGLJPk+NX+m_o+Ur-GDyiV7fp7j9xym+^mo@&EBk3i@jI!qG!M@;{WRp9;9%N2({ zk$#AApFWYk-#(GP-#(E(-6xC(=JKOY;GFF%TF|Qww2vX{9M+xmv?Z)N%^pM#jHN+2cxft&()6v_WA6nliQF7o}xI^ zS@x=GU~l6)&4xZ?So@rPYDQ_!zDtbh{}r$<06(g@+w|lmO`p-2R{J}ma%L22Zzn8%B!#IN7<{r~iKJ0U~e981Jiea}uXnMA3*vHQy^s4g& z)#p3L|E~D&V3k`mcKhei%O0C!uxw@+yUkA{o1dFayJFbq93($}xF>an0vzTMg5`4# z%f&ulPrd2sC)md`FqQKTGkOVcAp}d%5FGFSAqk`LfST&*tItGhS}?lmmNN+LeU43mIc!pQazG6!upf zWQ={ihq}q8S$gc4_mH;M!?LHIu-iAHH~Y{hVz!~M|1l2Rmso#cyRNNCe1^7**>*0( zk8!B8nEnp?STSXe#D<-K1oruKup=*hLVqzwA$=Q;L1OfQ1u_fEn7a_UTfyf>{1~i^ zpH!@25jgaL*#zHWpMNdvXJk+NE;bv=f_+}gus@N_9Ol5}mhvNkuFA4oAW}RN7;PWAdI;djDrCVou z+Vub|{i}-q%=Fa%hmrn7#M(T9PwEN#IY8K-t6b`K%Klt>R`Ge*Qz=R4XXy*ZzCUkL znmV)o;asbJB-0eAXHjwJXYniI_oJ6RV-|M%&{wkACfyEf#Gg~V2bTQ=W1k1`3DY+z zhTYF!p;zAL6o1e7m}2@7{XE45mlW%@bz>jub!&$i6q5N0UbhZd`z54XA#3}G^{~c2 zvRT3FwjH+q-vwv&BiW$?*XzZNm?bhr)2MCSs`0FZF} zc5aDyM#LQR+-70KD`0kZA@Q zBj!C7*Ykd#b6v!z%wc4Hijhs2!^rgE{X%2j4RoJtBIZ3G*M~Wb%>MpJ-y3n5!^mt7 zMEa*9ekS7QBMx&IS>9J7JqI4ILzu(JY{DEy#$gU4laquwjEut^M#e+6J!Or5YjYUs8~_P(7#W8- zjD{xq`>BI*Z^U5^Bh!aDjEut^M#fAfffpxp zbe!@gSC}m)%;@p@Yc-g}&EsDjeLCqBi+;;5T(l*PIydGpF;jv3EF(S3(%JZjd($>06r*xw4J z3kojo@8eR${`SgWyL9;Dw1s7~_v;F=zpYB!sfj4DBYwoVNJ8?8{BezeKTav!-`|R3 zf7_K_sNmxDdq#@5etBIx9gz-y9QxhgFU7IHmu#7$AnxzyO2z(;${+2+AJ@R{?>sq+ z{hiPbxfD@yBH=<E5AsVRROldyGmG=5^4LUDz z6@J~{qLjZ~T3N?rfxiX?_qR!Qas9adyeW7}e%#*&QvNpT9?Bk>;BTCQ`}_TrzekjQ zgaS<5-)B?)8g-!Hnh$@C3hwWlDSsVWFx8!z9m%h!{B6}rYmgp);}zUrdj6SRTJSb4 zcfk%x&p)$Q{&q=^zX=NN?>|%ZdtM9rtKX}s`nBs`&35xQDe^Z`eGspYQG=50O(sFS ze#2x37ZY{nsQh(^sUO>?*YE8qf6N2Z-*!GN<*%hs-aeWme@jyS7RVplzl+!J)|9`w zh4Oxq{g&5nllh|zgn4VPOfdXnM}Pcrs@w-<_oWjjA~1PE+u5!~FuKz1&`%6r_)Xw0EL1 z5c_t%Uv~I$@p2mlaM2bVtuG%x=tq{Ze!{&5#f%N)=kmvP>q1$C>y&}>6c_%V)8Yxm z*dU8!=S-TpKUM%HzU&s+QHP@Gndi*6qgLryM*X@|{`SjXhc{l!-QR5~e~0A{JNo%5 z1^0)2g@Oy;`rsbREGaHjz>e*Jb11F4l62}I{)87Mtt00Ov0bBfDtF+-#O-(_sw;Ud zw1AxM-O#C*HBSkKh10(q+Rgo4RU$d=H|n{BhERI;7jr{gwfF3Bj*(T2O{L;FiqB9S zkL_UmIzRNwgaMXc-kSMnMcwGrn@vtr0jbxVBzMs5j zEv#x&u7m886cEa}%H6xR}hf_#A=H zky=u>sjjoFJv&R|X2UNIRp>{LI&S!d#$=dWLw)Y~7-|)vdVa zPb&^>$V?xysV$?|&)O>Uqc*iwEdR)PniQn1D*tcu+6K-0%HDZx)%lt8+6Gs1&bWN6 zUZ6}Z9IJ(gtbfzXZe*D{nEqXwIVI}|EuQ!H74rryIP&#zBhSch%`a_k%g$Pu$!p0F z%+FZ9dE~sdn*1wmZMn9u>}_ky=V!FFojHs0)bCYoeU~+`jPhzL4r%y=#cD?`v?H&D z`P#O&v(TTdzHe(AisNCy@o*NMGfP8AeJ_JPi{$s5Fou3|?kUUWv#dHZ?$wGd6GM@G za&~HI+uv8TRo%R+A;h;lU)AnN5fF zmZjqSFG+u8Z*zNvI<>v>+O37H2b&N7n*OcIY&fY>H=I1AF>;czu;JvyA-pX4uDPw# z3i>HrGqa#q{${q$eaD=M%x5hL%aV5k`z#9jtLI;v&Jgt1wO&>C?kL7$ezvmLVKXK0kL-k&1rN0_Ev1V3f zrmrH{>pkJh$Er5f-?Y5(f{U`hsGs$t`kBwx&v>H#s$_jktT_}8Z>Ol=bRvuyjkm&# z#XXCC%<1LY0mtKwtJdnZ)Z12dy?eH6oT9L1)9wYxd z24yz&zHrY2!!|wnn~nEueAmv3Ed@<{mK}L`@Uw%m7k~7=kKFT(b6%)?dT=zHv}-*# zbjEo%H(>O_KTLUgP_(>SH#>q;y_o)3^_K^Eqd$FL#UGwOta?c1;ureZtGJ7|-gn~# zAGuBMx&PyDW@!!3@BiE0@8li`qSK-v9v3Xly2=`3>x^B0T!{3-(z}tIM{(XnjF2DZ zU*_l+Dc}!%hl1G3Vx_eZFAqxd-F+=n;eK>t$(1bg^e1@zp1M9{--&wW4lvr*u6{s>A5_OR=Db`L=h`}q7=qz?xA@wRZ^ zinb6VH&QOYH0JA~9o~yy^XsRHbr#oAns~bqb6t@-mL72YjOf zf(`8Ybz+)^zDI#aUa;4ZKL~o5dwuA86^0w{Q;c8(S6J9@G4|h3K(Ki|sSHoml`Sg! z+&!UhD77sA@85r;*UIwSf4`5dt}K<|u6>+l&6VZU_wRgkB{r3rLRfE}gRvI(F=_UZ z2;*Meln-k7mrY-<^fSh1$j?g=Uxa@x z|DfW~SH>NY{ximV74M4p40REc+JO!*0)c5${G(&q`yCsxl3F_#8N=9|@deWl0(o(5r~RIor>V zL9dSISQ`9@Ie!afF-VO4U6N*{Yo*5z?C%Voi(UilONzt3k)5Yxo&x&)ikHFClXs2j zdli4oc%R}=!Lnhje#P|UrAg?i5}ae;N$M5w&$;5o#*-Cu&fw+J@6K;C<{WZ1ET4>d z*!%fi=;gCV@$Il|YK`3{9FJtfx#dQ)p{rs4mh)EhvZ4OJYuu~&v#@;91lWB(gkJWv zd#|xIv-G^E7H9lfQ0nc^VN!P1)>i?Re;0q&l*OJm*wc}c1_jT{nD)HWVU0heUBP*N z#2pcLN4!4b%@J>pcvr-GBBsB*tb-9BiTG&5$09xv@oNzeQ9Ilx$5Q7)#O&K$AD%x~ z8sV7e`neG=jCcjCeKW!~>&(8)nSHTyc>dh%AB^<;58Q1YjrefH&qe%V#4kl0on@xEB z-1w=;=9!3}k2pMkZuYN4dUllF-h9O2`E#>xi1gw4bJK_C&#RJk8lFEl4$q$(caYb( zJL2&Cx#>4Y`tba@>BIBq#^L#M_+PZ?!}I6H$0D2X{JH7>Z}#3lKC0s0 z|38~eLSR=7F;Z02B}9xEG=zvj(Jl}$BGwQQLDBpm2}uo*hM;I^8&--z(-tGGXlZW} zX^To*OsS&cxBL=Oq2+REOD%Y*O>eEm`}Hclr7gAJ*K20pyYHMV=%@E{|NFilnKRFM zpZC0H&di)Sb2ex9nCH(OoBt={+CkxUM!xS5QEZ++cQ)qvbI0a?!n`;`%=71t&GYAu z>*>dFi{e%?CoPD1{@k&7{@k&7{@k&7{@k&7{@n2%<>#Q{ql(S*=g!_df9}{kf9}{k zf9}{kf9^OB$13$KQv8XZujcJy;_lDfCH8%;H*sePv)bl{dAAmLZeuTTPN8YwNujZLp-(KGJ%JZq*Wp9byktBJ@w4aUNx4x(L?@P2}pE8pj;VFtv zX8OPPazc#l2m+>G^VuOHv)04VjEgYWRphAKv*)bD=b6mUeY{RjM9}_>SSMEp^w z{T+lqUVC#8FfGLWRe`m?7Np(K2U$DDa~(&SfK10CV<=+!<8&bPYXxh6%aBgy@AEEC z6fvbn`Qv@I`1=-E`&)r@1VMy$l(h)tC<0{}{8b`m{dmtH{(b`1{?;R{h5IP4AduNs zlvCNgfqgu_kF)zZZ2aZQ{|2zj)Q|Cg$5AFAhjAPcWaM$2i6F=EAz1tKQt(+Tf(Y#> z|A|13B2Z2aw)fBU2iI|bVK}2duH7koF6aS^W=kJtzq4~wy0;NKMpj@sOc^u~< zNV$8RzXE20^x&izY0+%4+m!or0M8eZLr8E=5TPCA_s*Y9q3-?D!c1>kxJO z-bZ7w{a8QVM@s#U`}`HdUz8Jp6Y(*F1gf^H$@=jCC*c`S|Cp)^Kt_ zWs4B8wSVvZhoOIFQ;GKF@9Ue%295C5wvYG1wk<{YB)0Ts{1ZM#BG}I{Hv1HI|3IIJ zu-+v|w2I!`o8qkd7B`Sp{d8J^q6h|d>|>=+*2a7pnQBXces z8H1$~N$Gg-F9nZj+GnkDSl4Rj z^S_(VIGQsUrH;zWOXYx;{l-LIao29>1~Tk8g+c9k`e z>dE2C`ia$(&&bJ%l`j9|=1rT9e;@C*NVet6C-_w8Nd3fL6p5;$dXGM5eI23=E2FDWCFW&ig z6kIcQ%z`PAyo+ltjakOm&uW%^kY4N^ z7@qAL1H-cm3XYFoeqd*XZT0>8kNcYap+SXc_7SP!JT!Z(^P}P!vB_TBjKZ#rf-57) zT(EXx2cLLNF=l5J&%h(hlY_CzsVlLrDxT4i8jPi;b{GxzwcoM1d#4+KZOdCrCr+At z=cM7;lP2GVkvO1xXN9e8et1jQub;GBxbvp*gNrA+hClQOUUoD59DmcRmuQq#H8kJb zu(&pIH=bX_*PW{tF2<`f&_;Z3N>0w?x>)Ljf#}WY1Ako-8#QG(R=I7N;gs~vg^{;PtmB0J$fv)LqzPTO$`F+UN#`N*X*ahLXOY$;C=1jy>h-2`7 z!?#n?bG(rs+=Yj}N25OqcfKFa3TG6=9&IgX37@!rLm-@j_hm%JMrO^+2v=X47B0Lr z9WxKt*o8ZfCTxfGvHdX3*yb2p-t!dh{4ik~-lP1Ud?1_xx3`Q>$MeyJJO7q2`|iwm z;fEhJMrV&t$NYs6foG3D!2E?{fNwsaj`^s49@=PRRv;W49W?W*d8Z1V?yPON2hVo8 z=Y*T2k?X7QE|U7HyK6a@O_&}Ib$3Ue?zU}pBz0d9BT*h}owVzt{Iu(@oK_z6%F42< z52Tb=Kim`aHua>&&zJ7%Rps50+spT*UiPEzS2C@eN!4rKOMCd|7$B+LIVDy%dQkfl zQ+3VzJu^M2whHe_xuUFjQFU!Oetx#k`GW_i$6isyQ^@5@JlmQ)Ut)heACC9h0XuSL zx9>fWb2|_7YFoATpC3uL50*N`j+{BPxkKChHa;7>$#>ZKGNj%0Czdm{ZcqM}M>qbu z_{m|hOCHUSg#xW>2ggDlE(ed`t7WT?KRA9^c#yP*^e8T9EA>|nJo^Z_t9GPjQSIUg zCz%CRE%WLl_cpZDyN7!H2Oh~=xCpyG&Fj}c>jPQ6vPFv*H&i#)qUd`U&Tp=&sf|>% zv{cQzJ5qyRHlEjlK{YzU_Pw`iG2Yix1=E@cMwQW_V5-qyobGTC`H|`+E#?5A^H-VY zcr0i3-aWCLIeVAJN7aVZV^5sOJyyY8#n`oOOIy*Zz&qJT2AT0G4ZrNfRI`LycXbbX z^^be9V>!1!xNeMX;A0OR${jK~wI^rJ);GFyra;;HbY}S6Sf|&y>e26Kyi>Fz=MHPR z?sa-Uk^4^eAv^w+f8KWSf$X7|oXFkyHB<%H^_UL^TxK2~PYqv+(mOgoYMar4FE(_0tz$FG#ztaY8LeX@Z8Q2_0K$n2z|>&U z`Tq_#ulJq)OCM?9wPSd;x(4{>{jQIj_f5N$-!hqF4&xviZNa;H0;>k&7)IuuQ@Hcm z@K^dwM{Ln+1MMx{U8|q&#$4iccO81VJKX-VJ0p1>nz@f7Z_E{i=6X_NpNBVk|C~6# zdC`(4W0jZ`S(h$McgKBm;l4oPWxd5S+RuKq_UjEA-vSG-$f3*l2N%k60hu2%V$j+wDytJE3#KzS@)?MhYi>_ zpl9dk%r3X&M`}mW{ayA<$sch2^C?p=@|s`4_ZfP2R>+I8-b+0)U`LmiABtz&IBn{u zPe;p}j5Q_-V|uSh&~ z&eXGTfxC1$E{@AS9KU=w{(sKoZhTH-(gRE~J>8_tR0>;seT%l%G;cWu#JJ_`%Tp{+ z&l~jdXU~L;)-Pv9+aj&4$IGAe%Gx5cXS8AgH6;+6l46#(;n`e3O$o-Pq~iRUJ)n{r66>P_UFB~cKx^*EmHw91sahi0^W*ri zaL>-0;%(fVGiu0Vsm(iY8phkO0k)9$2Jm8r3-68^tH4{{2FTm54nK`=LsgFof2z6q z(&^!z9W~uMa;+7=qlG2;#y_9Zoio(#+ONjV+SUPgj18~AwLaM0`F>}2t2@?n%B!!l z%9FCX@L%W5Ia#}KUh{oTyryvVXU)PP@UF61 zk?NflUr0NWhM|qKF8&>#7;ZD_2i9ee8qey#X3U|KAzDf_s~%0)Zb>- ze%+mJIT6cw5O>$@yTTWQCnU}yckRJ78Q<$M-wYbJo$VHOYvbx*pmi47FQu$5(!8^R z&H3fQ<-xmJZ;hb7{O(S?A$M%gOuQIx_9N|6Uj2`h-B)<#_7(f^-pKgX`x_4p%Ev%G zqq}o&d_2sWHn17<)4hXnZZs{8#IRz`3)QuS>YiW5nH&r9R~Lte?Wn#+zreBiKuYy( zqrwB4tJf@jWZmz>VZHN6`kt;Wk0c7cItcUT0dt1@-s{<(nb5x&Xx@=~-{A0Be+j&o z&Pn~{wD`{Uhw!OI3fj|rGJ$IluD6BVk*f>2E{@-dH>U}tDcui(P9e%==b1Z0HN9al|M4fLLb!5Q4^n`8S zTAA_CrTRXWcSHLgvyAMnzrp&HMJ2{W72X$lLyTu${3th0jde|bDAtiP1@E5Bxt{Ny zY_RX1OfzR_&O~VeQ`W}99=!B0wCC5a#d_YzmIJ`tmLGmChKVNLUiMncRVmJ1_d-Xb z14rtb7cHRjmWjAYh6TFVoY(Pv=CqFBwH&-{hDF0dJg;rlL&3E5DwW@)O%$7yC z)#gfgaZ7D8Zo#omU9`|l3#PbaF0oYQ#1g;2N2;pv2FBVNdy8(%D_n3xqC7c*8%iPz z8W!6{_vlE~l9qb>h#Q_SH?MVET-$sPYOtV+p6|g*84nroW~-*5uCA7E?uguU%Z;BN zZVSO&wQhZR&ZNWN37^rY!SOE2_SbP;52x+s2X8CUM&Wa|ZbtKOy&JDVeMvstIQGym zWK^?<^ueK6pRZZ&#*>BUW%TBQt5Q~8<+a7u9m+qWk4b)dL#!I>tC1ta>FM}@+4ekK z%cl>ctOoDSoOSlV-4}b+*5As@>2>93Gm;v{ROejZfMGP=y}~p<9O=P|!i}Q^gI3~j z(lMch(_=X7q3y?g2Y&3KjVoEg*p!WKt*dI_Zo-!RDSZqlhHx4z51(CKJqa!4;Tl>! z3GTfiX#q^076H2Ji1 z+3(T^VCw$U$~0^+sfW`{J=53*=Cjna(P{4er*>Uhq_1OYw3#71F)_{-HOo0uj)z$8 z#pt@_Gv@s@n8R`H3Ez(%!Muev^Tbs%R#mO~+^XfP9$D43>e*G>SN-d%-TDfZ^KJ2$@jHZD*2@RR+PV(W1DYFu-6 z^||I?Ip`(&++7RHeV^x6dF7qe*I$`3b%A%|yz*d*y-Jnc8)=$75zU5mbtnATc?i(opIl&b=*(cI7)X8g*a)ek?~y1FH{>+i_h+1m2pz_gLM z{5=O8T`X_PBlvQ4##tka#&)dt9vhmn`v#8-VQ4!pom{u-f|0rBnH|~2x&&{NUOCC@ z817xwkh0q>B4T;hts5F{N7sJyN!wokabC*Q3G}`v@L+oiW{&3@xs7#st?iks2Cpl9 zZ@`gYbXTPExk#5x6SD@LQT|F-bFc~xb0ApVbR_c2AE%@j@KfCKi}6YC@Y#V^YlrPi z?UU#JLFLGBD>IZGi4+H}nm2YraCYFTw3Mm2Uh&{{LG*fhya;@*AMtRNPJcN?>(2LP z4<524{XPGVspsI+lXQHDkF{kMHd6;Por%rvGqIfF&BF)ySqOY`X6_$W4rDrmX`Ztm z@SOcX7Gg}h&tbw@yqE0%8L*tKx44TMKIUj>X{c&!xZhqD>da-zU0S$)8;;(?r{(zh zjgrFZ*re(Q%BxpYSAV&=dga>X9n}x=|0C7QJ4&0nJKZqem!b~5yL#f`*O!~K96cv9 z^m$f;Bj)Ugn%Z?@cb>Y8vuwQ57?wHpv+5=f#CxoV#^z1Ips9O+uSh^QBZ<4G@Y)9- zHH!6A><)O?8O{Up-pSmP&%i_Q>HE?#!OJ(Y8@{}8#YA*@?vy!W%5$%uGaM#!26JOC z2SN5;cW%5owtkqZ@SgS|v4O++iOQ6m_1-0GQ>Nx{2x8ZechfA`ZQYy0ER1$jO@8?0 zL2|064|JJE54v%3anKs(pY`6Lf5m&#@CACYvpZyMG#qV_Gi79!`=14p`9WC6y^fEu z&r#QxQ!eX3){gp{yYpt%oi{N54;}SoQ!$sY)cn_w;NH9kcI1_HcD5WH=>DgLUiPx1 z-m0#NIKG<6-Z@ckPFHzN32qK+u0!LjN?UbKtfsu9=9==(^s-kXs-KaVu`Ks#wT75sH4YHb5da0q{(w8 z1->w8^6l2fZo8|ec1h`g9iz&6M%`?8edD3PaNGt|m+csy_ws=FG~Valbh&rm#MsV{ z!smqtu6`lX`r-qdT3dRCXEncZwCRZlRyVcWn~~Ps=`~k-;Q{w$jnBc0$Z>lbw*Kdo zH&pK!p4BsaaQBXpR)z9%a#qBKpS@~$YqX)3N?B|EL zml!m%Epz11&*Bro^S$t8`2(j0cye4bY+!hHta^F(j*?aQN5NBr!)>bqA9St$>j&Wr z!)KW5Rd-iQ{3hiae@%(ylyBTJ23f-|r^po^t(?ME?#?N<6%1$KM6sXn_4)me>&@p$ zxYa_v@ISVlnUlH>O`CLRXP;j!I5eWqQZANLQkORdKTd)>sBK-Xwt(`^42+4MossVC z5v##xX*=_}x97S2+cOW1Jy5+Iw^4ONN4JewyYpA({~)UZe@_ixXpXCA1U??ynmDvU zK};BYI;^ktJ7*i~EkPK|efl?^;B?yOBWa!&7(az)kHT~o%V=spG=E;=pJuZjN|U>r zSk9V_{LiPc>FJInF3=|*+R^Q8+nH&u+VM5QWAie@7wkKu&!s#EGiI=GQj@7fIE(8@ zGaq9<`uhMhKrHXeYqvknyE$|J^8FN?Eu#lv9vmK+v@;XyA+!Ej^g+>1aV>imo~GFrj5j;}=NfPJ@Cq2|RyWB+vrpQd*)}#-<$W+B{Py;O1KTTiY@gk; zeP;J|&IqW)vA@OwWydzG4aSC_^Wftn@K4gN@=ZOh-P>o|{d@nqXJ^m$g6MkJsYCvn z);9M1w$^`1d!ntiHFb5{HjK_w_&)g%e4lJ{zOU-%``AOqw=84Vy^HH0u5q}Y;=kYg zumNeVpV_hI4?So%kds5Fa6U z<$SFAhAx?&U=ZIGFEEUr?URU`U{$~|pK^ZNs+6!>uHyft=WBnGQ{r$xckw;^eG#4u z%k4$$#dJU{@3!#cj}6TqxuLwSjniuEP)cm*WxuTd3<~LZlRv1lsVx(q&D%_!n_6~f z(1A7kef=e;GHZW>L;sK1ZF9P^hr?^mZ8@*~i3`VT2Su)VAoki{TAz8Kb3|nCq`FlD z)6v24lLmE-=MUqju{!e}wezMq2CNy{U)+~*sI8~dl@T|F)&Kersqo9rrWuh{1*W<5lor&!x)KU&XYlDyjgC-I}pW#5P&?NcAGw%1&*@|GypJ|jx6^QJ1j zE-R|^+Ge`a>o#FuOZ|2GXrJ0ozOvVOXDYpJ2c1{fU)KRy<3BLM2dKD4cHedNn1{^g zmva#KpfiPf^2G?$^S^&Q4(dw~*r(LbMW8?OT?iD~h{%tk@BweyF{UK5VI640n3Bxq zRP{d-_N>Dt2vW~HupAd39-+`DS@iO7JN0DIUj?R6PZs?IDk0R9ML&^B2=!#qa@P%k3K!nE)#Fzdq@&;FZsXheLgJclUMlSR)uOM4b6{WVI@J{^z1IxIn;&<}YS0`*uF86Ej?1o7VqX1`J| z&xtZGIf6j_AXFg5ahR2X&_+bsit8cTnROB3WHub@v|&u44S6C0%c@79P*1)Bf%?Y~ zSTyx(5%3I`@q-nK5$ee@R#|5X^&(PF&QYubV+w7^91|?76oHZ~FUL3YGM4&qoXfe) z{M^sH9Jky@9evCA`3zWW%D`e%qipV1Hp`UFYB0;D&nFQmEQ`!`r~bzXVzUQKp$(bi zpEmmtDAbche}GB|^<>fi5-i7i2rTV<7)+tPh_v$=Q1Cbzi~V3{l+3=x*)yilhAefs z4=i<%_Mv~a4`Uvee7Pi<|Dn!~G3!Bl&LPrP6Ts4j>?2-}XmdLPC7I80(6emD6xxtk zXX^dusT|8h?4!`0EcXA*+{bD`_ds>Fs*A&{22O!W!_b*xWe*{ZCk173!N`GAG{|2VeKbd}5 z=M*}DP)`>B{Ba}-^<>d!Dm_{BpHg}<^RfOHDLs-#q}|3N#X2yiFb|n)FXnARpiobq zfk6B12o&ncG7ev%5<>ghjD*ZYz%Sb_Z8G%AS>-HBaA=Hz_|3^wsrf=F4Ec*XYda~&M2<9%<=a|y}7nKm|$zuQCN>3L3-@x2O`;$r^VCO)nCyPBF zkf%^j7CnFXO#FnEez3A9i~SI#C(D@BKR#>KEh}4JIES4oP{ggVRWcIf>d&U&n zkjEl0?@AYwHz3eA`Dp}7GM_xBXeTjkEXe zUxFZW;B3Xb&hqmD+UT|=OC7!lrm!rs)FDPCM&NxW`D`>k z{)~TKm!&@EQt9+$(O;;Med)cvv`mmz z9W)B5)zEx1Xx|r{9{7zzc!Ho1GiGw(msS}$58EuP2O3YIY|?kfXPBKP-Q@ia zu?YSBSrUku4yq}GY5A8d|An08HG3EM_VeQs5!!#+m!9F$S=g6_e+*W;H2r4btsr0U z*?-NK{+3IZn*8^B8-4p5q(kyY~y1W8DM)!yBNc zXx1m<()^c37J7SHXNH?Rff@x5uR; zX8*UnU%51rrhVRZ>0GnF(;LLW>xA{qb!mRYorQmJPjYFlgtENvc$F@lZ_?lMR=D(a zCjFH6s7oVh%6qbp{WIRnzWw`r=_9`M+b+$I4YNF~M|hx4Sl2?f;2OPd52q@_y#hcD%pr{o1AN`1pzUpT7KA z>F!_<@py`T=}KREzAxS3OMlCke#)2rsV{xprN^22Z}$QN?0i;$H0QH3k*53wAq(rR z^IV!b)_1xuUF%EV=S#2irJr%>`;7lrycb=1rAfc){oH5&t}h+PfFWcbLKgnHHO!@B zCcW32gexAmmXpEANFc|`@NztFTqPoz1o(=6)g=5YMU!+7A>sxYO9(SHPRt|$)=(1z6zu(7B87M z4`1Q+<~20c!>;ANrrL@HM&Hy_(XyzbX-PF+=+tkwRnve~Fmh%+RrViUECt7s>a4e^H{@0jb6jTc@@?7wbWKrH8)qq zGu1WM);a^%PR+G+)YNjfb&_}&6)RLxSh1+CqR7LK8dWqdns3?#UwlSgM00O*Lrbm6 zYQISw_k`{;P0`;mzEeH#?h5l0CKa{?{YB4jLEfbm)eS8b_bzI_y9(bMWrfk z8n(zbtaHJNEUx{Wzp$p}MI2`pV`y9$f2o-AWq%-@FAOuD620fkioIU*yrPQ5cQ-V7 zRke#NmMpxtxyp_~w~I2|}-WOS4f-rmu%3O=hwXC-J;}>dsmxtvh#^iHoy{Kt=VEx_FaS<0{n07X}3ibJr?4 zWokHer~%L?N7I733in%R30E9F_)WXIhWQB{CVn$M7R+DJ(tr9^uVYZB2?w`HCeFKt zg>cl^Xf71Bjf;4iRV|!X+h{H>iCJ-CpIrxxUga2{KRN8l|m0REUYNH7tZ6q3u3FwJ&SoJ+Zl(GP@l8Z zbf{Y|iL1maD#c-)lbI2*eIj`?qnz*nsOFr|->-ACuS zfr269h|+XgR?is>+BS={)W4zvBbDCS^sA>H58tx( zrhQyHn0j_uy{V_;2vmW!R-a3DV}6H0>Z5(SIp6qn*8<~nh4T4;W#iNNr$+kM8Ed1dL9tO*gH0Lc5M8Itc|I& z(?_5RI5zF`V{1c|T<;3VuHTEuo2^YT`8mrI6i3PKx==!X6dOn>Lckr%bh0a}jO^@Z zlAZl*vODkQk{`wfQi&j3Lw+6`CxOc?n09b%+T3v%yJbw8HgU&g+Qf}F(~nMX#?@%+ zGs3(tSk5KCXxX&eOO{Q$ZMEF5-PTyWX}3o#n|5=@6@{wLn4|-UITkm5O#Q*{LvQNr z>S^li&I?oL4JNA>K@@n(vZ?bAEt@)Tv25zR$uhTn&g+2Hn>KXg$JC+F>N9EojAc`w zpIA2aaeZp)OaP4O5;Kr5CYwTaK{*C=^%f|jy z%cjnIESowzy{YqSRv$qWc-^vTLuZpmy|XcG_=dG9pnk9ABJw`V#bjr%`<;8GO*G4~ zzYnDxJKMn=i)#mSEI(r|Hy&J@m}7Blj^$siO$5;=8pE5dy*ZWxmd&yJn`Lt>2Q8ap zdC+ncQQ)VROUOUBTuR<$nOiwtbBwN@<`^9to7L9d*!;q>u{mVfw8O6~a~ohqAjaOU zNsPTaM~uB=({8S;Y~+#oq+h$aawD{H4D-7grx@r3j&SRa#ns=`!5x=A7TU4?TQLqz zJA+%)xyk*ep3w7t$F%LU)Y`8b1l;v5g0##Vrf%)DaQ7oe4VuT#0~;+DAd>qgGY)@a z^=2HtZJA9eKBHvkvxMyYl#*9q1DTExaDK|j&JXuVABD-i)VSmNwPkZ$Z&^0&zuYpn zl2>yo^}naair5(aAFR%_xx3#S0u>*Hj37Q=an$it#OaRDMI0huj}3$za(;MgL_ZfI zjyNtse2HSVE%UN2LrathQ2OZ01 z-gw)BxePed=?f8?wuSyGFzsm1F*wZeM8p?4W`7MN-+&Fo97~#g)Y{lP9*%u{hdJAR zq~gmIoBnb(rp{oFM@j%pK~>_+V-dX>&(4PZA$l{Oo!*RR$4#)wo`wzNQUtz#oBesS zVy3BYL_CiSdzMcQt-=Pi8hV>$c9>NClAOiKQBRTXiHW1#1QP294MQ_Ic zjZi?CCmYOibI1cdFN)aI*|BLi$DB9BrrGgQ#9tu859`L_$@KkuGV&fn{DIT6K2RC` z#fZ%qh9Vz)j?;4tn)4TWjt#goKH1)6IhG2iXWNrQU%>`4AA#laS&RjammqF){0L$O z+B}Y!f!v9B7a4_ce37LrUY@CsASQ>tiVfs92+aE~;*(_9F-9o#_@L%oA!qdvY6*zBro%j zFF`zr3>%h74s~DyG3OWbY;$tRtwnhb)1GZkmT_3_^t2^QU))YT%1TF_D;?J(e$eq+ z#6Kj%XT-6z`Rh*4<0gy#7f#RiB#Zt-r)S%crTzcr^c>4%Y5y~*$K;fS*tGL!0FY}C zvcYU~(^jxy`$V0dI&$di*g#BwVIXrEVCF8z=yEUH@x6*W6~Cg`9IvzgnbIFrZ00W5 zuuV+e!0e-tvngZj_&mhsxM1@nm}%B$8RD^yixHc-9r`_Bb54P4z@K$C`w&0ucs1g0 zI6i=Qlj9#Fe#!A6#HOBT7`Cygr{f{CxfvVC=Mb{d`1d2e$1&^1@k$%EKRMKj4di?T z>gkUxW6#X_@Y4dFITqM3A35|GHjrBom>1PBEMvyZ70|QI$RQpaWDx@E#`>6XQbw&^ z6J&!~w=oE0)@PDqmTQg|4tb8ig|T6|WT`XvWy9uD#3RV?!#a?~CZBpJCmk6<$e%r<4Ygu(olUl5DR;ipvoFXppWj10@~%hRN``;-3t8IaA*YWZCWpR>4aCevXy5|y6A0Ph zzaf6p@%aI_u7jTZj?%xc_=MtrDCSy+KAHCn#k}Vey%`&@xd{1KZ|aXAW}19C;vC2E zwuQbIx(U?J!UjT?_ACK2?=i%@9+1C<_zp7cQyokD)H{6!VzTI)s7GG5@nXlv5x0`z zhhu;&_8m^o{w0ULgAHUY0{v`5%zBVh&;}eja6FJ@JeaY^lO8e-AsY?Jwprl#i-`Y)3>&t?|Ks#K89P1Ofh_Zh=@ z6gE7cnh|KjVfw{u=Y@{%M|`j2*AaigF~`grGRkF}ljWRx zf_nJ*IpS_IY}ig@sl$s-A3;o(V+>M%J2sHB5XfvpmLYl`XEr*5x-6$>TaiN>v4Nx` zWOH(YkVDTHwDvfmQ9V01!iN4?zt9h?&1gi~b1gqgzQm3bmO(x3$>MXY(^E&5V~ILF z>r0mFS}FDLS%!F;;+q_EzPgKyveQhVOAd8m12O#tKZn7)5NI>ZvDo~Z(?<}KLu;{t{0c$*zwP)q z;y;q%C)crDL;uU!ux|W3f;M^3kwcvT$eGlmKKzLwbM1poKJ;YyJo9>{k&*3Z#>t%k z$1-o2zJm?>;nN7&uwnm_LmaRWToQ~v!*OUmwQjD4J^Qy3LB>NJnB}tV&3ObH_9I!^ zDn=XV*>~g+8ynJwz`Q)4zDkA-`+_XTWzG>E6oh4GgIVVxip}_ko^>|ke+2+y+5tC) zIbil5^U?=7#EBD_2hTNsJ{d8UF0g;*Yh2-+$P5?_ddsLv!i6^ z^FI{xr))(3zGD7Njp+ZT*o+7G84jPO@4zF$rthlkIcxfk7eff^K|lG3*-zvJh{r0v zhK#(lATnkzLbBku&qlJ`+(^D<)E(I)CxKIi;_)0ZG7%jcZWQ;)LvzvG>b|Ad%pGV1?|_+2u5 zmO7Sm=O507^IQOd_T(_R%C-kNCLA6Y*yqbDS=4d>rv&#~icwIQ|RbWsW~W z+)l1SIVgfG>*_VsqugG^-y>Jq&k4vfhdl4}mB>pL{UN8Xfu0;5Dj7DML&!3QZ*lr;#AI1BV3`un%la`d z&vCNkHR}QBd7hC&Y=6l82rRc1@fRGko=j7p4}O4*yb;9Y&oOb)$-4dfXF+8jh|#y@O$j*~-Mv4QYhlKT9V3>%)~WI4uvclsj4 zLfK)Mjfsfc;0 zCbMtZOxa`Xy|bymv-z2`p?$C7|8&f;Va{dPa}1dI-{qacdO9}ek>dxIzJrW%ho<1C z`IP>oe6u++cXNnIh{*~gl6#rK7JBoR3OWpW$dBP_Y^Bfj^5XT^#q4-S2 zXDd!;8{*j6h65e%fIlo9j2^q}^#!m8dX5#^Uyb-G$NcFyjsxl^A^x=E1JKWLT!DD5 z<6lD0^OpURjhHNBa;>xJLi|m|-*$W$d7pO7G4g%K92Y-w%yGoa66^CD*za^qo85}{ zD(3wa?SGBWeaeNH=cO7%weMrW!a1J5Mb@ngR!zXP{I_A&Ur6N$z|9cK_ z%yj|N)Mp|#pGSdDf`>Xi&!z97qW+|-jFU_i_{ z1x|Gw+HTbLo|+Yd3_-}g(*C>_ePug6Zmr{bUVcPBPU*)hJ&&1w&PB{XW;>5^Oxtww zd~6`5EXS83O+D*r+6v6}%yN4ACd)j39`&dQ+apSbJ=>Nn>#MV`2V z*s#vz(5u)$Oglr*@jwpkq1LUdk(cAkv_EWEK3Vc!2c}Q9D>?KUHjrru)JGhLUI#$T zScRVTB8wl+m9)=8Ocp;}hftr7m>hZo8wlH!`U1zHz0`VMD+2YLv&o@-*g)D5*bW;I ze~k>AV#iWer_)bBOqPBhKs`GUV%i@WIZiJ?5WN|<&W7!q4IAzckw1$KvaIpioIW2h zS?<5+m-g&ya_9gykTnSO$+mfd3>&s9IrMMXKzb0UM|T(w9i-OtwjfZ?z9xqr#0Ihp zf%>T9&`$vnx}(0tap>pNy3eLihd+VeMW9Wo;}D%e$`G>eHs}o}V<9mLvFRh|QyoiR zOrs6-8HmZEA51+a>=4}pD| z?Rd9h)|>V$i!5uW5l+vt$fD1u9)7A27n6~f=MGug)3h`6^rzc-wzD6Km@M`@z3G$V z>mf4o@_ZpnTdk%ZHoFi%M}|$rvDj>-9yYHbzK49BZQIW)Hf;rc1Ul32jz2}4h1fvI zp0|7D|A-l<-S@UH_?LE_w0Q8Q}R~%71QnC4r%h`{F zJNo4Dl4T5BL4DM&XE1z?4Uds5eLCIgd0b@C-{JH;7P9C+@AMoq9x@n_d0uxFo+Ly&R)8QMV4J|)XorCoNj z^&cW*fU_S5J3S(krVVZLou16|gnIhC$#Ev)d5-A^O=fJ^zstz*|2pC|PESAIa?HFv zj@ceug3~|qrjwDE^@=!-AvWV2Hq@DM&H(}`Mqpm{DOsM?H1j$1dC-~p{3rlo=5XkF zd}R5bm+3p`*~VmfPP-mV|3!$&q2FKwxd(xImPro1jSa-ijnGeUEdBBr(zK5vCQCiL zot|w>mij#H^reW&QlICYemY{Z)MuB|mmwxgeb{H&i?M-RfFOLSVl!93CKWo4t!ymH zc&x0G*we4D8S}8ufbO%@!=6(dgV+QevwU)>7aPbx1lliU?3m?z$}uh(_W2@bWBT2( z>1&kB@nib>*8qqalg`GhrC~$gW-a}eF)_y@<)Rx*J%=JD_xayYi?ts?8&vEv#CeWK zBfiiv>lJZKeUQ8a8%R0=In{CK_tZKY4i*T@&US3tWUAF=IX&}|L!7`M=OfUbZBCZ& zEC9U#2RMZL0;L8`8wGB#%(4R0EJw&UTIO*DIFKM5_W?E}gl!w(-gurbiyY3Clw!9iqfRiU=EkfXS zgXX>*}jGv)oH-2)- zZu}IG-T2`gC*!A-?8XnfT*gl&*^M6_s*IndWH)|Rklpw({qDxkI_ll{*+6#VXEWK2 zpKW9}e)f`QV*@#aAmgW(?8cAjM>l>>Qt!r(={q-mxXzIAWBSXDpM2^okqKh@sLFB) z^=|x_esSYxF77fQpGbBS1N8) zyj1ZD#j6#sQ@la(X2shS?^S$AaW9!SB9QkLpH!TIHV_+r_e(gUIA3wG;u6JWisve> zSKOkwRdKuGwTjm(-b7Bf$Fh~2VR?_@gNlzTKBoAD;#9OvV4(Grsd$*;JjF$dql%|1 zo~^h>ag*X@irW;gQQWDRzvU_Q+@g4w;{A#bD}IMO$R6Wy#ayh2K1}9C05Vi@uHpj4 z6BL&!o~gJ}aiij;idQIJO+M4sVV&X)iZ?6Xrg$&;ESvX`;$Fq?D?X_>V?ZKrw&IB5 ze8t6zOB9zWo~yWCaf{+s#qEmMDqgR6lj5z4_b5K7_^9GzicgR;ZCj<{91_k{%-<#z zeIA($Qb>{FsN(60XDhBz+@yG!;x=-&^}j}Or{ax@w%ir-g!QgH_6 z2B~MZ;)vpW#l_@v?QxYTE>k>LalPUe#jT3l6|YsiUhyWyTgki`g6vUzQ1Ma4#}uDX zoEl2_$t3ee88S?9p5h|KQN`00&sJQcxJmIc#chh$DDEWlrW3MJ@fO9q6z^AjSn)fG zk1OVfI^sX9c&OrB#RZBdC@xhzQ*ou@M#W1NuTZ>N@jAsD6mM3%P4QmEhsYP%cI#FA zzT%ULGtNlZXDf~<&R1NlxP%av-JYDf@#WjkX$RljsmMLyiyoQ`>Z8{ZiRJ=v;F7n0J ze!t?wir-OuoP3G3=RanI!-|J0&Q)BXc!J_m#WNLGDsEJ~l$>YlutM=_#p@JrP`p|3 zHpP3%ms+2P6!$8AU-3!uC~KdAwSaK8;)vpW@@3Y(SaFHsGR1Qh*DG!zkG6hV6}Ky1 zt9ZTQO^UZF-lO=S;-iX>DL$b%b#S6SnTm%g&Qn~ZII4KM;@OI86gMeernpV<8pWN8 zH!9wuc$eb+iVrJ(NAYpR{E$)lBCL3*;#|cAiYF*8RXme?h3(%;#f^%WDqf*@wc>S( zHz?jr9%KD)Q@mI4A;rCl-&cH6amLvRpV^8dit`m0D=tx7rg*O6dc`e@TNSq}UaNS$ z;!TRTD&C{`pyH#7k10N(I2G$|Y0pf>!xZN!E>av-JYDf@#WjkX6faZUrg)9wPQ@D) zZ&AEU@qWdJ6~99sYsbuS#UAbtL?2c>RBN z@jAsD6mKSvbK_s}Ud4wL_mZ!&_U|h`sW@Xu!X{gBL~*|2Vsf$dS)#a1@m$6Aid)Fz zZQfSJ?TXhbUaxqQ;;oAJkgv8r4=O&Y_?Y4okEpfxK!~> z#g&R16)#o1g8XS)ht-PLDc(SiTAR&^w<+GM_>kgW#qTRVsW=1ovf`h=Hy|8QoUgc8 zaf#wG#d8(cD{diAw8zq_xLxsD#p@MsQoL319>oV0A60yeJjs@OLUHPO34NyGVT$t< z7b%XCCtIJ>70*^&qqs@&GR19**C_5JmstNB6>m|zOYwfihZVo0__$*JGc_>9`VT7} zsyLTC)!Gy&o}jo?v3L36`xdlRRU>X`wsE~sGk#M3@sMWz1=7ioMC}&3uV>!}QJC=N&11cbStBdHIr*BztVr z@>L*7b|#uizpvyI8S;%Jr!`b3yMCcal01pGl_c4jsG@pz$!YD>`Fr|;lfBoZuV?k@ zlD<1kqbGe&$tmpoZ!Jk~*6&>W{V<)`qGFz9y#sz>|3V$Od+31gl; z{ogjHE2ZkKmk_6@;VG>99A^Ke#wncjH`Irnd_j_EO;r`O6gfpv$&LF|TbZay?Bo3@ z3z|KczADp2k?su&1#)#qua=zxfwN zAAfZI9G;mf&7_!^0?fPk{O5#gY_-5jOb>|$NwT_1T65_cyRQ29diS+IP4kIipG8=* znx19_mN2&mjW@gXD>1&O@7gQr!Mat~#~)>4d6v{qpJOZfcz1p6aR|z5VhMLDKM4ze zPA>0Gol7nLbVK%8`6YJrTlV$cm89j9E%;2PB&)qX&XO+#m@Bc)OJqol>As6R)rS2| zaJe{D!z4BCH>?s?YFg~S9!pfyzY0w3Nx15_1Wab6W~bAXck0ET@oDD}^U^y1{BfFP zU!pq6-c*;wQU3)W-e$Ofulv1xX-nqQ8U~zvtz}jCU()kD?Qoom>(DiGDKei3)hewLy{(cMA{?@vEh>VE8w~*5Q_Ne2< zqbhNKDR8F!@wkeNC%X}Ue|LGJZr?%pTMcIY@YqA#AHPSZ{q4s-wzG)%<9F|L{c7&A z-_@W${0lwquhi%7F!tdi=D3Kz$v%I};7{5Q|C){a<8LtFFFu}+gLC8FtR0gJeExR9 zAN!8=!@v3B{vPxB8;W!W_KQgU`1>g2sM}G1=ik{b^oM^L#r?hD^A|xn&*fnx{x?7Bay6s`CLBpL=h;NRrWhR z^fv-Q{QcJFkKaMaWdco7&$8W^nUB3Diz#rRLgm#oUK7R%9C-W5_w-J92 z`TSMFU$XJ?WuL!o@F(X7AG;BM&-wiE`xx1*kQ1rjvp#?PotFu)=|$jU9^&sEpTE`c zm#qDM>+@Fze;lXu$HzLvUm5^IB;FruPvMUlm?w%rsaO8^FMshj+UKtm{_0H*yP+K= z4?vDG0cnN53{<2Sd?f<+ah#O{bp0}LTqV$p(2jBwfE;B4(pKYndlB~{T!p}W^!G)8 z_BS2=l8u-9V8=XB1j@|X#Q8QJY4Nwt=WiMOMVP?}?I@1{$WbOBd*QDVaWBF(2;9f| zJqOVBxm)Bf7wZ!`402$K=S z-(^03{QiyjfLWYJ`us)bCysZD@;BAzj}E5OkrVMf(dTbE{Pn_y;d%txvHdE2{-$FG z^&+&R+~MxjUAcLi_ng;)aP#|{BhjV-;D_3@4G&K{7z9W z_KVPt(&h8F0{$AI??t!?fp)Cl&wT#){i9^#<#nIG_u)^*%gxGPFum`1>4ZO)B_jNh z&tHCntxqouXCTmy^^5rY@q1AD(2Iz_^I=Dhx*f&vw*uUYa0>$W(VzK_4q})a*^eE` z`eU-s-&XjO{s?I`#9{2hb8Ug#NaL!ce&*X{Gi?^z|gzJ1H* zZ~tc#{V_-Rd&%do%(XjAj7a^S^Z5(ko#>A{U@7(ct~_{(s<7>U2PeEx>QpIqN? zD-!oNXh7fbG8g{X4kF?&4R++H+fe|2x!_&|ELG$F%=eR!M)5}K;ZFeP6ltD0dr7dJ!~M92Tkyo?EK(&BI!Ho?AqXu=Oyb0jQbny{1rO8cKE|1 zv2mdfmN(PcVYiV^z)r`EH8}pT3{Gc<$Xnp^w{)TX zy;}Nfc6Ri)+UJkoG4me>%)Ezv{!&pXIWJq3zwbGJ(k?5IuA&1c(k{PncG52Vjv0T` zQAFD1U!f;Q-Hu@>w;pypj(ZWfkH_(6=TFK#KG6Oy26h>t9o?S?J!2_1jPEj)8VkFj z9pxO@k)upNR(vk;Im7)(OSwfpe>36lu*qRJ;_nKdzrFCs@5=YWY?<;`MOSqcJw16-K`%l(mOBvb#aQ}dE;8RPMu?@{RM?TDZr{em_IC<;kzRqoeJuAfpT8|o zPJ>>Ac9fAme=9JE>8BTAC4%^y;`~YbrJiBmMFSHfv}66v_wo?Sal8*Z`VyfXWs$Gk zj3xHBVrjbyfp$EOulve9i0|F-^CJ=3vD{tGPRcz7yN|>Ov6TB0U%C75NsPaCXUB4X z=PUQvS@v^DaVh0ypg(oLoq*j`F>?Nx48o3iqD(+~and$2M)(>6_p#gyoIh#jXr}!= z9qck9<=)~ecLnU879+&8qkP6!ZrM_-|4?C;+kqhEw)*@P494#*^1z&kzt8*pExQlD zDee5Nfvx!azRzD-mVIxE-`@tGzp~GJ-ZmJqe&0Y4fB)w5HxwUA9>9JPsozh1{xUJC z@HaH*Z!LoO`@8ce?ac2rTrJL=9S?sDI)$-}D}IOJS3Wx?^I=EdQ6?abU$DQg!g9Zf zAm!fX^OuUjoNOJj#AnCv6-3}ig#IW^zH+x>vf@0>a=(orkzVRq?{Wq1ak<3vRKodG-TFJpOPp8O7s#oskPe|%qFzBqGsOpf#UI|_d|l}!D< z=j>R&&-(oF+5YRG7m@na`uxp~CHn0t7)$+D`24k=qJCfU`Rjzgnefw#@Qm_jz6Xl5 z^c%kqkjDmf!g87XnXlY~xTx|sUPRLKEd9&pri*>`W1e$i$2?IcAY~7F9zP3axz8dCWf-K@$r-%CYW%5A@}|2SZ|>wM+zg&;cqhbi%9)m_4%6(e{z1j1Y@b+ z?|uH-;V;>`^KGBM{qWZaKRn)-mA{XC{tm)lvg_bqeEufjqAS;}pD2IBaQ$Y#$oOlG z*xyEk%7`5Ar(j2pTD6z?NMfGc4xJotkuwvm;OS`OC#3i1So0!T|*Fx6J47 zApEiZB2vG5ef|!?pUk@lVJ!as#piGRNc$cXzrQDZ{`NnSSfBnv`TMcYU*r<|e{?|fl!9Yn$2vrv;U?5CnqupB6gsKj6raC_OK}{yR*Q%~ez#rwdmoEZ+V#TlZ3OX0 zdlVCwZ6%(^-);CEG+#uZ9h%NO8xlk;Qh5u0J9VI>632mJ%JE~yjW4*eczh%>rl6oeZO4r(VrpCwl#t3nUz##~Y9Jt< zSoU4gkNV*kgBfSHsE_6HZwP|13tz zsEc)O`?xZ$)MZ?mD5JWkvm;RktbAq6oPNtaW3G;rn}HOWUUgq>b7XYnwq|@wFH(Bb z#L4WFam&4i83hF`chuZIbI!#1KTerC%PTDL3bVX|*%Ql40)-_h*A$JfYAS9iED1K3 zq~4icm{q&+M?E>0ZF~tv)lUYl`v2H_8}O>CGw*w!oDf3JQA3P~fOh8);D7;>5HM1- zCn0ouTtM z9jC+0I4#q0`cnJ;|7)-NoI5)w>N8LKJkNVw?|o&R^;`G8*S$XW+G~Ggf4meuIHkVi z`j=AD<~rqHcfB?*ersrVSyH!m!^iSc`kF5FiTbXtPJ z_O(Mhf~n2x+>T&iY;kygbz#mmkr{0Nmz}#F>8KioetRNk)R%k0qpJ5~(ar3iFFAK@ z=%~8-^vVBc?ctQP$DMZuw;$(f?Cu)mb@LP7|7Cb&IOFk*t&eSM-`dvk{qybL-qzLL z_Q;TE$M^sFxlnk>;UVn@x9w|htN8vul|Qv@YkAw2vs+#acT4HB);UYk*1mY@vXlxG zI+OKjMZZ*J)eU=bc=MZX?5Mjx=j!gr6tBFW{?Zv$(E-aju$GO+*Ew0NGMzTqrOkySfugi{z9 ze?0K|w#%Cjw0FO1xA4N8tGk|Yw;UW*Dyt(c(|I86SP=6D)atUrY zIe_sZ%}PV_u@UylMi|K%h1n;Zg6Vzsj2YA1=!%xrt+@Sub>qZaX1lem%@Ygr3-enF z#=FIn3Mb{8qhl8x6F^vEZs%P-m$&mSx_##IlG596oxf<|%;odvE}U6WGXM4)^D|0H z=i(Q}5NzN^{IR#k^}en^11_h3%0SFKVzWds^Q1=k>mB*=C?(gVJYQrUnQ-4O<+2Pi zE{+&I`pmrbn>Nc4SPpF}5e6YpUyDGYo}7w6J;ytRdJ(A)M^p*|V;6z;OA#ovCyRf7 zx#GWu#*qIL{#T$})}OKT3F{+u)@>(?z6nfWoynX%*!G_zP^c$QL7;vZoKLVE15dKt z1g022VDaAy<|69bl%8KPqfk#4`_C&qS@avgTtxegO8+R85bDWd|3#%IQ_ud{2IeB# zZwGMQQNNQ)2=yW|HgF-t*f5s7E|~qnP>MidUNR5fsps7V6za)bH`MncP^j-k$U>l= zXOSrg)Sp3!B2a%3LG&Mjxjj(NvtC?uG(1<;pUk?_re5jExF}}yIJPmuvdD~S@9#J2 zS@sTPPZs;HDLr|(_45)q2&NtHOm?mQXJ88TWNu3=x0r=Ms3(s?O#MQzZ2MKphAiv4 zPU*=wAv1X&S9gDW`IOZhu|%fIeRAMvFfeZgTlpGLFKcDJsIrHf>hNoSdu{NA_{NzDo1xUNT25wN*9Zr_XXeHRi1Ls@Q@vlhv!7Rkf>lQX=Km zSGCrAFNCmV8O54rRJyNC9ZGMlcld;DeeF8)3@TiqL&THqg4!nI$Z2R=vAp^Lw6ChA zrRssc-Dpp-d^zpIueu2H=pTw%v8tIBU(x)4vvN7B&{VtDyjNl^&d`=O);1+kTNU3v z;jhW6#|xgnL_<^_x0scU85dt{|&5=tW z;&C4Jqdm?i)6j~1JHXT@%~P8CST^;sZ0cbBn>tu_ku5OR%WLYu-9IFXAZ;{tu=b`7 z)`t5aX?ro*?xdzGjwvov%>7ls#SdgYLVyKA$`JzN4VvrG(q0yy9q{f!DNwx3@=CXDacguk^m zxroW39Q;5AV;ODu?e3wLhatYkGS7r^$?(rjn;eRmtj_gTpNAwlG}_bONIiURN6c?| zGjBc?kwdHiH2H11VkY$|~G7Xzj#0xC*%)8d|eTeHV^UUvlGW>8o zkj2k-YtxJPJBpuIe8ln@#BW;W+2=3F@aZBZhwQ%TJoTvChltJCgAIoSIW!Ic;W-9v zIDcGanP>St*Pxzbax58nIVQ=nozjjroUf)^<{9}dmU;HSl#IN2$V-;?a!fEUuN;{9 z4K^INWU1RXtj%{3A0fl02sUJy2i~wYKSO-Z+7!cvEZg%`rAqP|dk%aE$BN|T zx{NBP$&`$CxY6RuR;sCb>?jf%G_-lcet;sc6%6`vrZUnpl0gx^*CzT%6D(=i^z zp2si3u43ME8^HdZQmnX4ak=7Uin$F)UhXf2+ZAsiV-BbAT7vLy#rqT=QhZ$T8O0p` z;^(~L4;1qrC9%m=%;%^@Z=QL#bt_W(m}2wYH*2#*>1z}>E9P^?;@>>8Zu4?%i=K0( zu=(zrwdqm%ql!-{ep~T-WNe$13yN{UD6Z%8;bLRH`)2LUci$|VXTvQ|SN3xhoA16^ zn@Xi`RBXQcW^K%O-z=N&zFFpTwNf8G!zygP`(|x=mHvcc^W8UVW4`-l*?jlSGM_sY zpXsRyHs5`-Hm=g=DK_7Ivo^eUQv8%FHs5`-Hhe}?Y|MAxtiE08`P`-0nD4$>o83yk zPqF##o3%Nv^ya&7R)0?EKk@r`eb-BTmvX$f+sM0n``9MCi1YF0`clnDSepwsAF*7n zpnTM;6#LY+-<2!Rxp}uwAH#v0HK1+ZHhFJg>f@8GN%G>Qem3zpS@l_B+xl@1;$8Ab zd)bhS`22=>5ni<>$4m;xTlkj%_pvSl^K%*Zzw>Qc{Ba+f%-?M2 zwZEwHhs`?f?{hwXWdr!*F{t(zQ~o&RO8vg&^T+zK%_6j;>_*W3mcSqP=Pm*_P4V{w zuk&BRtApR;~ zhrjqZ-Gf9je+!`3{?03ZS<2r!>yPI>lrZ+GIUbr{`hbbU^8m&&p7UYHV;d3LQJ#cO zm%C(`cZ};|8LAL($4l0qlzSX2hUZ2iQtsbbJ1KWP7V!TcB2w;KzH-kG$5?<*7ly!i zxxcmk@~s0GgLtfEMp$eD&mTCxMP?yUED6N4qg(+yVWvM1yC}hmEaUN*?w6yZynA6? z*a749<9UeWp^I<8-+5^y(z5JopFe&Ko^~#5cu9p>IR0o4)3|JhvJ3r^0}Y0(vE%sS zwkO*L&?$oQZ&XGpm)DuJ-FY~=Hi_N3Dfu_tKbd!Ndh&7ia!#32R8(wCKmK0MAIRpvqu2AxedqOdRgj0BnB5%R=?u`y-dG|&$&o#(1 z{2JtmUb8dO@ywh@o*dO#nBzF(hF=9^+~SuqD^)pQ8V=zAon^~ia`|&9wr;qB3ZhF)<@vmd`FSfL&evSk`GQ>Qp>-XC(aIBTtU$EUYUY(^*;<9n)Dcs(ak< zTvQ{S)xxcqDaTmLk7(x;k?io!N1iNZ?-avpPqA(3RJa{Jb!TZuSM4KDPVTIzD=zA+ zuA5WT*-{rRigt|6ngYL=cu`J>aU1IesV{3w&_@NS2FJZWPh<^y_@6Fui;eOUU{l$=(NH;mwSC1PJi_BM}rt2k?8eB z?}meg)zR+AcyC!@_4w|{1dnk?xImu3L@~=NtiHCedO~6K#KP)H%jO>rc6S|;`!~Ju zG(4Q~)eLv%hOJxM@;7gIWJt=fF-~~+;S6`rwyv(WeBAhp`+YM~Hsv^2HY>-GReyJe z4B`bDVdJFSIEig$j`m00Zw~*I+^#D3=i;VuJ8&juq~RY8{g%gXaGjXpUxpEF`z?#( zjCY+nWi#+U!&~s)BJ8kkU4;K*+;UwBucxCwU+PHNG{!j>8H%2m5RInb5>bwMVZ+Y! zj^Qa!rgT)KZ2FW{Ju%$rNKbj9!s#eY!JV___yyUtdQ&!S=NETWILC$>JPt$~Jg3?e zqlTs*aQWb5%L7zS=W@hmyTW0tGaey^fMz(A2>f3_JHlfKQ>$>tef|rs+wDGVrjZ>> z2X_PpEnYIXGpDX+&7MF{!NJYbB99cVesoagt77wDS_C%LY0*G&!RhYyx6T|1q#q6@ ze2f@0t-FWzU9a?7xARh&r7-n$_eNvhQ_!7br=cAag0sTBa~ao%F@Aa5J+?@saSVwx zZ@b6Dp~km*_`}pccEF9__P^t|>8$^I>76-ads2=?FrA$WU$wQhN(r1$86a_5?aIoQ~=rAAEM+rVwH@a$1 zU}r%%9RsJmbLjpIXJ4lqdUE8mi~sAxj_T8eC@?oR*)6O-g$?}@wn3VQo78bkWF{Qb zJfv}QYno>!R-^+a%^$P=mf(1Fnp@S_b_?#az|$ZN@=RdKy;o+G(0gPZ^Lro4GSF^kJ+jYL>V8SeItz*`{EZZ@U-nJY`SZu;g z1E+JYs#|bV^tQUl4biH)ilXRe>q@VSJ{&pnyYPl_FQm*W;ACEa$$Ye#%)>K}@eD1z zC~dM6u02-Zgx74!cj_Lx4<2xAQ&ktKD*kNbnK|RO-C6u_4i0a&-4^{)UDo{Krz2fM z#%(K$+7ZtBjpJJe{w$Zl_Rb=QnPp(=lDwsSJ2$IeBO-0{T)(<0axmpZei;hv3$ z@}sw%-(Or6eq!9VF~y%XvcyQ26@k*=C?+b)UZWYlF1E`C1Jb=A1buRizAP;?YV zt~`K}7Ing7cswwL`?V_ybEBh5;mxZJ?EWS6PR6TPGR@N@dMypb^%TfFc_W@LQOia+ zo_Vxj+=%Nugsx3heXaheZ322D-cKI_s{UFl=dR zVs4Ea%^p$ou-TcSUw##tU^}L}%l1gzjz?Y-)ST}fdi-J9Q*+Dh$r@wYVvp+jw&hx1 zTdYyvwp`o4E!K{0x%Q9LmNiWcb*o!eRn)ewUemIocCNXVu&x1*NBUP4kI&-IMfGi8 zp09oOh_-M0^7^;W+Od6k{o7}bKMtoR4nH=hbYLI44*SsJXivf3uki3=u6Ot$+f#S- zPX-+CQ-AJsbRF6pIhmrJW(1an4+rE3H@*YsF+dg0_~y+x_9@K5UGZa;w|HPv7p?8g z32%60@;&D|IlXP(P@K+7XwLD1p13c*cszF$T(69fVHT}1T#~|0T?;iE~?s&o8a8IE7 z>1H{_n3$2|n9$pR`uTjy`0S+53Gg{;i1^%faet1}eWcRcS`#jltYlB}_PNd*{dA(E+|j*0i{)aZT-jbHt*i`$DfuZ3~HJfT3o=TdOA9?if-fDF&zxs=7f{16MVESw!4^7s&U;|82)=g-|RyR$l+ z{oD|D`!=4#&)XJ@watEX;q1=ErIBdI=;$Lw6|;*MF37-9@u`hNH$Sm+$mR{5>5tqn z>&wM+jAHYKp5c40@=CdQ@5r)_2=e@7|7cudut!HYmUh)!BgY7pmsVke#<+r;=<&C-ng?+SvVz9W=^=h?R4(S zrqwMt=*Gs^QsuT)x6V+<<>uLosSo2g8|U3JPItWF;>dOJe%Cwy=`e@C-24h_oj%*h zyif7K7`Anhd-N7K;u_{pxd! z!)fop8SCQje)wqiOT{U(n!Lkk*${vFpmXeAY*H!Xv+1;Agy*#0INMn;D~-M0nG1i9 z=ECE_@0N6DI9;9Yqq*>T=ZEH8@yO9|e8XP+*04P#k)xFu=kAfj_P+RyD~@!v?|(I0 zIzdh{r5=kjvXSrU<_WpTc``-$%lhbyI4{gVTfez2C2fIIksBEH4_SRWar0#rfk9)( zq@>;GEXk?6V(gLtw!}quY)hGi!-t&IKDG~D;@RS)0JdYsBy6Xm*ZP>=8?vT(FdaK3 z<=8}LNj8g_VD_Q$hoE=7HRO0;PQknrKPb6=ddjR^r}rnloWkaLTS}U1=ALV~!C#G^ zH2mWPbI%B-uVNY(n2{dF^c75J3+lZ>UXU^DsbLk*R4!e5GI%&e zuE$l>oGGmNYg`zpK(Fd^(5LXg=b#glxoe7_BZgBq&Ba}CHJOi@h>MZ+R=>2q%U(Wi82{ z)>~NfCM=J1zx&3~t`~c~wY24pgypfZG~`&2rRu!4P}g~s6D>FqKR*qp&ceFnCW`-` zZaJNBxQYMk?#{I{c(foCk!_^A=7%R#$+%F)vq;|+j2|7z{h@03#8h=H>2_H!=A9F6 z8SZy5*O(ITjwowbS=-tsdOdaVK`b}Aplk{+DcXGfm)}08q<{vV-=xb6r%WCH5yvq6 zFy!hMz86D{D>pu(a6N40Y8>FyufhpH;~KeoG0=ISu7TG!w`O&1tBbF&;#y1FihA!- z367RltZBrRlN$ew&1TE7Q&ph*wXin=hHaiuI{M17Z7FHra^`FpivycI&i+VGd=ESk z??f42G5SY$4wVtUAOq_z#mkMY^=tU9z|Y^wI5}wl=pTyur}N^+<}w_xHE)k!96vj> z&wC^ud$nh%*qJeR$%(>f$=Lnz?Ey2xMy@Ov-nJ*lD_R?>D>R!P#3;_`x$WSD%pbc) zUL9`7xjy%Aak@pnYr>LkV;40_;V1{Y47GS(=eF>RcMQKdVX&!M8ze?C+P4g&<@vfr zL*a7fRf!yFi=9N`ScTIw^x%QVUUgs5$4a>3j+lconnkddIZp7Bc&1QLZEl$X5<4LnWU`jScXX?{|(yC}Uts%9$tG)Eq%x8Cd zt$ipht=us??@S)FKI3T@KazFvKT30QJ4SasQZ%Sz^wYC@3cMwe(Ore3pGG@x7&<=i ztDIc_`FXgsFef@bxc)znea7hw4vVIjzE-*a>E?qy()PV?d8J8uPtZ&Au;N*-jBrIM ze5At1B&?M=K{3U9Pr_N&Juam=9l58jtiQY?_w>r1OTt-_CkJ^B2NV1DdCr2AWB6a9 z-Sod-iwBNiR;fQo5oW z%nss@{;n0d^CT7ZrTAmsAwofC8KtYdz~OHrl_|v)*FkDsESt`w3Y4(X8vE z^_q2k*w0d*fo#}kA7@jhY`6}@zE?5Vh3K_U%`kD~9Vjjs|JZUEQ&>L{v0*>cM#d*? z$U_k#2)N132=(MC2-H^~Fdv!qr6lu@4d2)?rX;iB!-n+5nC+vDi@>{Q>3<9Yg?h5+ zCr}BYo-F$7z~YDNhy6o8MF^B+b%;XGIxwcthAciOQVF4+EPA<{l6tb}uLnyVxZXs6 zBbY*aved1FN(l8LvX0pAtQ%trZOG!2ZKF_6rY+-K1o0mQQ~po*=Q?1W^qfSN`g2TC zSU0lh@y{e9)RRTer!J*$V@f|0Orbql?B`Jlp`I-ITfyR|94vkHQRA6sXlx5($y){% zpL4+!mPHmlZpbh~Jz4a(gT)Wa75$xH3hl|FzlTZ)^<>en0E?d*rEdUJXipY<{BzL= z^<>fWvXuB~152N*15;=(BIA>D1^a|Cw{woY;Ru&n#wn%|<|Rv6*Mg<2Jf$xHQ)o{X z`>9kys3%L^^f=*iiqws^tQ%trV}@n~*7Kv<^#v?vUdB?-b};7`=KT(W==Xu8o-cwa zEQc)mgH%GOCrkamMdB)2bFld7Qu?ohDYPex{j*d;s3(j5 zf5+HpL3!*G#}JHlv$2*NW6(yrZLspq%A6xx$T{})t3s3(j51+e%zp!DAb zQ)o{Xdp)+vqJIr6evT^r55N@qA&dPFsf18Z7X44a;^&Og{|ro_JvkMD{qPO~g?bSg zW7DBve=?@fhAeqwU`n#QGoWW)#!{a$u+(!dn8Lhd(ceNPgnF{*ZwHGX|9(OAOJTz@ z8J5{Ng7_W;O0s%#{n7ppxgMn~u2ZT1aVjCK16lMZsf18Z7X4`|A=Hya|0Y=4dsgZ7 zdL)be--9XiLzZ>-3o0Shi^zH}f`Wa*m_i%!D1-d@a z8fR^uM@*rAGUrC-J%%88{o|SY8rF?>k5HJG%=S{B4mL5EcbABscbHIUPZoW)(vwAh zmC}OZvo2~ z+p6s0)`*NTCWKdjY06mq)PTi*1DL{klEwcjDk0R1{C~|S=To+wF@8_g z)N`A-%%=VO1=0KGdC~jFhUi=EFGiqHPZs@3u=uZ6 z`Uk)i+LNWu+`mw$7m+$2hJtlwEIz+yb*w`#0?Q+hgMrvY0n&#Psf5r!S@eZUPZmAj zpu|PAFIIZKO^HH1S?o)do-F#=U@oHl9Hn1CC4_pi*jFe$S@d^+xrp{ll>TliA=Hy; z&%UZwdNOtFpBlw=$_9&!NS|}QU>?R4`X`SdCA- z>$wv_`gRwXLK_k3TW-J1!5TrkMgQd=Uz*i#B<}VR~2+Vr~;nxV%zle<2T0RHaDJz4Y{z~X14 z(m$%~$zuOSr6-Gi8(92oSNbQFJz4C(ru1YcBM4oJyQze*?IN;Gao^0vj4wf8UY^@h zXipxFKs~n$8QVPmk@Jx+f+r%-<`o3`V_xnPqX^Xh1A?^c7hpM$2tX<2UP=Q9^OCu3 zGcUge%SF_?fMHfY6)a_OKRC|nmxJ+V>?;8|R{trs0f5v_(K;|gEwU9zTWU0^Rm7XmAzp8AWRW{_g@WHzM8q7uXc>yrN>aRhC z<8=mzo^yrh`35docmC~>^EvJKrmZp7=W|p*SQa^iID){pYf-2t%QkXY>B*u$qV#0Z zzYdnR90$voIic)LLHLm|!*#^Pj47-GS?XL0E<}hRaGye<4Y>?~`W^)Op#C6&Y+pYC zOMT9OW&NH9i~YZXFGZlAiwM#d|5yrJn@i{r!m`LRHgdsIE{`E;Mw^?I-haHuI- z7?Zp$0I_KUOMkAT0fhcVq(9{xiZO*YWZCvdfyL)FU`jGSBcP`pV@fg`Z%MM>pfkIV zIv9WJzNZeFZbGt7s$Dp1%Xx;{#FbSIfPwDhs zi3BJZ|E7kg4#uxfO1jbm`x|tsed!usy3Utg=}R~G()an&jlOh~FTL8A{;V(E>PySE z5abhCSSVKmzLvEPaQP>w@H`; zoyQXiP|$p_J)sJk<7=JXmPi=;Kl7z|+?|l1Iri4+Cld)!(0oBWp$eL}Vd?bO5(#7f z=f3pQzI3-Qz1x@mhA+Lxm$p-e)%O3c2j`ZA1kIeG(|Y@7`!W&>LH)n$!8tV{|MTB1 z;e3^l{@*E)dC9X$_Fa%fZr0D$Nu(pbbgnNw)|Za@(%c^>1P?DH5}=^@UQt37jNeD# z>4IjTrk58b5};uG+*j<2eaol$($jtEn|$e*FJ0_R5672H@XV(AQ ziG`q`^PF=^X)?ijL^7>M7}J;e?DZPwa=k{F);-8H&*nv#)-7gQ?@^ep5@Wlu}4 zJ>xO`FoFovosvMzbeAvv9bft{ZF(x=EX+@TZPPr$&%*rl?>4>5q_@TYo5Gnd3)cbU zzalhac~{#G)o=9?m$=FwM{^XKMW+_a_8Uj9oWX*sf&^w({EN$>Ne`Ck(e`g_Bd z{;^H-XeG<(cK+SB{C76ZqmV4TL6F~lp>RECIp1)uN1C$|1HU_Si!WW}OY`T}C()`>BKdyq82h^--X0)QJ zwU*yOscLO1FyEYM!b2kZV=2z6s>a6EE965dal6$GH4Z-Gx4d!n%H?ehtMIr%72Jr% ze1yh98Oy61notaj;`d5$hd!MdFVzig%b~`DDa+ed!%x#nPv2bC(ptNm{*4)c%jskt z9&<3?G_fy8SYFpsTiaiYmyI?wsbx+4zzN>p3CGsjXuPtW)+T&DrKzp1zaLYP{^}L= zwJYvh9)FZUzBkisUXNkE=hCo>&psqsVCri>iKFc8H)@tQ-?yT*z*$u@W%>Ph6~t=v zT76Z4VmxypDf{`Fem&x~-Q4fZZ|&Hx^l%0BZwNmzWZ&)4e_?BFW1VSaZH@gB%>Vy& z9DE|^5Ak&z?5FHJ#cfxZ`zm3e6X0p1l|H<}Q<}V%OsR2*#TY#fta>fHf^zN z%C&6Dwah#Ldm3bXS~hJ7a;f!c^~R^wbJ>7-)u~k=isiVUtif%FXR7S&xXH! z{HxQkz!jcNzdEy_5YrF3&bB{IKiINNKiINN|J%ATe}I<}Af`UNyZ|wIEt|ZSOE1Pn%ZR0|+ZQ~Mh zBYq&u5CW?VI+bKwpBl0~#bq|pGh4tOm^G8FpEk1fvyN=*ww`Q#0-b>EE3@wG0cEM+J*Q-`4*^EWWgW0Tj8A5(v;H+gNlOkTSknfhD3slR12W^Dhs^k47!XH^3Bv@=S! zV=Rws#~3a9w4H`lWSpCN+A(kHX~(3gr)5)5Jyy8^i60t5j33KP2PX2@>Ma}p_Eg{a z=f(#y{w*^dxQ@Rzuk8nu*RsiL+2pls`j9^m(}(=99JRU!g7=o-LrUM21wQaF%+S2UlO~_6G*)Jor10a`<`gf?{uE|+2%B<| zm+Qoo3+ArGlnZA4xqfM1jM%k&BjOQcILJk8`p~lRi67R{_?!-~9D*MTcjuCqhwtPF zV&fCrW89}@;}abB$qGQ|zmHFAZ+wF3lkMSmFuCs79^va1vx=fGRXkhqe8r|d@X2*y z+6d<6WBLuuJ~rzM90Qy20Gto#1iS<{rdmJVRdtHro!k0X)^(@btlK zN6@!{M^lgOo#V>%gJo{dqUWwi7}*SS>|ADfEaJ;8bDWy(8h%(8Gj74G3lG8Rhjrl) z4g2O=GHg;Ui;WpS(9?!2`WTq@VZ>z7&$W7v5whqxE@_{Q zm@Im;j-Y2d$RTztWIY1EXLktkUd8(rzpU7-N7&Pk*)G8Qz^2c^>~GUX@QYy6|6tA; zW<7!rg3Ws5Bx5;L>v0TGHuUTtvgq%o9(mglSCe7Gz9LH-@3nfEIb_jue9)eKMGkQw zLpl(sXJ3&+DfoeGMxdT;B#VB#)pPqJi=VGqy^EME<$lBJa}kq8&-!J@@B=YpEatVB zmjQws2l>UpB*`HrkHeFWFylkhmF-S%oxQ(V+?m|onKu=*F;dI69 z7tyo*!mPJ2>mkf_Df|dH8=1H*Y*GA#;x8-SrMO%1Hx=(yY_=)u-)vKsL$oQu4}=_A zY0%rR!G>e-N(9zzD`M7}{AY;GoC$skZ1&Oc!@ePlpDAG4cOf=o2K;sKt<=Mw{YMV5 z;~{38z~)(SH3DteuVnFAPd#k*AvR+J{37`C)WaT0@B6>j=SJ$GJ#V%iQp^O0p9 zGi`^SV}l%GMIccG`ea)tkzvE}Kn~rDA4m)#8yn?P#Ir0fLwvL1a>a`kXOPSA10hR4 zunhX-qG6WjA|7G+7Q|+Ifz3j&Sw}Etd(Aq!4*+3b&=2dgn>-UgkbMZ*aQrUfmlT_E zX!X5H|9!=8DE^V+Gm76*{CA4EE?5WFlPv8;6-|8(AU1789XPJcdI66CN30FUm^pTZ zp2tD?R{t8}GBW&g{gOj;3^C&n_Q%1C5op78O_n;akJu+C5m#G2jhIsy^=A<`T7C!d z{bcyzx+2S1>acniO_s6r81?Y;_lUQXk(cu~S;o?{RzC_cS;lPv^)UWyiZ{;4ysP*T zt0(`3;!}$Mi_C!u85HpRyp1@lc&OrGiu1|H%k_1i)w8UPmRX;j)`orFWtn|@#4`Km zq_RJ4nRR$m@h{0Ji~Yv`!IRlPX(&V58&N!!Z0&hhJDL5qOxf_xZpq8LxrH|<=AEaa z=Qc<`E@HBb4Yq+ce6kU%(D1|Hk(P51Ut^h1Gmf{+c{I;5pJx0t8UAw-lf{3DwJAqz z=1-JGUSRe2Ag&-IFXtq3h!Z^IUIgk{4q1FQQx8AfN13r|`9Z7SjQ9&=~UgTbm4w;diag64;PKjR44RtbUp0&?=*LKD7EuB+1goOW})U z)j&@UHF@^Ks7L+zgbeSsp-nv&ktHveQO}~uAs#G1CQ^^Qm5BM23~jg_kfokwR^J9a zS?bBV)M>vCda|s?g;u{Fda~4kb05oEi@41)w--tPdP*vSaJu5K;!MTais?e~j#BI@ zo(9h5gaP6BBeTp(GA1W(wsnfr$gp8u$kN6vt7pB)A$A(X%y0PNI*K4LFY8N|F?p@k zv+iVB7iOP@ygZa*zc4S`M3!|i&+6GevaE~St=>gUmU^1@a)W}H_JZT>y;`-`vS}}D zlC~H6r0qrCcza=!w7t+LZ7=f1+Y6hd?S(#Rd!cvHu72(1fgi-Q7aVUd4vymM*Rp9Z zY|>%hZ~a1_w7tk1Z!c_;wio)O?M2=Olx5a0Y?8JY`lRiJ-bG&BUULi&|1i^v-p9GMaa(a z#`R_7o2m7#kA+%1z5)?##v?Yz0I;DSa;OzQkiiJq*l0E*j*?j@B!)o!!-&fjS1N8+ z{DkG5h)sRqhh>qa?WR8PxdS@0{em}w5t*{cW;;S&juUc-h7fio>lU^g!g!`EMWCMj zN)EB}Aon6r&#^%cU5+2f=Mbppcp!(+KNPl;?PdMh7v!yoAGe%=m=a)RA#9s4>nhCp z3A0YZtcNhm7UuX9b`^gboSp0SeM~XOhv>P=g;~FB9+W}I(&wxLZ8&DlcmtP#M_4_E zy7xZ_=sC70Qx89>mP59^To>76ylWVrQA}T=pQqT=hYlhA>H|MFLT~B=E(M$VfVmA# zK%h@Hr;rRktPff0<5G`}fa@?{F@1@i+plnq;`0s4tXYG zQ)h54c%;>{&!93kixFRIxgN3UH~6Ppa>&IG#H>5$Id;e)I)p4kV0~CVIfQqE4(Q+e?;l%k72sd|QDT8{mmxGdF_SEgYJ(DTLl^FYuEI z9a+u`N~{f!m*iJCz;!7hu|RIFUmf zn2>)(kp53a8DzczVK5o?NE(*opHWty2R&Jif6O??4uySewl(k_U>rg@*_KT|Tdq+0 z5cxLzK*-W39Lmhg?dwX*^AMZu3wl(~n+K4W10*}LYCuXvt2_^pJdUquW3(PvK-@a%uydkOcwnltItGC7X2XVul42(j_vH*@dF`; z+6;R032a!FImSSTSA)4Y8_evgxb%;${;Gg3+YV{q63oJi^ zn0?1OY(Z?+FZfGft{duiAYMXVh#v?!6gFs{_LKV8LPegAxQPsV_BmPX*(cePy#16J zV_cz-7KCgt?M;8erW0(|5%lqOLLA(_;pT`p{gS?2k-nM0t@fzBKQgC{^=NE`U!_#um*V(MYT z^YT*5yAhi)4||R)ve=hfn<=ozVw0C|wJ>7_eyX6m$LeFyudv*JxX$uS=s8wcZX4pw zmbW5)-10owe3^_wG7*!d4qvr4dk}xyGOq{hv-}d`7cAciJ;xu*I)eBg$?%zNS*}a} zi?z82_8(fC;fTp00>tb`;HL&QeA^uTaJwXj)*2J@1_kO}BtJzxD-Rh%d*tPtGOj1X zCKr0L_~-tZHchbMewQ{;*pS6P_m|XTdNFSR3Jn85Ds5g~|ERUh>%{ezyP)TFF8U|0 zCBqMrhNW*GvNpV4yTS6Ki1D>2lb6?SAG6Fit!%ga6yh&irhjw23;sC|k;VVFtj$K) ze8)2V?6=G}cf4%*9O7Qf#}L0}nf`xBhJTJ)x<`AG&|B`X{0PPcq8ld`=E=hYR_gwfP!s(h*pexqfDuKFu{WQU|j#IqEeIRyHp(BV+tCbOiy^EL}!n&aBMPS~;i1(3^m)jj#{GYOVZfj(j6MjlP z^8NzxTV&+Tvn+Z4)#~#Rlci5CP>;L;^!;xYo4E!0OQ8?i^}=n0EIu=-hmFhF+Hjnc z#b%tf;c@=8)`sJgEH^A@)WZ+2m)v4) znxQ94Ub8QQ&1a#jqK&PynTt?X8|=+o#Dh&ptM#+aviR9-^&E<1Sw~x~&#xlhp_s=s zEbCdse@;eO?Z`_OpD$SbM(D{h#$KTwc`qRDwd`WsdCl?<5FfM5bCk1W`0s=ta_I8_ z2#-;y-(p$(2a$*Rt>Zz|4F(66^(S@xayfp9w^ry~9=88&UOc~S8x z#s8$(?5AL#1N#gF$vaK)Ld8vr&HRjVxp|U98}I{(BCtMT%X0j0=3$h@?ZsTXU_D`T z1MR`3h(BYQdZy_o)3Wquwbf@MCQEEJguu-P%^Vk)@9|FRd7=U7LI~VK z^6vEw@WcYL4dJblB-{1U zNVe-`9oepzjbyuCwvz37*+sVNWe=H!Kn@_tdg&$G^>Tu2*UMS5T`%vF?Rqi&W7o?? z>g{?leNqkuB%A$X*9(tDWWD5(?Rw$4jjR_QGst@3d5WwT9vjGdsV6V-{Bs+V_0mqZ z>tzesu9ux;1j=s3`xGA{r+7BU6`xUjPVsrgA1F?R5AlSIl?dNZvV$7b>nKb7F)vDqg2}qvEZKcPZYZ_<-VGvOQisq4=!gcNM>{_@d%; ztV8j`=j4Q4a=KUlJjKO|%M_O@UZ%KSahu|H#ak5bRJ>d9KE;O=A6I-v@j1ok$@U!K z1I4KrJEG52JW6p?agpMf;`xe~D6Uc5ta!cRPQ}|5cPZYhxJU6(#ita%t@u5~7Zmg4 zJYbJ=!itA0&Q+YRc)H>_iWe%bRNSa|o#Ks(w<_L6=0OBxkKzN0dljEhe3r}|8suHY z?<>BjI33%N*k>zt73V1~R$QjIT=6n851JtLirW;oE8e1br{dj;_bEQ4__*RTiq9!N zulNJSso1`yo|%eADUK>GQXEq}U-1(1WnSBB$eA8DD_*a-Q}K4iU5fWA?ooVH@hQb` zD}GP$1;u>mO6nF?JX~?E;(W!^70*$;P;sT=M#byML%lxPsCcX5U5fW8KA^Z)@d?Fe z6~C+aeZ?0Qr(+I~`tVs#VOMdU;$p>Ripv!*Q(UjOO>w*8EsA$4-mQ3_;zNp$lP~xB z^Niwiiq9+lKyfPOm;g^`Aeo9sDUK>GQXEq}U-1&fHHw=RuUFiuc)Q{*#e2!ayn6O1 zKC1YX;;`bF_RGfZE!cVqhS8<-=V#Q^O%M~wET(7uIal7IzigzmBt$3f}LyC_p zKBM@Y;`53>P@IZ=l=NYy;!%pDii;G-6wg<@L~)JcX2t6jcPielxJ&U~#XX9TDn6z7 zZN={?zMz;l#Y)@5iia!CCG#Q&B%eIeFuuuyTO;zq^m z6mL|#Rq-yxdlVl~+^hHmd8}85vx?tU{J!FgiqmoIAbI&Ludu5)PjRv0GR5VJmnp7S z+@`pl9QEqFMe$C>yA|(Kd`R(e#b*?sQ+!_W2Z~d1>?3u^R6I&?RB@5wnBw`0mng1L z+^l%L;!efe6?ZA#tGGw;QN^bezpeN^#TUrqy*}qZo`u7ThbzuioUeGg;yH>JDy~%A zsCb>?jf%IDCwO(+rFf6x1B!de*LwCR6rWZ6uHyFwxiVrD1uK0}NbBfQCCwcAtKym7o34NyGQHrCAixkHc z&nM@5{+B4OQQWL}z2Z*A+ZA^y-mADr@lnO66u+(bJ;fIk^B-tZ=dj}8igOj`E1s@+ zj^c%iD-|~?UZ;4Y;;o8zDc+;_fZ|@oClsGm{I25n6<<`Gj^jJ&hit{J;ylI0ipvz2 zD_*9!UU8e^cEwv1?^L{7@jk_e6dzZ7M)5ht=M{gTICVs#?U{;4DUK>GQXC@}dSiaR z;w6e}6gMkgueek3cEw$a_bTpDd{pr%#cwNqPw@rCyeV1gA67hEajxQg#nTnfQM`~` z9V;zq^m6mL|#Rq-yxdlVl~+^hJ6;kh`iq9xMr}(_$4-}{3+)LJ1rs7eGql$|Z#}v<3yhL%0 z;%3F`6?c-SdShn0;x5H|756AUs`!-Rw-vvq_<~~Ih%e=a6%SXOt2kfrbj5QNFH~Hq zxKZ&s#TylGRlG~_9>oU~_bNW2_$>K)uRq^a{J!FgiqmnfEcV%oU2?JKCr@#);xh6L zo{cl9^?_AwRn>^wTD-VksHL{CYEolETWw2K<0SL_1S~NhqG(>ewjTP{=BgF7PG6Ij z)~cG;2J=yhN&Ox0yA1;^t7%w?Z(|I!lplmx&aY88N!+qt^4W?ci_J$Ys@lBDC(G}B zNW**!qM_}9fi3XGkLA@>tqm(s8b8*7uV=Ki4s2f4*k-D{yrKD{j8?90X=tlowY;IG zwy6yt?5J%S*gEkojDc+i>Lst0@k+JSttc)mEF9QR+_I+WlQeQoOT)mv*mL*QK7g-6 zRIN<93jLMCM@^EfNzaPTq;el^Wk1^S39TDiTi4XKd@|$Orq+hlP0MSl+NwUX3ZC63 zFiG0QD{5OfB39rFCEjORlJtqTQ6F?kVrjO6kK0Z#tns0lfh*ir-KxJVlgv=p$gHuC zGxC2ZCQ043Pv56oKE_&qyyas|^`~4WwekBtle`sN-HO#ig*OlC+0RUJiABk$$i#AQ z1e?#yc$G;k!smNdc%Sp}FX=a_CNlYE)Wm{*(`jOn`B)A=8{{ts3;5-nWQ)w?xZK-9 z`sMRa&Z?+BGxKWprq_ji=49@C3MLix^V`SBE^QgeNx$4)SNmr5MAZ^=NwO(jmEsx7 zgoDX^pz8KB9H2^7jY+5cenloG`;RU$VTS_yd0{7hbbeYS>0Pfmc40ra@&2&;k&iCI zZ=I~7aU1M!KA|^n&opq|uuuAgo)UYnWFy4C>+;*gtKO1it4a(sF&nV6lkD02MbTt{ z-C8o!!&+z8+U;f!i8}!@JCH$C4Be9oL zEip^H{o6pTP$tQSsBh;tkQZ-_`;7bg(~U9a1NrJ_IIthzZuFCQ^kw-d-~3dZd@k*i zxz;)0nWqzp)uh|ie;1wHuFw7%`{YSxb@9kPcgobM#m*$G_Ek8Db|#t8S~aPmscy9` z8T)RW%On!bEvuXDInXDFT-e|iR0p?U8R6v;{5w7_xINDZE>Sq-m`UOJ=5oj3zq-DI z!2Ddsd^2oX{Kb$KAHXDA)P3f<*;1(m2w{fYkza>GDJqC4(pI2 z$BY)wCM$oev-tZ8So@ogG%i)dMf~l6M*Hi6zlG4Tez?6U?ym=|{naCF|J?-g>=?gb zImQI!0{pSg^oLtz;{M(QYkymjPFBCuHct#OrSY~z{n(Gv-Veaq-(IBg@0qwrdw&g$ zZf`IAO^1&4!@u+6{zkx=_ScJLEKfxIT>&HQ?;`x=!ifGd5x9)`=KB1dfG%16cn`St z=T;=@hkrB1{qgx4{Kd!pIWX6k2z^i*eEycf-*D(zKb9}`+vW539+tTXBI57MK7VcS zR|zBf!@ok}{(61>cwc-wmWzl#K0`*1*#&3dkN3ONAM43w?7zSD`RhbF7kUx#_cNcr zd<^DB7||at*T(&&r}XW=y#x5;b7#7KyOckUSE=75pTAQB_#5x@m%b=bKU_wN`&;Pq zcLDyAt>0UH{@UPA)~~Dl@x2{z5g#uX2k^&d*>roiD1Q;;lE?0e)D|(%HS{Gc<_G2-%Ovs8u;T}$?=?rApTbQ{Iw0x z-g=+E3#z^Rm!|mplFuKXu}Ie5Ek1wYI}+_>d&J+1K7U)`Pud8xIPdfMn*)E`{@LC_ zYsd88`TX%&k7VojEuX)I@F&|xk@EL@pFfVwk6(kj`TMTfy?Nx5up9? zxszV#MQBG^2_VOqfHdC;M%nboam{7)_Z5Kl$LBy;e-YYIb^ypRCLsIn@}6s>znc)a zjQ)NA(EegJ9~K#*9p$Li$4m`a;W827f3y0ST~MR^l|n~5 z`WwM#9}vrYFh?9fN8vJxYwggzMh3DQ3px?|t}V|Iy#A2(+WW zANl<88J%SQ-thS=yC>lfhm3K5zx4Urf^@R=_76UPJK=8+{IGtvD}O-@P(4o1A>TSI z7m@aU=<^p_?mYuaf7r#w>vxUM-x8!buZW1htDq;x?1KEt#CZUwxVXPh`}}Q3I$8au z`uy#Izh3xZ{V*lP{VnqO3uBOe56eZQe&s%Y^;MWF(NXk=DJkyHJZpqB_dS#o@Hfmu z^Gkp1-)+8f--X?CK07AA=qvZ_YRr?iT&%))xzAgFDb@#{WpOPtl6LI%`OB_JY)6&W zj^p&lzWN=2zhwQwXP@XhhCpe9KR$EHenC~^^)t^uAq{gQZFmOc9m|ZQe*f(A_jax0 zv|E309rt%7`U~oKKQF||B9GTa=#R@wt(}zH47->ZA(nD)gdJIyEnAtG4}kGE8<(to_a9aB+UXvgyIuy!&Ic%S;JxRvLR z$qHY&%bFAOS{s&2xexftos;RkFGE~PxnK8{%X`X`mD}YjcRm{VKAf?=YgM_g`O4+D zhMJ^MYsdEfo3GrBuuE3%FMZ`sZ%LHpp*Z_b2>qg0cAfjjw)h!{0;V%-S*e?>>Kr;E&g8Sieqd zhbh7thIx_Wr4WI#EZcj>wU_eB!{0_2(chmU zh`*1JXA&5Wo{2|g(zh3xDHtt{Z`P&MA7m<(twkdz+ zxkaSo>kT`jtB@99xm-Piu>WB!<*tL>W-&r6?cmE;$T7QY3nqaRV3xZBLE2%Sc|=;u zO ?=19cHI~UB2w-wU%5*#nECuX%Y70-%5Aj%q+H&|$@xWub}aYHzH)h= z=AUqZ6)E=#U%6X4@V+WLPPtyB+ylOHyGG%E2|j;J{*$lVcdthOC28-wzH;0C1lu`Q z4%_?Zs@zO$ob)U0-RFAmqJ+wbw71OK$@&fF;5ge?KW6w0?3gFU1SEBf_l_!-+s!lr zOq|s|e;Xs-yLhq42<<5M`uuJAV&eMHZY&pnU-tRi4S!g5aS?w{`1~D*KMWbuFW*2c z{tm(}9cekA?u9>TJDrNZAKG&Bsf5sOtcT{8UBvJv>~KgFmtVlHIG*xsnEWT}PZnJ> z8vh4S{Vd35Nm+-OH9UuQ@LetJ=WioOJAUKyHz^nUY1}6$BL4o}=WiW$GPI+==Mcmn z?NcN(;`SLhU%)C6;GWCC8RRr3p3}>3IxOx%f2UG zKFc}(Y5bsWMW)aw&VMTm@rUjCIKifBgzIx7!ci~z2mN*7Z92jdgmnm?M53R>D2WZ% z-~X(*HUsO(KIpaS|J$Oq%~j6GyYfFhxp387H#(+fygR0Kn!9lR?e`Z<1G*F4x~hi8 z+8VcQwQK%;@2dZ2BjYOUH>Z{a4yWcn<35aGo$f5ic>9+gJ&(g7ycIe0PR6U4qeJFnluga8P=4V#cvaPQ@D|W3BDwulJU}m@r)RaqE1Oi?2wQ zAM7pvx*a85OWnn91-xP~PWlfL9OoVn9L|ukf4bDJ>x6N4SJ2D<+#oMr|EptZjwJRU zyK3L-y-&xRvh;#k`JbTQT579m+;L-C$JuV-Sle>p>^Ky&Rh zw8gd@BFQ|I6Onz-d)o_x{f_&&+_#lLW>Q4Px>zq6`XV7!Uz9nZaRrkr+fY_!gLf zK`^{!7!-{rIH5RDZc5baTe!J6dK0kZHbI+Gt1VC^)Jm?g#%oh-Nn+D9HLbOp7%oZf z@4L@h&$H*u0LlNh`F!r@e;4f8zrD`dYp?xs_Sxq=`>eBGhZ>(ODHuCw=*{Jg&-daT zd;CzgarfTF$E>$69klDa`?qIykFbF?cFVSAiFN_8JvQ&Iotg}A=gmCt?toGJU~sJ<1&`aV6Y_h^;Uxnr&; zikF?8bBCT+aVY0%Cykrjrg1embH`hi@6(?H@6q>P-)hN|t|F}knbHGE4hRH|&on^(wK(Ay z=WwC-6%L9e%!;qtE<$;C;Wr^})^)l~JY`dYkQ z-``P|@OD&NTx+opXB&ckO;FC`w(-?E$5t&VT-MZUS+ICnNBg4ARUNm5mBVfAorN`P zSFc{x(b>K@=`-2!T1DKn_aDvf8k(5V-+5jfv!%Kv`7iHDGL`DrQ)|`B58PCH_i5Fy zm225l;dS{9u5bS**T&=?rgbr|19WsQSgiMfGSe@+Y)YYSQOBw^YdTl0T0ZuQ=>@%h zHMXI?p}u3>=)$B68ZM|0H_Qc{bXkS@Y}ajFFp~|CS6?-4LDST$J~sR6dD9lmo~iS* zY4%l@)(>i$I#YioEGmS*rOgd9=RY35AUW)X zxRG{D`Hs=ynDQKBLw`7y!7i7<2FKXvIM)B`$S7;3-0qrqAi|BVKNz77V9lEu-Mfbm zMo|v@NebNX!f#U0v#)^XD~6B(^FRU_^?M-rPF^l~DVNywQzt#=33)G!_&j(-7M%336LV>b)5C|a; zhL8N06d?Fu=RYd!dLA=AdUh&6$b;Qx9;860yH3W8+jgTcL|(A-+hB^| zgPnhqu_f%KMGR>AME^J3A-ME z^DAJAkOw;-C-)G1u=Dv47Kh;TV9)ud!4$yjfLi$73KuHCe?|d<59T=>{J&6u;5)euL&PXkAcp#rK|eAcqm%O*>Q8>W z_{bBxoy`5-R+EJx@`AmsE`=%TPv>dkqmvlwPv%_lks*eV0gq6?=IIJ<&kSM8Mc%KG z{pn;bLxvba2JAZjzszswIS%E5p{0Yl;^0Vlx#Gm{=}{$NpF5&Wdi}aaejhlAOfC$7Sbj<=A(Sg#C|v%-spE~QbWm(m1a45-gSy1Yg^OmKKBbfp%JBnQM7fM^^didPNHC&Y z@x)A+x$srfl0dF_Liq91O9zE=y?*T@tslA~%7ukViIEFmB0X<>S- z)&g~uH6T-Awcc2oXlYuyT3_6qZE2QR)l7Q9M?~}-d_j1WlhKXJg5|4jTEI)sYdTw3 ztS)kHmE(iTr)N6?uJsVG+ZGYO{H0`y`rF>^?^|qhA8k2_bJ!-p10g0Ok*U|47L+}MuZvDZi8U4 zJu%(ChY;$^+CmiC+3XDUH9I+$MNky-8V-34hrEVEUc;fStR4EamGKMG>vo2=GJYL= zYoE|ow)P2aW%ZRv(RY5ZZ4jJfso^?$GtgbfUm@ntae{m#3i9 zE=@tFwPDa1x8ZveJwc~onkj3S?V!_e(8+JJqM*}k3pyDHqA=cU-B(cB^@KLGyrB&( z?-*n(Z)ihbGs34pQLxQ$u+7>b*k*hpmk+iXKiFpN9Bi}8aRGVb2iyKn&IQv+HGY$G zLE^>l1|GP|>N3js)CpW=^`Z>&(oL*j!E^^{@O;IroX|-%o?Ho$-3mKx z>sNGMV%T-=Hh!aGuRxAw$21ew0p#W5{40eT+=ru-B2chR;|6dmYhLgCU~R z6~NdK#FGhHKgufi&P%r6Z42OEf<5M~> z6@M7=lA(TJZ`%TV$=s)yv4V`cCSaGLU65I-c(%zD47%dO;)P)88EM#M!nl>p zW8$winL5KhhS$ND%udDY!O}x}gR5-4vDx_83-<97+Tnv@h(;*jH?LfAuuTVV7QPO? z;RO+19N{o#Br{(;mL}+-AHiN1+8RCd;YhG#=u@!EFoz=3rg#EaGJ_3!eL0tqp>3N@ z2HjwJ{=``SOHwF_$9C|ET?Df z`<8~oJYe|yk<33t_>Bm^72%&n_*jI?REC!|Aj0_wS4Ws?V<+tiu9~7hqHrycZQl_N z^MLSog@-GkpSDyN27E+uXiw>(%|m;d9>z5Cf3G;Sr|^%3FE)OY;tv~sQ}N|s>7if1 zRS1g0wL^K|5uUGr4E+N3@w3qQ^b5F(0VP_hfDK0#uL3JC^#E5fnTWa+;1>*gJ9NWW z-b^<620fU^;rAM!N8tYzJR&()z;5$bOoqqdyG*7|G1zVXBjb-z40fCU48F=bO?eNP z3~dQ^n>EE}YUl`2L4kK(3SJBQQ>IuJK*z<<*qrBIOKgnc98uoKD z%q_}WCw`b)IN3!D70^jLgMGeQ3STG3FAR}W{3xNei#EZrU+d1kpMF}MSN%BLgUxa zP=>1*2qKyrez{@ipKkntiosP=^+)tU1>_ksV7FnE@#$Nz^FL&K#s=8=^mh%59}%X5 zu_5&PY02CW`r2@qqa=epVUD7rA~kWQMl$pZWq`S)4h2gdJHg)Ob;id|u(x^8f36tt z2&O;SrUsZL-USLZR8Dk}0vMZ{!6s8_eCz~!yHOr86mce4d9e*#rE3kuF=S>a4t7eW zXy-U2k}*VH>dJU>`@JPOt7Mpzxhu!_P)CFGl!qgn38H%X&M)TrixUk8t=- zujvop>1C1-h41tl4&UiD9KO?QcpiETFO2Z=2#4?VnoRgkui@~WUc=!#y@tbgdTq{p z57O!!W(;qaYa!{Ixj; zH=yvHUc=!#y@tbgdJQj(5${r`K@!POsJpQ20)-;l0Qk z##e>o@SR@chwtOhwt=qp%aDg^cvZ6EB?Z)PGHTYsaFc3-l6>`Ni}Dy>s?^(0{;O5Pk$bt_YrUSGTV?;qmsBi%uqU z-2DFYXxJv(yLP3YUW-C)%U9`B2fe;akVx^yp#AuJ+{2Mm+TQIH|GL{>Zf~l7OXgtw z%kS|NcpVZyk|o6qOookoN7rgdcaJmF z)5mO_r>k%K7fx8T?{P>5airKgSQRU}0Zz=}NZ;|F%IZ}rw#$MAOV(=ESTJ(J_zUGX z{gED=pC?xxPOXC)RgF zLbNsdSo*rYzZH)4@ocd_eSd9v8Wlqm&MN6++3Wg_3dj1mx9hLI?^vEj#Sq_9^7^tI zbbTLG{#f5aC1!^l$sgn({0M^^Nr*=3Uix*#)R$$O>zkI+x6ATLB#`TCOzGo$L$p8o zShBgk#VLKI)i}ZD+^l|@L6Er1%+`c?NfY0kMb_E za(%v08CC?n)(JVv z{bs7%Gj#I#s~yOCx%*S)ZXK2QwW8dMOpb9Cp3x}wawq6w>aU!L9rRJ|U@0b6^9E`h zRC=8QhL>9<0B(c{ou{GO7(FMZU(2|4WlU6b>6*&(@0T}Ux<5bwK#8%c=v zsNAiJ(b=THG1_H^K-?}rl0L3~PRK!z3V<6)h-Qo}waaBna}0g^1!8?LXN&KI9Q2F; zxRHctq4e!gjD6D-IEKC-2*mnki`n1&^0z5{19ftHeWyqIn8(nkArh!t`s|TUNK-CU zt@#AG`jC=8UdicHDiX&CXG%_|PLcLWZc;Io$dDXs`uxz(CAZEKiqQq}{0$o#Nr)a) zJ)TrdyUbSLn6hT3r1X7Ci@qBoLtNj5DSfj)l*pm)ibx;w-X?+>z5~8mgXi!MDhO2o{FDdKID=yF}Fn>*;AhBD$i!Rhul+Mw*H|Z zTOTZRmFKp07k2;UvAh4IIwjBI_VVuh>(hs&^=C7iD)NhGmIbc?{oBxTcILr~pUzC# za6lLK-H8o5hIGk>?jhT|3q9pI{k`Wej@|voX?dNzGT|Q|_+oW$zXoFm$tOqtuP!=s z2vsli6zZS6b zv}Ubd>M7K(JEwlay2N3FbRO3S#EJB+TCut#F)XNSFm-10)uod4dQV4dfsYFomaQyw zE^QBPLgZSaR~t-h%?w|1)2X2`OXH~Jk91|I`04brjbG0+lxNO8J2ehk{y^+(X3>xa z_2l>=3&$7Q%5(aA`Qnam9=qs|$__l5c`bLS^6R=zm@AekOMZBES>>0Mt$h6&Wvf^{ zzUZ^&@UYp-p`SCB+eq{gl!_V)J%C5gWX!R+X)3Rjo{S9b8rX6A z($l-D|M~9Ihx8U{nW2@zW8wmX z?-n~}icwP3V>Yx{J=pO+0?^4_V>{_>{B%33bUEc~)fVm)oQ z5B+go-c@o*cf3^l>FnnW8tXp0+!NJ~be?YIB`;qVtYe=hWIem(&cLT6@RT^2|3zepE$#dBXJG`adh1 zpB`C%_1@{{jE$6kX4{W(I^(K8yTA4`QkDt!e zZKIOw|Bj}_8eRXlX6jm(mi@FP)H~vD)@+!mRYT1kQmZMucF3IC!rbzl{$4(>?ZB~7 z-w176%CPY>DtF0Os$XrTd!0Xa(8hI{{3|y-(3jtl$^WoF{_;%ziHlATmzSOqHc!aT zC7JWC{$WG7=DTuT!CN(bl$U45%f<@XSQuZZEw9wyPme6L@4e`L&K26Ll;gm>OyR=4 zKOFyl*hT$2t}M34>vCbZ0-JE z{&a5sNbQhudfsq$UD@`s%$QwT1C4p1vOF{9@Bt;?*qF^+lGh|S=IQ>7-B^)v%NwWd zt!ve)u3=Ks=v-LajgviRDby;AQW&FP=Wf&L)yw(%wwys0nv>)aze8{T-RrfTA9}k=4)k#%A>Qy&%~XT+Xfvfd&b7e=m8}kdDl0$x2?VDMy;_r z!&*k~Olv_UN2AG9+{;-OElJrk?mqQX$))n5r60dX*UVEo?znw>_u#IX9bL6|<=^*{ z_r3Xdg*X34;mtn_*QJ5|T$e^<9&yiQ`MOPI>7{7P`_t#^X_-kChjYEpYW$C}iaIqt zmvAHN{>&4#d!J`{n`&siJt-L|+ag=9$}6O-CekRLO=HcM=P~CcJrchcl4gjkG3>t@`n!P7)G|p96oSUQ%`N{mghI` z+r6)loV%~wUUox%_x7^lq?^w*w6)5QWv-{TEfHyGYrEs9PTl;#uC~^$?KNGk z$C>^62JhZiZ+foFlC!PXqT{G;cF5H>=3_r^${*Y`q-$TzrtJ6k6~3(}METv1G(NSv zr`oQ6TaI3GNwfqxy0J#)@84Gwod)?AcJHfkr*qq$N($ET)RORyqdIjPd#`oYu-18W zav5&hu3zlu3O76WnbmlZH^)_rbmJf&y~~#uI6vy^JBQD|``+3~6+b<@chkPrat#Zo ziu|8XE|ZVLtGLy?_ru*4-)aQEJoVk3w^psUj&2*RL zci#QSWtA6Zj&u+Cf_ijQ_rUD~&1+q;cZNQH%7L+cn70qqf~WV%H+0H?%5&4aqZKW+ zY2H)i8$XcZJ$-xSnZ_y>ylcuMex~b6G&HkqqL$*7Nts2VV~^`*>E4SE%D-#RBkTPB zLCc&$_<}qIUywM6+*q01kBWzrNX^CKW#Orlf=lAem0A5>qSOCN3Qs6}Q{itE;1m8u zxJ>Z~h5vX*cRW>tc;W-C4}VKf5&dbRCYeAkH`3BN(F3_0`Y;?q*75oXBkTMaQ-<^7 zyp-j9%5xm&6}#w!j$bHs(JK02;h_dRHo4U*=pkg#0iP#3q~R}6ARqizg)g$c=|uFf%>6yp~5f)Y`9$kf)74j0lrSBK=8qC^Uj2QQro;N%F&Og zLFeQsFZdG*v*C!3T40qUS3LuAlKn+3=rJ zfRG0_D!{LZ>H;2O{Gr0G=L})}m=NU8iR8r!qAW0VLDz)}5PUFohrh&P z_)8VMj@`}vrzyX$9$r#i?VR&aaX6V(x1&@tL-Y{Umo z6c76s33CWNiv>78k!Qz-^S>l;j`9CI;y)`q!1#X|@m~twHvSnD zE}~p;g<{I(P62`sh7XIo2M9jc`P@-J@WIaKE(3xOc0P9_5Pb0a6~mep@xjht6!9e% z$j1x`$1YC{p&#t?(sW@}Kk#QLE?1~kNPYoG_(}$Hoiml9cwz{h;DQ2qmnlH-!Hj?8 z({nq&fFl2U3U0$zVIO0^?s?~P$hVajqFg7p`FQQXxW%^gwGw%3OV^QhL;h9;w|Skg zkN?jLL)ZX5R{=dwD%2U~ynv7a7Zi{=rr>(g^W?=Q^HB;Fkr#Z4V)AZ^_+X#Uw?%v~ z`H+7s;wu@*+iHYTWeUU)dB8qj(FPEFu-lgI_fvF?vN{wX;fG8L2{8bSj?EKD%4~CDOw?%xg z&jWWxe2E3}apLK|aV}gxO8i_{r^M;urG(IL?k5nNOZ1!ju^e5>EY#PJ<(Sm*v8gok zMTz?QvGg4#iA-NVmRze#^nafpNam>$<-$1;r!OicgmS%hYmlCtI(~7OO`XZ=k}I_n zY0f$)(#)(*q~jhUJ;4tuCapWuB9Wd~OeM#CmV(XkuGH}dQfZ&1U?cyhspEf@O8cw> z8~I8*vpjuTDm^BZo}EhjjN|z~l{(JdhZE&(Nu~YDz!_dGKdXO|I{rVDW)>g}$-MQe zAEwejPo>%W8OxuUN{>yYFHWU-$1~3VsZ{#zRQjP*`VUg+eW~=zsq_z0X${I=<>QP| z?*`$lG4>$|SI?Zn@8+vM>Aob*MditSUMBB8=tBpqIu{%N)2m~ZPks|yz}JP$M)&Bs zv~|tW1<4b=P>ahLeyggpX3ed1 z0KP^0vW?Y`l(S62-g=4D_ z;F{c8jgsI~wIt*$lW1MJYUOP!R;^vLVA*1gv}K*QMOEs1(C3uwISJyNb<8TnF{^UN zNIE{Dyv;$(S1up&a;qi^c@2lM42QA|hrEVa@%el5+|fENfX)7q5v~KJ?m`>q-_u(If?zXC^Sq`?ktd97dV7pjy=i)l=h_GPs9sbbfEE7co75v@)JlJjpLYv!?D73lN zJ+!&mz=|(xG6k^7g!VTXSS~}gT_&`@$%OXzTM%Rh=#MDaX?+^(G#u^(1Rwg*uX?lX4hB=z$ajNLowv$STf}Lh_u+wY~cAEZz z2CFnR(!e`XidJ z;CgNVo1TRc7A*QZ=+jm<211|OSQ?Bx6*Y2S27U6{k~HK!B@qsJt$ji}8}2h6Xc$pJ z!R;sQ@A-$a-Ur9d5yPRZcwRDoAN^KtLHS+($O!l8M{9@BkG7Pit2{5}W{n^E(QsoV z(+r-XKcdi&W<%&lZs|p#A8k$x{b+N}d>!*S2RVP|KePjndqe{j+@8=5ra!bff}+so z))%2o$RrA5+s1rB>8y?U&?fIiB6*sUMVV-fLe}~>v=YwV3%o!FPYmEuLMhm zDu7)k*snJEig>|(!@+*Tx02WJ=OY~IB7U(hJW>($sf%Qab&*WJb&o6;$!Dc#{Z1s|73h@yWcQ2{DH|()=Lq7E5h&9F?5obr^H}&S=fr>_B0xw zaXlL>d-&yKqha*#04p!!{rQOhorwRM@xQP5hmlO^Q|aUvAo>wK1;gHk=%w6R#XQY& z8_qGzv~U4fc}E)dyjPjbwTiDXjQwq3$=4|cSJ_;2v&pPhyuvW@p8-prF$=D;HPr@_ zc}VdVuw)o}V7K8>__BYe;x8LU=QqHTpP(3Ag)yS%72q@ff!((6z?UAL0={Y(J%4NX zb;aL{_&+rKhT?yW`2S*NwbKZZUqd_+YpB zWAJ73)r#jD#%7+*!RP+|F2l4 z{yY;v=PQc$MfiEJ^fL#5UH)&3KVN)s)ffTM_uxwpzhwT{WNr{2?0J7-GC9?e$F9gz z-%7*$+Bp!cau-Sj?DhJ9@fV8^_IjOX{H5Z9y{wDiOFzGqwwTOv$$-86KW;MrP4SHp zUTb)h;?IC(4`Uwe`hVYK_+|A;lj)QUxXRYvPen5OO=g{Bz^><2lR2XJUrgo>$$(wv zYNhdc2XUT&RkiR08$3|>eY9<*<{8C`f=pg9xQYotG*|%{RVO?V2lFcgr1#Q(jQTyg3C+?OQuFK*vJ3%#y>+b*xR4JBro&IO@^`O(-FSQ@ZE|x zMEuQQmBsuAc6;uPWWH!J1;t>u=MRiOQZd-=*#lqpJga!0VeI*4gbzpfdlCKzuHU{i03^u!UJ>+K5fo8K)&3tkJS&D3^tE48D$CBWv(=tcE#733}Y4SGRxpA zb)nMso z+=9KWM!=Wgg^Ib9BBN$cd^EF|63taWW~t)q!IELzf?W^Ckok<_HDJjwZoyS36s=c4 z=6=P$3ziJy7VKmDLHLsS?~213NiyoQ!XRzlb4|&-Y@=24KBpI-O>*5aMUm`x(zi-h6-|}uYnMTQgz1(|@-z+}Z z%k44#4DrGK4U8S|rSnvn2y|oqLQwM|`mBBoBFCP|Uao^ZUyW48KS5KN)6M z$WgHL&yyaoe`6!8qm&n!uyzvWekH7bBtKvBV7KQZ!sxj{e6ZUS?q9@TC_dQvN*4WH za?ZH#ONO#z&H=}RBRo{NMh9mp4)-QZNFv(T`4xs$baIa)8OnLDg4;Y28SyC->~kz* z%fGV%_G>QV2L1Hc6qCU&uwQdq;H!}Tp?D_vO#KlpQE>jP5#AEv$0EEx!l5qGdAoSn zkDg_UnNz@&^I@>cqK;s%<80$oN3i?d{)F*Wov?e+ee|y~KJ@~-o;%>HtgVVSfK?WA z3)p4CJTIA@;%ze-<`%Hag!x~2hl>YxpVVI$Mt^b6kxW6nr;s^Ee?+0*W!QF&(=kfd z7!GZ2xHIC1Inem`z^72rUn_Xtu)Z~!QJf2sp$%t&jX&4;v|)!~+AZ8qNnT=^jgkBp zOosM($oR}Hp&un&9FxjR`>5K*I;z^C+%?EKfFAULy*(LE)baC*KL?gfone=G!1%N`*w2y2;4ANwibJ0&Z@ppvCPe5{$s88{ zY2+m{!LaN9mhmSk27BHg!&ly8ivJC)yq6eunV*|Xwc3{TEi#SbfnEOu<2Q>B_U{Tz zfiL~+gqmtHoY!E_`*GvX79Z^26$sZ0l{H6vu-~)ajJ$NRi;DYd?3pJSu-|X;{0RPh z@xgw-c^`b`<+t?@=va*w5uX-5Kf+-SF@88t4TtqAixANl70Anup|2UfUiewV3x!`b z%x<7J3}gGR46hOn>vQQW7w-c~yFFJ#_^JqpYpdCFW5jQZ@J$g8?PK!nKXCoGM40mp z{soHPV|aw(Fb~K!j)T3w>P@CYaX3em7kqKVzuGYKXP5(}CvVvG++s3!D89`wdnWDy zOJ3a+FurY|2Nke$l4QODmJH`U*yq)+Mlye5GG{0T`}%EPB*XOsJsK+ETH@=s??f^` zFqwj4u&>|#5x&{;GqCiGR1B_qul|UBq2My)Lxyu7Ttx*%L*Sd9p(evT0QT$1h)Aa1 zWatNQ6%8wzXfmCO!+9s2%$+>5qFm+#uzy#BJXy&=G_hm)+cBygW3FS`-7)R!n09nr zh%oKqeCqF5Fq1`@D3p6zfW$0*SZ z1@~)D+RF`fv~ojPR&KD_$_@Ih+)K!7 zye+~zBK%~8_eS`I2)`QP*CYI9gpYx>MuY~+7RNOaE<|`tggN(IzB$5kB78%HmqwUz z>3P>jcuRyI1eYhaJr-fsz z@Plvi!4H0A(*7fnF&zBh8xDT(4F^B?hJzn`!wbnfFwqnI;2REp@C|Q>WP%@j;|HH? zhJzn`!@&=};k{Ab;0NFM!4JOS*CUzW2jBR?55D2x2j4Kyo89I@go7V^lL>zC4L3(J z!4JOigCG1;lDY>!_=Y=?H@rT=!4JOigCBguk3}-U55Dn(AAG~X55D1-Bl#l{4u0@W zCiuZO9Q@!L4u0?r2S50R@x$dd2S516Z;bfC55Dn(AAG~X55D2x2j6h;gKxMy(i8mP z8-IJm4}S2CAN=4O4u0?r2S50RgCBguKZ^7OKlsMy!MfKgAK~B!-(*Hc{NM-Q_`wgp z;ot|~@VrQVVT6}QIQYRg`3(_2_`x5PjG5pEpNo z;m5#(lXm!8grAP^!3e(`;Uf`#Bf|K1be-ioUmXvQ@bC!NMR-Dl8zVeB!t*1%IKrzV zd`E=4BYa&R;Z%3GisxF_8@EH*v8R7Z}UlQRN5uO*} zg%MsJ;dK$-5aF#6-WK5<5q>hldn5cpgkO#D>k)o4!p9;!Q0JVtLrsJW5grraNfB<2 z@SF(W5aFc}?u_vI2ycn-gAsl#!e5K<(-A%x;g=(PB*Je*_+9X+$vO3#e6K>T;KQr? zzNL97?#mV|UbV8_JjX|0UMR}4$#vNh{B*QyAMvNwwy)_tfwXOw4x0Ol-7>DIcJZ<$ zOO~}SKyXFt%D$pS!G5-1pFldY_5@O`CC?+l{ly7Ht@uU3xlnPRx16$_JWtVoMt@(O zur0*iBc)x{7vP=0_ZKK)r~c`7>C=bq+`lLoHA&Qg#Sah^<>IdE|2qWzimDxox{lkw z{p&lfc&syBX!zWO?ZfY1?TK<&ubrroOr%t+qQ0ml`?WAVtWIKHTD)JK#~ptsQGVQf zCo089?60TWrDKii(<n{*|5}gY+`;OC51S+5fPwRAe#*O|`n^4Es2kbtfp;l7?h> z?n2CC11;GzjS5iBxydt)ONGhLF_v|+Ev=c6F6w(kIM&DWh)D`gu8(INvA(xQX{{?B`m{tV z>U%*r);Cy*{`7s*@-!-jw$+vN>2hDxcT_mmH$#cVWH563-cdTXuX(h73z01LRoOB6 zqaa?aZDSfQbX;UZU zAfA84`d+b$|20RVjVLH97nItf{c5FFY?(+Q-2g(xgFpZ2(wcmAOS$~m$v17j`hYq`{_pq``&6FO+Oej+&~()m z7mO=3Pn#RN=Zt)*k6SUVPu?OevVR%9hq;%i9;@*>l;7)vG!>-NC1MTGnl( zyP~B2ujLB+6CczSiLE8?t2@iD*(~3+Mc;j62R;4W-RJG;InR7u_be`XYOX7Pqb=#)!XJr&Xt3+-0CFXj)rZUyQglOQSy%*j!w0s zZ93Y~=V(WA^sG1OD>=LFsm&xD5<40qZ1x7el^C$;57@Nj2W~3c)Uc^-Q}w2)n>vE- zVyhtc)qJ9NXIZaQL$6dDsl2s`yduY`sl8Gi-DTSbb~kJ}*xk0JySsYJjP9vh2EOpT z`*@WrM2%gBi|VNH+x2Mn?&|Vn3{{6Q^bs8&cfmM?28DVX=UtDM-CaGT>(N~Jt30QU z&{Cv4qrV%=_*mtuj8*mM9dD6=jTp#HbmL@;x|9Ib(vk@Wo5g;uC z6~f=%y$H)&_Cy$+)E+`#f4C6w<6eyQOC;ldg17+F^2F$)XJ}D2LeyGN6!@f(BlZ;` z@=mT39yA(j&ADv#WF%f^9FoZmq z_CXIL66()}Pl}HX#IBPO=w*FM7$Ps&`M1Cn!3TR;x5E_mR~EKV7BPzg;>HMnLfDTl z6o&fKbA$NE5kvjSU=uRLTEvI4KBw60xIx%$?iPmn(=$YT^bkYHfIaVNFh%|4rH;w~ns*s-5Hm%!=CoNMmFyj_ z)|k51(nQR_?Wy!#sq}-X^w(4AZ>G|Jol5_Mr57r$)^7d(l{)@js}M6lwdPFTJ#)go ziI(mbuGW`4c@F8saqiV2TDDquR-d%=xR9<3duTb%*;K98`CKaheM&O}5b#y?`>FJw zrqVnYjOCA{(r=~GoXWBMS*bM7)8gao*^1Ntd<-7;b*7GMdDlxm?b~Wc>iBc1bpP(2 zQa+&gP*M=IUtr?jt9tp33O=0@e^0UJt3@5Rt?pd4Ah}I34^gXDoX{^+-z>>3Po|H< zsNihs*KnVO@2y^boveu9=V|Tg;B6}H{we5=Lg;|-gT8KF4XBaFRz zDj0!s!RV1HMr+4zhFu>0|t4PW|M*pb@n1a>}kcE3Pi z=Lh?x96N*kc8&-8#mAmtzwv|3;$sik^{f}>z4DEUE5Wve1-p+9bz9)mwqSo>vS57L z5bXS5oAeZIv$^6DlgBo&%g-`Cwt<}=+E9AV5HGZ$>1jh=g)**|MEK?iuZ(a=KeAaOh zuaKoc(Ikbe)v*z5aHQD~7ux z{(TYN9^vrbiplSR&q*c<@2wbqG2(~!R*cVYv@ZWPSm$6M^^fE5-iqqa{qi$1T_vd6JlcBR_Bs53NtX}hHDR$il;m0BeBRIMZbVY?;^I+Zl_g>{gk@Ox1? zz{oMzesH7lUml!X%O@yJevWaGF8HzIvZ-&8%VtuQ%ewZO1`k01Y-%G-=zV%A?r|*#EX;cjDiS#kmy1sXWV|@=QT~Kgx``#2I zwvR>cLh-PV>DTq0A!V_?JvyeQDU$2sUHe$yLg}lQ6#7{6xjvqS#`+H0F-3t~-?)^% ztr(n&l|CO=j2qXtEv2tc=?h(%$&q{@rLUm% z>^kwWZbMhf(9x8>T{Vf12=wvD!u5SX`6XKHw;f8~ptO_gd%yVLMmw-U>-nw1 z=o_Kn`aYb}SFVB6ZFz`X-{h1&?v1>@XGi*YRvz28Mf&VkB4~Ae*QWH<>Ar&g$G&qS zeQQjg_Zxc@)8{YcJ&-E*Ny&{9-^t6pCsl5v%JuP5Ct+`w-6?%Pl0N@65S^~?t0{eZ zqI#Sc>Dz1i6b0hl;vI>IznIo|Ev+mGBon;df##5=U-CNTV^O$a}eoGsS_|9;6$ z3Ml!540MX>=a}@jB*%H_mv8dq@e>o_lkep_Qb>%Tu3Xj64I@7!{@+JocvWWQQ|muBUGnfo8k)@65$d%SiddjMOs2e3>V4cQ+jjmaj!iA|ZF z+H4}ub}Q+hncZ^HjLM;%rzhNx4jMY_bbW)l%ybSK()eVd=UmHk|Ko#)-g-)MX#4Gj z1Y9~OU!6bYKb^9=>vQYZcWxhjZ=ujxs4F~BUDh%=^V)!eEqj)fOnlF4xr5j2xuwYX zZl1k&UuB;oRTz|gty~#4`tet0@qykCWe%0^xyE_-A64?1T;pR_{wq&qC8H@oS%>a9 zx5&T$_5u0aow=`8Cc4KCT3YdyZ&dEA(8qqy%($|zG+aNr;!s(>s%Jzdk@F+ld-mq@ zb=k*vJLCTA^a1vbc^QP-@L^#<1_~6WM6{67P7+Rd_vp%iDo0d0Y6C?2T*6 z4DBf2VY>!*)Fu}B?!p~YEj`!bHj6tf?n+|c&v(|FbFXTeQkb@`v!k`ZO&?zlFYVSW zTs7^=tEXLY*);vm-J1Dm+3xKld$tz`$I$DnPj;F$J8QLLaNrA1xpuWhP3BNmomU)x zxrS`TvGJ2eEP3KXJF=6;O__4A`k7o})4|&MC#=7=4ZCRA`?vqq-a~`Fu5mf5x6L+A z`?2TfsrfTD4N9a-Hd(sCVr!wD)vnsU>UPbkRg*@X`$SpGd0HK+eitUC>YUkp%ArB3;8!aW&W(e%Jf5%e zhS~DCqsrl#;>e?IT>fBfv7H)L{WvN88T(%BjQDu-l(!<88k!JN>fD zrWEQHb*x&mrgPP*O01bE=;6>Qx_`ef7L)3ue!pH*Idy?5i%VAJjB;rv6G;q>~{KS1)Kz5{0M6z&cBF z<%E!@9Ed!Q$>(@vgvsxGbT}3)?nz>2Jr_P=h%&&su!mo1xTA&OgPnhwF#6y(NBo%) zpI-pbU8^uV!dD1G zza`9F3No)p_^2?19`MBq$XsX*2_MXA0{(|1KG^ww_lEoo@!baQ)*$#`=g*D!VCR2a zm_x{O$L0E4VT#~`U4BW#2eUH8PIlIC2>A^HE}#CsXt~M%Cxk`FJ9&T6mt_hbqu+^nU{8AN%`|?OVonuwZc(5d@aGkv{`9j-M~>L_|Bf((Jos`2^t`CRQw8wf zD0rJ37G7=q*1zoyz9o;aRk0 zU9@7gvr|%Q*0%YP6>FDA*_HAG{J@|OGV1$^&Pki%{Kf5|)X1oKuNX!q`_-aNZ<$4{ z@=dZR{v=`C7A{}ak*wsDA#Z(*KjD;Z~^^>L%D`S zpPCJ!PtE?&rzR8n)a(y^dLGtVpIRF>D(!vL3^w^05e|K7{5cVSUWDgI_=X5CjPPQx zwc%2***{U3XNHu+ipz0hgmo8K@ zM1&Vbc)j7@RlG666=nnD9n-OaRUhdZmNp`Am5r0oR+3>gc&7Ns&?aDSlM(PG!|L}u zlcCwcRS1e0d&sa79&h+tibMZOCuM@Y+>an5KIc8y`HUa*v?*R-m{s)6V98@IxQY`+ zv|0gqR@9#cONMR&yUblC!|Hmo$&ejfW%K7&lX*<>7s1j~FkEHx>Lc(~)=tHL0G7;1 z!@h^`4^8Hv;y*K)I>S{30nu{`=y_f7{{&0V7{hM!YbL`r{f8z)8-uHC-hR_$jw(I| zmYxZQeXN!#KV@;Jz@C0&m=C~JBLqZ4jem(@&&xUk`9|@Rg)g1lWdz^al4+I< z*!M1WAS3<^@xji=ZwUO^;)9(pb>aI>S14v|v4;u*yUbu=_~nYh&ZocOBMWwZ!T5|l zu=DGTj}EZ&>y6JC13RDgLO;5}&Tlk6V+rj18OARt2K%1Oa4u*f*&^Pp3VgEwqN-r( z1@?WI`uQmAT|}Pg37LV0{d@^?n)v!3<~Qe4FZMl-QGA|Z=EDoX5~l88-%}dSNAan9 zI3H~;orb*hbSb_(!XJz94PfP^eZW=fSLh}M__Pn$`77X?&Q*rDD82(M`GR5JYr4Vs zBNc<)W^BR-C3kAC8s-kJNuh?@K~ZR1;eOlJ@`h`KWN2Hkw;{tFJu)fW1v)>pr}(rX z*!lc6fjn&pcK#IO(>`G5Pc=U619tu_;};Zzoj=$3v;)}rv^njtPVvGBFOKli2rrND z>Iip6_!h&zqxg2P>cyA>d;9;c@y93z`}Ow=@MRBu@j!&P8SYX1UnBkwu=I1zfxTW| zi)5ZMnF)%)K9=^I%!`T-f~9AYVfXFNbqIS7D}KpjE-~!q?B5!{Q8C#0KQ?}|Vz8I{ zw((~u20Q#)+6`7ZJ1DTj`R{w}3h+5`M0E!IC!y-M3TUKru!5$4=*nGF%%8sTjb-Vxy^BfK}l zFGToNaGCyyURQAZW`vJ{xzLFi1CCjfIxa+bOoZt>mthU*_}_Ius@e8fq(AIOHGbHS zYWQFz^KyibMEH#ezZ>DOAJz1P{iue+epJJCYD=$U*pF)b#)u#GqZ&W#M>QPwqZ$tT zQ4NRvsD``IQ=ari*pF&>d&Cd>QH>w=qw1Okh5e|8!+uo5VLz(jAEC!^*pF&Bqw<{} z_M;j<>_^pk3XMd@aM+J(IP6C?9QLCco)^h4jBwbGYBFIzs^JZhOxTZV{9k)NYV>p^ z*(17aWoP?M?dc7gkrhyf{|cw2de=66)T)|nsEl;?sboLfH%}xUZ$IrvE^d(D>Yh!z zyo7VWPP=d)3T_NseLGOsEUp!2D`-jy>pCtE(=F|%8P^KeAy~vy4L8CRy&-+%N1slM zqQ2F_=y!dM!gCayT=yr%i0yk<`k3?4$Gtem(9fDE*0)vZkqS<(Z;KeQz8}3e*-L{y zPE*&%{b#I?YZTX6C)fA57_q*2?@QK+=;Qf->-(;7tnaYW%N3kl-*?1_^}Qf{T#wMl zTHEz;t&R1~AQ6!#2bf&WjvY_#J(6R5oJ{U?)93w$zAK_~y&kN!;(81olK8cw9)lIU z9z46z|Kd1!PzjDZxjxoevA$i>=i{_m!mh71rEiDQ{BGgo`ff<+dsh0G=drIw!S$v6 zbxxAZ99L#?B)Qj)?K?yFcdv_&KJG1D-+z`I<}@fk-O@KIf#EN596w-k-p*f>+~-qr zB=<=!F87$qWz9ml{Iccc{&PxSqYlg$&j~r`A5;2f>sbibIrQ-;%Jo%q{Z+bN0eVm; zp}tQ*wU!in zl$5@6)sX$|h2tC9u|6t^9QsB?`Y2zbMS4~z_t(T2DGs;t=wRG(&MSM7IyE`*jM2%V zhFdSWZ6DCS_^1Gv`%pu}OWlncf zSIeNeEmhrLh}e~ZJz#Fjz`6SdUz=V1Z+m|-VByPq7al0=-afQve|b{DR|aK!TiH^X zIoS04lKn6IuV)7IJhJZboSojtX8B$~Dz?Jw(&yON`_aaQKlrh|7yWv|P1H?4oL^PcIMuIbqw zx$__2nNttl-u;DJ_Y_W|>!QpaQ;d?$x89cXf~e4yUZG0|9p2oZraRtl(S^EeU(Kc= zJLB4Xwx{+piM_jq^_R~_v-0!1!mC#v%0=}#RIc566-j>YiGx>ae_mO_`{1^-Nt^@|B#?ZdZ;71CHF7182B>zmdxX)L6 z2z&L*9q(+c&2-h?c=(LCes{c6$!|Na=FWfZuX8Up@142t`}^wA(^Gq6qE|j9vzvx& z8nJ2Irlw6-Zff21sZDon`ogA1Hhul>#|QUTr9G{6xf%Pq_W!a`ojXH6g-o5Ad3E1G znyP2JwGR@rYDeeBR%rk5U74QhB}qA3W_1tSC{ywS=jX0(|K!@?r`$8G;*0y$G)1|vI~E;_a~Ke zUfz4CV)!RZ^Te>!Jh4%i{exFN|J+|REqr0`GnMgF(KMR9yT$#u%$s(uUsn1W%QeA8 zPXU)as>j6EtSYkhlkIJ-h5S$3rd70UAKcbj(Nnv4=#Mk|_tos)H$18ME4P>3kl($% ztk`q;TtnMp?V--~)V3!g4Q=gmR(f$JU)k2SczDaQD|KYc^EdC?y>E=^xGqbs_Fnz* z*2W7$j`mlteCg2Oms%_K?;9TX#GkY;+^~03t1b`QW_*9&8Lw3yyi!K>)Y+hYCEY#; zv`Txo_08_iu4$*dHEqz*pSF!CEKJ&b;X7?=^QBE~(*|@+8`!pQ@UrY`wfTTPZJwT+ z4^%KWU!9(tuT^uaku^T@r_F7uxqR-y9CJ`M|H1F?tJ(YV-rd`4=KMDs_%+8wC^-{KLV8?)^A835GF!<|*;;Hb;^Tn>rS8N={#{I0% z1NToU_iV$$81AmyHZYa{{-as46!j&0|4ZrK`pdKxb&lr1T>f*D%fkHBnz>PHgweU4 zM}L%bl6(z6zcV}a(I3s46>PCd&GeSWr0lj{(Y%4)LeTrf)dt&eP_yxy`xZf7$a$xi5#deK!%;4Dpky*9Ps=$QhP!@)a#J zrFhJH4wdU*{jao?#iFhHLD^&`JP#) zbj=#He|zDX@}B3blDu8DADQ~xn67E(@2~yH?(K)4D!wCePwht@ZtkkR<<0IP>({@{ zB;K6qYR;a2pVqdOx^8bjxOsz)ZSLwiqjLR@rkC~s(%^hs`s(XD8yh=yF|Nozo;2dqvxd*_nw6=oE_aSe3#h{B=RR}WJ>*MX>h<}MNV;h~+b(-NXDE7RR%cD7D zzODdKF1SL0vc91J!3X=eeF~Vl;j4^48m5T6U>|#zMf@P3Ki-dwJ?tcg$P0Gcu7)Xs56&xKPpbk1-^q27 z7oEg)3dlDrK*)n#|3YD}`z^u{GT=)U$oqr>Re=Ab0%gNLEvgsTZ5t8sB^JnSD=39+ z#E7ADgu*2X=)6$@f)5_A0Dr4O!SL4<>zAIue?~EcJeZ$BkUyy4H>^$u(ps{p|VbNzzPISRoCa}L6vr2xSPyAA&H4tyuK z;iF<;1F_3rX+p8Qv3f_jU~Y+*%M?lpp&*kM66Jb*F^u}Mq$p7?Oi^)~p#g7y6TRfqd^u4L{qp9@nRQgX->E}{uE>uqF|FI_& zljiqdC(`Gq(v7L~RjKr+Qt5kA>4z=NL{+UXBe9>!iSpRfGs#rzeE7Mg znMA79TSGLvFtHHu1Ma{7dHUki@hej48&m03sq~$x^uwt%-_?uD|BF=mZ&K-hO{H_W z-udy-5$iiAm7bbP_x1a|rhU15W{20x`W|Fkj9&Pl-}m#Z?4$+HJI;H~b-nkM^{oH;?|a?rbFaPjN7k}5 zqLtLUlc(El>#kb9ep=hL(`E((ls{e;&HvFXEOu^-n7ggQcQ~Os6HAsitEA=0R?*k> zuGEg%iQSM4tFuukD$zH|4ZAmItlIikuI|pfiN)Cq+u-JRjcyC6Sw5_eLOMxXUfD+d z|DQ$D|BDt$&vI8I;hfCY1{i*_CnY%WHf>-+Tzd) z8}uXL0fOr=VRoIS2)BTlwM$y%Tz?_h^0O$yOscb1hf5=#iLmFb9c<<5igbFwmbX=r z&bmmaFTxwZR`wgf6i(7F=XtvcJX1fCK{-!%GuZOKCBnCZXX(de$p0kTl&(z2+-3#X z$}%RxRbVPuGC|IDLOWW0ax80iiX~uvB*A`Zf`fhQZ^P`@B|7|Oi6jYjcp4-Lb}Vnf zj`6{c;gC<$3Hh|Vg?!osDkoc>|0!V0Pi@4Lm28|J(+T-8`yoGbq$mmbF`lr0qaO6j zVJ!ca&scw0{!M3CJ)fP}$;lg%|M+~dJmYz}>LY!@`~$3zH#@&VS# zO@U7OXLEw%{+Scy`I!Q?^SU;|brBBr1|gXt=k?hLwzj7Ehm`ji5t2~ew|3_fy=r3T;+pEUYXTiQEd=0!Z%-VmDi|A7ea1xuegVXZOO8Etl`2e7Z_KNem# zc|t%RATIR)_A=HQPuaocc3$8S_dNMr28c^NfITjErtq9AU|*|$k?}eC;PQI?NO-t} zP3|wLBk!;?p_m+{ZxW#?Y`p9D*%&amh6Gscq*u;=p; z<7dbRm)kY>QFz(>rTizsvdK9GcAKHki07ODyUm{pqu(SS?EGuSx5x+ky8S$0BrP7a zzr)(MRmZ`e)>PvciU+&R(~PH%!Oru2F?m=b9_;7T`Nl654|e^f#xD~O_PT9{SKfHo z-(x!M(gAzk)*0U=9_%)`XC@D{GuZ3)PI%emMZtE{StT8?+vNLY;;s`9cAMO1!}o~? zJHOBP4dTJxXPz|v2Jzr>8d~xr%56Kbt zHu>TFRon@NJ?@v#5kE;j*v|{n;C~EtD4cuXuLyt4_y^>NxZ=TIjd&%Q-y;KDZga~} zC(^GHcY^6trqjX4CgU);oXV8Y{Neu`<%h_>9k5?(J_s)z z>R}UDI+PFW^{~Tu@&@*6&4uts>l&&)bz_9@08^QgFh-fqRQjP|#(8j^{K;VHQ#5e- znfj5OB!|ut`Jt_)Lm9!IxB2LZr(9r<+YYa|>*QYvmJa0tyH2=XONX+4z;q}h*zIpK zUePmP?*sS3EAAumzX_HC{RCWomVP9A<5{>C+WYlS7BL0DC?u5w!_4m#EH$ATy7M*{Z$xt=NvUm_pu*XYofWB{9Ip(9NF zoeP$JnPILy$OUq)6Z)-mR9(sc{xkSVmdg>BwgZn!6{ z)mxJBjc8REk$}Ap$)D>mHljm4gFQbdna&*f)4|fAZo!_PGvJlhdGg;0mJaEFJwHwG zbPCD2a$wS00#=3dBJ>L5vHy(mugSkw$6Tk}bV50V%ipCRNrN0VX*;mb=NsWgUMBxc zuyiOlxV%X}l7({cv<0}lSwE6aId~N(U>~117@w05_WJA>_I!RCthk(OV4sVA&G=gR zVCR1WuY5iWXXRx~3uBb*)QJbXeiJ(4>&1ipoW0ce8REfy&Rzj8`@DQ!VLH?e*w5KD z#?KKC_O?4tVfOf=ZcdKy+z5v@HJwq$ze7H4N!(NAhqeU*YdUmeal-r*z&dtY~dopO$MM|e+!4@CHx2)_{Fmm_=#T%;dKnbL90vl+*^2-iipF~a;Wt?Ms} z@UjSVPv<&)5$=!hW^hT8AMWEE-yLD@%be#usN?++ek#JxNBE@(zaHTd)q&dyYdcsT z!rBgoc}MCxGa}p+;jp%Y>4&u)40lC3VQmNF!`cpp2P2)^!KFz(Y>#kQ+rjuh+S(3B zCF%ZuVQmNgXVlk}*csv7V7u1uiSU64KNH~>BK&fM4@H=LEZipd;*N6>u8VMEgj*uK zD8kFYHs9!pa9@P`BfL4ncSiW`2(ynymVrw0V1)Na_^Aj#AK{lG{Cb2-bRlt@Vmu9;Wqt!T0}*v`YwRY<~Ou;tXV6IJx9>cn!Ce~ z4owPE`Trk%^VzbUgrET6!H_31OcZ5EY-}x`yJ4RTaX5>CJ+=6<~8^kX3uaWbZYNdP< zL%Sg7hxK;rRwF0-MzO4GjhvMcd*Wd-d0Pm1-)P~`MBu6cMr+3WJnIby2Jcz$F?Gh2&+bw(C z?_rN=D95P3pUK7cY89v#=i>H$EF!jdNcOgf!yfnUZja}FvAv}V*wjN>i5@=rj_qx( zNz%n0(=oSqZpt3_WHT^ef*vwAW$!`R<6abd-0!=+wJCes6rQ5vE^d!CcEL?{VCm#! zohIxtjd6Q?_o}~qf7zqJNag*Dl)Xn}k9x))j~U$FBPn~2E8L{xE}p+{r|cb+y**OG z9*+Rr-p^C^xL35PxU>>I{GX-l?Vgg<3-)+);P!YgC)Ip;x!?3WiO%D<7~cdbc}Dg~ z7kfN%aC_mtRAE2ga*7uVX(7IjPjM2=98RxE@flCvNN<7k;&Nc`on{-)%XE%-a1*5D z1(jo!e9FP28865Bl)ZMso_W)gmsyjtx99{tf07>da&m6(4zt%F4(U>X7;{|E!~C~W z>2eS0|4fE1ddSyP>2^)kKcMI!=}wmObe~D3`?>}*j=Olehf?WIQUmUBCHbB%dmw_F z?ARVXBrLP?Dhv5^k5#@YkIV#lR^S_k@!Z~6>BaW;pHi?_YkKsvv&^2?-<=vn?NJ)$ zf(_DJpGx-u>CNMSiKn|JmG0wpx-M8bl!bgbcBJebQfKUNW2Q&&uTu7UPAiP3JhCKR z$`PIq$oF!zYw%Xmc|nit{x+5FX6aRrP>z2~rTeQ#CdAi375Z&A3K0OmSps)*i z$Z-PTCIXTzGSaVz^MuJW$0*0S0Oq(l$B{rYhhVL9ym zRsee(LoSxRsR<0f9K#jsyk=hE@&V~JdO$up$lIjnnDAGn*8?!|V?2Y2^EX5J^Xu=s zr0e;sN!gpIi*rwu5x4gzDSMC09(vSYb7T+wA~~0v^gN#DJ1rtklq20Sa?E*()#rk|@p^1ejZHF<%yVirKbaho zf9$}41D+4}DW8Uz5oK1hmcsd~vQn}imP6<}svuJ0 zCRJ3F=eMmqvti=EZAF>eT1vJ|ZLVndJjkvpOJq>}p^N-An!4eN#K9?9ASJ>n)?StLU_idb3_e9!nGx+vzf$CY#6!>rYs9jeM1H{M{_l zH81nQVl5m|o>{Pb-HJU2x}VUvLP>K|uV{70qnRu3Ir^UKCSKfG zQ+4Ic@0PbLm|js-GcUtBIn9}gbMK!#X70m9JBspKaH^dvite92cH)v9C7C3j{r6OE zugP67>i&7-7C(~B(;25PdP|<`zb7kI8ULd%6~S46_?h57XFlRSdQ=dC&PW(t=VMG9 z|94j&kTdGIk1a-D4UU-_IbNg@22YhkJWpV^qd_g$!AH;m6AyQ(9C?9XDwmUk-yny; zgRA7=H_Pcl81N_Md)zyPUFTk5gt%Zv2jYH34uJp9JQoiTEM_3n#pz|U5 z2sXiP^G0FUze(8hIVg;v@8bC+UGj;KpaXWBT%q0OoQQ80M$iYlzRtTK@LN5KlS5+r36uUU4(C;Y{a@evk-QaT`2Q!hZ!3RQXJYS4)gS@AaDHt(Z`40MGVfSu^R7q=HbF9Mz2Q(<=ETtgb+%; znP4x+1`E^bW7T$ZEsRI}^DRuPu~%YhuS453Fl>OBEZe?zWmiEb9}sBkTidq2uQ#)P z&AMK#XTKuR>RhRRSnU&WCC68-UBhWB@oz0S0~`mQ;Y<>EFPy?d{wK?ti5})WHSgbJ z2+n8$L?&5$w#8Pd>nN`J3!O|iBVAtUoI+x3TH&{9(2X-C7jQ?*V@%{S; z+QPqKm;hGUk(``=GeFqmV%OsaeQRIp+T+s4JTC2;&FV)&J{@zuJ8qBgst9k0@J(Qy zJIEF}$J-*jGs3$gyeGm3BK%B*Ux@I_5k3@Qp2c~(jA4#*5&m!ahRW)JXHlMq@C_B6 zT5=z};qVQW;r$W+RD_?8aQKGG^k0wo@C}vm;TtN$;TtN$;TtN$;aRoeCgs=j^I!T6 z6(@^iJN69^+aJgHMTnsmKTiStEjp$q0v{Y03ykN0_S|>9v3F+CF{Tp{<|$*2nK?N6LJ7DLZ1$ z3r7msPF@-Z^+JY6cwL;*7?z2V%JawCkS3=-qf;>d{B(w}b!VXh<~jo3B!|>$4!}5F zEk}Hg5e{RqeCx8|n#Q%j#ceb9iS5mZ?5R8F?Oi4u=dVfOk?b+n$M%|Jk820{<2vd2 z>l2RcalPRB~Rgm9`)$s^zNW+}>2_=`VlZRFIW-?A|HB+eB?)G!D$oXo>E**AL1H%i-!Jekd}U#`$+ zb6VzpZ+&un@n@SZUp%MmmdeYr3$;Z3m?zi^LYpP{GWeJLcFde(v~KrTbZv2y#g7%6 zkuix8g-OCpHq@Lvx8{@u(_fxmDKm5L%AWhFqvqDsz1&i{VEP%AbN4PfFQ1exx}R9N zVDu%|kAANB;k}EZ#2&6WdDq@WJ031gbQD~?chR1i{qqm7(V3%cnnFbBeP4 z@O;-h<%K3mcTxxE^AmO!(faUbG@p0jWg8o+t2SR$Q9QT0>Wq@cqGu;JUUUOyvu z>A0f#ZJEaATc@A#@h_GovA@u9>2XE->N4{$&$M26Uggq{E8fgKzssKglV>`##X{Nn z)_cEjwYIEySPQ4;cPOeT-gIiF_3A?hsk`cu#N64Vl~c=C=Zyz`5bw9JuR61{BRRHM z)pJ6{*po)d$Q$P!4T5^eA0D46Pn|dLuva0@ym4U{NQ;Qi^{QO?DN?*luACqfdx2~n5uOpnl z8#B+9)PILlEx*6Z0Q+=k@%-ZFN_FOLKen*nN_y`PrBd4*(wMa|bJ>L|dG*o@H(y*a zsdO4KalSv&VnNhcUC8nKR9}@y0vU@Lcg|asHBTM zH~O(r4;6bCyI}Mkzb$*|7i#h1L_gJ;mWS-^J1(Pwgw9i2y)UO{rx#y($K<7zubpu8 zoXN`mKIWE-kIJlg+o*e{@6*Mh;i#Zf-bw z&f*g%yjNdeoSd2SUFJNB0BNtN@N_r~FgnMreWo{#bU zrb=~V5su#}{lS{8m9-7GRG&0$eq|Ex&Z5DwTeGz_w^W`~J-;GTacD?f)wALb(J4;p zgzZ)AEMpf8wQa-pOhf08{y6*O)+6?%2JI_T+$&f>Yj~Z64%-J{<<0Geqs`{yrSNUmZs^shPl1^Qbogb zelM#0{veY!N2kDq~8!tn#2&D}b1%RGfI8u)C}t=fNUPSHu@ zMzAwjbbsyGftr(Vt2yOUgEcjEC)d7QQ|Yy%x)~_WtZ1zn*uI(*f2U6Tf$ghw=Fidj z{=}qPZd?4MpZC^g`7^emvp-~3HaI=&Z@Ezg+tXM%P}IBXH)@~y!Q8;y-lUy7H_q)G z&{_0H|MY~14+uASh~L<_KPI8`AFaEd`yRj6^s3C)H7AINUC-mW51%z%ILD+v5+*;+ z&xmjwH^#Aj^5}8Nmt*qkIOgNHvCSAOYW{N=9$;{D><=;+OI`fagHuGHgO7})!;3a_ z+^-SN$sr@@_lQRypN9bG-!1oL!z_kP`G~tjV4U$+MtqMj5B`X|8f6Lk;8OYU>my#l zAYLwB8j=Tm9wefFsvLqHaGe}H4=E9NaF-nXLvjc_nD&MLwHyKu)_f)KxhOwi243{1 z342*sgbyJu*xRT@m_zXA2%IFJxGWCA0~GK_A{`#!xXq6XBg6$$X7oQ7@!)ff|7FC3 z>0{_;i}W(kaD}kv-#>uIKG@T(5k}y_&Yu|ZV1l@l^g~~*kz-?Ggt#u=cFiI{J^)%cl|$$_2CrneqZ;%@=hnY>YL80RO zg)5Db5ex3HQIg-whL_f)wXZtb{Ah5858)#el{-_%zmy6;m*VV?baer92&EMs+(#kWYv z3vy#M9`Owl(k(Yu<57);lm0m`Guy&D!ts{yUKf2vqOtnr|6>s@QDZf6xzWP)A-o{7 z-NH$J7H00Za4sBwcjgBcPU=_V5$iQ1iy_3XPTStpE;U2<%)wH;>rHy!oWia=ZR{sw zpHdG=HNPp$VRoC5$rSk<<2&B{LC;3uYr6u}O3b&sHJle4$c%5+#Q0=<;L%oAee#D(p~&-tG=-#!7SFK#%)19hc+sP=Z+x!knLoKZDxu&mc?R9I0vg&!)tWMhu%a>@up>(UsvfkmQ zwtwQYHnHKwuJ&P4Hy%>Y>+{)ZQ}$C9!$B2zcog=^-u@8lil z;Q26GGDXhyYr&?^?9(yho$FH!*C!d*VRq=aDZ(ugW=7{a%-$R?0-vQHldMeyC~Eed z2^q@Xkl;{un{I}(Tb@JNn-ZN+_T~gnl9#o(Iq=+s4`rX1;81qc31zqT3T3Adl2CTz zL)p0yOG4R=Z&EmGHbdEs4`sJ0ZYVp?p(LT~rcXF~6u;K)Bq9lAKQFLln}9frCxohss5{e-%*Itg`U`N^SU`orqVbV6Mj4s{jhje?qF-|a{?t?VJs zRDdMp+3JdLb}_$J4;Ljk=qyQaDA&aa4&~xmf+Up7?1XaJZBQuJrHM{Xp0`mbSDdcZ zTgaQ?VfATzNY~CIEN3AkA+F&N*Ko+QVLaClc{V=e*>K3S;T-ywZpgFY+K3NrVZ7)} zb`igSKpk406UWD;P?jbbYopkHe9l_kmP(KHp%Jj}1@Ts4c6VYRd%7ab8a>V{ znSgubhy2SvZ58t0C?Gjrj*!Ms<-FS)scK$ua=j4NZEq1yx>GH^*Ylg4o4EB8< z`i!T|!ESTFc-kNA{8o6`yj%V^z{+R6VNdsA)8UoE-0%_(sgiU&LYUgPQNVBfER$J_kB z5s%v$8o)bsJk*0QkL3R~;#vFJb*398ZnNR#@&^rnLjK1he3xPD|H5!qagUSpJRBe4 zDG{b$qVqQS#~MCWKBo{ouNrE=ba)Ba*Wjlu(fP3av%u1!|AWilsUJzR96FcDUjUX4 z=LOjJig_=*bm&uEVCj%Au&;N%#(2&hu-E?w;1zeH{7)OcTmEMa^Gf7iuxwVz2bVYL zN3vUvxU|XF4D+hzDX{c8r@+2G`m?6_&SkLYf&S|2tiKa1f+l;5@g;_RygJc%;(^O;?!M8MZ!ioW#!1t8)_B_USCP)4C~oL)raw-4*u+lQKT4RmJR^Xwk{`wa;ibYg z@HzcRzi$XE*S^Fe*RMR@YD&|&tES2#AS>O=XfrulW>kx*^)jv zbo%Ar1kNST=fH0NF5}5R*w5L&fmdA0`z6EA%ij&oCFeNU&&_WeKS@5=`@nv9*?Cg_ zQ-*&e|EGp|J^0Ut56b^{!x`#Uj=1CHPXy<5j_Wws^M3-obU2S|4Yy0@G_aJX820=$ z8BaTaoj=cb#s{$Te`-Aa3+(-^SmCN_{Yb#&oGg;S)8K~7-<{wFdHmn%d*#!XRg)7Q z?B~}Qc++7{f=-Eia5*QJn(M%Numw?OZERu0@@Yn>GU!)(& zL^*iufXkQYM?x0im0a>ayBEVId-A}O-_zvEZ4N(M7`{qA*z@x)X!Oov$JoN*1{(R%9AF%T)jHiCUK4;Sq8TPoK?@y2LyaxobQgqIY?tlz&__!H3gls z<%hab+_}Q^IrhHO?L&CW2WEUKg+DfFmw-gETO+;ZESA>(_tm8a#=c+WRYCf#+Ievsj!($yIht=mh{MF zNkpUAnCG8<;Q0@Ew)~T%=Rf4r@;?VYryohko8^Cr!k+(ju;qUh*zzCp zVEMlZ-txZ%Z28{?w*2n|TmE;0E&qGKS^Y>3$T@x{!Y_b}^dos$&heoLm&u0zZ+%sS za}lnKa3gpW7S;bE%yR?hna?}!iEv+p`y1?SwT6%w|}Vz;IZT!0?PnzbV3DO#;&i`??tBy`I}&7vUQs9QJiFeg41G z^|wbjtVv)xf3$sF%>J8Rlfd-DngoWI6c_T}9^q9H-T*F3+U}+ZZ;3Gf%jr5{Ul-Hg z4S#eJcTa>5M3^;sUFU@e|F`e!V)+dFx)|;&Ddep`!eL(*(+T^!7!Lco7!Lco7!Lco z7!Lco7=9|U`8=45fF$heVmR#UVmR#U!h}K+_H{8F_H{A*ruTJW5S4^|T?~hPT@1hJ zeO=y?*x9Zz#`j$b`??q(_H|(*APM`r7!Lco7!Lco7!Lco7(R$i!(7Z9hkac%w?V?b zE{4OtE{4OtE{5k2*KpX^#qg4dZ;x=;*Tr0_k%T`K{iL2wWFQCJHq!x_`wM8kML6wem=r4 zftfH$UXO5z#uewsM0iq!Ya=`(!cAb!mym@KUK-)92(OFq4Pec$kiiJw9^vf~z8B2I zMDjp{`9F2%9|tqpmpmKcpGWv0__#zTqcOvAMTGy5eRv8lu>DJop$oY1M&CZh82-P> zhgA))tA`yeq?P{wBDI*zkXP9LrNa^I_*V``P>DZqcw;sDJmCn6;X8*T9DidAd^&Ih z1H9O`?-h=qmH({Z2s(xD367v--x2syJF8aqb@z6xV*8asbLGDm7`|+eZ;N8z{v-)G zS+Fp)bNTTj^{m1UFVVL^BP`Yvb)o#!Kz0ms~&o*k^nCTJhOxc?xV?5Kr9@AX6cZ>A&mp?yNDNv=b z3wj9eDZxzyB)7}n9QoK|%IfxZrtI}AOh0gOdv~SmJuZ7&q=Y@DoNn*?DSJF$87Y6? zP1$Qdp^!hOn{Mxwl)Xn39;rQe4@#USIb@scDT^V0K2{L#*rK8J_qfF)4uTD2tn^}g zdt}f1ACK`kM)<6hJ)RZ04IR$oSt)x5B6~dkb9^&oUv3RiE^os4^;q+EWPt)@- zhM{^my{kq@*KUnN3SOrEl-|#kp;LlJ^5c3RkRG_njyZN?B%8w+V?~$qepvu$Luwj0iLaO8^%MAI{atT^Ye0>!t1?qO;29tr{d#sv?yJk z<53PCnR>cKY6zmcy)ioA|86Qe=;8k^Wv^X>0neGRS7&;Z<9M^@?A@gJ}E=QdbTP2=!PnYv@^rXshx9su%4K8kPdCK0Mvd6PX>`jw% zdxI%^73z$P-!5+N#+1D>Wr|x<>`j+*d-ta7aZhcJl!8gO_xY5)Tx4%%Wbet8J?_if zgQeuh?LC&V*C=~lf3qWdze?HTKD=`Td%sB8yIb~NmLBCjBeHk2G7$Hxmt@Z#djzYV zzf)6sT*R*l8p)6A)e3-{?AYxZ>~{*2F4qT+Rmg?CrR977+aP;aDeQtC`C2Cs=kEpS zz2Hjn(L=5h05=hk%uy%d89V8|OO9ito8Iebzn&?k&tItx+v}-Boy4z4%{uP(*uyE# zU%fiZNaNbyr}Ubnw}XUCu!lS<0B#~6xjjm^MPZInj$aGJ>AoO)^ToTMhwuy)+(bY! zMU$&m`P2*g9K+t&QA6$3iL}>7I-2O=A0xfk-YVJi^9Z|cZ%)eILfKPS$P0SN?3BHm zWRLuizXft`FFcb~Si?n-8>BQ+KW$6d+Y;q(p<=qd{#5?9$X+fn9ezE3cct|1lb)(N zFRpjM^t_DUl-|_5R#LaL*FQ*)`LxSVq}S*H`RE}3Z1$3n#%2v_{T`6-dOwvOd1$g@ zJ5}C2!qnelIgTlbOn8PY-({=pO<*E!;`V-(ve%=*3_a{Ek#l?K7g=1q-Q$%9HO{5N zoYUxyks}EWMR_?mDU*3EB0OE@v=N=@*A3I}louD*JH27%v|J=_xJKp7`ZF4W{u}S9 zb#Q5t300w_R`07BDUgGsP4J8f|1o5Wj4u3R82(|k8!;nYr591RpWq3fjF3G2_ySt{>dE46j&*7o*wcje-E zxsGc)R<6>2iFGUPYF^6?$yZJ*gX_t8l84pZeLZWt)=THG=_Do0b*=4QpIfuGFW0er zdH1@$+`BJcxG*-AN-L_D+<iy2BEnxvpfWkboRcCDec_+aNN`EYTzeO2z1 z>Gjv_x$^Tx^VemD**|JU(Wduh+V?hBls;6dB?7f)U;q0nZ!62L+nPINuy_0Z>p$@F zb(Pom_8wb$-P^}byoYaKKU!Qd`hT4H6i{mz9X;`z2j=(ITzlPFFTQ-Ba?kYsOYSd9 z>POl8W%+ZX_o~LuOqjYuai#2g4+b78J;EA}=Vm$=|0{(WU$n0&GjX}5)$KF){P3=# z`DbU&KIXB~s0J#I{@~HtA#dWQ&eF_*(u%iFyl!>b?AgD1>6Ub6c5E*mDL3=$Fuh_N z3)|7I)tQFUO#k%C-qLLSb-7b!DHqp`U#*4f1U@(Qx?WZAm6g4!;Olbz*G)cUc{_A_ zXK|70eW19wy(f46^!g9)xw3X)`_s9hOVBpn{K=XfH6KWF@x{`_-_iMj&EI&e^dZY! zXXg#?n||r^k2jsOr!jk8amBbZiYkic7iZ?w#Z?&A0vs}4w5(jQVr4g@#_EnWi>}c> zbS|fsO{b+bciHk>Z8D6UxIUNsQ)=$oj#bxmpA_j`)YGA-yS5B(Zbk3f)j37gONU(d zhUC9dr9A7i8LfKx+^8Xin|=G3c*)ZnUftA^d2!~LA=!R))4MWS@Kk46XK{AXCF-D; zFTZkkT4z?qO)p4lXl~7h&9`ruvH8-@n*Nm=54@I2=j2RJ%gSc2&I?9Ad)!ck`8CQj z>xWi;A^W@1Umo>j&Bpy33u|p|yY-7DNjgKLZK~4KjpoNn=xUachif+O+OG8``>o|1 zRA|x6{{77lmH2{^XODK9o4+&EDobW+tWy2Gc*3}$l{26FKC7Pr)z4Du=f<0d)z7J! zdMzWGoilp--RqN#sLUr1O=kWSYz@?G_+>U(YIJ99qN@EKmuBY_&;Eb2I&A(i#YCiU9h5{-`8%ySxoi*&-)KbLFJ$o*XI{22rL z5B>0gq5bNW(m%=kX!+EyrLGT~j@3HPVV!7e;~isHBsI0|)(yw4`22XzOmEhwug_3g z)!I>0KR@QNQY{XfUnumBGqX+e_nbGX;zmx`eM9#B+?YA9`Ld2lUFW9Dw&~_fYe!GX zYx7fi-Lz3F%c^*DRlFsYgUxfxiuzkB7q#RTmlf;x{H3}yoqPY-p;a=!PdQuhwUg%7 zynkEC&}-Z#%^9BQP!G))<%Adw7weoINkjm=I@l=Y>iAY6a2O%-mu<8qlzr z)t0aQEx7@WqAj_z7(dT_;O!&F+N94)4^7Q4y7};D`yPE*z0ZcvZMW7%*Z(N3Q+373 zYdw4Y$Xc5wXEx9N!cp_J2it`cS1g$R!O@$twD$WiTz%A~UoG1Az27&~Y^XTqvFrmE z?z9A-UQp7QeQkZk^YbdFsp_UT7H==k)ZIIORHp7gX-TH;SuLzt_ma%asgT*a2P;m= zcbP)&w12G!TAQ0L-qX`@S!u<3IuZjt&#ZCfx&ixl`G@5AMzU0nbEfs?bibPaHk~ui z4ykrk_Zan$xtal0jUC!M_R*((E#jw#t*5MoL95iS?>^76qA*ODyRpi4}2bk^R?WqT)`bLl5eUaYSBHZqs5 zqZ?kGKcK$5m$lgaG(3Cs{10ZB>kTc(tNX4~LXCTu7Qc4R(C+){{Hqx(l4)M228$Jy znzD746zli=uEl?MX!hTxB9wM#&RntbiHd)_G&w=y{Jb|aY1Cy}Tn?d+O#4mP?I8xs5`OR82iP^sjSbRm07Hb=}Zmiqv|itUDY-CM0?|& zOYaH;Xg+tU*E;64@l2|>=86OVo=SUi=8Q@|x2_n?!qu9nw%?yy_xYUV`PS?gMinwAGnGT;&HF1Gv$MAy^O3K3gtJF)yWa88$fct)eqiYnnhGu5s~&j!c|~Ex zY3pCM$^|z7xs_{j^YyhrSi>Td%yM!ooESmhWmipPe`#U_>A(!8VQy_+Asb?>gd-cFwyp?|(N>7Q-hKih72 zm4(fBgB)QY^)Ln&6rcs$D zF1ighf3|sj#ShLX((?4m{qCfrXl&H-|C5&9{E3>zQLm-WlUH<}R7^f&RK?HEDAL$C zT}xC~eBtJ=vz+zwgOwjwP2VzDrmx#H7uC>{KX1k_DBXAbF!Hx0`zEHz2k+4?;6 znRb_p)1!sVjdGuq`y07G{-Ve?kcvc;f*?F$L&8i|emen)rrkl-na@Ky#PzU~4UGMl zg<^mk6$8lWI`Gtsi>#GZH_|Fq`%jEQMGgB>BBX_nO0uR1I4*gHb zA@JbO$)Vq53BrRX8_$1}atOXlfTu0!uMyU4DezYdR|sSOgTg$4Md!Y7>~+#FTq#Ffo$f)<0awex?~=m? z{BAit91r}z$X7K6{ulCj@{ax-ktK%X_7xSx%W|AT*v0oY{S#r&bF(l)y5JM!u)jji z^;a4P{}DOQ&t_rX?85(b#MAFc6Mkoe?-AyWH~bTFZs$p1Z|m2Ey#l>t#W(ua}Z}`}DzS#&^g^&3?zQW)#jg`-Bnn!K6!i{~_o4w4L{V{(BlhA3RGw`WFhj{$c^o z|IHCUDC~XmizrL51LkcP`QIJ!VBVs^e_NPC=^V}^V@L=b;t3u$xer}!+@nG5u>YWjatOSO=b>5zw(zMgbco}9jJ8GK!QRKt7bYJ3 z1#;fE(|O?hMehzd1br~qO49j?90CvaGVT|yl|$!cIRqWBm$yP0_Wab4c?mjT9|!2G z2s{{@S9rz*w=*`X2e8-A z1rZOPV{!R<5Wyzc`_;CH2XmaX?v8i`gLqw4D@6YA5#oT4ks~g3fWU*jFP#G^fd_Mb zVdru=1Rm`CT1W{znCk`lH_9RKVCO#xDS-z&A7;(QgDd5*^Prr!<39)^#08I%qbxs? zL*T*i#Qi5Z1Rm`C3y>0cu=D>SOqIej4{`oi!U#Or`Gb%WcrZNq`HdU`5BBTe?;s`c zF5X@q9_|;1{#4+LLtDjR>Zc&ZVa$!glL`T$;?P$M)ElpjJh`A8;-8QTGv6slaX3ff z@X3XMQ1Os25((>JVkE_3JSq^yp-tj2bCrVp?_aB$K3tIDYgaR_7o<2`qvP=OLO_VM z$?1hIV+7(92y;S%osqm|* zu-*U<$=};j;f7S$mW5s4-K&Rt_K#iqHlnSkdqdYXtJksO@^YAJUt4K8tWvzTZS~qNEquF&>x*Ks}>LE)ucXV}Su56 zTZkGkM2%C7TQ@m4LaagtBXv(bd^I#I2L;yju2C(m>Cg(u1!GQ`M#q}9Yu>+l?KSJ$ zR(5r->08>5ssNPIOcA}G2@eCt`m;A%W%vLz;Q0ZQ^3{wk<`jL zt^?P=CU;ZL&rmo!InYDaZD9uM`b`mT0h5TNRW55&hlOBEcM+H=wq%K%^Gm^&hh<>1 z(+)N}U0}1*12%oGUs<~-t^-pzNuQkOe*@U!a?IC5DT#1dghQR1{ZQu?H`KY|Q0In2 zotu6RJH}HC&kxyhKGgY1A|&;4p8rti7Pk@Jrc zIS%DDK9rYCNkVyz59PIKS}3pGJ`5|b)p<_wJrAM0#>eF)jch5u$+gDw6Y^l`4$Fh_ zArDr!ArGe~c0!#~AW2RxI|`JDuMaY;yl*D0qY@j#%4>0RI_&um8d1s9WPHUe<7^Thj@3Ykg)| z-I`9QThkdC~jhq^U8p>FLwZI^16#3fyFem?eqO@CFy3udz1rb|Lw z7%o%T`B0zPpc3ZG&i}uvPs;>r`n0&M*ta@a2(~&2 z^*JReOQ=s9+hMX}5H zI{a_jujI~*a0i%25t8t*-ms_jdDHo#{Cf-&_kOVSXUGSa+kECx)ze4Z|OSza*w3;F*X@vnfD?i~4Gw_jxKSSEjzVeG%%@bU5|Mf}NN z*=dpuu-mCOomujy8^#XntCF{?<-@=i6rT|C&!+hBZ` zc(CWW30`i#+&shNnJ_$S$DL=GH@R0B<_+%(!{~o7!XJkOB3l1d(emm}_XOo#Ih?B@viLua`h|D%ij4blO7*+(nP8l4Eu zTvd|1$qnPG;rB*-H(2^Q6rQ%b{+A=27bEMu_&lm>w ze1`E#I{EQRI#oK}5b0bXjGYeomw=_i*b8<$?=zk;6YP0d53jiW@~?~VhYWvQei+AO zGiTUshHH)ZDdNH2MxPPJ=5G06e3K5%2llx8(GkyB3NE*MitocKF5}XZVCgVsg1vA2 z*!UUp!ETf1bLcZRg3C|Vk0gv;;u+Jx<#s<3)|eLGBp&Sc!#F0sMLf8iOiHE-W53m~ z>({|6&vWF@Fr9_c0ejw#Rhaz}UYGyQ2rrNDpy7|n-(h&C{7@$rx77GQkstciI03_+ z)~O1UR9=5yd#&;GRd6{8N^X!N?q>Nn z8vdMo$^%bXLf;U+N0>1Dlk)EaD=qpqxcoHzNbZ+&oo|7qL*E8_e)btp-v)cTJY#%L zKG@swr^Zi_4|e^Z!z(|u(aT_^RcqMO8V`R|a*d^1IDT)0`yzZjm_kYJmP4QR{GQ>b z^fmgkWPpAOH7A$1iMb?d(zn;Zk6eb zG3+{jW;{gz`?xV^`~>;n^3(Mr`IsDeqkV5Pe6Re!1j`6*1TLpglF!Paj}8vJNB-Bq z($5(#r(z@z$)WR<{NunX_?#k}%Nf2h;s+vpM}$LKrvIIYr|sP)|M%(m-4VVi!uLe@ zD~8#l;X%X95yEw!!Cn%s`%3p1<@q^h-uh+HMU&2%aZyAH>&vsHet;Z5>G-C=wKM3_G6Jblsec;Twi$=3o* z7aUWkjyoe9#%<~6$88KqhK<|Op`T2aV@-4N3-+>4hnLQI@@a2$C3HR;jykGtruymTlgWdjs@tkL1xBn4% z#r?GW@C-_E>9b&uy8|8Z3&n$dPWv_E7l{X#&lZq81TUL>{q?ZvFcyJ*PWXM}mx>2_ zT0b>@nRu|@YrF(6o4=F)s_C>#2kd(t{fFuBMcMC7r%O6uPnWL}DNB!du&2vAd-zr2 z!LA?rzXqG_vQejFRfgwBxG%z?ubR$n@N{em&yPGV-#0iu5iA|f*#!|Fu5sea#P^zx ziXYk-{V~FuBK@rq4r8YBkRLOp&p9Y6U*3tr^i?Oow2Ipqo`-;%n=86`!kGh5)bx0 zJkErdeZKUYYdS5`0ejp_jpw`rd!G;IwbEKB9_;=6edx<3UkR=PONVn1?9Z$|Wc(8G zV1H)yad^euCO=%WbhG;((m6$rJ$}Gvf$2PwOXc8yBtNvT@IMLn8~=j*+YM8fI}QIz z{*#8W`NIf58{wZs_{9jn6yaY-__YXgZjiUrqH}q}c ze-M7R9OcCxm~jE2?yyfk3jJI<6^6@EmT*7sIvc>!;oJoK{QN_a&Sul8k`FG&pd^eH zmezKKv7=_qfc@GUu5qTb+jJ($2bZf&k#ES6pM&zhW%xJp9|g;1&am$jqhNkbeCjK! zxCq5_OcoteHpi5~F?n@No*d^QJSD=l5f;p^tsl}I3zO7iR?iBMV4nmfIl1iHK$%Ri zLxW2==Y5U!Mlg{iO>(|YI$>YOKa|VT3id6nkWWi1*tE3f5ZBUb1s{twd&g>NwJYpt ztpZzL+7RKJBD^KS+akO(!n-59C&C9J{7i&ji15o1J``c@(L8Te5za-pF2aowZi(=s z2rr9pPlWp-+#li15$2tO=jZMS-xuKrBfLMtPeu6o2)_g_QK2QTM>y;OV|>^H#xQF~ zx_;OL#`qZ#-xT465ndYMum_CA4ST>Cz9G^Hd%zffd&F;#FwgBhKM#PpuuC3^@Z%AF zHo`xT@WBXYiVJosA{_RBG5b>@zCOZpA{^GXH2ts#jN$f3XH|s59x$eJQ^bcoVC*?Y z*aOD!PIL^1Jzxy)iTDE%4tv0u&I=JA_JA?|P{fz1?%h7mm>uULTo>WS2)9IdQG}O8 zxF^DWUHU<}_K>4ZICj1POj7~UW0JQd;RBOLaCG5xRyjNuZsgXbsg z0b_jF1IBRJ1IF--NWUq<3nLu%fHD2B-k{;I2aMqxBK^S#-yY%Z5e|F6SlqA&jNwNj zov;Ut@nH`b!(k5?!v`b%OlhI)VGkJ7346d8o)YPVJz$Ivd%zeDd%zeDd%zfOkK%?s zV2lrYz!<(M(g}OO@X%2b_JFbb=&%Qj;jjmc;XTAP9QJ@Q{7l5Z5aE|2d?>(+PXP7!G^D7!G^D7!G^D z7!G^D7=9|U`Fw=K9x$d8_JA>5qIU2yhCN`64|~8EX02J*nGxZp2!}mjOh4=aW4J5Q z346d8ANGJT%-XYV|Mm!P2isgO>;Ypq>;Yr=kw_=(0b_jF1IF;rBb|d0=HHUte%J%X z^jW9U`6&^ukMNubw?=qLgxe#$D#EN$>-KMo@RkT~i}20}?~d@E2p<63eD#?Kv(Bya zFGu)Lgv)f^xDL12;UjuyCZyGgddDBYwvoV zpNjDF5q>GcuSd9~ybyOxgeOI~Ho`L^%-Xx2?!pK!jc`|l*G2dS@R($5`9t;`(r4*w zmup4Dwq!99eeln6j>)zf(f%`OH9qe5mDbw2dfNEh`VWlNyT0QOi*Y3F!hZ`KNlW|A zT&aH%Sh=o8|4XrcUH9@MDHlxIH~B|WPCj4HujDeU{io-K#pH-g87g4TxP&m#XfjWzW=k|C;5!*X(QnJTA z_B4gg+xxO`Y>(#zQ^dKry?aE&_7p4}=<;)(_9=GSKNqB$REPGSjnCTH5NZDI=TA@8E zO^^Js@{RuT{rNuGi-lvz-Ia3Xy}ti(%WP9cuwnjJU@4#yaf6GOMEZy zOUi(+c7v|h-_NB4Zi19NtMYQsN_!kD$1%!Vq4HtR(|ulsuT|K^(`_|9Pj{(0aT5_u zJl%QHi_@*ufWUJg(mhVj(`6r)xEyz?l6Xev;`Xjh*}HRAvOfd%Cds+Izczbbj@xxo z=#g(;&?CKnOr?9D^f9#i}-#w7-@p7JSiRwQt$Drn#{Ew@P+xvaW-b-hw zU+5tAs^#3?iDu7D>{laEP8YXVBRz1F9XNP)@+=m6ljYpr!c_iVkiDxd4xZaPH)XH& zok_i5?*!AMzg%thyq=fpKsx2NLNE)KHZ!m#O=$+P``6yrblq1 z^swDTK=RZ%3Y$F*U3q&8%$^PNh4mqRbKhXDDjmqY4g zZ)yU=FUN4#OONZ0%VO!NOXme0Bs`Z(VEDaNdaY5|^=_6u^3Y_*mPu)qF!`G<$1(D^ zRlwsYn0Zq62D!kP__5nl_V&vjdf4NAmD@uZ!YmHeHa}nf*d@?X;6m9OQRCgCp_J^r4`{nK_;Tlnc8WqcjyilS20;9&O7X`dRr zrMaTq`OS|yswmoYzP=YLNlcNcoz0fqJrxZ~?h_S_)lT6h=%I7PhDT6HJlqSoI0+kRDQ?Q$wl*PGp$!Q+|@d}s%YQTOzXyJ z>PA&Xn@-3yeq37nreqpFi?;l)$k$rEJF|_`&b;Rf&5vaZMgP%J)X&35)mE>V`@upM zP90r3Nf*t1$LVL2E-)(Z1j6G9>s^_`T8FY|-&n$x`k6ll?yYdg!0Dt=xSa6Ogv&zs zD8i!%tMBP}G2tv>^#PV)oV77C{`N98PTYo39(R3kXZC?<-#AkmR+*zi0bVIp0d}pc z%`TmG`3~CltKPPwOR4NvM>STjnAiTw-Z8%{d1l)F?4rLdEJc0x=<(ku*;Q>Vb?Rte zNmB(;p5|BR#|uKZjIb4ia0y{62;rn4fBXd^eOQ}drw`$*VK~Q7z6i}~VTKiaj;mF| zzhG6%uaWz6Ip?zM&QBDcSbze`74Dv zgg&nuonH+pfd@O^8}VT0uZwuF^L+Y=UEjUk+amt6kP>*X>whld!Os7UFo)2;H{!nnDS-#O{{0aTcAn9hL+JBr zmMaGBz6VkQ@8W%oK13f&_a$t?|AibvT(GD0DM$%C*!j;0dmgq&{9g+r=!0FKTT%ob z?EII7-Ohax|F^;j`e4`RGYbSB?EJTd-Oiqf|2ts>eX!TncOfP4N0j1}N^wS$>`4Cb zb&~upCNWYxWM;&rn3+pKiihkB$Z>mdU@FD>>c!eUbbztSucnE4VLp<}hmvnQ>QdpB zRCsYJ+?EQjN`>QRE~Mw3hDsi*`l69tIL-j(LO2s9IAMj9m8;pgC)2Th&9pWae_7ML zp)b>^McA)d-4=GzHq1WF*J$&cE7x>)wRNss<2tsXwrMS2y{@gRU~KJ53kbCJt!-Q1 z*XxV4=&55{lC~aB=GUmPjA_sDICJE7rY~QUVaIe8fsW<>4^F3YOl$i47s~3-@R@e` zGx=~~U@|D-e#`k>gr|UY?L%tivewA7rGKka4>ld82d4$^{+!f*Qt)0T8wKn4WBFuNUo>utoPGR(K zjQGI_e=Nd$XX|nK2FCHHBYanccSiV25&mj~ABZrc1a(4vgUhX5s9VzFf=zXUxk&Sj z5?n3+9fr9`pAMEC`V`ph%rqS?*x|cD`CO!%jn^$(_tm|UdOp$ zUurt!5nTRO{Yb8mLuZZrPO$9IFTmv}ORkrLr!Rxctv~m}EAAHgH-V)?9|wEf+lQ|wDqm>}vf+C`#qn#KTNDx~5 z7zM`ZM6`;Gwic~2qVopoQ0r)`PRBZq&Y-W;>G;~#>2zkSkFC%Dx9`2q*|`(c&h_-U z-sifWb)9|If3JJ(wb%Z<_x%md=vWc@dj)jdc+4VW zBv@syS3Y2?L(Z*Yp9RM_k6C1#<}nM4X0XzZRa$U{Mi;rUuT{hMgk9Tte7E9N9^Vt- zodJF@zz+x5wUw_INIEB1)oO9X+fjJS(GeghWL1o>1&fbepFnCk}fS{6KrYEMXr45hZlJKl=#IS_lPr=$T#b8#?QUi zB3D}a=8ayb++(|EmE$tfQa*6z82x!lQZXWYvU}Kwo1FYi?)E!sSEyDY=`nr9Fy%Ge z8sNDBUJ&4w0bUp2^#P{M%;r4--WA}-1Kbnf7XtiRfZqx5`vLwaz@;jmTOMtnyU}-N7F!QX**9N#fz|0Y*!+yu`{Q-V7z>GuFc`m>|3h4u>V=WZ=w_fp({BUs3Er3Z29Zqk#wlPpYiRas6nQ5DqgZ)Zaj#(-P z*Lo-i`LK<8`I3<256*w@HG~-dycqnYXYf(|LQlg|WxJ13FR#8WBPF&o;ti z3P(6e^w%i8uzk^i*#8+Oe!29@0iJAIkK&7g=&|OWh3>A9{TE*`L-2I+^jLKJkz8GF~<-yrfWW4hw%) z8aFwS-8+6lYHDp_-4WxT z!#6J(Q8QBC5E`cMAL@Mn5jVR_2d7>)^(YDUbbnlsxbMRy^!+uj^Xkat2Kq4Sg`O=gueVn?-59S)_8^_{*vMx$l>bYfDT| z+R5p&%Rbouvm^LqYH{~dxm@?!DE(b4k{=|0mevR0j?m}(yaS`l@p^o_l(I{R#HzvESVfvoYo~+n9T$J_Wr@r;~!x ztk!FDmtV0oa^rU{M_3oRx(4$^eW0_XE15l7ZI}$(@U9sZ&n0WRhkS2OrlvSCZ%#t3 z_(a{Xs8@Wu@3+8yIdx*2uGTGkMl|r`MNFZl11xDT|nXA*N%9-51+g8w5ITm@GmNfb!TdEF z4vU!n;Sg!SOye~QXDdL+!R$VeU#h?~k9?s5J|JJCkWxUtR)HcQ|B3=rE4V{}We@nz z6d?4$#R|xGDnQ7=Cg-r5avzf9QjS|m*V*k2OhWx^0? zjjX)&5|9S|c?HtO+joSQ+cFJ1w4>$4VLf|S(z1&*f3^r)T9!s8e_YtoJ|WDminPxv z9Ov=BibLcD*2>4}d?0Rqa+=6&4id2bGX|lEv|wwyQv$hDINV>~>lCB(?NcoxPTV^7GT}-|u8VE|BOj-cDph~mV%u4R8)47h%HR9F`u?i` zZXtQ8j_cU*hnGRP?4sBFU$as#Pv`yW{>}DWA<>)v*J_iyEaG0-A6_iUUlCCTtFF9u zvDeDK=0E=${QTz!)-GSQxW5k);JQ64Ovf}#ecN>pH(|5b_GHf`JN=*&+jGOH8Fo6% zGM?;wn3MA-a(Q{|^75E^HT|jpW6tak19QSrlv7AD>O{2)Ca(i~`KUl%AIQfB@(F>Q zNz&{z1@acKFV{rjD%Hcc#AkTCQT*ZnU+FOuKj%eF|IY(_e}L&E95)H85>~g=2(w+iBopuOsMP#z?6@&gBOZ3eyU3JCj#5Gg}K7WX&SJ}mv}jT zf$e<%O60QHA4V-+_-nPi8-A49LQg{(MJ6F zfK7#-L5)L9x;7Z(RQ zmwAlatHEBU%j0Lo?*V(8_jydaJPP*uuLL@O?=k)ECxOmy10AljV6#dxcm2fMISIMP z^j&l)8rbU7^;_w%!>mR}xL(}Vp~s`Woc_!<>?XmW3ic_+pQnh=@LtJ?3!iF=Wgh`@PWKe8ri&jnIQ`Qvf$9Kvh}* zGpAyYU5eS;D;(PERy-uOL4TzH_ESruTR0@sdsafq_i1`RkWM_`ZwCgg9N(8LEXR8) z2Xi##pnk0!zZMSd%~hmXG9$D1D+xk-la5Rz7D$FY&J376)?A@I=JRFRZe;ej?kG348QIv&X$F*khgQNb}+a2t1)j^fIq!{bjx?(oS}uYWaRydSSj7%X#Kn@?|Y( z`F41F^&}Q;(S{KbbpPZ@;3j0h)Nu00q&LB#=noy}&jbt;|No?y19-A+)E7Q9dHF}G z41B;p*86Ou{dP;w(kPnXebZdyHnMHsh}j!e5$R!%^{&}NU)7MOdUeJg35Q9dBuO19kxZX8!+?a-(qffuy^>{9FVyqae z=r8K1&7OUs+>HPE3cvk0x_?dZzfCIMr&5zN)+ucMRL#$(Fm7_9qo!)fx|2FnO9r3R zS-GU{q-`}F_qA@^K5ART&56Xu?I(0LFByD7=bR<;N7gMI(J<0I7{c=spW%6mN_YLM z|7%LKXHGdUH~f@SbGk?On$_IWyLeHqu-nhItz3HLn&oSkt;!vDb#yHzpW^Dam1|YJ zeEj^t!t`_Io;B^PIXPXUx@K`MSGRmE3kt0xrd)Z=6>CqRR{CDk>DN;4l&9CPJ8oU% zhn`hBbI8EjU0{8vZDzy7b0;)Ryz0&5f&GK`>@Uxb^lkEb@v)PKr6;y!2bL5k@>_@atuu;- zHg+~|Z2af!7PX`bw6nV?+LYb$`u?B_vRhtEzW!}%d_BFT2~ST|@o1HN=gF#1?61rH zwOE~mUAlHz?#d;(=}W)iu&s(^mn_KtJb>mvbBrX<_f($sGovXq0V$#_Ug8! zi*sk^>inS9@KwcXgsC2TKg;*-(a)4T;x7g2p{x~wGS`MxAPXO8st-&7}|2d*jIIlK83(5 zX4gb|o>+j;2U}Ub63D?OzeSi$=&ujtynz@(4mSO-26C{;?+|7a`gaC$-d+tM2b=!a z13B2__X)EJ{rdy?LkLC4!KVMsKn|u3s2|SO7~T`;XpZ5OO2)VUz^;06$)Ve9u#`eCG-}ttVQCV3sMk2E*58oHDdc&77-^-?=m8OkwwIbFNwuh z#p3H?@y=NMPko$TP^tQVD7Kw*5=P|r*A@{c{tvPEA;oDGLPg@2AOBY@&iVOpJI|`zNZPdEPG&&;ddqe}Q+@tOHVQvC;_ z4;f|-G0gcJ!<;uT%uHm@dUD<+=}#);z<$!H1*^Y8bqaP*0(-9{yD3q{3LN6nfob;HSZsK;8=W)8{O(w=bATQaF(-qsOj{oLCaMGExW;b4t=Nz<)!jr_3IsJ*66s+D_z`ovGeR_RYpF^}!G+V*!%mw>8f!TF` z@?~Yp4Th|c44)Zb@-q310K4nXJ}vf5hy9LWst-&b(IL9Sr;Ag!$eYEfPcY@kd3?4w z`#%*2(YVX z`9r;e?Oqi6Dt^KV_FN`?6(2aVaCIx4oMd3TM}_tyExO>0bfG2%(k>LIEzzm-*zSM0 zz{~0TV0-S6Ycc3E4#0NJeKm5~{EG6p)?;yXR&DCR+r9}(Z}F-I{^f@Pm_gEM}vd(O)lqhPzo;8ibg5(k? zI0AaxV~%?M#p9oezw0qaJ-_hyBXI(084oT9bL2RMxO`)bg3Sl6WuQ;LbIvg3D>oIef8~f5{Jc2WR-n#-F$r%@5li%p& zWDU;v{Y3+E29W491u$iw4L%}zUV2%8T|e~lhrPa-d!CoHl>K?+Ugs5$|A+WnVChf~ z|LNsCkDa28B&Y0dzVc~ZAMjX3aypb3oKd?&q#-Yk?2ZA;4rK@1cSOJFbvVka^_aRJ z>G51~*A_}k{eZ3iGznufCl0p$(<+P{d*Dn?f1-H`$m=}LR3nXUy2j7Tg%>KILq1?j zd$pI>i-YZZQ`aL`TKa&S6O?wW$Ch>jI+8Pf!S;RZJH338IN0>>LoS;yia!8W+9r>! z>`!?){Sj%c)vevb!*QnJ2?1^iFzX4^ zxj4Z8$KI#p>%rZpXL}p}g)sB`_iVSv?%8gS-Lu^uyJx#S<{476`FMbP0{lXNUkmU% z0e(Ng9|f3ae9b=ZhA^B9@TdTP(!E>Zjaa9+*D&dNZ9g|@McY=lt!Z0zb-$ba`383; zqVK&~g?A`@+6`Hu6Vcn$qw^X(st{#=n46|z9)@WH-wvBN&{6rq)c*X)VN=@qli%A7 zT0_-OH9h6eevTDZ^XADgYrs%%g5tCDT7@*Mkx0|zx7}GDz1L=#;u>yl8~Ydb{h_^1 z#d8WqmM`nL(B3+o23{Z;_K*{>cdbHbkNw1a1tYU}l?0)^*JO`5AA2Q!8}?XdhW1=U zG9$J@cPM~0gd(yHvFLWiOBFs%?>_0o^KJ9CU{;Q=d)$Ojbf_}ASDJFLOSgJ?QW$%* z3$#d)mm=u?(PR4?o>K=9bNe1Pc(QzdtT?#I%Xz+>d5(OKQm}mgT{z75r_!nQX<+EF z{aF3ME#Is*+@-h?dJyYda1#+oi&kqlHDNwq?y1L~mG^!n`WE`0u)+58yq@JdSM#@B z%|O-iJx6+BzNLfp(nZw`<*o91^p~aHUcE51T82kN(EXDqVYUAJRPN+=NsqB)gbrl) zg+(!a^Hh2{i-?=vO#-2Rj}M8CpYczw=IiBa(z7&}`8oMoAr-f6n_~9fkv;UVCz!W~ zzN#Tld~c>nZOoySx`fly(C>2}*D`gIkwHSsmo`-LJPp%<2yb^a?6+|KoB z?=T)SZsORnIq1{x<9h8Bn!f zt^E{b+~mZ}hCSVh`ulP>yPKBmRtn=g?_Jluvpw3jv*wZrWYY}`FWFi1hf%Cy;U6|E zys=^7AMLF1iVX|f8y4Qoy)Cj|^GdRzd3AI1RmA7cI`7&sr{-3#S$yfLwySmTmcDy) z*_y>`aV-+$@&d2hM^D!|a(WE0P49lxSB3I6CHD7{OE#`LHK?)V&7v36-_}m%qR7!v z#V;1`c_q1Xe|Z#F?B3i{dv@-xkK%LgZMtaAq|&a63zM^setUoU%Q|i>dM3TI(%&#L z@57^B>8_vs*U=3>#olPT{<}HZd2~;E-Y^pK@pc<(MmE=+IHR$-X4H(v_ZurFRy6OQ zJw2btf$sV}_cqB7%cpxrZr+a4`oGN`*gsqD@9g$j9jF<(XaDS-2mHM)iq6?T`}tGq zAIt4LP~wYFGxDOw12rc)*^)@6=<|&##(}A(b0RvUBwgtlZM7RLSXy zO;e_~JyIH(ys2#Ij&)NfCR!&?ulP-J=38$b(b`u3Y!99kMH&yC`|6P70o^}yV*Wmx zwBBmndhQ!lF{$2aomiMo%&)lUg0qjZgA+Kb3uF+Mi^t>u1v&$`aXk zrl(BM@JjNvs}7{E+LK;gu(m<&r&UR(myJ$;{(awPXRmBqeucY9Yx3&VEp2Ptlp*!^ zW|6u^*rXl%%e#`lDf(HOH-GHuJ|pc zCuVO@Rk#W+cGWx6H)*_Xbthd-;*BA_YF08$`@`mMyt`pt#eW`OK50~#XUU+%n&QNg zV~Tb+ZYWP2C{BhO4<3~mwr=Aw71@WgC+2qgdX~KbiFFk>oPWU+<-Psaoo~Avr#+TB z_{zr+;L{X=%tz2`_~Yq^KPUO5xmMN$R5{%WYD5Gd(HW zd$ zot4{@bv0cTCsc137;WDs?arF*6*Z}BS9Q(gtnS`)R!m;k&{ciHn3B>y>Cc$Qps*oP~Yn4PIN3xgnjm|=M&cd3hzR3 zy6%Qhr5Uz4o5}BzJ5vv@>v$#EHGEWQS7T>t#NaP>+?(6f(KSW!^E&Qr+EjBwdQ$3y zf$qLiH&I0QmC8WR969W^6wuQ_o?XHCthk#+CaR51Hd$M}{`ENLA#X?};s%m*DB zGrKx8W)yun+uAYbl}U>J?IfWe4cpr>=kJDfcFcKom}Ebe-ok6$cL63R8Wvuk&#z(O zP0b6xqVe;4f3ph<8)$aK+(Hgm?&G%I*2%_M@I#DQNc$B>wVs>Y^s$rl+sMl>3rEA` zX*kr!hRH*W4<;u+!}wwte+-8@p&hB@Z{7T|Fl%!-WaR+cZEPImp#z8d(^(-oI`B6Y zY80l)5qv?vRe9{;Dio%i~=^fFa;q84^lw>M+%rl z-mX9$BHyfFat{2fz5JWvTo6HrlmDjk1L5Pn{6EAYY=WtC^f|DFkb|wfUkK#jl(rLc z!n6x%YXcoc9a;TPRt$YOgnh83Jqw`-xsj!%yri|hgU*o(^$O(6B`n2sxM&56IUkK*+&5H{s-)#3AJ1V-(Q8R{=r}9;|@;FBKr<;G-3gKc@g8 zH?lHPo|FO{>Q4th(Sbw#=}eRy9XNyz_*eyepdQ!`o~r=$XNSIr9vtdVhXZDG;81@$ zCrgfwadhbKO$s#%S1CZq!PXzHK`83aX0_zlghS|nZH$u_gdA-0ct4?ivGXMb2z@Z^ zh@2f6gdA*jauY%ka~_Ab(WB%J{f2gxtvb198L031bHip$|4Y zCm_3Y2z}ZWw1U6e#TmL>T{kAtIFS^@c3s(_-6OWAPbonlT|uGnN5H#G5Q4PJBTu zZqqJewy%zDXUPFErB-S@{JD!o=cOyv|M&VhjP%dN;y;YVf9&Hd9V)d5`FU(ROA{mP zl}XQt_zAK2)L8t>K2Fc7)Ofo(w*8NN96u}doXQR#r)N}Z{5=-a=e!U^PpZ^-d@Hv7 zKYg5CYo&HRrOZp7@b~Cgyw=CrwNz@yIKjv1X_Xqk=lVG9QmHe%3w@kjM`dDs;szgQ z=BU*8-0I_ugi4LiZ}>P~ z*&UT%wHlq+UbFbJE7vU2`OLNXPl#WmXH0u|ufm$eZHv4aw);;+ zU%IUA>SdR@&&~MjlB@HtRExynIrdB2R_dG4-n{?3_@c%7w9R5}6~DUAz2p9dbFy2# zW=ZdKa(mI$%i1nqth2Q4Uh!UKR?!#BZ0{uY<@iFV7#<81oz>TG)KY<119w>O zaSr=_nNSP%`gLHhGb+HiZu(;b{Rx52qyRSsm^sL7wgz}sfCUptzf5uEJrzl`1WYzY z*p=5~SKiYid7nDO5s@peuiKpBR=2LaUhc|k>t%E}{uenPe4V&DKQoetJ|IbYKb^k! z&FLS`XD@d?d+gfXV`sBD%FE%F0Q+^i%gZkzTwcB`PT%jhoK7hBZR+G6yR;s=a(V3P zHdsR1dn;X9zqE2`J$7k5c4<9!W%SsU(PP&x9_Qq=^$q90FPFraE1;pf+43I;EW%qtca0QCUC~r?QAcn zd|;EapRMA8wTLwf7~eRx1;(F;JjRFbdrZD9DmV8&eMx*qfEnJ%SBO)6*ufug#`jg$ ziOBH>obhc+v5`~vV3U8z%X8x3jBoezkt;7wl`R4*ZLK)i@>=KRb>d*NxzWo19GpFfK)UAO1ABa{|UM5Q-}ZT@qdWF3zmM)W7Gd1UQT_2O@5TpqfZ|OXZ*f^dZ{8)(HRQd?>t5P zD6r(zE!g_!@m@|kaK`U1n4U;GS)8FrTIv&Q^*I2!67CbHslW%t&k68~0AJ%V`WplJ z*8}Y8+1sf>?hi@9)*tG;K1Fu@M>>=XY`(D#f98m@`@xQ)4x5haR}yZL{6chuSBWnK zOP}(BO@B3V=`d&f5m-9(C9vsiMlPLu#qR=3hdu)~oo^tQ&R>du6D%G257>05BXstQ z|CPr_io3b=3j!WznhUtF*DSD?v(Lf~c`XX$OTC;nxgn6>wAK;4vydc1f0=z81D+9bbz-t4%F2FYixIMt@1Kb(l z%>mvT;5!4nEx`8#xI4i22Y6S29}e)N0e(EddjtG*fO`V`Y=9ZARh7}cspyXTEOcF!Am?4CFBcmZiy*oxfqMjpH8jXYkD4wH?@J#XZ(d)~-n_q>tT zOOSis$m1T;dhDJz^4L9Z>__+Z8D8PpT{9b@R2yl_csM#+M z@UQ^a1$bjS(s!1sVzEQ@vp z`0)VufZ17zUI_4O0sf?C!>D$S3IJFNJ*4 z1Bktx4;$IN>%G_3=$e~7DcEaM(C+;_G^l9}}(DV)Bp9Sqz=Y5p= zx>D$qeYe@Qy2BNt&{y3Q)YpJl2rk_n&Q$y=p6mT5^(stoE$=W}`(Dxey*=xi(_F3P zr#nUxbLY4@W-`*Q*%5~y;3gN-d-;!z&fU&Zob+sC$uiZ)HRU^+t$%`%*_$juXm6B` zbvPcto|Z^?dz`Zi{p(hIl!B4jTP8thZJ_B+FKxdEH$vl63*6X75`ud$Sbpue`fs_HsJTxAL+KGkbp< zvp3hLlZqqr?*}n^6J#$d4gAwk&fEKC%-(#(L$atlX4MA9Ds(u#-zov+`!qf7Wx}@g zd+dD~!=9`hY3YHRyu3x_*dGc}?29Dhqo02$s__Z=- zuU>Jx9UpbGw^VX)6GG8@^6!ug;9rdb+o<=g(!;Kmm*dV_1fI;^tucEq=)8{EtCg%)c7T_gQT?%ap{?gIX-vVBf+BeVB! zF?)k+qHj`BFDEFNJ?;Su>*YtX=MQt8NwZfWJ#dqg>b&{z!uU8*GP8GT%-%b)=MTkQ zO0#!L%-;Qhz0rZa1u=W?%O3N%k=gr$n7yZEZ>5wd@5u`0-%T-lE$R^du*{h>dz_;H zH#w=!Mb;MfM_fNKdw0j|T`YV4(A1?gd;4N~Jez-ww+%DBCt~@|SH3ph#(F*a!7JXL z^}nCWUc6pt*WbqSour-Va3dX9o2*UI9Jwtrozpx|gH(Wv{>fH%xk@ zX^PYm@5mnK#jwY9FSDl)A@u5hdrPDK>67K_Wpd2kq`K%iaO|BH*jpI0_m1qbelQ|m zs3WHLp7f?ho7}(Y-6Q~R^4r!2`JN#e+o+fO1j2DNR*Q_BOu+3MjYgN4b zzE?1Dk0zIi8e2w|FKehkoLH@jTqb))rnhkU(krf6RrqMor@d=p?6?VI>vPbjziVPE zi*q@_yu#I%e@*-}@$ttWpXs9hkGKL$$UfV=%x&}Pj+uTa>kr>iJN@?Krr%y0--eug zn{&4-7~gn332sJu$R1(>T8Fr_uBNoi!r{5A00+q;6ncLtX0l#)|QK zstRBH$yVyIgKXsnSu($Mk zrww~@(ieyBzWw_j>GAg;k9=2;TNlZS-bHZZFZ1^Nv(TM2+lJpgc)*gu$Gevp=>Chr zM?I5&_k%v&Q@ z3_PndwQ+bh|NemzEf%*m9Qtm>^WV>wPE95DX8)2@FU;J&H&wr{=gGRCVJhQ<+jpg8 zs(yFR&V>mKj%!QoP3@}OR@2$=TKc(xf1i47`1dQHYyA6~?>GEq`k{f_hj%qvz6Z4z z>g-B&rXCnvzN_Ij-E+3>(DsTQJGKoNbm4DbkkiiI0Tm>pymH zQE+9?+y29m-6J2%4X^I*uH{t=-CcKVviv(6-WXg`Mvc&hQ58;AOP6j--Cg(7T@5$u zXhPp3EA49NN_AC6ZsX6+?p(C#p@xS?W=qwsy-YmN`3t4dD+;zN&FE5Dyzy=K+bmo>d?6~Wv17_}9Hs+}(hQ9D-wxlwl)HhY! zuw+}w)+;);etqW$nHAs49`j$PCbLKExNgOY>=z%DsiSw?z2oCecV&kxotVs)eYmMD zkyx<2e0fH8x88Hg*3R6}H)rmfHu|xW(!{pRriZeF?mjiOusgA7yBeu|d-?WE&xVR_ zr#N%pyuH7f_HgRp4?niDYNRHk#xy><*!T6qAXXa>FT8uCvvT~dDfNFoW~+6KZ9T(E z)jQNN9;>h}`0zy!HFQ=^temR-f3L2#t@7@=pXu9qN#-Zt(W0?GzH(aUz`dy_ca`Pe z=^oCk>AIQ|hHFk^3+}4l=f~6wo5Cr| zZTrc%C0v;9MAhZUh1k)K@M%JxO@1~`kYoO+Nvonmq>*1d1Xg@Tlbtkw&$tG z9(}x;L9(ysr9Z8BRD->%qWzYh?2zn$_8oWZxRp^cHW;hhid6c}v4{3mJhivJW3ua~ zJM+12ZS1-6gT%n5#Dsh6C)9Ul>L-*>%$Sd^Pp(S+WZTF1WRH|sIX3UM%~N&IDm(ctgWgT#N5oXEd3DzFiSZ8%Zc|^oY|o0z7A&f+ z|9{3j`b3X;6K+uPm-M`}p<=VRIFH* z*_R!lPl!EN5|wh-z1^MliF8v>_ic&KHzl^;yLCryd&$CsA7%FSY%72D^50lyoB#Nk zVsqTMI;qB}8r65-(Pa;RxS=93bk4}(tz(*t63xwt?2#`fv$qx$20dRWS@JEDQsEb4_1;JYl#W9}f(?q_dK}Q2Ud+GWm`+Z%0vQYSS%U zsa*~GbxU@%8>!#h^ZY&9tXUv8J~oC0JqMG8I=JD8ZAC*jbQSGw zc&@Q?Y&QK!n*LCic`f^T&F-4q!>7EgH%Qi$pHMoqaVCq6eHRRWYw4eSVFO2+b>k16 zS8-8IUCJp^m!`OM_}eolJXBg&r0Gg?Q1OLnwPxepHNVPdocD8CdVWfNU9hWn+uTsH zx9Gy6y2z`t)64Wl$8D+CvM+7#so&nS^~_@2(u`g@bhmS>X6eX(np&J#ma1RUv*66) z+qBnPQocOeT64k3pVSp;n$?S-T(5evKR@QzEE~S`PX=CC%lq4`&NbiZkiHOKQdYSf zg`Yu@YGWvS+uOP3d|OW&|$_L3>t?3U~$*@HS?f8B9KnFrMc9x3kr zyB_U?&aRlTeQ)ET85J{T?s>U%Z|0?c==t&P?xPpf{K_TR<@amH{|IyQ$Zu)qN7F0_sRP0kkSrDVEsWx&iQI!oGL>}X%L^Z6fS z2mi|?EnHUobjHf;;O~t~b#y1*ZM|7*hz;dk1GJK25u=sV?p2wY+y86if!z;Yusb<@ zfRzbhO}Uq`XX|hCqy7AzsIBj4pS_lYlTB~#c(dtQKWB9o{bX=b zW2ZJ+aA=Ot@0Yax8d;KG8>}jOGo`&-{;hVGlzsHP;zj1kC1vkD|6)q-%=ThDw`?^{w4vHHp^v zOUh2q4mEEIYt+$YAB`lLsmZGuS{RBXO&6pus4nuRmz2F_mi)dgKeJBOX{afCW=v^n zsjk0t%v-p&ToD1-3zJR_FMLBx}|-+)9CDZX$0}Q*{OW1jxKv|x9uOEDKkH`uYLZ-bfGmz=eMYB_9rIZHvQfUzrB3_^)EN< z&rPgo*x#hJ@sx?xkEF8c5?xYBM3ppXcTw~H-1N!K`CcS9!sMzIO!&K!Qi zxx+e-uPdsXtex_(j`1}`qnc~litENqIQP_=ngbuzrA{x(OquuCM>oFBZg6Phw(6N( zUDd-jZ5&zDSwWihch?q;YH4mubtbn}@95OQ^RCi)Lq72D`MNhT@!aWc7hbje=Id{J zB*iNXD?0YqcO|o}UDbMJV&r2Vo1J&p6^&}`h}ry&%KcViRjMvMXwEUuq!&Ek$IFtk z+~&X26p&xZX~N5<295ok)oIC`ME0mx_SYZSpVN1H^VOcMT+^NCKK_3uek>#>Odmi>Kk1ktN zT|RGQQD$RDTluRSf4ywPgy9Psd$NPGN7Qe;rM-Ubbybyn_SajjtSj1l#7*hzYwroh z%7o(0>C;Ol9@k%WZBU=O@fANW1pe+QdNY~Lh9hh9Q?@x;I#tgfe!<|1@a=u0%Qk3% zQ0UvH@5Wx6+Smjd8Xsyh2^a7?Y@7D`8qxXLuGjdOoY^5A{t4c(g`9Da0ms&-?E?1&9oPK=|2&C9o; zCgt4|GvgZCy0TTQ30v+xy=a4$4?Xu)?7lZ@=7)z|Qno?q6Fv9mWkXxW*Zv}J5A57oZi!|8^)Yj*Z++uCd#X3}mhU)uj2>St2<>@O*M_@aZm<=``^yyCnWbq98q zKfhlcICZEbG4J)`hn}xOG*ox3Y3o|pwq;@Ut!t_`jX&;h)>L;btll!TcA>=8x6Y~F zq>-K3+0#&Q>X@G06)&dMzpX6u%4#E<#gC-1xnlUxn(Jy_URd3=^X2?rYTn42?9hC? zp}Mm!ovEp5+j@HOoVG1bZ_CuY@k(>`)+I$L9RhYJ z#e_raD>l`%rfRCUy0pU%G~HVKzD|bRksCDNH<|mi|IIx5H@WWb-_p~)w*61<*t&J? z-DSt`c{%myU-;oP@AZMsRVw}ER7dr#+U3j}GH}B?AFIk$+{T8sE%oDiqN4y+N_%5Y zT|isL4>~bB{NU>!%h)5Cs5RydDer6RqN9g4swbUZyma{ADt*sm6$f5UJ@suH){L_h@ZC&$TAF#7+OLpLf1M)-l&|Ll1n(zKL`?+j7cgijGxwUhux6D3s%Wdj1EH8Pq~p-SIBzhde6)ykf!$j>o4!Vgr@n^7W%lPdhz=2Ump zRBt(c__sQN<7Ui>flg%ah_gHRz+eF4SiG}A~;^$#5 zDcgL1XVHUuOCBoHndRc(s6c!C6`L1bSmeBLCxm4OFY`lkbJ>j_dV7V1TQrT4XMeK8 zrT<;!z3a;yQGF@j!)*J#zuB`$*+X_M$Ku8hC%5f!UKN?k-(D5pZgI2AWo2k=#QLO* z>uGd2($1k5H+h_!eakoJ(=~Z+cFb?f&-7<`J+l+nTjsZ$zS)c0iN{U4u?Y@s7JFiHo%9odAPK+v)Q4}`@^Bm;c)0r=zlJ-*%aU~ zuh8ev&(IG2$9xO(I$YXifqrNw%=d749ZnwF`CoK$|L7JCPFCse1xNS+=2o*B zh2aViawAKtGb{6*yJM+ijad%exfk-jeL{><;70D0)*Vid|*31 zz#(+NLp+}(4j~6yUXu}ukb_M=6`=?@*yJ;X%{Tgm`8Hb^Lf^=ItCRrWjH5%}A&!sn zdf?sx+Twdkn7wA_A5TDX;w{!YI|UaJ6+7W_E{ z{0#j8b6Xm6>W6gTa}=Qd@;y#+^x#l`Iwg{$1BcK7Tl?mOt$y&$@(t@&Vn^04pC#Y^ zbdZrh<+59Hz&Z$V)Sv%sH=j`IPlxe_PJ9e9?~$IeLZk)jPID&@`-w!3tcrMry zzg?X1M%pJ7Aku2+vR#xr@v>#*3%b$sjy zn_%@U$Xjt=w2NCnb^7D!7uLa>vw4L$x4xrKzhb`yeog_xCirv(|1+T8)Bb+0ri)ba*-b#LI=!k)TBL6!F-!5T<+zI z#3A&-*dQ!XFdxG9mDo{#byBA-SUJ{1TG3qZb zn?soMtXw(au?pCvjAnDbFw~#T{^kl~HV=#vW;|ds-oCY7zDPW!fPL!C#&5fDR)Mti zNz?hNu(iwm!sh2LVW>Yp8MmZ|S14eU{V9Y#nDK+0I){*hZCo%$Amm{4VZE^V&?yX| zV`TOJc?s|VZgr0BoC5itp#YH_58I*tu1y<97e;3K^)sw1YsW_Eo6qzSe8gw^ zDnuO2yo0<=0YVOD93sD7VT#93i$myut)Ki**z%%3TYq?0*y{P`!VqbVtWKCuQVMVg z9kAJ9od6*RTl-!nOgiL?73jzKe1n4Z!wtgLPaYDkRzT-@1@r9(!cc#{)k{tu@Dc^m zj#Gg8)4yDD^x;+~E4?mh*D6@P>x7~H?66kG4&3aVDr|Lrws406HmU!#0(M?eC|5xK zw!%>!zc0>qd%LZB}Wf#J}(f4`qQUg(1%-Ij0?-FNf_!cZH?rn2S=w? z!TLaatXcn@CmjfVaG3(O7AV+QxK7yWkUD3alE)?mh_ql!d#A9C-_vevRT zoi1$lX9!z+S%1XOFDpQ#H8T5@5&Lim9k8`avoPDS)1m@u=)tZ3j}(Ub(`U{? zA8!7WZ?OV-QAUWgV3WuD3A%*&3TEd*VQUwgW3aPIVVDB?T?!C#Fk=S!_Y};|bHbDv zIgj0@#L?%KlgJ45D2tGTDL?XgfgF6Lm;be}&9Offrp?fANEPh!8QtT&{6b*}`{3in zYZTf8Ihgql`BTDdLjP$2v-1{05pwWM@fw9unhdRO$1pL9&;frz9Gx!-Qyk>8g$H=~ zg@Hbp?dZ1!axe)44pE9Bchx*fD z%%TH_&;i>ThWWwD)gWy7vX(O(&KnXtvNBdFh92DNg!vWf&z}m((T79-U7g=G-`}@> z*mhPA$3{i$w~U`v-<#;o(r!8~$kJ|#4C7Z7B0}lJ)v@?Bu{cYY0;Sz@JdEE^hzRLH zoLKxTv3Pqd-VuwhkHt5{;+?VhrdWJ)EdJG4d}}Ozdn|ruEPhukzAYBt5sTjwi+?>9 z?~cWH#^U$K;t#~)yJGR(vG~KW_%~zmM`Q6lvH0V$_!F`C-dOypSp4Z&{I6p1o>=@q zEdFdPelQk)E*5`27JnfYw?nH)oKCzH+x|){{-ap@)mZ$sSp4-^{Eb-rA7gQ*)B>g5 zlo!UCA_|nwUs8x<>0VC}Gu~J>6eyiPJs-)^ZkHHt=Wwh*>HIDtlBL}eFWk=bSfI39 z!iI61(j!^g9WI62hZQ11pZ@)^nwWlVEN;8WNStjmV)6O0_(ie!#j*I8WAO#C_`+CxQ7pbB7GD;NuZYDt zR4Gu}U4{wchYAs)bmFa8{Owr$9k(blVYxtwMZ}388H=++hv>PLIwfB1V$mP^bw195 zu2QFk#`!qgDs`&XS_FAz;s^PY|BSp!&1W56pM_JUPQP#v4n^@Fx$hDXkMv(ne1nK6 ziofQ*Nl=Kt?%usmoJC4y;tlsbjzV1XnfqXs|8A5%Y~{Wm6+NKuzsA%{sGHN3MKu4Kv965oYlU_$vq}+?`(B=9sdy}uQwzek6l_n{g!HT{++YnBO-m; zJeiH~@2XF#BnCVsZ!jczWq^GLb@n-%CvyJya*@5gSJe6Ab=VV_&raXVoxV@&^u2wj z?>j$z&C10d!R+S(c`euvCdP#2#SCusQy=IHCX#;l1N-IHD6sDj z_24f=I%C1!&k0~06irgF{_lJa`-!iA^bT8B$FbG-C2!x=m9Gc3^-3GcLmbX;ha3Bx z(GWTNzPzs9eA~Ht^VroJ0#Q!E-oxwa&G&y-ZyvjP^L66tjjM?wS8u)!UA_6f;p)xf zCh6Hc&=TNQFqwGjRSzdb!csA-f2zaU%a!qPeK_p5zJK*c{%nh@ ze_uvd|K6snf8Ph1NbB`m0^ADrX=erU*@1j6*w^!Xu=oGs051seq5umf?3;oP-^jnO zL+_`n!*!9If3xrEIh1Dt9gm%kolPSxS3Eu0_$6xdfWyA8I_&$f!@eFIK9T>3lK!xR zDyY)_h~xw?P0v(Pm5RQDC-*C8L8rwRu|;Ee1;BNdPRYQ7p9R@7Wx<%8!r9n0v=~*5K*H7Ieb~-#dw^#KEkey(jTj+^Iw=< zGk)_uC#srkz|+KCA7~Nq*z7oeq;r*o#}@Kg;$QW6l=z)s*;G?HoB@cwu7Eu2afXT)J)nS`xgVTC zLFD>|gs%%zeN|JD7QXZJsPLaEnEWxY^nWb=Y#^sd=uk$mm65T5{)gfWEim2VMvre6 z-{|pXaaS(sY!`mi%c+m2Jw6~#-q?9U9KXSb#NYHdC;m2A{!lGotDpD0oZ^G6etzZU zGL-;Z{ZM^X)AT0-XHXE;EASm4%HrBx_&niryc}HY@htHgFp45@<^~6&{-d<#D(dQA zc&xA+3j?DIt}ZWO>Tjk(mGErww8!Mhm_g1Qf{Rtt^(O*nWD|02;nTYQFI+7-QwC|t zw*)*xew7P&g~V%L05gn2n;%3WlHbm~#C!SayCc?)ro9al%>TN=x~`<|lqwzC*kY+rd^3 z$9p+t1X~-OjNJQ79f4!{v~FCeQAq2?_&EX|TU%5rUL_scj{2?o zlKw=l-H%Nqml;?BP0i-Z~K=+M>!!Lmbn!8V6zv(q6hcF|{l==y^& zeT1s1B14hO*W;TM=X<6;XD-7g@@K)agU?{=pVS@SI&Bem z<6RgX{HtP;7lF-B*LKp$*PC>x6Y9{$`v_suQYYYye1JwNkQZsEdYluV1(rVffXz3T zmmE}AjQYRu9|*fXIY&U``iA7U2(MMB^71aQF-d%&_u*}+zpk;t`p(QYW}=jRECTsumRo%sq?UVb@P z@@vK2I1*MCQ9qXsJ`YqdpXnCpuNNl|@Mv-Dg6T`x0y78R2$miE1e>3(e!dW`3r<7F zV^@d5`bGOw8qwnnj)`g%swBrZupM{QAy>jP#2dlVAzyGt{y?rjNKPLBo80-M9q9#< zIe$EM{s`y&IbRB*N`+qjNZzkMN}KmbI&puPlBy)fAF%o3#{Rs>W<5H&=)1;l{0d|9 z%U-@wd=psu&~61V{`@647k%UV1&?17{|B(wA#Zf@?JhZf_Gx$Nyes)w1@tG0Q(xeV z#n*a#y*NH0XWTsKG3mbV@zdh?fzC_fZ-bRDzJRTtxHhehZr*K1NBA$q7kK>V;+I9tOPjs>Za?*iqeLfz!&-WUSZxC zmiQj9>{BkVm5cHtFBb>fKKfZNuM!8_{?5%I3|x_$Lu4PKoP0NzKC%p~jl;xCz!&OI z1h%!%QNrlBwgOA12#!vf{zSD3$f*;s?bAmgSK5{0v?V%}3!IS;&?E)ZX#q=zGJse2isUyvb>#zUT3g4*v1I+3-&25*y<{W{388{#wk>(5buk>5a0}0Iz{4O zTiej*(f>f)%?Z+>9>BIXqyEu3ReTg!I@AN$>cQ2IbeMOWy$}m5;OY;z|yG~2WOa6Mb9gk{nx{G=rxu$7UftvWuMpHB05mALC;k}niq>*e>0Z}j*saaZ0;1U$B~j8q(( z>%^PD(xEJ1%l91Q($O>?tucfb2)n*2e1>p`0y>+->4#wYpqopD$)84OSqne$hD!=~F+hO_@|gcx9hwdf59eS@8!e9!5I`pu8ov0^+P+6S56#k zI`<&=IuC%QQ!5U(HTgFKoxNU1O_KndP7iX~;X#GJ0n5%Paj=c?m%Yxf#s2{;9qJEk zbK3ul-23x$uQOI0Y;(?k20AI_hn)$Mfo*?RhTPjZ#_LRy4%l>R0-cc_AC%4+9`kU8 z-VWsKH%Sh*ef>FJhlerHv%D?>%bynMgH3;-*Wn?JYrRgZbif%ZQ$&4LX|QTqh}OEo zbA?@hULYU>+qiap+v^XJylO$zZ^0Rr9jZ~l<`{7|juu4y7Hnhi6t6QwoNQ~VzCgc99BekpzDk3JvG4qE6Y#i~|6b=9ZL5+_kvQ1)#a~1&9qPvIyQRap z16y7V=tz#w;Ec)((cZ}M8EpE*s}|}{1h#p5kZ_eUqHc0v>EI98>XW9b8XfhwlLGAK zIxj!p%WoB5=J5^U8$5n1ok;u@_%i*8o>jo+TjFk9NKU>3l98O7^+$Vrra0fULjPv* zlT#7qp^kY0zRBYb@h1cMKYDz+Y@Vcmo$=zcJibGGUVy(G;3WaRBEZ)M_$vXvCBU5l z{%U}~?lEP2Ai&=Y@M8gf(c^yF8Yky9|_a{hkN-r@zcOcOP>K- zpPYhR`m_=AH9GVWu<0!FI$h#xz|x`rgRPIz-q=|s-VT-yet}Kr4&>6&GB~;(A)R3! zTVD5h9Ujtn$m8e49|KE2=W&L@iuNgBllpuKES*|$aE6X8dQHJ}-UUmCehs#<^UFZz zW3NLNU^{>1&PggS9y%JRfSr162WKh-M8_hR&b{)d&SM^2p&ujXL8hf(rDdK6+t^>_ zb$Fn~?cb%(LoD=r((+K#Ca}^n|AVdGZudIW!w#>*900cc?DxD54?(@)@hjp#^q7a2 z{>@{?*8o3u#)?;hm2Z=5f~~xRk;^w8MjGXDoA9|Fw~K!nth6mk3%0b2ybcd0t@HRQ zVaBktDSkUxX+q1$w>;)SsekZzjPSpJm3EfWf-T>ld7Yc3lT;ut9$q@a zV;<0|1YZ`NBLZ8#gON+0hni0C_%?CA>4y9**`5NvEZUcWZQpU1m(Q0!U>g^I<>ePk z4mSDsynKP=V3WV<<%=W-o18fUA6^!B`w>mp>>3ykRUUJw0Im@)^O&*V_D2}>I3qhy zsY2Ca2OZAb7-8m!s*@wz%th!FiG!_AGX716agGl5z;-QIt|qE9h*+Px{pJz@kF8v8 zzb`rV-I{itQ;E(SEG^(nCc+%fRW(H8%k8r~EEA23uGhG>1L~^jL6`lO@K(2lSIh!jB*w!b`rY3f5 zI-OO44vjBzI^zSKD zkq+@BI~ft}ot)&L^Cx+Fgy|be7GI*ALh?*dRJX|{2i@G7oE%}fm`FB9xCuNZ!mZ$z z2+sze72)~dsS#cPo)%#>XCg@=5yePOchDUxCTB#r9r?@%cY>KfL|YY-Xa7&?-Uq(Q z>Pi=WPfij-a#TqdxDozrTK%yaJlAvg58zRMMxie^~ zrIzVLq%-KyDW!BSW3dgEq10lBu}sVK()pNP+MylW%Xn$Wc5wPV&wkfBXJzLE>7CE{ zes}${v!A{8+Ry&K-@j+S4hGwZKOEvg;@d*JisETWD0TuF2WN`$SJtU-9*^#94^AjLC(TOcrb;$1sA#3K>+;S7vdb^ST;#%UC5Z4jQTETCnMr1BG60Ztv+KAgi z+(j(&WgYPYp}vp!!4MA+%lO|yEaQ9|v5e88O(>Wnl@%I&tX(w zVsN>^a}BN~hNILQ+-Puz!Rrj(Xz&(;w;R06;C%)U8GO{>69%6q&J4?T*5LC7=OA8f z_+FvnxWQ!xR~cMma2;`0nAdWH+YIhCxX<9t#MxomZ3gc&c#pvc4CePsHSKYOPZ|7% z!EYIyiSp{ZwfP1Y8C*)76PB&g;Do_T3|?k%i@{w6uO}WGat;{0)!;#5o{T_t8@%7( zLk1r+_@u#Si1R|8a|ZJSQS~w6SZFie;1Yw&4W4Uot-Ib`rrgHITI+TgPWpEo#X3^?BtauymKH@M8;DuZhbt}}SK!EFZj8r(;m zALhH+;B5x)G{Km4{G!pZo0McRbI)gVFyv5+{2JbR>pTR>0A2s*{@whPG(*~b4_`Jb6SYyH-t8(d~^mBBRz*BQLr;5LJM4eleBYsSq6Z!>tO!FvooVDJ%xj~jf7m?yK4Hw=Eu z;7qKGYLjnp5iu{6A*BXa8k{hAiNVVZZZWva;PnO%7`&DEsxaR{gLfOe-{3hCpT29Gzm#Ncv+=NepVa6NHRSpG(XI}BcD@J55T7`)x!T?X$nc*x+R z2A?qaw83W$K2LmgSk4?AqZISKd&O~s%M7kExW?c*gO?lJW^k{;eZ=nz%dpwtZ3gc& zc#pvc3_fD;apL!foTm(a!{E0J&cv})?eh&TGPsmD9&%P1oG^Ha!OIM8F}Ta%^#%_Z zyw%`AgLfOe-{3`y}<(pZ#8(3xHK&DZiDw5e8}Kq2A?$ejKSv&=FQy5wIM&g z-j>AU4K6Xb+~Bze*BV@JaHGK;2Cp-CqrqDY-fr+NgZCLcWbjdgPY_QH>vh`Tvj(3x zI0xsFYR}(@D2^LkW^fhpw2;5X;5vhs8{B4aufcu9Wg*XIgSQ#H)8IYC(?k0M1|Ko_ zxWT6ke#79m49>*)ta9cXTx4*m!IcIl3|?aJGJ{(T?lO42!2jTJ z3_fY_8H3Lm%p3Mv_n5)s4K6Xb+~Bze*BV@JaHGK;2Cp-CqrqDY-fr+NgZCLcWbjdg zPZ)gK;IjswH#i5^3fd0*ZHnT!!DR+l8C+v_Y+?q+8;9bn87EBD?*zy2A?ySFCeH*%;50`ml#}b@Lb}VA%CsG^#(T@+(BF! z+OIQsqrqEfWXm@O!&MzfDm`dv9xZQ^$0cw zYUpWyv~{FOb4P1a_egbnXFIa-3r=l1o}LC)b!|sOTl=cEhL-kKep#GB&mX4AD6Mi; z_nL=C=H9%f>yeRKSElq)*aNAd0*&fdqow_!wEEsP!*^vGk+5lnUoq6X!*!gW2U{au z-q>EM>85z6k? zmbJ~T4HXYIbc_}`QeVOCsYa?(To~bN(X1m)Tvwxrz3n68+&JbKOc#j`ADMzXWDRel zu$pQ0QaV>OFO_Rl-EwOLVfqNWx!CX|5+i$zrHxCwQXDW(Ms7=^Jr`L8c!82<7&{luDQ)KXg15bnz=RItstst_E&X{7;Q<{ zc)Omf&Mf9uWmj^iPc9GsGMy$3FmNDjJhVLSXn@`AS-ohny4nVeCh-m z9^;Kdy9f_AA1=jcx%dbX^TzfSpweYGYHHniNJF``pX1#S$X%<^el3WE+6G_$w zfBcJj*c$6tB;o=K?1jv16ARNQORHr`t*f4P_^Kp?-k8#ClFO;(@CJ$4LhJQ`L?qj< zdClt8t({m%*Y&n`_B73C?_8;?92QcX$4W&J=;~h66`nU=%zwUG$X816nAZs}J@D8+ zDT=ALc0BdRBf_Mp9WUpI6B1JjfJ=zrr*L?s#Kqx}g4-{^@+Bk=o)hJ(LCEqY65+e& zVAXArXGTc1er;r4Tq&%Jwwa5fyJ z1+LJc@SpNUk*VbyNQCd!v%a{MndG|`cD8)$5SNax#N*p<_-N0(*nSC*Z?nX~bE4(D z$>TedNYxj&TatWtdVE_X&XF0+cj;_>&m~fPoOfEj2R**6h6B*q(dX~1EMHKa;=4-h zSYQ5@0DsB;;J8gUkNEoo%NGM5%fT)h@RzLb8^Gzt3x6BIGzmD$iR$n-ROBm$Q@&q# zd?aU_isCaKU*Wt|f0V#j`7$zwmoF3P()GvN9$(z>O)-4qJ-!&yrR$H&VaGBg;3#F_ z)BY$$Sj$)L@o`>peyh-qGR@;#Zuq7mUit3u_$tB2ajBwwANKe*gHOj_8H|+ z3SXH=C~gp7QwKFnqktseFIo z@pX*C_h%ko(fm~VaXu;EQIC)FKHYfvmd95KzPaGx{NU|M<#X?%BAg9J*$O_!sVM%R z9$y#uI1b2H1*d#(d*$Q1!*Rr`DBoKi-+J&h!ian~!YSWX(c$xLKll=eS5dwzU`L#g zh?C&k2TVTJTlp$HKE8XLZah!-__oxf`r`wJ?-q}b?=PoYuWCHLUEtIHNEkl%UM|Ag zA6y^OtuL!QzSE|B^9&z<*N7@6`QqSXTc{|0%;P%`KJ8z?Wcz)=<0}E*5+xHm1_wR9 zoCQH}8hZA}LOAA2{+B#HzLTA9Jb%^Wdjov6NKZcc%J;V(AK&Fp*B`HXe3dAa_Qztw z_s<^RcJQU^j~{z{UEtI8kL{!7%L1_du@ii4h*zPV69D2w7zzf!SA~SE?}yxo^dLQ9{?auNJI_>3CqLs-37-uhCd5n z%U3!|`L=p|+*eY|x6JT;!{g&S`pip3@k<_GnJM4BFs2>L_Y(kHzRFSfPI-J)hHtsy z`wx$=Y81ZTcziX6?+*;$m3)62;cPexe}{miNm0x_dx;YgQ)l=Zp<^8DTjB8~M&X<8 z@hvxeD-7R zh3_LCU!UP?Gkn`TzB=$(VP8=`FLoL|n%z#=<-q=(?EW%MzLQ)|;XiGc7hp%6khsmL zht8wb&@qnV!2ON@zP58O3c&L;73KSe$F~!FjWGHt+!{FLJK>dYC-}JTsVLv~Jig3Z zQr9WGr=fhm^!Uz!Z;q0Q9fLpf_y)kY4tkca2Tu7|Q9F;y5h1UG!YZ_*|L-0jH+s_c zTPt>Kzso&7{uYME4Hf1~xfFK92?ikJ!Pfzw<$D;8aparm@eLwkGW06SSLxaDw=h%G z2)^1~2Rq_~#BD^rdi;GGGZL@eP5m1Sx(Bw;qmpk?&sE*>)a} z_LNr_5SuFBogUw5@NxW+?_**|z8;T{zq=`hUWNHmIz2w_f2;l0hj=aDr#wFXMn_&j zAWgFU{>bAi10ROID__6Zv3!5-@$CX%74#}vz8xN4ui@JWV=doH9^WbOVMr%M`M&D$ z9WZ>G4BzV>Um3!Cl5DB^zUJ{|E(wAm*!>i408Y#2ep7=m%$=MB_z%JKw0!>pJ#m6c z$RY5>F)+yYB%JbP;wGdWFDDVkt4c{xzTbI#r*BR5?`Fd{&f`0W@SRDvRQWE0-j?q? z_!?oy^8FESONp)D|0zPTRXAoz-uOzarE!Q(p)KApc$ ziyg;by~lR|eEUcsqUF2I5sGsC$@FJ`3`z~ZF%9|D==}Q<>T+Uh!deY7=K3)oChY~=i!v^ z`yO8vI(?a>p{IO*=kam>RF;c;gJQ?=@@tQezrolAy^8YvtH-wod`DqKz8!E{zFdqq zJAe6Gi2)@OI|j30$218BAnP$HnJ@Wv!YSYTJia0D)gfMmc9bhUz7kw?aGsIx&)}4= z+~ebK9_~TBity0-$NMuLXQu*HpB8 zn>@aC;M4N$fwA&^!Q(p#zTYaD*fGd;k!cbPK>F^*I++ocZ!f~i_manV;<9iZcZtM~ z_^Te@_T}L^&iZn_RKD+ed{qUhGLVOMly7@{XTi4xdh-1hobvtBL z4~ygwjL5eiPWi@QJ+||W@2uA$UPbvbU`L#ghy*SwF@+u9OYoI%qQ}<-zKzU4MEQz5 zzOCTny-k+y0G#s8^!WJxHB6JDd^0@0^-Zbu-}fq+*fIE3kFO7W+J3K!9n1GUk8eEqup}f!%lBQ6?*RD5!;0;96i&jIzF_jSW}m&dnx6u#R%z5&B`-0*dJe1oIZx836#1YZew*nZzPd>cK!{iE=G z+~YfB_)ZwUXFa}Sqwsy&<2z&cerWjIZ;TPnhNGMTAEroBv_JmB%eB3hfyDjqqvI zM_|W&W>gfO^U7C`^6_3j`}fCiTHkD(-)b6iOv6o;ou}$#q%gf8n|Jk!E5xU_9Nzj=4@dZm3Ms!0P5JzytQ(orNaTETb z5S0vIx3okcn<}|*Sf?7`<#5|X_h0GR_4eJ$H~wxBzstO{tAmQ-byb(gGP84n{z-qo zxb~)+FGe>6!Ks|!E}>-K)LaaT?lzB%`IL!A z$t~B$C->YKuU~ScZvYbSov(c2pDY3;@v#0}j|oh@rtBjIYy zKd~Mb#p?ckygfbbYdRa+TSC$#r>em>`?+AwhFhMhir&|}<6wSRm!;3e?_IjCx@%zV zyw@ZBHSw;#U-j2a>>8-G7ZOrk3I2R zth9fAR)0Z8-?r+f=a225pIa7tIqPfBheS^of3W|XWlzta_Db;wU(UQW=Zn%w{ly=A za^t*$UnY>KHkel%xv4fb_UYP;y~Q6HcVAY2@khtKmHFm#iQm3i_mlYRuSZ@fUcaOG zW9aPf=SIpl$EJNTBcxydZ-Iz4gP{ZQ_>OoO0lVd~VRqw#f#>?_hnD`$ z+jVHf`Pp@7#Q9^E&d+JA8G0?V@vq`Lo?AD#qc2Rp^x*h=B5!B@BD?mf^5aA0-;D1a z9Jk{YX{M3fk)X6`>dev&b26rnapP|GhG1#&BjeVNSr)yo^}$cX{^98bS+OghUNH9Q z1-Yo_g1n~}#Qw*x`u=#R|H#{YTYmNQf^4?lf-(IIa{3SEKM`sC-Ow+x>y8h-mR0oN zsQLcta8_`n`qevMIr{G}XQT8w5blY_vZiNgIbvt}s|#Z}{nc0WSC8wje(#Z}%OQ5# zj}I0O9Um%s@T^wauh*LkvxC@@y$1^o_dv9?dg{Ov(O5>3|B9v6g&$g~wC@jT_YM}; zePNWocyr;{;EP%5`{~Vv8G)BaIPu~u@s4j#TWgEXN6gdqm5(&=rvUNN(B|4;_CEzh zS@+z&qqu3@&x2PE7VbS*D)~H`u{^eSFe5oYV$q5fO|L~?j_xR45t>x2Sh455+hc!o&t*#w7Tpv1@xju+ z!_E(Q*hh5oUeO2s8fAxf- z*xrNVO(#fO7rp1l2gjoeFEloPbvTl2PaP9Y!TlMrjBBGio<9@jI6e2kt1m?6J%48L z;@2`?j%eRJ^V@*IR6o8N=)8+%Y|02~Bk`J{TcWY=&2fVb>(`Egl_BHi2bNv6@(URY zZw}T)@4Ne+4G*qre=7FXrHisYclSNdedq2K#p~L}9Ug~0b*KFOP1~OR^k?=J3~QG+ zH(iJI%1w;GO^itYf{dH)d}Yet@11g7i-)vN-ucDsFvIX5a5#AoSe<*}=oqEiQML8=D=C?=MHZ=YUQ?CnCZ_I_-_08-toO=&r z?(N@Ty5a|mz&&Ym`$H;LrOP9?YH>Zl<_EC9IrlJ2esk7@J605Lc;L~8znaw@4aWW8KW@0HXz-guLx+bntEI(#bu)*S z7H=q@HH7lLUcBLz;yyDOQ1E5*@3~$3{G+*kv9sHPU3Z+Bx#D19`(=+r-p&dc_BV&a zVs-BJM{PB~I40Du|8@4g!HL^n8-uKN49dE`?5V1(`|iMCz2lzeVt=!Ae%9yiz?sEB z?X+#r-g)=F@uTq627SwVm%0Pr*JyvFc7IiJ${@V0_SrkPwM~2C$xl2!D#s1MmVw^> z1;Nt`BGc|9N8A2omSdpp$vd~*eqoL&mgC6nUH?6vWEi*|6Gdu{Ik9%A`&)1GOk#dE z&m`uL>7Jj{eK7x#$iRj^4E`J(@m`Bw;JEW^Ty0?N&-BNB=~Htu7G?%$+bI5F;lWtJ zC|LjN>DfG3%x(%|nYTofE3jK{^wi`2+;Kn5dm*xTapF)s|I6k$jx|RP6|t;MQ-c2D zj~_VU*~mJTB>w)eG*@Dss&nhqr{-j2W6g1knl5C|{5FGYTr%x5zm0fdXP%57&doJ2 z(7iYjAb0o#+=furstwvhJ~Gdd3kRl(HqNoA}jV{I5-b1 zE?U;VI4Ca2I9gErd?b!OS{x}}oN?2W6^pYz^6b3D*?mvo#Nj{s`p)&0Ru?ah_Akzi zbzhq`Jr~WqX#V^g-Pd0mubNRYquf0rj-w?a zaLe3JKpJl0PeAUxV?jgpygP1Na%cU5h9$SuFIZZ=j^dv}uBy2gkI}!!dvA zcfx%dj`}%LDC&tzMc-uf#Jq$h|I0>C%r+#?w~Zb_Ct5b#fpcl;Q4uAf9RIQ)ol1Y44;GLOrq8tBFcTI!>k~C;d`5 zmZ1iYLVIH6Zv^H_L7Ru*D6}EI8IJm|z(wGw-v`IMslS3s2=&BTwuwgX4De6eYA$dF z9DR-_^4tPPArCR{mQY_0M_b~%;3%|FQBIbhcJy&K$l1??&tlM?a|L&uoE}e&oh|jZ z!&OW8Y4{wY%bq%-($*8Tr2wLjGma|hWY)( z=!sQ-Eh8Z;GjRuesy=P>#L2oC{T^UEop9yjKZs9Q!-%BcG#kqy5;6#$9`EMiKc!K73GC_3y-FoxL$DT%t}%!a3?0zgss1)h{D z>b`(y!@Sr^Np#qoVoc9vBPG$~p)J%!UGv&_oaPvbx*?fTM2FoWC;!+~Bv8~1fs`uh zhKdcdYf};(_T+}?FHc1RMU%@+sE!VMQpWfzJ$qb~8;QE9nNmc98&UzF=&(Ed4D(Qx zk|@4x!~v+n6O;F806xPvdErG~_)agp$_uac!W+EsfEWIp7v=#>h2=S-0r(96&

% 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 literal 0 HcmV?d00001 diff --git a/arch/xtensa/src/esp_wifi/list.c b/arch/xtensa/src/esp_wifi/list.c new file mode 100644 index 0000000000000..3f5c9a524f7bc --- /dev/null +++ b/arch/xtensa/src/esp_wifi/list.c @@ -0,0 +1,233 @@ +/* + FreeRTOS V8.2.0 - Copyright (C) 2015 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! +*/ + + +#include +#include +#include + +/*----------------------------------------------------------- + * 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 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 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 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 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + + 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 ); +} +/*-----------------------------------------------------------*/ + +void vListInitialiseItem( ListItem_t * const pxItem ) +{ + /* Make sure the list item is not recorded as being on a list. */ + pxItem->pvContainer = 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 ); +} +/*-----------------------------------------------------------*/ + +void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem ) +{ +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 ); + + /* 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; + pxIndex->pxPrevious->pxNext = pxNewListItem; + pxIndex->pxPrevious = pxNewListItem; + + /* Remember which list the item is in. */ + pxNewListItem->pvContainer = ( void * ) pxList; + + ( pxList->uxNumberOfItems )++; +} +/*-----------------------------------------------------------*/ + +void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem ) +{ +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 ); + + /* 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 TCB's 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 http://www.freertos.org/FAQHelp.html for + more tips, and ensure configASSERT() is defined! + http://www.freertos.org/a00110.html#configASSERT + + 1) Stack overflow - + see http://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 + http://www.freertos.org/RTOS-Cortex-M3-M4.html and the definition + of configMAX_SYSCALL_INTERRUPT_PRIORITY on + http://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?). + **********************************************************************/ + + for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ) /*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + { + /* There is nothing to do here, just iterating to the wanted + insertion position. */ + } + } + + 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->pvContainer = ( void * ) pxList; + + ( 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 = ( List_t * ) pxItemToRemove->pvContainer; + + pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious; + pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext; + + /* Make sure the index is left pointing to a valid item. */ + if(pxList->pxIndex == pxItemToRemove) + { + pxList->pxIndex = pxItemToRemove->pxPrevious; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + pxItemToRemove->pvContainer = NULL; + ( pxList->uxNumberOfItems )--; + + return pxList->uxNumberOfItems; +} +/*-----------------------------------------------------------*/ + diff --git a/arch/xtensa/src/esp_wifi/lock.c b/arch/xtensa/src/esp_wifi/lock.c new file mode 100644 index 0000000000000..84641e6651bff --- /dev/null +++ b/arch/xtensa/src/esp_wifi/lock.c @@ -0,0 +1,152 @@ +#if 0 +#include +#endif +#include +#include +#include +#include + +#include "xtensa_attr.h" +#include "lock.h" + +static portMUX_TYPE lock_init_spinlock = portMUX_INITIALIZER_UNLOCKED; + +static void IRAM_ATTR lock_init_generic(_lock_t *lock, uint8_t mutex_type) { + portENTER_CRITICAL(&lock_init_spinlock); + if (xTaskGetSchedulerState() == taskSCHEDULER_NOT_STARTED) { + /* nothing to do until the scheduler is running */ + portEXIT_CRITICAL(&lock_init_spinlock); + return; + } + + if (*lock) { + /* Lock already initialised (either we didn't check earlier, + or it got initialised while we were waiting for the + spinlock.) */ + } + else + { + /* Create a new semaphore + + this is a bit of an API violation, as we're calling the + private function xQueueCreateMutex(x) directly instead of + the xSemaphoreCreateMutex / xSemaphoreCreateRecursiveMutex + wrapper functions... + + The better alternative would be to pass pointers to one of + the two xSemaphoreCreate___Mutex functions, but as FreeRTOS + implements these as macros instead of inline functions + (*party like it's 1998!*) it's not possible to do this + without writing wrappers. Doing it this way seems much less + spaghetti-like. + */ + xSemaphoreHandle new_sem = xQueueCreateMutex(mutex_type); + if (!new_sem) { + abort(); /* No more semaphores available or OOM */ + } + *lock = (_lock_t)new_sem; + } + portEXIT_CRITICAL(&lock_init_spinlock); +} + +static int IRAM_ATTR lock_acquire_generic(_lock_t *lock, uint32_t delay, uint8_t mutex_type) +{ + xSemaphoreHandle h = (xSemaphoreHandle)(*lock); + if (!h) { + if (xTaskGetSchedulerState() == taskSCHEDULER_NOT_STARTED) { + return 0; /* locking is a no-op before scheduler is up, so this "succeeds" */ + } + /* lazy initialise lock - might have had a static initializer in newlib (that we don't use), + or _lock_init might have been called before the scheduler was running... */ + lock_init_generic(lock, mutex_type); + h = (xSemaphoreHandle)(*lock); + configASSERT(h != NULL); + } + + BaseType_t success; + + if (!xPortCanYield()) { + /* In ISR Context */ + if (mutex_type == queueQUEUE_TYPE_RECURSIVE_MUTEX) { + abort(); /* recursive mutexes make no sense in ISR context */ + } + BaseType_t higher_task_woken = false; + success = xSemaphoreTakeFromISR(h, &higher_task_woken); + if (!success && delay > 0) { + abort(); /* Tried to block on mutex from ISR, couldn't... rewrite your program to avoid libc interactions in ISRs! */ + } + if (higher_task_woken) { + portYIELD_FROM_ISR(); + } + } + else { + /* In task context */ + if (mutex_type == queueQUEUE_TYPE_RECURSIVE_MUTEX) { + success = xSemaphoreTakeRecursive(h, delay); + } else { + success = xSemaphoreTake(h, delay); + } + } + return (success == pdTRUE) ? 0 : -1; +} + +void IRAM_ATTR _lock_acquire(_lock_t *lock) +{ + lock_acquire_generic(lock, portMAX_DELAY, queueQUEUE_TYPE_MUTEX); +} + +void IRAM_ATTR _lock_close(_lock_t *lock) +{ + portENTER_CRITICAL(&lock_init_spinlock); + if (*lock) { + xSemaphoreHandle h = (xSemaphoreHandle)(*lock); + vSemaphoreDelete(h); + *lock = 0; + } + portEXIT_CRITICAL(&lock_init_spinlock); +} + +void IRAM_ATTR _lock_init(_lock_t *lock) +{ + *lock = 0; // In case lock's memory is uninitialized + lock_init_generic(lock, queueQUEUE_TYPE_MUTEX); +} + +/* Release the mutex semaphore for lock. + mutex_type is queueQUEUE_TYPE_RECURSIVE_MUTEX or queueQUEUE_TYPE_MUTEX +*/ +static void IRAM_ATTR lock_release_generic(_lock_t *lock, uint8_t mutex_type) { + xSemaphoreHandle h = (xSemaphoreHandle)(*lock); + if (h == NULL) { + /* This is probably because the scheduler isn't running yet, + or the scheduler just started running and some code was + "holding" a not-yet-initialised lock... */ + return; + } + + if (!xPortCanYield()) { + if (mutex_type == queueQUEUE_TYPE_RECURSIVE_MUTEX) { + abort(); /* indicates logic bug, it shouldn't be possible to lock recursively in ISR */ + } + BaseType_t higher_task_woken = false; + xSemaphoreGiveFromISR(h, &higher_task_woken); + if (higher_task_woken) { + portYIELD_FROM_ISR(); + } + } else { + if (mutex_type == queueQUEUE_TYPE_RECURSIVE_MUTEX) { + xSemaphoreGiveRecursive(h); + } else { + xSemaphoreGive(h); + } + } +} + +void IRAM_ATTR _lock_release(_lock_t *lock) +{ + lock_release_generic(lock, queueQUEUE_TYPE_MUTEX); +} + +void IRAM_ATTR _lock_release_recursive(_lock_t *lock) { + lock_release_generic(lock, queueQUEUE_TYPE_RECURSIVE_MUTEX); +} \ No newline at end of file diff --git a/arch/xtensa/src/esp_wifi/lock.h b/arch/xtensa/src/esp_wifi/lock.h new file mode 100644 index 0000000000000..bd5af667126fa --- /dev/null +++ b/arch/xtensa/src/esp_wifi/lock.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef int _lock_t; + +void _lock_acquire(_lock_t *lock); +void _lock_close(_lock_t *lock); +void _lock_init(_lock_t *lock); +void _lock_release(_lock_t *lock); + +#ifdef __cplusplus +} +#endif + diff --git a/arch/xtensa/src/esp_wifi/port.c b/arch/xtensa/src/esp_wifi/port.c new file mode 100644 index 0000000000000..56320c5e56c23 --- /dev/null +++ b/arch/xtensa/src/esp_wifi/port.c @@ -0,0 +1,147 @@ +/* + FreeRTOS V8.2.0 - Copyright (C) 2015 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! +*/ + +/******************************************************************************* +// Copyright (c) 2003-2015 Cadence Design Systems, Inc. +// +// 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 the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 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. +-------------------------------------------------------------------------------- +*/ +#include +#include + +#include + + +#include + +#include + +#include + +#include +#include + +#include +#include +#include + +#include +//#include "esp_log.h" +#include +#include +#include "../common/xtensa.h" +#include "sched/sched.h" + +unsigned port_interruptNesting[portNUM_PROCESSORS] = {0}; // Interrupt nesting level. Increased/decreased in portasm.c, _frxt_int_enter/_frxt_int_exit +/* + * For kernel use: Initialize a per-CPU mux. Mux will be initialized unlocked. + */ +void vPortCPUInitializeMutex(portMUX_TYPE *mux) { +#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG + mux->lastLockedFn="(never locked)"; + mux->lastLockedLine=-1; +#endif + mux->owner=portMUX_FREE_VAL; + mux->count=0; +} + +BaseType_t xPortInIsrContext(void) +{ + return up_interrupt_context(); +} + +void _frxt_setup_switch(void) +{ + if ( xPortInterruptedFromISRContext() == 0 ) { + pthread_yield(); + } +} + +BaseType_t IRAM_ATTR xPortInterruptedFromISRContext(void) +{ + return up_interrupt_context(); +} \ No newline at end of file diff --git a/arch/xtensa/src/esp_wifi/portmacro_priv.h b/arch/xtensa/src/esp_wifi/portmacro_priv.h new file mode 100644 index 0000000000000..51e1572c659b9 --- /dev/null +++ b/arch/xtensa/src/esp_wifi/portmacro_priv.h @@ -0,0 +1,80 @@ +/* + FreeRTOS V8.2.0 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + 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 from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + 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.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and 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! +*/ + + +/* This header holds the macros for porting which should only be used inside FreeRTOS */ + +#pragma once +#include + +//xTaskCreateStatic uses these functions to check incoming memory. +#define portVALID_TCB_MEM(ptr) (esp_ptr_internal(ptr) && esp_ptr_byte_accessible(ptr)) +#ifdef CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY +#define portVALID_STACK_MEM(ptr) esp_ptr_byte_accessible(ptr) +#else +#define portVALID_STACK_MEM(ptr) (esp_ptr_internal(ptr) && esp_ptr_byte_accessible(ptr)) +#endif + + diff --git a/arch/xtensa/src/esp_wifi/portmux_impl.h b/arch/xtensa/src/esp_wifi/portmux_impl.h new file mode 100644 index 0000000000000..9a919da038bb1 --- /dev/null +++ b/arch/xtensa/src/esp_wifi/portmux_impl.h @@ -0,0 +1,118 @@ +/* + Copyright (C) 2016-2017 Espressif Shanghai PTE LTD + Copyright (C) 2015 Real Time Engineers Ltd. + + All rights reserved + + 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 +*/ + +/* This header exists for performance reasons, in order to inline the + implementation of vPortCPUAcquireMutexIntsDisabled and + vPortCPUReleaseMutexIntsDisabled into the + vTaskEnterCritical/vTaskExitCritical functions in task.c as well as the + vPortCPUAcquireMutex/vPortCPUReleaseMutex implementations. + + Normally this kind of performance hack is over the top, but + vTaskEnterCritical/vTaskExitCritical is called a great + deal by FreeRTOS internals. + + It should be #included by freertos port.c or tasks.c, in esp-idf. + + The way it works is that it essentially uses portmux_impl.inc.h as a + generator template of sorts. When no external memory is used, this + template is only used to generate the vPortCPUAcquireMutexIntsDisabledInternal + and vPortCPUReleaseMutexIntsDisabledInternal functions, which use S32C1 to + do an atomic compare & swap. When external memory is used the functions + vPortCPUAcquireMutexIntsDisabledExtram and vPortCPUReleaseMutexIntsDisabledExtram + are also generated, which use uxPortCompareSetExtram to fake the S32C1 instruction. + The wrapper functions vPortCPUAcquireMutexIntsDisabled and + vPortCPUReleaseMutexIntsDisabled will then use the appropriate function to do the + actual lock/unlock. +*/ +#include +#include +#include + +/* XOR one core ID with this value to get the other core ID */ +#define CORE_ID_REGVAL_XOR_SWAP (CORE_ID_REGVAL_PRO ^ CORE_ID_REGVAL_APP) + + + + +//Define the mux routines for use with muxes in internal RAM +#define PORTMUX_AQUIRE_MUX_FN_NAME vPortCPUAcquireMutexIntsDisabledInternal +#define PORTMUX_RELEASE_MUX_FN_NAME vPortCPUReleaseMutexIntsDisabledInternal +#define PORTMUX_COMPARE_SET_FN_NAME uxPortCompareSet +#include "portmux_impl.inc.h" +#undef PORTMUX_AQUIRE_MUX_FN_NAME +#undef PORTMUX_RELEASE_MUX_FN_NAME +#undef PORTMUX_COMPARE_SET_FN_NAME + + +#if defined(CONFIG_SPIRAM) + +#define PORTMUX_AQUIRE_MUX_FN_NAME vPortCPUAcquireMutexIntsDisabledExtram +#define PORTMUX_RELEASE_MUX_FN_NAME vPortCPUReleaseMutexIntsDisabledExtram +#define PORTMUX_COMPARE_SET_FN_NAME uxPortCompareSetExtram +#include "portmux_impl.inc.h" +#undef PORTMUX_AQUIRE_MUX_FN_NAME +#undef PORTMUX_RELEASE_MUX_FN_NAME +#undef PORTMUX_COMPARE_SET_FN_NAME + +#endif + + +#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG +#define PORTMUX_AQUIRE_MUX_FN_ARGS portMUX_TYPE *mux, int timeout_cycles, const char *fnName, int line +#define PORTMUX_RELEASE_MUX_FN_ARGS portMUX_TYPE *mux, const char *fnName, int line +#define PORTMUX_AQUIRE_MUX_FN_CALL_ARGS(x) x, timeout_cycles, fnName, line +#define PORTMUX_RELEASE_MUX_FN_CALL_ARGS(x) x, fnName, line +#else +#define PORTMUX_AQUIRE_MUX_FN_ARGS portMUX_TYPE *mux, int timeout_cycles +#define PORTMUX_RELEASE_MUX_FN_ARGS portMUX_TYPE *mux +#define PORTMUX_AQUIRE_MUX_FN_CALL_ARGS(x) x, timeout_cycles +#define PORTMUX_RELEASE_MUX_FN_CALL_ARGS(x) x +#endif + + +static inline bool __attribute__((always_inline)) vPortCPUAcquireMutexIntsDisabled(PORTMUX_AQUIRE_MUX_FN_ARGS) { +#if !defined(CONFIG_FREERTOS_UNICORE) +#if defined(CONFIG_SPIRAM) + if (esp_ptr_external_ram(mux)) { + return vPortCPUAcquireMutexIntsDisabledExtram(PORTMUX_AQUIRE_MUX_FN_CALL_ARGS(mux)); + } +#endif + return vPortCPUAcquireMutexIntsDisabledInternal(PORTMUX_AQUIRE_MUX_FN_CALL_ARGS(mux)); +#else + return true; +#endif +} + + +static inline void vPortCPUReleaseMutexIntsDisabled(PORTMUX_RELEASE_MUX_FN_ARGS) { +#if !defined(CONFIG_FREERTOS_UNICORE) +#if defined(CONFIG_SPIRAM) + if (esp_ptr_external_ram(mux)) { + vPortCPUReleaseMutexIntsDisabledExtram(PORTMUX_RELEASE_MUX_FN_CALL_ARGS(mux)); + return; + } +#endif + vPortCPUReleaseMutexIntsDisabledInternal(PORTMUX_RELEASE_MUX_FN_CALL_ARGS(mux)); +#endif +} + diff --git a/arch/xtensa/src/esp_wifi/portmux_impl.inc.h b/arch/xtensa/src/esp_wifi/portmux_impl.inc.h new file mode 100644 index 0000000000000..908fec15396f2 --- /dev/null +++ b/arch/xtensa/src/esp_wifi/portmux_impl.inc.h @@ -0,0 +1,169 @@ +/* + Copyright (C) 2016-2017 Espressif Shanghai PTE LTD + Copyright (C) 2015 Real Time Engineers Ltd. + + All rights reserved + + 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 +*/ + + +/* + Warning: funky preprocessor hackery ahead. Including these headers will generate two + functions, which names are defined by the preprocessor macros + PORTMUX_AQUIRE_MUX_FN_NAME and PORTMUX_RELEASE_MUX_FN_NAME. In order to do the compare + and exchange function, they will use whatever PORTMUX_COMPARE_SET_FN_NAME resolves to. + + In some scenarios, this header is included *twice* in portmux_impl.h: one time + for the 'normal' mux code which uses a compare&exchange routine, another time + to generate code for a second set of these routines that use a second mux + (in internal ram) to fake a compare&exchange on a variable in external memory. +*/ + + + +static inline bool __attribute__((always_inline)) +#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG +PORTMUX_AQUIRE_MUX_FN_NAME(portMUX_TYPE *mux, int timeout_cycles, const char *fnName, int line) { +#else +PORTMUX_AQUIRE_MUX_FN_NAME(portMUX_TYPE *mux, int timeout_cycles) { +#endif + + +#if !CONFIG_FREERTOS_UNICORE + uint32_t res; + portBASE_TYPE coreID, otherCoreID; + uint32_t ccount_start; + bool set_timeout = timeout_cycles > portMUX_NO_TIMEOUT; +#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG + if (!set_timeout) { + timeout_cycles = 10000; // Always set a timeout in debug mode + set_timeout = true; + } +#endif + if (set_timeout) { // Timeout + RSR(CCOUNT, ccount_start); + } + +#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG + uint32_t owner = mux->owner; + if (owner != portMUX_FREE_VAL && owner != CORE_ID_REGVAL_PRO && owner != CORE_ID_REGVAL_APP) { + ets_printf("ERROR: vPortCPUAcquireMutex: mux %p is uninitialized (0x%X)! Called from %s line %d.\n", mux, owner, fnName, line); + mux->owner=portMUX_FREE_VAL; + } +#endif + + /* Spin until we own the core */ + + RSR(PRID, coreID); + /* Note: coreID is the full 32 bit core ID (CORE_ID_REGVAL_PRO/CORE_ID_REGVAL_APP), + not the 0/1 value returned by xPortGetCoreID() + */ + otherCoreID = CORE_ID_REGVAL_XOR_SWAP ^ coreID; + do { + /* mux->owner should be one of portMUX_FREE_VAL, CORE_ID_REGVAL_PRO, + CORE_ID_REGVAL_APP: + + - If portMUX_FREE_VAL, we want to atomically set to 'coreID'. + - If "our" coreID, we can drop through immediately. + - If "otherCoreID", we spin here. + */ + res = coreID; + PORTMUX_COMPARE_SET_FN_NAME(&mux->owner, portMUX_FREE_VAL, &res); + + if (res != otherCoreID) { + break; // mux->owner is "our" coreID + } + + if (set_timeout) { + uint32_t ccount_now; + RSR(CCOUNT, ccount_now); + if (ccount_now - ccount_start > (unsigned)timeout_cycles) { +#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG + ets_printf("Timeout on mux! last non-recursive lock %s line %d, curr %s line %d\n", mux->lastLockedFn, mux->lastLockedLine, fnName, line); + ets_printf("Owner 0x%x count %d\n", mux->owner, mux->count); +#endif + return false; + } + } + } while (1); + + assert(res == coreID || res == portMUX_FREE_VAL); /* any other value implies memory corruption or uninitialized mux */ + assert((res == portMUX_FREE_VAL) == (mux->count == 0)); /* we're first to lock iff count is zero */ + assert(mux->count < 0xFF); /* Bad count value implies memory corruption */ + + /* now we own it, we can increment the refcount */ + mux->count++; + + +#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG + if (res==portMUX_FREE_VAL) { //initial lock + mux->lastLockedFn=fnName; + mux->lastLockedLine=line; + } else { + ets_printf("Recursive lock: count=%d last non-recursive lock %s line %d, curr %s line %d\n", mux->count-1, + mux->lastLockedFn, mux->lastLockedLine, fnName, line); + } +#endif /* CONFIG_FREERTOS_PORTMUX_DEBUG */ +#endif /* CONFIG_FREERTOS_UNICORE */ + return true; +} + +#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG +static inline void PORTMUX_RELEASE_MUX_FN_NAME(portMUX_TYPE *mux, const char *fnName, int line) { +#else +static inline void PORTMUX_RELEASE_MUX_FN_NAME(portMUX_TYPE *mux) { +#endif + + +#if !CONFIG_FREERTOS_UNICORE + portBASE_TYPE coreID; +#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG + const char *lastLockedFn=mux->lastLockedFn; + int lastLockedLine=mux->lastLockedLine; + mux->lastLockedFn=fnName; + mux->lastLockedLine=line; + uint32_t owner = mux->owner; + if (owner != portMUX_FREE_VAL && owner != CORE_ID_REGVAL_PRO && owner != CORE_ID_REGVAL_APP) { + ets_printf("ERROR: vPortCPUReleaseMutex: mux %p is invalid (0x%x)!\n", mux, mux->owner); + } +#endif + +#if CONFIG_FREERTOS_PORTMUX_DEBUG || !defined(NDEBUG) + RSR(PRID, coreID); +#endif + +#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG + if (coreID != mux->owner) { + ets_printf("ERROR: vPortCPUReleaseMutex: mux %p was already unlocked!\n", mux); + ets_printf("Last non-recursive unlock %s line %d, curr unlock %s line %d\n", lastLockedFn, lastLockedLine, fnName, line); + } +#endif + + assert(coreID == mux->owner); // This is a mutex we didn't lock, or it's corrupt + + mux->count--; + if(mux->count == 0) { + mux->owner = portMUX_FREE_VAL; + } else { + assert(mux->count < 0x100); // Indicates memory corruption +#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG_RECURSIVE + ets_printf("Recursive unlock: count=%d last locked %s line %d, curr %s line %d\n", mux->count, lastLockedFn, lastLockedLine, fnName, line); +#endif + } +#endif //!CONFIG_FREERTOS_UNICORE +} diff --git a/arch/xtensa/src/esp_wifi/queue.c b/arch/xtensa/src/esp_wifi/queue.c new file mode 100644 index 0000000000000..e97035d9bcfba --- /dev/null +++ b/arch/xtensa/src/esp_wifi/queue.c @@ -0,0 +1,398 @@ +/* + FreeRTOS V8.2.0 - Copyright (C) 2015 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! +*/ + + + +/* + ToDo: The multicore implementation of this uses taskENTER_CRITICAL etc to make sure the + queue structures aren't accessed by another processor or core. It would be useful to have + IRQs be able to schedule stuff while doing task-related stuff, meaning we have to convert + the taskENTER_CRITICAL stuff to a lock + a scheduler suspend instead. +*/ + +#include +#include +#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. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include +#include +#include +#include + +/* These types must be 32-bit integer */ +typedef long LONG; +typedef unsigned long ULONG; +typedef unsigned long DWORD; + +#define queueSEMAPHORE_QUEUE_ITEM_LENGTH ( ( UBaseType_t ) 0 ) +#define queueMUTEX_GIVE_BLOCK_TIME ( ( TickType_t ) 0U ) +#define NUTTX_MESSAGE_NUM CONFIG_MQ_MAXMSGSIZE +#define NUTTX_1_ULONG (1) +#define NUTTX_NO_WAIT ((ULONG) 0) +#define NUTTX_WAIT_FOREVER ((ULONG) 0xFFFFFFFFUL) + +#ifndef OS_DEBUG +#define OS_DEBUG 0 +#endif + +typedef enum { + QUEUE_TYPE_INVALID = 0, + QUEUE_TYPE_QUEUE = 0x01, + QUEUE_TYPE_MUTEX = 0x02, + QUEUE_TYPE_RECURSIVE_MUTEX = 0x04, + QUEUE_TYPE_SEMAPHORE = 0x08, + QUEUE_TYPE_MAX = 0xFF +} queue_type_t; + +typedef struct nuttx_item { + queue_type_t type; // Handle Type + pthread_mutexattr_t mattr; + int m_count; + union { + mqd_t queue; + pthread_mutex_t mutex; + sem_t semaphore; + }; +} queue_nuttx_t; + +typedef struct nuttx_item *nuttx_item_handle_t; + +QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType ) +{ + nuttx_item_handle_t item_handle = NULL; + int ret = -1, message_size = 0; + int type = 0; + int status = 0; + struct mq_attr attr; + char mq_name[32] = {0x0}; + static int statistics=0; + /* Fill in attributes for message queue */ + + attr.mq_maxmsg = uxQueueLength; + attr.mq_msgsize = uxItemSize; + attr.mq_flags = 0; + + item_handle = calloc(1, sizeof(queue_nuttx_t)); + switch (ucQueueType) { + case queueQUEUE_TYPE_MUTEX: + case queueQUEUE_TYPE_BINARY_SEMAPHORE: + pthread_mutexattr_settype(&item_handle->mattr , PTHREAD_MUTEX_NORMAL); + ret = pthread_mutex_init(&item_handle->mutex, NULL); + if (ret == OK){ + item_handle->type = QUEUE_TYPE_MUTEX; + } + break; + case queueQUEUE_TYPE_RECURSIVE_MUTEX: + pthread_mutexattr_init(&item_handle->mattr); + status = pthread_mutexattr_settype(&item_handle->mattr, PTHREAD_MUTEX_RECURSIVE); + if (status != 0) { + ets_printf("ERROR: pthread_mutexattr_settype failed, status=%d\n", status); + } + status = pthread_mutexattr_gettype(&item_handle->mattr, &type); + if (status != 0) { + ets_printf("ERROR: pthread_mutexattr_gettype failed, status=%d\n", status); + } + if (type != PTHREAD_MUTEX_RECURSIVE) { + ets_printf("ERROR: pthread_mutexattr_gettype return type=%d\n", type); + } + ret = pthread_mutex_init(&item_handle->mutex, &item_handle->mattr); + if (ret != 0) { + ets_printf("ERROR: ERROR pthread_mutex_init failed, status=%d\n", ret); + } + item_handle->type = QUEUE_TYPE_RECURSIVE_MUTEX; + break; + case queueQUEUE_TYPE_BASE: + statistics++; + sprintf(mq_name, "queue_%d", statistics); + item_handle->queue = mq_open(mq_name, O_RDWR|O_CREAT, 0777, &attr); + if (item_handle->queue < 0) { + ret = -1; + ets_printf("ERROR: mq_open failed\n"); + } else { + item_handle->m_count = statistics; + ret = OK; + } + item_handle->type = QUEUE_TYPE_QUEUE; + break; + case queueQUEUE_TYPE_COUNTING_SEMAPHORE: + ret = sem_init(&item_handle->semaphore, 0, 0); + if (ret == OK){ + item_handle->type = QUEUE_TYPE_SEMAPHORE; + } + break; + default: + ret = -1; + break; + } + + return (ret == OK) ? (QueueHandle_t)item_handle : NULL; +} + +QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount ) +{ + QueueHandle_t xHandle = NULL; + xHandle = xQueueGenericCreate(uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_COUNTING_SEMAPHORE); + + return xHandle; +} + +/* xSemaphoreCreateMutex */ +QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType ) +{ + QueueHandle_t xHandle = NULL; + const UBaseType_t uxMutexLength = ( UBaseType_t ) 1, uxMutexSize = ( UBaseType_t ) 0; + xHandle = xQueueGenericCreate( uxMutexLength, uxMutexSize, ucQueueType ); + + return xHandle; +} + +void vQueueDelete(xQueueHandle xQueue) +{ + char mq_name[64] = {0x0}; + nuttx_item_handle_t item_handle = (nuttx_item_handle_t)xQueue; + + switch (item_handle->type) { + case QUEUE_TYPE_QUEUE: + if (item_handle->queue) { + if (mq_close(item_handle->queue) < 0) { + ets_printf("ERROR: mq_close failed\n"); + } + sprintf(mq_name, "queue_%d", item_handle->m_count); + if (mq_unlink(mq_name) < 0) { + ets_printf("ERROR: mq_unlink failed\n"); + } + } + /* deletes the specified message queue */ + break; + case QUEUE_TYPE_RECURSIVE_MUTEX: + case QUEUE_TYPE_MUTEX: + pthread_mutexattr_destroy(&item_handle->mattr); + pthread_mutex_destroy(&item_handle->mutex); + break; + case QUEUE_TYPE_SEMAPHORE: + sem_destroy(&item_handle->semaphore); + break; + default: + break; + } + + if (item_handle) { + free(item_handle); + } +} + +BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue, void * const pvBuffer, BaseType_t * const pxHigherPriorityTaskWoken ) +{ + return xQueueGenericReceive(xQueue, pvBuffer, NUTTX_NO_WAIT, pdFALSE); +} + +BaseType_t xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition ) +{ + int status = 0; + int ret = OK; + uint32_t wait_option = xTicksToWait; + nuttx_item_handle_t item_handle = (nuttx_item_handle_t)xQueue; + struct mq_attr attr; + struct timespec time; + + if (wait_option != portMAX_DELAY) { + int status = clock_gettime(CLOCK_REALTIME, &time); + if (status != 0){ + ets_printf("ERROR: clock_gettime failed\n"); + } + time.tv_sec += wait_option; + } + + switch (item_handle->type) { + case QUEUE_TYPE_QUEUE: + ret = mq_getattr(item_handle->queue, &attr); + if (ret != OK) { + ets_printf("ERROR: mq_getattr failed: %d\n", ret); + } + if (wait_option == portMAX_DELAY) { + ret = mq_send(item_handle->queue, (FAR const char *)pvItemToQueue, attr.mq_msgsize, 23); + } else { + ret = mq_timedsend(item_handle->queue, (FAR const char *)pvItemToQueue, attr.mq_msgsize, 23, &time); + } + if (ret != OK) { + ets_printf("ERROR: send failed: %d\n", ret); + } + break; + case QUEUE_TYPE_MUTEX: + case QUEUE_TYPE_RECURSIVE_MUTEX: + ret = pthread_mutex_unlock(&item_handle->mutex); + break; + case QUEUE_TYPE_SEMAPHORE: + ret = sem_post(&item_handle->semaphore); + break; + default: + break; + } + + return (ret == OK) ? pdPASS : pdFAIL; +} + +UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue ) +{ + struct mq_attr attr; + int ret = 0; + UBaseType_t msg_wait = 0; + nuttx_item_handle_t item_handle = (nuttx_item_handle_t)xQueue; + + ret = mq_getattr(item_handle->queue, &attr); + if (ret != OK) { + ets_printf("ERROR: mq_getattr failed: %d\n", ret); + } else { + msg_wait = attr.mq_curmsgs; + } + return msg_wait; +} + +BaseType_t xQueueGenericReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait, const BaseType_t xJustPeeking ) +{ + int ret = ERROR; + int nbytes = 0; + nuttx_item_handle_t item_handle = (nuttx_item_handle_t)xQueue; + TickType_t wait_option = xTicksToWait; + struct timespec time; + struct mq_attr attr; + int pro; + + if (wait_option != portMAX_DELAY) { + int status = clock_gettime(CLOCK_REALTIME, &time); + if (status != 0){ + ets_printf( "ERROR: clock_gettime failed\n"); + } + time.tv_sec += wait_option; + } + + switch (item_handle->type) { + case QUEUE_TYPE_QUEUE: + ret = mq_getattr(item_handle->queue, &attr); + if (ret != OK) { + ets_printf("ERROR: mq_getattr failed: %d\n", ret); + } + if (wait_option == portMAX_DELAY) { + nbytes = mq_receive(item_handle->queue, pvBuffer, attr.mq_msgsize, &pro); + } else { + nbytes = mq_timedreceive(item_handle->queue, pvBuffer, attr.mq_msgsize, &pro, &time); + } + if (nbytes < 0) { + ets_printf("ERROR: %d, timed out as expected\n", errno); + } + break; + case QUEUE_TYPE_MUTEX: + case QUEUE_TYPE_RECURSIVE_MUTEX: + if (wait_option == portMAX_DELAY) { + ret = pthread_mutex_lock(&item_handle->mutex); + } else { + ret = pthread_mutex_timedlock(&item_handle->mutex, &time); + } + break; + case QUEUE_TYPE_SEMAPHORE: + if (wait_option == portMAX_DELAY) { + ret = sem_wait(&item_handle->semaphore); + } else { + ret = sem_timedwait(&item_handle->semaphore, &time); + } + break; + default: + break; + } + + return (ret == OK) ? pdPASS : pdFAIL; +} + +BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue, const void * const pvItemToQueue, BaseType_t * const pxHigherPriorityTaskWoken, const BaseType_t xCopyPosition ) +{ + return xQueueGenericSend(xQueue, pvItemToQueue, NUTTX_NO_WAIT, xCopyPosition); +} + +BaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex, TickType_t xTicksToWait ) +{ + return xQueueGenericReceive(xMutex, NULL, xTicksToWait, pdFALSE); +} + +BaseType_t xQueueGiveMutexRecursive( QueueHandle_t xMutex ) +{ + return xQueueGenericSend(xMutex, NULL, queueMUTEX_GIVE_BLOCK_TIME, queueSEND_TO_BACK); +} + +BaseType_t xQueueGiveFromISR( QueueHandle_t xQueue, BaseType_t * const pxHigherPriorityTaskWoken ) +{ + return xQueueGenericSend(xQueue, NULL, NUTTX_NO_WAIT, queueSEND_TO_BACK); +} + + diff --git a/arch/xtensa/src/esp_wifi/tasks.c b/arch/xtensa/src/esp_wifi/tasks.c new file mode 100644 index 0000000000000..53f88f6f2538b --- /dev/null +++ b/arch/xtensa/src/esp_wifi/tasks.c @@ -0,0 +1,322 @@ +/* + FreeRTOS V8.2.0 - Copyright (C) 2015 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! +*/ + +/* Standard includes. */ +#include +#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. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE +#include +#include + +/* FreeRTOS includes. */ +#include +#include +#include +#include +#include + +#include "portmacro_priv.h" +#include + +#include +#include + +#include "sched/sched.h" + +#ifndef OS_DEBUG +#define OS_DEBUG 0 +#endif + +void IRAM_ATTR vTaskEnterCritical(portMUX_TYPE *mux) +{ + mux->owner = xPortGetCoreID(); + sched_lock(); + mux->count = enter_critical_section(); +} + +void IRAM_ATTR vTaskExitCritical( portMUX_TYPE *mux ) +{ + mux->owner = xPortGetCoreID(); + leave_critical_section(mux->count); +} + +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 ret = pdFAIL; + pthread_attr_t attr; + struct sched_param sparam; + mqd_t g_mqfd = NULL; + int status; + ( void ) xCoreID; + + sched_lock(); + /* Start the sending thread at higher priority */ + status = pthread_attr_init(&attr); + if (status != 0) { + ets_printf(" pthread_attr_init failed, status=%d\n", status); + } + + status = pthread_attr_setstacksize(&attr, usStackDepth); + if (status != 0) { + ets_printf("pthread_attr_setstacksize failed, status=%d\n", status); + } + + sparam.sched_priority = uxPriority+50; + status = pthread_attr_setschedparam(&attr, &sparam); + if (status != OK) { + ets_printf("pthread_attr_setschedparam failed, status=%d\n", status); + } else { + ets_printf("Set priority to %d\n", sparam.sched_priority); + } + status = pthread_attr_setschedpolicy(&attr, SCHED_RR); + attr.priority = sparam.sched_priority; + attr.stacksize = usStackDepth; + status = pthread_create(pvCreatedTask, &attr, pvTaskCode, pvParameters); + if (status != 0) { + ets_printf("pthread_create failed, status=%d\n", status); + ret = pdFAIL; + } else { + ret = pdPASS; + } + + sched_unlock(); + + return ret; +} + +void vTaskDelay(const TickType_t xTicksToDelay) +{ + nxsig_usleep(xTicksToDelay * 10000); +} + +void vTaskDelete( TaskHandle_t xTaskToDelete ) +{ + void *result; + int status; + + if (xTaskToDelete < 0){ + return; + } + + pthread_cancel(xTaskToDelete); + status = pthread_join(xTaskToDelete, &result); + if (status != 0) { + ets_printf("timedwait_test: ERROR pthread_join failed, status=%d\n", status); + } else { + ets_printf("exited with result=%p\n", result); + } +} + +TaskHandle_t xTaskGetCurrentTaskHandle( void ) +{ + int taskid = getpid(); + + return (TaskHandle_t)taskid; +} + +BaseType_t xTaskGetSchedulerState( void ) +{ + int count = enter_critical_section(); + FAR struct tcb_s *rtcb = this_task(); + BaseType_t xReturn = taskSCHEDULER_NOT_STARTED; + + switch (rtcb->task_state) { + case TSTATE_TASK_INVALID: + xReturn = taskSCHEDULER_NOT_STARTED; + break; + case TSTATE_TASK_PENDING: + case TSTATE_TASK_READYTORUN: +#ifdef CONFIG_SMP + case TSTATE_TASK_ASSIGNED: +#endif + case TSTATE_TASK_INACTIVE: + case TSTATE_WAIT_SEM: + case TSTATE_WAIT_SIG: +#ifndef CONFIG_DISABLE_MQUEUE + case TSTATE_WAIT_MQNOTEMPTY: + case TSTATE_WAIT_MQNOTFULL: +#endif +#ifdef CONFIG_PAGING + case TSTATE_WAIT_PAGEFILL: +#endif +#ifdef CONFIG_SIG_SIGSTOP_ACTION + case TSTATE_TASK_STOPPED: +#endif + xReturn = taskSCHEDULER_SUSPENDED; + break; + case TSTATE_TASK_RUNNING: + xReturn = taskSCHEDULER_RUNNING; + break; + default: + break; + } + leave_critical_section(count); + + return xReturn; +} + +void vTaskSuspendAll( void ) +{ + sched_lock(); +} + +BaseType_t xTaskResumeAll( void ) +{ + sched_unlock(); + + return pdTRUE; +} + +//TODO +void vTaskPlaceOnUnorderedEventList( List_t * pxEventList, const TickType_t xItemValue, const TickType_t xTicksToWait ) +{ +} + +//TODO +TickType_t uxTaskResetEventItemValue( void ) +{ + TickType_t uxReturn = 0; + + return uxReturn; +} + +//TODO +BaseType_t xTaskRemoveFromUnorderedEventList( ListItem_t * pxEventListItem, const TickType_t xItemValue ) +{ + BaseType_t xReturn = 0; + + return xReturn; +} + + +TickType_t xTaskGetTickCount( void ) +{ + TickType_t uxReturn; + uxReturn = clock_systimer(); + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +TickType_t xTaskGetTickCountFromISR( void ) +{ + TickType_t uxReturn; + uxReturn = clock_systimer(); + + return uxReturn; +} + +UBaseType_t uxTaskPriorityGet( TaskHandle_t xTask ) +{ + UBaseType_t uxReturn; + struct sched_param sparam; + + int status = sched_getparam(xTask, &sparam); + if (status < 0) { + ets_printf("signest_test: ERROR sched_getparam() failed, status: %d\n", status); + } else { + uxReturn = sparam.sched_priority; + } + + return uxReturn; +} + +void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority ) +{ + struct sched_param param; + /* Set the client task priority */ + + param.sched_priority = uxNewPriority; + int status = sched_setparam(xTask, ¶m); + if (status < 0) { + ets_printf("nxtext_initialize: sched_setparam failed: %d\n" , status); + } +} + +void vTaskSuspend( TaskHandle_t xTaskToSuspend ) +{ + FAR struct tcb_s *rtcb; + /* Suspend this thread if it is still alive. */ + + rtcb = sched_gettcb(xTaskToSuspend); + if (rtcb != NULL) { + sched_suspend(rtcb); + } +} \ No newline at end of file diff --git a/boards/xtensa/esp32/esp32-azure/configs/nsh/defconfig b/boards/xtensa/esp32/esp32-azure/configs/nsh/defconfig index d4d7d157c838d..3b5fcb7d0f5a1 100644 --- a/boards/xtensa/esp32/esp32-azure/configs/nsh/defconfig +++ b/boards/xtensa/esp32/esp32-azure/configs/nsh/defconfig @@ -54,3 +54,17 @@ CONFIG_SYSTEM_NSH=y CONFIG_SYSTEM_NSH_CXXINITIALIZE=y CONFIG_UART0_SERIAL_CONSOLE=y CONFIG_USER_ENTRYPOINT="nsh_main" +CONFIG_LIBC_ARCH_MEMCMP=y +CONFIG_LIBC_ARCH_MEMCPY=y +CONFIG_LIBC_ARCH_MEMMOVE=y +CONFIG_LIBC_ARCH_MEMSET=y +CONFIG_LIBC_ARCH_STRCHR=y +CONFIG_LIBC_ARCH_STRCMP=y +CONFIG_LIBC_ARCH_STRCPY=y +CONFIG_LIBC_ARCH_STRNCPY=y +CONFIG_LIBC_ARCH_STRLEN=y +CONFIG_LIBC_ARCH_STRNLEN=y +CONFIG_ARCH_STRNCASECMP=y +CONFIG_ARCH_STRNCMP=y +CONFIG_ARCH_STRCAT=y +CONFIG_SIG_SIGSTOP_ACTION=y diff --git a/boards/xtensa/esp32/esp32-azure/scripts/esp32_flash.ld b/boards/xtensa/esp32/esp32-azure/scripts/esp32_flash.ld index 1fb30fbb62f5d..2af80a59be35b 100644 --- a/boards/xtensa/esp32/esp32-azure/scripts/esp32_flash.ld +++ b/boards/xtensa/esp32/esp32-azure/scripts/esp32_flash.ld @@ -56,8 +56,62 @@ SECTIONS *(.iram1 .iram1.*) *libphy.a:(.literal .text .literal.* .text.*) *librtc.a:(.literal .text .literal.* .text.*) - *libpp.a:(.literal .text .literal.* .text.*) + *libpp.a:(.literal .text .literal.* .text.* .wifi0iram .wifi0iram.* .wifirxiram .wifirxiram.* ) + *libnet80211.a:(.wifi0iram .wifi0iram.* .wifirxiram .wifirxiram.*) *libhal.a:(.literal .text .literal.* .text.*) + *(EXCLUDE_FILE(*libsoc.a:uart_hal_iram.*) .iram1 EXCLUDE_FILE(*libsoc.a:uart_hal_iram.*) .iram1.*) + *libesp_ringbuf.a:( .literal .literal.* .text .text.*) + *libgcov.a:( .literal .literal.* .text .text.*) + *libapp_trace.a:SEGGER_SYSVIEW.*( .literal .literal.* .text .text.*) + *libapp_trace.a:SEGGER_SYSVIEW_Config_FreeRTOS.*( .literal .literal.* .text .text.*) + *libapp_trace.a:app_trace.*( .literal .literal.* .text .text.*) + *libapp_trace.a:app_trace_util.*( .literal .literal.* .text .text.*) + *libapp_trace.a:SEGGER_SYSVIEW_FreeRTOS.*( .literal .literal.* .text .text.*) + *libapp_trace.a:SEGGER_RTT_esp32.*( .literal .literal.* .text .text.*) + *liblog.a:log_freertos.*(.literal.esp_log_early_timestamp .text.esp_log_early_timestamp) + *liblog.a:log_freertos.*(.literal.esp_log_impl_lock_timeout .text.esp_log_impl_lock_timeout) + *liblog.a:log_freertos.*(.literal.esp_log_timestamp .text.esp_log_timestamp) + *liblog.a:log_freertos.*(.literal.esp_log_impl_unlock .text.esp_log_impl_unlock) + *liblog.a:log.*(.literal.esp_log_write .text.esp_log_write) + *liblog.a:log_freertos.*(.literal.esp_log_impl_lock .text.esp_log_impl_lock) + *libpp.a:( .wifi0iram .wifi0iram.*) + *libpp.a:( .wifirxiram .wifirxiram.*) + *libgcc.a:_divsf3.*( .literal .literal.* .text .text.*) + *libgcc.a:lib2funcs.*( .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) + *librtc.a:( .literal .literal.* .text .text.*) + *libheap.a:multi_heap_poisoning.*( .literal .literal.* .text .text.*) + *libheap.a:multi_heap.*( .literal .literal.* .text .text.*) + *libnet80211.a:( .wifi0iram .wifi0iram.*) + *libnet80211.a:( .wifirxiram .wifirxiram.*) + *libesp32.a:panic.*( .literal .literal.* .text .text.*) + *libspi_flash.a:spi_flash_chip_gd.*( .literal .literal.* .text .text.*) + *libspi_flash.a:spi_flash_chip_generic.*( .literal .literal.* .text .text.*) + *libspi_flash.a:memspi_host_driver.*( .literal .literal.* .text .text.*) + *libspi_flash.a:spi_flash_rom_patch.*( .literal .literal.* .text .text.*) + *libspi_flash.a:spi_flash_chip_issi.*( .literal .literal.* .text .text.*) + *libsoc.a:cpu_util.*( .literal .literal.* .text .text.*) + *libsoc.a:rtc_clk.*( .literal .literal.* .text .text.*) + *libsoc.a:spi_flash_hal_gpspi.*( .literal .literal.* .text .text.*) + *libsoc.a:rtc_init.*( .literal .literal.* .text .text.*) + *libsoc.a:spi_flash_hal_iram.*( .literal .literal.* .text .text.*) + *libsoc.a:rtc_periph.*( .literal .literal.* .text .text.*) + *libsoc.a:rtc_clk_init.*( .literal .literal.* .text .text.*) + *libsoc.a:uart_hal_iram.*( .iram1 .iram1.*) + *libsoc.a:rtc_wdt.*( .literal .literal.* .text .text.*) + *libsoc.a:i2c_hal_iram.*( .literal .literal.* .text .text.*) + *libsoc.a:spi_slave_hal_iram.*( .literal .literal.* .text .text.*) + *libsoc.a:rtc_sleep.*( .literal .literal.* .text .text.*) + *libsoc.a:spi_hal_iram.*( .literal .literal.* .text .text.*) + *libsoc.a:rtc_pm.*( .literal .literal.* .text .text.*) + *libsoc.a:ledc_hal_iram.*( .literal .literal.* .text .text.*) + *libsoc.a:rtc_time.*( .literal .literal.* .text .text.*) + *libsoc.a:lldesc.*( .literal .literal.* .text .text.*) + *libxtensa.a:eri.*( .literal .literal.* .text .text.*) + *libnewlib.a:heap.*( .literal .literal.* .text .text.*) + *libhal.a:( .literal .literal.* .text .text.*) + *libfreertos.a:( .literal .literal.* .text .text.*) _iram_text_end = ABSOLUTE(.); /* Module text area starts at the end of iram0_0_seg */ @@ -87,6 +141,9 @@ SECTIONS *(.share.mem) *(.gnu.linkonce.b.*) *(COMMON) + *(EXCLUDE_FILE(*libsoc.a:uart_hal_iram.*) .bss EXCLUDE_FILE(*libsoc.a:uart_hal_iram.*) .bss.* EXCLUDE_FILE(*libsoc.a:uart_hal_iram.*) COMMON) + *libsoc.a:uart_hal_iram.*( .bss .bss.* COMMON) + . = ALIGN(8); _ebss = ABSOLUTE(.); @@ -112,6 +169,39 @@ SECTIONS KEEP (*(.gnu.linkonce.s2.*)) KEEP (*(.jcr)) *(.dram1 .dram1.*) + + *(EXCLUDE_FILE(*libsoc.a:uart_hal_iram.*) .data EXCLUDE_FILE(*libsoc.a:uart_hal_iram.*) .data.* EXCLUDE_FILE(*libsoc.a:uart_hal_iram.*) .dram1 EXCLUDE_FILE(*libsoc.a:uart_hal_iram.*) .dram1.*) + *libgcov.a:( .rodata .rodata.*) + *libapp_trace.a:SEGGER_SYSVIEW.*( .rodata .rodata.*) + *libapp_trace.a:SEGGER_SYSVIEW_Config_FreeRTOS.*( .rodata .rodata.*) + *libapp_trace.a:app_trace.*( .rodata .rodata.*) + *libapp_trace.a:app_trace_util.*( .rodata .rodata.*) + *libapp_trace.a:SEGGER_SYSVIEW_FreeRTOS.*( .rodata .rodata.*) + *libapp_trace.a:SEGGER_RTT_esp32.*( .rodata .rodata.*) + *liblog.a:log_freertos.*(.rodata.esp_log_early_timestamp) + *liblog.a:log_freertos.*(.rodata.esp_log_impl_lock_timeout) + *liblog.a:log_freertos.*(.rodata.esp_log_timestamp) + *liblog.a:log_freertos.*(.rodata.esp_log_impl_unlock) + *liblog.a:log.*(.rodata.esp_log_write) + *liblog.a:log_freertos.*(.rodata.esp_log_impl_lock) + *libgcc.a:_divsf3.*( .rodata .rodata.*) + *libesp_event.a:default_event_loop.*(.rodata.esp_event_isr_post) + *libesp_event.a:esp_event.*(.rodata.esp_event_isr_post_to) + *libheap.a:multi_heap_poisoning.*( .rodata .rodata.*) + *libheap.a:multi_heap.*( .rodata .rodata.*) + *libesp32.a:panic.*( .rodata .rodata.*) + *libspi_flash.a:spi_flash_chip_gd.*( .rodata .rodata.*) + *libspi_flash.a:spi_flash_chip_generic.*( .rodata .rodata.*) + *libspi_flash.a:memspi_host_driver.*( .rodata .rodata.*) + *libspi_flash.a:spi_flash_chip_issi.*( .rodata .rodata.*) + *libsoc.a:rtc_clk.*( .rodata .rodata.*) + *libsoc.a:spi_flash_hal_gpspi.*( .rodata .rodata.*) + *libsoc.a:spi_flash_hal_iram.*( .rodata .rodata.*) + *libsoc.a:uart_hal_iram.*( .data .data.* .dram1 .dram1.*) + *libsoc.a:i2c_hal_iram.*( .rodata .rodata.*) + *libnewlib.a:heap.*( .rodata .rodata.*) + *libphy.a:( .rodata .rodata.*) + . = ALIGN(4); _edata = ABSOLUTE(.); @@ -123,6 +213,17 @@ SECTIONS .flash.rodata : { _srodata = ABSOLUTE(.); + + *(.rodata_desc .rodata_desc.*) /* Should be the first. App version info. DO NOT PUT ANYTHING BEFORE IT! */ + *(.rodata_custom_desc .rodata_custom_desc.*) /* Should be the second. Custom app version info. DO NOT PUT ANYTHING BEFORE IT! */ + + *(EXCLUDE_FILE(*libgcov.a *libapp_trace.a:SEGGER_RTT_esp32.* *libapp_trace.a:SEGGER_SYSVIEW_FreeRTOS.* *libapp_trace.a:app_trace_util.* *libapp_trace.a:app_trace.* *libapp_trace.a:SEGGER_SYSVIEW_Config_FreeRTOS.* *libapp_trace.a:SEGGER_SYSVIEW.* *libgcc.a:_divsf3.* *libheap.a:multi_heap.* *libheap.a:multi_heap_poisoning.* *libesp32.a:panic.* *libspi_flash.a:spi_flash_chip_issi.* *libspi_flash.a:memspi_host_driver.* *libspi_flash.a:spi_flash_chip_generic.* *libspi_flash.a:spi_flash_chip_gd.* *libsoc.a:i2c_hal_iram.* *libsoc.a:uart_hal_iram.* *libsoc.a:spi_flash_hal_iram.* *libsoc.a:spi_flash_hal_gpspi.* *libsoc.a:rtc_clk.* *libnewlib.a:heap.* *libphy.a) .rodata EXCLUDE_FILE(*libgcov.a *libapp_trace.a:SEGGER_RTT_esp32.* *libapp_trace.a:SEGGER_SYSVIEW_FreeRTOS.* *libapp_trace.a:app_trace_util.* *libapp_trace.a:app_trace.* *libapp_trace.a:SEGGER_SYSVIEW_Config_FreeRTOS.* *libapp_trace.a:SEGGER_SYSVIEW.* *liblog.a:log_freertos.* *liblog.a:log.* *libgcc.a:_divsf3.* *libesp_event.a:esp_event.* *libesp_event.a:default_event_loop.* *libheap.a:multi_heap.* *libheap.a:multi_heap_poisoning.* *libesp32.a:panic.* *libspi_flash.a:spi_flash_chip_issi.* *libspi_flash.a:memspi_host_driver.* *libspi_flash.a:spi_flash_chip_generic.* *libspi_flash.a:spi_flash_chip_gd.* *libsoc.a:i2c_hal_iram.* *libsoc.a:uart_hal_iram.* *libsoc.a:spi_flash_hal_iram.* *libsoc.a:spi_flash_hal_gpspi.* *libsoc.a:rtc_clk.* *libnewlib.a:heap.* *libphy.a) .rodata.*) + *liblog.a:log.*(.rodata.esp_log_level_set.str1.4) + *liblog.a:log_freertos.*(.rodata.esp_log_system_timestamp.str1.4) + *libesp_event.a:default_event_loop.*(.rodata.esp_event_loop_create_default.str1.4 .rodata.esp_event_send_to_default_loop) + *libesp_event.a:esp_event.*(.rodata.handler_instances_add.str1.4 .rodata.base_node_add_handler.str1.4 .rodata.loop_node_add_handler.str1.4 .rodata.esp_event_loop_create.str1.4 .rodata.esp_event_loop_run.str1.4 .rodata.esp_event_loop_run_task.str1.4 .rodata.esp_event_handler_register_with.str1.4 .rodata.esp_event_handler_unregister_with.str1.4 .rodata.__func__$7281 .rodata.__func__$7268 .rodata.__func__$7248 .rodata.__func__$7232 .rodata.__func__$7209 .rodata.__func__$7168 .rodata.__func__$7159) + *libsoc.a:uart_hal_iram.*( .rodata .rodata.*) + *(.rodata) *(.rodata.*) *(.irom1.text) /* catch stray ICACHE_RODATA_ATTR */ @@ -173,6 +274,16 @@ SECTIONS { _stext = .; _text_start = ABSOLUTE(.); + + + *(EXCLUDE_FILE(*libesp_ringbuf.a *libgcov.a *libapp_trace.a:SEGGER_RTT_esp32.* *libapp_trace.a:SEGGER_SYSVIEW_FreeRTOS.* *libapp_trace.a:app_trace_util.* *libapp_trace.a:app_trace.* *libapp_trace.a:SEGGER_SYSVIEW_Config_FreeRTOS.* *libapp_trace.a:SEGGER_SYSVIEW.* *libgcc.a:lib2funcs.* *libgcc.a:_divsf3.* *librtc.a *libheap.a:multi_heap.* *libheap.a:multi_heap_poisoning.* *libesp32.a:panic.* *libspi_flash.a:spi_flash_chip_issi.* *libspi_flash.a:spi_flash_rom_patch.* *libspi_flash.a:memspi_host_driver.* *libspi_flash.a:spi_flash_chip_generic.* *libspi_flash.a:spi_flash_chip_gd.* *libsoc.a:lldesc.* *libsoc.a:rtc_time.* *libsoc.a:ledc_hal_iram.* *libsoc.a:rtc_pm.* *libsoc.a:spi_hal_iram.* *libsoc.a:rtc_sleep.* *libsoc.a:spi_slave_hal_iram.* *libsoc.a:i2c_hal_iram.* *libsoc.a:rtc_wdt.* *libsoc.a:uart_hal_iram.* *libsoc.a:rtc_clk_init.* *libsoc.a:rtc_periph.* *libsoc.a:spi_flash_hal_iram.* *libsoc.a:rtc_init.* *libsoc.a:spi_flash_hal_gpspi.* *libsoc.a:rtc_clk.* *libsoc.a:cpu_util.* *libxtensa.a:eri.* *libnewlib.a:heap.* *libhal.a *libfreertos.a) .literal EXCLUDE_FILE(*libesp_ringbuf.a *libgcov.a *libapp_trace.a:SEGGER_RTT_esp32.* *libapp_trace.a:SEGGER_SYSVIEW_FreeRTOS.* *libapp_trace.a:app_trace_util.* *libapp_trace.a:app_trace.* *libapp_trace.a:SEGGER_SYSVIEW_Config_FreeRTOS.* *libapp_trace.a:SEGGER_SYSVIEW.* *liblog.a:log.* *liblog.a:log_freertos.* *libgcc.a:lib2funcs.* *libgcc.a:_divsf3.* *libesp_event.a:default_event_loop.* *libesp_event.a:esp_event.* *librtc.a *libheap.a:multi_heap.* *libheap.a:multi_heap_poisoning.* *libesp32.a:panic.* *libspi_flash.a:spi_flash_chip_issi.* *libspi_flash.a:spi_flash_rom_patch.* *libspi_flash.a:memspi_host_driver.* *libspi_flash.a:spi_flash_chip_generic.* *libspi_flash.a:spi_flash_chip_gd.* *libsoc.a:lldesc.* *libsoc.a:rtc_time.* *libsoc.a:ledc_hal_iram.* *libsoc.a:rtc_pm.* *libsoc.a:spi_hal_iram.* *libsoc.a:rtc_sleep.* *libsoc.a:spi_slave_hal_iram.* *libsoc.a:i2c_hal_iram.* *libsoc.a:rtc_wdt.* *libsoc.a:uart_hal_iram.* *libsoc.a:rtc_clk_init.* *libsoc.a:rtc_periph.* *libsoc.a:spi_flash_hal_iram.* *libsoc.a:rtc_init.* *libsoc.a:spi_flash_hal_gpspi.* *libsoc.a:rtc_clk.* *libsoc.a:cpu_util.* *libxtensa.a:eri.* *libnewlib.a:heap.* *libhal.a *libfreertos.a) .literal.* EXCLUDE_FILE(*libesp_ringbuf.a *libgcov.a *libapp_trace.a:SEGGER_RTT_esp32.* *libapp_trace.a:SEGGER_SYSVIEW_FreeRTOS.* *libapp_trace.a:app_trace_util.* *libapp_trace.a:app_trace.* *libapp_trace.a:SEGGER_SYSVIEW_Config_FreeRTOS.* *libapp_trace.a:SEGGER_SYSVIEW.* *libgcc.a:lib2funcs.* *libgcc.a:_divsf3.* *librtc.a *libheap.a:multi_heap.* *libheap.a:multi_heap_poisoning.* *libesp32.a:panic.* *libspi_flash.a:spi_flash_chip_issi.* *libspi_flash.a:spi_flash_rom_patch.* *libspi_flash.a:memspi_host_driver.* *libspi_flash.a:spi_flash_chip_generic.* *libspi_flash.a:spi_flash_chip_gd.* *libsoc.a:lldesc.* *libsoc.a:rtc_time.* *libsoc.a:ledc_hal_iram.* *libsoc.a:rtc_pm.* *libsoc.a:spi_hal_iram.* *libsoc.a:rtc_sleep.* *libsoc.a:spi_slave_hal_iram.* *libsoc.a:i2c_hal_iram.* *libsoc.a:rtc_wdt.* *libsoc.a:uart_hal_iram.* *libsoc.a:rtc_clk_init.* *libsoc.a:rtc_periph.* *libsoc.a:spi_flash_hal_iram.* *libsoc.a:rtc_init.* *libsoc.a:spi_flash_hal_gpspi.* *libsoc.a:rtc_clk.* *libsoc.a:cpu_util.* *libxtensa.a:eri.* *libnewlib.a:heap.* *libhal.a *libfreertos.a) .text EXCLUDE_FILE(*libesp_ringbuf.a *libgcov.a *libapp_trace.a:SEGGER_RTT_esp32.* *libapp_trace.a:SEGGER_SYSVIEW_FreeRTOS.* *libapp_trace.a:app_trace_util.* *libapp_trace.a:app_trace.* *libapp_trace.a:SEGGER_SYSVIEW_Config_FreeRTOS.* *libapp_trace.a:SEGGER_SYSVIEW.* *liblog.a:log.* *liblog.a:log_freertos.* *libgcc.a:lib2funcs.* *libgcc.a:_divsf3.* *libesp_event.a:default_event_loop.* *libesp_event.a:esp_event.* *librtc.a *libheap.a:multi_heap.* *libheap.a:multi_heap_poisoning.* *libesp32.a:panic.* *libspi_flash.a:spi_flash_chip_issi.* *libspi_flash.a:spi_flash_rom_patch.* *libspi_flash.a:memspi_host_driver.* *libspi_flash.a:spi_flash_chip_generic.* *libspi_flash.a:spi_flash_chip_gd.* *libsoc.a:lldesc.* *libsoc.a:rtc_time.* *libsoc.a:ledc_hal_iram.* *libsoc.a:rtc_pm.* *libsoc.a:spi_hal_iram.* *libsoc.a:rtc_sleep.* *libsoc.a:spi_slave_hal_iram.* *libsoc.a:i2c_hal_iram.* *libsoc.a:rtc_wdt.* *libsoc.a:uart_hal_iram.* *libsoc.a:rtc_clk_init.* *libsoc.a:rtc_periph.* *libsoc.a:spi_flash_hal_iram.* *libsoc.a:rtc_init.* *libsoc.a:spi_flash_hal_gpspi.* *libsoc.a:rtc_clk.* *libsoc.a:cpu_util.* *libxtensa.a:eri.* *libnewlib.a:heap.* *libhal.a *libfreertos.a) .text.* EXCLUDE_FILE(*libpp.a *libnet80211.a *libsoc.a:uart_hal_iram.*) .wifi0iram EXCLUDE_FILE(*libpp.a *libnet80211.a *libsoc.a:uart_hal_iram.*) .wifi0iram.* EXCLUDE_FILE(*libpp.a *libnet80211.a *libsoc.a:uart_hal_iram.*) .wifirxiram EXCLUDE_FILE(*libpp.a *libnet80211.a *libsoc.a:uart_hal_iram.*) .wifirxiram.*) + *liblog.a:log_freertos.*(.literal.esp_log_system_timestamp .text.esp_log_system_timestamp) + *liblog.a:log.*(.literal.heap_bubble_down .literal.esp_log_set_vprintf .literal.esp_log_level_set .literal.esp_log_writev .text.heap_bubble_down .text.esp_log_set_vprintf .text.esp_log_level_set .text.esp_log_writev) + *libesp_event.a:esp_event.*(.literal.handler_instances_remove_all .literal.base_node_remove_all_handler .literal.loop_node_remove_all_handler .literal.handler_instances_add .literal.base_node_add_handler .literal.loop_node_add_handler .literal.handler_instances_remove .literal.base_node_remove_handler .literal.loop_node_remove_handler .literal.esp_event_loop_create .literal.esp_event_loop_run .literal.esp_event_loop_run_task .literal.esp_event_loop_delete .literal.esp_event_handler_register_with .literal.esp_event_handler_unregister_with .literal.esp_event_post_to .text.handler_execute .text.handler_instances_remove_all .text.base_node_remove_all_handler .text.loop_node_remove_all_handler .text.handler_instances_add .text.base_node_add_handler .text.loop_node_add_handler .text.handler_instances_remove .text.base_node_remove_handler .text.loop_node_remove_handler .text.esp_event_loop_create .text.esp_event_loop_run .text.esp_event_loop_run_task .text.esp_event_loop_delete .text.esp_event_handler_register_with .text.esp_event_handler_unregister_with .text.esp_event_post_to .text.esp_event_dump) + *libesp_event.a:default_event_loop.*(.literal.esp_event_handler_register .literal.esp_event_handler_unregister .literal.esp_event_post .literal.esp_event_loop_create_default .literal.esp_event_loop_delete_default .literal.esp_event_send_to_default_loop .text.esp_event_handler_register .text.esp_event_handler_unregister .text.esp_event_post .text.esp_event_loop_create_default .text.esp_event_loop_delete_default .text.esp_event_send_to_default_loop) + *libsoc.a:uart_hal_iram.*( .literal .literal.* .text .text.* .wifi0iram .wifi0iram.* .wifirxiram .wifirxiram.*) + + *(.literal .text .literal.* .text.* .stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*) *(.irom0.text) /* catch stray ICACHE_RODATA_ATTR */ *(.fini.literal) diff --git a/boards/xtensa/esp32/esp32-azure/scripts/esp32_rom.ld b/boards/xtensa/esp32/esp32-azure/scripts/esp32_rom.ld index 355882f3932d6..6d55bd793d92e 100644 --- a/boards/xtensa/esp32/esp32-azure/scripts/esp32_rom.ld +++ b/boards/xtensa/esp32/esp32-azure/scripts/esp32_rom.ld @@ -65,6 +65,12 @@ PROVIDE ( Cache_Read_Disable = 0x40009ab8 ); PROVIDE ( Cache_Read_Enable = 0x40009a84 ); PROVIDE ( Cache_Read_Init = 0x40009950 ); PROVIDE ( cache_sram_mmu_set = 0x400097f4 ); +PROVIDE ( cache_flash_mmu_set_rom = cache_flash_mmu_set ); +PROVIDE ( Cache_Flush_rom = Cache_Flush ); +PROVIDE ( Cache_Read_Disable_rom = Cache_Read_Disable ); +PROVIDE ( Cache_Read_Enable_rom = Cache_Read_Enable ); +PROVIDE ( Cache_Read_Init_rom = Cache_Read_Init ); +PROVIDE ( cache_sram_mmu_set_rom = cache_sram_mmu_set ); /* This is static function, but can be used, not generated by script*/ PROVIDE ( calc_rtc_memory_crc = 0x40008170 ); PROVIDE ( calloc = 0x4000bee4 ); @@ -182,8 +188,6 @@ PROVIDE ( ets_intr_count = 0x3ffe03fc ); PROVIDE ( ets_intr_lock = 0x400067b0 ); PROVIDE ( ets_intr_unlock = 0x400067c4 ); PROVIDE ( ets_isr_attach = 0x400067ec ); -PROVIDE ( ets_isr_mask = 0x400067fc ); -PROVIDE ( ets_isr_unmask = 0x40006808 ); PROVIDE ( ets_post = 0x4000673c ); PROVIDE ( ets_printf = 0x40007d54 ); PROVIDE ( ets_readySet_ = 0x3ffe01f0 ); @@ -208,13 +212,6 @@ PROVIDE ( ets_sha_init = 0x4005c0d4 ); PROVIDE ( ets_sha_update = 0x4005c2a0 ); PROVIDE ( ets_startup_callback = 0x3ffe0404 ); PROVIDE ( ets_task = 0x40006688 ); -PROVIDE ( ets_timer_arm = 0x40008368 ); -PROVIDE ( ets_timer_arm_us = 0x400083ac ); -PROVIDE ( ets_timer_disarm = 0x400083ec ); -PROVIDE ( ets_timer_done = 0x40008428 ); -PROVIDE ( ets_timer_handler_isr = 0x40008454 ); -PROVIDE ( ets_timer_init = 0x400084e8 ); -PROVIDE ( ets_timer_setfn = 0x40008350 ); PROVIDE ( ets_unpack_flash_code = 0x40007018 ); PROVIDE ( ets_unpack_flash_code_legacy = 0x4000694c ); PROVIDE ( ets_update_cpu_frequency = 0x40008550 ); @@ -287,6 +284,7 @@ PROVIDE ( _global_impure_ptr = 0x3ffae0b0 ); PROVIDE ( gmtime = 0x40059848 ); PROVIDE ( gmtime_r = 0x40059868 ); PROVIDE ( g_phyFuns_instance = 0x3ffae0c4 ); +PROVIDE ( g_rom_flashchip = 0x3ffae270 ); PROVIDE ( gpio_init = 0x40009c20 ); PROVIDE ( gpio_input_get = 0x40009b88 ); PROVIDE ( gpio_input_get_high = 0x40009b9c ); @@ -435,16 +433,6 @@ PROVIDE ( __locale_mb_cur_max = 0x40059548 ); PROVIDE ( __locale_msgcharset = 0x40059550 ); PROVIDE ( localtime = 0x400595dc ); PROVIDE ( localtime_r = 0x400595fc ); -PROVIDE ( _lock_acquire = 0x4000be14 ); -PROVIDE ( _lock_acquire_recursive = 0x4000be28 ); -PROVIDE ( _lock_close = 0x4000bdec ); -PROVIDE ( _lock_close_recursive = 0x4000be00 ); -PROVIDE ( _lock_init = 0x4000bdc4 ); -PROVIDE ( _lock_init_recursive = 0x4000bdd8 ); -PROVIDE ( _lock_release = 0x4000be64 ); -PROVIDE ( _lock_release_recursive = 0x4000be78 ); -PROVIDE ( _lock_try_acquire = 0x4000be3c ); -PROVIDE ( _lock_try_acquire_recursive = 0x4000be50 ); PROVIDE ( longjmp = 0x400562cc ); PROVIDE ( _lseek_r = 0x4000bd8c ); PROVIDE ( __lshrdi3 = 0x4000c84c ); @@ -1120,7 +1108,7 @@ PROVIDE ( r_lld_con_stop = 0x40049fdc ); PROVIDE ( r_lld_con_update_after_param_req = 0x40049bcc ); PROVIDE ( r_lld_con_update_ind = 0x4004a30c ); PROVIDE ( r_lld_con_update_req = 0x40049b60 ); -PROVIDE ( r_lld_azure_reset = 0x40048a9c ); +PROVIDE ( r_lld_core_reset = 0x40048a9c ); PROVIDE ( r_lld_crypt_isr = 0x4004a324 ); PROVIDE ( r_lld_evt_adv_create = 0x400481f4 ); PROVIDE ( r_lld_evt_canceled = 0x400485c8 ); @@ -1838,9 +1826,34 @@ PROVIDE ( _xtos_set_exception_handler = 0x4000074c ); PROVIDE ( _xtos_set_interrupt_handler = 0x4000bf78 ); PROVIDE ( _xtos_set_interrupt_handler_arg = 0x4000bf34 ); PROVIDE ( _xtos_set_intlevel = 0x4000bfdc ); +PROVIDE ( g_ticks_per_us_pro = 0x3ffe01e0 ); +PROVIDE ( g_ticks_per_us_app = 0x3ffe40f0 ); PROVIDE ( _xtos_set_min_intlevel = 0x4000bff8 ); PROVIDE ( _xtos_set_vpri = 0x40000934 ); PROVIDE ( _xtos_syscall_handler = 0x40000790 ); PROVIDE ( _xtos_unhandled_exception = 0x4000c024 ); PROVIDE ( _xtos_unhandled_interrupt = 0x4000c01c ); PROVIDE ( _xtos_vpri_enabled = 0x3ffe0654 ); +PROVIDE ( g_rom_spiflash_chip = 0x3ffae270 ); +PROVIDE ( g_rom_spiflash_dummy_len_plus = 0x3ffae290 ); +PROVIDE ( esp_rom_spiflash_read_user_cmd = 0x400621b0 ); +PROVIDE ( esp_rom_spiflash_write_encrypted_enable = 0x40062df4 ); +PROVIDE ( esp_rom_spiflash_prepare_encrypted_data = 0x40062e1c ); + +memccpy = 0x4000c220; +memchr = 0x4000c244; +memcmp = 0x4000c260; +memcpy = 0x4000c2c8; +memmove = 0x4000c3c0; +memrchr = 0x4000c400; +memset = 0x4000c44c; +strchr = 0x4000c53c; +strcmp = 0x40001274; +strcpy = 0x400013ac; +strncpy = 0x400015d4; +strlen = 0x400014c0; +strnlen = 0x4000c628; +strcat = 0x4000c518; +strncasecmp = 0x40001550; +strncat = 0x4000c5c4; +strncmp = 0x4000c5f4; diff --git a/boards/xtensa/esp32/esp32-azure/src/esp32_bringup.c b/boards/xtensa/esp32/esp32-azure/src/esp32_bringup.c index d70b112df04e2..2eedbbd0c30c0 100644 --- a/boards/xtensa/esp32/esp32-azure/src/esp32_bringup.c +++ b/boards/xtensa/esp32/esp32-azure/src/esp32_bringup.c @@ -50,6 +50,9 @@ #include +#include +#include + /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ @@ -144,6 +147,23 @@ int esp32_bringup(void) } #endif +#ifdef CONFIG_ESP32_WIRELESS + /* Initialize spi_flash */ + uint32_t count = up_irq_save(); + spi_flash_init(); + /* init default OS-aware flash access critical section */ + spi_flash_guard_set(&g_flash_guard_default_ops); + esp_flash_app_init(); + + ret = esp_flash_init_default_chip(); + up_irq_restore(count); + if (ret != OK) + { + syslog(LOG_ERR, "Failed to initialize spi_flash: %d\n", ret); + return ret; + } +#endif + /* If we got here then perhaps not all initialization was successful, but * at least enough succeeded to bring-up NSH with perhaps reduced * capabilities. diff --git a/boards/xtensa/esp32/esp32-core/configs/nsh/defconfig b/boards/xtensa/esp32/esp32-core/configs/nsh/defconfig index 5548ddec1c83a..fa9ed14cd50d4 100644 --- a/boards/xtensa/esp32/esp32-core/configs/nsh/defconfig +++ b/boards/xtensa/esp32/esp32-core/configs/nsh/defconfig @@ -54,3 +54,18 @@ CONFIG_SYSTEM_NSH=y CONFIG_SYSTEM_NSH_CXXINITIALIZE=y CONFIG_UART0_SERIAL_CONSOLE=y CONFIG_USER_ENTRYPOINT="nsh_main" +CONFIG_LIBC_ARCH_MEMCMP=y +CONFIG_LIBC_ARCH_MEMCPY=y +CONFIG_LIBC_ARCH_MEMMOVE=y +CONFIG_LIBC_ARCH_MEMSET=y +CONFIG_LIBC_ARCH_STRCHR=y +CONFIG_LIBC_ARCH_STRCMP=y +CONFIG_LIBC_ARCH_STRCPY=y +CONFIG_LIBC_ARCH_STRNCPY=y +CONFIG_LIBC_ARCH_STRLEN=y +CONFIG_LIBC_ARCH_STRNLEN=y +CONFIG_ARCH_STRNCASECMP=y +CONFIG_ARCH_STRNCMP=y +CONFIG_ARCH_STRCAT=y +CONFIG_SIG_SIGSTOP_ACTION=y + diff --git a/boards/xtensa/esp32/esp32-core/scripts/esp32_flash.ld b/boards/xtensa/esp32/esp32-core/scripts/esp32_flash.ld index bccf2aa8cd6a1..38abb862d54fb 100644 --- a/boards/xtensa/esp32/esp32-core/scripts/esp32_flash.ld +++ b/boards/xtensa/esp32/esp32-core/scripts/esp32_flash.ld @@ -56,8 +56,62 @@ SECTIONS *(.iram1 .iram1.*) *libphy.a:(.literal .text .literal.* .text.*) *librtc.a:(.literal .text .literal.* .text.*) - *libpp.a:(.literal .text .literal.* .text.*) + *libpp.a:(.literal .text .literal.* .text.* .wifi0iram .wifi0iram.* .wifirxiram .wifirxiram.* ) + *libnet80211.a:(.wifi0iram .wifi0iram.* .wifirxiram .wifirxiram.*) *libhal.a:(.literal .text .literal.* .text.*) + *(EXCLUDE_FILE(*libsoc.a:uart_hal_iram.*) .iram1 EXCLUDE_FILE(*libsoc.a:uart_hal_iram.*) .iram1.*) + *libesp_ringbuf.a:( .literal .literal.* .text .text.*) + *libgcov.a:( .literal .literal.* .text .text.*) + *libapp_trace.a:SEGGER_SYSVIEW.*( .literal .literal.* .text .text.*) + *libapp_trace.a:SEGGER_SYSVIEW_Config_FreeRTOS.*( .literal .literal.* .text .text.*) + *libapp_trace.a:app_trace.*( .literal .literal.* .text .text.*) + *libapp_trace.a:app_trace_util.*( .literal .literal.* .text .text.*) + *libapp_trace.a:SEGGER_SYSVIEW_FreeRTOS.*( .literal .literal.* .text .text.*) + *libapp_trace.a:SEGGER_RTT_esp32.*( .literal .literal.* .text .text.*) + *liblog.a:log_freertos.*(.literal.esp_log_early_timestamp .text.esp_log_early_timestamp) + *liblog.a:log_freertos.*(.literal.esp_log_impl_lock_timeout .text.esp_log_impl_lock_timeout) + *liblog.a:log_freertos.*(.literal.esp_log_timestamp .text.esp_log_timestamp) + *liblog.a:log_freertos.*(.literal.esp_log_impl_unlock .text.esp_log_impl_unlock) + *liblog.a:log.*(.literal.esp_log_write .text.esp_log_write) + *liblog.a:log_freertos.*(.literal.esp_log_impl_lock .text.esp_log_impl_lock) + *libpp.a:( .wifi0iram .wifi0iram.*) + *libpp.a:( .wifirxiram .wifirxiram.*) + *libgcc.a:_divsf3.*( .literal .literal.* .text .text.*) + *libgcc.a:lib2funcs.*( .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) + *librtc.a:( .literal .literal.* .text .text.*) + *libheap.a:multi_heap_poisoning.*( .literal .literal.* .text .text.*) + *libheap.a:multi_heap.*( .literal .literal.* .text .text.*) + *libnet80211.a:( .wifi0iram .wifi0iram.*) + *libnet80211.a:( .wifirxiram .wifirxiram.*) + *libesp32.a:panic.*( .literal .literal.* .text .text.*) + *libspi_flash.a:spi_flash_chip_gd.*( .literal .literal.* .text .text.*) + *libspi_flash.a:spi_flash_chip_generic.*( .literal .literal.* .text .text.*) + *libspi_flash.a:memspi_host_driver.*( .literal .literal.* .text .text.*) + *libspi_flash.a:spi_flash_rom_patch.*( .literal .literal.* .text .text.*) + *libspi_flash.a:spi_flash_chip_issi.*( .literal .literal.* .text .text.*) + *libsoc.a:cpu_util.*( .literal .literal.* .text .text.*) + *libsoc.a:rtc_clk.*( .literal .literal.* .text .text.*) + *libsoc.a:spi_flash_hal_gpspi.*( .literal .literal.* .text .text.*) + *libsoc.a:rtc_init.*( .literal .literal.* .text .text.*) + *libsoc.a:spi_flash_hal_iram.*( .literal .literal.* .text .text.*) + *libsoc.a:rtc_periph.*( .literal .literal.* .text .text.*) + *libsoc.a:rtc_clk_init.*( .literal .literal.* .text .text.*) + *libsoc.a:uart_hal_iram.*( .iram1 .iram1.*) + *libsoc.a:rtc_wdt.*( .literal .literal.* .text .text.*) + *libsoc.a:i2c_hal_iram.*( .literal .literal.* .text .text.*) + *libsoc.a:spi_slave_hal_iram.*( .literal .literal.* .text .text.*) + *libsoc.a:rtc_sleep.*( .literal .literal.* .text .text.*) + *libsoc.a:spi_hal_iram.*( .literal .literal.* .text .text.*) + *libsoc.a:rtc_pm.*( .literal .literal.* .text .text.*) + *libsoc.a:ledc_hal_iram.*( .literal .literal.* .text .text.*) + *libsoc.a:rtc_time.*( .literal .literal.* .text .text.*) + *libsoc.a:lldesc.*( .literal .literal.* .text .text.*) + *libxtensa.a:eri.*( .literal .literal.* .text .text.*) + *libnewlib.a:heap.*( .literal .literal.* .text .text.*) + *libhal.a:( .literal .literal.* .text .text.*) + *libfreertos.a:( .literal .literal.* .text .text.*) _iram_text_end = ABSOLUTE(.); /* Module text area starts at the end of iram0_0_seg */ @@ -87,6 +141,9 @@ SECTIONS *(.share.mem) *(.gnu.linkonce.b.*) *(COMMON) + *(EXCLUDE_FILE(*libsoc.a:uart_hal_iram.*) .bss EXCLUDE_FILE(*libsoc.a:uart_hal_iram.*) .bss.* EXCLUDE_FILE(*libsoc.a:uart_hal_iram.*) COMMON) + *libsoc.a:uart_hal_iram.*( .bss .bss.* COMMON) + . = ALIGN(8); _ebss = ABSOLUTE(.); @@ -112,6 +169,39 @@ SECTIONS KEEP (*(.gnu.linkonce.s2.*)) KEEP (*(.jcr)) *(.dram1 .dram1.*) + + *(EXCLUDE_FILE(*libsoc.a:uart_hal_iram.*) .data EXCLUDE_FILE(*libsoc.a:uart_hal_iram.*) .data.* EXCLUDE_FILE(*libsoc.a:uart_hal_iram.*) .dram1 EXCLUDE_FILE(*libsoc.a:uart_hal_iram.*) .dram1.*) + *libgcov.a:( .rodata .rodata.*) + *libapp_trace.a:SEGGER_SYSVIEW.*( .rodata .rodata.*) + *libapp_trace.a:SEGGER_SYSVIEW_Config_FreeRTOS.*( .rodata .rodata.*) + *libapp_trace.a:app_trace.*( .rodata .rodata.*) + *libapp_trace.a:app_trace_util.*( .rodata .rodata.*) + *libapp_trace.a:SEGGER_SYSVIEW_FreeRTOS.*( .rodata .rodata.*) + *libapp_trace.a:SEGGER_RTT_esp32.*( .rodata .rodata.*) + *liblog.a:log_freertos.*(.rodata.esp_log_early_timestamp) + *liblog.a:log_freertos.*(.rodata.esp_log_impl_lock_timeout) + *liblog.a:log_freertos.*(.rodata.esp_log_timestamp) + *liblog.a:log_freertos.*(.rodata.esp_log_impl_unlock) + *liblog.a:log.*(.rodata.esp_log_write) + *liblog.a:log_freertos.*(.rodata.esp_log_impl_lock) + *libgcc.a:_divsf3.*( .rodata .rodata.*) + *libesp_event.a:default_event_loop.*(.rodata.esp_event_isr_post) + *libesp_event.a:esp_event.*(.rodata.esp_event_isr_post_to) + *libheap.a:multi_heap_poisoning.*( .rodata .rodata.*) + *libheap.a:multi_heap.*( .rodata .rodata.*) + *libesp32.a:panic.*( .rodata .rodata.*) + *libspi_flash.a:spi_flash_chip_gd.*( .rodata .rodata.*) + *libspi_flash.a:spi_flash_chip_generic.*( .rodata .rodata.*) + *libspi_flash.a:memspi_host_driver.*( .rodata .rodata.*) + *libspi_flash.a:spi_flash_chip_issi.*( .rodata .rodata.*) + *libsoc.a:rtc_clk.*( .rodata .rodata.*) + *libsoc.a:spi_flash_hal_gpspi.*( .rodata .rodata.*) + *libsoc.a:spi_flash_hal_iram.*( .rodata .rodata.*) + *libsoc.a:uart_hal_iram.*( .data .data.* .dram1 .dram1.*) + *libsoc.a:i2c_hal_iram.*( .rodata .rodata.*) + *libnewlib.a:heap.*( .rodata .rodata.*) + *libphy.a:( .rodata .rodata.*) + . = ALIGN(4); _edata = ABSOLUTE(.); @@ -123,6 +213,17 @@ SECTIONS .flash.rodata : { _srodata = ABSOLUTE(.); + + *(.rodata_desc .rodata_desc.*) /* Should be the first. App version info. DO NOT PUT ANYTHING BEFORE IT! */ + *(.rodata_custom_desc .rodata_custom_desc.*) /* Should be the second. Custom app version info. DO NOT PUT ANYTHING BEFORE IT! */ + + *(EXCLUDE_FILE(*libgcov.a *libapp_trace.a:SEGGER_RTT_esp32.* *libapp_trace.a:SEGGER_SYSVIEW_FreeRTOS.* *libapp_trace.a:app_trace_util.* *libapp_trace.a:app_trace.* *libapp_trace.a:SEGGER_SYSVIEW_Config_FreeRTOS.* *libapp_trace.a:SEGGER_SYSVIEW.* *libgcc.a:_divsf3.* *libheap.a:multi_heap.* *libheap.a:multi_heap_poisoning.* *libesp32.a:panic.* *libspi_flash.a:spi_flash_chip_issi.* *libspi_flash.a:memspi_host_driver.* *libspi_flash.a:spi_flash_chip_generic.* *libspi_flash.a:spi_flash_chip_gd.* *libsoc.a:i2c_hal_iram.* *libsoc.a:uart_hal_iram.* *libsoc.a:spi_flash_hal_iram.* *libsoc.a:spi_flash_hal_gpspi.* *libsoc.a:rtc_clk.* *libnewlib.a:heap.* *libphy.a) .rodata EXCLUDE_FILE(*libgcov.a *libapp_trace.a:SEGGER_RTT_esp32.* *libapp_trace.a:SEGGER_SYSVIEW_FreeRTOS.* *libapp_trace.a:app_trace_util.* *libapp_trace.a:app_trace.* *libapp_trace.a:SEGGER_SYSVIEW_Config_FreeRTOS.* *libapp_trace.a:SEGGER_SYSVIEW.* *liblog.a:log_freertos.* *liblog.a:log.* *libgcc.a:_divsf3.* *libesp_event.a:esp_event.* *libesp_event.a:default_event_loop.* *libheap.a:multi_heap.* *libheap.a:multi_heap_poisoning.* *libesp32.a:panic.* *libspi_flash.a:spi_flash_chip_issi.* *libspi_flash.a:memspi_host_driver.* *libspi_flash.a:spi_flash_chip_generic.* *libspi_flash.a:spi_flash_chip_gd.* *libsoc.a:i2c_hal_iram.* *libsoc.a:uart_hal_iram.* *libsoc.a:spi_flash_hal_iram.* *libsoc.a:spi_flash_hal_gpspi.* *libsoc.a:rtc_clk.* *libnewlib.a:heap.* *libphy.a) .rodata.*) + *liblog.a:log.*(.rodata.esp_log_level_set.str1.4) + *liblog.a:log_freertos.*(.rodata.esp_log_system_timestamp.str1.4) + *libesp_event.a:default_event_loop.*(.rodata.esp_event_loop_create_default.str1.4 .rodata.esp_event_send_to_default_loop) + *libesp_event.a:esp_event.*(.rodata.handler_instances_add.str1.4 .rodata.base_node_add_handler.str1.4 .rodata.loop_node_add_handler.str1.4 .rodata.esp_event_loop_create.str1.4 .rodata.esp_event_loop_run.str1.4 .rodata.esp_event_loop_run_task.str1.4 .rodata.esp_event_handler_register_with.str1.4 .rodata.esp_event_handler_unregister_with.str1.4 .rodata.__func__$7281 .rodata.__func__$7268 .rodata.__func__$7248 .rodata.__func__$7232 .rodata.__func__$7209 .rodata.__func__$7168 .rodata.__func__$7159) + *libsoc.a:uart_hal_iram.*( .rodata .rodata.*) + *(.rodata) *(.rodata.*) *(.irom1.text) /* catch stray ICACHE_RODATA_ATTR */ @@ -173,6 +274,16 @@ SECTIONS { _stext = .; _text_start = ABSOLUTE(.); + + + *(EXCLUDE_FILE(*libesp_ringbuf.a *libgcov.a *libapp_trace.a:SEGGER_RTT_esp32.* *libapp_trace.a:SEGGER_SYSVIEW_FreeRTOS.* *libapp_trace.a:app_trace_util.* *libapp_trace.a:app_trace.* *libapp_trace.a:SEGGER_SYSVIEW_Config_FreeRTOS.* *libapp_trace.a:SEGGER_SYSVIEW.* *libgcc.a:lib2funcs.* *libgcc.a:_divsf3.* *librtc.a *libheap.a:multi_heap.* *libheap.a:multi_heap_poisoning.* *libesp32.a:panic.* *libspi_flash.a:spi_flash_chip_issi.* *libspi_flash.a:spi_flash_rom_patch.* *libspi_flash.a:memspi_host_driver.* *libspi_flash.a:spi_flash_chip_generic.* *libspi_flash.a:spi_flash_chip_gd.* *libsoc.a:lldesc.* *libsoc.a:rtc_time.* *libsoc.a:ledc_hal_iram.* *libsoc.a:rtc_pm.* *libsoc.a:spi_hal_iram.* *libsoc.a:rtc_sleep.* *libsoc.a:spi_slave_hal_iram.* *libsoc.a:i2c_hal_iram.* *libsoc.a:rtc_wdt.* *libsoc.a:uart_hal_iram.* *libsoc.a:rtc_clk_init.* *libsoc.a:rtc_periph.* *libsoc.a:spi_flash_hal_iram.* *libsoc.a:rtc_init.* *libsoc.a:spi_flash_hal_gpspi.* *libsoc.a:rtc_clk.* *libsoc.a:cpu_util.* *libxtensa.a:eri.* *libnewlib.a:heap.* *libhal.a *libfreertos.a) .literal EXCLUDE_FILE(*libesp_ringbuf.a *libgcov.a *libapp_trace.a:SEGGER_RTT_esp32.* *libapp_trace.a:SEGGER_SYSVIEW_FreeRTOS.* *libapp_trace.a:app_trace_util.* *libapp_trace.a:app_trace.* *libapp_trace.a:SEGGER_SYSVIEW_Config_FreeRTOS.* *libapp_trace.a:SEGGER_SYSVIEW.* *liblog.a:log.* *liblog.a:log_freertos.* *libgcc.a:lib2funcs.* *libgcc.a:_divsf3.* *libesp_event.a:default_event_loop.* *libesp_event.a:esp_event.* *librtc.a *libheap.a:multi_heap.* *libheap.a:multi_heap_poisoning.* *libesp32.a:panic.* *libspi_flash.a:spi_flash_chip_issi.* *libspi_flash.a:spi_flash_rom_patch.* *libspi_flash.a:memspi_host_driver.* *libspi_flash.a:spi_flash_chip_generic.* *libspi_flash.a:spi_flash_chip_gd.* *libsoc.a:lldesc.* *libsoc.a:rtc_time.* *libsoc.a:ledc_hal_iram.* *libsoc.a:rtc_pm.* *libsoc.a:spi_hal_iram.* *libsoc.a:rtc_sleep.* *libsoc.a:spi_slave_hal_iram.* *libsoc.a:i2c_hal_iram.* *libsoc.a:rtc_wdt.* *libsoc.a:uart_hal_iram.* *libsoc.a:rtc_clk_init.* *libsoc.a:rtc_periph.* *libsoc.a:spi_flash_hal_iram.* *libsoc.a:rtc_init.* *libsoc.a:spi_flash_hal_gpspi.* *libsoc.a:rtc_clk.* *libsoc.a:cpu_util.* *libxtensa.a:eri.* *libnewlib.a:heap.* *libhal.a *libfreertos.a) .literal.* EXCLUDE_FILE(*libesp_ringbuf.a *libgcov.a *libapp_trace.a:SEGGER_RTT_esp32.* *libapp_trace.a:SEGGER_SYSVIEW_FreeRTOS.* *libapp_trace.a:app_trace_util.* *libapp_trace.a:app_trace.* *libapp_trace.a:SEGGER_SYSVIEW_Config_FreeRTOS.* *libapp_trace.a:SEGGER_SYSVIEW.* *libgcc.a:lib2funcs.* *libgcc.a:_divsf3.* *librtc.a *libheap.a:multi_heap.* *libheap.a:multi_heap_poisoning.* *libesp32.a:panic.* *libspi_flash.a:spi_flash_chip_issi.* *libspi_flash.a:spi_flash_rom_patch.* *libspi_flash.a:memspi_host_driver.* *libspi_flash.a:spi_flash_chip_generic.* *libspi_flash.a:spi_flash_chip_gd.* *libsoc.a:lldesc.* *libsoc.a:rtc_time.* *libsoc.a:ledc_hal_iram.* *libsoc.a:rtc_pm.* *libsoc.a:spi_hal_iram.* *libsoc.a:rtc_sleep.* *libsoc.a:spi_slave_hal_iram.* *libsoc.a:i2c_hal_iram.* *libsoc.a:rtc_wdt.* *libsoc.a:uart_hal_iram.* *libsoc.a:rtc_clk_init.* *libsoc.a:rtc_periph.* *libsoc.a:spi_flash_hal_iram.* *libsoc.a:rtc_init.* *libsoc.a:spi_flash_hal_gpspi.* *libsoc.a:rtc_clk.* *libsoc.a:cpu_util.* *libxtensa.a:eri.* *libnewlib.a:heap.* *libhal.a *libfreertos.a) .text EXCLUDE_FILE(*libesp_ringbuf.a *libgcov.a *libapp_trace.a:SEGGER_RTT_esp32.* *libapp_trace.a:SEGGER_SYSVIEW_FreeRTOS.* *libapp_trace.a:app_trace_util.* *libapp_trace.a:app_trace.* *libapp_trace.a:SEGGER_SYSVIEW_Config_FreeRTOS.* *libapp_trace.a:SEGGER_SYSVIEW.* *liblog.a:log.* *liblog.a:log_freertos.* *libgcc.a:lib2funcs.* *libgcc.a:_divsf3.* *libesp_event.a:default_event_loop.* *libesp_event.a:esp_event.* *librtc.a *libheap.a:multi_heap.* *libheap.a:multi_heap_poisoning.* *libesp32.a:panic.* *libspi_flash.a:spi_flash_chip_issi.* *libspi_flash.a:spi_flash_rom_patch.* *libspi_flash.a:memspi_host_driver.* *libspi_flash.a:spi_flash_chip_generic.* *libspi_flash.a:spi_flash_chip_gd.* *libsoc.a:lldesc.* *libsoc.a:rtc_time.* *libsoc.a:ledc_hal_iram.* *libsoc.a:rtc_pm.* *libsoc.a:spi_hal_iram.* *libsoc.a:rtc_sleep.* *libsoc.a:spi_slave_hal_iram.* *libsoc.a:i2c_hal_iram.* *libsoc.a:rtc_wdt.* *libsoc.a:uart_hal_iram.* *libsoc.a:rtc_clk_init.* *libsoc.a:rtc_periph.* *libsoc.a:spi_flash_hal_iram.* *libsoc.a:rtc_init.* *libsoc.a:spi_flash_hal_gpspi.* *libsoc.a:rtc_clk.* *libsoc.a:cpu_util.* *libxtensa.a:eri.* *libnewlib.a:heap.* *libhal.a *libfreertos.a) .text.* EXCLUDE_FILE(*libpp.a *libnet80211.a *libsoc.a:uart_hal_iram.*) .wifi0iram EXCLUDE_FILE(*libpp.a *libnet80211.a *libsoc.a:uart_hal_iram.*) .wifi0iram.* EXCLUDE_FILE(*libpp.a *libnet80211.a *libsoc.a:uart_hal_iram.*) .wifirxiram EXCLUDE_FILE(*libpp.a *libnet80211.a *libsoc.a:uart_hal_iram.*) .wifirxiram.*) + *liblog.a:log_freertos.*(.literal.esp_log_system_timestamp .text.esp_log_system_timestamp) + *liblog.a:log.*(.literal.heap_bubble_down .literal.esp_log_set_vprintf .literal.esp_log_level_set .literal.esp_log_writev .text.heap_bubble_down .text.esp_log_set_vprintf .text.esp_log_level_set .text.esp_log_writev) + *libesp_event.a:esp_event.*(.literal.handler_instances_remove_all .literal.base_node_remove_all_handler .literal.loop_node_remove_all_handler .literal.handler_instances_add .literal.base_node_add_handler .literal.loop_node_add_handler .literal.handler_instances_remove .literal.base_node_remove_handler .literal.loop_node_remove_handler .literal.esp_event_loop_create .literal.esp_event_loop_run .literal.esp_event_loop_run_task .literal.esp_event_loop_delete .literal.esp_event_handler_register_with .literal.esp_event_handler_unregister_with .literal.esp_event_post_to .text.handler_execute .text.handler_instances_remove_all .text.base_node_remove_all_handler .text.loop_node_remove_all_handler .text.handler_instances_add .text.base_node_add_handler .text.loop_node_add_handler .text.handler_instances_remove .text.base_node_remove_handler .text.loop_node_remove_handler .text.esp_event_loop_create .text.esp_event_loop_run .text.esp_event_loop_run_task .text.esp_event_loop_delete .text.esp_event_handler_register_with .text.esp_event_handler_unregister_with .text.esp_event_post_to .text.esp_event_dump) + *libesp_event.a:default_event_loop.*(.literal.esp_event_handler_register .literal.esp_event_handler_unregister .literal.esp_event_post .literal.esp_event_loop_create_default .literal.esp_event_loop_delete_default .literal.esp_event_send_to_default_loop .text.esp_event_handler_register .text.esp_event_handler_unregister .text.esp_event_post .text.esp_event_loop_create_default .text.esp_event_loop_delete_default .text.esp_event_send_to_default_loop) + *libsoc.a:uart_hal_iram.*( .literal .literal.* .text .text.* .wifi0iram .wifi0iram.* .wifirxiram .wifirxiram.*) + + *(.literal .text .literal.* .text.* .stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*) *(.irom0.text) /* catch stray ICACHE_RODATA_ATTR */ *(.fini.literal) diff --git a/boards/xtensa/esp32/esp32-core/scripts/esp32_rom.ld b/boards/xtensa/esp32/esp32-core/scripts/esp32_rom.ld index 60af0057d0d10..ee7318a1aeaaa 100644 --- a/boards/xtensa/esp32/esp32-core/scripts/esp32_rom.ld +++ b/boards/xtensa/esp32/esp32-core/scripts/esp32_rom.ld @@ -65,6 +65,12 @@ PROVIDE ( Cache_Read_Disable = 0x40009ab8 ); PROVIDE ( Cache_Read_Enable = 0x40009a84 ); PROVIDE ( Cache_Read_Init = 0x40009950 ); PROVIDE ( cache_sram_mmu_set = 0x400097f4 ); +PROVIDE ( cache_flash_mmu_set_rom = cache_flash_mmu_set ); +PROVIDE ( Cache_Flush_rom = Cache_Flush ); +PROVIDE ( Cache_Read_Disable_rom = Cache_Read_Disable ); +PROVIDE ( Cache_Read_Enable_rom = Cache_Read_Enable ); +PROVIDE ( Cache_Read_Init_rom = Cache_Read_Init ); +PROVIDE ( cache_sram_mmu_set_rom = cache_sram_mmu_set ); /* This is static function, but can be used, not generated by script*/ PROVIDE ( calc_rtc_memory_crc = 0x40008170 ); PROVIDE ( calloc = 0x4000bee4 ); @@ -182,8 +188,6 @@ PROVIDE ( ets_intr_count = 0x3ffe03fc ); PROVIDE ( ets_intr_lock = 0x400067b0 ); PROVIDE ( ets_intr_unlock = 0x400067c4 ); PROVIDE ( ets_isr_attach = 0x400067ec ); -PROVIDE ( ets_isr_mask = 0x400067fc ); -PROVIDE ( ets_isr_unmask = 0x40006808 ); PROVIDE ( ets_post = 0x4000673c ); PROVIDE ( ets_printf = 0x40007d54 ); PROVIDE ( ets_readySet_ = 0x3ffe01f0 ); @@ -208,13 +212,6 @@ PROVIDE ( ets_sha_init = 0x4005c0d4 ); PROVIDE ( ets_sha_update = 0x4005c2a0 ); PROVIDE ( ets_startup_callback = 0x3ffe0404 ); PROVIDE ( ets_task = 0x40006688 ); -PROVIDE ( ets_timer_arm = 0x40008368 ); -PROVIDE ( ets_timer_arm_us = 0x400083ac ); -PROVIDE ( ets_timer_disarm = 0x400083ec ); -PROVIDE ( ets_timer_done = 0x40008428 ); -PROVIDE ( ets_timer_handler_isr = 0x40008454 ); -PROVIDE ( ets_timer_init = 0x400084e8 ); -PROVIDE ( ets_timer_setfn = 0x40008350 ); PROVIDE ( ets_unpack_flash_code = 0x40007018 ); PROVIDE ( ets_unpack_flash_code_legacy = 0x4000694c ); PROVIDE ( ets_update_cpu_frequency = 0x40008550 ); @@ -287,6 +284,7 @@ PROVIDE ( _global_impure_ptr = 0x3ffae0b0 ); PROVIDE ( gmtime = 0x40059848 ); PROVIDE ( gmtime_r = 0x40059868 ); PROVIDE ( g_phyFuns_instance = 0x3ffae0c4 ); +PROVIDE ( g_rom_flashchip = 0x3ffae270 ); PROVIDE ( gpio_init = 0x40009c20 ); PROVIDE ( gpio_input_get = 0x40009b88 ); PROVIDE ( gpio_input_get_high = 0x40009b9c ); @@ -435,16 +433,6 @@ PROVIDE ( __locale_mb_cur_max = 0x40059548 ); PROVIDE ( __locale_msgcharset = 0x40059550 ); PROVIDE ( localtime = 0x400595dc ); PROVIDE ( localtime_r = 0x400595fc ); -PROVIDE ( _lock_acquire = 0x4000be14 ); -PROVIDE ( _lock_acquire_recursive = 0x4000be28 ); -PROVIDE ( _lock_close = 0x4000bdec ); -PROVIDE ( _lock_close_recursive = 0x4000be00 ); -PROVIDE ( _lock_init = 0x4000bdc4 ); -PROVIDE ( _lock_init_recursive = 0x4000bdd8 ); -PROVIDE ( _lock_release = 0x4000be64 ); -PROVIDE ( _lock_release_recursive = 0x4000be78 ); -PROVIDE ( _lock_try_acquire = 0x4000be3c ); -PROVIDE ( _lock_try_acquire_recursive = 0x4000be50 ); PROVIDE ( longjmp = 0x400562cc ); PROVIDE ( _lseek_r = 0x4000bd8c ); PROVIDE ( __lshrdi3 = 0x4000c84c ); @@ -1838,9 +1826,33 @@ PROVIDE ( _xtos_set_exception_handler = 0x4000074c ); PROVIDE ( _xtos_set_interrupt_handler = 0x4000bf78 ); PROVIDE ( _xtos_set_interrupt_handler_arg = 0x4000bf34 ); PROVIDE ( _xtos_set_intlevel = 0x4000bfdc ); +PROVIDE ( g_ticks_per_us_pro = 0x3ffe01e0 ); +PROVIDE ( g_ticks_per_us_app = 0x3ffe40f0 ); PROVIDE ( _xtos_set_min_intlevel = 0x4000bff8 ); PROVIDE ( _xtos_set_vpri = 0x40000934 ); PROVIDE ( _xtos_syscall_handler = 0x40000790 ); PROVIDE ( _xtos_unhandled_exception = 0x4000c024 ); PROVIDE ( _xtos_unhandled_interrupt = 0x4000c01c ); PROVIDE ( _xtos_vpri_enabled = 0x3ffe0654 ); +PROVIDE ( g_rom_spiflash_chip = 0x3ffae270 ); +PROVIDE ( g_rom_spiflash_dummy_len_plus = 0x3ffae290 ); +PROVIDE ( esp_rom_spiflash_read_user_cmd = 0x400621b0 ); +PROVIDE ( esp_rom_spiflash_write_encrypted_enable = 0x40062df4 ); +PROVIDE ( esp_rom_spiflash_prepare_encrypted_data = 0x40062e1c ); + +memccpy = 0x4000c220; +memchr = 0x4000c244; +memcmp = 0x4000c260; +memcpy = 0x4000c2c8; +memmove = 0x4000c3c0; +memrchr = 0x4000c400; +memset = 0x4000c44c; +strchr = 0x4000c53c; +strcmp = 0x40001274; +strcpy = 0x400013ac; +strncpy = 0x400015d4; +strlen = 0x400014c0; +strnlen = 0x4000c628; +strcat = 0x4000c518; +strncasecmp = 0x40001550; +strncmp = 0x4000c5f4; diff --git a/boards/xtensa/esp32/esp32-core/src/esp32_bringup.c b/boards/xtensa/esp32/esp32-core/src/esp32_bringup.c index f2e0ce0c4a238..aa16d5aa2783f 100644 --- a/boards/xtensa/esp32/esp32-core/src/esp32_bringup.c +++ b/boards/xtensa/esp32/esp32-core/src/esp32_bringup.c @@ -45,6 +45,9 @@ #include "esp32-core.h" +#include +#include + /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ @@ -81,6 +84,23 @@ int esp32_bringup(void) } #endif +#ifdef CONFIG_ESP32_WIRELESS + /* Initialize spi_flash */ + uint32_t count = up_irq_save(); + spi_flash_init(); + /* init default OS-aware flash access critical section */ + spi_flash_guard_set(&g_flash_guard_default_ops); + esp_flash_app_init(); + + ret = esp_flash_init_default_chip(); + up_irq_restore(count); + if (ret != OK) + { + syslog(LOG_ERR, "Failed to initialize spi_flash: %d\n", ret); + return ret; + } +#endif + /* If we got here then perhaps not all initialization was successful, but * at least enough succeeded to bring-up NSH with perhaps reduced * capabilities. From cfad0c69c2f6ec2681c5558b54323439f946fbdb Mon Sep 17 00:00:00 2001 From: Chen Wen Date: Wed, 24 Jun 2020 19:43:30 +0800 Subject: [PATCH 3/4] xtensa/esp32: Support net_device --- arch/xtensa/src/esp32/Make.defs | 4 + arch/xtensa/src/esp32/esp32_wlan.c | 1989 +++++++++++++++++ .../esp32/esp32-core/configs/wlan/defconfig | 97 + .../esp32/esp32-core/src/esp32_bringup.c | 11 + 4 files changed, 2101 insertions(+) create mode 100644 arch/xtensa/src/esp32/esp32_wlan.c create mode 100644 boards/xtensa/esp32/esp32-core/configs/wlan/defconfig diff --git a/arch/xtensa/src/esp32/Make.defs b/arch/xtensa/src/esp32/Make.defs index 210161836c629..abd91aa6d2702 100644 --- a/arch/xtensa/src/esp32/Make.defs +++ b/arch/xtensa/src/esp32/Make.defs @@ -116,3 +116,7 @@ ifeq ($(CONFIG_ARCH_USE_MODULE_TEXT),y) CHIP_CSRCS += esp32_modtext.c CMN_ASRCS += xtensa_loadstore.S endif + +ifeq ($(CONFIG_ESP32_WIRELESS),y) +CHIP_CSRCS += esp32_wlan.c +endif \ No newline at end of file diff --git a/arch/xtensa/src/esp32/esp32_wlan.c b/arch/xtensa/src/esp32/esp32_wlan.c new file mode 100644 index 0000000000000..a6327d799b72c --- /dev/null +++ b/arch/xtensa/src/esp32/esp32_wlan.c @@ -0,0 +1,1989 @@ +/**************************************************************************** + * boards/arm/xtensa/src/esp32/esp32_wlan.c + * + * Copyright (C) 2017-2018 Gregory Nutt. All rights reserved. + * Author: Simon Piriou + * + * 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 NuttX 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. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(CONFIG_NET_PKT) +# include +#endif + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_ESP32_WIRELESS + +/**************************************************************************** + * Name: esp_wlan_initialize + ****************************************************************************/ + +#define CONFIG_ESP32_NINTERFACES 1 +#define STA_DEVNO 0 /* Only one ESP32 */ + +/* TX poll delay = 1 seconds. CLK_TCK is the number of clock ticks per second */ +#define ESP_WDDELAY (1*CLK_TCK) + +#define ESPWORK LPWORK + +/* TX timeout = 1 minute */ + +#define ESP_TXTIMEOUT (60*CLK_TCK) + +#define DEFAULT_SCAN_LIST_SIZE 2 + +/* Add 4 to the configured buffer size to account for the 2 byte checksum + * memory needed at the end of the maximum size packet. Buffer sizes must + * be an even multiple of 4, 8, or 16 bytes (depending on buswidth). We + * will use the 16-byte alignment in all cases. + */ + +#define OPTIMAL_ETH_BUFSIZE ((CONFIG_NET_ETH_PKTSIZE + 4 + 15) & ~15) + +#ifndef CONFIG_ESP_ETH_BUFSIZE +# define CONFIG_ESP_ETH_BUFSIZE OPTIMAL_ETH_BUFSIZE +#endif + +#ifndef CONFIG_ESP_ETH_NTXDESC +# define CONFIG_ESP_ETH_NTXDESC 4 +#endif + +/* We need at least one more free buffer than transmit buffers */ + +#define ESP_ETH_NFREEBUFFERS (CONFIG_ESP_ETH_NTXDESC+1) +#define ETH_MAX_LEN 1518 + +/* + * esp32 hardware interface + */ + +struct esp_dev_s +{ + bool esp_bifup; /* true:ifup false:ifdown */ + WDOG_ID esp_txpoll; /* TX poll timer */ + WDOG_ID esp_txtimeout; /* TX timeout timer */ + struct work_s esp_irqwork; /* For deferring interrupt work to the work queue */ + struct work_s esp_pollwork; /* For deferring poll work to the work queue */ + /* This holds the information visible to the NuttX network */ + struct net_driver_s esp_dev; + sq_queue_t freeb; /* The free buffer list */ + sem_t waitsem; /* Implements event waiting */ + /* Buffer allocations */ + uint8_t alloc[CONFIG_ESP_ETH_NTXDESC*CONFIG_ESP_ETH_BUFSIZE]; + uint8_t rxbuf[ETH_MAX_LEN]; + uint32_t rx_len; +}; + +/* This is a helper pointer for accessing the contents of the Ethernet header */ + +#define BUF ((struct eth_hdr_s *)priv->esp_dev.d_buf) + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ +static void esp_takesem(struct esp_dev_s *priv); +#define esp_givesem(priv) (nxsem_post(&priv->waitsem)) + +/* Free buffer management */ + +static void esp_initbuffer(FAR struct esp_dev_s *priv); +static inline uint8_t *esp_allocbuffer(FAR struct esp_dev_s *priv); +static inline void esp_freebuffer(FAR struct esp_dev_s *priv, + uint8_t *buffer); +static inline bool esp_isfreebuffer(FAR struct esp_dev_s *priv); + +/* Common TX logic */ + +static int esp_transmit(FAR struct esp_dev_s *priv); +static void esp_receive(FAR struct esp_dev_s *priv); +static int esp_txpoll(FAR struct net_driver_s *dev); +static void esp_rxpoll(FAR void *arg); +static void esp_dopoll(FAR struct esp_dev_s *priv); + +/* Watchdog timer expirations */ + +static void esp_txtimeout_work(FAR void *arg); +static void esp_txtimeout_expiry(int argc, uint32_t arg, ...); + +static void esp_poll_work(FAR void *arg); +static void esp_poll_expiry(int argc, wdparm_t arg, ...); + +/* NuttX callback functions */ + +static int esp_ifup(struct net_driver_s *dev); +static int esp_ifdown(struct net_driver_s *dev); + +static void esp_txavail_work(FAR void *arg); +static int esp_txavail(struct net_driver_s *dev); + +/* Driver status structure */ + +static struct esp_dev_s g_esp32[CONFIG_ESP32_NINTERFACES]; +wifi_config_t g_wifi_config; +volatile bool g_tx_ready = false; + +/**************************************************************************** + * Name: esp_takesem + * + * Description: + * Take the wait semaphore (handling false alarm wakeups due to the receipt + * of signals). + * + * Input Parameters: + * dev - Instance of the SDIO device driver state structure. + * + * Returned Value: + * None + * + ****************************************************************************/ + +static void esp_takesem(struct esp_dev_s *priv) +{ + int ret; + + do + { + /* Take the semaphore (perhaps waiting) */ + + ret = nxsem_wait(&priv->waitsem); + + /* The only case that an error should occur here is if the wait was + * awakened by a signal. + */ + + DEBUGASSERT(ret == OK || ret == -EINTR); + } + while (ret == -EINTR); +} + +/****************************** esp_idf wifi *******************************************/ + +/**************************************************************************** + * Low-level Helpers + ****************************************************************************/ + +static void print_auth_mode(int authmode) +{ + switch (authmode) { + case WIFI_AUTH_OPEN: + wlinfo("Authmode \tWIFI_AUTH_OPEN"); + break; + case WIFI_AUTH_WEP: + wlinfo("Authmode \tWIFI_AUTH_WEP"); + break; + case WIFI_AUTH_WPA_PSK: + wlinfo("Authmode \tWIFI_AUTH_WPA_PSK"); + break; + case WIFI_AUTH_WPA2_PSK: + wlinfo("Authmode \tWIFI_AUTH_WPA2_PSK"); + break; + case WIFI_AUTH_WPA_WPA2_PSK: + wlinfo("Authmode \tWIFI_AUTH_WPA_WPA2_PSK"); + break; + case WIFI_AUTH_WPA2_ENTERPRISE: + wlinfo("Authmode \tWIFI_AUTH_WPA2_ENTERPRISE"); + break; + default: + wlinfo("Authmode \tWIFI_AUTH_UNKNOWN"); + break; + } +} + +static void print_cipher_type(int pairwise_cipher, int group_cipher) +{ + switch (pairwise_cipher) { + case WIFI_CIPHER_TYPE_NONE: + wlinfo("Pairwise Cipher \tWIFI_CIPHER_TYPE_NONE"); + break; + case WIFI_CIPHER_TYPE_WEP40: + wlinfo("Pairwise Cipher \tWIFI_CIPHER_TYPE_WEP40"); + break; + case WIFI_CIPHER_TYPE_WEP104: + wlinfo("Pairwise Cipher \tWIFI_CIPHER_TYPE_WEP104"); + break; + case WIFI_CIPHER_TYPE_TKIP: + wlinfo("Pairwise Cipher \tWIFI_CIPHER_TYPE_TKIP"); + break; + case WIFI_CIPHER_TYPE_CCMP: + wlinfo("Pairwise Cipher \tWIFI_CIPHER_TYPE_CCMP"); + break; + case WIFI_CIPHER_TYPE_TKIP_CCMP: + wlinfo("Pairwise Cipher \tWIFI_CIPHER_TYPE_TKIP_CCMP"); + break; + default: + wlinfo("Pairwise Cipher \tWIFI_CIPHER_TYPE_UNKNOWN"); + break; + } + + switch (group_cipher) { + case WIFI_CIPHER_TYPE_NONE: + wlinfo("Group Cipher \tWIFI_CIPHER_TYPE_NONE"); + break; + case WIFI_CIPHER_TYPE_WEP40: + wlinfo("Group Cipher \tWIFI_CIPHER_TYPE_WEP40"); + break; + case WIFI_CIPHER_TYPE_WEP104: + wlinfo("Group Cipher \tWIFI_CIPHER_TYPE_WEP104"); + break; + case WIFI_CIPHER_TYPE_TKIP: + wlinfo("Group Cipher \tWIFI_CIPHER_TYPE_TKIP"); + break; + case WIFI_CIPHER_TYPE_CCMP: + wlinfo("Group Cipher \tWIFI_CIPHER_TYPE_CCMP"); + break; + case WIFI_CIPHER_TYPE_TKIP_CCMP: + wlinfo("Group Cipher \tWIFI_CIPHER_TYPE_TKIP_CCMP"); + break; + default: + wlinfo("Group Cipher \tWIFI_CIPHER_TYPE_UNKNOWN"); + break; + } +} + +/* Initialize Wi-Fi as sta and set scan method */ +int wifi_scan(void) +{ + uint16_t number = DEFAULT_SCAN_LIST_SIZE; + wifi_ap_record_t ap_info[DEFAULT_SCAN_LIST_SIZE]; + uint16_t ap_count = 0; + memset(ap_info, 0, sizeof(ap_info)); + + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); + ESP_ERROR_CHECK(esp_wifi_start()); + ESP_ERROR_CHECK(esp_wifi_scan_start(NULL, true)); + ESP_ERROR_CHECK(esp_wifi_scan_get_ap_records(&number, ap_info)); + ESP_ERROR_CHECK(esp_wifi_scan_get_ap_num(&ap_count)); + + wlinfo("Total APs scanned = %u", ap_count); + for (int i = 0; (i < DEFAULT_SCAN_LIST_SIZE) && (i < ap_count); i++) { + wlinfo("SSID \t\t%s", ap_info[i].ssid); + wlinfo("RSSI \t\t%d", ap_info[i].rssi); + print_auth_mode(ap_info[i].authmode); + if (ap_info[i].authmode != WIFI_AUTH_WEP) { + print_cipher_type(ap_info[i].pairwise_cipher, ap_info[i].group_cipher); + } + wlinfo("Channel \t\t%d\n", ap_info[i].primary); + } + + return OK; +} + +int esp_wl_set_auth_param(FAR struct esp_dev_s *priv, struct iwreq *iwr) +{ + int ret = -ENOSYS; + int interface; + uint32_t out_len; + + esp_wifi_get_mode(&interface); + + if (interface < 0) + { + ets_printf("[%s]lien: %d\r\n", __func__, __LINE__); + return -EINVAL; + } + + switch (iwr->u.param.flags & IW_AUTH_INDEX) + { + case IW_AUTH_WPA_VERSION: + { + uint32_t wpa_version[2]; + uint32_t auth_mode; + + switch (iwr->u.param.value) + { + case IW_AUTH_WPA_VERSION_DISABLED: + wpa_version[1] = 0; + auth_mode = WIFI_AUTH_WPA_PSK; + break; + + case IW_AUTH_WPA_VERSION_WPA: + wpa_version[1] = 1; + auth_mode = WIFI_AUTH_WPA_PSK; + break; + + case IW_AUTH_WPA_VERSION_WPA2: + wpa_version[1] = 1; + auth_mode = WIFI_AUTH_WPA_PSK; + break; + + default: + wlerr("Invalid wpa version %d\n", iwr->u.param.value); + return -EINVAL; + } + } + + return OK; + + case IW_AUTH_CIPHER_PAIRWISE: + case IW_AUTH_CIPHER_GROUP: + { + uint32_t wpa_version[2]; + uint32_t auth_mode; + iwr->u.param.value = IW_AUTH_WPA_VERSION_WPA2; + switch (iwr->u.param.value) + { + case IW_AUTH_WPA_VERSION_DISABLED: + wpa_version[1] = 0; + auth_mode = WIFI_AUTH_WPA_WPA2_PSK; + break; + + case IW_AUTH_WPA_VERSION_WPA: + wpa_version[1] = 1; + auth_mode = WIFI_AUTH_WPA_WPA2_PSK; + break; + + case IW_AUTH_WPA_VERSION_WPA2: + wpa_version[1] = 1; + auth_mode = WIFI_AUTH_WPA_WPA2_PSK; + break; + + default: + ets_printf("[%s]lien: %d\r\n", __func__, __LINE__); + wlerr("Invalid wpa version %d\n", iwr->u.param.value); + return -EINVAL; + } + + out_len = 8; + wpa_version[0] = interface; + + } + + return OK; + + case IW_AUTH_KEY_MGMT: + case IW_AUTH_TKIP_COUNTERMEASURES: + case IW_AUTH_DROP_UNENCRYPTED: + case IW_AUTH_80211_AUTH_ALG: + case IW_AUTH_WPA_ENABLED: + case IW_AUTH_RX_UNENCRYPTED_EAPOL: + case IW_AUTH_ROAMING_CONTROL: + case IW_AUTH_PRIVACY_INVOKED: + default: + wlerr("Unknown cmd %d\n", iwr->u.param.flags); + break; + } + + return ret; +} + +wifi_mode_t esp_mode_trans(uint32_t option) +{ + wifi_mode_t mode = WIFI_MODE_NULL; + + switch (option) + { + case IW_MODE_AUTO: + case IW_MODE_ADHOC: + case IW_MODE_INFRA: + case IW_MODE_MONITOR: + mode = WIFI_MODE_STA; + break; + case IW_MODE_MASTER: + mode = WIFI_MODE_AP; + break; + case IW_MODE_REPEAT: + case IW_MODE_SECOND: + mode = WIFI_MODE_APSTA; + break; + case IW_MODE_MESH: + default: + wlerr("Failed to set wireless mode: %d", option); + break; + } + + return mode; +} + +int esp_wl_set_mode(FAR struct esp_dev_s *priv, struct iwreq *iwr) +{ + uint32_t out_len; + wifi_mode_t mode; + wifi_mode_t op_mode = WIFI_MODE_NULL; + + esp_wifi_get_mode(&op_mode); + + if (op_mode < 0) + { + ets_printf("[%s]lien: %d\r\n", __func__, __LINE__); + return -EINVAL; + } + + mode = esp_mode_trans(iwr->u.mode); + + if (mode != op_mode) + { + wlerr("Set wireless mode: %d", mode); + esp_wifi_set_mode(mode); + } + + if (iwr->u.mode == IW_MODE_MONITOR) + { + wlinfo("Enter wifi monitor"); + } + + return OK; +} + +int esp_wl_get_frequency(FAR struct esp_dev_s *priv, struct iwreq *iwr) +{ + uint8_t primary_chan = 1; + uint8_t switch_chan = 1; + wifi_second_chan_t second_chan; + iwr->u.freq.flags = IW_FREQ_FIXED; + int ret = esp_wifi_get_channel(&primary_chan, &second_chan); + if (ret == ESP_OK) + { + iwr->u.freq.m = primary_chan; + iwr->u.freq.e = 0; + return OK; + } + else + { + return -EINVAL; + } +} + + +int esp_wl_set_encode_ext(FAR struct esp_dev_s *priv, struct iwreq *iwr) +{ + wifi_mode_t op_mode = WIFI_MODE_NULL; + struct iw_encode_ext *ext; + uint32_t out_len; + + esp_wifi_get_mode(&op_mode); + + if (op_mode < 0) + { + wlerr("Failed to get mode"); + return -EINVAL; + } + + ext = (struct iw_encode_ext *)iwr->u.encoding.pointer; + + switch (ext->alg) + { + case IW_ENCODE_ALG_TKIP: + break; + case IW_ENCODE_ALG_CCMP: + break; + case IW_ENCODE_ALG_NONE: + case IW_ENCODE_ALG_WEP: + default: + wlerr("Unknown algo %d\n", ext->alg); + return -EINVAL; + } + + memcpy(g_wifi_config.sta.password, &ext->key, ext->key_len); + + return OK; +} + +#define EXAMPLE_ESP_MAXIMUM_RETRY 5 +static int s_retry_num = 0; + +static void event_handler(void* arg, esp_event_base_t event_base, + int32_t event_id, void* event_data) +{ + struct esp_dev_s *priv = &g_esp32[0]; + + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) + { + wlinfo("start to connect AP"); + esp_wifi_connect(); + } + else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) + { + if (s_retry_num < EXAMPLE_ESP_MAXIMUM_RETRY) + { + esp_wifi_connect(); + s_retry_num++; + wlinfo("retry to connect to the AP"); + } + + wlwarn("connect to the AP fail"); + } + else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_CONNECTED) + { + wlinfo("sta connect AP\r\n"); + g_tx_ready = true; + esp_givesem(priv); + } +} + +int esp_wl_set_ssid(FAR struct esp_dev_s *priv, struct iwreq *iwr) +{ + int ret; + wifi_mode_t op_mode = WIFI_MODE_NULL; + ESP_ERROR_CHECK(esp_event_loop_create_default()); + ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, priv)); + + esp_wifi_get_mode(&op_mode); + + if (op_mode < 0) + { + wlerr("Failed to get mode"); + return -EINVAL; + } + + memcpy(g_wifi_config.sta.ssid, iwr->u.essid.pointer, iwr->u.essid.length); + ESP_ERROR_CHECK( esp_wifi_set_ps(WIFI_PS_NONE) ); + ESP_ERROR_CHECK( esp_wifi_set_config(ESP_IF_WIFI_STA, &g_wifi_config) ); + ESP_ERROR_CHECK( esp_wifi_start() ); + wlinfo("wifi_init_sta finished.\r\n"); + + return OK; +} + + +/****************************** esp_idf wifi *******************************************/ + +int wifi_initialize() +{ + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + int ret = esp_wifi_init_internal(&cfg); + + if (ret == ESP_OK) + { + ret = esp_supplicant_init(); + if (ret != ESP_OK) + { + wlerr("Failed to init supplicant (0x%x)", ret); + esp_err_t deinit_ret = esp_wifi_deinit(); + if (deinit_ret != ESP_OK) + { + wlerr("Failed to deinit Wi-Fi (0x%x)", deinit_ret); + } + + return ret; + } + } + else + { + wlerr("Failed wifi (0x%x)", ret); + } + + return ret; +} + +/**************************************************************************** + * Function: esp_initbuffer + * + * Description: + * Initialize the free buffer list. + * + * Input Parameters: + * priv - Reference to the driver state structure + * + * Returned Value: + * None + * + * Assumptions: + * Called during early driver initialization before Ethernet interrupts + * are enabled. + * + ****************************************************************************/ + +static void esp_initbuffer(FAR struct esp_dev_s *priv) +{ + uint8_t *buffer; + int i; + + /* Initialize the head of the free buffer list */ + + sq_init(&priv->freeb); + + /* Add all of the pre-allocated buffers to the free buffer list */ + + for (i = 0, buffer = priv->alloc; + i < ESP_ETH_NFREEBUFFERS; + i++, buffer += CONFIG_ESP_ETH_BUFSIZE) + { + sq_addlast((FAR sq_entry_t *)buffer, &priv->freeb); + } +} + +/**************************************************************************** + * Function: esp_allocbuffer + * + * Description: + * Allocate one buffer from the free buffer list. + * + * Input Parameters: + * priv - Reference to the driver state structure + * + * Returned Value: + * Pointer to the allocated buffer on success; NULL on failure + * + * Assumptions: + * May or may not be called from an interrupt handler. In either case, + * global interrupts are disabled, either explicitly or indirectly through + * interrupt handling logic. + * + ****************************************************************************/ + +static inline uint8_t *esp_allocbuffer(FAR struct esp_dev_s *priv) +{ + /* Allocate a buffer by returning the head of the free buffer list */ + + return (uint8_t *)sq_remfirst(&priv->freeb); +} + +/**************************************************************************** + * Function: esp_freebuffer + * + * Description: + * Return a buffer to the free buffer list. + * + * Input Parameters: + * priv - Reference to the driver state structure + * buffer - A pointer to the buffer to be freed + * + * Returned Value: + * None + * + * Assumptions: + * May or may not be called from an interrupt handler. In either case, + * global interrupts are disabled, either explicitly or indirectly through + * interrupt handling logic. + * + ****************************************************************************/ + +static inline void esp_freebuffer(FAR struct esp_dev_s *priv, uint8_t *buffer) +{ + /* Free the buffer by adding it to the end of the free buffer list */ + + sq_addlast((FAR sq_entry_t *)buffer, &priv->freeb); +} + +/**************************************************************************** + * Function: esp_isfreebuffer + * + * Description: + * Return TRUE if the free buffer list is not empty. + * + * Input Parameters: + * priv - Reference to the driver state structure + * + * Returned Value: + * True if there are one or more buffers in the free buffer list; + * false if the free buffer list is empty + * + * Assumptions: + * None. + * + ****************************************************************************/ + +static inline bool esp_isfreebuffer(FAR struct esp_dev_s *priv) +{ + /* Return TRUE if the free buffer list is not empty */ + + return !sq_empty(&priv->freeb); +} + +/**************************************************************************** + * Name: esp_transmit + * + * Description: + * Start hardware transmission. Called either from the txdone interrupt + * handling or from watchdog based polling. + * + * Input Parameters: + * priv - Reference to the driver state structure + * + * Returned Value: + * OK on success; a negated errno on failure + * + * Assumptions: + * May or may not be called from an interrupt handler. In either case, + * the network is locked. + * + ****************************************************************************/ + +static int esp_transmit(FAR struct esp_dev_s *priv) +{ + int ret = 0; + uint8_t *buffer; + uint32_t buffer_len; + int bufcount; + int lastsize; + int i; + /* Set up all but the last TX descriptor */ + + buffer = priv->esp_dev.d_buf; + buffer_len = priv->esp_dev.d_len; + wlinfo("send_buf len: %d\r\n", buffer_len); + ret = esp_wifi_internal_tx(WIFI_IF_STA, buffer, buffer_len); + + if (ret != ESP_OK) + { + wlerr("ERROR: Failed to transmit frame\n"); + (void)wd_start(priv->esp_txtimeout, ESP_TXTIMEOUT, esp_txtimeout_expiry, 1, (uint32_t)priv); + return -EIO; + } + + return OK; +} + +/**************************************************************************** + * Function: esp_recvframe + * + * Description: + * The function is called when a frame is received using the DMA receive + * interrupt. It scans the RX descriptors of the received frame. + * + * NOTE: This function will silently discard any packets containing errors. + * + * Input Parameters: + * priv - Reference to the driver state structure + * + * Returned Value: + * OK if a packet was successfully returned; -EAGAIN if there are no + * further packets available + * + * Assumptions: + * Global interrupts are disabled by interrupt handling logic. + * + ****************************************************************************/ + +static int esp_recvframe(FAR struct esp_dev_s *priv) +{ + struct net_driver_s *dev = &priv->esp_dev; + uint8_t *buffer; + uint32_t buffer_len = 0; + int i; + + buffer = dev->d_buf; + buffer_len = dev->d_len; + /* Check if there are free buffers. We cannot receive new frames in this + * design unless there is at least one free buffer. + */ + + if (!esp_isfreebuffer(priv)) + { + wlerr("ERROR: No free buffers\n"); + return -ENOMEM; + } + + /* Check if any errors are reported in the frame */ + + if (buffer == NULL || buffer_len == 0) + { + return -EAGAIN; + } + + return OK; +} + +/**************************************************************************** + * Function: esp_receive + * + * Description: + * An interrupt was received indicating the availability of a new RX packet + * + * Input Parameters: + * priv - Reference to the driver state structure + * + * Returned Value: + * None + * + * Assumptions: + * Global interrupts are disabled by interrupt handling logic. + * + ****************************************************************************/ + +static void esp_receive(FAR struct esp_dev_s *priv) +{ + struct net_driver_s *dev = &priv->esp_dev; + + /* Loop while while stm32_recvframe() successfully retrieves valid + * Ethernet frames. + */ + + while (esp_recvframe(priv) == OK) + { +#ifdef CONFIG_NET_PKT + /* When packet sockets are enabled, feed the frame into the packet tap */ + + pkt_input(&priv->esp_dev); +#endif + + /* Check if the packet is a valid size for the network buffer configuration + * (this should not happen) + */ + + if (dev->d_len > CONFIG_NET_ETH_PKTSIZE) + { + nwarn("WARNING: DROPPED Too big: %d\n", dev->d_len); + + /* Free dropped packet buffer */ + + if (dev->d_buf) + { + esp_freebuffer(priv, dev->d_buf); + dev->d_buf = NULL; + dev->d_len = 0; + } + + continue; + } + + /* We only accept IP packets of the configured type and ARP packets */ + +#ifdef CONFIG_NET_IPv4 + if (BUF->type == HTONS(ETHTYPE_IP)) + { + ninfo("IPv4 frame\n"); + + /* Handle ARP on input then give the IPv4 packet to the network + * layer + */ + + arp_ipin(&priv->esp_dev); + ipv4_input(&priv->esp_dev); + + /* If the above function invocation resulted in data that should be + * sent out on the network, the field d_len will set to a value > 0. + */ + + if (priv->esp_dev.d_len > 0) + { + /* Update the Ethernet header with the correct MAC address */ + +#ifdef CONFIG_NET_IPv6 + if (IFF_IS_IPv4(priv->esp_dev.d_flags)) +#endif + { + arp_out(&priv->esp_dev); + } +#ifdef CONFIG_NET_IPv6 + else + { + neighbor_out(&priv->esp_dev); + } +#endif + + /* And send the packet */ + + esp_transmit(priv); + } + } + else +#endif +#ifdef CONFIG_NET_IPv6 + if (BUF->type == HTONS(ETHTYPE_IP6)) + { + ninfo("Iv6 frame\n"); + + /* Give the IPv6 packet to the network layer */ + + ipv6_input(&priv->esp_dev); + + /* If the above function invocation resulted in data that should be + * sent out on the network, the field d_len will set to a value > 0. + */ + + if (priv->esp_dev.d_len > 0) + { + /* Update the Ethernet header with the correct MAC address */ + +#ifdef CONFIG_NET_IPv4 + if (IFF_IS_IPv4(priv->esp_dev.d_flags)) + { + arp_out(&priv->esp_dev); + } + else +#endif +#ifdef CONFIG_NET_IPv6 + { + neighbor_out(&priv->esp_dev); + } +#endif + + /* And send the packet */ + + esp_transmit(priv); + } + } + else +#endif +#ifdef CONFIG_NET_ARP + if (BUF->type == htons(ETHTYPE_ARP)) + { + ninfo("ARP frame\n"); + + /* Handle ARP packet */ + + arp_arpin(&priv->esp_dev); + + /* If the above function invocation resulted in data that should be + * sent out on the network, the field d_len will set to a value > 0. + */ + + if (priv->esp_dev.d_len > 0) + { + esp_transmit(priv); + } + } + else +#endif + { + nerr("ERROR: Dropped, Unknown type: %04x\n", BUF->type); + } + + /* We are finished with the RX buffer. NOTE: If the buffer is + * re-used for transmission, the dev->d_buf field will have been + * nullified. + */ + + if (dev->d_buf) + { + /* Free the receive packet buffer */ + esp_freebuffer(priv, dev->d_buf); + dev->d_buf = NULL; + dev->d_len = 0; + } + } +} + +/**************************************************************************** + * Name: esp_txpoll + * + * Description: + * The transmitter is available, check if the network has any outgoing + * packets ready to send. This is a callback from devif_poll(). + * devif_poll() may be called: + * + * 1. When the preceding TX packet send is complete, + * 2. When the preceding TX packet send times out and the interface is + * reset + * 3. During normal TX polling + * + * Input Parameters: + * dev - Reference to the NuttX driver state structure + * + * Returned Value: + * OK on success; a negated errno on failure + * + * Assumptions: + * May or may not be called from an interrupt handler. In either case, + * the network is locked. + * + ****************************************************************************/ + +static int esp_txpoll(FAR struct net_driver_s *dev) +{ + FAR struct esp_dev_s *priv = (FAR struct esp_dev_s *)dev->d_private; + + DEBUGASSERT(priv->esp_dev.d_buf != NULL); + + /* If the polling resulted in data that should be sent out on the network, + * the field d_len is set to a value > 0. + */ + + if (priv->esp_dev.d_len > 0) + { + /* Look up the destination MAC address and add it to the Ethernet + * header. + */ + +#ifdef CONFIG_NET_IPv4 +#ifdef CONFIG_NET_IPv6 + if (IFF_IS_IPv4(priv->esp_dev.d_flags)) +#endif + { + arp_out(&priv->esp_dev); + } +#endif /* CONFIG_NET_IPv4 */ + +#ifdef CONFIG_NET_IPv6 +#ifdef CONFIG_NET_IPv4 + else +#endif + { + neighbor_out(&priv->esp_dev); + } +#endif /* CONFIG_NET_IPv6 */ + + if (!devif_loopback(&priv->esp_dev)) + { + /* Send the packet */ + + int ret = esp_transmit(priv); + if (ret != OK) + { + wlerr("TX failed\r\n"); + return -EBUSY; + } + } + } + + /* If zero is returned, the polling will continue until all connections have + * been examined. + */ + + return OK; +} + +/**************************************************************************** + * Name: esp_rxpoll + * + * Description: + * Process RX frames + * + * Input Parameters: + * arg - context of device to use + * + * Returned Value: + * OK on success + * + * Assumptions: + * The network is locked. + * + ****************************************************************************/ + +static void esp_rxpoll(FAR void *arg) +{ + FAR struct esp_dev_s *priv = (FAR struct esp_dev_s *)arg; + + if (priv->esp_dev.d_buf == NULL) + { + priv->esp_dev.d_buf = priv->rxbuf; + priv->esp_dev.d_len = priv->rx_len; + + } + else + { + ninfo("priv->esp_dev.d_buf != NULL"); + return; + } + /* Lock the network and serialize driver operations if necessary. + * NOTE: Serialization is only required in the case where the driver work + * is performed on an LP worker thread and where more than one LP worker + * thread has been configured. + */ + esp_takesem(priv); + + net_lock(); + + esp_receive(priv); + + /* Check if a packet transmission just completed. If so, call esp_txdone. + * This may disable further Tx interrupts if there are no pending + * transmissions. + */ + + net_unlock(); + if (priv->esp_dev.d_buf) + { + priv->esp_dev.d_buf = NULL; + memset(priv->rxbuf, 0x0, sizeof(priv->rxbuf)); + priv->rx_len = 0; + } + + esp_givesem(priv); +} + +/**************************************************************************** + * Name: esp_netdev_notify_rx + * + * Description: + * Notify callback called when RX frame is available + * + * Assumptions: + * + ****************************************************************************/ + +void esp_netdev_notify_rx(FAR struct esp_dev_s *priv, void *buffer, uint16_t len) +{ + struct esp_dev_s *priv_dev = priv; + + memcpy(priv_dev->rxbuf, buffer, len); + priv_dev->rx_len = len; + work_queue(ESPWORK, &priv_dev->esp_irqwork, esp_rxpoll, priv_dev, 0); +} + +/** + * This function should be called when a packet is ready to be read + * from the interface. It uses the function low_level_input() that + * should handle the actual reception of bytes from the network + * interface. Then the type of the received packet is determined and + * the appropriate input function is called. + * + * @param netif the lwip network interface structure for this ethernetif + */ + +esp_err_t esp_sta_input(void *buffer, uint16_t len, void *eb) +{ + FAR struct esp_dev_s *priv = &g_esp32[0]; + + if(!buffer || (priv->esp_bifup == false)) + { + if (eb) + { + esp_wifi_internal_free_rx_buffer(eb); + } + + return ESP_FAIL; + } + else + { + esp_netdev_notify_rx(priv, buffer, len); + } + + esp_wifi_internal_free_rx_buffer(eb); + + return ESP_OK; +} + +/**************************************************************************** + * Function: esp_txtimeout_work + * + * Description: + * Perform TX timeout related work from the worker thread + * + * Input Parameters: + * arg - The argument passed when work_queue() as called. + * + * Returned Value: + * OK on success + * + * Assumptions: + * Ethernet interrupts are disabled + * + ****************************************************************************/ + +static void esp_txtimeout_work(void *arg) +{ + struct esp_dev_s *priv = (struct esp_dev_s *)arg; + + /* Reset the hardware. Just take the interface down, then back up again. */ + + net_lock(); + esp_ifdown(&priv->esp_dev); + esp_ifup(&priv->esp_dev); + + /* Then poll for new XMIT data */ + + esp_dopoll(priv); + net_unlock(); +} + +/**************************************************************************** + * Function: esp_txtimeout_expiry + * + * Description: + * Our TX watchdog timed out. Called from the timer interrupt handler. + * The last TX never completed. Reset the hardware and start again. + * + * Input Parameters: + * argc - The number of available arguments + * arg - The first argument + * + * Returned Value: + * None + * + * Assumptions: + * Global interrupts are disabled by the watchdog logic. + * + ****************************************************************************/ + +static void esp_txtimeout_expiry(int argc, uint32_t arg, ...) +{ + struct esp_dev_s *priv = (struct esp_dev_s *)arg; + + wlinfo("Timeout!\n"); + + /* Disable further Ethernet interrupts. This will prevent some race + * conditions with interrupt work. There is still a potential race + * condition with interrupt work that is already queued and in progress. + * + * Interrupts will be re-enabled when stm32_ifup() is called. + */ + + + /* Schedule to perform the TX timeout processing on the worker thread. */ + + DEBUGASSERT(work_available(&priv->esp_irqwork)); + + work_queue(ESPWORK, &priv->esp_irqwork, esp_txtimeout_work, priv, 0); +} + +/**************************************************************************** + * Name: esp_poll_work + * + * Description: + * Perform periodic polling from the worker thread + * + * Input Parameters: + * arg - The argument passed when work_queue() as called. + * + * Returned Value: + * OK on success + * + * Assumptions: + * The network is locked. + * + ****************************************************************************/ + +static void esp_poll_work(FAR void *arg) +{ + FAR struct esp_dev_s *priv = (FAR struct esp_dev_s *)arg; + struct net_driver_s *dev = &priv->esp_dev; + + /* Lock the network and serialize driver operations if necessary. + * NOTE: Serialization is only required in the case where the driver work + * is performed on an LP worker thread and where more than one LP worker + * thread has been configured. + */ + + net_lock(); + + /* Perform the poll */ + + /* Check if there is room in the send another TX packet. We cannot perform + * the TX poll if he are unable to accept another packet for transmission. + */ + if (g_tx_ready == true) + { + DEBUGASSERT(dev->d_len == 0 && dev->d_buf == NULL); + dev->d_buf = esp_allocbuffer(priv); + + /* We can't poll if we have no buffers */ + if (dev->d_buf) + { + /* Update TCP timing states and poll the network for new XMIT data. + */ + + (void)devif_timer(&priv->esp_dev, ESP_WDDELAY, esp_txpoll); + + /* We will, most likely end up with a buffer to be freed. But it + * might not be the same one that we allocated above. + */ + + if (dev->d_buf) + { + DEBUGASSERT(dev->d_len == 0); + esp_freebuffer(priv, dev->d_buf); + dev->d_buf = NULL; + } + } + else + { + wlerr("ERROR: Failed to TX pkt"); + } + } + + net_unlock(); +} + +/**************************************************************************** + * Name: esp_poll_expiry + * + * Description: + * Periodic timer handler. Called from the timer interrupt handler. + * + * Input Parameters: + * argc - The number of available arguments + * arg - The first argument + * + * Returned Value: + * None + * + * Assumptions: + * Global interrupts are disabled by the watchdog logic. + * + ****************************************************************************/ + +static void esp_poll_expiry(int argc, wdparm_t arg, ...) +{ + FAR struct esp_dev_s *priv = (FAR struct esp_dev_s *)arg; + + /* Schedule to perform the interrupt processing on the worker thread. */ + + work_queue(ESPWORK, &priv->esp_pollwork, esp_poll_work, priv, 0); +} + +/**************************************************************************** + * Name: esp_ifup + * + * Description: + * NuttX Callback: Bring up the Ethernet interface when an IP address is + * provided + * + * Input Parameters: + * dev - Reference to the NuttX driver state structure + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +static int esp_ifup(FAR struct net_driver_s *dev) +{ + FAR struct esp_dev_s *priv = (FAR struct esp_dev_s *)dev->d_private; + +#ifdef CONFIG_NET_IPv4 + wlinfo("Bringing up: %d.%d.%d.%d\n", + dev->d_ipaddr & 0xff, (dev->d_ipaddr >> 8) & 0xff, + (dev->d_ipaddr >> 16) & 0xff, dev->d_ipaddr >> 24); +#endif +#ifdef CONFIG_NET_IPv6 + winfo("Bringing up: %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n", + dev->d_ipv6addr[0], dev->d_ipv6addr[1], dev->d_ipv6addr[2], + dev->d_ipv6addr[3], dev->d_ipv6addr[4], dev->d_ipv6addr[5], + dev->d_ipv6addr[6], dev->d_ipv6addr[7]); +#endif + + /* Instantiate the MAC address from priv->esp_dev.d_mac.ether.ether_addr_octet */ + +#ifdef CONFIG_NET_ICMPv6 + /* Set up IPv6 multicast address filtering */ + + esp_ipv6multicast(priv); +#endif + + /* Initialize the free buffer list */ + + esp_initbuffer(priv); + + /* Set and activate a timer process */ + + (void)wd_start(priv->esp_txpoll, ESP_WDDELAY, esp_poll_expiry, 1, + (wdparm_t)priv); + + /* Enable the hardware interrupt */ + + priv->esp_bifup = true; + + return OK; +} + +/**************************************************************************** + * Function: esp_dopoll + * + * Description: + * The function is called in order to perform an out-of-sequence TX poll. + * This is done: + * + * 1. After completion of a transmission (esp32_txdone), + * 2. When new TX data is available (esp32_txavail_process), and + * 3. After a TX timeout to restart the sending process + * (stm32_txtimeout_process). + * + * Input Parameters: + * priv - Reference to the driver state structure + * + * Returned Value: + * None + * + * Assumptions: + * Global interrupts are disabled by interrupt handling logic. + * + ****************************************************************************/ + +static void esp_dopoll(FAR struct esp_dev_s *priv) +{ + FAR struct net_driver_s *dev = &priv->esp_dev; + + /* Check if the next TX descriptor is owned by the Ethernet DMA or + * CPU. We cannot perform the TX poll if we are unable to accept + * another packet for transmission. + * + * In a race condition, ETH_TDES0_OWN may be cleared BUT still not available + * because stm32_freeframe() has not yet run. If stm32_freeframe() has run, + * the buffer1 pointer (tdes2) will be nullified (and inflight should be < + * CONFIG_STM32F7_ETH_NTXDESC). + */ + /* Check if there is room in the hardware to hold another outgoing packet. */ + + if (g_tx_ready == true) + { + DEBUGASSERT(dev->d_len == 0 && dev->d_buf == NULL); + dev->d_buf = esp_allocbuffer(priv); + + /* We can't poll if we have no buffers */ + if (dev->d_buf) + { + /* If so, then poll the network for new XMIT data */ + (void)devif_poll(dev, esp_txpoll); + + /* We will, most likely end up with a buffer to be freed. But it + * might not be the same one that we allocated above. + */ + + if (dev->d_buf) + { + DEBUGASSERT(dev->d_len == 0); + esp_freebuffer(priv, dev->d_buf); + dev->d_buf = NULL; + } + } + else + { + wlerr("Alloc buffer error"); + } + } + else + { + wlwarn("Tx is not ready"); + } + +} + +/**************************************************************************** + * Name: esp_ifdown + * + * Description: + * NuttX Callback: Stop the interface. + * + * Input Parameters: + * dev - Reference to the NuttX driver state structure + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +static int esp_ifdown(FAR struct net_driver_s *dev) +{ + FAR struct esp_dev_s *priv = (FAR struct esp_dev_s *)dev->d_private; + irqstate_t flags; + + /* Disable the hardware interrupt */ + + flags = enter_critical_section(); +#warning Missing logic + + /* Cancel the TX poll timer and TX timeout timers */ + + wd_cancel(priv->esp_txpoll); + wd_cancel(priv->esp_txtimeout); + /* Put the EMAC in its reset, non-operational state. This should be + * a known configuration that will guarantee the esp_ifup() always + * successfully brings the interface back up. + */ + + /* Mark the device "down" */ + + priv->esp_bifup = false; + leave_critical_section(flags); + + return OK; +} + +/**************************************************************************** + * Name: esp_txavail_work + * + * Description: + * Perform an out-of-cycle poll on the worker thread. + * + * Input Parameters: + * arg - Reference to the NuttX driver state structure (cast to void*) + * + * Returned Value: + * None + * + * Assumptions: + * Called on the higher priority worker thread. + * + ****************************************************************************/ + +static void esp_txavail_work(FAR void *arg) +{ + FAR struct esp_dev_s *priv = (FAR struct esp_dev_s *)arg; + + /* Lock the network and serialize driver operations if necessary. + * NOTE: Serialization is only required in the case where the driver work + * is performed on an LP worker thread and where more than one LP worker + * thread has been configured. + */ + + net_lock(); + + /* Ignore the notification if the interface is not yet up */ + + if (priv->esp_bifup) + { + esp_takesem(priv); + /* Poll the network for new XMIT data */ + + esp_dopoll(priv); + + esp_givesem(priv); + } + + net_unlock(); +} + + +/**************************************************************************** + * Name: esp_txavail + * + * Description: + * Driver callback invoked when new TX data is available. This is a + * stimulus perform an out-of-cycle poll and, thereby, reduce the TX + * latency. + * + * Input Parameters: + * dev - Reference to the NuttX driver state structure + * + * Returned Value: + * None + * + * Assumptions: + * Called in normal user mode + * + ****************************************************************************/ + +static int esp_txavail(FAR struct net_driver_s *dev) +{ + FAR struct esp_dev_s *priv = (FAR struct esp_dev_s *)dev->d_private; + + /* Is our single work structure available? It may not be if there are + * pending interrupt actions and we will have to ignore the Tx + * availability action. + */ + + if (work_available(&priv->esp_pollwork)) + { + /* Schedule to serialize the poll on the worker thread. */ + + work_queue(ESPWORK, &priv->esp_pollwork, esp_txavail_work, priv, 0); + } + + return OK; +} + +/**************************************************************************** + * Name: esp_addmac + * + * Description: + * NuttX Callback: Add the specified MAC address to the hardware multicast + * address filtering + * + * Input Parameters: + * dev - Reference to the NuttX driver state structure + * mac - The MAC address to be added + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +#if defined(CONFIG_NET_MCASTGROUP) || defined(CONFIG_NET_ICMPv6) +static int esp_addmac(FAR struct net_driver_s *dev, FAR const uint8_t *mac) +{ + FAR struct esp_dev_s *priv = (FAR struct esp_dev_s *)dev->d_private; + + /* Add the MAC address to the hardware multicast routing table */ + + return OK; +} +#endif + +/**************************************************************************** + * Name: esp_rmmac + * + * Description: + * NuttX Callback: Remove the specified MAC address from the hardware multicast + * address filtering + * + * Input Parameters: + * dev - Reference to the NuttX driver state structure + * mac - The MAC address to be removed + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +#ifdef CONFIG_NET_MCASTGROUP +static int esp_rmmac(FAR struct net_driver_s *dev, FAR const uint8_t *mac) +{ + FAR struct esp_dev_s *priv = (FAR struct esp_dev_s *)dev->d_private; + + /* Add the MAC address to the hardware multicast routing table */ + + return OK; +} +#endif + +/**************************************************************************** + * Name: esp_ipv6multicast + * + * Description: + * Configure the IPv6 multicast MAC address. + * + * Input Parameters: + * priv - A reference to the private driver state structure + * + * Returned Value: + * OK on success; Negated errno on failure. + * + * Assumptions: + * + ****************************************************************************/ + +#ifdef CONFIG_NET_ICMPv6 +static void esp_ipv6multicast(FAR struct esp_dev_s *priv) +{ + FAR struct net_driver_s *dev; + uint16_t tmp16; + uint8_t mac[6]; + + /* For ICMPv6, we need to add the IPv6 multicast address + * + * For IPv6 multicast addresses, the Ethernet MAC is derived by + * the four low-order octets OR'ed with the MAC 33:33:00:00:00:00, + * so for example the IPv6 address FF02:DEAD:BEEF::1:3 would map + * to the Ethernet MAC address 33:33:00:01:00:03. + * + * NOTES: This appears correct for the ICMPv6 Router Solicitation + * Message, but the ICMPv6 Neighbor Solicitation message seems to + * use 33:33:ff:01:00:03. + */ + + mac[0] = 0x33; + mac[1] = 0x33; + + dev = &priv->esp_dev; + tmp16 = dev->d_ipv6addr[6]; + mac[2] = 0xff; + mac[3] = tmp16 >> 8; + + tmp16 = dev->d_ipv6addr[7]; + mac[4] = tmp16 & 0xff; + mac[5] = tmp16 >> 8; + + ninfo("IPv6 Multicast: %02x:%02x:%02x:%02x:%02x:%02x\n", + mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + + esp_addmac(dev, mac); + +#ifdef CONFIG_NET_ICMPv6_AUTOCONF + /* Add the IPv6 all link-local nodes Ethernet address. This is the + * address that we expect to receive ICMPv6 Router Advertisement + * packets. + */ + + esp_addmac(dev, g_ipv6_ethallnodes.ether_addr_octet); +#endif /* CONFIG_NET_ICMPv6_AUTOCONF */ + +#ifdef CONFIG_NET_ICMPv6_ROUTER + /* Add the IPv6 all link-local routers Ethernet address. This is the + * address that we expect to receive ICMPv6 Router Solicitation + * packets. + */ + + esp_addmac(dev, g_ipv6_ethallrouters.ether_addr_octet); +#endif /* CONFIG_NET_ICMPv6_ROUTER */ +} +#endif /* CONFIG_NET_ICMPv6 */ + +/**************************************************************************** + * Name: esp_ioctl + * + * Description: + * Handle network IOCTL commands directed to this device. + * + * Input Parameters: + * dev - Reference to the NuttX driver state structure + * cmd - The IOCTL command + * arg - The argument for the IOCTL command + * + * Returned Value: + * OK on success; Negated errno on failure. + * + * Assumptions: + * + ****************************************************************************/ + +#ifdef CONFIG_NETDEV_IOCTL +static int esp_ioctl(FAR struct net_driver_s *dev, int cmd, + unsigned long arg) +{ + int ret; + FAR struct esp_dev_s *priv = (FAR struct esp_dev_s *)dev->d_private; + + /* Decode and dispatch the driver-specific IOCTL command */ + + switch (cmd) + { + case SIOCSIWSCAN: + ret = wifi_scan(); + break; + + case SIOCGIWSCAN: + ret = -ENOSYS; + break; + + case SIOCSIFHWADDR: /* Set device MAC address */ + wlwarn("WARNING: SIOCSIWFREQ not implemented\n"); + ret = -ENOSYS; + break; + + case SIOCSIWAUTH: + ret = esp_wl_set_auth_param(priv, (struct iwreq *)arg); + break; + + case SIOCSIWENCODEEXT: + ret = esp_wl_set_encode_ext(priv, (struct iwreq *)arg); + break; + + case SIOCSIWFREQ: /* Set channel/frequency (Hz) */ + wlwarn("WARNING: SIOCSIWFREQ not implemented\n"); + ret = -ENOSYS; + break; + + case SIOCGIWFREQ: /* Get channel/frequency (Hz) */ + ret = -ENOSYS; + //ret = esp_wl_get_frequency(priv, (struct iwreq *)arg); + break; + + case SIOCSIWMODE: /* Set operation mode */ + ret = esp_wl_set_mode(priv, (struct iwreq *)arg); + break; + + case SIOCGIWMODE: /* Get operation mode */ + wlwarn("WARNING: SIOCGIWMODE not implemented\n"); + ret = -ENOSYS; + break; + + case SIOCSIWAP: /* Set access point MAC addresses */ + wlwarn("WARNING: SIOCSIWAP not implemented\n"); + ret = -ENOSYS; + break; + + case SIOCGIWAP: /* Get access point MAC addresses */ + wlwarn("WARNING: SIOCGIWAP not implemented\n"); + ret = -ENOSYS; + break; + + case SIOCSIWESSID: /* Set ESSID (network name) */ + ret = esp_wl_set_ssid(priv, (struct iwreq *)arg); + break; + + case SIOCGIWESSID: /* Get ESSID */ + wlwarn("WARNING: SIOCGIWESSID not implemented\n"); + ret = -ENOSYS; + break; + + case SIOCSIWRATE: /* Set default bit rate (bps) */ + wlwarn("WARNING: SIOCSIWRATE not implemented\n"); + ret = -ENOSYS; + break; + + case SIOCGIWRATE: /* Get default bit rate (bps) */ + wlwarn("WARNING: SIOCGIWRATE not implemented\n"); + ret = -ENOSYS; + break; + + case SIOCSIWTXPOW: /* Set transmit power (dBm) */ + wlwarn("WARNING: SIOCSIWTXPOW not implemented\n"); + ret = -ENOSYS; + break; + + case SIOCGIWTXPOW: /* Get transmit power (dBm) */ + wlwarn("WARNING: SIOCGIWTXPOW not implemented\n"); + ret = -ENOSYS; + break; + + default: + nerr("ERROR: Unrecognized IOCTL command: %d\n", cmd); + ret = -ENOTTY; /* Special return value for this case */ + break; + } + + return ret; +} +#endif + +void esp_sem_initialize(FAR struct esp_dev_s *priv) +{ + /* Initialize the HSMCI slot structure */ + /* Initialize semaphores */ + + nxsem_init(&priv->waitsem, 0, 0); + + /* The waitsem semaphore is used for signaling and, hence, should not have + * priority inheritance enabled. + */ + + nxsem_setprotocol(&priv->waitsem, SEM_PRIO_NONE); +} +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: esp32_net_initialize + * + * Description: + * Initialize the esp32 driver + * + * Input Parameters: + * None + * + * Returned Value: + * OK on success; Negated errno on failure. + * + * Assumptions: + * + ****************************************************************************/ + +/* Initialize the esp32 driver */ + +int esp32_net_initialize(unsigned int devno) +{ + wlinfo("[%s]line: %d\r\n", __func__, __LINE__); + FAR struct esp_dev_s *priv; + + /* Get the interface structure associated with this interface number. */ + priv = &g_esp32[devno]; + + /* Initialize the driver structure */ + memset(priv, 0, sizeof(struct esp_dev_s)); + #if 1 + + priv->esp_dev.d_ifup = esp_ifup; /* I/F down callback */ + priv->esp_dev.d_ifdown = esp_ifdown; /* I/F up (new IP address) callback */ + priv->esp_dev.d_txavail = esp_txavail; /* New TX data callback */ +#ifdef CONFIG_NET_MCASTGROUP + priv->esp_dev.d_addmac = esp_addmac; /* Add multicast MAC address */ + priv->esp_dev.d_rmmac = esp_rmmac; /* Remove multicast MAC address */ +#endif +#ifdef CONFIG_NETDEV_IOCTL + priv->esp_dev.d_ioctl = esp_ioctl; /* Handle network IOCTL commands */ +#endif + priv->esp_dev.d_private = (void *)g_esp32; /* Used to recover private state from dev */ + + /* Create a watchdog for timing polling for and timing of transmissions */ + + priv->esp_txpoll = wd_create(); /* Create periodic poll timer */ + priv->esp_txtimeout = wd_create(); /* Create TX timeout timer */ + + /* Initialize network stack interface buffer */ + + priv->esp_dev.d_buf = NULL; + g_tx_ready = false; + + esp_wifi_internal_reg_rxcb(ESP_IF_WIFI_STA, (wifi_rxcb_t)esp_sta_input); + + /* Register the device with the OS so that socket IOCTLs can be performed */ + esp_wifi_get_mac(ESP_IF_WIFI_STA, priv->esp_dev.d_mac.ether.ether_addr_octet); + uint8_t eth_mac[6]; + memcpy(eth_mac, priv->esp_dev.d_mac.ether.ether_addr_octet, sizeof(eth_mac)); + wlinfo("%02X:%02X:%02X:%02X:%02X:%02X \r\n", eth_mac[0], eth_mac[1], eth_mac[2], eth_mac[3], eth_mac[4], eth_mac[5]); + + esp_sem_initialize(priv); + /* Put the interface in the down state. */ + + int ret = esp_ifdown(&priv->esp_dev); + if (ret < 0) + { + nerr("ERROR: Initialization of Ethernet block failed: %d\n", ret); + return ret; + } + + (void)netdev_register(&g_esp32[0].esp_dev, NET_LL_IEEE80211); + + #endif + + return OK; +} + +int esp32_wlan_initialize() +{ + int ret; + + //Initialize TIMER + ret = esp_timer_init(); + if (ret != ESP_OK) + { + wlerr("Failed to init Wi-Fi timer (%d)", ret); + return ret; + } + + //Initialize NVS + ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) + { + wlerr("nvs_flash_init failed\r\n"); + nvs_flash_erase(); + ret = nvs_flash_init(); + } + + ret = wifi_initialize(); + + esp32_net_initialize(STA_DEVNO); + + return OK; +} + +#endif \ No newline at end of file diff --git a/boards/xtensa/esp32/esp32-core/configs/wlan/defconfig b/boards/xtensa/esp32/esp32-core/configs/wlan/defconfig new file mode 100644 index 0000000000000..f29508ac40817 --- /dev/null +++ b/boards/xtensa/esp32/esp32-core/configs/wlan/defconfig @@ -0,0 +1,97 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +# CONFIG_NSH_ARGCAT is not set +# CONFIG_NSH_CMDOPT_HEXDUMP is not set +# CONFIG_NSH_CMDPARMS is not set +CONFIG_ARCH="xtensa" +CONFIG_ARCH_BOARD="esp32-core" +CONFIG_ARCH_BOARD_ESP32CORE=y +CONFIG_ARCH_CHIP="esp32" +CONFIG_ARCH_CHIP_ESP32=y +CONFIG_ARCH_STACKDUMP=y +CONFIG_ARCH_XTENSA=y +CONFIG_BOARD_LOOPSPERMSEC=16717 +CONFIG_BUILTIN=y +CONFIG_DEBUG_FEATURES=y +CONFIG_ESP32_UART0=y +CONFIG_EXPERIMENTAL=y +CONFIG_FS_PROCFS=y +CONFIG_HAVE_CXX=y +CONFIG_HAVE_CXXINITIALIZE=y +CONFIG_IDLETHREAD_STACKSIZE=3072 +CONFIG_INTELHEX_BINARY=y +CONFIG_LIBM=y +CONFIG_MAX_TASKS=16 +CONFIG_MAX_WDOGPARMS=2 +CONFIG_MM_REGIONS=2 +CONFIG_NFILE_DESCRIPTORS=8 +CONFIG_NFILE_STREAMS=8 +CONFIG_NSH_ARCHINIT=y +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_FILEIOSIZE=512 +CONFIG_NSH_LINELEN=64 +CONFIG_NSH_READLINE=y +CONFIG_PREALLOC_MQ_MSGS=4 +CONFIG_PREALLOC_TIMERS=4 +CONFIG_PREALLOC_WDOGS=16 +CONFIG_RAM_SIZE=114688 +CONFIG_RAM_START=0x20000000 +CONFIG_RAW_BINARY=y +CONFIG_RR_INTERVAL=200 +CONFIG_SCHED_WAITPID=y +CONFIG_SDCLONE_DISABLE=y +CONFIG_SPI=y +CONFIG_START_DAY=6 +CONFIG_START_MONTH=12 +CONFIG_START_YEAR=2011 +CONFIG_SUPPRESS_CLOCK_CONFIG=y +CONFIG_SUPPRESS_UART_CONFIG=y +CONFIG_SYSTEM_NSH=y +CONFIG_SYSTEM_NSH_CXXINITIALIZE=y +CONFIG_UART0_SERIAL_CONSOLE=y +CONFIG_USER_ENTRYPOINT="nsh_main" +CONFIG_LIBC_ARCH_MEMCMP=y +CONFIG_LIBC_ARCH_MEMCPY=y +CONFIG_LIBC_ARCH_MEMMOVE=y +CONFIG_LIBC_ARCH_MEMSET=y +CONFIG_LIBC_ARCH_STRCHR=y +CONFIG_LIBC_ARCH_STRCMP=y +CONFIG_LIBC_ARCH_STRCPY=y +CONFIG_LIBC_ARCH_STRNCPY=y +CONFIG_LIBC_ARCH_STRLEN=y +CONFIG_LIBC_ARCH_STRNLEN=y +CONFIG_ARCH_STRNCASECMP=y +CONFIG_ARCH_STRNCMP=y +CONFIG_ARCH_STRCAT=y +CONFIG_SIG_SIGSTOP_ACTION=y +CONFIG_DRIVERS_IEEE80211=y +CONFIG_DRIVERS_WIRELESS=y +CONFIG_NET=y +CONFIG_NETDB_DNSCLIENT=y +CONFIG_NETDEVICES=y +CONFIG_NETDEV_WIRELESS_IOCTL=y +CONFIG_NETINIT_DHCPC=y +CONFIG_NETINIT_DRIPADDR=0xc0a80001 +CONFIG_NETUTILS_DHCPC=y +CONFIG_NETUTILS_TELNETD=y +CONFIG_NET_BROADCAST=y +CONFIG_NET_ETH_PKTSIZE=1518 +CONFIG_NET_GUARDSIZE=32 +CONFIG_NET_ICMP=y +CONFIG_NET_ICMP_SOCKET=y +CONFIG_NET_PKT=y +CONFIG_NET_SOCKOPTS=y +CONFIG_NET_TCP=y +CONFIG_NET_UDP=y +CONFIG_SYSTEM_PING=y +CONFIG_WIRELESS_WAPI=y +CONFIG_WIRELESS_WAPI_CMDTOOL=y +CONFIG_PTHREAD_MUTEX_TYPES=y +CONFIG_SIG_DEFAULT=y +CONFIG_SCHED_HPWORK=y +CONFIG_ESP32_WIRELESS=y diff --git a/boards/xtensa/esp32/esp32-core/src/esp32_bringup.c b/boards/xtensa/esp32/esp32-core/src/esp32_bringup.c index aa16d5aa2783f..2b8d2511eaf65 100644 --- a/boards/xtensa/esp32/esp32-core/src/esp32_bringup.c +++ b/boards/xtensa/esp32/esp32-core/src/esp32_bringup.c @@ -87,6 +87,7 @@ int esp32_bringup(void) #ifdef CONFIG_ESP32_WIRELESS /* Initialize spi_flash */ uint32_t count = up_irq_save(); + spi_flash_init(); /* init default OS-aware flash access critical section */ spi_flash_guard_set(&g_flash_guard_default_ops); @@ -94,11 +95,21 @@ int esp32_bringup(void) ret = esp_flash_init_default_chip(); up_irq_restore(count); + if (ret != OK) { syslog(LOG_ERR, "Failed to initialize spi_flash: %d\n", ret); return ret; } + + sleep(1); + + ret = esp32_wlan_initialize(); + if (ret != OK) + { + syslog(LOG_ERR, "Failed to initialize wlan: %d\n", ret); + return ret; + } #endif /* If we got here then perhaps not all initialization was successful, but From 01f8bdbbdc1601fadcc089e22632d053ac3ba98a Mon Sep 17 00:00:00 2001 From: chenwen Date: Tue, 30 Jun 2020 21:11:49 +0800 Subject: [PATCH 4/4] xtensa/esp32: Add TCP/UDP client and server configuration --- arch/xtensa/src/esp32/esp32_wlan.c | 52 +++++++------------ arch/xtensa/src/esp_wifi/tasks.c | 9 ++-- .../esp32/esp32-core/configs/wlan/defconfig | 27 ++++++++++ tools/Makefile.unix | 2 +- 4 files changed, 53 insertions(+), 37 deletions(-) diff --git a/arch/xtensa/src/esp32/esp32_wlan.c b/arch/xtensa/src/esp32/esp32_wlan.c index a6327d799b72c..1701bb1ce5d12 100644 --- a/arch/xtensa/src/esp32/esp32_wlan.c +++ b/arch/xtensa/src/esp32/esp32_wlan.c @@ -1,35 +1,20 @@ /**************************************************************************** - * boards/arm/xtensa/src/esp32/esp32_wlan.c - * - * Copyright (C) 2017-2018 Gregory Nutt. All rights reserved. - * Author: Simon Piriou - * - * 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 NuttX 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. + * arch/xtensa/src/esp32/esp32_wlan.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a 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. * ****************************************************************************/ @@ -1331,6 +1316,9 @@ static void esp_poll_work(FAR void *arg) } } + wd_start(priv->esp_txpoll, ESP_WDDELAY, esp_poll_expiry, 1, + (wdparm_t)priv); + net_unlock(); } @@ -1875,7 +1863,7 @@ void esp_sem_initialize(FAR struct esp_dev_s *priv) * priority inheritance enabled. */ - nxsem_setprotocol(&priv->waitsem, SEM_PRIO_NONE); + nxsem_set_protocol(&priv->waitsem, SEM_PRIO_NONE); } /**************************************************************************** * Public Functions diff --git a/arch/xtensa/src/esp_wifi/tasks.c b/arch/xtensa/src/esp_wifi/tasks.c index 53f88f6f2538b..7c42dca8c6821 100644 --- a/arch/xtensa/src/esp_wifi/tasks.c +++ b/arch/xtensa/src/esp_wifi/tasks.c @@ -89,6 +89,7 @@ task.h is included from an application file. */ #include "portmacro_priv.h" #include +#include #include #include @@ -269,7 +270,7 @@ BaseType_t xTaskRemoveFromUnorderedEventList( ListItem_t * pxEventListItem, cons TickType_t xTaskGetTickCount( void ) { TickType_t uxReturn; - uxReturn = clock_systimer(); + uxReturn = clock_systime_ticks(); return uxReturn; } @@ -278,7 +279,7 @@ TickType_t xTaskGetTickCount( void ) TickType_t xTaskGetTickCountFromISR( void ) { TickType_t uxReturn; - uxReturn = clock_systimer(); + uxReturn = clock_systime_ticks(); return uxReturn; } @@ -315,8 +316,8 @@ void vTaskSuspend( TaskHandle_t xTaskToSuspend ) FAR struct tcb_s *rtcb; /* Suspend this thread if it is still alive. */ - rtcb = sched_gettcb(xTaskToSuspend); + rtcb = nxsched_get_tcb(xTaskToSuspend); if (rtcb != NULL) { - sched_suspend(rtcb); + nxsched_suspend(rtcb); } } \ No newline at end of file diff --git a/boards/xtensa/esp32/esp32-core/configs/wlan/defconfig b/boards/xtensa/esp32/esp32-core/configs/wlan/defconfig index f29508ac40817..72a363af54bc3 100644 --- a/boards/xtensa/esp32/esp32-core/configs/wlan/defconfig +++ b/boards/xtensa/esp32/esp32-core/configs/wlan/defconfig @@ -95,3 +95,30 @@ CONFIG_PTHREAD_MUTEX_TYPES=y CONFIG_SIG_DEFAULT=y CONFIG_SCHED_HPWORK=y CONFIG_ESP32_WIRELESS=y +CONFIG_EXAMPLES_UDP=y +CONFIG_EXAMPLES_UDP_PROGNAME1="udpclient" +CONFIG_EXAMPLES_UDP_PRIORITY1=100 +CONFIG_EXAMPLES_UDP_STACKSIZE1=4096 +CONFIG_EXAMPLES_UDP_TARGET2=y +CONFIG_EXAMPLES_UDP_PROGNAME2="udpserver" +CONFIG_EXAMPLES_UDP_PRIORITY2=100 +CONFIG_EXAMPLES_UDP_STACKSIZE2=4096 +CONFIG_EXAMPLES_UDP_DEVNAME="wlan0" +CONFIG_EXAMPLES_UDP_IPv4=y +CONFIG_EXAMPLES_UDP_SERVERIP=0xC0A8672A +CONFIG_EXAMPLES_UDP_SERVER_PORTNO=5471 +CONFIG_EXAMPLES_UDP_CLIENT_PORTNO=5472 +CONFIG_EXAMPLES_NETTEST=y +CONFIG_EXAMPLES_NETTEST_SENDSIZE=1024 +CONFIG_EXAMPLES_NETTEST_PROGNAME1="tcpclient" +CONFIG_EXAMPLES_NETTEST_STACKSIZE1=4096 +CONFIG_EXAMPLES_NETTEST_PRIORITY1=100 +CONFIG_EXAMPLES_NETTEST_TARGET2=y +CONFIG_EXAMPLES_NETTEST_PROGNAME2="tcpserver" +CONFIG_EXAMPLES_NETTEST_PRIORITY2=100 +CONFIG_EXAMPLES_NETTEST_STACKSIZE2=4096 +CONFIG_EXAMPLES_NETTEST_DEVNAME="wlan0" +CONFIG_EXAMPLES_NETTEST_PERFORMANCE=y +CONFIG_EXAMPLES_NETTEST_IPv4=y +CONFIG_EXAMPLES_NETTEST_SERVERIP=0xC0A865C6 +CONFIG_EXAMPLES_NETTEST_SERVER_PORTNO=5471 diff --git a/tools/Makefile.unix b/tools/Makefile.unix index ed2f20dfe2908..525d33d0e0e48 100644 --- a/tools/Makefile.unix +++ b/tools/Makefile.unix @@ -443,7 +443,7 @@ pass1dep: context tools/mkdeps$(HOSTEXEEXT) tools/cnvwindeps$(HOSTEXEEXT) pass2dep: context tools/mkdeps$(HOSTEXEEXT) tools/cnvwindeps$(HOSTEXEEXT) $(Q) for dir in $(KERNDEPDIRS) ; do \ - $(MAKE) -C $$dir TOPDIR="$(TOPDIR)" EXTRAFLAGS="$(KDEFINE) $(EXTRAFLAGS)" depend || exit; \ + $(MAKE) -C $$dir TOPDIR="$(TOPDIR)" EXTRAFLAGS="$(KDEFINE) $(EXTRAFLAGS)" depend; \ done # Configuration targets

& z7rxX~koM!e@Dwl1?`WyezQPMH^1`dUaHkjM_uEv+_X!D?0~cWY?vOAiaRJ8fO9*pf z(_I$4`MbaK!l%9Pzj@(otPVCkf4^eGQ@rqeFTC6fcYEQDUieur%zgQ7eq8Kr_`6>C zU%YUzZdUo6hUV7p-u9L4&A9W84FNh1v^Mt!YkC?O>}_A& zsyMt|9^g8op<~S|7uD0tt&LRka5wf$;?4Mmw$^nmYZ0@$b#*iL`swZHdFXoN?e4la zb)Y=MRV}#5_fTuYgRPJBFrqZXp4HO;}w?$%ak!+M7-XbskgMUuk9 zzJYszxD1)@VKgLb8CG`nnul67Ywmx6pW;hVB|Q?h^t3fSD5V`9$(l8U&9kb3&Dh!c za6?y9PtU`wcSmbyFj6h5G*+q-i{>Ub5DblIlmT795yBd}q&CN{5s_(9r3z@wHTRBo z>_jl41Szf9twlR^Hmzb zRPJ8{^M&H{f_dOqeav94H>xiro{WDGUNA+bIOxs@bidO$^`)VnS?XS(RH=O#u^i^P zhN(SI+SQ&Xsu4NV^TI)Kf_NJKL2BS4B!kq#seTFZbZW!*mUJ(^dW6-6ajJLiAe^op zB<+9NMov9kdkVkf9K-+8{(@b;Yz&CCckM5F*ZzWC`wJ&8>>}5@q(Pim^sfCYLcME$ zsTZ3}>rOhgr={+{=h`Hjn((AB!U95E+1ODcky#-a(T37@&R)i$s|yPSadnvy;t_SR z?VlIgIDWydtt4N^KRdK>{8Bc@FQ;}R_+{M2kxc8(VnrmaYb!Yoa&5)I2ytyC?MYK@ zD@H4i8>@1PlrZ`lV&ShP=2ahL37n>_BNm%_Vrj!=#%8&(X*4!1#-`2KbQqg1qwgh_ z_FqRVV`e?EZGW5_P+a>qM#s!}VzF^!HJ6M*I95pjaqZ7c zAg=whLR76iid zw7CR6`>XIW{Da&EM@)P6MIqXO-)(FaJ=u*J01)o^I8T!wnp9`N@ z^?VQ5)fYa`*A-6|%o~a`h*7o#(h=*o_U4LB6MUYV)20SC#QM$CTaC?KV#9GktUQ}U zzXW<>{hs6VqOXIVIBy03j^ZXC*80b=FkwG{2! z;q#r?Lf9bauyQ^udX80ME$0WQ$Gp1_{x!sMsY$H-TpDOo4WG*{ZOBio{2vlM`H7X^ z*`pG?>9&+Mf_cZFun_+s#G2P+VA^mwWs}i{c@b+~ytbsCc@gJbhkp>3k7?N+i-}>w zIY_K&oedIRjrQ)Ljo?obUx9y+J#ec3YhvhGh61EfeXiJWezD1D!}1X4alk{agrj{8 z{1Rf=uspJUd5G%i%gV3{_ zZVp}#02zd1+I{eM5yK`fSkr!8^eiuNo*V~HiM|v*vGz5up~=H_fLQx9BJIYT$L{;- zuwgZcHLrzCi?zKTKHG@}z;ym;_a=Mg|S zwrFz;d^i4K!+ePID)A4(^6?use+++#V6HL0G}wJd8#dH4`@;9)AA~q>mV;qkV8iO< z!;zENjTvCxV0Pmf_;%=PXagSBi&)#|0nxJx#JUDPEP9roSdVufr5>D5!+)F@oXnqC zk9VvaZCK?W5W}WWu=d@L#O7b&|5R)^#)!3SzY{&j7_p8AEJHyd3I^I>m0;ei-D2=p z1s{O_CNaq&??byVE$!XfEBJouVZ-+Mys`PQ!Ms7~@e9>duEMvOKHI-EBf08$L6`MNa?2GgJ`6+Lf+yY&rv-u!lB6__`?tHfpq z*o{x{v+wNq{4i~xXMYjv9J!l%@NkSY5W@z44r_mPh@SmLtjF|j>XG)-@E;{c!nj~f z`z5d z=P0qZL$l~>p(oaJ8{WSo=X3D?NNkqChFCeD5q%x>#LD?sqOXUZSm!<;dXn=e@Lw03 zWw0Su&L4_?IrPNJ`CHL9LQkxmmtf41lMi;r5u?ppU_-2&?-P9+^u)?JSM(jw6Dwz} z=)0gNR{M{Lz8898U2`^2k23Hf(vxDd4mQMEhUZ1U9(rP3bLJt;Z!evK|B%5O4SwBV zEPny_YNrtAp)Dxyg`+-Gu#PL9t0+HDJ7|*wpExgye-JMHv{?Y(ovXtJ)d|nlIZz=S zAGCP_{vE`y$rr50vU|ja?b$3gg@W~1)-E=W!0!|rbeY52&TgFtKj%Af9xDprJZBk> z!2eTX*u(|vH^IL^z1Vz7Y)ar0>o>K(YHYqCHl^^1^Rn;{@;7kg`Fr@U5+koN!CKDu zP=9H-F22uTQc%z1iR&-mVqhLe3$MaI2(f+-eF`x3>^tJTvG@mZ{1Z}G`}7K^3K4lL zeAmCgtRp4DPJytGBe+JOP^I4}WLrmgFo(q9BJ3at>mMO8q#Q270z#_b^jmcaViG`V z;UZ`gN*!E8>a~nm%FH+|566?1$CZJN17W$fJT6};57#&?kIPHSQ%^kyJERd#%fm6J z9?t zrp93I4XJwW7pJ(*;9lZPWDe;wc(cLV4BlxlfB&Ls4-m^-IAZW|gHIX!hQV(UXNP6r zK4psY4K6ac)L{3WWl5Vb`X$6UA?GrKTMXu&UTU-6-~of(cb0``(CGO*N7L>%_>jTJ z3_fY_8Dg2U?mNqZ@gOp(=YCmgxP_my0+;^4*R~nmy!R|ZDVzbQX-9AyG=N>Mam;25#j$ah_on^sWX(M>h zVE3J6(ewAXYUB1t68$lwci&kSz5C9x;B&@?7naHsGuVA+S?o)w$MKQkzOyXYeP>y) z+nYyly|HgJxWi!gon;<8AseX|?7p)s*nMYN@P)oLGwhoq=4m6J+&180V|!-<9+A4| zT*E)lK-=)Kr#@e7#WP9S)>}VRGs4I|5bkdM!?mqFx)b=QN!rNU(6Xjezq&B0r92ze z2dG`G&F@s4Y%i`#?91tt-HV+cx!N+kdz_qCP28^Qd;)9Cscl~O6UpL}}53tE__#CJFBSh)bB9VqF|()Q^nwbAi$ zF%?oQS0*K7F3 zNF39B7tZqSMmQf%MeF-*C@kML@bP+v<>RRy<6JpFX88_4&puI6zJG_p@*M%+cIe2L zCvoH}_4s%VlCFG{U}yPSaKWnO9hxc*G$ID;kd(GoJ zhH$$1!D}GPmpL&tKX}=!eD2x@VI9vWBpp;vXh-?q9$yjo*qb!Lw!x11mcnViy&hjF z7SX#T4L#*s;W1Pe$c zLOWL9UBklHb~yn%eMz6DT91G6@*P5B@Y<8@a-G<*Kdyw1yvjF-#rrhED$2*}V&a5E zR8Gf!Qc{oWp<^8RZUnG=8=*|M{>}3E&dx}UKR&xrz7-zdKJeX+coo`F?)UiWP)R+0 za9vQoKH<|cW#Qn0E=~%|PWJ@tc$`(42D>T^z^4u6bHW#fa9V9Y`366I8 za6AXVkVy)^tD0#PnlF!aMjh;*9Ryz{iHO?qdZE1&-$CufhfvpC7k{UHS}MxRD=OoZ zciyL^oRvf&!t;{SV6{8@(h~fBK8wBtj(zcetIVzrCgKi$ad20EumO*1a)P^Fj6gGx zF=60|jM#T{myhYWM_=584#IEqQPpsR2BduomSghCntp|UdTB5q^3&pZohn2blkmCBK-}xaPEq3el|=xJ$Iogi>F`zChe1Z zv{bCVW!N4qH^vt>wRg0(#CzAoo7Z%%Y+tpuyEWe1y|$+p%K6oCa|zlL?yKVVWVtw= zX7`G*ClFy(Q$8H8de-XXnyw6GnFSwjuh_C3{|`D z4gD`CH)z>07!6hW8|U?JE}V`Xlr|pe-QS|R-HZKXu^atVhjG$zX5WdOM-J^R8Jqmw z_w?M|4_riAE)c=XSvw|4XPVzQqda4Sy(QyfC5f-)$F7KF?pg3yVqZLIdN_jfo;T6O zVOIud1Bc+xDb_tgQabeit4JP}$qkKEx?hYz>~DXR{aV(`(q6`3_6D|XcMi6#sNNO5 zrZ9JZ$u*xF^PPQeq~~p}JW|ME7Hf~Zd2sxX59YsqurSQy=G<{lX6?USGdy{f4%A)M zq3-ad!R`gSs<%J6zbRC_kagFS89OFQ5wObxwpy5zm5uWlO~T)Pcylav>5sDTv+>k# z+xb&$w1I1Za9ng}?kX&Pu59XyT9yNk?uza&IhyyKeMbsU6d%3hJFlO~2;;v0L$l9D zHkPoLb9MH)`eJVhaBiLz%P4LQc15=@4rzXrbwp}CJ=fU9E@8=(!2L!X&+n^|aM&CT zJ0jGN+DF?bA-fx2%QAh46~_z!q}Tq3WiETu*rJb8{jF`|`=gah?GXRN)EIHQZAjUh zBE?M;S2V>}Oe`DIoUv(MP|#FRlu_Jt#k{7=b)SJ9P2-j}74}bz_cy(F>QhfQjo&d? zxT9&pyrwG?J7rw%XewITbk)3x@p(;GPncPLdv(RciTBQ|Xo|m$ZC#eVesD>w43lNz z#IUob{_BqqcD;VEC017V)%cEy!cjCombnRYa^>EsZyqf9@xl7n57x%!nqk zFz(U_Q!JyX_VG`Zy?Ls9!gVo>y-a zwR4M<39J71_2VRkuzV4RM#n6(+AyDVnB`BWxAv?{Ivdt0o!+MX{|d)VUVwrAe3o|) zcm_$I53P&gcm=_7vHs<7Sp1xxXWFXAiJ?o!v^;aB&$KtfQMA8_H7}f;Iy?G&KuCMs zXmOIxo@eOf)id>UHf3U?J~?r*;Ut|s+nk*A8BcrOX{3%=9^9ubKVKT49eoPZ6SI$) zb{rffUB3UBw6}nh`O??+UkuFtV7?zW`aWP@AyEG{IGjkk@_Zfs1UTyd0gl3Q60;Ae z=UZdS{}! zFz?3F{*R4*3$XUxr;Yv@;0!q0Z!`E=U`o37(YZmNlFsI0`nnovnKyl{*F0cc0K4+s zX7qKyw53}relh%dI7+%Qa6O?tefBr)C&6i6CBWLJrNESQJn6<#XpQue@INz`)A3*I zSY^FfM?0R0wXf}1CD!_~Ehy>gdog`CTE5DEbx8kz%zrUuxEP!NOut+VKi7A*zg_2v zwH@plB2AJUGoO;Q^mR;b1?I7e{qqW3h2V4WuN8bXjUntiV$Ex!(K`eD)A6a{k^acN zAIgUrMU!`KL-jlF{lIlBCF%A)NX7DKG}i_Z{(u+$pchVf;c72D-wQAB!i&5xkD)1v zx?j84@RC#jC_3zGQVer#N=ekMPd2P;RH%y%y9>?qcc+YjqQky|!SKCa{C!?nj~Agj zI&4>erf=}*VO-a=KYQcti zUYe3widca4Kt~i;D({5)R|%xZgsF%EezM<>T3A0oIRcUU}zw;SYP^Mlamyg+Jzn|C<+n-V6V=7yiD4 z!}j_>z;{t8JgY6hmPZ*pWI)3Bg!_I9!#t`M;C!f3;;CbMES7NCU-Pk9D`P@oe5Zt; z1uno-B)(s&!uUV+!n$!3&)^DzMFIB)p@ikRCHSR;xpEa?J=+ilFL*`5VfmK_|5L)sm%-CBNSOa0 z1eZ%VoG%SQm4s=-{O^-6kMIR}8r$K;_juvQyfELfR3YD=cwx6|2{u#KtyaPt;SH-g z)~smiz*8MWG>03X@F`DA>!_xwD7Pa_Yj^jW?r@tH+^z4#UNLUR^AQ;-UxTqqQQ=i4 zDNsshE%8cX6E?_oJ3*s-DRVEvrs-*0+uO3{;ZE69Mfk0Dm^F5J>1yh3TJ7q>47yvn z`wF*$33Ke>J}}{~DakEvxF1fsO>d-(q|kk2+}m2=mM4bLZjCamVlFqN_ew8&@Zc@b z*5(JpW|uBxf>Z^xW2p_d&moat;q)=w@CFY!k_{2=%3`&ahg;|jE4e7FP4fM;is7b7 zJs$_HSi3T8Z)}s(>vs6|i<~kaQ5UzB(5UgPoo@f1VYv)1iD%(DP0G}@*3B7PpBC)s zjQxbX+KARK^(gA@)}FPi{r)vdo1YsDZX=@xOagBTr-^hkGkoQCcr{ad8TqAb?ZgDb zHbiT>A8hJgvo_pQ$(BLpPx$69Ur`;_>BH1E8FO6e9_aZwGN!w=Nwzo|v4k)>e3#j6 zfs{5LqjUu(=!4k8>QT2ZQ)*#g@)6OPzZhrjcv-oXv8OfsG(&HD^MeRBuNYp- zQB4{!=o_$+)AbFjTV@4#)0UebwXJSyW*8H&xpz%>7 zh*yGYa^EyExSIf5coK>F-sXJ;@-BQ*aDn zwc&9n@?l!ww_|V--tK|$oFr1`pnG2{a(js5)brL4qy#QCsM9igF?j!4r{v!r|G{mkv zf?a(-7V2GjJ|1FMU(vhz_Jw*^U$H5IDzYKeN8uInL=M99L&aspI3Jn~pLa=!*|$8$ zCZ;X(r9I0p*zOxgn{?XNNR zOG11tyu#8Dvp{z10FF|V(~e})(tRSDL-c8Pv2d}7UOkLVNdi8ZfpioOOuah|Nb-=-dU{R8~( z5+ko#!J77$qF(}^IPWg}gK*68_tNi$@A?#&Yl0j9*8&L6lQo=n{EamG0z=keUXQu) zJQYB2o~-liOaA8heek(%5Oa9nBX}G9bq4nt?AjLgw0YX-T{)rO0v(FtI9Z;{1v4)? z<~1391u-|pfDq?3IOv|Z(uV!RC66|oQ^a|V_y<`8N1NsFKST_h9KkyGIlQQk!6#Nd z(=hEu_>F?s!*3ymeZFALt3zy9-)^xf6s(+^L_Z!rvFcqrltBR@&iexg-MrvFO-m76 z0;kxuA@p_7p@>1D++HKjV*w$quO;o(2s16`E8CQq!vocDY1wYXd9C;d;b|CcxYTpb zlArBHoVODHAa3n~p6y1Q$3+VghvVK)Q{YDhb3D?H`V#nTJ7TsE+oEs={y~WI+8uOH z_zJH};k>pGyZT~~Gp%a}U=%eR&*h;F$97&vh#ANIeUftoI5|h;e3RwN>kRD??e@5d z!*}Z*5)!+*0P}tf`MD1c$EoYP3IM@*T_JWnFeZm9Cot1G`s1-rxO%M%F`6$Ze1F(xjvttL=21T@v?0#>NQk#k9|vayPkrHt-w)sQ3-yS1WdP1@e?W}196Q9y|Ay$fwh-rSz&{A<&$Q#=bFV34mW2}G zA_rj|B9k0+Wr}dnLYPNnvV%dKn1dWr3KzM?L3h3tp#o9`7m;;1K`d)*Eioq?qz*1p z=3w~Y51Gr2)Xxa@ZN%4wm~9&=4>5;=?(f-0EaPy1SjN~E;!6C3Y=eu;axfSqM!TtK z-PuoCcUNDjJ3XyCv)8)MC6>CodX+)}sfW|LHxf(TJBX$3uKZH>jnqrsU74ls+o_kj z?;@7E?<1D^J47sXKT0fhKS3;YKTRxkKT9liKTnKtK;duY6!W}TaopfCgR2a#F}Tj) zZqEq8 zZqEq8ZqEq8?)O51-JTJG-?cp>gx~EMA^4*AjNl>-aeGDxc6&w$c6&x}QbOFG5rW;G z5rT&>M)WuTZqJBILVLGogkZO4gkbl38^LbR2p)(aIT%N}F95H-6vqvAdq#-8+cSa( z4T#$_La^I2La^I2LU0>-1oL-0iu(+9dq#+j+cQG2+cQG2+cQG2+cQG&5yNxb;8O;> zJtM^4?HM6B6JuP< z;K&H`EN_&g#zLO#U692-&by#t@-g0pt#A)to{3%1P97HY$PNs4GZRw*KG?b-P4f9u z#YNg(*i4^ET`=INi* zj7&1@xy?Imy<*0=?yZrW8%YHVDi6iO?2<92?&+9J^suRtF8#=PlFrIZlGJu3CL1gJ=3z*29O=mHD!ltuGKU-9aaL)$kF(tqcz%f1JnC=D%D_=tN@SG@L1wxi@ ziQ(fVyYkfm+wv_zI9>TZdQ+*<(uj89gsLjX7CJ; zZz!JP<0Yc<)q8wHh?CQPpwN!~Z64pzczDl^_2ng=@~!vyPD&g+C$ytH?D54Xrpm|5 zIOXGeq4-PAw^P7!84Q#v-{(EPGVqlnp5?=>^CX|UXN9oNH};v92{4Jj>G3TGpN>CX znrZod2|N5H`OX;*z$D+#Jia!=r)vfIFXz1{_*%ZV3NxpuMFLM;Wk9vID3?FZuYkl{4 zd^)dKHj0+@FFd}ThHtXiu|NJFk1sY#`F`l}?J<1U7(Tw|3yNg_<|7bCSVhZs3G9dy z5^(^0jldkw*TQLi%RIhvk{i)rh1kJ!GMZf#47k3(lifVw({W0^8-<&m*5hW_*?JTe zhtD`!58iUudhq>amR0#W5Rlsg(5Coq_xJ|ESBrS^alR|xDvyu%xp^E?(eiEZ?6$&A z9tAj4wOjAydj|P-z=HYCgwuQnJ-$QWliM-F__+5G({@LT>J^6HeKlb>J8ooJ(FAKz=aL>wFAl}RW7J&%!W&BLB z)BZgHJAK|kQ`%8x01zh_fSgCZysyu8o(sn~&dWOh$g6xOQQma@yT-HQeQCL6j?}4q zKk3==o^?7tcQ4rF`xflvR^2eZzW^WplJ%&clIo9Y$(Qx`o|iB0gQpw!-}U%58ov34 z?_WK>N`#+9yb6L&cwd@05e9>O;A=yJvYi*eF^=UMhm%3u&c_hJ^EwsUQ7(g>Hb<2wVRT3C^937qnM!QrXH6e6Wbq^qvSi?v*YuVbjPDo*x7vROuh{! z-}^njW#F60f{18;Ec5vKz!!%d=TQ@!_6MI!VdVJfuN0+YT`3!zBN6%n=pMm)CsO zZXHfC_M=FJ(gG1+;+K%~5F=+TX@=L83_ms7TGLG{zwmoAIsEr?|;tqJ0j zh7M;1(`HV1`0gA2wk?vkP_+wjjKF?R;9mD`a>rTje+m+bbMu<=?|LkA)5IVc>b~sJ zp4E|9)~2z+yn_{uHADA4E_KNKV)llBJJJ2LW=t$|UiI}0@sazL6Yh+iyL;dFoMJ+8 zJbum=EpLWy|Mb&&*g~wh`ua^6a5vRVm>GNXhP|&l&4iV8CDqr={whj&VCnjd_~iVG ziTP8T<97~`^DxGva6XhQYi3v`mK9WY&tzGvgK#G>-ERv8hEDgca{jx%1(VKg^?8y( z;l!l)VcJDpOt|1Frk!G@RXm!W6uJcg=MxtR`V{6t%xT4gvtE! zh0=0v2d1Pe18>T)4D$X(S{ttaw9(^0I-U#JAZa>@4!c9gV7)%?BaFdL_6 zS-ZNcVRh^3Fu+q2{Q3_p4XGakujz5Wz@)-ifu5->=8qGD){Zr6y6~gK&gRw*mwXL= zYZ@xMTUX(ip7_cONvIaldlYVIHYd)JXlO7(FXvuX&uOLa=K_u}xy*mJ#tuy44h zI?w+&;`u#73h(bw&+D~Y4QAU@&n2ECi1sWOah}wrlzQ0k@IYQ-&Q_NfjFWlsp$5d| z1${Cv!7eZ0WL~gGaAaOkCi4PjUaSVMo1THsYgA&6$7_gXs>~HV>&Lulb2t1y6#Oap zA14-jo)^=G%l!<|vpmFF_e$zv!$ZXa!JIc7`_yyXHw$LjHW7oL{Yk7mo2iFAZCDOs z4j_2$Hy!XC&U+tGSZ99cco}dUj(7=tF8BJK_!`mQ1)p5B`3(HWh*>a**6&x5OWz}9l_F?c%6K?^H!@Bv^(`e9PQWA&>#IC2t?;lu%2Q4(JgmF& z)DmONQ|jRqHyYewFzco^8x7uK@OFcD8N81;6aOGXaEgx_e8S+<2A?(fyup0Fp*)2K z$B8*WAY}%-cgRIwWAt?fyLZUNhW7-Or`O;%E`*R_PR?D$C$q_ zgwx`ka2Rnd<}sYG*0SO#(jUjN#*{m-4j%+ww6T^HHH4g~xH? z1e_Dh-x2_pkEdXaV>%vREnl6)!E>T~A4ACUm4J`w$;ahP`Thdf^6?mxu6%zcX%g@$ z<)(aqNxr`UwtS5e2hWL?ZwMhRf5$S0@5E}V(~jDH{g(bw_P0n9d3p&jK)7!fBJfHb1Mv}J$rl!0+<_YVr6 z<~sykx_n!_e2>5`UA_%ozDG^Ig-E0Me#FbS2w|-g%$yxm!FI9JxDtf7(LhA&`x)qM zeXDTX;kg6r`(8NBcb~_{W3QYZIY#CClE;^iL89}Q=j6)w4<6r9gn7QBqI^7-6DK61 z6nv+FSw3AW*dJ#-zBU{;^_B&bD&N0&d@&@}^4a%Y_}u`QCfk5X5zig2pE+~ZY(Aj4i02MP)51bjy0Vqx`g4wyGW7aB z_TppTVx@k^u=^KA{1^S7T^;nla;&efH}=`b=VTSXa%^D^6n_fEuiLVVUwL5@I;a1Y zZ)o`2n@}!(jREQMW@cvwH$L4zHkdGg`2Jghqg8n`zyFp0kZ;87$OtyLX9zdvKC?Ko zBZFJOoXQEF`FSuj^RmH7@x%PEgyD;29nMUC7vq`S$d38JwBiYOPMEo9)|uod4(zjn z{bYRdYr8Ic3eVo2?H~L^b>C-)24AQi{Or)4U2FFYRR0q)9LVo`G2Zt-E;|?mLqEzt z2K=?io)_bT`+IlH3kLhv?wuDI+_koUUdE1j(JcdOx9qPz^|kyx1M$8WE*p9=e-Pla zku3x94?W$ttG9n%W?y{mj$0yq18a+K$>_f&%Blv-*M(1S&?Yxl;Aur!@S*-2sxlUq z1rP9tC<5#y#`IG8R6N0kR$FGhpKl1q1?=9N@_@6Z3BP7d@^v{F3 ze_mu-adr_n8Fryf<0UZI8iors+!==RHQXJBV;V+z!L|t<`r0XU(DL6rK4;A9^YH12 z!%;qriGO8CA7Xr{c*4rN|0-kQ-~BEYt(X^t&ou7OK&vN$2`g@xopJbs!SZiCJU(M# zRWPADhloPIweEl2us3_^ooJo~Y#z5B=0>pp$nWXU?ri%} z-S5lyZrk&I**oRYcM&$cmt=WbB;4)k{|I5squAJmnZdLDc#_?J#EspbKYrub37@@T z&d=RS5G#;1=Cx=nFTNwb!L2O2Yi^j8|626rOdZy@MmN1Da382i+Hk#zW$nJ}(FHeD z7Sw%n=;iEtcZ8{LjUvn7wJ|BpLUexC^h`I$QKnln#=RMt@O)@JJ$L(JW)+4o?K9`i z=jI@M00`T889~|PySJ83D8>h1v^eAL&7YSWxvM5W{?gE2CqLM8f9|IFnD1G4Z(Xr8 zBT`nf=+pO3D^As6+>4hm(bh}ii-+)~on%F(=ZaG|GVzl$F|h<)(ymW*WMC+ac5XHeCF!W zYCF;BThEF2dEiR$VJDYFMMVV0XL;O3X~`&O|mJR@H`IhKP-bxSlGD`M8+ zZ2a4lg@0&t#7Besa}P(TbNw?tOZs>73au0r|7FirF%F#YB$|Tr3nx73q4;_|+0t~h zk2uTlmDYiD`RsCo-%tLLMk7B^&Gg+qP`Hd|fG0uB}Vz^0gOvk)S;8Z`;=qrKA zPkXJG)*q^5Ueqx!jiXP;{FoNUFc(iO_nwosP$hY$h#h?jIf!{-#I!tr(lVC;YuU`5sV_F_;DAW`4Vv+W> za1`o^RnLP8g?eJuw@?Y8o>=uf*ifh^R(&5Zh59}?)&CJNg?eIMtgt*^fum4Q9D`%| zzX8X1>JP&4Vw2&Ma9A##&71I9XWE~KqtKpMd3a-8d3ewyrhN=JTQE2GQ665lm15^u$~b$uq_1iIeN3(Q^ZR zwdao`D6Au~+Rrk2V%6Vh^u)@eH?PQ(fL{Azp|NK^6m3IYuheIK*|!wi=AmZ9|LCx{ zRCz7W1t%rZVQ-T%z9%B+SEZ0s2!95mYnnLIMa6I|aeSVfRTHukVs@SuDT_(1SFFa9Juqe?H_w z;gV8-m)AB+m>$!A$_qa$VNTxyoSb~Yi{C9_PKyG33*?X&|4&}{s2Bd8gxOOCd@A4G z+1#+=k>1vZrta>hM*=*^sbG)*drw!aXzz5dn()WZoxNS7yqF@dzTmg&Yg)`ZFQUc| z)T!okqV^s>DspgjYxk;FlXXvk7h&)NX?o3Fj|44iyBd%?3K6Uh_s%B)eo>Ck_;Ra( zp4JA$wRf)K9@*W^ZQZ(8HqDR_Ujb-s>JInJ4=Wv!!NEg~V#Y+`_y=KsM9dV8a1DYu z`^h2Ze|=W!^zl&7A7axo9GSuYqMsIG$0>Tp zDSF2#JUnHN$kM+k?+&o0^-5t(dt`Nj5JHy0m19n?sG<*k!Wme2CCu&x%5LI?R2Qz7C)Fxrsju-=zh<2e?-B2jKJc zl{UmH4d(i!`b`EuWAFzeISjYBGv0>f+R`5yqKN0*U{P#$i*@musAmOC| zMc+qZ-in!rV%AYH$F5@5QL$T#mjRp@GyxHI_25&WZo59-+9yEBT z!MhCJZSWq0_Zht3-~$E^8GOj#BL*Ke_?W@R4L)J;NrO)reA?hM2ESqOS%c3R{FcGz z4dzLvj<-yM-TP`eFobYksZGAYJf^9ByuqATs*fAYXXL6cHMq=RUUsQXrNQofI4RFu zqfZ!IV{om(OAM|vxZdDp2D{@U77DIid>yh7xCFjC#sTxv%pFgGStK6D3UTmngId+dP+P6J}>=gpD8$RDgcD1O4PFq#HwfBOxq0q z1A^<}*Al}%CRpw76+QDOR{dn^Va)7Yn*f&ryYkEBjVpf{ln_^Du^*3cA#7M?V&yES z9@n_@(B6FpZ!`EO2D`Od?0H?HX(t)Xv84Lx23Ht-gTWj>YR|SKu7vN(KMp`}9vcH?dINcTR3Y0ujUYzyuo&N>q3O~XHkJJ!R7>yT@I!HW>4J@X`1{#&Vs4R1xbV>dA8 zL4(+%NgY=HRbtOu5uIYgz9Y_)zIaG%Ho||D82O^>9nQNB05SkaJ?lrD$H4}98jkuR z!D{c0ztG2_C(dJMLJq>Q{6B;LEn?V|2-fnr<1%b`o87J)m#3&CX0T+>c8P>em$C{Vp$9Xb^?WlPjH4c=q$ z0fUbabAf~$H~5snZxD|OZQe52y&En1eAHWQ+`G}Dckf0Et~53YgWbE)V#9qnl&8hu zE`!~>(PHo3jTXGs*bEx%-i;O;_inUc_inV{W5)iZ!DkFUXE1I8Cd(Nk=7fWcH@L*$ za)aj@?Dp4|wDm^cXmE$Y>kQs#u-ji-c(xn8+h1Gs`;30bV7I@v*qku>(+0c!wZ-PV z(YyV%MbB$%ZHKtQWd^(bwZ-1;uPwOF*tq?*Mep|47TjxW`V8JoJT`29x4$+I>=3uV zw%|Rq5$yKY7VP%d7JS^;oHCgEm_%?+LUH?R3(my6QGLF_MFzY5wZ-1;uPr!XY~23Z zqIdgi3vMwsUBp~yA?pox`)iBd?XN9((Ac>Bwf|r8-UYtO>PjCzmjEH>pb*o5fc0<) z7!VW#VnA$@5NJS91d3?2X+A1UO*H*mVlacppD}S5Em-lNcf3L?s;9+^cw#vx+wH3eY$;kV)mH!U;CpaI< z`?VGGnuqZd9)8cyU8FAhW{R`;1$-s7lboqGA{{d&C~0`nR(RR_tJ2tjCW}` zGvioSi2F(fE)ZvVh@+vo#yyun@3gF0?kmqhV0q?oIkPmTqY(F%%ri1v0*0@z8v3j} z4rM8Q3xIw5%8=G=Do|SY`HIWP1T}m5uym&MbpZSNxWCQTUS8Yu?OW@$m)jHO(O%i( zBDVHkrhG&~*4`VD^7U;vz7!Oc`R*Ug)E*sgH*$)Atmx zuWudF+1mSrmMKF_dc$ikmsr!sb24AwdZbGcj3`HX8G*PAfs~6z>_ANWPDEfH{m1L5 zzP<-E50Q}R<9U~_@0-wPv(eI zs?Wv&^=0!5uNC<1cmVCFf-L>Q(=2O;TuVaQ^t}ztYXwG>BL&~jnuGJUBJin?^V9UT z1ne7z^d#gPnZBlgeZ|mM4I%0qj$rz_0{W_uE=InQ>HE8YzHaEV_Kt+G>63FLq^-TJ zDECEErgBW)6wvpSr;q+IeS0B?ztnR^JTKzBHKH8zf2eX+Zya)*3r5zCry)mNrWwP~ zSv-fNUq&HVy}u6VdlvfawjdTYeZLCms~n2!d#Z1=r!N=f!44r3;(G^qE^1`@q7d-y zyBVF&y+7?6gTOq_m(i-v+PfHw<5=*GOy7qC`gWkRI9{mlGz8N(EufG4;3iY1a!m3( zlV!@706hzR&myM2aR{dG(ttkhbtfR-$n5)gK;JjMN;~^9hq&`+d0?ScG2m zDlq%7qr`{r-}`e$rBkO)NeETveRkHo+2OEhV%?vVJ~4A1$6TWkQ-qOz&dA1s$^B2o zXnSbHCnlXc`K(p562)Wc$0f$JPfs|HB*wHRiuqah^TsrwC#B( zfcx#I=j?qv@>albvAGCyzk${oX>*d;QzJDE9=;)3ZV({kbw+~W@2 z!DpVHNZB@bTHdtb%To< zf7HpMb&%;zst?Y~+jgibc{t~ZisJljMf)T6Zo2gI0TbmRCX|^UNqGZLH;mtwV=B|n zImojOg*WxzRIwv}19~E!S9Q|dU9RH!c@G@gc5rF(aK9%OuE^gu2JgYkaXC-+-`~%n zrK6F%XvIm{bFGIhoeuF zRON3QjRz^TZakczF0y*~l)=>Pp*b~|T-kK(HDByb9?pHDYe)V|4-Wq2kY^s8^jtXp z_rDvpFY;ux=l%mdJ35_eJj`}02Hx8I*6ss%CS`x>>5A_B>7~>7T*?Rjm;%=(lFe;w z--IlUL79=}F_&a9_dFyn86=aZ-mq|-Zo|}Xm~|LtIm14m^%&pBtk?Lg+pw<(?9}a} zvB=U*LXT6_AFg=~XX7hSr66KAojcgCgGB$bN{&$mSIodx|g|g`% zg*?hxO!?98B7cU;Gd6p8E=|g&pL+@Fx0w2i5lGqOd9Fu!#^x(tN~=-+YLDLv+#i8D zuRa>{hOA$!fTJ#Axf4y3e-AUc zTr+W*B1KGFkI^!|pN{jyi1}x0f^(kltD9+=h?#$WAZ=rfbDsA&uh4wXY2MS!`C!EI z9h%@A&c~S-*Blb(DDQdRC@J?t`7dg^7%}gG{;H-qpLmb+J(}ix;XTaG)n+E%yL)LW*z z92>eS^@>0?EzAW8#C6Xw*8uxgq#W-OU?_#TSQyrUA!UmkQ_7BUSjsA&ehe$0xfy!c zQ6SNynCWnYzmCFwUAhEFT|96p{WWC7X4Nk?tA5!t=u#xddT&`eX1%^2j-!)J2v2ei z5kF|#dCcHF6D008h?yT%Odk;2JK@+plwmuFV+s6#czS8?^CONi6D0bffcuR?1YY0h zLM-<)DW0wTm5AFsnX5g#&coarP!IPTdBiv$B@xH8AM=4J!!@8t@fyT*6Zvxy)Ae?r zG;xfAAg*AP;XdRe#L!Pa5Zk@E7bu^8AhxnRUb1W_;#y*qWj_;JS@9K_pgz7r?4Dg>yN`_~+I_mjcHa_Ir0#nowz}w!f`M+&BXubj`!PA#Mq<;S zpgj20L2UYEJm81=nh|*4UK?WZCvYpUv=>;~M;SVqF@o76a{)4!fhTPQX8$KC2Rs%r z+eJ)1ePs8#5u2T*%BP*gW@j1sC|ikmwqn*bj~Mo_?}$y$66Ld9#HQzy%BStbvD5Ga zYDAzO_7$=5#Sby311^?(1gTHP5*@7A{J>)-?<1rwA0~zj`-0eP6F-2@HWJ%7p9IXZ zQxH#8Og%G*Ah<=^di^-=0LDdLmLo>13u$EYDSWm3$ z!)6a}^Y9L04k*xG1j7eBeAvU!64T+Jmk|uV;o)~YEcb+|d_g!ZpYSlR=bN5V4_A6v z?g>*pa!;6IxhG6R8Dzt25kxlUg02~*5#^jNB83b$}%IgejJL!W6$ndBt3;?H(PuCybK-B=>|VmV3e! z%ROO=-}5~px}&vgrh3bP_d?F}j@$jGKaiyx@2q*U7fXVIn)_mQzXU(%seAZ0e(r3AwB=rhUy2+fF<-U&WZnhgMfDUOy4EIzI|0l>){9}t#7g7GBQC2 zppVBi>f;h?`qlvZ`YzKvL_%h3D^kQ|!o~Avo_$<)P2VlRzP@UtbvXq}+jq0#GBQEA zXe^J*w2w=u>AM%$*SA9R5DA%mcO&K7mw-O=A52Z@I}GgWYet%KMyBsEFnoOzAXEe% z?c;ulc`Wxc1YaMI{n_*#1>e`Vz|+UAi0R|=fWE%<$Qy}ZL^&Y{`T9Dbk9|)2xQ#M> zqXPPRkViionZA($eUC#Q#}@T*>tp&p6418~dD;4RT0q}mIL-Q(+cwkp@qoSq$ny!= zLZ47M-6n+&DBmKJs{x=r$CGPReI=^k0OGld8PPuK+^BLkf8$7xr+||A?{nZ2mnpv( z?KS_|{bL*#Ukm8tUQ4&JQquJG1oX8+UlAnOANY5F%76O<`nX41FPhws>Dw33cQf>H zUr2rSzh~MPyeEYFEuQ-unZDpXA=^$!+cyfrl%u}?M0xzB*3&nT7>cx!>3b7=;xf%R z0DZPzjRw#3@f*OtKHek3d?V905PV2}s+Rpia|wYCzuvOxkAT z(|!AFy?-{-hIo<9H|0&3o3UWV`A$?o*xfI4cD)QTFa(e^zmFBy7#P;&s z*X(;VpsyMke15{n^gS5R_W<-!j{43QG>NDHZKPwm&Zh}n$T{XA3U2X z<$S^<*M48_Z7eRlKgG!GtHnoXrcQb9_k>I?Eq%}Tggn3lE{vEWl@{ZA(}zNL?%K6$ z+82K6cafPS@znCr(XS4y*;;=ckb%!Jrq9YzR07MA><#; z4HX_5JiX-0dGYvctgKy;P-j>9Jy@x4?7~|c=a6xrd&rDIPjwG|CK7(?NcmIU3C#<4 zMZ!ms_oU=Sp8BDe7wL*bIy)Di|J=s=yJFB2JvVv&;dyHx+mZW;=i)oM=H$fVUmldW z?!YUho6gCBY=H0La%;)dn#jTJp*=mFcj*ln@!b9#V_$@0ZrL(0 zbn6%4ni1VIes}%1U&SW?%g>AFeLinCBsMPG(hs={2ZqM}EIeY@i0*SrUoHGpUeAJp zC2R6}dduHfIb_!z>i3NUzufQh{a(zApMY1zZrrmc7P{}jgYnSV*J|GEIqyGji@fx` zaP8CKTfcSieAwAI=luQsYx{?eUNvM(EIi`L&GqH2jfvX%p#x1|L{9(X=C<|ZkXHPw+blT}yhW^`bq2QDzF%ApL#AMmO;W=kGgBeqn z+Z&!PT!D~8xE%R8^|SucswwU4uZK&GkHEv%6cd>1DL~yxQqfI z)@x+8@roDASWKB=2nht14cct=Rw0kuD9W@UkXV+Oy2$TF__*R15tArGY_|PGd6fSp z0*NxjJk25h-w;UT6JzBR{@aL2gs6uG4QGM{@7BN_DWz_UzW38imvQl>umqwjl?%MWz0T@R&q>>4h08lRnF*KkE1 zdp(lK4{?~D;s29JWDzsTV{rj&zXLHR5&6{dj~@P>hmR6Nei#A=jmb|%ntV>2gvyLX zJX$d)7t@rdUBof9bArmS>{i9MBi^Z)lYO^hPUHiMUq;L{>*b_AQ!(}MoUH&OmwVG; z#2noqX)pM5fmb6?hKt7YirL|>D1HO+s~-LjPv-X?=HZ_D(KPqnE9q$cA0hO!{+TLY zg_w1-Ubbt#V)}BCVothG5<@5Zg4ldjPd>`h&UK1^g1Ad@H{vZG|BzxX8iy5garnMs zE(p&Mqb~LfaZJYy{ldDqD3R>?IBl|P**>4;jn6iRVI!#s!SEyx^Zds6^owEciw#$M zxY@&NJ-pt-n?1bE!#g~@mzX{T9Y8Ql{}_JO!!LW7W5Q(K@v!`lL3MIGnoPpO@;?TZ z;d!sgRC-wc$DlHod3^aFgYr8(ey4}!e+(+K)#KmpVfi0}$~@rl<$nxOG>CLY`!%aN zYHAU8w7GbNp*BALXP2-u*RsqjznM!~mMg!h=LoZDk!zj-75cQEa$#3ov~fpC}RS|XJa|`x&E+x4g%+ejCI7w7OKQ=HhnxlVwo}o5}&D^ zgqZr+J*JOqg>N6{j8DuXU4lStU3)CKWsu>#KAv2Y>a%uGUzt?~O#4Xn2!1>GtS{#d z+rfIQ9bLeFJ8nk8HW$cB>H9myWn_YG$Dy5bh5ERQFnwPFram3wp{)SrNE=a(bSDDk z=v&frkQ?iu{4$SWFM_{|_%q~6MZ*11hV&?cVW!W4BmMrhya$oz`{gY-!^R8u7S@g* z09zTr(8r+fh{rIKG4b0FI>h=ALY#_fFV8;p8&G}n7bm%(Owi!jRC+ApA9!3 zF>Uoyw~ZC@kD?P^AW$+n-Za)))82md>b82GZ6EL3@@Gwc@8{VE*dQ1&Md~a@d!5Ip zmWNVr!`~vnH+wow z+4kbr5?Y-PdpK5%q$Pgm>RpBYEq^9!|BuB`a(frV#4&E1l*s?DwYO;IZam6rzu~jb?euWjogR>lH*&BeX)X z&EsRqRY8s;_IPp&RiCwk`fS7lrrN|kFKsPDAUy@+*}rTD%UV0G0A{-;A&_XtSV8WG zc?=y0{u0Xa87p6XdK6VCZfHvz2Mf`vS19 z?=56dj_svhYcJ)wN*EmlIDo+8g4IiZ2G{5w6dVP<5%rLQYc#L*b5Cq!a%%agX^z3TO$2>BmMV81{{p! zJ`)-EQY7!qNUS0fuZ;|9+Flzup)GRaH4ir3Gv|xHyY`n?K3DVIi@sgH^Q>D&-7w_M zNaUqR_?bxP!BA*_KYLbdLS;Pv;=SQ`B$4RY6yX=bP#=7li;v=M+=2_Ahrd0dJN~=t zcm5{so*ct>az6OWe0HR;*~PStHu4P9J9gPlQJ7Uya|{@Jw|4K0~jpBn5z-X zHY1oGu1chAWyzzQKElU~SW1u=N1XA0bA!vQ5M$Ur9b>INL5(T#xuNV#u@I#3o-$KIA#`+7)*pUP}yl z`i9u#JIRMU{cs_1fBb-!AQ01M#CDykntW_d8W68g+>98i<$5Fi!TklVJ$@K5M>a8M z5@(oQ!vsuSzhaxiTCdNSK2<(-hG8eE2*EJ@Xn2N)t315e!_^+9-By-9F}&Wxn?1bE z!#g~@*TV-qeAvU!66>b!We>mM;deZoi?*6P`^T;aCOjN!yv@AqlreSRZG#`s;qF89OJ}(W(a-kZE#>#Y zg4_?~n17qbR&NoQc9f^2)%zvIWn_Y?QNa3x>$cT!_XsfcF^{wtiLnmKFY_3_hu|Nbp9iy4B-{^WNJkM2Go2sFJioKNe?^{e zAK&L^rRlKmMT=9>d@-v`iU=Kzt7%<=9@X-=>f9P?4fd7&w!_EClBS z1j-FY&{Gm1M|}Sz=Yo;dOIvO1F>f9Q$!|>vvB~ivOI-J8U$(q?O#?1+9ryfc%H*jD zq2r%F@p>MOm?HHSF%KvMoox+1YzYOU_2UPxgz) zQjFpuo3@lZls|3222>pHKe4~Om!kLJo3183_ka~$$&0_W;zWDjLo&JHuISN-e7|)n z&P{j<;>G_RCnQ|%NE`wri^;ccBrh8l`C|UMrHez%mM|_GOA+jZ;!0rZAfNv>qihnP z1A+R9*CLQ8V`L{09HuP8n3PRsB>0rEm^!(wA!U>2)TX>m@&Bp}R!h;tnB?nmoWO6k zYl^-|-~YdJcBZNCIY53o6X^Y)lb8#fn!e{moNQ_0IfqZtj4Pn5pDR$B_zb)aAa*kE z2k?*2Y@I)QnP%r1F+ENb902(^O8e^)^UE}!9iES2vP9F2nBS^twlp6c?x9I8JtXx1 zxTNfj^C7{9u9vm1a#wGcHPp1OZnn=#>G!7eZUmL%O$jO{_a`X3zM*DK$BKrQjwU?U z-4JSBbwxYANmWy~qCr15RkxH7v4zP`7hk82n8Q4jMNKaJqq_Y~5$5dsuB#)lP`F#(FhfFi`y$NEj5osXD(Tvzmv z0F>4@2$lNvzI_b2;(#0rv0sf?FR4Q1Cb?vY&p?e;%m_&d=L7im@O`(X0XZfw2cKn( z>X4xSj4W>{0BtDK489ZI{KB1$`DG>KtPDjzjRddf7#VB;@bxW*KFZP0yee<{D6fYG zQE>o?17HqEisxLE8;roipN&z#P$x3(B~YRs63h5B`hQEfbLCyPk5$%5|b!VPpX0+n3(JmezDiIbVaKG`_qQBL-@YibJ{~z@nIPy1p z$dc|T(@yEsn9%{lCGMNBO#b=LfBtOF2i%l?wpl}c^ANVN;^UBC<~X9q%%0-a>-HMQ z6n)j>xqkKC1~>9N8A> zuE0ss4FeCCetzJV72$a94Hd}Vk?Umiy7^gnqT>%c^j*m+vUS+Ffysk|#|<;S%0ew< zwGL>B54V|A^RA!}j1c)REqv5Nbht zwEon)zVXKDUHir#jy-W-e9*ys$n|$}cI{u~9n;>iU4#DtBx~rKWK#7u4j&#r@%0nq zryM+3y(c-ewin2-FERXK)w5~5o|)zS>KD&ikZ4)mk!WAj+SMmBjdEX(}wc_U^w}-;e#9)I~*@CpFJ;Rt?UlRisQrM z11}$#xb(WN$N$)Q>vfyQBnl%#b}TBqb?~0N@SZ2$xkBFyJ~404Xtnk5efv_c%PyQd z$l9Mgf`18}QkWdHaQoAjE{-=tsGqBM)2_B7;o1S?Yab2Qer)`TnXfgjnEcw<+LNLm zYdpnC+!G4vYv1if>Uh(7GNcvOK0IwgJRZAC2gAP62V>#W@3-XI(QO05ZIzeoi|)SS zN({FF@#Rkr=sh&qX?}75>|XG-gi9?v5{?gToAngq0d2ERJ(zRJ{{Fq&n|Iyr@=KyQ zC9^)fA)4w`_zUBO|6=0U&FDLM4}Qt2IqCP{FQ}NAXm4n5$Mt7<>wR-g>nPVnQ_I7n zI3rvwh2!IeZ^pWw33ug=ZyXknk9X|;LofmkZ#56h9;D4rJEylt=W}WTt@~4a(36AW z_d`Q(vC2d7mY&d-DplJ!ew@>Pu%~m+_U8Nc4BoEZ*dLDPxh(g)Ax||l4j(1fo%-9V zT+tTZQgwPfzNe?Yx90_WZ$5n@KFIhM07m8X#H_>xiTO4-k0EnWVo_q2$zc4h`$IW8 zPiGqJ8Q)!z8`|{psPqDYAu%Bo-{@@J8Gh|nhv1%XzMANHKJlRU(EzX5Y+l5H==kmt zl@(Q?ad}nYlKSvj5Vipw9~2)s_?`q33sBQyR!R=ukugKOl2n^VO^hzh5N`ESlR;Q-& z)!j_L+y8`rm4p8YM_S+YAHtj7dJ?To{rmSl{y%tAoA)2#F_TK`d2E$YR=yyyV9o`J z`i84g&x9~Y!vEw7Nlc9LDWMNPIx{}%pirJ=zVOcT#=qbiF+{I zk{7t-Gsz1NCNBWT`Ys-w7M?bwq&&AGc|rU-ey1TdMVYv5yDPWuPcKGqdoX?{#+;4Q z4f$F{W@MUoU)sD4@lbpljBvW8DW#FFp6;$i&E1ibVa;E} ze_AFdN|rX4=5LxD{{ff5=(G}ygTC{*7E2xuN$rV-RjnP@=#od@!_ul~;%G;F;=!B= zdwRmDWeax^tjx2+P|x^;eVzmM1dao^yLv1-@`=T@ITPf26S@MXzee%+=)>_R9*Up% z(u29roD|uAqJ6Idv+KT`6{DKUYY)B2Ljq=a^&JVaUD-uRPXOE2wrjFz@O zmUxd%wYK34Cu}O0FxO`FxUFV=`@eBb%k(krXC#`NS{kO0sh^N&Y^%YmDAqJ4R<}9K z7kzVpw5(}vwl)8~=xK(YhPJlVZPR%Nyeo-ysJgo2O5FJ{pz!M_w*4sFHeh6Y7=~8Q zt%=0e>o#xhDBE~bXJ<#}4T-N08=LBbWbY5gg@2Q6e4*>GNnP@MzoCthi@#c&D$z6~ z+56lv%J2f74T7DK!dnO6J1e@1aFKI5?i%1?tj)M!KD04Y_0O}b#$g}le+6l6WqWnd z4rn|%tr2^ab#Knbk}rMb?NKi0K5#{(urdBpzuciMC*S|bGY|d8ZDW%8q0T)+FtTxT zPU8N=qhZ`|_Q;-x{`1Ay(bk;97o$vZ)K*4}ZP? zGd+=~4tHW<+HURU9E{b5<2DUzISH+!K-o$%zR}$_E8g~vFSN}X^y;^`o~m1H zagN9D!Qk4Sv+Jv_OE4Y-dl&G#b2n{u*%R~9twCGHg-79kRguEcxwe5#{vaIBsi-)$ zqGEjaXq*F;R?M7SF>^}A%(E+IPOX@EPQ}d932~fwJ~YiKteANTw!>gx@2@7f42)Z2 z^!B`A(B)yXJ^#sY{6>sSI{>R$eb=(9TiX+jHBHS8^%F@S(Y33b{eTJb%n7B*?#c0c z&lwhZ^bEde$Tkt@<-M>{H}y9{)J~q!#b<`%)14jex3_0+Pp{4}&Njnn7tWP*(LNZt zWY58AsiVlj$US=wUfKJQ4n}Nt4o>cUsKF_W=XTAk-yb!Xnu?O1H>M|3`-b?Qul^#H zh&(zlPnc zncn@zjv-sNCvM%f>-G_o9b?~+TkpSbZ@l@5`=8k5>cpLa8!)!x(QjRM2<78DQJ%7; zZ+vw~$@au_6y~1U#N}8m{_lcu~-&5YWctQE}#KNVCS>+2ZoHr4_i3Q~|&!5H1b$w0)7;=Z1b; z5$S(!=*65TqcF?1`==E~W}g$Pi01sZ^2BcyMK+ur8e1?FYv?rCF}5=D=v3`C9GQwC zmOHj!P;JkjmKU50nMpLZBHAzcFX4)ckrmr>=FUp3UcFJB#}o0sFuFmHbbNM>WorK= zT-$%-@`7f7irFIvKbY8a@DIHY4RjqgG4HkERpGHkr;M!}K6dd?PuUCFr5muGg$|dL zhQ}_NR2&{#F%I^`L%U1*<9{;v>{@^P-~tZz){sLw!gQEvCQHMOqtD}rz>Y1?)#!dP zQ+9pLL7Q4V$jGj?Qm4vvE)Nq6G_QEm|}Owxn@l z&V}rJiYeP$hN1VxUvz>yb&K$8n zdvplOLo~h{0=7)-h{S&?1EKd&tt$;qGX#1Mm0Mc!lRejsSD&-h(&mh78LMhq)-=}C zb*yP?Xq%3&{7p!#T3z4Jj2+yn+5o3!RfChjnOIX@L!w0)>KLrouIlshmi#^!&n#|w zdtQ9cL5`gCC5yg=O$DDZbk%@aAsZL${ z;+op~P^HVm)WgRXb8zhLk7+l%AAaznymfD8?AzA8xns(vxvs#D$`o3hLPaT5Z|E$H zj?wA8CzA1;Irfdi!Yw&FN=$M`MG7rUp=1ix8XCoEvQ5p1)79g09}RQ0kkx~S2c3_& zj9i@TP2$9k-s(-BW1!T)d;@w)-<$l3a<(6}>tl9^(BlsByK@V3Sud2@0;TKGZQus3 z-;4b26Xyc)%>;Of^I z(^n7U%{aI2eQ2VqMz><)D=JQ}s8})MFz)!@KEXCpvN`cKU7SFzBcJV>Ibq}r7;sPM zUaX=5^-r<-cb-%@Jaw6V$;uO4Jv&Di-Z#h&c!#ZDSGr6~SM=;Ho7tH(&92$?jviXL zOZyW4@u(ZRZ zQ~&U>`O%y7+8iyZ9l9fb(=Ml@q$gBTi~rJWx=D2+ndI?ZaJ(O)JL^AN45j87z4w%$aaXd_p{C|4MT*{Rf1S$jt4kIMrO~2C;7N zt*+GnD6lJj;H7e0c*}X<;e`)RJJ^%h)06%O2><(LT~tze$%uQce0pKz^&hO~ndjW) zxUA~yz4BmB*|GKB^FH*VnccZv&xW_;o;u=|Emfz&P1gC=Z#!~R*B~Ixe@-IWk-O{{o&8s?X;{Rq( z3mct^QQrFAIDBC75Sz04Kd0<{hi7Q&u1H+n)Yv2&dcPBKD}Fj7(bmv$-k5sr&Hs|F z_Lio`#)dYjCsSRPwU%?Ek8M}Ct!`PKwh8tmRB75YUVl&agp%chdmk)t-ov%6^pHt? zP~7?fYuoTp?}LL=vcGZ&J(f)tZ$a34QP+3>6dw`KJ1?*E-0L>qd0o$SiNmE`;laCk z&Vm&PMU&ydqRz!aEwWmBwPhcrgPKPRUCTl z+0?xZQ2nlRgXf5+y4y!m`v5Aze^uW`*%S}|RxQ+FhkuRzo?|ripHaT|23LfJqa2!v z>`Qg>Ldb?LcK&W);{e9ODZWg#W38jMhBUQYRnv_B9?9BxO{=ayGTt)IM>%5gSZq69 zb<4#k&v^+x>W;kdtTPY25On``yn5oK)Ww=5!|`tg2Q6dW z?|It^>P_WnzFeEmI!_i)#{t8&vb||}qOPT5LIQxJ88|hPk5{&}rmbd`7Idx8wr7Eh zGV4p}$2{S^0{aJzLLb>_NR(^I9+?cOlkvvkzbq~MAj?$b&y%ee2SxO^+G@ZXxm z!_}J(qUE=C$CAma&}>{MbABi;f147&rv%(QF8r?lo8M8sH7~y9ANE8ZEe#zVHv}ri z7Z*o*un-mxe@CAih88Nd^L8DJsivgH@$54(4jWI7TibT#Zx|429CwnlYiB;J;x;&b z(xYLub!UD`ixt9!@5f8_rFONp7t7qePRv`f@sAr$QZ2KGD8RK#^8zkfxoZ3Ki4_NN ze~_Zg7NrhOJM;v;@TOO6v~lfNA9n8oyBnGqDv@4@z;C!TBCJOE6oQPO>~n@sQl%#i zbYvZC2^I5?3CiO1oDf*UF$b=dWnsxi4yoeEYtOu&wQ2Uaz}f^I7&C|8M4akVT;4l1 z?KB$#(_OvhBu&M7dvsJ|{om-A@N}OwJzL>X7#rAP^LmhFDOCnIGw#d)?;o*CmP)hxgd&%i)dv z?UHRi$G2P5-DQYnc!IYMcTg=`)xI3h9M&v{T_61W#Rjt$P%yTqoOn^1#HYkambN=e zEp4%Eojo~w8p7fPm4HnCcyX}adRJWD`axKxY13b%=>;0|u6+_VphCqOo1LcL+FPdi zR?g(@j{lLGZ}k*t+WcqrSi5#>{v?eP8e6`_Qm_i@7G`+D9lK99p@evV7SzHJ2_-|t`FHs6Q4J^4u< zPI%at_wf`@#;@1MetUiWo4vBWjIXoOlkt7xx8-I}rrN{x9`@zI4%sV1#sKp?lrh_t zMBrN_cvlMXR0I;s8(G=$V6ZG>QZ|{<;8TV%DVq!*VxkOV_9tcNKeJ&JFzur~xOOj; zO%GqXKs}5}*<>bwPZ^7;^9%%1HhJ1WdB&t{GG~EL8OCNm|NA!|f%-q|@jHR}z!~{B zB9N$)IDtU^od~3Cb#XkiF2<@uHm#w=TdU^e^! zn9V1jb+L~q_Z$L=d}7X7@?S(CWwU{8qYPuy$+d(hP)P*tx{SX9*y>sZOrlO=@(~!!<0J8hX*`HB#5RV{05e1uOUu#{nuoIvf1E|nTX1K9B~YRI;#;*Q+z#Q zleqzy{YsgCLZC~je;)$Z1@d1)F!`5($7p(>=YL|(N6Mc7Z1RJFt-XbwJh8QFxW`9v zA@i*r7a3EGwoODh34wK$ArvXDM{G7U0h1_C97mx18Uzyg#DfsX??O0T@m+{Xlp!|1 zaor=4Z)+gS2G>Bd;l~sPQJy%0K>4E{ehHXF86#`^vBuSpAV@tY!Xf4p`gwrzhkE>B zz-G@W9-s5h+I~7Pi8c^hzntmuMF2l$+hkz2hcU%ib_xR5Ali020*QQLvw_Di68Xf& zzne@D`9@Y3=OF81Ori|2*~xX0l&$P$@L85Ii891i_GU6c*~)$de3oTQq73o>L0}ty zfIuRjcq{_>ze6CAPi%GlkxWpwx{APOU5rVTAwCm5|Nst{;THv%bJS${kagACk^ zPGp#UWtjb7n0xY}2(m@c{aV;@DT=z)XY~%Q(9Ai>88Sbel!zhd^C`SbGt zqm+L)@Ck|^@bDpE>x-WNlUOgY^~Eb5pV<21R~}yq;>YIrI$+w#*yKBbN!i*p6@1Dw zwsvtnJ`sU!s1oBrQkjN(W~_(y<0s{E6{G=2d)R_~p_)JOTd5ID~% z{}2L+d}8y@<79%!H?lQtEEv?qm_!+3&TZ=KKrnxDjFGbGp$*i-m~=duIgp|LWeC>B zYTzjdttO&Ll}&}vj2fVBA?jiNSsPQ$@|N4{2CpP)Dp8Tgg{&m3k6Z!Q3CBU@j zTV#T$$H@ATX~Px3w1Y8;^29dYn#cr^Pt5&F5@8?0M8)(ci891CmVQMhD4PweBZ9z~ zWc8K-Q-2o%^T}V2VEy}LU^}m2|C-D%G})Jbe@oJuB$ zd}7Knlxmzr%r%ol86)#Q(|-%t?8=Oz;`=l&D(9Ylx;vc!il*Kq?%2_cFKjUX3jz7f zf%KL@nsYl%(bT@c@uKo2a6kW+bOI8}RT zUkjwa9!T#Dq`4la2`{8cCxD`%Zv@i!1k(2g(t88xZw1o-6i9zNkmkNQP0`Q;=>$+T z^qoNZKp=fEkhbHBV@E@e1o9sXq`wE{FK7Xs-Y2hv9a>6ZfOmjmfn0_k4_(!UI(Uk#*R52Sw`NdG2~{`Wxo ztw8#>f%Myf^zQ@dcLM1@1=4>Gq{Diga_nd*8c62^()|PJ0fF?uKsqmww&S|hcS0cl z#6WsTAkDpMn((cMK$_Rz(}Zt51kxu5(jx-tk%2U?EvG4(`X7(uMMI|s@)Lpds6d+6 zZ_*SEjSi%X0_ib<^w>a}*9z10mw#(xU|Jc_@xM37^W!x2{T9ec=}e$(-{SBEqO#9O zbE2|$@Y6hRO%wc|P5{ZvFFX$X>!p}KCXnVnD@{>3|Mkj~?QMr!or@1#t zQ&g@?`)NCealELU+xhv^(g~nw#+OByJ};2ZbGS4`L*?lNP&70%ke(Gte=Lxm6G)#Q zNY4+XxgSkaRQ`|Zrx&FYKvB7ll4eEa6Fq+Vl5|4kKM_b@9!T??Bu!B{&-T-G=>$+z zz9^DrMdcjYPdB9#B7a37y(*Ai9Y|jpNVf;lYXa%31L#sPz8aoqJAF@3O~rQBKG4~zawS-y_(N6-yv9^@6$9R=KDJmrvEQ9l$f@&B(j*cBQ$Y7YV(hvdLCu|-v`on1=4#1=|=3{;Q#% z2lD?-(>yZehrSjX5Cs6a^w&d08R?y&^D@$RhH5g>cZF7Kx&u1$aemOHY5FoB&ti1- zr*?POMn1ltakJ)=N13k$(su>Y`!&s-XFl##_)#GLXMywp4s_735%NRd4xOy&;pq2# zoIjkSY09wvN=?5c^4|%4B9Px4NPkY#XNtZ9p<4p^cWatw|M|Ffb-$)hmh>Zdw;}+D z^E5y7Sm?)r@^M`s{wVo}LPItE8A%@wjn{Owq`w#Xh^Frld!7zmtZ8IR`|32!GvR!k zUwm5Ay^{V>XtSpIpQL=;oATvA`EO{NN1l9qMe@7>0H7rZ`MAH~I|2E}G<}BT9}WFd z(^DkU%XbO4Fu)lBSy_|MgInrVAzg>rlO>^CbP7(CR?>^?~$GO*{YnHuO&! z>9<10stdY$CI6N=>mC~-Uw3#5xQ%`0yCxOZftrg@b*KlJC&xdHk4 zf%FxD^k)Odt8VR0S2bwH z#{dHv^2rrG2-wup(a_dX)4Z%>tvo+cyQZnRewlpKZCP8xmHgIQN*3RRTUOKB+SHIL zg(5Y0JE45kN{aI%R2_KuFkOfoKA1voy4>=MTiX|{@@mB6Dzyz(qiStyXm9$Id~1$% zw65t0>8J0gkH%!yL{8tD$e|5*#HeFUdtbX8KW$m6wJgLp^;jF_(e7n+t6Q%Tv+-@= z_J(GBBd?);S!-<_OkduF&yv@)_04T+@p9RORjp!2^XlcxI+|8BzyyzTbz2iYrk66q zJqtzi@kme8RW)_jq;1tt0HWHKIyH+<2sYIm6Kv|mb7s$3HfzbO3l@h`4~4eZ)wC?D zU)|y?Xt)aB21Gks>eH2`EW;CR_!?jfT#&YwRe^~YqNI5#p$?1!G`DS8O`Gfb*46Fk zQ*o>f)rOXawx+s8s8Rfg52m%P)$bbCIYBX%O~K2dU4KL8Y7CA(8GQ7K6=uzBUsG3y z=cD?Tl5Z{2hix6pR@AiAH)90YBeV35+2zKA`!b^p$c%5hxnYOK;B^GcTANxz?dZLh zjz*NOS%y#A*RNUCy6lPuHfJBA1tY=Ucc%IzGNZhp$!V$&TX zMzE{+xYx3px+}!e27ND0-v`2UmZ?`UP3(~|Dq6LalQGng>N7sSsNI%LrSl4Fx6)_< zVM2c&NkeQ%EiX*^{C|kxvVI$r!(!N4q zO?^E-Qdw8ihDFU8M3U@9ADqiShJ?NV;NuQg_oG6_?kxH#?`{) zyOjB&laPFye0f95vQ;&8%V3VHklFPOB2d5LY+XM&%CZb>&!V7&wE`pjU8HoVzl%iQ zG5;>Y;=sQ1MjDebO3`9AIISupH*h3Lk2I_yjV_i zF)O2>)G8&UzueAYro1&pwg|coJI>72Yp@)(EML^Hs-|_t>bBH|!mZLyD72QrI}+N#Wq(;M-`5~Xd0E9W=@dEMrrOLE!)teXNKlD8E~b}eJx-<< z0&^&r4Lq`)#ivxGxtY41Z!_#z(~faKmn{o)sZ2>2N@W-)r0^#tlK;$y>m245Fnp)O zapK($^Y?E;{w`+^_uFB`1;oCcJONY+f5QQu>V?1Qu(a_W6(HX()DZ7=e39Sdu*mKIrfi;)fhAC4Si98N`n` zTt@t;!&JmJcUAJm`Xhr^C9e$aM_AD(o4@x%8VE<+U7vf_vDJ3fCi=GP}2KbL&Jf7u|A zw5!HpX_xY)U3WUZv}?D+2}I$i9hP=!d!=34chWAEmv$+Zc0J?DO1reIv`fpDQNPwJ z?b5O=mC;{E$kB1DIF7Wq^hDTn#{7h&~D4)thV;&UChqF>h; z!F&1Z?q&+>1!j>~EN$_}p7O!acg%wM`s14FDiYIt7(l4rK3i)bVDKRfp zf}~%5>~I;PuwGb}eo>uOtYdotvD&kkSoJR@)_O1V_|?R!2Qag*b=-=7*l3XW z=O+$JU%%vV0U}#Zh7s$y5?|@Mnjl~65??(J2B?p(R7QN|T>}gMtCKH9l(Dw#b$l5E zS!{mKc51s4)UP&+or=XywORVqw^Q*HmQ|a@PPJM3)L##Mo0mHK#m{QL`1w@F7yA{z ztDkjVCuoEEU+n*x(%4ds_o zkH4?b^|{Q`UrDTfma(DpaUS{Fj|+%j$B$A*+qEw7xnhc$jPTWd=?kq(e4>2u$+7zS zbXTdA^^cYR?)Xyn*A5S3y{c3EdDQU};uGahfoj{IloBgn`t(0ty=CNUyDEwAa{MX}&-3sC z4=?ucQV#=W`d@X*I8iJ^Ea&er7mC3tDcOnlmE;D ziOzpRuJnglFc5!)#G<~{Iwo`oyYI=`0G7>x5wW^{4{<*n-Ri#E9T9_{ha+< zJ-m(hZTx_G5Nzz-PW(IkfOa4lpXrP-scob?ti5p$5B6|@hldgCZJ;APobYgwhl@Qt zfmp{sV5U9VMzKe+*rR?Bd$he`kIrkcN82m*WSQ@NU4mo$)pg*b4oh8n`>NEX>$B9Q z#}TPZkB?H<{jO{RQ8?!MNZPLRMcS@@mbPozNtE|)jm_v69p~bQeNMmFcEn+^ElV47 zsPiu=d&udRdifd#rSLKbME~Uui%gBfVq2}lVq2ZV;m2_6UYuL7QgB3 zzT!7l2ok@k4AU9cbF?4Do>|P*wNY&rdz3HssQqG(^2MG{xUvaEVQrV#qcUQTwo&>{ z`BNybw*J((56!@HN9#>M&gvC=?qo^5ma^MnvFAh1pJI>lryx75x2Km9t8Zrz zt4x`P`}lJnGC^^KuwwD2+9vjE+r|F>5OH_i?^yPK+sTMOb+0mk`sEoo_oQc7WyF4! zVJSPW6gzWWdxfuaQ1~_EsQ-1X5c_pLiv2pr#r_MOyx4z{!{UGCC&03CDE_Z?GGf2V zi2ZuqRs65xQ|#CN6921D#Q*BIGV0&$bXF3pOck-p%p+F)3yAfRfyKo7xWH0k-7j56 ztn$^wZ{i13k6_2{6&`LTR(G}%{{cUs4utSK0^Pj+qr>aS*T*b6iT~vI>xtF=Zeq26 z6R{p&HWTZboI_lVA5bpBdzvo`MO@xO5LP^rWpy4Uh;<$n5vx7L#A?q3V(k~{uiapP zq`y>N`b*_!AkW5R8L>XXQc0}ytBP35&Lh^c(qD(c07-x8FP1>urNqgV#_}t^_lJ@FeMcS)a+PmAy zNPG416lt&WrM>F6YKU6fSt_jSvy2UW6sRBg1@+8z=c>faKN-RBIK_zMEeGW1DvoIz zKSUXfbIN{L@fgHs5JNt$IHq<+$#1|9V+LT>o2NLaKdF4`A-0G~RUHatx+B4;yXvet!yqaZU{31-ykX%PT@QsMO74JkW_CTKX632A> z%Xol%33y@yWRP?==>MI|kY-)T^K58#t(=%cAr4kFRRix_JG4OwrMQrbc6yptr~On05SMEh#yl7ljJE- zli^l?GNcQLwd^N6d;;<)!@eNS=tnTefj3lT*cZexUDHk>A2MekP7p&6eNJpLG6qy; zlFHEk#4%md=8+E>wu@U0V!lz8>mhZrUx;Jh!4C-2N%#rHv3~{t(S0nt4skm%%CcXG zV+Zg9x(0zV7eW7Lh#|v1BDOx-s4}!?tIAA3OdNX;=(e)MEZ1_B4$Z$N1eZU;gHOfa5LU$0O>=DGwqx@jSHf~SwWQKTnxZ?4MPbEfK zj#c6qClH8v)PD}*Gl(HGOtHx@k9>|vV(Z7b%1A+L@8bv5524^nf$q2roP(tFh4N3M3_9vx5z`LJ zvu|f9X1`yg7?E2OApab&j19?7hB4F-w-A;Yy_ z{0|wH6aTA>j4{ZtU2+VCOkA<;*<|d2Pu;{ecjf}K-U7tL#$Tv>)=wOZ;0JUW0_8_4 zjy*-Ld$V9cdm3l(JC4C$a}54f$KYSxm%jk40vO3LCcXu3C68e(ei$Rzn55m5Z$VtH zcrjw}1LWy{-w&Ul4EXdpu^o@<$cG-*CH;P~+h0hZUIQkG*!(XtpAxp)bB=Jw=o`Q) z0H5{VrkLgaMKSyFC^6*E2;;l}ftbhl1To4EM*g{q+19x#b0OjrSQauc)$M!p&mnolPo7mQES-Vhn1$guk%Z^lR=SsE8Paq~XKgb$_vRohFJ}FzI zIQBdMs0)F%J&pKF#L!=?*!0}4e71ww`2VbYj%VT+HxZy8B2W+gO&t4I{D3$#$>$g* z&e)5t0|S&mC;-kuOgo5k5li2}*{=haDW84u6fyWm5&y`;zfes1nBrFvvu~)AF@yCH z{Z2i!Z8$Mx*hj?HN78rTQUh)+` zNUU`|p_pZ#QOvSj@=RXVnS|5Be@Pl&))wQdJTKXuuK44KrQcCkfnpmERg?jrYDOGR?9h6`M|Uq3{!kiB0E?$}d7p9Qzr5KsO<uT{Rw=Qtwc<0wsE;B_zZqP;}8l)IoqZYgP()A z%)=LW_;L@+I7Hc_;9)x`dWcbFN>7)Ew|bbqX1)6n-{tX{HX9CmnCmR%k0O?JQZbiE zZS@t}DKEZc;5vEq8fGCm<6S8Q{ca+GIV zuTXpx@zunTr!B;GZRdLOA^#lW&BT!593hVV96ul#laQfrdJ!nY`9d7yKmh#{0{NT^ z#Ku2JKFan7}=;U0G;|OHvlRn20@aYHtIKsI>`{@Vb*st&dszjg- zoZ}Z0LneWk*p4;J$cGHq)#b#HDMCzabFD-9^bN7`uO%O4Hz4j-{1wDsAcmd^icMa| zKlqctC$>4;15A1Po7nnj2l>#y8}UA3$doF!W7z@nA;bON5tX42h)qA2B$h2hOlF=ArlU#I*Dh>6X&ay;sE{*dF5`t~-Jr(MK$eMx-F zfdZ0ePt&KwA3~f*44E9ou~z{=vd(uo%%}iAl=(dI*idK-Vkrx}85oznM25PF z?K<8^l~3Oj+xhQ8b)9_IQ>8MgPRVz%+O#467`VjfqAC?3jK z@edHwZt9^Qi0xdA_Oa|o5KktC49gLl&1K4`Pl(Ouvz1SM#O6csIrJpJ6QBPa0Q5-& z>SvwA=EEzL4>RQ0WPS80<#T)z+qk_!`I8V68~-1aKLs(d@$XQ6DPm%~?s~WKXCNlF zbI<#gUxt|2?0j7Lm57OL{L{Z|R~2Gno7b->e;#6Do7exQ`~`@KW3S@}6h$alFHrv9 zSuoCBFQOdr62vDcUWZuv8hm0|TYwh>e~dEFlcU)D!1B~ng!n3z$yIDJV#DXa1kt|* z<6U3PCI+867kPZn9h0FhV%8(J0kbbgkdLy=CpLc;E1%<;*!;;d)N>hPj!Tvutk}w) zulxeU#8y`9-v9=v2B83$Hluq&1sF)pVcoX?PY3?G$Cv#Zdku~o%FF_vY2wQfU#ghb>Kch*5Bq{R_V4%sH6u{I4e@Hl z3n0(^EBW1s*DC%D;!i97IAoZn%q@s1NBjlEH!5BU8Kzk;`?nRfKSZE>La~jdUy%=;m%@g3REBehIQ9yDK)h9#GJLC` z{GV5`oQEnt!IP1_DC**Pm;e3!Qq+WaTMYGZjB%etdyo_y`;C)f9h8}bnEPE~j<*uU zd=DSX8^2C5$4m<`baGA;+Zx`Xe9k#yTf;xA{8I3V&4*i*KLdPXJ4VR7yB)v-0U@V&i{C`Sdff@!5ug zZv23-G^cR6hcEH4v|Z)Vogz=)-lUlRkiLKneMlU83qOnz3Sih*5X<@u%=Xd`w1Ivm zHrq}kA2RIgsl|A|dT_Fa%!4BiDQ!!{9{jI1Y+X$5bk%CL`!O@?{YpFm7({jyd0 zw3FESMcQ}+7@$Ig0$}=~LUAtQl<1LH@7zmpXk5ycWnCFM& z6LTIKKHJ0pFL&<)A60ec|IcIsMrKruBT_{>V6+h<28^U9s`KF@v5bN=3Q&%HDE#vOxV^AV%Jos4p_44*N~IQ{V2sJWhfY6OYq#Y@&ed^A|lGn|&hYkCPtmD6#df4#3y&IpfVIR5i`F8-w?bw)>{X*8X zxRi2fFGAV}#3qH1tlvjGCVKV}S<`-ndgNP)v|kgOQiNnp`z_IzAtYg>`(+q8>i4 zMOZC1Rj?uJx{>ER+RR1h&h_w94I8rB@LWQh`3T*4A2v0xA*)TZ*l-Qt)&sDqg$-G4 z+!JII*o+od8&^jzKp-b#OM+Q1vffWPP4uh_S@kK= zv;1V$pC@{jnXGzOPWTVY`C+kV*~sz##0O*+HkOBNMvfoG2ZZx2^(o<;x~zf{G8S7B z%(}QfxY(bQpC|c#GYd!2^;z##}DEIQihFsmW`~}P_8ZyLIH7kf$5)|Q_hEIA?L?mXF0jr zGuvJHE@Arlg)qzWM`4!XbR1)}XFijK*{5zEfS&$3M9=!UbraAe zf_v%+cZ(kC$ln?LKN@!J4Euk8j^$u^*fwOH8{P2*8(v$ueuPaq_Pc)kJ^;cv(^d$_ zqcDbCj*a?CVVxUq7X4I&WW9dBRrG0uWYsSheHB8o`hjcbzZxM~%e)>-Zh9`5waWl3_DfSl`q7is$?=#k535J}HiTrg=Wgmdp(Cq( zvFLlCC#$_%&%k~u^klW?nt*3@{|5lVea!2Z2!A3r1JIMzPYm(o!?c$9_QSrN z-8m8ZLg>lbh93mez6c>%^%F#&KuA_S+&TM^2+69i7JU*SS@pG|AB~V4KMsY3aC|f0 zF~X{E5Pb?ES@o@8+Ls_CtG-k8r3lHYzg_fY2+4YWaqaU66cC<|lfup9ss8%lcwy#q zqS&zA$lCAjT#U3u(7AK5j1$+M(6ilKd&;$IIvWmt2=^r)b?EP> zf!PkOE@}T8_zJP1kE_YhW0~Zyxr9GWJ<`&~`3JLo$ng<=JTT6*>@U~muwnbSHh&oa zNnxWOmW!;{Wv;EDXFIsI`Vjz<#zuR#16hB|%JyYmwFs+)7bE-x8TKjRIB%#x+}MD= zL^%FGoZ5en2|e564s1H+SAgk$&ekqGvv2J@>i3gM9)zvYz`~d&2*0=rGirPxb{_$C4}a z7odQ+GEX;U7ItM8c4Y=<$_&nw8GiDX8T!0shCXkZ;WJZa*o0+vV{ff5GuM7eF!SZO zAu}&>d}I`#GFBgV=mLj}`3>%h>ta+VG{S)|rq_B~hoW97cH^*cW2P@aMaOd=F zx9fyyKUbJ-*i07t9?`Qs?-r*0N@2F)8nW206+PQ+lW+>*HesgSAzXrR4_VT_A^J*$ ze=p2>{8E^8|CMk#!UMvrpIgsM-FXUO-FcjG2&#YHv!$MOnJD^?Aavsy`ZV-zE|q5| z{O}I8J^MACL>MC2>Gs zf^d@I6UneCL`c@(r6gOl(%A0bXH&S#0R`n*B(Y!9;fyq$Way$him!%|1aS++8SWc7p7mD97$$?E4M z>d^q~qm*ISr_i&VD@4!sm_f#YxD%mkb4gn#Hf+y%!t{9yS?re@{R*Rpi%b~?jQ%;% z)2BPWB(Lqp<`uC);GPR(UD#K{vBk$=z(QDVmVvgX3ghtca}?~^kEdhPdCZ-2VNV;b zXXulCO4jzABKj0UvbN{7qGvyn^|_UgQ4gPs5wgGOlYL6oXIQw8diEVTeyT7366%q5 zCBjdUVZ(kTYuZ(!XJ3)yd{_ap1{>3|E!`MET8=?C2IN>?PaEi`A|$KNmqedNNLKv` z)PLEJ8MZaK2w_SXf&Xp!HGWRJMD!dFmkYB`hLK@&F2dtP&%P#WJD)Ck=0nzYX4^4e z_8mF?Z}@;rz($`v2q%(Z!@eV{PdA34PeDgkpJ*m$&%Ptazk?6R9BlN%e8_sw@Fvl- zzsT{3Z}WQUr3}qt!~P{qGm1&!>dh{#%4;&tr`K+2(tN zQwZNABd;e>?01EE{$i8Sz65wY88+0rdymkkpg%|SOv~qL)DORtP;NBL?-*3S#BiVC z2gvZxGCwNJ{^fa!`Z8gCmhEiOmm?(WdFnjsQD&YK*q7ur2rno1dmUNl0qk}*4G6i> zhQ}jW$LBp@>Ulhpb$mW3`ZPka9*<8@56AroaTq&ZfjVsx{wIVlko*0bjjVa?5d58dzZFrkURPF$z72Y^T!Kex zs7IMg5zZEyPS}v+zxO_G7JUz*k2IV#JlZgid9_a&=CQ4M`b<9Q^Q679JC2}d{^g>l?MKL%bl*l;C3=>Z zMQ2);i(^RrEFg=0hv@0kt(RcWvTrbYHW|~h9=nCv*vL0kz zZ@4)b_Ov~jHsI+9*&nn|3F~@eEcIe@w%C*)BsE5x* z2tPqazHC>r&KulEeFZ|Y=H=Ft&{sl7*1YZk(|#&KvYyNC7kwHbIX*m!Pg#4wzDiiv zBII0YI3B_UwPM{x)^H=<5)Y_1@P`(a%Ll*6SBH zzroKu=-m9a5dcYGOJWhkF~ELRK2MnAhwVuHXoPNjUT?;yq-FVNLm#gF!A#pC`V_+3 zgqc^bFarM!zW8+Wx%eCq8;;4Zlf}lhiP-EA8;}>lkz68G4S%LE{-dS3u9c zWZFt$^?9r4ry?Y)&)Y?xMo8B2Pha#?g^;Yzgg!t$@?zVsBEyE`ldSi6AE6#Ln-H!c z!=^@9ZJsbT*zIg;5t6kGOwY7+2+8rYqxkf{8=?PK!GDR3Hmo;U)BZ^G^AM8t_;O<# z_6^Y4vF+BzH~99x2>X&?wjsw#@+o{k$a>8?4osVg2+t+MrcgM}#TtbDs(u)cHuKZ_ ziE^+*Mq-ODaOjSi=t9pa>RUaRk~s-M%CSXnap=kyWoJUt*rIJD-yhM%o@)_A+dZ?5 zqMZ044cMZcB>$aGlm{Gys%V!(cW))y?YWQo9?vVuOFXY8bKpSMVvFA4Fw#$6>Un^? z%=0Glou0RlIf+8HV~g@YhwQ=@z00Ay*BAYi=Y7cmkV3d7k3QtNfy~B(w2~k8+)3sE1X)V{yyreL4<^V;@}r(tlOOZEmduM+NI!Y4 z=K=ELo;Q(s@Ikhazvy{8d7bB7WFFv)NY-ben5=Qqjyp5G=v>G>cT#~0-=S&kjX zb^IsDGX6)CW&D?rW&D?uTk!$moTcNxnk?g=^Ma252C|HQ20H$il4bm}`*r-Y>2>_G z+B*IR$TI#nlV$vGC(HQXO_uS$k1XT=EwYS%Hx8LOG*FY%lPjh%lPjjvjHHh$TI%dl4bmFAj|l7<3z?k zzdP6Q@5Y9V|Gm`9_;=%BmG^&udKv$249NH|EP!6d|46co|1o44|D|LZ{}p5z|7o&} z{~EH4|G8ut|IK6>|DEKuzC68T8UHKEGXB?)W&HP(IS?Ql$uj=8kY)VuAj|mQL+*Fx zk^ST+J-@)n9;e+Ji-sXtmBIK`nzN=3;MLy2kml>`!TtzPOHnoQ58E!S) zW4O=oD#L3HZ!o-xe7w(VtKnUS_mW3=n>P&~FnpMt@HT~LGv$$n#~3a(TwyqExW@2Y z!_9^}4fh&eX?Ts{e#09LZy}%H%fG|$9>e>|CwZH<4IeVh8+K}wFg)6DiQ#g?Qw>)e zt~1;~KG~O{&G1sgD-5qTyw31|;mwA(8{TbrpW(O2#l8#&4IeRFgfXr*Ny90_Wriya zR~fD)pW^eHXSmgH4>{>=`V6l!yq0{bx7lELli{u8QQl^k;k}06B%kJO4j4XcxDdx~ zbhNh_X?Tp`Qo|L7(}rsd&o$gk{($%2X}H($O2cc&XL$R5!~B2fs^4OGhv7Yj_Z#N_ zM%T254D)8R>Jx@X8!jRU(RG&%1DZ^!kE6FKehAP9ghUXb>HQZyk&+sb4YYlHOyvguZ!@CUc zHT4;8@LPrt8a`sU2mGhAu7%5W|DT%UHH;a0;vhWiY!BA5EKYYlHO zyvguZ!@CUcHTRa4C6`_g`T+ZMeqpT*J+VI}P_5UTJuZ z;eNv#4R0~L!|)!%`whQs_>f`#z**~+Fg)6DiQ#g?Qw>)et|MRM+p58Eo8hH~R~TMx zc%9(^!Yj~dFR>M7p z`^cAgKdTI{HN1gb>1{R{-fDOkd5X8$YxqsW2MixJT!?ECO*_)?7{jH8D-5R%*BG8_ zxY=+g`NO`Py@ppBUSqhQJk{H8G`z*|4#Rs4?>GFm;X{V`-!SE(>t+&}~c$eY5 zhTk-N!0=(ig{NnIjx;>RaH-)6!)e1chUXe?Hr#2r*YHZiYYg`r-e`D>;T?we7~XIA zZNrBQ^8q1k&jk58-?pR4b3B(AE;l^YaJAt&!wrVp3@N zZo~Twzh(HK;Uk8N#$@wN8crE5Gh9i&!I!hjaIN8ahFcBy816H?%J5q9jo$wT@?6iG z$TxZ3O8%JVUF4fR?dt2I%ws%qcqMjiV zHn$A1v%96exu>K4j;_Ye&X%q`spl_Q)Ye?TsHq+Xi(2Yg&c=Lp3tM{XdzN+PD|sFl zo%vjJ5AA~9yL%dYmUQPSVrOGlcT0VDQ)7F5S4;PjwtS61-}xOZTCm8~%B64aXwO%J z&W`T9P8Xxk>RTE+JKDlx(JS*?)Y0y|_bgi6(y?TalhAB&_rm&PH0@r})YQ^Fs69fD zu5>I)S5JLwV|#Pkp!(Sc2&;kK?p|Eq*w)t3l)s+dU_n<)%aHqzGV++Feo=Evd(Wbt zW%XU%o%!;|2(4ex)wr;}vFX-4`&-((I@;Qhe`i+*8>F6XNc%jtYQj;xcrHfEZF!7% zNVq}aiD)Q)MVy>Za6Wq0C8X>M82h~ub!L1R--N7u4^*}+Qo!r6k3JSNR8 zw_{h{DT%v=oRaeI2*EOWL9Q2Z)Up`t{GOJj=;`Lhp2o<8 z`I++wwL>gMa(3meL~?eSe#p`1jL*!TybF-b-aJc(%<3a!6f8Y5`aFp<>yC_3u;|F> zb5JA>ENlKFBUK$XSqx|D1z?OObre2N}V$DIZ3AzEtRRvxvzQ z69;^-g7LfDU@_B1?wTaOjhSI{DjWLBUAW};HFzc+jf)ASHo=QGXqHFzyG zl&is(gFM;w)=}J8vm76~AR8jB?nWA3nPwVm&|=N(88p|22m27qH18rb)(*+DM$4aI zhy_}HC=htj9gu{}#v7WEX z^BRVA2-kF(Y=Z?|wqiOj+s4fqPq|CE?17hA#N{h2Dw^3JmN93Am-QE{?S}9gSY<{+ z&YH`w?(%rZW0mpXR+VgxU~QPk%}}N}HD!O%U7j^$w$f~*d>Kgli9<8pF+rxtIn|MT z@_5TbB}VJ+;OdmRg*SF~&snVd>AQQ;!uqCmEQ5U#s(fcPTa_DlO{2n3P$`HJATsYqynG#i9<&4b7v>Gt%{`l2eK7W@=nlwVncH<8}FVFa!2e$s|5YOk2w|s5+4jO;>*>c9;9f7}Q z#PM}bM(Bgmh0Xd)b@=D7SYP}EHsfy%*p{zX_91Yh{vJZi`fG(hwio^3=adMUkP;dho9+X{QVqk{jHLH2%M# zuVFL(9uNHSH89ocOzaq46Zor!KlVAxhp+T9{$2|FH4owM#lT+*2aNjDxq|)sTV)o~aM| zRQ^feZ;L74`NrSB2mbgxV>2CzsK0jue>>nW1zVQy0@%`y^*RwJC#W*xuMX*^BCewT zj)xsNEj!-oi9|Mo>F+{>>Th!3Z#DdB8YWeL69a#1mt_4-H2!V~{PDTAeDlF|fxnvD zv&Zj6#^3V5AD?e4VZlVSe0K%@N^qiWgAMC@F+#2HGl4%o3s?`6i{*@3@9NSE(?bQbLBJB^Lf4}W?- z`Uv9O$NEkU{8b}Py$bCpmjK9VMj-3%%pSkf5a&Lo`#8YXw+`{q(5ujnG8aHjGXmKT ze>{%ZelrkqAN_qAVEwfro`zn9c9c5-77nlv`b+}>>e@~2STM}PkUu>KNQyv~DO zg?5y80OT|ykUj9nXOUSx{@jWC=x+qlTYs&HkAYrA{SAZO`rCJxA6N9ppD3xn4+Z{K zAYP)*#E#K%fxog(W#@yBiXF@6o`XcF$J+qXB@tKA@_jh)w-)}U!ieR&4xyIMJtv8{ z`rC?hBh{JMF?ws@Z!i3nLr;Hm#E#|L06W`$yAjVfAABY7SNQ4dd~m(-w>R*|xYiM7 z8U9h=Zw&mgJS^Xh#@|V(s4d?Tg2euk3FB-X;3G8OG{wcHocCV5ZcW*fDxd;BPDZH9${)A4jPE-1DD^!`#VUNheWf zNA3>%jai;;zk2Lff9qj~EHeK1{HNBDew4oy_$xL38jZj22LARVUO`79>hD{DzY6$U z4I9?C389wn&A{JCTzuv`KK^ImZwLJ8@zG-Zxo1}qhq;rIA^iP&;4gAd*55*;)bgE% z^tS!@d@IMPiq^LndU9HJOohJ^FzdSrq57K|_~SFO`NrQRfxia$)Aqa7`1@GkkI&H3 zPDRUiec^S1pe0Emz__s6wLTL7l~2i%y`~~_?nD2Z^!6Z=xu#B z!5`m)!TMrpl<{|2;BOvo&NR@0h?cK1@Yi-fj!W@}r9#GEL*Q>K{57jHv19b+z+c}3 z+4UMu#TkEh2mbh+EmRrN^6?pITi@Q#X4?-_f5zVvfxlAtv%M@>;(yZihM;UxV@YnDO_0@i$4z!{@4b9j(HA z*u11>Y7<=YteOMfBTA76#FmhY#5KR#2N&)=TF-(2JG8RPE{fxi_) z_~ZPOex_G4(xe-~uD`Fz>FTZ4RCVaM+)(CyVN-oJMyZ)-`oB0A^!eS?C9?=0)JCa!+mEKTtv(Fjlkc5^_Yvr-*(t)`Cb=) z+Ai*yJar~^bpM+m-%gwqz7g0l`l}${N=#Do;DGJ&3ifNh!*L#l ze^ZbzpQHOjV8>`(kneU(wqv9}Ud4XRwQd`*OWnf1eBd z@j0^wbtZO{d)*@PjiQe*5gM( zzNxR{Iw0or{V{Ac-`@uLt~=BJUk>Y!?mvk207K2U=q&#~C#)U$blA~%ni0ra4CYEC zWPSG{uK8Xj{P+ky{Y~I+<98#O?`wZ8cI>y4u$W?T zw4Dpj@%;;x6Xr`90XuS<5y)^z+Wf);Z&Uw^>;zwZ`ZbLzx@lW z)!$8lzm@QZrE*5pUtQqu0Q|8$EZ@H(RDZXKKkc_Q@K=`c=Iz)Xj|TZ}huvd=9iyv* zd=DdEy`DaV{hIH$1AlYR&42v95cq5OtL*)a-x+^<0)Lx^@b_BaFS$MI@38UrcHpn* zLl`gEucGbzkAc5k+q2&b{U?mIz9X<+W;^P*DuusZbtZO<4uc)jq#1!6-kx3OaD1u1 zl=#zr+W>!;F#{3WF*-fS_bn_orUiCPa#@gX-OD(i%RK%b_G`X32mVUO`|rc)gF-vX z4S~PS-_OpId=IYrbMGmFz1E`{{(k8^_z$he+92PW^YfnvKOf|q+L>*?LX+yz=g1zQ-0RH9${@6WZi*v_I z^#%Surkc_pWen`dX+|KMeweK<|F@myJ2UXN9scsoL+QX@;+$O#-%S&< zV}gD(-(p;!B3WkMcnfy<@;w1|Oq0e&S@n~MdoMNHkN+-G^DPhj?V05NN1IRO?a1c` z{#t*Uy>H8ZwW$7P!49{eBbX|jBreMOpn`UknFXg4{J9s5T`>pK&6 zY$F^NPS|hf3Nzq7Zr8%@I4VSD!>&>z2(_IX#GmeZ0Co`_JjU*3*s%<0Y?NIXryPtN z_v5i~AJ;vLLw^@z-oUkcT6(UtL_2$?@4k)y36^_V0L3+zb?lx!;Q$8(#PE z5kB;vuaDR^?72eE)y1=)ESue2uBo?0wML1=w%Bvh7SGO4obdALWiO0BH8I7f(_HUG zS0xJ0JUDq;WYkXzmya91zVy^pS9zP2^9PEQ2j(lSEFO5<@L}bFVx>&`6`y%9a>a}p zQ&Oc(T^-$cLq$j11=n7Y!q~iEQu(Cvu8HTRDkn^uQ0|Vr6iO1sHrG9hQhz1i{c!!9 znf24A&-rN0^>s7rYp$%DIeS{ooXg5bOq+fsK4A=LaG%*e1xMguu=d%3P zosHeycXZ&bFqsVSLV~uIb}1QN$kEcX1h28^Y^?9ZlYW^pvVe;loA8`;S2iiFa;w6p z@cf&fGXAB?^3bYp5Z-^MaMVVn+c{#DIa2ihMX()J&m%_lqYb+mfrgM2wy1E4VIF+? zKO)M=l5aVgQvsv`n{uV$sbrkrDQRrVRpe9f0jb8O{&{ppSy)IdHvJz9b!55l;+W9? znJ|wmWdLT_wU6js`v?zeAJGrhKAc5({V^Te#|-Z?JQe%Y2Frj*k{=KTap^BMEA=cF zIWBF;zF^ukwiFpQEH7DYIIGcy$LItyY*-I+T*`mB=;@oRX=hQ7w4AlCA|oy9O4hVk zf;m0QLRLM~(4J$29H(IpD{!L?#}rv@K21Grc((X588#ei zpX$_+F`}o?UO^LrNU`8xOgSGlLPqrDz!un+h4 zgTTR`?V;@y+X>rnY?KOY4FnM#N@pNWPK$me60rR^eK0-uag1@STYqa1AA?Or{oxWj z$KL=h{5iJhkH@n5yAEvqZ9?1%_fc-dMrK;dP6+LwOFHGUH!^-AICn?&Gm)%g5jTjE0Wo~-fRUG& zuTdzzC~49(g6xGq+R-2LSAVpJi;NsX2d;*arz4I#+R;9|r^0873N$n9R}Al|B(R2g z1^ZRh&Mk2}8!z&ARF2`Eir!K=hI=YIm>KH9V~(qW<9HPQd9R%(bZ6ce%V{R(m2G+F z7+17o_&~S0wzcz!O{VS1b|>rc=j)!eR6CyT?QuGk9p@IN(c^%2`Hq8gptr}t#}LnV z9N4nK#Qn~956FW>92Z3XN5xm)UWJ8#uPa5FD*#?9p)zG%|oD^sQCG@q9`r+Z53#@cCeEkLJTo`_lvI013O6NF3p%<| z$YxTiY5vjD%$Ao9r)Ey8P1UxvbRlt1Ye#c;YF6W-wk2IHnZ&-HsK__n@0$KO{__#v zL$}DcA!DxAZ%q!!H!U#x=Xn1cDHvtGQ5yGTboj|A`&hhMWCTA>$H%x^V(zo>Zr4u! zbKOfmbY6T;@-0-NU>35)7cNI>g9RviOLMBHBjw)>=34@9`bzOlU%m-_eU_I-4s2Q9 zpUwN(qWy!i&Xj)^))BqGN6E}!b^Vy9A7-YmOiioY?#O>rk{|zU9W(%^vprx>LtyM=QRubE7Zu zfVX%ydO!%Ryy@4eptDTMSt;DNsXF8O*;UU^gFk7l>gaierO``^6DK6bY>UEt{Wuxx z=bnD1&m!A>**4_;P3L>nJBbr|k8C@^n-0ffH%z2sDp7E6G}8MnI==T^c032G-sB#t z-MU*lmb5je+FNeNpyr+Z6kpyB`-$-_(Kkt}pHJtvZy??6~5K4RahK zoA#cvR98#SW#=?!`o_&;If28zCLx^%=uD2tXiWePWz@%!BY zH&na$fw>rSPfv>DwM=>^wMZH?@3HDq@m0N@n0NScV1B&2dUvngOm%iG>X>p)b6E;MRcN{u zB(=u8fSxNY81=4vh3$^T;21~GV@7|Wf43fKmyH^s@IwEyFa3pT^gHs6SA{M#Kegz6cW0HG7IqaN(=7$6zhK11SKlwK+QJ9E zr1aL$o^s@4gVK%n8nq8Yq(2)S=8f=qX;C7PxO#oREF^GTJR8HurP0JmzvwSG`1d@u zp;4aHBse1Fm~*E42NgUs2VyEaUh;th@AE=EZm0MH>_kz}zS;9!PX8Z$tsw6Q&5Zxx z+->H1shiIdpE*+nhK4`UB7GwMT-;k-Fv67yx<-7-I(*dM4jc2?OwAVKHzUKg6>38~ zJ9+mT&kgtKP??>$sddxv*9*5vwpY$dv~4T6`e|>VhS_$!V8pBfO!>p3VO!*!Z?A8^ zwY}qxb}nH)T9fL;QP6_98UOGmbwMg~IB=b|JQn>{VyOjgKasFOu?D(c1&c= zZmL!D$#--9m|HMvSi)y@!>e)qHOvJghF+ib{^H(qBZ-qf`wu@q>3b;i8Ty+b%q$~{ zbX-)Ay>i<8SKi&f)4N9d4q7V?$M=-eUwJpN@b%-iMfJxzuOG+x<;C@{9QFxkKfiKz zRbuw@56-SSp?cb{H*eZ>NJo(#-NU(NdpCFefVzFW;OZy6j|)cJ@J`XLvv((6dnIww zKSzIZO2M|1Orf7Rt~!dszM5NDw$eULL8r*EVd0xjF>-e(#BCM7p&X2wqV`kyM{lr?$p*% z-+pZ5&ttDgw;lgn0p_-AM(q569^ss~j$b}*(x?GW={hUSpFgQ}7Ho&(G?;T;lY2!H zn>2sYEPe$$ecYt#=5>WGj}b^$$ULBrBnl^un>4q3)H#Kf_iX(eoZbrF92VJn)%tN4 zX4YabsJ!Rp{_U^6>~_Z@>*rs1Z($_za$yudRx9uW>Y5Rw?kw8B!$;gvlT(u3-`cQ3fiw}LiEOWX`Ty*bokx5S$ za9xgIR$-*~w>*{-F&<05<+%Lq1+g;^`qj+rxqkY+z+Fd9n{oBb%-SdCymdLnE&OOW zyXAsL{G^8eWU9&iLoTk#@!On*_-A3=_S$I(AG5B!_R2ZcnbVxRE|??#e9MjRq0&ve zvSwx#2X|A;qT5?o^!hp1&zLcD&KwN>o>b@JTQl=#S*o)GKd9qUFV)z?HP+ZnhVP$8 z##HWUU_Dka>US#&cHS7ddd?%Ug5@zDI;(RJokwEP8_qj<{*EK}eXC$rRpfWo1y~&Y zys-S06uLYi>zYZi!gDXWcEOB-ofk&VJ*8my<&jARFDy9wgM-F~tS5Bp-8MWsxoyKB z_4YXbO>hI_!ck8Y;)jni=VO4%K*1OnL>aJvkO@#uj=kAPB!QtsH74yuMnYDBF#D}+yr|`CM zETR`J#Pu85T*gKGxv;umRADj^!w*59fA59wjU1c3vOf3pf?4AurPE3aem7}$&Rr$y z#;;gj^!%!|<4fWzmrs8lD?h1k>9oTI|5-Aw;CZy#d01TpYjfkDUd}BpUp4#OahDFq z8p`*{y;!mAE7&!C%cQH0gyX6mPki;ni)4b-$DPvjqRc|Ctc>RRT1^5r& z^LtSo?XJ_kX4cDiGRYDmAQ=0(}&rMM1Nn*Upv{WZ=9=qhA1emz;75QBi+?bn>uItJA5STcwRJ7aNfz; zmCo)5;D%Sp7=Yd(Jp7?xP3?TYs(b>#KH2NFf8wfC%E-BbS1#PXHf`yLv0-|_6? z^NPmegfX861?fjy2Bxv7Br8{GcRhbDHK{foGNSpiqO$mec%g__#@4my#uwU}3c%Qsp8kE;g%z4OccohAw*M`TC-_xgD?6cDQ-(juZ zcs-VSAq5+(ipEN{aH{|RdR{2-xN5x@?Au|S`vSo;DzkpN+Z{z+xc!-b4}c7CfH?_6 z{U(UN?x1KKCo?D267m}}3Rh2*c|OQI30Wd>O_!3m`sKHG6y0CtqnS5fXg+PCZ-Ul_98Tu&h!idhD=VL6qpo_SNQ)mygt+Ikfkd&}%2^<&HV-=(+p9g0ze zh(1HYUy<-Cmm%%PVLJ~SzaSv|H>!IH~KK0mx#q#q4wFF(r7n=i{m`=gcZDzVX!`PN{Y zhK>F|hmAr#S=$_ERVVq%c?tF~Uxr%WN-%#!PM=p`qvT6_A@oekkY^LxOu}|CHtH8* zQ=hHitFh7NUtr^Y+P{d6KVqi-HEe3X8+@kde}#}jd-5=BO#d5f6za*WFZJ(YqfoD+ zVHTjgnAWi zs|qLzurVBgjrM$!fRfMtWaw$nkdn`4sPQ%t_VmAq2_Z~N*1m2B(>L{kQvyPN}{!fISX*6V7)`gPK{xaxk&yYeJGUqI&y$73?X9bwYIqkz^P{+xSv5!JO zWYzyIl@RL5I_JDWB_vdCa> zwn;+Tynu~D8xnUo|#QgHxj43D$gf zfzK2Dzk(?&4_Vvx-@)8P{b8g3Bb5;9$=XLTI9GeV9Z&VgGgAod$*Mom=*f(Z!^Ss! z>R95_AQYxm(Y{*=1$Q&#ukM-lDQwiy{;Sw{98&*p*eKMKKZK2XK1oBNo~-&AV696P z;5h83{nbWaWAuEBBmSJ9I-|dtO3{;f+|tjjVD4hRZ2)bP+o*(4Pu6x=V)V`cAKDH> z%|GR^VP1XMI1iE^!bVs0zZ%=|*rR)~m{JGq_Ontq3Xk{MdEH zP&Ukib!4bMOKA+r=ac6?+B2l&v%yyn&W7PR*jWCLV588UtnC)q~!C@ z)a`GYd@L^iz#Z%X1BwlF$F2TAn2QFb{@0wx@`W{--_M4%1l34Vwrn5eqSu- zt%%%iA8SBMnEyQ zHqEMHId5~~{*LTUXMbA|?+W5QLHzb0uJf^1$J~>_S(8}gli3I;7P%{ke>#Zw1@YxU zd_@rdOc1{>h_4Ld4+Qbg260}4XC>y|(r@Fdvk_3tU3+F#vB>AM5x4)*ApV6Q&hvLx zV(w`+8~;)^0*Xbx62zYj;#@~%CFa&rHvUXD0*XbR4dP!9;?D)~=Y#k+gSf8Qy*lQu zk+UW-_um<8{Kaep6pMT-h<`hXZwcZ&Z)D~D-_gPKU{+#o9cAM>hk4!LcXV()mX%oM z-0O8Qcb#hYpPG$;Vww9%YR_xUti;^9%f`>lMnEyQKFX?M{AR#NEOYP8D`W1QpEZcN zb+V10myLj8?s_Pzisifwo%=7$?sWDOgZM>3oNKzQ#N0hA8^1Ig0ma;Z1I(&onQLLM zi)Gd>8lRRm2F2Vxn5-)1)-g7IMK_1x{%F?YW!YZ7z+&CSL?nvH;B?!T#JRWbMG z1sk7}jX3-71o4-G_;-W&Hn(C`CC{Q;{4C3bo@ec>_*+G0^5dTyV z|7;L{EQoIk;@c4C>YLlik$2yFBZ&W2?0I!l9QkbI4-$vDtN$5X3W>0O6N31RAkOES zRcPN3#Fqx~$0W|Xdd2u}8Q%`}?+@aKgZO(v{3IDa?atpPBWDNWX}rW)wql&WFAMhb zf2gX^hVL1t@Jvt~Ssr;n;=ChJ9QjP-$-sVV5Z@cb|0#(7YY_iK5I>0>C&Kca5yU?v zajsm7ael7~_TM6LUKJMO{Jt{S|2*PUapU;-UJ(CT5dT#We~$?vT-g<4y}8~tAQvsk8q=d9hXO>>Kq-9AX;3 z^$XhF{j^XGU{J*P@=52%nkhXv(_jl1Ih7uO>ce(bLk^-q;q&Jb;lg zk%!2nS~Kvgo*rMZh^qpho{22>{(X~N(bC@1wWw)MOMA1nh1Z~o_!GTs9`eA3JpPl( z+CBSWlpgV-ua?{EeQBHvJY~{2zoV-s($m&mFXl_@@Lzvz=Cqq{;fSk==h{W>?Jdo99Wy$*baeS0Gdh;w$BgX@=d>(t>}=)U`~yXPd!!?U zPoUK=Y0vbq>&LuQ;khi2E4IlIAT3V0VcC`7nVUKX2i4LY1>6u-87hBev^`g8~%+T)qy+7IfcwndzBnp$ww z4ASHu{CN%s9whne#fgp1c}NXm($v<{*p)SsQZ(k2$;VuIj*^e0$!{UqAhU&kfgoM9KYNS+#fpPba}s5xbfd`|kZLhU+zcj3|d zEtBeK4Vp3XIkmUk;b%^~8gYmca!BNu4NiHKCh*;ulRkg(n2ip4o(1chT3ecM0CTG2 zapR73p5*XYMR!X+)BJv!E{|WXEby(sWj^G(B0AY~5qYua1eptDkw3e=To$|X{HghN z_(F1h6BXv&?VR%Swl>81@AS;i=xv7C01#&*?Ak=wwTZCH>ojlg^5O?%G&X%Fzr=GnS!^oEVpB<$Tav6&^bUML(%96#iY)fPNYu8i zlz~B%UyDIpy?Ai|arKgXlZdMyS1%bGw2RvIl(FP|iht*m9}wsB!=9Z_(L0~45X7~W z=u?R6ICO0#09hZ6)=spkD0hTG_Rg+?q|Bw6?9Psqe)Hqz0S%uO*9r z?#rqBiPZRS0JMKu4SmVCIp zSNG+fUEQT0UEQVpY3ze+&E)ESkGHR5TH(25Io7y0r%j5ekv3ri zKwO(h9bKD-roVgzlpYfbBHm*&?-nEI0t8!ygLB1Cs5Lb6L1|*G5^Kx|; zKd$c54zBLf4z;wGID2x(d- z)3kK0ZOh>pz2DpSk)@n$Cbg%#sEm_UWa*dHWV!vnhAe5Y3f9 z{*z?!KbriIw;4m0zDtqW7$Q3U8O<5D(!VZW;RJ1@9bCS=i3oA|3cGyeo{Y;^jxXBf z)N2$qa$KD1+4+CO^HBBTUY++``$)d7oNIhqXCviwENwNYJ>_Pq%U9UtE9~m^nD^=G z^##waUec#2sI<*X$e;H%rDPfNWn{50Crckykfr>UhFRRG+^0yBAH|1AP8&)&UEQT@ zt}arBq1w>ZMe=oZ5l$fw&DYh%=6j|uz@Ro1y~|hF<@Ji9g&PD2$Ht|Cjn&@yMte~_9y=P%K_dI`IF3A=g;yLt(y;4AuN zdX)2*i~(0K83V3fQXV%pzT)lO*m&Htt5?5gS1)OwG*mjST)o6+HTB}NhWu%KKx(n6 zeH~fs=aR*Kp0Q~#HqFMSl`QQE%xyzC2Nh9&8TZP3MFqsQ;aJZ}1W{HF;@Xgd2;$nX z*K-O%&iZGlHk5UaYr`{q+6tyk;RE8@P}*%!8_GR=*M?%_+VGP;t!qQc*R`RvTOD@i ztO3OSsBQS9_sP%b6wifZX&={aXL~)HBiiNJwVUW&yUACTuHB?;uHB?;DW;`kNC~#+ zQw}4gWU((Ji@j?%v8UybWjlv^rB5I9?8+wk|5Dk$>iryZ*`D_HuHByT?AmR>vun3! zJ-f2W+R2q|h1c^l`rqKkwf{rL=SI)2Y|kBoev`5Pre{|d8HcVea{hI7k-3_d(f3K~ zY&LtJt~@V#K4$;#lh*m)V*G#SPxSvjX`TPA{|EkU+P@rJHs}8muOGzU^ZH>3l9zjC z`;*z0A258LFar1MO4_iEc}W?U>%>#R{H~L>X9@F=nLvg;`2vbj3K&sf-SDr8!glN^`hh2Nu5&o(2gelqn)%QirB zI~!#!vupDi*a>lU#5s}ub`rKE^ei(u-iZ&0t9wAPH* zJ}ZT3dj%N|9zs|nde-GSVV3y@Va`1~*U%^D{@aD=^Df~O!UxFW)7267CD4)MaxS1R z`YA<7j`!dLG7cN{Wx{cpi)crmEaP~wVV%h8)3r0wRzOEqpYy@=$$FFHEI6bU8}(C# z<8nWThXnKDB^8^VHfdqaYq{vz9c0bR)pr&Y5Vl=Xm}7{{wsLg=7lB#UB+jkK!oBNV z?UB9Hv&<)wVbA^|$Cu&*;^qXTrHvb_uwmc1<5Ajq0^&@|vXHf$Jk+TljgYMKhATe@ z1>^*5NifU&LBs5uBz7J|$okWUb-6~E<-AFlX`9Kg{}nW)i{@GHe)f z)8p6m9rUHpk>hvb1H$pdw5Dh(3*w z9B1P}TCr){-a>}YDuiV9$?8#$zX(}<-cLQs!}k6x83r5!HOIJbxIT>3LT!`=k!bJ#KALT7qR)G*l=8JGB%q2(t`76HXyKL>B)=$V1D?|FKIh z!Tt)e*zmvGQBS!}xDW!m!*#>w!B?sKf;$DJ>ruYsPd(X-fOoyQJ{eicHpmVtTD|7wKf_yhQ$$avtB z#RX*8tbv-WW#IJ(^=qLgYZ>?i9rf#=CuMBfiRS?69p@kRR$(37=n%$s_)89816 zfbi)%>Ng6p-oi% zt;VVS`u5aFgv*`<*pkAx8fM+7UxbkLNg{2bu+9T4H*Go*y14~5Oy}m7B>;$PAJ|la z&&NhT31J;GoHwXvKIHhr_<%s=^lUe>>gz<${K;`v4#GKve%MxIt$TucEEahEmlEds z&Ykz6Cr_oGiyg=;Y-HAVI2kr9n;Q?{60oZ~Y*=5i{;#+3V5ViB4&Ui zgIz^E>qyqI$NDDW_~Qs&AA#Gz7#5M_wfKOLb$#o`7;J8V?lNplTZ_=u1@^29S=;bN z+Cb0pljCdf0jbBvw9Lzm8JxgR1iSI@QGl@aowH#^kaMvm!OZIdVWyixMgjLBoFRI) z5A#s_9$~gm9~t)B5$+OZ+P^mZH-=r=V80u>IQ1w4+mjrB3?C3o8P4aA5so6m2Gw*N z{{jGV7B=R~_Dhjr!?8rx{&Hgmdg{p9UpPdaJ;w$){&{>rW@DqzzeVWU9BE61^}NQ*ytxM9Dfu5 zabxK^&s7ML;6jA1UT7Q+n=exj{szLQgf}7lx?wjjAuapL%}dheCyC9I429V*XOm&i zaYEMiJfC{xHGuG9;p-7zLWccFVQn|pFVNGs>z5t?WIi_9GcU5XPq*lig_|E$|Dfno z2+7)R9A5NOf{?83wvKu@VLMz-#^Aa)D*t;_c!TISBHSa)XC3~D%m#)OB2H$T$A#I3 zXOQ8i2ccW9f|<5c^vvr)vZQ@fnC-bke>8;&3i^JQARV=cox&#OL$ zJji?_0n1805urOa!F(eD`-yt?3&%Qn62c3G`E~-1UFxSHyh51sA)AKvq7QQX34B1f zkM>On8-)2b19wb8&oOhW=x;;VF3dL@JTJT#;a?d3w&Cv@-foy_SRU4e9RDIdAp5bg zJnW-i2p>fF4jJ|wdt|*nJwiR~Q?UP|*kA}b*6}kmn)1fefDYXCtfP4)b^_9YUT)ZH99xr6oGjH0b5t6wcqHM>;vOR(D zRWfXlV?|A6fHa-DqEq zkgR#RHspy2;@S|*Vx+Jo!ED0{G75et!b;Jz4RIOoY!LYJz@`WM3DMI}t8k_b;WG&x z+cT#Pk(Rz)8^R`U8$zGA4WUmVt!+a$CqU0OB*%HegoBsb2N`MIez4AO zu58e=j%2+@ha$SPGZ9`$h7IdZ)@xhVH_6Ed;>MfsX^2zLa=QF50GQU*5qj##S_W5N zUW7qPuqB0EeZiUf;^xrR*zd-qu=5X2L+|Pf&eRua^VS#oy!A!eYWQ*Wg-zc2egXy% zS6^XQUvQ?r6HI-f59>P|>609=kh8EUmkZO68@DJ3uV2}hNnzLK;Hl8D4%BlTo=ApI z=0(=F<+!Atwq)(!v#CegDum<7uwi}4IsMxJ1;o|2!J+^D6r8Cq3eL2yf1%G?-$tL- z)mPZn7o4f@L{nd3S6^_ZzTixKkv4CAq0d`iq|MY9HhJqi-t-#@_rmQ8*a&R{Cl4H8NJ*yeMQ;f5SA~RCi%XLPV<~X5S{M1lsv;T+cU}vLMpLE zdGJEg*rKyYetbtcs35i2qSX%FydAyLa|88Pd2S{1po4T`i`F=FZ_|rjT-_!uurA28WT+X#zvX1%QzpKg8zw5}-zXN3H-_2y{-|b}S-`!;CU)ScfP(a?orv2;MS^D<~_0qqt zZKZ#C?W6tc+Eesaky*M@WH9mg&8(!ab%q5aGIP};w(Wa(etJJbH{BTN6TB1`|S zB{w+tkqzWV&;Ogfw}G>&y6%SWojZKU49Lewh+=XbW@JRb;X_2k)dtsoO@>`48-?s*Kf}3|6Y6Twbxqvz;4t4AW6%G;=I~n%b7N#OmBfRhcE>ne<8VDOH`Jin4lihNlZn;hQk@U0H-a`--n_Y;qb?0?wd#~ps!;TMRjBKe~Zzvl2; z#JrdwVZ&#*(%~@<*En47@N9<{IlR*0wZz<{fLa~i=I|X3?{Rpa!v`FG)Zs%8A0g(6 z3-pr1uR8pO!^a&SjCpT$s~pZcJdya_k^Y$u&v%&b?J=1(#AikF8yxO*c!$Hg9p3Bk zgAPC9@RJTd>+p*XzvA#Qhum8o$@FIs-I=t55R)@Da ze22q(9Ny>f0f!%T_>jX#9Dd2+R~>%C;o}Yu#s!kap~~T`!xJ5z>F|8wEIJOf%;7Z- zZ*aKN;T;a|c6hJD4?6sa!%sT=tivxl{EEZJ9Ddv3a-4h9Sr`u*?(kTL>l~i$aL(bS z#MP0W)ebi~yxHMf9p2^eeGcz;_+f`1clc?CUvT)S!>>8~mczUlHJd9P9^-J0!}Si& zc6bqSP2~GZhu1pX>hLy)?{IjJ!~2NOjdUJx_)&)sIef(7mmGf8;WvoKM>>x?JQ#Z@ zhNlZn;hQk@U0H-a`--n_Y+T! z^grzI;|@RV@C(GacSJhs@M{jg%{M$!)xmjz3>7F@k_SQUQ>nlK^8VAJ%yKG;k|57jFV!htfU<>iP@Oo1rYNAh7*hc&oyxzCbrz&hC ze*azX+vrmjwo&l5yWY3c=W1-r)(rQ`yuudy@B+QUipgtKk=N->#tU>iQvnp{7e(i^M2!rYtU~U@lCRk9tkO=0CMQQCKA-SB zJ7w~8?{W_{AR1|wMas@S33>|33v2PLRIG-cvDA8dS89B&N~p$|Y;JDu;Coo(6I%EB zjA;+GHSDD#XJht;wj^Dp7G1soHyWj`)AHvXU)KGk=tAyKhY2;;FwU?FHxk62eI*{SxA|JUD%q zkWM_^myoCS;KW@*I?~>Id1?<%**$9Sy*#xioTz(jp>K8Aimj5}&g{}wpHJ&0EG%|T z$9a76mgo)hIHg8scQBF+Q&GOGSElloTiVv+72lg=Ghj;WL>Fs{M59x&YfLXG$+>Ys zJx7Pfgy|+1$3JadJ!B4eglhyvW7A1J}9v3>LV}dVSoBBnugS zB#e(ggm|fsOYE5N(U=fFx**O;4&QT~A3YcM7s#_d%Ww-#o&oauAeN|)m-$}bQKt_d zMaKI0NQBqNkL8o>6#|&sC^esY4eYo`=>w65?>$?N_B>TRib#h2a`<#8ar5o$} zdtk3`x0WFhGJn5=ocH%p=wpA)V4o{V+0pZ-L?U9fH1>z@t9gYKrxZ zhcd5^GWt;zP$b8c&l7undlyE}pi&<{(q$R#ofqh%9UL=8W*?t7_WF)N-*E_0A3tI> zef%B<{^I$u2$?m=8<{?SugL3r?J_+71s?VB<5kmlD|q;e_3?R*XHA*PF?%!kUf*#9 zIfrKzsE;3^n!eu&^tD2!h6N1h{gCX1APae z&&G?b70mxjppVaUWT{BWbiW$tdldTCLWcI8jl=94g!&MTDw6S z<8v(YO_|Cu+Z^cI4Sh$zr@mSoX5T%5zAP5oI+Pnxj`XQO-|8!(U#6u#eq>_$4hH)8 z>^8G0>=wA8D9z&=zA3fN$d0H1APxd zAJ<*_%Z~<3-`@uMQUj9DZ+w1#)D6vayUpe7<@HI8NUTMSjKt{fxgYiC-v|3 zfxbo1XZ?#)d#q2M&qChfcL(Yv+4oz4zB`5XVX2Pwy+6>mw}?LbO|=}Afetx+SXyI! zTLXRjpwAO+Cw)}qFpY(Z$=wFI!I0=l?vn}a>c^9!-{Nv7jT^V4MMCKmIV# z_agilCz_&vrmri|H~*Uax@*@k?8ifazPF)I9|sVHrtj;4zTHmWYDiL!`i=(r_#EFz z(G>kNeSaV5dlCBTAwqxosJiLH6<`uH1oew^+= zJ$+QLK;KZvu})67_?{&6nSFe8+Vs^2`u0L!lE3E%`d))RJI}0j`j)7^soL(t(D#I5 zCTy4X|7OrGpY{7~3Mf&I#NY7qe(+0QeCC^RS&zf~kmvo7w|0-C9@ilwYxkL;-Ip{R{YlX7 z((CXYyt1g>7L{YWgV7G-XzjiQeSd(wk+pk)%2~Vn@C?^qn-EfKcLL;yb6WNwZYc2C zbo$$hgJo=YQP6H{1@3Xs5G8AOQ_$|1p?DucAjc{jf_C4)cR2VgGTUv(VeQ@#wEHTa zM|mF=C|SFI7PQOfP(nFYc{FJE>2>+})`43f&zvvI&@Rk-gnq8!`1G-$UDH;1rf z#boWygdA~BOLjNq<8ljlEaN!1KG4T!Qrff*6VrE1pfA@PeRqX^d{pJA@0LK{8_abc%n$%=_`jEg)Aiq!gJHRN87rSg7!J!tnewEGGa zu-zRvtlfVK{Fpv6`tG`^q#Ws$K;N@B=C8|kqTKZTBJkri=(|HSME@v9KkE2wCQ|dG zbrkk%n7>BW?l{O1=d_@*1^t_e{P;L{EMtExP< z*1vBWYbAi4MSj^UfPy0TD!}J{q^bH=HeE;RI0)5XyUybVfoYVKS zKwmxdC9UIp&X+diaFC8cpRMDcN8aqKLlD_-)*thsZwV_XQI0eYa$aBg&C$DJ=i^KHY8R&Zi`gna}WcqFk^u6Wm`+W$TK6!o^ zdGnVy8bS&5ZL!N^nn$V#qSG&zNeuNA(i<3F;eqao_R*z>>G^E#Z-vN^!;O??**stOOQ5w zqp?5p{UPt!inT>@%#MH@>*SaL9fdxdZ(l~<^eu+mVC1oM3)R3r=8eq0>$F`jM>~uR zcLw_EpwDzr*6^o$Dffk--D3J43-nDa((bdplzXw4a<8j>^%@Aad#(iqDdWQ9Cy>J> zNKDHiH#5#fGRzLZKGR~!{N0etIYta2$5`el1bPeo`w9v0rt&tq{J>~RKz6^)at#F**!#D)SCLC;+>ao3w#}r`d;n}zs?gC)#@?2qK zigI^+3h!QoEk-6MPjcXAr8hOUv`ucmAUoy4i>J)Excg(&>{~0r;BRBQp zdL*E=Lq4`(>B4l{G%>y(Dv0r+TC@furc0xBct6iFYySV&>5RtIF9z-U!CmL<`rErk z?E1!C=^qdL{($GppUQlx>^6+1!Kt&~NJTOUWs`=W6z?CKld3=T)>CDbL*gprW%qX$ zTgr2Z=_OR!TYZE ztIWPxm6tq_(oE%;%Ch}+x1(j67VFt}{jQDsw%t>A#=cv2){WjdH&wT>y84WPnN(%j zGikJ6wvhkK7bqF>yF;>jZ{M@0v;OXTckJlgaaZ;a_l}I>a$wzU5|_%6aizGO%8`+d z+fvV`>%W?{5KbDhD}7h_fe}%~KdL%#j-r}fQ|_9+YtCKscQxMCbl}6v?W7XMFWXu9 z_9sS89Y6Do)Xs4azx~+M@zsZa4(?B@Yn~a1xbNKm?eQ~*?%e;}Ck_ssz4{aP3|p86 z@A*&MGa%BWdZNteS?LHoHKg*)2o1y{AE6@~qjdM{vCM=BiH_S;Z2zq6!EX$YLmx?8 zF(gVqsOhfEUFpkz^5Y>AuClIg43CQQVgg?HW}On5E-VVBpIB^MTRLUNd{MGBEyun zQ-;3s%vO!#d>o{ty4)Vp7uzN#$#CmH8K#U0b>a*wlqAn`$}=TVhIoLcWOCiMgaw_I(b|2R0p8?}d`u!j4Mhm|6_8z#Q|`S?_QT*mTYXCMD_QB^%}J(k)2_ zccMgwDJe;&9enCxYPM|#wtmN52ce|8rTRjv6(*U2oiDdkbp-;Mf=`fGJ~1e_ArrAP z61u!dCcc|v<L%CnbbM?3{WOso+EZfret0uBTowX{GxmYC=*YIh@C08 zGsN5P9=K?Z3$| zYBe9#e_v{5P=0-o-x=ij{Fo8-eJ#lIc{dUl&XK8H>Ysyh`z;g7u>N^&N;1D9$Zrqw zT|xd&G|!ne66?dC2jzbqo+XuN&#)jrHpov8@=G<(g?%K}r?o-(jY0k{ z%}4#cF!lREc?wUC>z?1V}lNoQ+t~e#snjZM?Rv*^(!u0 zJ31ORZ@OtqqZDYo@$~-ODkY3!!P^^HwU9SNnehQ^kTn_Ccdjj9dm?rq)J z(Y|$a&tl?;eSaq3Fg;;>=!RhSPejWRlHmh~GNn_C-@Hr&wI(z>-H z8WS8+7)y=#mb_@(gmtBTeLg1fl#vc{bB57(mDPl}PqwxdttqQ%nkQtX^dv*r6x)UX zth8O#5KoI_xEvZL$KEp`xSs!`3!AiVWx0{I_om>sXezB&J6y}{-66aPN$b{i4Dk&7 z1Ifj(ZdtR)+j}WkX78d9d@27&Wbepi&fbeDHqVX9#U90Ck7ALZ7s&`-5MimS+gPc4 zS;UvRx*Zc=^vXnhQF-x2e4$gYw z)#OI^k<&SWas^`V|Vsn9KwKor8n#$77cL z!n#?-6&C}5ctui$h8Pz1qu~h-i!XYqBfeaMLXg;xy4AqkAF(dm5u1V81?-+G2(tgt zykK6%jw3!3|3JhQI%lOVIsuZl-XCG+_Sew-6w(Fs1|MqHuump1YDuV9AQXZ)GU zXFQ3GFL3~q(}Z1BrI_^%S14wjMkt<-RK}jl(?rUXKVC80VJu9~RK=8GC{3PiSLxk1 z;);3r2NInKa1L1F^B!_FKDsVRUqB`cKAM-`7b;g=q3aKaFFy~ZPsA0v7G;&sdc+lr z@DFq@4!&QDeOE_}x*U7N6^ro?#J;3V4k_g*!?8_l?eeYy`RpHJYgc^HOJeD3T@Pja zfKU60E0*FPi1n+$r~SkgSKuEgi-Y{weqA%gX7FR1b^Uz5%F|Bbie>l*5__@&qp`;h z0!hDTBYTJ|mXNFS^qdG&R~0aA=2Ri3op4()Z5yZ9?4bRmDc3#9P&aYK2k;L>TPd>{=?%n? z$tkW_0|1g(agr&n_)vuTKg~`9(SLg%D%7RYbQVNE?LDShVqI71kG+4io|u9l+HLRY z%n|Flv4~jLiel_J{c*Hmfg;sre#yvJz+|4)bL#vHHS(F<-dQW2_2mF@7XLtx z;xJzh5vwmph|~B7dI^W&R~>$XxD5Y5$8i`QjCzKvh}rp|tiux>=J&GF<&n&Mhvj|S z%3ni1&aI>k4tF}d!(rZ+G5Nj39I&7V9hUcPEB{IIaqc5M>+p*XzvA#Q;=z&p+YZb7 zwv{jM+g2>^+g2>^+g3as@iRR+hxtsi@%db}y-!-+x6Q>HB=6f+EbrS^EbrS^%)COclcq4A1CHQ1(Nq|E0*_dE0*_db5MiiecOuPVqL|Y1^0it7wc`Fgo1+mIEm%)4V&(z zFg&_t)4eG1mQ8mt-fqBqBJ_&Cxd}I#iu=!72)sMfU5y5aHxarQvJGt@C=IU4^_4{a z-G_mMz4C}J$teC7tAvpfy^90)I(YXbKTKkF;uwib69-6Knmjt<;)J0Qmlbqho|`Zz zd|@ym;-X+U#QYLtA(kmV5MmMavv3rIrTHNcmvrxcDGIvQb$(K@_54YDl}IX!bqc38 z+3O*Zy`i3tnU%dOQ*Noq&*2clzKzQ|x7DoAGUnf>c|GOIJ}pTfFEzcsN~aIYY^-l} zppSc~Bz-FaePf(HZYj*ZTLOJKEkhz?x;v5c_SHCj+(MYX`+4EMIkTYqponhvmIJPLAN-+o-vS$~}4^j#F_8$;!eEPJWS zajhd2lbZ)Q#;Yf}D-zlrCz_*w=F=j`c|RV89~S3xA<8oPwIR?q8;0v8rzkXi>jQmH zJAHLd-^T)dyw=lO0tNcE2l|dWeG{C%-wpI_hQ48YIVX^vw_St${wh%oCNS@BM+k-Oy+8o9Xne3G}r>-(1lY{WE>n z2KpX^vb7MQeY0?weLDhuk3io-lpC48j|Te6vDof|5cRSDOy3s*eQy`BkMDM2og5C* ze&~A%DfMyhW%|Am=;O8bVw4-1eNP7Zw&C8Bjh7sRP2WET`gS4D^Q4jK`@2BjV4MuB ze;IGn_tQY%KIFHWGL>WY-vfO!q3<~O^mjfE({~1dAAh_iPZ}@7!DpQu4$}0o`SHU3 zV;R@KDFD<*+ezmj&-KxWWjtnqueX$>=rZIv?u;ly;xi_Ong1B_y9ku5jP>ys+qV?< z9YLP{@)k48Xy0`JRtMSCAZ&8yvrx&(R)R-%PWfZ7h*OUGmf~O;^-;bIhtX1OO5cFa ztH7{zcQ`Qjs_2rK_!|m*&y10^%RQNwTXPP6Up+zYf~glz&pPVyJ1SG^`BfEA&)-oQ zjy7oo*C~ENF(-}!{WVLau;8CFvw(lHGBf6+c2AQpRowcfeg|RSxSg5Qj$I?BX3{&R zWv4D5>5BOrepo&#C?CBdH5HG3&aLCuG$1eE)<{Tqf48umoXQ`WcIRoSD+cerqvDRc z@5T4mN5A`*69->5a}2-flI_agCSL!I{ zt8167n3cV^p4}Vb~=hY~{p>6GxPB4cYzj!ZLJ*b(svd8MmdLT>0#{BV!MLv+|`;-+BJ6mv>Kn`uIhA$NxATYASb{ zUcVEIMWBlPd9eDuU&=&nui7}|aP=hzt7p}JLC4FgC8r&%K09AN_+a&W@`c+69jwmg zvv&_XTz%=m>e;dQ_5la0&vE7DhpXRzu=;&5=lI6M)pHJ3=d8l9jR&i%c!WPU2+-Da;!`T1Hc;tVl(tj&uTMedDvP;bMF*!!}Gl>o8#aeG|?# zo~mTdA!U7HF5A^OhT$NY-Ng1?6<+GHE>jX^h^?+&;`Dc2o?_W9Q)?@XGm2t6xuu}I zZ7q`Q=`WcoZHuYdhFz~vQoH2QHY;OlylP*U8I=p`uHF#WMk=Z z3m8gBAvvXtJL!?$5$B7(+yxy4^z{#Nrh+|vFVXL5Ax)fq>Ma?lNZUzF!yw-L|Rh}{hcT(8iqNRsn>+9;a;Uo{ z{*4j$Wr+5U)CN3?-hhX=r(QUt;UjqH8!Wa54ZaROF_q{38(7)bDUe#<(cDzP;FkcJ zJ3H}I_ZDgeraz#xn?{DYINNg>?6dT_l#CV)lVRSTgAjQ){p?u=;h#>)sPEG{CAs*d z&l9%%vuC4)y7X8@a(JnFF;tmrk*5sDCvgQ8f*4=Za|1DC z#vmoG;6wqn;xL(Q#E`+CJd0XEr$N7o!(?_5Lm-QkxI)*`Pm{0qe3lq8HAsmo2I3!R z9}biG0x@J58{!IfEa;DLn9L)@keP^-xMDE=fgZy_nWvEc1uh{}Z2d@^OlF$OFzm$Ej~6?c95M9JJYws| zh2(2n%ZVYwek8VjT-8DaX99!*YUlRYC$ zy=ndfWpUUu!ga(t#~EvTMtCMM8v^BU*fYY++w;hbi?t>C-^Efr|7u&J6YCXeHV$iR z5wXtemBiZCT4MM}YQ>S(dAiNvI~?BQ@IHqR5bNB0)Zs%8A9464hhHV;;skmFhvDN6 z%QMR=!}GbxWQjTOKocFF>2SAamUXU`d}euIq;m)LDBkVxUSgeV^31Ygd1hI$JhRLJ z0+MHz6~D;3ieGW~7_qK_Z#yi{EGu80Syn91EGy<`wpLf3Syq0|@#UFi<*#;pd1hJH zF?nWLu{^V^co*drcY9`;0}~|AEGvGT@`~k|WySK$vf^LqnPpu|<(Xy0{9HP%Se{u{ z%+F12&neF=50C7WXOj!;cW-oI-liVfoz)<-h3ouQ+_n;kSvofP>00Ukwj;c&x*94o`Qu56^4o zFF1Kw*uXDC2T%X{3rvyWr6|7^-IH8f^x>I%jyL}xc+f0=?2=zdPf*Fv-x~4V={7v{ zObhc*1t)1MylM^~a?ZC}c%@uiPOg=U7yB#c(!bf8Z(6*t*t9flQ=j!Y+(3^0_{bzn zHMgygzR+J%m$gaXrQIUR;8gy{DwAcX0uLB}gf|-S6M@M>GwY`|Oxe~D{jjf%s$@|# ziEonQ>+JSh?8#zobS4Y9p=rMn8wAt^A>kKFyNz`xj@TB_X`{C{3Qe{^Tf!JGqANkN zSf3|Ng>F$xng`v4+$88$Rxkrj)>GeEtcTbd#LsF?=lY1l$S}8h#5pZ^80SQuc6n{c z`YdC9zUFm{BiE6p14Xg!_bbkk33}Y=!)Yqk*9z?I;~rE`g+O_IH!9AN33?j(YLL=C zEZ?!d&jEXVOOe;D6Hs2?J&JQ=f?k6@Zi%Un+cEQ(*EwDv_rgi`@miL3ayW!=Go>DY z`nZKMeg6dP^)(@%WZx@VCx?_&4}E5zf988AlzDxOXOcedhrNA^oW7x`WANcDlfwa~}?J^clY^{ou_9Y9$Yhmq;KD$sWvO4dS%`nYv5`?d!9o<*4_6bpS+ zpsx;-q8>ujSBt~!E5ksB z3VbRP(Zk5-)?XNuWBD|dv;H^)=7Ok7EJrXIa;%eM2E^Yf*@Kkr*5R;rR|V}3hP~nZ zV7qc{gw)y{1G%LB_*l^HYtCOjt8MK*7_?gteIG=*k@@?A%2~U6Ajh@bh;pQF2knl* zbF;D5*6vRNeXl|vKR+`veg7KhI|O|eKlY#L8w0@jn0@n6Z;2^WIc7&ej&*X( zfR^DJ=?HX2()W-*H-hq?WjuC(@8>mtztGP&%8>YbiiVk= zhE2gD0wpW^6y)$1`}-soWt*3?z-Jl#<$K<&4zj6_LSGJtk(J#a=&Qp$Hp(%6+{>6g z%43Mc^d#<$WYH(wC)MJh+;AM+D}Wu-QJkFrI?m;7;+*z!8?a~`pb{mskK6K(G`6r&L*}Cl@kYewo7| zEagY3vQW>-&i5szC)<{u;?m!?mTE6|5}p0yhaP&Um@jO1_ep4buW{vhF(>t@GJFZIELE|0 z$LGiGxNG=X)vM}$DZiUj^m}KMR;*mUc;3oc*;V+~8NNxD#hY}Y)5>p4@rQiAlJHHmg%zo(WvO$& zS{sYJS=RmgYR}-RZc=6;E{vn!fhuj^wJnntwq%!ew0GiR+vcY1issI(o3krAaRGY5 zKKD*{avW|i5r;b~Q#;X{yYPEfkJTjwqier@(@nky=Yml>7WkfG?r1P>A2Y#FR3qdncqq5)p+k;pXWD! zq-A|`b{W1yijNqZvWw@Rn9n8k#Xi?h*GZ1GQT-kePvUOhI9+%;=lPClBdW{N_0`#_ zhkssQ|5oMRi)Plub$(IStybUqetyfA&8>~MWN&C~yfJ%oOXr66t)1Cr8*bTxx0$zI zu&Sk_b1S}T>!qSq3eQm|eNQ)D@0M-dvSIGl&Q2_urBw%lk#@vp^mjS)ckCQ~!>+Sq zch%W=USm10NbUTC9XqOr-|)lgP|W6o{wALMyj}ErcBO4k7{Bx6cNeyH$k&OpS2QC| zO6l$}&Eol!78Hw!*!b|MxUsMwWqp<}$WO}fgj~9<hL6b6f zVvXb0qldo4>-O5)@D+Z(8K9`6rFF#pSwvTNXLao@;cK+VdTd@&cNRF>hdtI6jcr?R zXk6ckUyUewhSl@J!%vr(D+33m_KliVU4b_iq;~&M-bpa295K(o%b|3+Fq-5OTrS!!C4(8BTOPybb7F^prw!9`j;U$bK zoZR|wo-Lg73pzS5=1=q*zO>Hn5wPpKZw0dC%7* zS2ShGy#>78X|_mpK0mz95~ zYyi$?|1jrUQ$ByrT_Y||=WnL|iq~z?gllfjUfJG;drU=^p8j3$m&uPA^1W@v+Uwms zPt?=e+;(HhN>F*>CIn0(=AJmd$**UH`?RC!PHg zhqoDr+xsmJI4|=zA^SBBJ?YHHVXB_-qWRFnJtC|>x4yJv+VFEnC7tws#kJdwJh@j-+7GE#++kQ4b|4Z!V`q$S5lNL2@*)XNpg4*vsM(vfj-4~tj`|m#L zDfVx-g{cdjU@ugE#Fyu>;3&LOGFH!qs%*23jGi_ybTt2I!$7>Y4fo=1AAzfv9n-SaUp|x_H~i?x-9L%nUHbRgYP-Qw|&#?9ACoo9xn_LVO$Pwn{lh~?$!9oJ-cTr=+6 z+TnA*`5&{JFS~HCeUkK@rDYdQ9fl9f%TkjD;JhPm4UgV;UV5yUoxiTwtk}@l(cHMM zwfG8I+J2j}<_FJfNjl?^`fI+=wGh8Nk4+73?a42wW#{2F5xh2TY=xh4L!@{9cCR<1 zF?H~Pw<^z!){iTOjDERt^vI#-opbSssg0?ph75l|-xL0KFY7DI^N**w>z9Fbsmimu zYTg@ZS@qn&%CQG)F6pY#SE;XhV!*-u>8=`mtYg)4<&=I;Bz^q#gZoomHQLVcA>Y}b zK3wyjgEg0S)y$40jy^|mo!F~>o)UTeRASPQhxKjpdBfcLS(d8)^6y6HgxyVF(izk9 zy}f*#icNgX!Q=OhKBL4O99WTh<>MpnzUS`S57wo+&PzqUe0E9ttZNqHbMgU~UHHG{ zF%`_bUZ1ntJ6g759N_j@@w*`M?)~_w92@C8J0;haF|PL&pDyLk>8Y`=Ui9b%bMVEv zd0n}=bKbaP#F9n$cg5gOjC$|)GtZZy2mF}8D`oSaQTO~@z?JQM?SFRh0)D79x4CgW zA0+C)N7gpPdpHk=bELGg-p!ZpW}x5QeAz!MJNoVsM}HXgZQ=;z7Y8wszEl>;l%7X- zPD|B|svJ{Uo?UcrF55YGT+QyLx#g)NcML2`RhB^lR)t8DGg+jnF;ch=VI-n(;f>d4;8LC>JWDhDmZ zzjtAL>21zcLxyvF)!O(v^K^`;S{q-phB0U3>-wQj4eF}3@wL73`9T;vUyGbsb$10m zV(zLvSF`sIc`9?DSu@X__I&1G?WC^SiOP6laQ!#42Wv0rs-0}|gD5hktF~SlcMl|E zT378F zAQ=BkvZI%rS#m91$CabkYw4;~9oEXq!P!sVi@|oeHnv_3e=;KYEztZF@Fkhb5%o9UopEFdm&z**{S2gqV z!BTd*W`_*srpD&Wgh8}HKbl;%WZ?5<2WuvE)!3AnHGqr@x@v4jOeoJD&K|6p(p95V z;`k6sT-a5kBmNjH!LCZ5_B=WPBfI9tt_M0FQa>jRdGevilIl!)XQu3)Oy+Q={5u){ z!Pt4}H#6P8Wq?JA>$=-bl^%ZuW4La4^LhTk0{f8Jjpm-t4aLWEZX?DUeIe&DG8)D@{rQG&RSb3p(Qr9?J%g?MJl$a2}; zqi34q6HxS%sOZ>6E+r$P%+dSvd;KFX^U6Wb9oXn^j6}MxDn}laolX84+pR7=t>ai< z;&D2)f5xe*>E$?$8|^+$?;cxf9lx`+FY7pV-N|FMO8O-ps~FGmc)Wk4l$C22J~RSl zD>U=+aCW{Qs~nK|u{sR0@mL)udg8GNqVmHZf>NMIM}z zu{qxcXX$a(!x}m@R@1|^Z@iAiH4?_>yGxGGwS5|&*Ay9_Bcwm#@j2X&&u9&d$0x^J zJU*lKZ;+0$*DL*atSlUlSPHrCjmP5<4sE|yo<@dWD+hO5D`hS8Yh|<+#%pDH;aYk8 zW!UrG$hhNY0_!???0VpzMEs-oyM^(Hy9shC#@jR-Zas{X9>$xhDLrQ6u@*PleXPwI zT57Bfl-oJIz9t)&Jl2LpeP(0rOrF2yX&)_NUyP12$F|G(d6#ul!6~a?S-3tDNjPQQ zCwE=rYjJnRDjh3-zM9@YeWYqiw;T6S+-UbcS~9FuAK|VdsJDHDd-;jyt1|}{tOpYY zppT|SQC@X@w8zlv*Wi_*@7v2ao4z+J$Kqk-)BtEHb+m<;U+qM14=$`kGisS zAM`NSimUBm4(I!}sA1^2pucgSWc%P!{XG!xnCpFi-#J`9yBQO854L`|EipFAV7V(k zkM5n6c_y8|r`4DH0r9@?!v2{@s-|=w#<7kY4dROH_wAJ><2tcVam^;rqghtTBlj3T7J5NezI7RbBKlC`Y z^JGT<%o9~px)0-d5;yt|nJ0R(c_+=287F6+6j$5Zc~U~dDVitm{&k#BF6y6oqH20M zPvS-s=1J+jbA6xACpAURCxv_GC4TR`z3`NBY&-Ak)I~jW^w)TPx#;A~o8oGFJ8w#8 z=r(WgdF|c9O5V?$?l;{f?`KZn9<27PsApD97{m{0>+5dMPR;Ujp4v;gYG-NL#sN>2 zb=BHk%)9X^epjtNS92Ua+EuHM)g0qJyjp##=Gc($mmRKs&%xSDyK42J8aaX0<~MpJ zb`+D!@#$s$9-sU4vM=}eX7K$m%k$`ht_}R z_QSPn4nDBxiLZ4%kbOv>LpXwG54zkGEPkzZpFBww-?MNtu=G4|_bjemF|T3HyvuD8 zmabQNA0MddWq%gd>OLQ5Rg}E;8sDdL zejkY;xia4=C)y`YRUi5!U#okcY_B-FE;{dYzmfJ-rkBsOy(hUZp3C=z^ouQx>=(WF zC;jr1$beJbFZ0{m?8(Cu?H8x25B-v_)xBT-8_pGcJ;vVB7JnmA7qb)TpAu?&*;mCi zbnmwzrSH@B=^Qn1d^E4hatCjJ1P}A!Sv%S4_ z(v_EG@igb8sr6IqJEokMojG~xiRf)Tuk2cy=@$e)evWl9>1gZNw=ta~{Q`b|FV8i0fRt8tLXCoac9{xvvA9n?1 zsUqqmwzjT!e1&mL=tCI}rXXY}_2IIO=oZ!Ct5z$C_j*kagBCMc=D zCV@|#Oi7d>HosN?TU(qr*4A~vB+3(8TlQOdNo}!jlKPA9;wRtNCAPNK0h6ec*xI^* zOi*9iGMy8ms#2HObn-X(NPW?HD#!MDu&o-$l{6AWJBiJ&u)oZ&)f5Kx#V;EJr(%5= z4%_J0g)|aGJBiIN{+1qzd}8DCYil+>bHL{Bd|*;v{QVyrqV@Bg5C`ku{+y@p1iwzk zS~m~lybK3Zn+qKO7Q@BBB+dn5kxUTz#MV|DnV`P3WjgzF4A;U2+P{RxfM^e~wRIJ+#cCO_+0T6)sW0|Vhdk#? zI4`U%KURsYt#!bpcWPUwaxZ7G>d!IoKRQ#X|Bmsj!JOjUKNaWt{~2TdJ;&HPVgJmJ z*LmLIeX953;F!M&hn?42fmu#I&&!541C#o4-l>H=>+>9HZM6VfTN|~UZH4WE)u*;j z#+<5x4YciI93vFdmm!M%d7s#9I2Gq~Yik19C9z+KZJ)sXIH@oFbuz9&xSnzhgzM@@ z!DDQn#&NddA0Q>sX5xW3DD%%aY|Oj{Onv0Pj>G!mEyw>UFsU!Tp9Oj9%;6xhZVrd( zUjj@bpV;ExpL;@H*U*OEUe}ln4X9)BSqp4qpb40i6bF7)s0;^F{IrM2@c!ueIA}v7 z4if7UzZ(bn+i{S{CpH^C226eA--cs14$2ROVb;GBfUT`biYZeMY;m3iOg-e!1|}uh zUjshnn35<%d?pUoeIE`I`NY=0;oLO&Es$Yzl<#!%zvcLQfX&~}0Fx+BJRFtT?iY~` zLrVNrVA@ETuK~|e{=Wg^Pxx;D*f{?wnaU?-UFvxo*y2+Lrt!-OK-6z!pCk0Of8UEX z*wzlDTW}{A zdPF-vjnwS?lG9IYc5+^`i0wWKVD>x)Y<3=U{KFIm^@p7spoeyT3y0bH8Ze3aiOtS` zB@;wGvDx_su-W-@$3G5CqP)?s+V8hO0quMlhuQfvRZ9KDX6G+~86s)d#jOn3?5uSB zVH7s`2*#gj_I2GGi~6+lH*lDp`&1|GAvQa^9G|!n2kZU`jxxoMASLxj4EZ@F^*@Qj zZ2L!Gx=;N_ahPpC1SXMBZ1%hgY%vVS0E+s>&au!#JO3w!*n8D6s?olReZcW(d!ADJ zt9Nn?d40(KJ%Yo=;r|7;ad-^a#^Ia5B#uL38;9JV+c^9$#}_5YQ{E^khAg8@sdM6O zD5stO3y0bH3t$rK5}TbF7;pBM1K3>VKF(|&NdZt#w)Lie|GzSqx%XuZzlXzO$i5>n z4#XBio;yh76I%=ix)=`b#~3a`8?^0@aF}h+0+VP1vDx<5WP->iwmy9U*v28xO~&V1 zN}{}xjl;=cP>!ixA6=(HlqX(^gSLGMhuOyYLZS?@+4dbWLF5yg4KD(lZ5+eKe+8J7 zWLsa)cZ;BhcAn}O_SMdJtDW1ClIT0JU4MNHnDHV1HXOWWreA-D!{Yz{0Fx*~Z1Mk3 zU=B<2kK?d7b6v9dbKDw#NWvI~XgA8Fx(axi)Pq6(i$VSmgZzOY|4@+s;~>w`mZyyD zM10cZ+$-r2bDn1C)_Fad}oI z^)LC1l)oP2j|KT32l;;s^1L$1Q$}_WKL3+^1}G!5I?u|aewxon`P)JMXF;ATL7pKMJeIEr3oNsS2dqk?=@kRKi7-xcKF9pujp@?(Si*+HIno${1PWrKWmkRKQ1YlHl` zLB1}?pBLoM5AqX({Nx~iL6Dykd18$teKL4HS&-x=g@5Aq)m@^=RLT|xe?ApglAzdOi(I>`T4kT1yMe84Ng zJYl`hXMi%PK|%hsAYT#WhX(o6gFHW#%u^;cDxU$$q|ONP?+WtVW#=g)pOX0e+4&4m zMt0VDRwi{$J|pGhf_!a|A0On;3-Y|W$`gKAB%cAwq%H{ZQ-VCNGV+v(pN5Wjnbbx3 zLZFO%(vfFjea&a2{L&!*{vbam$j=M%3xfP*L4I+NzdXoa5#+B5@>d7>6+xa?MS04k zuFYqFGV#-A5j!K_jL3^*;!ho{ydhr*lu0!P`Sn4*Imq7_9=knYS4@8!eAaU6KBP3iGqnk*Q^AyWjAvl&?rzgbzV(WNKB~uF#|Wb!ny~er7f@ zwI=;Sluf-U`G)i>nm;W0b?JZCJnuV;V1@(8Nzo_}aQhs~-3C;8V*vQnK z>A%tZE0Vt}{Z9quyVL)vd0x4UOyPWquYWhRw%^#$iQl>0(%HCabIiH9qouPswZ5^n zwS9f+=FM9gMkVnYHuD#R z8t~ioK^5bFxUg2^mM!h;Azp+XYS}cUu==K{VZJF~ObhbU!+Zl@R2ncZ4D(4sGXkL* zNkSI|LKh_o%?yNQCJ5cUWqm{A`kM+R$!tsHHsPfjg|b^Ww{32~t5|Wg;#a+!n-KLI zTefs|GoV7#{2}?=7eG@_sn+f8Zae3WxE>5G$W$rbl%0A4qg6K4G1_ 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

UE%HAC<~+|l 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 literal 0 HcmV?d00001 diff --git a/arch/xtensa/src/esp_wifi/lib/libnvs_flash.a b/arch/xtensa/src/esp_wifi/lib/libnvs_flash.a new file mode 100755 index 0000000000000000000000000000000000000000..602ed380f90c2284f997aa8c5c8fe99e55828de2 GIT binary patch literal 180396 zcmeFa4SZcyl|FoKZd*zcpiM(9Q1v#g&_XFmnzjiPO-nygC?&Q9O9j$2Nl8kY#3Yqg zJ6g0t!HiRpzZR`yK^zK}5dpO-{4H1!wK(W7GYo@cb*jVgR;|i7sEmD|XYaMnU3cGe zlN7=Ez3;ewIXTZ>d+leh{dx8|_k2v6+uYmI{^sKIGPzPUtFCHxUFEFWx=g0hMcMzE z%$%w@vwey+#ZeS}F^VR>=(n@CMv-o_Dx-+og{8yWR*ZKl%2t=c1zH+nQD{o7wfwzL}NXJ#Af0KuztkuX%v3K*EAfc+)RvSvwt+lH!| zmgdfujh)T?Z5Q>n%&cDcPV!~rt7qrNzpbOcy?bN-70sO++q`XIs>Vy&*Jr(>V+6u+&x2Z;#;n%&3+BP)zw0HNSh_q_m zxS_`ZKf85wb@Vs2Z0zgr-Vkcz**u6aLEpQQ3|)+|Y;AKnC7Jptx?NQh&kzgQ&8p_~ zxnoRM+opaw(D*{QV@K{G$K^%611+81eQgeT7q4sEY(f|g-pciR2W8fXF$b^<$iRR>qr&mwBK&yav}l4XkO_8lt?PEd-ZmTv`r0^RdYk*Zd$ld=;(Bp&7Uzs5%?lTH zVCb)Gaw+M5N9|zt?RoYa2et3Zv+t;yJy-_)c?mWSo}eQyLC4JM!E#uimtf=I2{z>= z=$KtISPq->5^PLNpfk6&!g6T_r%$TZIDs^SO_10QaRO-vn;^L%;uO*lHbrtv#3`gD zY>MQjh*L;Y*c8ca5vP#0uql!oBTgZWVN;ma$eY54caZke{V)#F-q0Q!^Vczjj~zay zz&b`Elh-j4nS2oQkyWqo;ObKkXW66quq}@JFf56OwGtECSF#k+Z2Sz*IkCV}$Qur^ z6!J#Lv(ORR*0!}9uU&wnsyWza*N=1}`rsu1!s;;NI$DP^D$DwygS8GR08<#dU9VpPozK(acHFe^oYRR${l}%MM#ini3 zGMrZ~j2CZ8R_)ivm-Y7G^mIXUe>3f0F&kXK>e#Qt+_|P^GpC~urw$|e+N^tI1Ag+m|R7JWU!>O zTQ>A0C(LWjS~ryPjfco#4$pz}Q<-yOt*}~J#s$tf+exslbA>KoZcfLQy}GIe{QYg0 z^n{nJi@c;pItT`8EJK*xF**rUFnyVqK@9a{>yP*>gTQOxsv0ms^rM+zz{`yxJyMb zLDj70PAsxrGM+`@YKEIxDvd^afpGZ?L2i1@y}seDZaAar$}H>h=B{hognB6Mnk+Z_ z4|;6&T9hLmYAD40(feBC++am{2UxVaY>)->7tN@vbC}4VEU`uz;X7+!~vdAna^{q8V9BaxZCJ|leKy3(=C!yak=tYCYCvw=RaIl!S<&{6Wg9oFMQ_fIc;64IaWKio z#`BMl>#YfMrY}#GSuqv3CQ`){=|;UuEthQU3MJXV zELV~Z>|#ABi&|V&?QibF@(s!`h6*npL_qn z?CLvGb))vA23FS=*N!`scKO_hZ0d@tkWrc$J$aI5^!lT`1Q*So7yWGH4@Nwh2Jd}E zo(oZnFS_Xb%+!|N?mi5P?#^?UEzaOn?%e9i>dM}#X_?v?)iWw1{2&}Tm1n zYi{BKExLTg!lrriS6sIA@|6plmM&SjaQVEYD=w@oo;QC9{=*oOasQ)ewCous4~06# z43C(~|50=fwj#5q-MJ>b3Ybk-fvp)Eg*L>m!^X6mu&K=rz-8EI{}F7=llHe^Q~S>X zQ>a%_f5t;WPVOnz#%pr_rvr<0B$Xj%>8K7{N|^OjhVrcs;@=yD_XgpStaK6bofd>I3Bp%Pm~~#p`jVe! z6Mi^oTD_uwPFHt-dvEvkYW7F`2E6I58{0OvEpF>->+NV+-qzBFvwNjYp6t2I8TNti zkD0ZbR(D;GpD$PR*GX}+=RxKgjsN|!@GnC-1zgdFYyVQW!~WS@+A$^F3^#&ADd}Py z8!0w0g!4vftb-9%DGowNIkwa|2crqZR6r(TOPMJ+#X$#g{L*FF56jUv?!lgOLOCNL z*I=Xmqu4hSL(ixkM$b64XTG#22m3nl6zr=7*JFP^F-TY@;u0xWz35p!;u0z2GSSnF zxJ1gkl6vrS-r`2wjQu)d@U!^DB~m9{)Wc>I_PxZgp})i>Qdf+l&28AfOYjZYzhCeG z_MZ^Uy81LRcv#28B~s6vBg%O7SotF+m>EfY!ybDx`uX$R3|wDmj%KXw>x(=cwXceA-DFm#;d;eNtC~@h z;LC6sq8a?1zpV>J+vJuQGu-cvzHlfSs$bX<=;`h5LE8;iGBCtYiI18!z|^To*LL#& zalJ%bh5oz-n8T9k8OMIkye%L5EXRe4@?8go<$D->92?|gcT_%(Ps?`|!d4hZ`5ZQ4 z>B>qduUK#*XKG z{JpKuorw*7E>=A|d*A6$=VAlw3~+*DldH|sTur(_;=kGRqQ`cR$UKm_^K-{;aOYAJ zOCNY_w1=ew4?H%(!*h#Ye-yT*6JfgLcWU{;2gGpV1%kxx$@C*dF(Y-a{TUK_2u1g7 zJqp7qhjKCFRnKTWOPLPLUco&jXGWUpb==WLf{8ZlMYQ3bVtKqK{GWe*qh;}yX}6ll zraJ!f9Xo2-O>%uoyPj_O?P#UFEYQRx?al_ReR*7?ti3XvuT9EEyRme(gjsWCXqzh} z%vvgA`QoeAyq=rz13?RK32o|hrxLH?J)v|XCF?ZTGX%4SRDZlSY(1_ODa5)CB=kXPquza4=%=r zWl4z*=V`T>LM%h7(%`uUHxP4JKvrT?yvE>8Vwp%c8NAKl<5_2ByGcTS%3DQdt%tbL zI4|W8w;d0$;>_k-&`VvMW=)6Xq9z;4zt?Kzm|?qN)2>tl%s!;TaX{huBXK=8$}02$ z_9?Dun4WP=w@kvyS1)?(oG9NCge>0{!^iHWeA|Joe@i6}J15HbeuOOFZjjI)`p4m* zd=CO!zD9(tFplzNY{c}1Qpk?$OODH-?7jt?FyHCWsc1P4Kw-FtU7e5#T&S|9C#lIP$I#KF&3i zeb~-)$p2$r+^)hud*u69=xV)*`%fE67l2}h$0NXeRWz;x!1}imfhjPef4o$o{=FM^ znuZ)R5ZFN=qH*s8uzZ^kpdI;GKgvgYnL2@@Xg?GgY&?c&y^H}4*Q>Sk4EoDBWj!73IG{e^P^d)KL^M_|3li~5;6GdH-E zsje+U-D|(Lq>~i8*V>^@v9pmO!j@xeX%FWJR?)TQU^Z%-yU$;*=uC z*gWxpovbnMfN(kK^;QOSZRgfTGQqmF5l;XiPA|>w^s+8woUT#WvbuhIJVf_;}VmJl^}Kt@7(Iaq&`>Sc5~XTZYcXu0IN7@meiCT;F4V z)Lvc#EX@g&#o^jx2kM^f$N8M;nTBEZRm;cYND?30kNSFSlwF38-AwuVfGr>UfEC73 zHe(}}E*cfGX)3&Z2TVLPbxFB=J)M=9sZ6ABf%q25Nv3Sv)ySMtBFD&-^?PUX_ z>n3b3yE%;v$JLc>FFH87u4sG38SruI)&-@d7CZ56n7a z`{Tblc4Xkbk*m(wUcB@4f!f7J&GwP`RE-5d3-+J$u zeMJwKl)C(^J6t&?@NE_}c zGkbZpAQqYl$izW^JB zVPe)5(_W5^LOrq8?KMvldAwBepY8)Ef;F|cwr z0MnM+#j>x!p7leq{9Y6O&%cgq7L_p0zs|~|KvvSh{Z(n#MmC;pla=E?C$L9U`olWU zO8$K}99vn*KS$u|Dl2LC>$wfTJ{tf^M{jhsO(jPkuM6{Bn4;lxe9(=Uvgnk!_fXB= zb&14tw3MN5tO>%}YuR#TILh8G@fv!reb_WrL%O%WSR)+TAxju!x zqKsoje(#PSqECEyA2*xC_j|^c=EVW6osIeN_SV)o(f`Q%1BQKF(%pcQS0!>s^6=g` z;A$76lGBr7?IZ}Nq)WM@!5h2*M`p@&MNR8$#Qs#+lov(O>DV(F@f7SU1#?E==%Ai6 zH)kDU&iYJ4T!H=B#4;5Smx!OEsF&eHTp~U*d;TWCnSdK{2K)1fk!c_HE^RS@;1coK z^*`9mf}VcRp1776_ADQ9iPS^A=;WO0ryX$*_R9ocjy?0Eo-_SAV*YRqA=bKO z-n2mx+?u((6aexTY~^r@b>sMfd2RyJh&HSrVy#cc(Vq3;+7x&`@L8h25PP;gZHUho zd@=Tvl(ai{DQRogT}s-Hex$_z46*nL7^kI5(>i-eJB4~lTS+WwS%)c^bLh9?l?JaN zM*pOAVpF`y;B5x)FnE{2dklWa;Qa<4B<3;#@(eb`hYdbT%*uznj7>4`cTmiERdL4P z>BMYkNUgyO4CcKRYQt;5irWqDH+U;CI|5|D;GG8FW$^t5KWy+520v}^A%l+?{F1>V z&_3$J7=tGoJe3%Ik5XfBy}?TjUS)8r!950VG5C0|F~tX+_(+v_btyJ;2du$O65miW zc#`bVV{p5Kx7Xxf;j)*kV!z!X+mk282gOgcF=bDT4`1KIcLNQQGqES)} zy;c|KGU&tT{>OcNZYw5NPJNRkJ*N?d7fV=%u{-X`6oVK)*KOZnCV zTmLxEG9MM?Zi9ljULtmaZwfH|<20pwp9Hpi4HAc)6Xn~9kmY;W_{X8IeBS`Jd`l6A zX)MaO9~#T|gyG{MO8I^XZ25Tnu);XXe_~m90pC-I<2p%2`FJlJalJ&ef^Qq}By6W* zQ@(Emd<_U+FKM__zWo8;^WfvLo_wzpJC1`F0zRf=A5>Akp9Flnu%6+%gM2(&RsY5n z`S#%2hEj^~nI5|TpmFWRk*!+0qn^~nFc+5sAmAe^(DtT z{d+w&_3wg!?^cAjV^dMS+0a?OM)1*&d~d|2e6%;oqluU-c-*gmzFh3aV2|pL#}HsN z9fg0ZW`?jr_C+0Qw0j1FXo1N!?NehsV#p!pF~^dPJ_9?kO8sKef1`B6X;UZM&z4 z@lT!<$IEqPpET#mwLN81i>FpRIim8x4AP#<&PDh~7Fo|2RoR{*rpl|Yis9I@e^@=9%nlh=Ik(;x0BNqG&&h8GFR zqZc@ncrs$cJtfJ;$0Yqvb8s6;2fx*(qc@pYt})IE!qbBAIYIc`Aj~V9SxHBj>5Qb^ zZ)90T+FjAKVQoLJOGkCtNT77wZ#AB)kF2C!ecCWrWLe37HrUoD`Q?I~B+0)|%AQ5g zUgssBAnD%uZ0@wzwpRNIHX8A~GMSb9-&AxC@HT08HQU;A6`GZFl*tBw((yR+>U2~e z#Lo-D7X{&k@hs%m(HFXPv>LHCv;{c}m7)LfoKJ=E9U8!%;de_|?RQF;GgKM+>j4Qf zzcTdKpXY?nicXg*@$u85izLh$r3_EYzemCx*=2a5^==8%&oW$zKbRA)ihiDBKQqd3 zh(b7`%g|r1$qCPiJ|SVYY#I9NJ_$1o%l9=2XMoGle}5Uor)6QU@%RBnUo(<@7hUky z<;3T_li$?rE=}b;)T~c!=O}ZZbdKLy>hrZfJLNq}{pZ&<=e!wvh<6qG3bn7MOm4R0 zd7GiHVm?Q~_c>#1 zQBpX3aYpB?pPEXI52w!dn5(;#IfSW=vlknt|Fey+uRm%1O!s-ZwlIhNf^8~GSWchi zoM<6zJ7RLM`4#h;V>#yaiP&?Vrk=LMCDQJ1pdL0%$5jn6k14Z>Vb8upTq6C)<;x2* z5MIkF7wmk%98Ye#MLqo?*1Sl;-;`NQ-ZexUrX$YbFM|TYRav=U$B)coe&|DfR%JPC z_!}m#*Dx*95$Evpq9nxe3wHb#MO^r$6svtp%3||A`S0hi0cP7OlRxIwXZCPU4Itr+86(r zooip{$#2`Yiu|yt$DVzt95&=9*7|Y$XFvgQ{DK`n27Am8eIh?>>XFv*!zPiR6ApxV zl`spO7en> zQL2_&-{|&lY{QjE^F`b1>#g@W2rMSG$u%%dekVb4N^a08$Y?xd^MD z&Ij>xCH3Ox8e;LYlUV%RL@a)8BbGk7gIN6BMJ#^qA;xiv@(?z~`wc!wT!ep+XRs+g zZ17QHc0kC>*c7{aHbl?kVZnPgM!2NIzh{F30^;u35Zq6G!CQ$je^T5%8-m?E8-m?E z8>79AyJthNyJthNyJrLQ80Bel3O;18yJv#~4&v_F5bW;R5bW;R;KTrN_iPAu_iPAu z_iV7UK-7d z+hza_YFBvl44SOa&>1vQ;c+u)vI2u<&@{syF@v)t50^pHB#f0o?ZbgGsPRyvWYEON zGem|U8us`Yl*bH?LG1<^8Ezo->Wk0{U#dLrSC;uPD=#p^JJt$Q`{Uj){&V>xOE+g- zga2HnEyi{hHZEJZ5o1XZ->1|7JO-PJEN|R-8gacu?8kAMYd`Yg@a(vFs9%oF@~uKx zmH@FH$EB9?%>tR_+m5&- zzDgKb|F#-F+AAM_1F(Fz72w+(@ZDwjxFl1)F9dwM3-EDWYW;h{@Ued>-}3?A-U598 z7VsT0d^{~tz6t1zFpc~3z5;x_FU$Hj22M?ZE&B_{iSoI1E5foocl{@+JyryKHHMF; zLCSYm;NMe-OXB-fz_-fqO)z}F2>6~uoSXsx`Fy#5A>i8rKJu`d~$Gj+S7dz~n6tZiE0n0a(-F3pJ?M6QS&Za{D zDC=Nn%drpT*aSW6WfC?m$43G_jz78V04s0D{f7d+N=(9QpeNsCY|8iTfUgsLa}lqi z{(U3h+hO?l3%2qd3;6aF;QL*`chvBmW%y=;7!+~8KU{#X3U>6N9vh_*gK-V^EblaI z>fic+FN6N5cRs+(*>T?%@ZE3t&JjEI$NK}mHQ=iyfe7=Zd^X@4gXYrDW1~D}_^J?A|KLMr*0=JVf`M!6 z?+Nh9P!#af7S)JJ79N$(XWM_?FY1> zJScoV6h$A0U5^H^SG&K39et>mxK>p19$@-64;$k+KK2KE#c0RfT6V-M-&X^^Qe5|= z9r-T8rhMO3KH<0*g|f#P<@=WMiQQgYFQgs$78*X<8+W38;Cl*f%(gpA>@c6PDS&@v=|w6v=90I8osEg-FY=LGggMY@3<15P;d!`zVCQxg?FOHWjYo2S-&9~ zNykL^esPBX@N;?Dght5zB*fi*`|awgyVhUGHb^?G;B36hV)^)sM%7mDoVjK6O}7`{ zCm*c1;{1_2tGA!H^E7>TL$$uUVgB~zc(=v!!QLsc?^dO$z4eTlb+?ulk75b#zVxSe)wRn}n&qR=sZbO?rV*EE13zfRkFU>I+uU;9)M+zt#v6YCX)3 zoJQxhcW-DrujTso=8nxB=i!?i-T1~$>viX?ZNBcjWgGkZH&J(PN9(%t@Pt!OcNgBA z-FII6+NtyUdRtt`etV^*2NT2WA4S#8W9K)Isq0_XRX6(f?_kViqCHI0v-?+Pc z(wHlYFIl~I(wLG(7mobs;iA$}9qEp79g{m|Zuzgx7j1d|eHWE){h7pHWj=lKu{R_ule9_`@W9A>Y|IPzq zzUcR8|2x0_vQJ!^b`BNYcu}-x?V%N8&u5zDlg6%o@Zx*D#nr`EtUqVZ+6Nx3Rn6YB zSFOEx;i~xqBbS`IYW|fYN=IIac3o9{aO9HehUI50ShD;^^ubMVf7OqcHJP5p{=Hi#mEBY~V$-RQ|JSi2uXA)|j;>7T%2pMDuBf2`bQO=E9?|5; z^=l`MTQ#0`4v6XaRij`!YWbvb4R3<=n-<|@sQrW^>)_T1+Ksxh97#qZe#yuUBUhaY ztFT;4(3hBHBM<{2|beFe2yaq!o5x9XkKR~L`!M2AB$_LOP84E*j# zQS?0=otA#yeZA(;=&1I49Hb3p=<1Jd`Sk<4k9~RUms7ubbj*(*t;B-^B|2sfe!DtV z*8b@FnRSnj`VE@n%=EhUq6=!C~oV;@M3(a|`t zx_um8%!0+(ZL`*<#x8yToR6NHlkjzM!le^!y7lejZe%*VZs*eU_`Z`i&15!3qpG8Z zvQ0HxetPZ47N~Dm6qmM-*i=3+d-Hho&CNvvi#twWpYJGZuP9m9QPDnsVAPWF?ejZE zpnIa-+p7|XMb`kwxIc(umG^_WuX`xoD| zLd(W^B;7C`gNF0Sk|K)*9OT_l&z|^7f)jNAH^ONP6oY>4`_yZ!cf;yJOMz<+~fkZe6hd=(e#9 zlW$qDWOBpu-BZTaSL{DJf9%w87gtOh=iYK1VK!-M>+Nmo&tMWc|9s9=@&&T<&*zuk zr*6cjPVoZc{^=P-n5SOzo8on;kU@1(uJSv#ydY#eYRE|j{}t0tF_$8W0plCRInQz_ z;pSWHdAdn_A~qh8tFck2C+6i5>g%y_i9y_mjhEnvuftY^jrJR`aalne*#!}xD-|Y?*&%>zhdma zZtM>LkHSWuzm1J$A^($tsecL^>z4RwY!uq4Xt~sX?$w_Ru=>e5r!Xxse{CeEUk-Ua zF(yA({)@0zo&~_lb15)|JjBYgib@Fe#5}zy!q$b2LOn5;n#}hL*p&Z^!1RgsKa@S~ ze}rv`gwKYt*5~=a>JM+z#h>F}0H8b@s1!Xh`!M-=X-;`=23DS1jXkl}!yUjli*!Ce z1WX?KzaJQXF5gGRhWz|__$0CU5wP0-jK&a_i&*O?jYN#1o<9{cFY>$&|G20AG=R%R z-(~dtxtFKOwBsc%?rDDqz--a~6R`HHXMrn4UrZ&0_QYBbM)mFHe#|Ddsd2pDHXt~_4`rjVZ)XCh9&-{^_eo|kwi zv?pc|#g2H&tK*2DXrRzWMaR)(C}_{U`acDjWu+d+mYC;aU`i5?k4gA{{Lcc6&0$Hq zE|OK{zwe1|XJzQ`oUux?lK(y@UQy3V{`;NSm9vunz9~+xS>dw@>LDj;zUTkUY_#hf z_F5o2i%u?_0QtVB_XhTygjHz&B?+*h`FY&7z1mQOZ;Wr22 zD}r$LtkLK9J&9)r;`^nJ1@`fs%T;EHP*vUB(%4LVREUvbO6JhzI-TYhCgee{<;No3;G#Y*%yq`PuASGm_qECC>@8HfP^w}*^70X9c9$QOE-5A%b>ui)drIW>bXV|RA)3Fz8 zfpDDY{ah|BuHjHzTDjLOgRtIf#z|A}HJeH-_nJ*7=8cDtN^FX2h{fkxqn}I6RSl#b zTPlNpkOkOMlN|K-=m}m*y_BVqSU6V_bJYjoe4;iCr#Ra~I1iO$ES`fs53I!Wt6gvp z_8W+0%H%K~2 z+0MlJjXJg|?*V@bd-_Vu>g8gK?---~Uy1%U>~{+OYwY(6X4(V9G=_W=n{qx$3_Z)@ z$_swl(v&vr3$E-?u)h%NH~BKawBbV9l@XX_WSDw#zl9iS#|YN63&n=MT_!dxE3v*8 zjf*1n^D42SKg9apug%8hJz~Q)BGz`fQ$U4*pCrB9{X#E!OwPluju*P#&*H{z3+a(TO@N?jNL@*b1j|ryF43m>m zhK>2MKG_e5GuT%Mo`yXa#?-UE=L%kcJ==!*OR>L3Fvk$vfc)emF5w`CY{N!-_JzBN zVZ**aTq5%!`v+}a!2V%_-I#*@N6`Hv^+=l$tnb@9Ecz+f6PJ)2@(XO_{7>wEC734; zysk^0sn8MY`|3`n9`>xO31TxHHpKeQzc+{tPoT~e%oDEJf_cJqnP8qwts+KVmEa*( zo@>O0_v5w+rad?Mz!R&Df_WnL0l_>G`>0@^Onp)?Pri8X1Jgc){nrKm4Ev`9KaKql z1oMPz6zYQZJZa+lVdy9O1F_C6ZxDSg^u+4_nbad~9riQDhJA#%M2PJG!cI*Wm?*EQ=WSazTe<43I0Cz z-zElU1E`3V^C_{RKmRJ2wtel49=zCB-T0eWwGJO7oR<) zJx?S#=81Xo_y)l|d7L4bCyy5pgR>Ew#M&kg* zODKBpIp@<9|3SuJOQGx(&MErdM~2m&bFSJu8?k5JYR|EkLVu^Qk1A%{D`wp(USn{l z!J7=;X7CP!cNx6L;D-#}PmDf6Ifza1GX@_v_^81z8$23i(zIOrD9#u>-QZe-Ie)2r zqrvX|j^Z2VCbj7|c&owgSpl)%N&N^o2)WB(&P%Fy&kBgm6GqRuNo@`p?4A`6`xWV9+2Cp%=)8I`8bAHf#cNo0O;5`O& zu2g%@S&9!D{EWee4L)k{%Lb1|-7630D#aOtryE>r@B)Jy4Zh0Yc7yv3-fHlG!8;AU z%V2lU5WCM^x)dJRB%QVO*sgukT zURFBHOCmGkJH=NQ_GV#KT~kxz@`Wo`UfHzh@?{sTTyoj6rl!~Mqt_X9LrmZ9M;!J@ zx6ULGLDzP|AFqh(T_}oP#3F#l^@-S+o^d?puaK~I?|OtY*i@8n85EYU6qks(1|T1% zl9+Ehu=Q^Z!dGEaQNH&>Vfh-s$Kx~kFx+Ck2Z1f$!xD#`6Xp9`ge+ezPRv+7^5GIj z%*XR0%eNn4D~zMKwF34m8)d)ypZ%wHzk!O&tfB0fX_#++md^Rd;P0{7ax6eOxaMIw zSRTf4Um5V#ApA7+Dq1i6#-ZhV34B|jBOkAuDBsn>S1kmiahzlusn8B4(TBuN`^y0A zc1s=qaFDGV?Nr$G?oE$qIxKJi4cIKmk?Itd&7{SG$1r+2c1pF(&F@S7z34+!%b#90!47U8MD(Z!PIX zJ(&Y3D?R^T11b3b_J?v!_K;OuGV z*A>e>w+a5KcLNuD``9GmeZMI44@Nwh4$JN8?tN3EgHOb{g5{pkF;(_eyFQOBfj7y2 zH!+SEtmixQ_C)dj$)eJ8;yebPed6NM63=)p@0+W*19#22_6gIWs;VbP2frSth2oyH zufUwQA464}e)z%d>7C;SR^2|~#uSM6iq^-77gV1UYn{rdmj8Bfjc=z)ScgP@!sFDIO7J!-PywTpfrqIQd~M>$?5lut4%Nd$Ovfe zNz;A`?5EV8UpMmcbhIZm@UDupBmd&)iaS!xaA#EVdwzXSxWl%Pjtz`~ZRptiQi5y%b+~7KQ^mFZ#Slscy8_AbbKXMYRP?e*wM%+1i`viPR@w7!LSN}H` z4>a69ngN*HKH6;u*;d#BOghb zI(zPHH$&mI-^1aX7yWD`d(QMT428Sb)$5n$>Ejm2&LR&_#y2d}H;=n{^35}Ex|L%_ zoBrJ5T`wR3I>W9P9!Y1lkK+JbaYqqv+vhxvk!+?=l+E^(>B``j(A;CEi~ zc{hY`^Kt>o`h34kBB5Gvr2vB9$KP^;1+ z%ysxx$rI(zD;@n-7ENzcLpKM0A z%E|xG|IK9cj|-OVmpS9&;0rv)$2ku&X6Hrq`}>pfeycD03}5!L*Cy|+$>p|rzlP<0 zF`?W`Qm)CDvDgzYky7K>GMxE)_;pUpxW7rCy06IQ{m99G>b$QU>q`D1SMm>r?LEk` z=DE|K9PxvZwx^@N`AI04-P|#n#<>-b8O8PYB`NDeTmy04zt%p?!T?+^16Kg2gAH#c>)ZR(%OU^aRh=API7 zQ6pZRr|2Fh8BX-djD|IyS79j{4)+-sn~e{{nx0ovDMRhm58Y4k$>Mapl1ov&+UZ{X z|KA#B`=neA`8H9^dQr@}QEc@#E!$0PtiBM=6tFL(xBToAn%D7STNaC_6yRk4(Y&mU zO>42OpFitSd5}M4J-Ga)x@_GegZxn?d~^^O3?u3%V`JO0k50kHABZZjxtSGv>Q(e{ zqf?<^TJ9-HHWxup8}5~V0Wj}KBR_vNW<1kgj*Wer`VH79)D!c@RqA=(N=eF#{f%7Q zvz}?Mb7+!1pVXl}_mm_X=1Uv7aW>Irx!7<|N#fzyB#+MFNj8(jhIa>2ClH=)bv4rt$r@z@tR3)^(s1d)kDEF+-qL*fVE$d zlaiEn3G__My{2W`X})WLDM@M1hMsA;KNnjCwzpxUB-!&9b=q@JNwPT^dfISLNwVP+ z8?@n`l4Mg3J#DzBB-yZ>wBeqTWbEaLflq7$KWAkeHJe*_e|3(|%I^qAcdwXzJn~pw|4FIL19YOfk zAbeX8*0rx!r`?mOS(9|U-qZL`WFvvn(Iq-CI~+pg#RT7{~!qSPQt9DqeIyMP&)c?5I!7)e-ecM zJqZ6t5Pl&D9|^)g55m6)!oLi{zYfAL2I1cX;g^E&Z-emfgYbU`;Xednw{VYj_+}~> z^0DB(BSCm%5aykfSxHBugK%*W=AD*VNk=CI;ZuSz@5IaszNs37%Y*RvApE)@JRu05 z7KF!UGXom>JuN(6&q_MJKH_z0cm8bSU!M&CrQIv5va0`m-{^fyw(zb#<^^G1FUv~W zz2Ve`7iR-NX?HG~Ri)iIv<+XH4LEx}5A^CZUl?a3?XJsZ6=`>E&W81z)$7vkRbw{( z?b!fO+Fj$xs?t$YHsIo$gK$d_ZVSTK2H}n%d|eRU5QMvf@H>KVUl86Hgs%_6n}hJX zgYaJj;r9mN8-norgYXA}@J&HDXE>w2xpvM<{(F>0WFvvn?iyoOmH&dus6&;o^&kV|N$8Y#vEWX=8g?aKl4HTdMr=yD{?CbBeRIh|tPi4_( zqFaLW{}zP*L&D>o{oT>8B>Zs~z9)KF!WX;nXWjb_0Ns_mvgp2u&njobpNl3-co~#s z(dVP{a>5Trd~TV-v&=HQ5|Pg?Q+)VK5x@69>Bm+UeK~58Fm){RdxG%Y5?<}>zZ&hA z@LCssB>KC+ex#Yg$X6_39+}Fb{n2Sb{8>SGwS;+PwJdrp>ImX{Bz&@qKM;LD!aReo zh#rsbl`yY%mPOx+zK|3Do#@$|`0qwP$%%g|;(OC6KK%_$c+gocN;Df91rF zOr_-z<^4M$HBG|azv9%aocPkz+jHViNnM*0KQ{H3Iq_I;H_6kxb@(!TV{>nRM}J3m zm%IYEs+!-X>gd8-(7Ia8`|YZdjH~eka`$x`d+^S*?q0kOuW4Ox_lBmf<_&EN8!u_m zd=kEIpYyf)!k@5jY3}UoZi#q{OzXxCJxVxdh0m_8wQcRjYZo8}@8P4-I=ooC9nN?3 zH??epPa8BvqW4u*#*z-NUmvpcXzfIWziXaUF;z8=I!^AYBiBQd748k{Yio*)-3yB2 zP}91Ou2%f(?duOBe6rr=u4~&uG81lX%XI}+lJjZzME7Thse%IdXx4634LVUnb60C; z+d|&dR5hosi3R1oO-=1y@4V^mY3uU+BQDwyt>aP%1zKlCbyL+WQak;I?$)-Z{>H{- zE1->CSkbYe2abTa>w4dqG=352WAN*VZaGjJ0%c z?DEd}8_3u-v=R+rSF3A^g^ktjg@$?epmA)j>urt*~60!ReE#HBKPSU=t*^L!3a`!6ryuSgIh_}z&^BJIVW`f|NqI} zoQvsubzOZ*zjEc3I&t+Tb>iAf#*1sOXMJ0^_WBo(GuY+ynOCcB?KtItfH>d&)nn(| z4?T9i6>6_Dyp8Lhav9Z?SM+)1{gL7PvB$2wl2-<*obn#_HvFFw8;6He4?p#3oe$Rk zjMopF=lKFWlaG_ljr9Jc%~mG&(Q)r=N%`{uL|%~A1BX?1$bs1 zC(myR@YEhB&r1b(E;vq}-xc8DEvzCrb9kY-_hoOKH!kKWOK>bG#3Mf==J6~zP9FLB zF^^~Qaq`H|mU%q9$R{$a`WfL5RCzq|vk|BJ@)dra#d(syJ{Du25quW*Q;1@WBFdfGtIgFRg=hn~`iP4(*y-asri zOhZh5&f&Blk3GvyJ$1w-(g#i#J?D60{hmSv_2R>9gE>^FXP)N^UVwdrV7jqU@HXt< zLkuPJBrf?1{z05?S7dR?S3TzSNWNQ~P`k3I;7#2L&;1h{)jgIlIPGCb$;*v-458}!K8&2=8eqh7$5^MW1j{GbmvHDpf zdX|g0%|H9q@W*bG65=ZUvtPRk>hS55P>zX}TO0 zvJm@vV$m-VJ%24;YV-`NjT>u7OTMk5$IksiNKWSI+6$a)i@f%dv}YoYoCxN$R~7Y8 z_Fz9pa6R_)mHMUFvpR^|u)mfVJgiIN5;-CXPtmL#@z<@8+-#XDv$nfQ%={H zpr`-*ZG(Ea?XdQF#!=5YA=a{=CHivgiA%nVe~|OAX697 z*l5pkbPDdr{zkzc#{PD}d$7Ng7@Vw6Vy#a%#@9drVHwKT`1&L+c@qC1u5UMc?8*hq z`kaQX90hzM_Lan9*^mi>wuX|^$aU^{Xsa{X3UHEyE=!S zI%2JJ`azrN*iSKdhTsP5X9=cnZzcv0%Sx9%;$v zj*q}B`+VwQ&+-!I_|O6c#Q7lD`G5+J>l}LeVC$UysT_LR5~~lc{$UvV037=O`$QjF zK>%?+2zEY0ebq7*B_v#ZC-ys+Smu+*az5$K44mj z$~lokh)dEA`eRCa7OS4oEKUO$>WfyTiH$s}>vjQX@78NoSix*kf%h1kkZ^WSw?KrDJ!M(E=*LLauTD?Azen& zG99swJC<4b-LYHpS|a*Y*e@prKii!+$It7afGomRe!8zu)@ixuouAOhenKDm$$F$c zZHcwcGt?vP#n?|Fh7ElnE+GkIIyTMMwF_+6&cr4EihmH-F5;UTQ?MzA-p%1ZbSC~- z37a(tuExf^=nHX9c{`ziIG=&(hMQM`>Hj2b<-n!bbIv5DxOzZmi0c9R#6Ag|vtjSb z3mf|B%KIa-_tOSWG<^ zj1c0I!w&kjQ&$!%=P0Pkd7y*1dytRAEIm*_Tv;*>`t`{>Jf4MJxnS2ulT8~zPoK%F zKD)Mtp0;^&Ceo5`IyQ3BXX29Q@ekta2R04Bu5ZAG+{8IP_d)@2KEs}p##YWn1jP9) z*!g^>@frF=pP^6m8EIpmVH5lOg3rtO44c?z*d+Sg@9mw>u%|emH+t-R7VLbUW_*S| z(P!ureMVaHxq608?DG+ym-87mvCptc^!c6M-uVoBiu3t;kC{igVCOS3jK?qZi9SQ0 z=rhvBKEo#V`R6__=QC_#pJ9{e^CoZae1<*6`MlX<=d)nv^LfT+=o5X0KGA2SjeUkq z?DJ8dm-87mvCptc^!Z)h-uVoBiu3v19@k-4F4*~ufzJ7@O!V}bSjQmeHQLjbSm%u? z)FUnVDv4o3pNUI;g?|t?|HEb}@FHxqq0huR2Ho7X1q$l8!JguL<^mq#d=~6{Mn%Ow zL!am~^oc$rZR|5_VxM31c{!h96Z;ICM4#W|?VZnTIEeH4y&h9lF4*~8Yx)NCiG2fl z+Ma<;>v=MHkd}PYiD5&ZiA#Qie-PI-uVoBiu3vX9y^}}JD<^j@w@?j zqR-GL`i!)(&#;Mo{+-Xu`3#%bXV@hAyv^G?pJ7i)V=MoFgDwxn&gXf?XV@hA41J={ zNE`bMo7m@?zLYzx3GoEZF&sgHH|I0# zRZ=TFV&18h9y5LFa*rnvU*U0v_-!6fC0^xmCGnLWa~e&p_PCz-?H<#=)Kwlg5?}2x zDN@&XyoR{R<91>yAU)Vp%?`S2u&K2kZ>7G))>mUIB zu%@N(iNTbtW5*D0^m;z2mwKni8Dgx>D12fhwaH^X{gK-2F~9GSdY8xb#P9aFfmqfR zjl?*PQ&thb$Ky4`I95{HiMKi!^$_3SF`tu2$uVdv@%z1gJMlJ;cMxM?6L#Mv_G>7v_J14mj1kpcn$tR_F&Wg{1CD9 z=l#UepAQmCe}0Bo`txC8>CdiTNq>Hs`gZ(-jAorkf9CJ2+MhGT(x3T6k@n|WV(HHd zh^0R_5=(!+inzz~w-ZZ$?kAT1?D~WB=K<=aKf694{rN8Hr9ZoNm;U@P^{hyUYisGx zPg5`b`4F-6=Oe_@pI;)D{_MUxDE--ecToEC#3I;ib@cALGuofscL$|E*V9J&^HO3q zCd7SrQ2Mj`?x6H%_uWD1&s%6O{n>qYQ2Mj`?x6JN-L#SZyq8$|v-|F#^k?_oLFv!# zyMrhj8-(Y_GN%eW(9USTH-FF8CyYCJPcHbQw z`|hA% z_uWCk{HBv~))SxP^IB@~DuY{zPxdxF25&KVyTP{^yxZWt2JbWY0P!iF|0#p{jW5+d zPdvukyl5~l6so?|;0Xp#F}TuTKCh%{8w_4)@EU_ViN|^$HW|Fl;2p$e-e#Aa=&a2cgC`Q7?$b^+xW?dm zgO?h-ig=<=+iGx+!CMU8PW*arf1AO(4c<%q25+;^-~$FfMV#?A&l&u@!7ma|@;1Dw zLUF0V6No2!n<)lY8a$VHinnPnc%{K>h|lykod$0*cpLFq-e!lvyA0k#Jk8rYWbl52 z4-%j4ZJsgsu)#-(r+b^14IYiTR`tAJCUvg2$rwD{;96q2Hn_mxMuV>+uJkm zuJbna1}`;u74Ze$rq$pcgSQaR^)}lLzRlp>#BcUCdkx-a@B!ktc$=pTe$L?MiRXEn z7Y*jgvFb~S=X;w822U}#l6Zl)nQL%^!7GUudYd%{cN)Bjc(J$HX7CP!cM&&un>_|U zWbl6Ci@nW3gP$?@F!3ec=BU9h8$24v@YJQ=rrh9+!PAMCd7D~;7Z}_~e3`eoin!6^ zcH*~s+)upRWByOQ(POw1V;(A0&)8H2|NCnhik*$<8JBt!|BH=aXCs(#sj2)gHiDgv zV8*4+;eW9a>}&)xE;WPy#YV8R5zIJ#?~3BeCD_>rW?ZU<|HVeIvk}a=)Exd78^O*- zFym6^^S{^#b~b_;m%5Pu#YV8R5zM$$J^zbMy@T#|0@YKKy2$HYxdb~N!Omupu@UTS z1Us80#zwHS5$tT18XLjRM(|+Yz`nM(dt;A$bh*<#0NFXCY4y^oT0Y_Fp6>1HlSgIO zl0GXYUyoj?$18J>HXA)Ll;(6lD!`sP5nV?M!2W9b6ui3|9R~}ZL$vz4`!B-z0W6n z%(@VXvn$Bb8a_{5h{hWx@FYD6oloK(T+Ubf$C&f=*@v17#qkm6{J0kXz;k|tKK`5> zaX3#`@Y&tnv-UHD2X6A9|LXmuYIUxh{xN?5Vyr-6PO`2BEVJ}8a z;hE)*_5PXVToZ|J!V}E75hiW>5NYugZNapCL!{*cwFMLR50RM9))q|MF+^fMW?L}v z`XLhYiQ9sSHw}@P58oC{ym^Skd=57;F}k+4a^p&T&K`ZEd4^8sY-aa#Z-J&_Vrk~W zi3_ze6H7Z6PF%2|nOYjUaO#3B&D7G;g;N)7YNnQ^E}XhxTQjw^b>Y+n8=I-6u?wem zt=;cthSui(=4i&+KAnZAeZ_}qO+1`qwA#Lc19Y79_>aymDZ8yXG{?F^$K@mgdr|FmrUQbUV{{x>_yC<_5@u`<&9Py4Tn-|# z2jw^-=ZG9@a}UQkYI9hP_2~WPK%Ap4Y@R&?=Oid_{EcmL4!+qg;MF|r7U%+5gRmy^ z4$5&}`A1|IC2uqu{B0tB$`<>ANA5T));JH_LuHVC{YY{K;o&_e1J3zFWsrSeNpc3^ z8XzYFcU%}MhwKYZl5+?b3OPBrW5-ZAWZ#IAoI|*p$jQMSUxvyd`wErh9Kt0>P7dxE zG*k}RcdjJo5Uxvda&X6~p>oK+q$N3raPg9pLwqd5QOljynbE-Mz`k3DZyw3df`?35 z$Yu|jaUPDNaCeQfFzox;yldTX_E8ETYBZ>G1$0>^DytTNzNm0ftHiUU?U^W!@L0}Igh+$TuvT?jg2@D z^Uj>)Jn|NMIeGYXy+1lNtzKPK!&OT52(+-OuBoYU`NEYeuWVX$`Lc^vF1c)36UGSE zgKiNx)4$cszl{t_M6Y+lEaCNb8a=F+qs`y}AD%=rHubl4^)=6M@6PgN#IX~n7&255 z=;`g&D@hVc80_xAWnSSFkM&_B2@ht&ND>~NhLI#Z-V7s2cmNqjlJJNyj3nU{Ka3>d zoLx9c+?C}8XW2=37-{lm)nTN`n2C=)#*u6N2-9yIiH-p$6Fm^8uV)wMM``sXRhm9TYF&iOU*lzS)+wBj7 z*zvYiwTplY@$tSjwd3u%h3uvnJ94WXe}YDkw}d#UL146C?r2BhPfo=3*eHka`$;MG z?5FI%jAQs(Y?g0s0lu}8rXG9B5%BRh4)XCf59RwPu;p8TKsj_O>feWOs}@28c} zk&m}~C?DI?@~uKZIS>`&zY|`eUC{zDonXO$gIYg?5yNfbTZ&H9$}QUXQ)1{?4`dP_?~`PjdTf*z4c{b$mG8^2!(Ys|8-XOg zhoHB7rT8sf>u<8*`=@|!55gJ5tB`~8{eW)@_|`yQ4?Ta1RsW)*T>p3vXOe%v5BRnj z|2Srq?~MW9Q%ILVyo&mFI_!w+C1RKHZyI#Uw=m#4TEM^hfbV7FAAd4dzN-R0-h-Od z|K1kxmBY~n@UZ^QHGKU6AMah|{HLPj?GE^^s?W{`yoE*m+Y#_(3h;d};2SV}{ApYH z-2JKu>-eZFz;}1R_pssPZ7<6A4cMUyVm{V;QhE0Wd`Ao)Z;?^H9|nAl1^Au~_$JQF z)*pX@SH9l`d}|~fOq|e;@}B|UQt;_~%G+v`kMDr8<>h_E%0V8*r@)T5o=V6n!*>C~ z%E$NbTfTPiO>rswKjk|+;A;inN|>A&r`vt_vV1Fr+|NT0bi@}ugUPad*%_=<7IyV|5gNi zJ;uLg!}spMzwHJ5duPD6*Z9|B`2J78H&DR89Rc4y<6oQMbNBF@^6oC+--7|)i^e~m zV~xPZ@%#P2zq<@Udc9wa_veA@rsZTLo=klX(z7VwYHGLgF;8>QX&_ZJ8= zj{Ii_e3gh`oQmQ%1$=iI|K1B@<#W%GAdKQTsX;_i{k@44H;M4Pp55ZXZ&JXzZAmT#m5BM6u$MZH7a!@`S@I3>*UC@*7Hte;$?s*`Dwcl?8 zAFr#aDBsrtzJ4tJwf=amQTcun_{V4R%@(Ju2$99_+@QnuXnb4~!AD?To ze7AuQRqgmbiM{fz3;6hKV3L2$0pD}RzfT#y8v?$1@Ub0K)W0nOA3xRFj@sfFW}?&OX8aw@YOeF z{rjBZdt1Oa9rd&f@hV#0 z!IzQ#_hrN@-**GP9)wpr2LDg_z7_CI#6^QWFk%1us^R-pz;_VgwF!Jb3-}Iz@2K!S zV)#xd$(_e55ynuDh5o^X=xnjWbm4^0{qeeiik9O|&=c27#6v4l*9?PXKlY5{xLgqM zJ&kY~^eW2tmVj?3E`De~cnrqMcTK>@X9Z7IGO=Uu%7E{F!*@XJ=-+1LD`G0VzXjom z9=iYP-#uz4aeOy8hI%Y&cUO?_6UbMO``?7Mmg8FiUn}^M)~9@4l4qp?{^K~1G^$$LArF%5h`B zchHpM?+xE4l~2mi1HPnkJgIg_OBpCojwgbA51VrQBhqO(eiraOQ=lBr2Yg#sW!vK! z!*@*iq#Q@UcRC#vVZM~}ptt>CGzMi-zd9Rswjb<7zS@`hnqVRz4|5JNS~y@nN-Np&;7|l!NVL%dr&sYB>%eotESC0pC*v%CR@#d)}1e z$A<6g$|vPG48Ej(^=q|5S|_I@AJ2at%J(Ma)Aj&gQaLVHJI9XpC{T{ZAm4{fIbJaNZVdRIE>Mo1fUoiG*>W5) zd^ahdl;a5aSY8#amwjp{5hJj;PZ}Q&2KlxlUu}n`;7b}GPX~M>uF96< zmxk{J<&$!>f-k8YXP|txA8aX5j`6Uw{a_;U)pERO@|_#-JyD<>a{|77rX0U9e3vSp zl;gPq<#>Sa->lYwte>%D90ZHzRWe*a*#mzPE|fB$H4;S zSfqBY6j)0ZD91e5*?v`ve6<{Dlkc?wUnLfuN#kQ}!1uH%$4JAsS^1j~E_RxFBu!M-t3-~hQlH23#fN$=aY&lLb<(Q{@QjQw%CACMd+QA3P zQrIQ6$A%!^m20x);JtF%pFa}t?JQ7^4+VTj!KdxPdmokWGr}jui1vbSHXRkA9p#^3 zhf4*24Peyx&d>Uu%E`S~TK_!(C=6j}x?my$WaXjD>PAtV3 zY_)O7+c0>A@M+Y1*c~E)h{CtRj{ek(espsbJ%viDhrvW_jAQv*0=|mzQM46n8WrWc zCg6Lf#oLkZ4TkR>$|ntS=VX8VD&*@_KCxT%j_h@=jN!X0;Cs9P-=_k;Erzec@cmQ3 z_d)@_?+1Ll4WHhF$@(isdxAcSq#P$tNiOe5*tzx)y90*rOyl2$0bg|izS@BAdBZo= z@bv_IR}|p8F5oNe&9=wchVRn>-@6L%{dK@sY4~`3ly$-S`^SLquM6;fFW_5g_+}Ws z6EPkTjN9X}0(>K2M<42?JvJG>O2cr|GLg|?wON^Nr>(K_I-cv z@4bIHIoG+L`&{QfAJ2I{=Q$3(V+J4J)u!)kzppy@ZtRDz+rf9v;G1gj{nWu%-Vfg! z4!)$dvGI~`@Lhq693-Rt@u`0Jl3-`{N4CK?-QX*9@a^u0Z-#@f%;4j@>C%4d9DLvD zhp)-OhYyKF@5_JO;A36&kYcT^bKtAQIYS{f{1ehF7fF7KE_y5iw2E=i+GQL7$U{j* z@F-;e+lg`?hc6;xchl5xz?7UR1vyg-LR0b!0)d=RC}jMfIyDce-270!%21j7>5}=S zE|)N|zwWmCOc$~=3jj{!sdN_ZXI7}~JP(+MP>!$&VJMuHfaE2@Z3(Op#EG3cNlQFX zKH4~CYN6HcPV35Vz1X1^{<-!7&I<<6`P_Z%HdxkXH~!%8Mum zhK{wMxIIVO-KnSF{Y&DnhrFF|$epr3Y#UEbPGlcu;&jku$8<;gV`qBvFGGHv@V00E z=swv>-OO~NZysINoH)hwsRJB3upSPb-?=m#bf-L>U^_GFPb?^V^ilWILu}3DYPverF~4}_)ul}k~VwDzy1|hALCQIJ6)SS zh9l^keL;_1AKlkSJ+bze_I}0Fheq}3D+xzE(Y%wBmF|+f=z_mqX3v^6J&?7$dCl6j zEo;^^PF^@WP`kEiayS$YHRntW5k zzhrUAviWltmy{RIUowNQ|gF@-k7 z!ikHcsGnnjg>xb>B_1d3$jMmh$a?VzNPp=Yw-Zl7pv2?B4OL~wm=ez>6?$?pro^+s ziK?<;O!;eV22++@LcIT;K3Dy0jjTRqo@iUxYL6P@F%ys4r_40>tC)Dy3VdeTK3fxw zr_WsxmT%r&V0yZks@S96(u}D*YIQC%9f>7?JZkl*n95@n#}aCLsUtndkv8utk&pcv z6Av_|c%sKTTkBC{GiKrGb2o*2JmZduN39-arez+tbsn|ay18A(m~0;&+X&?8^E8L) zs~y{~aim8%(y|ZQYLA*DVkVyG946bjZ^gu8abJyzN9})RTILp8=jrqI0{vYOGY0bX zd3%NFGRO9EwRcm=BV8KCx6CwlIty0`w%F-OYHb>7W*}tZF5(V*vpO23VZ1-1(~Nk8 z|Cu8l&{gKqi}o{hnn$WM>>qa+O~U+DI?ba_8jeH%;Mo2{oz79)!`2^ldb~>KSyPQ6 zNIw21jWQD<4f_*+Lny-SkLfg9It}~R>yGV1^$=z|rD1;y8AF=+`5O%iXV)~e(gw%& zujn*q%{1(fKXz<)B`~-BK1Z4rvBv8(b>uJ7X^!MH?5|v#L4@1Cq|=-!)3E=()+b$R zrEvP!Liw>U%2hhrQ)#4XlLU`jmoN;TN+v#)~sGowYq9WZF5doeOhDn+Lo%- z%WE%dtiIExKe$^`ws6t1OB$i1-zpd981z%%%bcp!HI2248dfzm))t4<#+t@5Ry2M! zbMp9k7JewVMtzZ~1m*Yr{_eb3L(1oM3+`*i*PHm2-je!(>@TTEJ`0QXkimS3WlkR3 za3H@fbt@mA1g`1FtC;nrMTO{9Y=|uiFSC$ptXz7^w>go~Kxl9r2QisPdF-9EJXDh_UOOxO$5=J-_?+e=98Ov~`ezt|WO!kj$C zxUgy!u0E?Ui0k{M39CKS`BA=-SZ#ze99~}4xV&UF_T}2Ob5|SOG22U>tf{SDx1xC6 zs-{bwEQqu1Qi8gM#>Pc0_?BQvc}@<$vV`5T1>c623W<9KmovPCy59;7R3Cm|n{9A^ zNm*FAv!z&YPAVIHDrsV6!viNo=|5p(b(OB|l}(|oS2nW@Tw-HoGuy`e@0x31-i*{D z>kTj|-|<(t%r@YS6F-jkJdW|q&(DJ%gjYV)Q>Scj43FCA`>x6c`lt<#!%-W3*{p1! zrwtF&etkN~dJ(f8#9rOD%uhXa#9rObiiamW5Mr-xb6yqsp(hWqSGWHd>S36RIEz@H zcJk_3^dYThUY-?GPg}(a%#0-N#G+?2 zQ6KdU_Ow;L0jurWhQ4uFc=cEvuk{?W#NsoH;W{d8`v9>%l~+DPuXI|^ausJG0EBk} z{3x9LquQ1Y08wqL^;t;!p^y3uJ#7)Gyxh*=MH~7|?45;w5Y^6bcmgop^0Pol0DM_XagYr2508#r6^wjZ6$se%!iM_M&55lgM zylR|~3_|RktDw4y^Ru!L3?s`sPeGfX4Gv*h!l}xo!w{ukXk+H}(;0~3DYG%_Bl8%l z8eM;a`=G4F!v2!=U9ihV*TP}HySTGJ0tl`M{y|v0tgXU!ku_AZi8oMn zV}|3;HN)2PzpQJe{M7T0@=eb(${%((B!J+e0;0;*`@SlR0|BD=^*$9r+Qmvh<{-$L zOl8D+94;l+W2TZgfPavB1eflwCSu)3>xp&0v=QsR=p@$d4;ZbNYI9vLx-RQ)sW#O0 zQvP!zgiRxBTq&P*y%tli>s3jt>(xlC_ebTMuGdEDb-lI{2k;NF2SMt!pIF!HFtM)J zF=Ab>Q^dMnZxXxk4{{Dc@C5^ZXkfmlBsM(exZKzX2^g5q%038 z+as92lM>uw;5GyE`%10^JMT^dKW^ZI#6xVG=M8+)z;6(9$Az3R@OcA&VBiGQRqRs? zJleon#N1gSY8^_ABZgkBL#g#@9ZHRPtuA?+4BSebWOJ%@C^c5=P-@(5*r@ONXuVp8 zl9M{*McQc0_i6<5J1K(II+WT*twX6XPYA@uN6d)|l40Pn2IhSNv6*4uImDc#A&U)M zY2Zc!uQ%{U18+6(9%Am4ko^WeY~W)CK4suH4SdeP7l?Tx1o_awNf>vc_Zv81V6_gV z&a2j;cNvSt5?{$d2jX1@&QR`4@tk$8__;K3s#s);KL#gre zhW;cm4~CF841C7G+$QT64r2WtS?i(SEBiQiPNEA$^q1+9TPT;!5xbXSe}Oe#er^uNn?lq=GwNH` zgP%k$pT{|k3|N3MhYV~Nn?MG%`zW)=fJFUG9Rp_i2=m6kJpE1@17{oTj4?1v{OMxA zJaOiV0qrk0Q4E+l&MYyo{bi6J3i!+&0L^O_E~AuXIvsSrerO9*v;0Fk<8Sws`)@?^q((PMHrr+L4c!Cc^hg2VV=e#pA1h9rHvGC`%1K zUX}>ob_ZV@w#BRO=Nx=B1|Kg0gzsk#zD{h@r|m$t9pj%m_?o~c?Z-<5;mhDP8`Apn zReirDo`1t(XV$mV@Q>qH_^KRy-Pjhd{qA(|?J)RwpG^36I`|Is!?)eR*KP3e7K`wG z-@$hT+v3&tgoE#Z!N*%O!sq2R9n#W%$MiNtN@z#nOR&TdCLl))KHjPlzK=WjUew!| zha!9h4!#!+KF%q^_mG3{q`_hG-S6Og)!^eTB;ixnzer1cPxZt1&knxR1|M%d3Evd} zX8XO`4)1b*MOmut;HHxP?Cypg$H(RD)b%#(q+Q6T zFOL;J{i7@gAdWBrc^~x{i+C}@cm!_a{_+n1X1lx#T|B?e_x*-vRKk|3!rFB?n&@_@w>vU@ZQnW8i@z zHvW*9DP-D?$yC@ePlO4`N${;lO#h}L2;Tw+pWkgi&wz;%@o$cUFM`QY{L6=>@NIYS z%>dtI&BaLgKIhj>r9DE=4!}qTazEcKYslhi1ldjo* zDVTuc)ps21=tBg7a?apmzleYLYCbpoqVOIw`(K21lt$sxb{~Ro5A^Kcn-PTX^O}!y z1f>#u<87$^(|3k1!wyxBN(b!nqbb{lN%=OQZ2AuDwn_pqxhT$W1MbAh!<*34zl8|m z-%;%!R7w_N!+EJBG{Sd8>Z|RV@JxwzkOn#QjvYgVN zPW-&wcHt9yNi&{WXa$eY+3!AZb7%6-kzM(_GBA7Xa(5MM9tN;EtuyHD+#KA12ZBjf z$M1SA{kyE_Z|L&R9(eY^_TUR2X1UL_r%viTmX$hb%!J`r1&<%xcf8onSNi8(Yu^hW z+6fR$?Xl*xr@uec=bqSesJr*uso!>8>`6J>6Y^a#ze|4NR%ZsjAI=pMh#1Tt}-|j|^w28x)dQJ_Q z=*b#0DmZaWxhpNJ=Z@gSp3<|ubNr=0*L88Z>)X?RpXzf5tMbH|?(Seu%AYQt?LPJ& zXW>)!(}{MO6(g_8@|1VC74@Xtu{b;7m4rjx-R(Uo2amLseO3Ra@RfwJZwB`DG}#$o z(bKfAClpJC_VuL1QYrg-%3`UqsHJZRbH;2JxNl1<^?mrrp?y6Ww*Be1wz*Q;-5Hy9 zjojuM-tHc`so?5;?rWav+%(beOTr2Qz9d|#`I1h!FmENHD}5QK^0WLW&i9@^`?{*% zTd!a2?mg>z_Vrhij=P>YrgN=@8%#{q~p2X`t;Io>9*>z)bH$$YrDIW zyH@%<;p%Ho%(vvXltsrE`yTGv?n`V)@aE1d?)b15U0s~)^A!9x+}&G{T7a$|eYR(Y z?~3Eyu2+u+B9CjbiY-H>zh@>Rdvb&7@3GR~)w8aycI8#i%BT(w?@BC4N7Uef-SBYr z@akaNsq}DlT6@qxsKjm=vNiWW8gCkncMRHSo{zz^hTs65R=arT+U153I~e&L7zoE=WVG7Zi3any7x`XidB|tI8XkSY`KLBKD=p zL)7mSgTZUPLEkmLq`>BfCns_L*lRUB8Va>UA}!UfvUbW=(JCwlPv%l&B`@1rhzaaxL>L0VH?u3%MaQI)^ED!saD zI9S6~X-$EaVATlheuWcn4QHkX$E0|}!R}8_JLH<_J~$>d6g+k&m^wXpFq|6996sS$ zcj7(PDmQw%DrJEun3=kCoBZl@W^%CG)!c1GnjdazYH80LzG=EU*lh&@Efa?32lxK{ zv~YO+l-A=DuJ%TEkcyYnL9tK9P{pM5eZgUNn@roiH<8EI^!Kh<@$AqCJ?e+H)`N*n zb;p94Y1=YK?B3Yc*0LFuZ_iBMmYK5q-Pbey^Rth-qvWHC(PkAZlYM&TK!YW39(ntu z&Re^ZzLwE>>*i!=Mt<$q&cahkUn@LS*OYr~^as=O1D#V^UznDWEY+&morq@H_ks+~ zWF%7_$VL4t-uVq$qCMP`*LA4%cjdDzZ*Wv@>4&`*8fxNeMTPm{%n{+jf?#*=M3?XH z&-Uce!>*%=sPg`8b}c6-cO+Pu>Q2h!WbB?uqt58w=KMn6mF1af)tUZ1&yHG%z4OeO zmbVj8!6Ey{*m?7Z|2iS@gI)}>x8`t=EiUk%;4F?|=9#NU!ihih+U)q>L3#{BH59C= zzp%=yQbGq?Fot^`^hWnbPQ7m@VCr?-rBwV!V%U`(u1e+9T9uZ+cg6NQe4bUF^32rR zo?XleWMitoJTqnGFYV3ydu;ww|52XmzoTwc zE=FVGfAsD({DTJ6)xm4Wr@KqDE$rVt4|;A-t?uq^h?UfJ)DzwH_MuPS8ipTUC$a|k z$*(Sh`a6>BYOMIY8#VEHsxwnpJbUl-+R94Xd4tk$-Z$Fk{gStP&-SfbTj1}OEp5+l zKiJl?X>&GGn?{a6zo^2HWnZSxuF>fSRAo-Q!=?{brF6J0IH1Na;$UV951VX%Y%8xy zReRxZ9{wKmaHynC>{GdYnfeehIl1CbNjS2FU6ZlbvI`~;negmg1N1;NYuE0{$vKua zZDda3aLeqCRA+CTe=61+C;lC?lFGO3>est_BQFLHWe$&W+T#>+R*!`mU{7lgUR#%O zJ9ep_`5BvbjQI7?w-a9(a?~TkfbF$=rYd~1R8UP>VsQFTy7qq=iY8T?r2kag?X^b+ zpUCnR`mEJ>JH4iMeRhBkOZgLo?7%&>_h$!aP=+(%>;T`xSC`K>)vsAqd(-m!>Z=;= zZ@6hiLrY^-^-XwXJ~zz&lN)O4Zo+R(n%1nwg1T#O;@NavW7XRFo7OfjS1J6+Tb)}k zZ)#${Me930!`-o!KWQ&yl{2H2^Q-xIepl$(Ky++&@Pf%<@k)Ye(cf4b=I&^-P=Mdv z@iD8jFn#9`XWOPvx~{XZJuAKI& zl)87X@?BMmbA+odR;84>IE`HFZj*ANm8inHkh|TbORS3ItLqC7jDI~d#q48ybH^=K z#mEuZTMH9&!BdUh6$hz{J$9?`C?#Fak`1##*Jb zka>UMo-MjUv0<@6IiCL3m7Uw*Iyd7eAY&#vKw-6M_uTf(lxDeMa8jwX!1sS1R5bT3?u+IJA1aXMCdT{5x^#6>XN5{P|w>NtlJB*yUo3|2os~yzp@J+^y^8IsT46_F5GQSIoIJ{jk^PFDkT(TvmB^?`{6{$dbY{ zOH%JBFCRBz_L8Jg#n^_!iQ2fsT{_P4UH@y>+n!gh@_D7d79>}!9M_q0UyUMZ(4J+|yC4!d)tvK0>`w7XKbo&1h( z)T-pI_dMKw@<`j)AMWl5?8#7s#&IWcDE1cJyBt4qBrxZ#sfC<3)FgRRFqm{8sB-wO zc;%|t{(wf=G;&D#^#AU_uZh!2f8Xm%HYs?m6rFqOGH$(01r9vG+TU2z-8(mRZgk4! zaZ##xIyr0a#6%pQf~kJQ(NP9pv)a3kM~8D(+KE5+^8B&TI_klBb^CHpbpPR~wEe7spCpx_~>A|@SG(e(2p+g)ip6SnNym9VpCcjxAw zZQT!U`u0mpM|AwAx6i0Yx$Pd;=8dC$k39SG<2FTmFzsm4o|D@=R(ldIe6GT_f0oNd zPGFs*O8=mI-fNYQNhm7`q(?i=MB_R6rf?{9BE+1B>O?T`65kT>oADtb$*X#8Pobf`>ce{_RX`p&dvLg&v!II`s37FvA$8KYRrVO zj)T;)+UDkEEdd;xrcYmFAC9I^kN&_fYhA=8zN&dr zcEC=2YE45868uHnvKAa3|JS}{B6rp#&O*&763dM(`%Y8r3Gis!EP5x`uhTU;c5WAb zi8)(PBo@7t=S_&E5aDMC6zYjZ|8Kxj);UA}D_{!kiKT5XQVF4+nA|Ma4-!6oVLC`c2yKX^ zUK4=1iF!VLWIhId0gytyh_pY)8*OC2q75;Bn8C96M2$i{@ofmS|11K>Gi~-F@QDC% zy!N3z+k`QB&LAv8U^>_Ejab@&UwIRIexXgq*e$^LQ#@q=9P_kWOeG{<9fw0t8^)A) zHhj`Z8+qbL8)9kOBE6mZVg#JPDSQ2crnsCr+J8d5C$YMg5ly zJ+X}8eTJS`^iKkF6M6On@M$Q^{V|mg>WTTb4*AakGp7C>t*8C(40~enhpTB*XiqG9 z7fB%06N^8IhMt&XBZ!b}=#f++USdu&zFHIv=I@W=b@lIV{Q*3 zyof+ynwVpoHm@L1s3(?s{Ro)bssFK#$@4Y>g?bSw_kJjthcSgV#4;Yf3e0At{t1L@ z5y<%hg6QcRIjBEj;FG|Vc;&8uo_QpuO#=ekjXaGA(r%oSDe-td20eKsrVaPIy$Iyt zyg{L!m@)0&L6CjnSHPuOe-kRj?X=4QCNFs!4gG51+o7Y~_kek=CbhYUT; zl*o9|Ored4wC4yY=o4cKZA3@?)l@>_N#F;+56km>2#6JFCh|Oy3#k7bPC24|>`#z6&9U z!1;|rdt$tJr1YOgOrf557y|QlB2cI&W?iW7LZDDDBK^X0Xv3JtO~yQbpwOOJ+Js|_ z5|78;67Ro9joH|i|M_o^NxRx*c%tW2lKw=ja3GIW=t#?cA@(JX?Xw-}IgT{Xi(+!= zx3c(_NlfB>8!NVz{&B3v#1s88maX$xOJf^>JbhL^W18bQCLVmB*A$Q1Ct{jQzm>*u z9Fza=e;aK~tg=8J^%a7c%A>w|V5TR=63U*(h?sc#yroAz9yem*QRmBMdRZ(1?ZGfq{8rgmBS#9bc*K#PhU;N-58!rlgfaa|1d7L(EyC?Tccic2Ap-Jcgfz5LzD`p|`(~ZynR6QE zm#^vcNtK>ualLR6+F!{j71D%|hDFwA=rqr?((rauaQktct^`iQeDq&B z&6zh1^U)1F9fR;llZN@|Zk^^4BaQQs{+*zFXenpP^2XY#=IHmI)?V_JGO;wjw3a^y z&&}pHtZmVsJgcdSebp>#Z+s0+bU6i0Yns+IR<+a?;mdG%u-CA>mY;&k!+p)>b!!_w zRlBSataBGG3N6dY)i$;37p|$PEs1`2Esu}=^5p?xyia$P<2z`1(GPGHRMa-#QdfuX zijiXVeJlAvvDM3)?sv9D*#6nvEzM2!Rjc`FFgh@J_g2-eBB>%@)g#Jr`(qob7^Cl9hx(Z-_yG^S6S>^dUl%)_}RV7_%^t2_DOSH zu6?a#`hmup=4H$4YnR`%tPcHLTO(~LJmH+>aJr@TmgZZUYKNH=dM@KB-bR5pK1mk4=%SQ#Km&3QxZG#AB;q-VG7VT(pdR(i>+5!>y>Ys zNBO4p$~Ubakh9$8R6J!yxwrOHmTAvhQV><{H8xh|YW-NKT-u*31FO30OGj0AZIefv zB{mPcN4{w|gIN0(A=dV+o=dk0RnoTeiFNxkn~Ms_Vg#{SO00SAB-Z6t66pWOpGmM2e#N8pibwM+8;w<7?T?w4<+ggk~_ha}6 z`80yxW8Z<=s4-9T8L00>d_6IDVhFKUx7#>i+O#89<-#Uf?kAvxFk)VoOYDu{AB5wI zc`Fe&YTShQC&VE6PsIOf;4=n($H2eQ_zA?fU(@(kh}rJKNnT=(-768u zKNdP-Z!rLbQ=1=+%%`NhLrTm$C8{5R+2^Vsf%AdiqYZZi$R82po0TE*!)6NN0*xbx z=WERVOxE^ne`0Sb{z25fiM(tdQj?Q?K`i?YeIox<#Poys4C32}VaPrrmho^G^{`>P zRTIO8{Y5O_`n*r;*wAfBQWo05%1A>FXG{>3wY=!v3!&CI;{^tPwXuOfQ+Xe zJZ#%+jrsJNZA3kvSo6IkaEV?^+|5qCn@W{4ZR23n3pzct_J4a?IHx~=O8Z8nA}T=1I9ki z$pEqjf%fYVuh;l6;)e|U8I5-!euOw+k3(YlCh4QpgU1Dbc554sJ!0>C{DX8O(1uT! zpCAq(ASU)|e-2O&8=i{L4`R0Ww=_PE_+8?F{RD;By8!pT2*9G;KI0iDhi_ zsTw)?)Spk!hdgRRaN^J6lTxX>8n>|FeLjv|+Khz_vDCeo zdf4no%(pOzSx1g7;(Ekg#K@ZkJ+ah_2arO2pi6<(s)LYyF#uUo|kxpgrf; zt2AalHCKS2+li%))3gnFI5m@>W1CpoobHm7HcK_W8?map*0)iQyd3ky!v7`eVe<;& zuV~D9NR5BkXJ{;CJ*RDcjJSz-4E{krg~0DApFq4%W6lBliM7o!t*6ZmTF>?*7Jt<7 zPV+E7IiEmWM+_deIkDI`QV*N^5wF#lWo{*gJ=>GmTaJH_FCfsKZT@wQ>5r-x?Af-& z-ZK1yWFh#++WlTb3__Nv#t-xqmO(vrBQ$0oqWM%_`b_NQP6xRGL3m~ngNGc%Qm?s& z4f~Qd^o>~Rl284WmU?QX+Gm{2^BwAeX|Kj7F#G*`TF*XJ=MTtx9{As=*Z42mhI5yi zmykCAob9r0K195fSeMnH^$)l$>uXxiylNkZ4e|Si%>>wqZ<92pZy}B88^0|}n*eY* zF?{1&6ic)oYHO+1vs}KxLHh*gml=A#!9hLSe}$pv8ysT4#?ZGInB_@c)xYo|y3YdB z7y3%ycpMKCqbv>yV(G`lTF-GrEc$z?XT1=&Xw15B98>>k#H||ht(OfN{|xcxh*4Iy z#@>YhkR1rjOP)O%??wC%8o!G8pNNq+q_Oz(ykYaQw#h?G>|KI?ke?us|5u3rKnxy^ zL1OuCxCLKnlZe=(v3kQsWBTURm~Z){6N6_4IEZDxQ`a5f83!G&AIQo6WLoN2N{qY_ zT#IHpFsFJfLm(rqL0N`8Lvb zh`~7@_QZ0Geo@V5HetQ!hqTFmYs|Ni z5)h~#hIpvP1&FUFhM!BpPb}>=&albVHh02?SjIr9)>lGLEXRdgs7G0>Bgd8>2e*-k z@6xys@%tL{+~))0@%BFZXG5>X5A+ld>jECyrx|zzF>JVBUx7fI;fPZ-=JwGVa}1M? z_S}z&%396h8{uiFmz%w;K5K#1rrj z;zOW)bRGj%+qM2i#6e=%b1o&8{c*O|v(1TR%<%MAe5lj-?+`Z=gNJ1j3(ppK=>eIbYD8G7N!w>S#wi1@U#nu%XYyQWo4&HX+25 zG)5Nnc8DL1!@j+ndX3rl{)zYpQEdo4bu6BG`b;cs!ggfd+YyH~Cg;t>u%|!7VqZqR zE(?+6$6y|Un1Of%;$&hv3nBJ?QbGHk7*8l5*!?UocQ{B6fRbgj^qIKNH7slvLZ{AAHRn8}$S14rc$$GfZs1u4o}+OCVl~$xFY$7%=Xhx*Mp3#AglMF%1E2rlk? zkR}8d3xupka7|RuY9nSRLpl*$dTehc)?;-iu^vC&#CivmB7>vq^fy>18Pa~2ek z!wAw2$B1=1oFdlk@FuZthjYZb9WD^-cKDE3w*!x7E(8kiISLLKnCJGQ&o?md8;G9w z%LLzP;CchM5WDTN+6>I|Ez$2Z@Z$zPNbIrmK5yWY27bf9XAFGaz#kZx=Rd-!*1FLA zqp44@%gQovo`E9<=Jkl!^SVPY&qoETwJtO#-;ol1r-64ExZA)749xeZB=3s`R%=~o z{?ms3T?4;Q%!396brr1Ey3l&H)`iAn4V#dG)mj(YMy++B@nXZK(!gr13vHv;y3lx| zVYAi1YOM=xqt?36_^@Gf%)n}`3vHv;x=6IEc#bw2Uofy*>td*F!*6%GH0FJG!2ttj z8(6J%q3zXL7aFUzE|P3cwbq5k>f4(dw~$BUHUoDVSgm!TZPZ#98mqM~G*)X}XnfMh z`-Xwf82G$_KQM3t+D!c6_ss;4Hn95kr7kPa&_@hB-@r=^Tw~xS1GgHu)4)3n+-=|k z20mio7Y+QXflnLwT?4;Q%!51y<3g~{z!?S}Yv7Q9XAmdbH2lV-;Kc^6G;pJV*Bf}F zfwvlXkAe3a_%N~8F87#$PZ{`41D`YS1p|L*;3SM+;pDRm!2ttj6Z0Sm$v1GZfy)eh zr-ADY+(LY%&C_P!E(7m0@Z$zPXyE4!eA2*g82F5V&l~sy11Dfyi$5s_9&O+(1Lqky zV&M4(UTWYP12-AC)xezw-eKTw10OIjzlkV5zevmr8px{#K5gK44g9`=d9o{ceFn}j z@K^(f3_QcY{5GQSEH-eZfg26H-oP6Tyw$*ah*Ru(?KkjY10OT+DFeT0;ByAPVBil8 zoP_;Y%Hn-)7ccZ60Rv|nIN!j<1}-!3od&KqaEpQ44BSP`iz>)Y13zxyg9d)yz$Xp- zhJnu*_&hPL6Dc1UI018s=u-?l+Q3=FemifTfg=WZ<55uYn zdKrAc!vDrMxd-HqzK}hj)!+J>^?>9b<)!O^i3WJ%dEktLe2aNtk^$an9x&r&-cueh z?`7Xw9x(T1-c=qj?|^SE512E~d&~pd4{Ck$0V(>t$vm*-W!C2DXYU{Iz2yN5{Ah16 z4@fnbwYUc+805-fTo-8I^}b}@jQ4{a+XZuNA+a`Q*?61(w%^pLgT3Tz1lpo9iRZxN#XSJKe_1b=kRAma6LWv!Kh(vNz&a zQaLx~=>;X@m3ujc0kRHil8#%Z`e{!5pY{w;Ucb|GyfOy&i`(#%ggoc^o#^-R8etw*Fp z_~s);98p@le+9m=z~sX%(kS0rV3V&HX_g}*e5;`_`A!*pxZM`z`vI`YSB7*Jf{5_F z1ck|W0epOBLjQ2dgzzAF%DNB-YC_)bHoZ;=4mc8q`P z;9H7kK4YOLA8!>2-%WfLfV9;2Jn(1)5!zAs4i<5Q2}mpWLWs%7TP4EBccV-`K3CGW z4PX`XkMC2NdD%oQ9j zUvlvA9V6;RST1F!gRdB5v}1kw2w41k#liP#KYS-0d}ZL{Ee`VW(XsHQ0DvOeey5QT zpP-InFO<|rsD#uT{$(P~ZS;3KfXR2JAHFFLz7~UTjKO!WgYO*p;YAArB8e{BZe zID_x&4!#TEi#NYK;o$2s+HZov_j?B)pKHeR@3#)V#|^%T2H&(HecO-EM&tPxh8-xQ z^?lypyTRc5l!MO)K2zYX67?(y2*XB6e|GKQqd%9k>xxq@-`NnM@03lBdc1*pR6<{i z02m!t&pG%asK+O;T}1f4>EO%5OBiz8V)?XV|NPX!*9N{VLZR z;Nv$+M1*e)?1&?J!<*n^8633TFL8SK~}vM=&^Mw`yVh<4nro`E5jazi+&lCR=H zt?U^8y`xRB7o;@<)A)gvt;d@CG$H7Hd0%3v&f2OR$KT~7U|L{SRglMcRj!54xB{VO;4e&pcG z1|QE4M1=1L4!(@y*m=Za7>j>HF^DRA%|245xgszHGvMpOb`jy*;NbI@Sk^HZk?#%!;d{}+*NBsF zOj%J8zVABt-T)uljeK_^2p=z6*nVyV%H!bUb`jybMcajBLz?|wp(M${z~_IMVxlr0 zc03-4(1x;7^Vuo9PYb()l0YnWwXmZP5xp&|6#F1HvL00kQjhx_d{^Qi^Cov#EyCCA z;0w*R?Z~$rLHKAdZ9P4i4ZzWVhtl9I&mVZT{Gj>;iAu!%*W3FW^He8l z!}a^T2wW#`7(zGZnEwrNqpbdf+dKno_hB1-rp-V+Tx)Q!w*C3?*XUDFZto!4k?$w4 z9tvFwN8XoRr{cHi5_APhk@S8;#efp9sQT4;UN9oT+s>yFGPuF1?ws&n5w zFKd5BUGkDgvi4`yB`^Gb*8cpuHSfZ%)H9u_TiQG8tznV2wny9A{B>DF3NDsn2g9mf zzf)^TY_MA2-5egB|HVhUj zF?UWG6&V&4%J+Sf zSAIXb#>s-@)04t!0j#M}9>_nta(Tm9_*}HtrPh`Ch1Fb@f~8lm3>uc+3A>uG0#|-G zefc$Y9-lPd%;buZqdLRkZ+tjyr@OS$Dw9 zNZ+u}4hwC0xDCs~y!i9B-4AbVYYF8CPUX(e+O%W%w(nivnAEm8rTt`J>*otc?MifE z++35LwEt{fvirmWYxnMb-48wXoI7!W)%KZ|ZJDXt3Ij!jneBx^tO(X#IL0@(y(bIf z>rY=xddePOzKQKU`CVT#G}fLeSdM4NzMd?*9eqQ}3#XwV##!0Em!FY=eDW-M>3Fei zb^a^!$4v8&e`V;=#OMl?V)(VxqpnzkBxYF_7J^H(^L_2!=39NO?}cx@BEEISq@j%o zk=ZF-=deapVzgth_GjdK$I|Z{lI^+6)%BIuKQxzE-rP}3u-o1IPr_uDiZdrPb>cAo z?-;6ZqWWzE<_bIJ@fjO2Y-T1;_F!F>DtyL*BQd(GVu?G96P&HdeuS}wl_RkiMGj+6 z)4P!xqZ_Qyj>1q|-i7_CXLhCT-qzV*CF==fe3rZ8CM%^UU@ksX@m93{b5duI3}XQp ztfr&e*5@-#i_!w#;-d0EQCcRJXDZLEn3U}ECth#)MjKg*T<)7+@a~y5F=y+>!mZtT z7oLhvWa39%RucB;_LIHXrQ5-UT{{yK?Zw_Y|5YqrdW`d^TBgTs_t>71i9X9TI6uY0{Pmno;!eNgvl2!XC;qeM7%YDb< zQN_0%-uH?twyI9d;?&Edim@W1wO94Mo@08f+n;H84Lf(iqg+;NZ`f5?&{O29nfr^S z;qd>#`k%hU&nAX8K3rD1J(3?-G2GqJWz`LFCw|si`da>wqV5N$9d?&Kg33te;;?J(hN5q{>L0zi!k6Jo{8D1s&h1;vT8`|!d0wP`du60$_K@{UpGp7B z(4ynT^^aB;T89c<-0$2=d&&zvzLH0(y1t5oRpOQ<^XhPLuzcgHdosE{Z>W|&vu7N4 z-$(Y^^=Iy@_1>F=2Jl4Z%bCe=^U1@*JCH=J zR>Qb6Rjui@wAMe<-?f{qt@=XW02yXlMGZ9_dE-*k=p#CLj6?%j6k2y=fndFvw&w{2|!;qlBX z+q&A?zP`O1%R3H3`PY6Aq&6dDf#T`j-=fw4PgEToCWJaF`IsZVvO>t_sG{yxr+1!%$`#L%3FXC}-miPS&5Ah9wxP_f7gf8&E`pTBy4Fxz+Nc*e_5*<;4u{}X?L8=m3v z%y4-I$>`IrQeDu3;QN5oacz?Ol2{-2KpP&${mN z_!3&*yDiV1SY$==3L}+y7wS^gO4Iqvt;9$ugaw@a>CawqyeAYpEZL2CVxyJ+T6C%J zCx?$Pk9FzEUb=qb@2v3gV(jx+1w48f1s4`()Q3JS;u%&`?66hCLiape8EUCM`SVK5 zwUsTp8!-p$oL%h-e>P!d-n1i`ZFz-l_Cc5HVZ+N|+RM5zSB&b!%7fUuv1mBj*O$@y z-kzkG+gytg+tO!0mvJ;%cIp#Y=q|nWJ=$~I%HqW5d&hfb_!6+zbdj zd2@~;IWxnG@mLX%t&H<_wDL-6WlXfHm2uuaX4=lYQ5)|-15aiH#~lXa#~2I#p}|IV zCcf8uN3pkfRB`FcSn!d@WaAtvlABr({RDj zQxM*_&$8=?B{&mu@ca7QoA(Eg@3W2$xmoYYGn4n+>`Ry%o*lbJTIDI_^?vxrZr>HJ z7;82@Iecg<_apRi(HriL|LlFfL@ujv#tq58SI)+t9G(bM*NFr;QV`BhEhq}Rl8U8{uy?=j zn$~}P@}FIpbWW!5D2{{nW68-`MH4+fw=&PfBj^jrhI;^=;ku-u1w}sh38W1@&iA+} z3I1HNZGW))K;Z^;*I*{w6qm|4bo-Kc_FSIHI|!T4ZVpFB2CpD=S@U*s5#O2KtuwaY z(21p@zxD7{t&d2Ju)ud;A9jXY-`%w9%GU44EYSPfN#*dMqQ5g*z6l6Y{Ua z`tO0xV+XTR;oX+t2{aMSPvDBpt;UVLT%=Wqw~#7IaBL|rDVe))wpF@hJ|7)ea~D<= z&YxRsEm=5s;oQY@f$u0OhJMy9<>gDt7PGxtJ2$0`nUL>0P~MufDQzOyJFdb_k4OyjVwV(nL-zF3Pznrml{TOY_8w{~Kns-~uyiM6%& z&Ky^hT-VUNwq?oM+8QJR{G4!Ub1jT(0_(I+y?@88YNU}!gC81{q$E^)w4a{|`@0nY(o~(_v*a#}ted=Buc4Qu%a~9W0 z+tM<3Wp2ijsUKW?x9IhtyZdEczwMO;lYO2AIFo#E+7WkY7M4Se>O;nDq_+09_N>I% zjimf5qGla@dE?ZPSQ;;z)Mb@(nu?xbf7o)!m2%vb`noIaqHFm0YZKd3{p?>1J=fWu zjA&jgpSoxLw(f^QyN+!txXL>R$JFRHOendfKkijK0>{#r_LC279@81-cnWSR@IK$! z>Yk9{!{EQdYW>w?8CTXNP0kt~JpRx`tVMnz$=a3{==5MYR1aDtYj|7mnBJ6#<92W_ z&;Qior2lKHhvKlK1gA?%oN0L$qy{=H#7^R|Iv?+6QUdCK?AD`>{96?GKxr{b4h& z=`-6;{0EG#$`u0U6%}I&d5Qf9K?M5C?bKuNs%M8x^Ls25>WMjr(SA7s%b~soLG%s4 z6zYjZznV%2^~B^RPm_V0fhn{RkyW1PC-X3-#Ixb^Bib+)-`F1F1K&HKFfTD}8RTJ1 zJWftWv|%iq{LBYlCscYo=8Ed)0P`nwK?G;JvA@VujX;T47W31FG407C`)fRVZl^tC z3T=q_9GNj*X;AMb5)YQM5Vmdv#!}xR;2X4lm7$k@q&@pld~N}z#PeBr7*l9NJRX65 z;#yBV`y=M_Sqg24Cm>M20f9n2F^{LzZ$uCuI)N#)5s|Sp2?{p?^)=Xi4(D%dB0`oiK!>gQA1BG`WJw?iTp1bdVUX$eAJ&Z^sgKGHw^t-z!cgOi$7-! zy)wW*X>;x~EQ2wHd5Oih05FAm5y{K>jd|r55zmHWjyC4lBc7r42NCnV-yp(K1PXbG zrB8nd%qmd-Dncp(?SFwlp`JJefo1&`L2TT}cqP)bPaz3}_QbTMp5IcF@yT!QQD`F~ z_05EWc^Fe@Lp%|IJU1gys3+z=L;V*KNK5@51nHN3z!d6<-3YXQ96|iq4@{wri1fZrVXiqHqKT!#x zo>=s_s}|)Un29v`XObL3d*U&OsjoEj#5ZdF=YUxk+H?c^H9ic?IiLDp0P|ft;`f2G zH4eCOzN~QtaI(ggz!dsGJQQ&dVFfUN9=V$t)vH{3*i zzSAW<8>xg)Pt0p_NPQnf ziuQ~tFTY5C;+33_Y>**JlhpG5sX<=L|iu__G~Y>a_!y`wQ)N8}>*lk+I71X~UR8 z--zWrjpxP`>WSq%VI8pe`2a9EXv6WzeV^&a5X7IIz~axBfhn{n=J^Kgzm7mxsps4% z^T2Un3iZU}5rPQsB2cI&mNEGru$240p?4npWIPOoG0P_p=Rg^I=J^RWDUo*L7-JsB zaxFu@geMDF+K0zO3i(BZhx;<~FczQ5DS2^QM@hWAvM(@}ylgYc%VP^AUS4ivxuy;A zwFp539-k@k@=k!Bc^ON&S-?{6K=tjfT*-SKcqsA8mG+gGHY_(0fj;xxghD;BaOMJw zpM#ylGmwXMWK1C^G25DD-GCsRoae=dFfjAco@I%Cx}oPjB>EylUu@`kzA8NP4Sl(x zUkogDyd9Xraz$i}t%ZVI64QqJ@0D8rFk-38Mque*?vJ8B06YdEi10%M3VDcSzWq6{ z*q;GrnG9zUDDiv?Ku;US6xsxI97LRj;6os0ds1jaEaw=v086=Lz|yuAz!cgO^B6&% zI}j+;4_Dutw<76dDPXenJ$ebl>Hn> znxiBp|Lm2s=j`T`Ly3vtdu1| z#y}o5E5=kF^@VgZyYJdf*Rx9Bvl|F|CZKRWEcsnhx3 z;(FM>)@hDZu7^FA2NejUEmu7irci>kB%4R;8P)gF20*D(_p4^z%B+V{RJ1F0PkwRf`Evor5)pYnyZOmRB_{ zSIc(KYF?fjF8P$Tobj^8+CJvt(7L7?JpL_}$GmE#S!3;Ld*SC0SF~=x>eLT##pbn5 z4a@2pv7GoawUBfl!kj5pjV-m!ie?cXESF$OX{-z$GBkZNgcONgZuvYeXRW^GB1Sn= z`1={7xRRAzr&=~E|H7eIq2*PpSJdi~FIRM4tZ1%jT~ao$exy5D1qh)bn&@?!0;3|BhWug;mK-T_byg{x~8;Q@b1w11-2 zo?;uVtQKO`a|O%SG~LfiVa;~<*k{{7AB9>ObF`lYvZDp(sjtkeG@3i^dhY{&G^w9L zR2@Fr+Tt8nfBRDNs^9?{Xdr)crmULJHR!o;^x~@O#=g5W`?yax=mqPcTV2I&t*I*e z6b)hnC?||{;TP53yKvpAYV7*4MXZ&VIpMYD*67HvH-@mWqPBT$!}Q=dH{M=eN?ow#B33dgqmzH8MR^||~y_c>FVWanDE zW?|K;+LD2Hv6|ZIbt{V3t!jb~P0bCfTk5Q)buDWhzH-iHw=~pZcgV@%j<*(b=vu7o zt;JO=2-jz`Y|O)vYqp^`vA HghhuQThe8K8ZXFZR{h~d3nr}HIR9ZChHz6tS_f{ z9q+mo{~$aMaq*%W5bBG^;~mpoQFu(Oy;puYw#dVttq;Id`a<=i=2Uq#kIGwRbE>?WN9EOem3N74!~ZUwSGAAkH1!JC^1pqr z!KJZk2i?x99duc$9dzB5Z<y<^l_AT462@&hE@`!a=`G(C5 zVqI3m&?}#{|H|hT*a%TRYrXQh-qtIhagIw-K5KmdY1#Lc&o#8L#icLLReP?sbqec? zCKGe3i^LG6*I4wwg* z7BcJkMB}kYyLi(Ll7%2x^_T7=)nD2^&#>XSx*u)J``d*YHzEF{fh!HnyC$@!%{>NY ze(G6HipF;%zFK42vr3Y8oPl|LK|QD60*yIE%+Po-;yD`EAm%+e+BYC(cM`LUlZi9& z4?-+!Ua`J@Tto3081JeP4@b=QC+4#!rp4wajX9RniP3?qU$MrlmuesAIn}GW1CIor zM4KS~L5O9&HF8l8Gj*rWtB*||ryfeyk6gs$S9Ko)pt0B&A?+Vx+h0$dXk+F7SX$e4 zk#&8qL7FyniDQFnX`%>)Weu(ywGDj;Ys`L7z74hOy^?z1B*YBFY;)Cj!1SwF>p4bP z2d=Y6Ar}8@fSH%$VHojv{DUapK+N&TA?pX;i1;A`tNw!i2I$hLM_$&2Sk?(-A29C* z#H=%IkW^UKid6N2o_xg8R;9FuG5cX2F>E-NiDivM)km=5;jd2H_%)U_57{o_zv7%= z^RPZ#v$qTJ3mShL@sBnBKH^_%{5!sqxv8*K<0cKvd@hpv5zxf)MBUW<-Y*@clTHk{BUX42u ze@^2ah#%FM_1>lNKOo+tG3(7fW4R{~v(JcsikN};0^+m8@R@Tqv8-GBXRQw)CYCX& zz9|U%vCt8F^>On`U~=;Lw^|2MxqqzWtrH;haV+d098w97X)N#s?8I zP5rBgIo8SV*I4*}qV?Q2iDeFC8!<22@ZX7%mu*8VdDUE}eS42Kz;5{Yp|%eoCia%# zA0!dmXv6!R*CFk{!hUWz+rT?DX8raMv#}xEhiT9H;qa+2#|7JwdfFmVcr;>lJVjpi z1+mOm*JvB^jMsP{;v$W2M$CDK<&v9N`kKQ_e5lqosE&G4CHs4$*0Ya@Wo$Q7ul-m3 z2%HJsM(R-(`-ND_Qga&g>=$C;*#Rs(tOM7r-HrHL8b6KrhZ_G2;`18wowkb_vyc8@ zVD=GtsGp8Nyb1Pv9w7J*q-9OcyNI<-je+_8ovg`ukD=%LccNcw==uJg=D#0#|z#~88qb^r*U3$a|5)vhtu zmhRB_bBK3n+>Lm*fxo0N^X}95FygNh!)NZB#NN9BAnN=_m-QoU&v!%r)xbZ~n4G`V z_Y2a%$CXcKaT?w69%N_Q_d>4#)D-iSjFTsm6X5JPAu4&Bv z={E4!H9m+~jRDwv2KZgAXWyPDo@~!cztMW~ys!0~bJV`6`PIG&drB{Yl&i)G^c+hg zwVvEJ5<{P&v6q7x!sC(TU99nX#O!kFiI-_yi?~{2`n8%EoPLevIIiX~7Lg=3l4>58F-cQ^-3OI<-&f zG5n5Ub00Aq2J!#`zZ3Wu#7}Ab4aEOP<1L6;2eJQw*3{hzYu%55z>Mnezs{$e;?KOHN;;eMqc(2vGnO)>QUAy#9!6;X~h3T4Eun_Qr7d- z!=7!d`VltlJ7VeIpKBYod64)f{DTlnJ7fWKt?WF+pop#~Of2)5${T_LV&o?$ns)Bg#+cIWCTC{Z7QHuXWzht{6{&#OWTtz6?&?Agb} z;}8cmo{3nsa}I#U-dY>84`@#tbvy;`0b#c+=Q5E+Oy5KYRq|JyT*K9R*g5< zusy$}^~Vsutnm!A!)app!+nZa{5h*_&LjRWjcL#GPTD6yM=a;De4l{+1Q3tcI0tc| z#-)ha?zAaGyg*~V2i%}Bj~i==!S4eJ!+n=n_T@Ii<}(J~qV2O`Pb{2U z4Vz~*-huJ^&l>k2{*K0c2l_3I&mewVVzsX!BW?F<{Z9~o*TBEj_ysmVK6ez`O;BKc?|NBA!JId+t-j-WB)%QZDm=G7c331$%5GOO>Hcm>24Td~3vc6D5 z9YzxuTt*q04VVO|0T-OrO%si#thHCKLKCYW-3;tE$diCR%=Q-R=FK&(TXx6 z(Ta5_q8ge|7j10a_jB&~z4!C=d$w7n{p92Gx##@O_nvd^xqsjNBY)}zS8mro+2<5U zXPts8)duX370_Y(&-`He=NK&i+Q_E!jhJ4i7`AK3r%6}Yzf*iJGX3;Mm6K4qh<3IYTlJxtDv827L%%c1=8uOIg!bye{1ea&Xvil zY1Tj4EefQQ7Si7xe-j{miT=qd6l#>NrX|6C>l*Xy55)h(-0<49v3HCg?W-Ks!3X}7^j zrz~t`?<2iM|74*L?@89D(1$UdI@QGVM#rJAl#cJrn7&YPb!56U@G^lcwB_F9yz@Pp zu8HYkUNJrNkJ2lY&tXtaOh*fU`jW1(^yM*K-5Z|Cw)EDRPJ2HHN1Zh>on`l=OYey3 zjEm4N`BN9_L0R;}SQ1m0+haQOpA(sRDm(ZyAJ%`$q8-}EiZ073)QG9uGm)83FRTsQ z8;U;>)2YvXIHnIr{+i-%!qTBnMq@f<|1qZ1#)~nXp&Q17{AmkZxmW*WVfiYZ@dH=( zks7ZjXuiKCR(7bvCBiMkVu>FxwedJ0KWkmQKQ2ZP$ANmG1AM&id zUx+>|3)uEqhoTQ{Jr?<-;%~vyWSqiQx9^ay`O-gs@AyZs{F@cSR)?@0>yq;f?S9H? zBCm10&hc%L(YYgX9dYD##q>Kmv^R_mG5%p)5XaTIEHhV$GR8y(M;XgF!wM=xCqu`| z>J%~v$k5HaH(+Rg=Kh4Uq?0MjDP$gil54Y>2NR}#85X{5gF=Q5mvt#*9)gm0*Jl|yrS$J8Jeh$`hG_yXeB0cuuY&iBI-DiDB)vXU%pREtu;Mj*9aO}e_IQC%=9Q&{z zj(x}&wmv)v$38p)$37f}V;`P^sfcVu!TN9%j(vCmj(vC;j(vCyj(vCoj(x~AHS5C~ zIQC&39Q$wq9Q%;p@2n47VFiqH0OL)Lw>$20yx;MVV}2tso#T#Qb$rJ0S;yxcUvhla z@!O84Pt&{ZtIkYMGzT0Xa(vYBNyn!h zzwY>)KH&JE z<0FoT9iMVM;&>FUNc1l_zU=s#;~S1Ev>dD~_bC|HIbPtH@9UUPtK)X~9Z4NFIo|HL z&+&f8Lyq|-is>A8%zf;Ze#Y@x$LAeia(vbC+m5GeT$m>Jxf|CyZgAY}IOlkc;|-3x z9rrp8-;j!ZHQ>?@IX>$6q~p_$UxzuUl$~>Y(eV|>*B$fFTc$E8TjhAR<9e8#gRIf< za>s3sI~;d8?s44j_<-Ysj*mDF-(!k(IOWnu9FID_;P|rRYw$ahw%l-Bq4mvKaNO;<*YWd?2OJ-AeAMwt$EO{??)aSJi;k~2zV4VCm8|Vm zj%PcrciiZBx#Kp+9ge#khi@F+o-Av=bCrpF!0|!HM;s43KIM4C@u=eqjxRgD=JN!*PZ73Fgl|6vlOq7dXy3Zgt%5c$4Gpj{6+%cRb|yu;b&7`3{`b?Tq8I zj?X*3ciiTN!dQf z`yCHCKJ1up*=6P=WnXoC#_?Il=N(^y?@7vDb^NyD>Do@458tygu65ktxY=>e@fw(m zVX_U5yB+sBe%|qb<3o;*IzH+6wBy$upL2ZC@fF9{9dpsy>Rjb`HmqxaSiR#$$IBhJ zIqq=W<+#UjzvBar4>~^Lc-ZkNxK0(5jW`~4e8KT$$JZR+a9pANYNk$tGJccH)CpvD zju$x2Ixbtd?~}XwHg8efw>OEm8|~fJvw3094m~Zrxo4q&Xs`4$%nM7FX&U>8@&t}k zc|duB;-wx}E?wj%o=z?;(p2Kc-x|?4*wmk1JYucCw}T!^GoCEY`z~$rGSO zpB^slpMGMvwC4nm$F7~=`QZr!X&VnKujKLCEYzXbn(MLgt$HRp{m5-;ott}LxU^17 zcpkQRg{EGc3A$-VeZaVMo$`+xmv(7N zJxpBM(?445tK}M5{2AlYl9NAiJg#hEZY}=#q*}^UR_LU_CN!4a} zU0+LQCy&f`?s)p~_MJ~?>Y3foc5dzOU((sRr*~gdW2Z*k-p<~=+qxg$_(Xnj#AUkj zBRxA;cCK8xvZHfdmcNe1&UJl@mhRoWyL->B&dpo5Zriu7a|auJJ;dGFxA~c|vo8ov zwik%?EfgsIE{ib@EEFiZ&lo2=r8ioXoI~La6aIw{rP_ScyNdC(onSvP&UvakiE#y| zxQDQEZXiyydocI>m@58ei4uKXe8(_ObArv?qjYX65_!Z?xt%l=@T$j$Ez#z{=j zHO2P?;}lBo2FAJO_W|LM&aw+5rN~}jjAvnxjN1>C@GG__u=(cIQoDh1`Nj7E-Cm26>>nE&qp;a8C*4$z!@h!RzsJxGtOL&GepBir1ShM=lXOr=Xt~^Lj6cy1V6F-WjpiYt?kI`u%lEZ@H_Vegets{aZ?JP0Uji%W%8J+IfS%K7@WD{ppCO8%MN!*cR^UDD&e3i?l%Y4dvBDZTB=qmE{#*O}5gBE4Zb zp{GlJdA*}4y;CtyQ83f{QcAB?_d?k6(B-4N9?#_HFF*cH$Gjls_@7dG?M_dZCGvXj zGg=c)hU>n-jD?Xus9(6R zL6PZkk4iB;?pyYHN2O=u&$bolh5H+vUXS!DG;L<>{eV__uXj;;jQi&lxHLu{dfa<0 ziG2OIC&o0CoM-Nj_IlT)M|t$PJY{-6PU-bauT}YGrv1Z|9yjZa$_c%>3Z}<>DZYN( zYg4TMxQBu=IR$J~dR>aqo3CJc_oehMOOHG=W4_1f=X<4uUr)-9dwWa+P2)dJ`CXG= zvE_D9ew4{kShhfez?K{BCXaqUozmkzqGEdAOzE{s&z9SRPVZ+ay)uo*VtQ|;^xB=? z0;gBby$zbSac|oPB?XgAuq7$KD$Tbx<`J1+qx|3;iLyf>zuP3GVs`Q5Cg4kehG;QtZlAbr(h`k)=t6>lHM82co!&$*c4hy6oJZ&aPe zy|3u4RWQ9fxras5HeL>?(stjhlJoVuO@6+;&#Tker=!RA-1Ii2^!Oc~?T?w&Z(T|+ zt4_1+%X&GR-j`B(=cKp5#G)UQUrg!sNzca1hUmxgcr&GULwfd|4s@)3-2VgTNR$mp zkNYBN??wfyU%2l_)7F27br3$Q$nq$kIaaT0U2?B5dYhcy{qpn6gWv5QQofnhZ(d5T z_alY%?f2wt_4{y2kKgs;Pv}9?^wy;Gj!Lgy9@MW(!Sp_v(&P6)j+@O)k9(BhT+Ddg z>1|P(>HS$suSzE!@s{#X()30Oatn>?srx6}JhO0QLV#rp5tDZNGwIvamaJH4N$ z^!lWCpYqMDem_m=^*Fula<=xqgL{WGZR6#T^op$?+*3uFoB}p1y)MPHcc+5sEslDN zl!lE;k9L^h$NZj6&9_1a5g#=t#rR>|U*+dp@jE*1kpT1ErC{?tk(zI}^uCBdG@I{F zQuDnbzn__tVw>-eQuCdqmDaXbT*a~Z-bm?P(qP_LMDIURdLwFVzx-&&UZ?jyws)Fl zUxh8ZD|vTKGL__!-z-1vTJqKzvx)P%;w8A2OT!#ZDhB$XR3>t`8}LnT<5K6NlVkxmc}L7mb$v8#>PhXf9cX@ zrWR+jp+MKnKUleDRmSa4WPU3!=j{o!-}fu zPfhz^wZ3fq`D4;mZHAULRImEaUnTjCUx{_Bo$(jnnl@v;zNT$oLcj6tV@LawBD<*N zOx5#`245ch>fpBrzd!iK;9D>5tbTFloiFaJd2#2xwNKV?)*V{)%&XEBwk0}IJ@k^>T?$#8yS79Q1^#s(kJ1I?DJl^CH6@n z`_Y+q&6%OD9Ujg;^77oOnaA3yhi4yd7+U?(gPLpEOVvXyC+=1oPRu*JsPd(k77aA4 zy8f$y^22uyWnZG}Us^HLGWZU`;M##Ll>>uY?BnGYr@m*uxolv|U2V6HslXdED!*HG zcU8s6;AehN@n$A>DlUi*&0N3nmfF=x>u`9jqWy0^^Hil?V!%LA`ryo#W#3pmYwhYg z{$zFai5b~>L**ytXXmxdsVZ-I@Wi}q^=SEt>g=L>G&Vjvt?V)Fr!s1k;)kZw6Dj+D z`+B%-P*|HWi))j~aOMND<-%qsQShSy7#hZuFUIIuy7x!d($O{+mQ80y7!w04h=P5j^K;OcDs9$Q!ovy}K4#Wlw(#iKmL4Cr^7IvDA639ehb?^tiLzpvEDto(%f;HV zgn}~4!nPc}CaeRNpz|Tc82+&7tS3=MI()CfJcWGG%+1#e9;SV*ktY z>sFFm9*zPEp5^)NgyqjEWQxkiT$x~+J}+2#e(Wb{aX%wuy z?193B=;ptB<@<;7Iw^5hp5IO;iRJlzwdq-7wrpd!bLcV73RWJLji1)ZptJI@-WC$d z$6UEYPY0jQ%ELNTNGK26H$T0wFd-_>AGIgR<>Ad31()&Pp|WkE`DeqZW-3{0-W864 z{WNO`#t59J@x!P$W6iPA&gj2G%kP^plf1b)lKgR;UaYv9@#eY^pRj*bOwFqGc89i@ z&lb5_J^Rr`{VQqakW~& zbI4}oe>_gJb*a|)KAy@SiPQ8;wca*xH=BrPl(&yrG_^djeqHHp1#eyw{Bah`E{%h_k$I6 zB)@cSxIv{euSMl|eS7gc+#R$+nPWWP7Ley3LJ7HQG(ftHZIYftyK&c61E7pV2ZqNc67YpieE zlY5`kvgG42`+7HPG)i^L+U>~-m2ta|Ohb~!b||CW2zvrThQpF*_WlPZ?VS(7KWFf#iSj>37DCdM>nNxL<2eqKuF$RAyNINIk(gl`kz%TXE3(Fgs&^FWa@(is!@fq2FNZx3w{yYj^g04WEw8{`erQ z`BG=Nk_90lZsdo(vSq57hL!T%itF+M1@}VE#$~ewBb42G+ z#bI2@2MxHgQU7EO3cSCauA>WJ&P3iHnfkAe{G{S_kvAyrjr1@Qu7eF?~Tg^{kIf9jO!PoT03W%-IL^Abq{!E?D!WU9k1@_L$D{g{`00kgi7I z{~WBt(E-IT#B@bv`{9_*vc#XZg!M(~_@YZXF~QoXq)?V}_rpq<6}gfHD`WLA{bpD` zl!I-2c9E`mbt?}2EbbFi@63DjPsV&R?+qCK+4~Kcu;<@{KOHZl9vS}0=<|%mAy%hg z&nY*+aXB`^R4iIC{ZNOfA2g#r%hB|MP8`Gh4q*CiaMbUB%k@vzrC{9SxZm*sn1v!c zs9=1=@v!4ljz=7iI=R2z$3ojpI7U3t%>8vaI7)$L)?cIo=Ml0?GOu z?{_@p_^{*Sj`_{PbT~FQKI{0r<4cY?b~pdGVFr{eyk97Cc)w8O@P47l+%IGP;r&7} zJ?GNH`-QYFV;tApds@Q#g<^Vmzfk1xexb+%&Of|gD5f8E>EZoCF+JRm7dgCNC~|ne zP~`A_p~&2aV)Y5{7mDdR$;-c+rOI)5zmV2bEWBSRa(KT`$l?CG$l?7$k-MBG z_dnQsV8Z)_SmC1C&ktc8)Uv_CIvAPhjM{(&pUA-{GI{o{n2DZwd}i;SXM5v)%&A8o ziynK2)28HshpD)aJ16lEAC){In%Zf})N3)xDaX`>nu?rx+(hYOClfbOy!aW!O$hut z=M3W?((=z36dx;`K_}Il+?R9ZDf*5dRAU}!_;rWXq;+j7dd@q=%1>!5PF{tQ199@A zrAOi9WhWYflb8Or#$Q;*`G-O#zD&YXg!a5j(V^)sxlI0;$An65gIMgLkeetQo*_v_ zk(8L4xNu?Znv#2A1uM8u+>7i(red6*#zW5F-mL#w1rCcj*W_@HkoN0Q8i$GaJ)mHI z9AC4m%OlJ?&mY9@Csp1U<#r0R_^{Oz*==2zoK2PI~oX z^f*T#k8(o_UXSBc(-7wQV#@E3%kzFeiRn2KWv#9q99r3Y-=mrO`5snYEd`=k9qQx+ z=VE%h^g6_}gF_M1+nUllrMzPO!uQ3z-f`D2_?zCbl-`K)W+|BAhw*J0uXonzasF$1 zyz5?n;hF*E&M9z=V`h4MSH|mIm0qKqXfN|OJ-*4{^{$vujLE}(JNhw(uu^^>mLJP! zGC#ig5az2GLyz%fX6<+}<#$aE^oN=Gy&%8P-l$irM$#{|m+J)9-mjUS38)f_jiVov zCrmHqHA~ON3%aKF^ORn*^x`FnP}1u6)0EzT^m^n${pL8mg&YHGI-W+A^=KlV7AZBE zFY(7xew;JeFTvjLY59eIAyIZ+^Ifi(`QEEw?f801?~wF{m2YP4IGNIG)JCpOzUVQ3 z)4Q6|Tdwx6FtO;zLazm;D$ zmLb9iYl(Vgv3|dlAN4RZKi(ng+i_6spx*S$0tIWwGo}{>{-?xzx0qh^J0d+>-?%nr zdVQuB>$g-H%-787x5xCN-!)f1`pWdaVtP?vg)(@bt(ob4+4N!t_fg_Ud%2cqdS5ra zIN$H7)9X!4vFY(HRLa;m*sqNWe&{tTnBJw7-diQ~{yC+0-087BGQHciVF`7J^}9_A zw^;wpl%KEPS?SsGW!#t^T2V@*eXsOhRloeExLyH2)&njlxNa>Qt<<~vU4r!s$4oA{ O?7ZfiRb9-??|%U=uO;CC literal 0 HcmV?d00001 diff --git a/arch/xtensa/src/esp_wifi/lib/libphy.a b/arch/xtensa/src/esp_wifi/lib/libphy.a new file mode 100755 index 0000000000000000000000000000000000000000..a7041655fe07f7466d94eff6bf7dcea915ee0446 GIT binary patch literal 201074 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